SimCSE 모델 실험 결과 #54
intrandom5
started this conversation in
Show and tell
Replies: 1 comment
-
|
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
실험 동기
모델이 유사한 단어가 쓰인 서로 반대되는 입장의 문장에 대해서 잘 예측하지 못하고, 서로 다른 단어가 쓰였지만 서로 같은 주제를 이야기하는 문장들에 대해서 잘 예측하지 못함.
이에 대해 멘토님이 요즘은 contrastive learning이 주로 사용된다고 하며 SimCSE(#44) 모델을 추천해주셔서 한 번 실험해 보고자 함.
Unsupervised pretraining
Pretrain된 roberta-large 모델과 대회 데이터셋을 이용해서 SimCSE 학습을 해봤다.
코드는 공식repo인 https://github.com/princeton-nlp/SimCSE를 참고해서 작성했다.
datasets
모델의 input은 데이터셋의 문장들을 사용했으며, pad_sequence를 통해 배치마다 길이를 맞춰주었다.
라벨은 torch.arange(batch_size)로 설정했다. (batch_size=64)
아마도 각 배치마다 1개의 positive pair와 63개의 negative pair가 나오기 때문에 각 문장마다 64개의 pair중 positive pair의 class를 예측하는 식으로 학습이 이루어지는 듯 하다.
model
모델은 가장 성능이 좋은 roberta-large를 base-model로 사용했다. 문장 batch가 input으로 들어오면 그 문장batch를 roberta-large가 각 문장마다 다른 dropout mask를 적용해 128개의 feature를 추출하면, dropout_mask1이 적용된 feature들과 dropout_mask2가 적용된 feature들끼리 cosine_similarity를 측정해서 output으로 출력한다.
이 때, cosine similarity의 출력 결과는 [64, 1024] shape로 나타나며, Cross-entropy 학습을 위해 64개의 1024차원의 분포를 output으로 내는 듯 하다. (사실 구현할 때 이 부분이 제일 헷갈림.)
그 외
loss는 cross entropy loss를 사용했으며, 모델이 예측한 cosine_similarity 분포와 라벨(0~63)을 가지고 계산 된다. learning rate는 1e-5를 사용했으며, Adam으로 학습되었다.
결과
3에포크에서의 결과가 best 모델로 저장되었다. 중간에 loss가 한 번 크게 튄 부분이 있는데 왜일까...
모델이 잘 학습되었는지 결과를 확인하기 위해 모델에 서로 다른 2개의 문장을 넣어서 두 문장의 cosine similarity를 측정해 보도록 해봤다.
기존 모델과 비교하기 위해서 cosine similarity의 범위를 0~5로 맞춰주는 작업을 했었는데 일단 이는 무시하고 결과를 봐보자.
SimCSE 점수를 보면 어떤 문장 쌍이 들어오더라도 높은 cosine similarity 점수를 주고 있다는 것을 확인할 수 있다. 이는 SimCSE 학습되기 전의 BERT와도 같은 결과로 학습이 제대로 된건지 조금 의문이 드는 부분이기도 하다...
+++dev 셋에 대해 cosine similarity 결과들을 출력해본 결과 대체로 0~1 사이 범위로 문장 간의 임베딩 거리가 멀어진 것을 확인할 수 있었다. 위와 같이 몇 개의 문장만으로 결론 내는 건 잘못됐다고 생각한다. 물론 SimCSE 학습 방식에 대한 검토는 필요하다.
정확히 확인해 보기 위해 pretrain된 KoSimCSE-roberta 모델로도 같은 문장을 시험해 봤다.
KoSimCSE-roberta 모델은 다른 문장 간에 유사도가 꽤 떨어진 것을 확인할 수 있었다.
같은 base-model인 klue/roberta-base 모델과도 비교해 보았다. roberta-base 모델보다는 SimCSE로 추가 학습된 모델의 성능이 더 좋은 것을 확인할 수 있었다!
SimCSE 학습에 사용된 데이터 수가 너무 적어서 이런 결과가 발생했을까?
STS 실험
우선 Unsupervised training 된 모델로 STS 학습을 바로 해보았다.
직접 학습한 모델과 pretrain된 모델(KoSimCSE) 둘 다 학습을 해봤는데,
결과는 위와 같이 pre-train 모델을 사용했을 때 성능이 오히려 좋지 않은 것을 확인할 수 있었다. 정확한 원인 분석은 하지 못했지만(어떻게 해야할지도 모르겠고) 아마도 KoSimCSE는 더 작은 roberta-base 모델을 기반으로 하고 있어서인 것으로 보인다.
3가지 모델을 비교해 보았다.
위의 학습 그래프를 봤을 때, 3) 모델이 가장 좋기는 하지만 다른 모델들도 큰 성능 차이를 보이지는 않았다.
그러나 test 제출 점수는 0.8995밖에 안나왔다.
SimCSE로 학습된 BERT를 NLI - STS 학습한 경우와
SimCSE로 학습되지 않은 BERT를 NLI - STS 학습한 경우를 비교해 봤다.
라벨을 0
1, 12, 23, 34, 4~5 구간 별로 나눠서 각 구간 별로 예측 값과 실제 라벨 값의 차이의 평균을 그려봤다.확인해 보면 SimCES2STS 모델이 전반적으로 더 크게 틀린 것을 확인할 수 있다.
그리고 두 모델 모두 공통적으로 라벨 점수가 낮은 구간에서 더 많이 틀리고 있다는 것을 확인할 수 있었다.
Beta Was this translation helpful? Give feedback.
All reactions