NLP study

[대회 회고] Semantic Text Similarity(STS) 대회 회고

2로 접어듦 2023. 4. 27. 22:45

대회 개요


대회 기간: 2023.04.10 ~ 2023.04.20, 11일

 

대회 설명: STS, Semantic Text Similarity 태스크는 주어진 두 문장 사이에서의 유사도를 측정하여 0점 ~ 5점 으로 값을 매기는 태스크로, 두 문장이 비슷한 의미를 가질 수록 5점에 가까운 값을 예측해야 한다.

 

텍스트를 생성하거나, 글을 직접 작성하는 경우, 같은 의미를 가진 말을 반복하게 되는 경우 글의 품질과 가독성을 떨어뜨리게 된다. 또한, 챗봇과 같은 시스템에서 이전에 유사한 질문과 응답이 있었는지 탐색하는 작업이 필요하게 된다.

데이터 세트: 학습 데이터 세트는 9300여개, 검증 데이터세트는 550여개, 테스트 데이터세트는 1100여개.

평가 기준: Pearson 상관계수

 

참고: 네이버 부스트캠프 AI_Tech 5기 NLP 트랙에서 개최된 첫 번째 대회이며, 부스트캠프에서 교육용으로 제공된 데이터셋만 활용하여 대회를 진행해야 했다.

대회에서 나의 역할 및 가설, 실험


본인의 역할: 본인은 대회를 진행하면서, 데이터 EDA 및 전처리/데이터 증강을 담당하며 모델 성능 개선을 시도하였다.

 

발견한 점:

  • 특수문자를 포함하는 문장은 학습, 검증, 테스트 데이터에 모두 평균적으로 11%(학습데이터 기준 총합 2200여 문장.)
  • 토크나이저 내부 사전에 등재되어있지 않은 단어(UNK token)를 포함하는 문장은 평균 2.5%(학습데이터 기준 총합 500여 문장.)

요약: 이 데이터를 정제하고 증강시키는 작업이 모델의 성능향상에 도움이 될 것이라는 가설을 세우고 실험을 진행하였다.

 

세부 내용:

대회에서 주어진 데이터세트의 예시는 다음과 같다(교육용 라이센스가 있어, 응용한 데이터를 작성한 것에 참고).

(사진 1 첨부)

본인은 문장 내 단어, 구문, 띄어쓰기 등에 의해 label 의 값이 결정되는 것을 확인하였다. 따라서 문장 내에서 의미를 가지지 않는 부분을 제거하면서 정제한다면 모델의 성능이 개선될 것이라는 가설을 세웠다.

중복되는 문장부호(,.!;)와 이모티콘은 문장 내에서 큰 의미를 가지지 않는다고 보았으며, 맞춤법이 틀린 단어는 토크나이저에 의해 인코딩될 때 다른 단어로 인식되거나, 사전에 없어 unknown word 로 인식될 수 있음을 발견하였다.

또한, 특정 라벨(0 점 라벨)에 치우친 데이터의 불균형성으로 인해 라벨 분포정보 또한 학습에 포함된, 편향된 학습이 진행될 수 있을 것이라고 추측하였다. 따라서 다음과 같은 가설을 세우고 실험을 진행하였다.


발견한 문제점 1: 문장 내 의미를 갖지 않는 문장부호 중복(,.!;등), ㅋㅋ 및 ㅎㅎ 와 같은 감정표현 중복, UNK로 인식되는 맞춤법 오류 구문 다수('웃겨욬ㅋㅋ', '멎진' 등)

 

수행한 실험 1: 문장부호 정제, 중복 문자 제거, 특정 문장에 대한 맞춤법 교정

 

  1. Text 데이터 전처리와 관련된 논문을 참고하였을 때, punctuation normalization 을 수행했다는 점을 발견하였다(참고한 논문 서치 필요)
    해당 논문을 참고하여, Question mark(?)를 제외한 ,.;!와 같은 문장부호는 Period(.) 하나로 통일해도 문장의 의미를 변질시키지 않는다고 판단하였다.
    (; 과 같은 부호는 '당황스러움'을 간접적으로 나타내는 기호였지만, 해당 의미가 라벨에는 반영되지 않음을 발견하였고, 오히려 서로 전혀 관련없는 두 문장(0으로 라벨된 데이터)에 반복적으로 사용된 경우가 많았으며,
    ........, !!!!!! 등 문장부호를 반복하여 글을 작성하는 경우도 존재하였기 때문에 normalization을 수행하는 것이 필요하다고 판단했다.)
  2. 한국어 데이터 특성상 ㅋㅋ, ㅎㅎ 가 중복되어 나타나는 경우가 많았다. 이 경우, 문장이 지저분해지고 통일된 표현을 가지고 있지 않으므로 정제의 필요성을 느꼈으나, 이는 '웃김', '즐거움' 등의 내포되는 의미를 가지고 있다고 판단하여 2회만 반복(ㅋㅋ) 되도록 표현을 통일하였다.
  3. 한국어 데이터 특성상 또한 ㅋㅋ, ㅎㅎ 를 입력할 때 맞춤법을 틀리는 경우가 잦았다. 이 단어들은 klue/roberta 계열 토크나이저에 입력될 때 UNK로 인식되는 것을 확인하였고, "동사, 어미, ㅋㅋㅋ" 형태가 전부 의미를 잃어버리게 되기 때문에 감정표현에 대한 맞춤법 교정이 필요했다.
    ㅋㅋ, ㅎㅎ와 같은 감정표현이 섞여있지 않은 단순한 맞춤법 오류('됫어요' 등)도 UNK로 인식되었기 때문에, 이를 정제하는 작업을 수행하였다.

사용한 라이브러리: re, AutoTokenizer, py-hanspell, PyKoSpacing, soynlp(감정표현 중복 제거)


발견한 문제점 2: 데이터 라벨의 불균형성(0 에 해당하는 라벨 데이터가 다른 라벨 데이터의 3배 이상)을 발견함.

수행한 실험 2: 특정 문장에 대한 sentence paraphrasing을 수행하며 데이터를 증강시켜 라벨 분포를 uniform distributional 하게 변경

 

  1. Sentence Paraphrasing을 통하여, 원래 라벨을 갖는 새로운 데이터 쌍 2개, 5.0 라벨을 갖는 완전 동일한 의미의 데이터 쌍 2개를 새롭게 생성하는 과정을 통해서 데이터 증강을 진행하였다.
  2. 효과적인 Sentence Paraphrasing이 진행될 수 있도록, 토크나이저로 인코딩 된 문장의 토큰 개수가 11개 이상일 경우에 한해 Sentence Paraphrasing을 수행하였다.
    토큰 개수가 11개 이상일 경우 평균적으로 문장 내 단어는 5개 이상이 존재하게 된다(실험적으로 파악하였음). 이 경우, paraphrasing n-gram 옵션을 n-gram=4로 세팅하면, 나머지 1개 이상의 단어만 변경된 채로 paraphrasing을 진행할 수 있다. 이로써 새롭게 생성된 문장의 퀄리티를 보장할 수 있도록 설계하였다.
  3. Uniform distributional 한 데이터 분포를 만들기 위해서, label == 0인 데이터는 약 3%만 새롭게 생성하였으며, 새롭게 생성하는 데이터에서 label == 5는 새롭게 생성되는 데이터의 약 10%만을 차지하도록 설계하였다.
    label == 5로 판단되는 문장들은 겨우 띄어쓰기 한 두개 차이만을 가지고 있었기 때문에, 많은 데이터가 학습되지 않아도 된다고 판단하였기 때문이다.

증강한 데이터: 약 8000여 개의 행을 증가시켰다. (기존 9300여 개 → 17000여 개)

사용한 라이브러리: KakaoBrain PORORO

수행 결과


실험 1: 문장부호 정제, 중복 문자 제거, 특정 문장에 대한 맞춤법 교정을 통해 소폭 성능 향상을 확인하였다.

  1. 대회 기간 동안에는 klue/roberta-large 모델에 대해서만 학습을 1회 진행하여, 0.9061 → 0.9104, 약 0.5%p 상승 을 확인하였다.
  2. 실험 세팅이 잘못되었다는 것을 확인하고, 대회 종료 이후 랜덤시드를 고정한 채 평균(5회) 내어 실험을 재 진행하였다.
    klue/roberta-small 모델에서 0.8438 → 0.8482, 약 0.5%p 성능 향상을 확인하였다.

wandb 로그를 참고했을 때, 정제하지 않은 데이터에 비해 정제한 데이터의 학습 그래프(train loss, valid loss)가 비교적 안정적이고, 완만하게 학습되며 loss 값이 감소하는 경향을 그렸다.
이를 토대로, 정제한 데이터를 통해 모델이 보다 global minimum에 쉽게 수렴할 수 있도록 했다고 볼 수 있다.

(사진 2 추가)

 

 

실험 2: 특정 문장에 대한 sentence paraphrasing을 수행하며 데이터를 증강시켜 라벨 분포를 uniform distributional 하게 변경

  1. 대회 기간 동안에는 성능 향상을 관측하지 못하였으나,
  2. 실험 세팅이 잘못되었다는 것을 확인하고, 대회 종료 이후 랜덤시드를 고정한 채 평균(5회) 내어 실험을 재 진행하였다.
    실험 1에서 정제한 데이터를 바탕으로 parapharasing을 진행하며 증강시킨 데이터로 실험을 진행했을 때,
    klue/roberta-small 모델에서 0.8438 → 0.8514, 약 0.8%p 성능 향상을 발견할 수 있었다.

데이터를 증강시켜서 학습했을 경우, 그렇지 않은 경우보다 훨씬 오래 학습을 진행하는 것을 확인할 수 있었다(EarlyStopping callback의 patience를 넘지 않고 더욱 완만하게 loss를 감소시키며 학습이 진행되었다.)
일반적인 데이터 증강의 경우 데이터의 품질을 검증할 수 없지만, 토크나이저의 인코딩 토큰 개수를 기반으로 한 데이터 증강이 보다 품질 높고 효과적인 데이터 증강 기법이라는 것을 확인할 수 있었다.

(사진 3 추가)

아쉬운 점


  • 전처리 및 증강을 통해서 예상보다 큰 학습 효과를 거둘 수 없었다는 점에서 큰 아쉬움을 느꼈다.
    기 학습된 모델(klue/roberta-large)이 이미 다양한 한국어 표현을 학습한 모델이며, 전처리 되는 문장은 데이터의 일부분에 해당하기 때문에 미미한 학습효과만 있었던 것으로 분석할 수 있다.
  • 대회 기간 동안 실험 2(Sentence Paraphrasing)의 학습 효과를 제대로 검증해내지 못했다.

    대회 종료 이후, SequenceClassifcation 모델로 기학습된 모델을 loading할 때, 마지막 Classification layer(dense)가 매번 다른 값으로 초기화 되는 점을 인지하지 못했다. 이를 보정하기 위해 랜덤시드를 고정한 채로(10, 30, 50, 70, 90) 수행한 뒤 결과를 평균내는 방식으로 보다 정밀한 성능 비교를 진행할 수 있도록 보정하였다.

대회 종료 이후 실험해보았던 내용


  1. 상단 '실험 2' 파트에서도 언급하였지만, 실험을 위한 세팅을 다시(랜덤 시드 고정)한 후 본인의 가설(문제점 1, 문제점 2)을 증명해보고자 실험을 진행하였다.
    데이터 정제를 통한 성능 향상을 얼마나 확인할 수 있는지, 그리고 정제한 데이터로 데이터 증강을 진행하며 분포를 바꿔봤을 때 성능 향상을 확인해보았다.
    klue/roberta-small 기준, 랜덤시드 50에서 최대 3%p의 성능 향상 관측, 평균 0.8%p 성능 향상. 0.8438 → 0.8514
  2. 본인이 생각한 증강기법(Sentence Paraphrasing)이외에도, Sentence Swap(비교하고자 하는 두 문장의 input 순서를 변경)하는 방식으로도 동일한 실험 세팅에서 성능 향상을 관측하였다.
    klue/roberta-small 기준, 0.8438 0.8595, 약 1.6%p 성능 향상 관측.
  3. label == 0인 데이터가 훨씬 많은, 불균형 데이터에 대해 weighted loss와 R-drop L1 loss 을 적용한 다른 팀의 코드를 참고하여 실험을 진행하고 성능을 비교해보았다.
    klue/roberta-small 기준, 데이터 정제 + sentence swap을 적용한 데이터에서 0.8438 → 0.8752, 약 3.2%p 성능 향상을 관측하였다.
    wandb를 통한 학습 추이를 비교해보아도, 기존 방식(실험 1, 2)에 비해서 빠르게 minimum으로 수렴하는 것을 확인할 수 있었다.
    (1 epoch 만에 실험 1, 2의 mimimnum loss 도달)

    주어진 데이터의 분포에 맞게 새로운 loss function을 설계하고 보완하는 방식으로 훨씬 빠르고 안정적인 모델 학습, 모델 성능 개선이 가능하다는 점을 배울 수 있었다.
  4. 모델의 크기를 키워, klue/roberta-large 에 대해 같은 실험 세팅으로 아무런 전처리, 증강을 진행하지 않은 데이터에 대해 진행해보았다. 평균 pearson 점수는 roberta-small 기준 0.8438 0.9155, 약 7.2% 상승하였다.

    가장 최고의 성능 향상 방법은 더 많은 파라미터를 가진 더 큰 모델로 학습하는 것임을 다시 한 번 증명할 수 있었으나,
    랜덤시드에 따라서 loss 가 전혀 줄어들지 않으며 학습이 진행되지 않는 경우도 있었고, 학습이 진행되는 경우, small 사이즈 모델에 비해 2배 이상의 학습 시간이 소요됨을 확인할 수 있었다(약 60분)
    약 4%p의 성능 차이를 감안할 수 있는 정도의 현업 태스크라면,(0.9155, 0.8752) 모델 학습에 리소스가 덜 소요되는(약 12분)
    klue/roberta-small 모델에 데이터 정제 + loss function 재 설계 방법으로 모델을 학습시키는 것도 효율적일 수 있겠다는 분석을 하였다.

    추가적으로, 위 실험들에서 적용한 전처리 기법으로 klue/roberta-large 모델의 해당 점수를 더 상승시킬 수 있을 것이라고 기대할 수 있었다.

더 알아볼 것


  1. Regularized Dropout 이란 무엇인가 - 논문 리뷰 및 코드 이해
  2. weighted loss 코드 구현
  3. Special Token voting 코드 이해
  4. Soft voting과 Blending의 코드 구현
  5. konlpy.tag.okt를 통한 명사 → 명사 유의어 교체를 통한 증강기법 실험