모델은 같은 주제에 대해 상반되는 의견을 가진 문장을 어떻게 처리하는가? #18
intrandom5
started this conversation in
Ideas
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
-
모델은 정말로 문장의 뜻을 이해하고 비교하고 있을까?
데이터셋의 일부 텍스트들을 보면, 서로 같은 주제에 대해서 얘기하고 있지만 서로 상반되는 주장을 하는 경우엔 점수를 낮게 주고 있는 것을 확인할 수 있습니다.
그렇다면 저희가 학습하는 모델도 이런 문장 쌍에 대해 낮은 점수를 주고 있을까요?
몇 가지 문장을 임의로 모델에 한 번 넣어 보겠습니다.
결과를 보면 위의 예시 같은 경우 서로 같은 얘기를 하고 있지만 점수가 매우 낮게 나옵니다. 하지만 아래의 경우 서로 다른 주장을 하고 있음에도 불구하고 유사도 점수가 높게 나오고 있는 것을 확인할 수 있죠.
두 예시의 차이점은 무엇일까요?
저는 두 문장에 같은 단어가 얼마나 자주 쓰였는가라고 생각했습니다.
보면 위쪽 예시 같은 경우에는 서로 같은 주장을 하지만 겹치는 단어가 거의 없습니다. 반면에 아래의 예시는 서로 반대의 주장을 하지만 겹치는 단어가 많죠. 모델이 문장의 의미를 비교하기 보다는 서로 얼마나 유사한 단어들이 쓰였는가를 보고 있다는 것을 알 수 있습니다.
조금 더 객관적인 지표를 이용해서 결과를 비교해보겠습니다.
두 문장의 유사도를 측정하는 객관적인 지표로써 BLEU score가 생각났습니다. 저희 dev dataset의 문장 쌍들에 대해서 BLEU score를 측정해 보겠습니다. BLEU score를 측정할 때 보통 1-gram부터 4-gram 까지의 점수를 결합해서 계산하지만, 본 데이터셋의 2-gram 이상의 점수는 0에 가깝기 때문에 상대적으로 점수다운 점수가 나오는 1-gram만 사용해 점수를 내겠습니다.
네, 저 시각화 못합니다. 그래프의 x축은 문장 쌍의 인덱스를 나타내고(550개의 문장) y축은 BLEU score를 나타냅니다. 데이터를 모델이 예측한 점수와 실제 점수의 차이가 큰 문장 쌍부터 차례대로 정렬했기 때문에 그래프에서 왼쪽이 모델이 많이 틀린 문장 쌍들의 BLEU score이고, 오른쪽이 모델이 잘 맞춘 문장 쌍들의 BLEU score 입니다.
그래프는 산만하니까 간결하게 숫자로 확인해 보겠습니다.
모델이 잘 예측한 상위 250개의 bleu score의 평균은 0.102,
잘 못 예측한 하위 250개의 bleu score의 평균은 0.089가 나왔습니다.
즉, 두 문장에 공통으로 쓰인 단어가 많을수록 모델이 더 잘 예측하고 있다고 판단할 수 있겠죠.
그렇다면 어떻게 모델이 문장의 의미를 학습할 수 있을까?
SBERT는 두 문장을 한 번에 입력받지 않고, 두 문장을 각각 BERT에 입력해 나온 출력값을 cosine similarity를 이용해 비교해서 그 유사도를 측정하는 모델입니다. 이 모델을 사용한다면 기존의 BERT보다 두 문장의 유사도를 의미론적 관점에서 더 깊게 해석해 볼 수 있지 않을까요?
SBERT 실험
SBERT 실험은 다음과 같이 이루어졌습니다.
transformers의 AutoModel을 이용해 'klue/bert-base' 모델로 실험을 했고, pooler_output을 이용해 두 문장의 임베딩 벡터를 cosine similarity를 이용해 비교해서 학습시켰습니다.
2가지 조건을 바꿔 가면서 실험했는데,
하나는 라벨의 스케일을 [0~1]범위로 학습하느냐 아니면 [-1~1]의 범위로 학습하느냐이고,(설유민 캠퍼님의 실험 결과를 참고)
다른 하나는 Loss를 MAE와 MSE로 썼을 때의 결과를 비교했습니다.
우선 SBERT 학습 결과는 모두 BERT를 학습시킨 것보다 성능이 좋지 않았습니다. SBERT 간에 비교를 해보자면, SBERT는 MAE Loss 보다 MSE Loss가 더 결과가 좋았고, 라벨 스케일을 [-1~1]로 맞추는 것보다 [0~1]로 맞추는 것이 더 결과가 좋았습니다.
SBERT 실험 결과 분석
가장 신기한 부분은 라벨 스케일을 [-1~1]로 맞추는 것보다 [0~1]로 맞춰서 학습했을 때 성능이 훨씬 좋아졌다는 것인데요, 원래 Cosine similarity는 -1에서 1사이의 값을 출력하기 때문에 당연히 라벨을 [-1~1]로 맞춰주는게 맞는 것 같은데 왜 이런 결과가 나타났을까요?
제 나름대로 생각을 해봤습니다.
Cosine similarity는 두 벡터가 같은 방향성을 가질 경우 1을, 두 벡터의 방향이 서로 관계가 없을 경우 0을, 두 벡터의 방향이 서로 반대일 경우 -1이라는 결과를 내게 됩니다. 저희 task의 데이터셋의 라벨을 살펴보면, 두 문장이 서로 아예 관계가 없는 경우 0점을 주고 있습니다. 두 문장이 서로 반대되는 주장을 하는 경우에도 0점을 주고 있죠. 즉, cosine similarity에서 0과 -1로 주는 두 가지 경우 모두 같은 점수를 주고 있는 것입니다. 따라서, 저희는 모델에게 "야 우리는 -1이나 0 둘 다 0점을 주고 있어." 라고 알려줘야 저희 데이터셋에 알맞는 라벨 점수를 모델이 줄 수 있게 되는 거죠.
그래서 SBERT로는 문장의 의미를 학습하는데 성공했나?
결과부터 말하자면 '아니요' 입니다...
맨 앞에서 봤던 문장들을 SBERT에 넣어서 그 cosine similarity를 비교해 봤습니다.
맨 앞에서 봤던 결과와 똑같이 문장의 의미보다는 문장의 단어에 따라 점수가 갈리는 것을 볼 수 있습니다...
BLEU score도 다시 측정해볼까요?
모델이 잘 예측한 상위 250개의 평균 bleu score는 0.110,
모델이 잘 못 예측한 하위 250개의 평균 bleu score는 0.086 점이 나왔습니다.
여전히 문장 쌍에 공통으로 사용한 단어에 의존하고 있다는 것을 확인할 수 있습니다.
이런 SBERT로는 이런 문제를 해결할 수 없는 듯 하군요...
그러면 어떻게 극복할 수 있는가?
원래는 모델이 문장에 대한 이해를 갖출 수 있도록 MLM으로 추가 학습하는 실험을 해보려고 했으나.. 다른 캠퍼님들의 실험 결과를 봤을 때 무의미하다고 판단되어서 안하게 되었습니다.
discussion에 올려주시겠지만 fine-tuning 하기 전의 BERT를 이용해 dev dataset의 문장 쌍들의 cosine similarity를 측정했을 때, 모두 1에 가까운 점수를 부여하더군요.
Fine-tuning하기 전의 모델은 저희 데이터셋의 모든 문장에 대해서 유사한 벡터 결과를 출력하고 있다는 것입니다. MLM으로 추가 학습한다면 오히려 이런 유사성을 더 강화하게 되겠죠.
당장은 뾰족한 수가 생각나지 않습니다만, 어쨌든 언젠가 도움이 될 인사이트라고 믿으면서 이만 글을 줄입니다... 화이팅~
Beta Was this translation helpful? Give feedback.
All reactions