월간 데이콘 코드 유사성 판단 AI 경진대회

알고리즘 | NLP | 분류 | 유사성 | Accuracy

  • moneyIcon Prize : 총 600만 원
  • 908명 마감

 

데이터 구성 및 plm 선택 pb 0.9657

2022.05.10 21:35 4,694 Views language

코드입니다.

Code
로그인이 필요합니다
0 / 1000
언어의 마술사
2022.05.11 16:05

좋은 공유 감사드려요!

nevret
2022.05.11 17:27

좋은 공유 감사드립니다! 초보자 입장에서 정말 도움되었습니다
혹시 학습하는 과정에서 시간이 얼마나 걸렸는지 알 수 있을까요?
baseline 참고해서 학습시켜보고 있는데 1epoch가 언제 끝날지 모를정도로 시간이 어마어마하게 걸려서 질문드립니다

청소
2022.05.11 21:33

안녕하세요! 도움이 됐다니 다행입니다! 저 같은 경우는 3090 4대를 DDP를 해서 학습시켰고 토큰 사이즈는 512를 max로 했습니다. 이 경우 18시간이 예상시간으로 잡혔고, ealry stop이 작동해 실질 훈련시간은 3시간이었던것 같습니다.

아마 combination을 이용해서 positive pair가 많이지고, 그의 개수에 따라 negative pair도 많아져서 생긴 문제라고 생각합니다. 해결 방법으로는 combination이 아니라 [1,2] , [3,4] 등 한 번만 모델이 볼 수 있게 구성해도 크게 차이가 있을 것 같진 않지만 아직 실험을 해본건 아닙니다.

nevret
2022.05.12 10:07

답글 감사합니다! 제 나름대로 데이터 크기를 좀 줄여봐야겠네요
그럼 pair를 구성하실 때  512 이상의 토큰으로 나뉘는 경우를 버린 이유는 학습할 때 토큰 사이즈를 512를 max로 두셨기 때문일까요?

청소
2022.05.12 11:28

넵 정확히 그 이유입니다.
모델이 받을 수 있는 최대 토큰이 512라서 최대한 많이 주었습니다.
정확히 통계를 내본건 아니지만 아마 대부분의 pair가 384개 이하의 토큰으로 생성 되긴 하지만 최대한 많은 데이터를 사용하고 또 각 데이터에서 사용할 데이터셋도 truncation 되더라도 적어도 절반 이상은 모델에게 보여주고 싶었습니다.

nevret
2022.05.13 15:09

죄송하지만 하나만 더 질문드리겠습니다..!
저는 3090 1대로 학습을 시도중인데 토큰 사이즈를 512로 두면 cuda unknown error가 뜨고 256으로 둬야 학습이 되는데
이 부분은 제가 gpu가 1대라 메모리 부족으로 발생하는 거라고 볼 수 있을까요? cuda unknown error라서 원인을 알 수도 없는 상황이라 궁금증에 질문드립니다

청소
2022.05.13 16:44

학습 도중에 에러나는게 아니고 시작부터 안된다면 cpu로 돌려서 디버그 해봐야 할 것 같습니다.

DimensionSTP
2022.05.19 14:50

혹시 아래에 있는 코드 참고해서 load_dataset을 이용하여 dataset을 준비하는게 아니고 직접 concat해서 쓰신다면, code 1, code 2 각각 tokenize해서 합쳐지는 것이기 때문에 256이 max입니다.
256 + 256 = 512요
codebert의 max_position_embedding은 512입니다 huggingface hub의 model에 검색하셔서 config.json에서 기본 옵션들을 확인하실 수 있습니다.

affjljoo3581
2022.05.12 13:11

멋지네요~ㅎㅎ

HJOK
2022.05.12 14:00

validation 스코어가 궁금한데 얼마나 나왔나요?

청소
2022.05.12 14:07

eval_acc:0.9876
eval_loss:0.042
입니다.

HJOK
2022.05.12 14:09

감사합니다

EDEEP
2022.05.18 09:38

청소님 자료 공유 감사합니다
혹시 AutoModelForSequenceClassification로 트레이닝시키셨는지 huggingface trainer 사용하셨는지 early stop은 callbacks 이용하셨는지 궁금합니다.
아 그리고 eval_steps와 evaluation_strategy는 어떻게 사용하여 early stop 적절히 사용했는지 궁금합니다 다시한번 감사드립니다

DimensionSTP
2022.05.19 14:43

huggingface trainer 사용하시면, transformers의 EarlyStoppingCallback 사용하시면 됩니다.
trainer의 callbacks 파라미터에 넣어주시면 되고, early stop 사용시 load_best_model_at_end = True로, metric_for_best_model도 설정해주시고, strategy는 steps로 맞춰주셔야합니다. 
eval_steps는 total step이 (총 데이터수 / batch_size) * epoch이니 적당히 계산해서 설정해주시면 될 것 같네요. 
저는 epoch의 총 step이랑 비슷하게 맞춰서 사용합니다

EDEEP
2022.05.19 17:54

좋은 답변 감사합니다
네 저같은 경우 trainer에 earlystoppingcallback 넣어봤는데요
 eval_steps를 1로 두고 evaluation_strategy를 "epoch"로 넣어서 실험해봤습니다. 
trainer 처음 사용해보는거라 정확하지 않지만 epoch 1이후 validation 작업이 진행되는걸 확인했습니다. 
혹시 주로 epoch에 맞춰서 eval_step 진행 원하면 이렇게 놓고 실험해보셔도 좋을거같습니다
물론 따라서 save_strategy와 logging_strategy도 epoch으로 맞춰주셔야합니다.

DimensionSTP
2022.05.21 19:50

이런 방법도 있었네요 ㅎㅎ 감사합니다.

yjgwak
2022.05.20 16:12

마지막 코드블럭에서 최종합치는 정리는 이런식으로도 가능합니다
pos_df = pd.DataFrame(total_pos_pairs, columns=['code1', 'code2'])
pos_df['similar'] = 1
neg_df = pd.DataFrame(total_neg_pairs, columns=['code1', 'code2'])
neg_df['similar'] = 0
pair_df = pd.concat((pos_df, neg_df)).sample(frac=1).reset_index(drop=True)
pair_df.head()

IMJI
2022.05.23 10:25

코드 공유 정말 감사합니다!! 
"""pair 데이터를 구성했다고 한후에 validtation set을 구성한다고 하면 문제가 생길 수 있습니다.
[code1, code2] pair가 훈련에 사용아 됐는데, validation에 [code1, code3] 이런식으로 학습에 한번 살펴 보았던 코드가 validation에 들어가면 문제가 생길 수 있습니다."""
혹시 이 부분에 pair 가 동일한 게 아닌데 문제가 생길 수 있는 이유는 무엇일까요?? 

청소
2022.05.23 11:06

code1이 들어간 pair중 일부를 학습을 시켰기 때문에 self attention을 어느정도 학습했기 때문입니다.
물론 위의 데이터셋 구성도 정확히 따지고 들어가면 문제가 있습니다. 같은 문제를 푸는 코드들이 비슷비슷하게 생겼기 때문에 더 정확히 나누려면 폴더별로 나눠야 할 것 같습니다.

IMJI
2022.05.23 13:40

아 self attention 으로 학습을 했기 때문이군요.. 답변 감사합니다!! 이해가 잘되었어요!!!  

SUPURANG
2022.06.08 22:35

삭제된 댓글입니다