1. [NLP] 문장 내 개체간 관계 추출

문장의 단어(Entity)에 대한 속성과 관계를 예측하는 인공지능 만들기

Daily 진행사항

Day1 (9.27, 월)Day2-3 (9.28~29, 화~수)Day4 (9.30, 목)Day5 (10.1, 금)Day6~7 (10.2~3, 토~일)Day8 (10.4, 월)Day9 (10.5, 화)Day10 (10.6, 수)Day 11 (10.7 목)

1. 개요

  • 일정 : 9.27 (월) ~ 10.7(목) 19:00

  • 팀 : CLUE (7명)

  • 주요내용

    • 문장의 단어(Entity)에 대한 속성과 관계를 예측하는 인공지능 만들기

    • 관계 추출(Relation Extraction)은 문장의 단어(Entity)에 대한 속성과 관계를 예측하는 문제입니다. 관계 추출은 지식 그래프 구축을 위한 핵심 구성 요소로, 구조화된 검색, 감정 분석, 질문 답변하기, 요약과 같은 자연어처리 응용 프로그램에서 중요합니다. 비구조적인 자연어 문장에서 구조적인 triple을 추출해 정보를 요약하고, 중요한 성분을 핵심적으로 파악할 수 있습니다.

  • 평가방법

    • no_relation class를 제외한 micro F1 score (1순위)

    • 모든 class에 대한 area under the precision-recall curve (AUPRC) (2순위)

  • 데이터 셋

    • train 32,470개 / test : 7,765개

    • label : 30개의 class로 구성 됨.

    • input : sentence, subject_entity, object_entity

    • output : pred_label, 각 class에 대한 확률 prods

ex) 데이터셋 아래 KLUE-RE 샘플과 동일하게 생김 (본 대회의 데이터는 저작권문제로 공유X)

{
    "guid": "klue-re-v1_dev_00006",
    "sentence": "심은주 하나금융투자 연구원은 “매일유업의 3분기 별도기준 매출액은 전년 동기대비 5.1% 증가한 3504억원, 영업이익은 9.5% 줄어든 192억원을 달성해 시장 전망치를 소폭 하회했다”라며 “이는 성수기를 맞이한 컵커피 등 기존 제품 매출 성장을 위한 판촉비 및 신제품 ‘셀렉타’의 시장 안착을 위한 비용 투하가 영향을 끼쳤다”라고 전했다.",
    "subject_entity": {
        "word": "심은주",
        "start_idx": 0,
        "end_idx": 2,
        "type": "PER"
    },
    "object_entity": {
        "word": "하나금융투자",
        "start_idx": 4,
        "end_idx": 9,
        "type": "ORG"
    },
    "label": "per:employee_of",
    "source": "wikitree"
}

2. 프로젝트 수행

2.1. EDA🙋‍♂️

1) class data imbalanced

  • no_relation 데이터가 다른 데이터에 비해 비중이 높음 (9,534건 29.3%)

  • per:place_of_death 의 경우 40건의 데이터 밖에 없음

2) 중복 + 이상치 데이터

  • 완전중복 데이터: 42쌍

  • 중복(label만 다른 값을 가짐): 5쌍

    • (6749), 12829 : no_relation 8364

    • (32299) : per:alternate_names

    • (11511), 22258 : per:place_of_residence

    • 277, (3296) : title

    • 4212, (25094) : org:place_of_headquarters

  • type 오기입 데이터: 1,625건

    • subject와 object의 데이터 중 올바르지 않게 type이 작성된 데이터(ex. 이순신, DAT)

2.2. Data Augmentation

class imbalance로 인해 데이터 증강 작업을 시도함.

1) entity exchange🙋‍♂️

  • sentence에 subject_entityobject_entity 의 단어들은 각각 type을 가지고 있다.

  • sentence에서 같은 type의 entity로 교체해주어도 그 label값은 변하지 않는다.

    • ex) 홍길동은 1992년에 태어났다 -> 김상욱은 2000년에 태어났다. (per:date_of_birth)

2) EDA ( Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks)

  • SR(Synonym Replacement): 문장에서 불용어를 제외한 임의의 단어를 선택 후, 동의어로 대체

    • 이순신은 조선 중기의 장수이다.

  • RI(Random Insertion): 문장의 임의의 위치에 임의의 단어를 삽입

    • 이순신은 과거 조선 중기의 무신이다.

  • RS(Random Swap): 문장의 임의의 두 단어의 위치를 스왑

    • 이순신은 무신 중기의 조선이다.

  • RD(Random Deletion): 문장내의 임의의 단어를 삭제

    • 이순신은 (조선) 중기의 무신이다.

3) AEDA(An Easier Data Augmentation Technique for Text Classification, 2021)🙋‍♂️

  • [0, 전체 단어의 갯수의 1/3] 내에서 무작위로 문장부호(. ? : ! ,)를 넣어서 데이터 증강

💭 IDEA

  • 부족한 데이터를 증강해줌으로써 갯수가 적은 class도 잘 맞출 수 있도록 한다.

  • 그 비율을 1:1 로 하여 편향되지 않은 추론을 하게끔 한다. ❌

❗ 결과

  • 성능 향상은 없다고 봐도 될 정도

  • 증강의 비율을 1:1로 하여 가장 적은 class인 per:place_of_death 같은 경우 40개의 문장이 2000개로 증강하면서 entity만 제외하고 같은 문장이 반복되게 된다.

  • 증강으로써의 의미가 퇴색되는 부분이라고 생각되었다.

2.3. 모델 선정

  • KLUE 공식 깃에서 주어진 데이터를 바탕으로 klue/RoBERTa-large 모델을 사용

  • klue/bert-base, klue/roberta-base, koelectra, r-bert, klue/xlm-roberta-large 등 시

하지만 직접 제출한 결과물에서는 69.59 점에 근사한 값이 나오지는 않았다. 다른 하이퍼파라미터와 private데이터와의 차이로 인한 문제라고 생각하고 해당 모델로 다른 테스트를 진행하였다.

2.4. 시도한 기법과 결과

1) Using Special Token🙋‍♂️

2) Two stage 학습

💭 데이터 셋의 약 30%를 차지하는 no_relation 을 먼저 판단하고 나머지 class에 대한 추론을 한다면 각 label에 대한 특성에 조금 더 집중 할 수 있을 것이다.

  • STEP

    • no_relation / other class 로 2진 분류

    • other class 에 대해서 classification 진

❗ 결과

  • validation set 에 대해서는 좋은 결과를 보여주었지만 리더보드에서는 f1-score 58점대에 그쳤다.

3) TAPT (Task Adaptive Pre-Training)

Pre-Trained 모델에 Train data와 Test data set을 넣고 다시 Pre-Train 시키면 데이터 셋 내의 문장들에 대해 더 잘 적응할 수 있다.

4) Hyperparameter 최적

KLUE 논문에 나와있는 fine-tuning parameter 들을 기준으로 변인 통제하면서 실험을 진행하였다.

  • Ir scheduler: cosine

  • lr: 1e-5

  • optimizer: AdamW

  • batch: 16 or 32

  • epoch: 10 ~ 20

5) Model Ensemble - soft voting

  1. roberta-large * 3

  2. roberta-large * 4

  3. roberta-large * 2 + ensembled * 2

  4. roberta-large * 3 + R-BERT + ensembled * 3

3. 최종 모델

  • Model: RoBERTa-large

  • Typed Entity Mark (punctuation)

  • Ensemble (roberta-large * 3)

  • score: micro-f1(71.910) / auprc(79.132)

4. Summary

4.1. Good

  • 첫 NLP Task에 대한 구현을 통한 허깅페이스에 대한 이해와 모델의 학습과 구조에 대한 이해

  • Tokenizer에 Special Token을 추가할 수 있도록 input을 수정하는 코드의 구현

  • 단위 테스트를 통한 프로젝트의 흐름 파악

  • 일일 회고를 통한 기록

4.2. Have to do better

  • Task에 대한 명확한 이해, 논문에 대한 좀 더 깊이있는 이해

  • 한정된 제출 횟수에 따른 code 검증 필요

  • github를 활용한 협업(단순히 branch를 나누는 것이 아닌 공통 코드를 가지고 issue와 pull request를 통한 코드 관리)

  • 신규 논문의 직접 구현

아직 Task에 흐름에 대한 이해가 부족하다보니 기본적인 시도만을 하는데 그쳤던 아쉬움이 있다. 대회 우승 팀의 경우 신규 논문의 구현을 통해 높은 점수를 얻을 수 있었다고 한다. 하지만 이번 대회를 통해 또 한걸음 성장할 수 있었다고 생각하고, 이번에 아쉬웠던것은 다음 대회에 후회가 남지 않도록 하기로 한다.

5. Reference

오피스아워 (9.30, 목)

Last updated