STS(Semantic Text Similarity)는 복수의 문장에 대한 유사도를 선형적 수치로 제시하는 NLP Task입니다.
본 프로젝트에서는 두 개의 문장을 입력하고, 이러한 문장쌍이 얼마나 의미적으로 서로 유사한지(0~5점)를 측정하는 AI모델을 구축합니다.
데이터 가공 ⇒ 모델 구조 ⇒ Loss 함수 ⇒ batch-size나 lr, 각종 하이퍼파라미터
데이터 분석
(notebook/data_EDA.ipynb)
1. 유사도 점수 분포에 따른 데이터 개수는 유사한지 (Class imbalance)
0~5점으로 이루어진 label 데이터를 반올림하여 시각화
label
개수(개)
비율(%)
0
2931
0.32
1
1658
0.18
2
1075
0.12
3
1334
0.14
4
2045
0.22
5
231
0.02
2. positive pair는 충분한지
0~2점 : Positive Pair / 3~5점 : Positive Pair
binary label
개수(개)
비율(%)
0
5692
0.61
1
3632
0.39
⇒ 데이터 라벨 간도 불균형하고, Postive / Negative Pair과도 불균형함
⇒ 둘 다 균형적으로 Augmentation을 해보기
NLP는 discrete한 성질 때문에 Augmentation에 어려움이 존재한다. 문장의 의미에 큰 영향을 끼치는 단어를 랜덤 삽입/교체/삭제할 수 도 있기 때문에 학습에 효과적이지 않을 것이라고 생각한다. 따라서 AEDA(원 문장의 Sequence length를 기준으로 1/3 ~ 1 사이의 숫자를 랜덤으로 선택하여 6가지 punctuation (".", ";", "?", ":", "!", ",") 중 하나를 랜덤으로 대체시키는 기법)을 사용하여 Augmentation을 진행하였다.
0~5점으로 이루어진 label 데이터를 반올림하여 0/1/2/3/4/5로 바인딩한 라벨을 만들었다. 0~2점까지를 negative pair, 3~5점까지를 positive pair로 보았다. 가장 갯수가 제일 많은 0점 2931개의 문장쌍을 기준으로 나머지 1/2/3/4/5점 문장쌍도 2931개가 되도록 Augmentation을 진행하였다. 바인딩한 라벨 0~5점 각각 2931개로, positive pair과 negative pair의 균형도 맞추고자 하였다. (전체 17586개의 문장쌍)
그렇게 진행한 결과 raw data로 했을 때보다 Pearson 상관계수가 0.017 증가하였다. (Pearson : 0.9054 → 0.9071) - AEDA data - beomi/KcELECTRA-base - L1Loss - Batch Size: 32 / Lr: 1e-5 / optimizer: AdamW / Scheduler: StepLR / Epochs: 30
3. 데이터 셋에서 어떤게 유사한거고, 어떤게 유사하지 않은건지 파악 Label 별 데이터 특징 확인
5점 : 두 문장의 핵심 내용이 동일하며, 부가적인 내용들도 동일함
4점 : 두 문장의 핵심 내용이 동등하며, 부가적인 내용에서는 미미한 차이가 있음
3점 : 두 문장의 핵심 내용은 대략적으로 동등하지만, 부가적인 내용에 무시하기 어려운 차이가 있음
2점 : 두 문장의 핵심 내용은 동등하지 않지만, 몇 가지 부가적인 내용을 공유함
1점 : 두 문장의 핵심 내용은 동등하지 않지만, 비슷한 주제를 다루고 있음
0점 : 두 문장의 핵심 내용이 동등하지 않고, 부가적인 내용에서도 공통점이 없음
크게 바라본다면 3~5점은 유사, 0~2점은 유사하지 않다고 볼 수 있다.
✅ 5점의 경우 아래와 같은 특징이 있으며 두 문장의 핵심 내용과 부가적인 내용들도 동일하다고 볼 수 있음