[논문구현]Self-Explaining Structures Improve NLP Models

2022. 9. 17. 20:52Artificial_Intelligence/Natural Language Processing

Sun, Zijun, et al. "Self-explaining structures improve nlp models." arXiv preprint arXiv:2012.01786 (2020).

 

현재 자연어 추론부분에서 상위 부분을 차지하고 있는 논문이다.

paperswithcode 본 리뷰할 논문의 Rank

처음 Pre-print라는 것을 확인했을 때 꼬름한걸 알아차렸어야했는데,

여러 대회에서도 본 논문의 기법을 사용한 방법도 많고, 점수도 높게나와서 좋은 방법이구나 하였다.

 

학회에 등록 안된걸 무시하면 안되었다.. 논문 그대로 직접 구현해보니 Base 모델보다 성능이 더 안좋다.

이 기술 사용한다고 몇주날린지 모르겠다.. 부들..

내가 잘못한건지, 논문에서 구라친건지 모르겠지만... 꼬름한점이 한둘이 아니다.

일단 서론은 여기까지하고

 

Abstract

 

<기존 방식들의 주요 단점>

1. 기본 모델과 설명 모델이 분리된다.

=추론하는 일반적인 언어 모델과, 왜 이렇게 나왔는지 분석하는 기술이 따로있다.

(블랙박스느낌이라 어떠한 Cues를 사용해서 이러한 결과를 내뱉는지 모름)

 

2. 개별 단어에서 현저성 점수를 계산하여, 낮은 수준에서 모델의 예측을 설명할 수 있음.

but, 구절이나 문장, 단락같은 높은 수준에서의 텍스트 단위에서 예측을 설명하는건 서투름.

 

이 문제점들을 해결하는 방법이 본 논문에서 제시하는 방법.

기존 Pretrained language model인 NLP모델 위에 해석계층을 추가하여, 각 텍스트 범위에 대해 정보를 집계해서 softmax를 진행하는 방식.

 

이로써 가질 수 있는 장점

1. 모델을 자체적으로 설명할 수 있고, 해석을 위한 추가적인 모델이 필요없음.

2. 제안된 모델은 일반적인(글로벌한) 적용방식 이라서, 아무 PLM 구조에다가 쉽게 적용시킬 수 있음.

3. 상위 수준 텍스트 단위에 대해 중요도 점수를 제공해줌.

 

논문에서 제시하는 핵심 아이디어

내 연구에 본 논문방식 적용할려고 설명 쓴 ppt

즉, 쉽게말해서 기존 PLM 모델(BERT, RoBERTa, AlBERT 등등)은 classification을 진행하기위해 CLS 토큰을 추가해서 학습을 진행하고, 여기서 나온 CLS 토큰은 입력된 토큰들에 대해 모든 정보를 집계하고있으니 이를 Classifer Head에 넣어서 분류하는 건데..

본 논문에서는 CLS 토큰이 아닌, 나머지 Token들을 가지고 얘네들을 조합해서 Classification을 진행하자는 얘기이다.

 

Intermediate Layer는 말 그대로 중간계층. 일반적인 PLM모델을 뜻하는거고,

기존방식으로 하면 토큰들 넣으면 각 토큰들에 대한 Hidden State값 나오니, 이 들을 조합한 뒤에 representation h값을 얻고 얘를 Softmax해서 예측하자는 말.

이렇게하면 뭐에 집중했는지도 알 수 있고, 점수도 더 잘나온다고 써있었다.

 

일단 화나는거 + 꼬름한 점

1. 환경 셋팅하고 Git에 있는거 그대로 가져온 다음에, 안되는거 다 고쳐주고, 옛날 패키지에서 작성된거 다시 업데이트해주고 등등 환경 구축부터 시간투자 빡셈.

2. 일반적인 인코딩, 임베딩 방식이 다름. 본 논문에서 제시한 기술을 사용할려면 일반적인 토크나이저를 사용하지 못하고, 직접 일일이 맞춰줘야함. 허깅페이스 그립습니다..

3. 논문의 저자는 중국인인것 같고, Github 관리 꾸준히 하는거 같은데, 이 논문에 대해서는 일절 관리안함. 사람들이 issue나 질문하는거 단 하나도 답변안해줌. 여기서부터 꼬름했는데, 본 논문의 제시방법 써도 그 점수 안나온다고 말하는 사람이 있었고, 구체적으로 해당 SOTA 점수나온 모델 가중치, 파라미터 일절 공개 안함. 모델 save 안했을리 없고, 뭔가 문제있음.

4. 논문에서는 CrossEntropy Loss + Regularizer Loss 라고 하였는데, 코드상에서 보니 CrossEntropy Loss - Regularizer Loss 였음. 하하.. 여기서 쎄함을 확 느껴부려쓰

 

일단 구현해 봤는데, 

본 논문에 나온대로, SNLI 데이터셋을 사용하여 학습 진행했을 때, 이렇게 나온다고 했음. 약 1% 향상됨.

 

그래서 구현한 다음 테스트 해봤는데,

아무래도 토큰화 방식이 달라서 Intermediate Model에서 나온 값은 괜찮은지 뽑아봤는데

RoBERTa-base (논문에서 쓴 방식대로 전처리해줬을 때)

RoBERTa 의 결과는 잘 나왔음.

 

그래서

1. 논문에서 제시한  CrossEntropy Loss + Regularizer Loss

2. 논문공식 Github에 사용된 CrossEntropy Loss - Regularizer Loss

이 두 방식을 둘다 구현해 봤는데

 

둘 다 점수가 처참함. 오히려 Git에 올라온 것이 점수가 약간 더 높음. 근데도 일반 RoBERTa 모델보다 점수가 낮음.

 

논문에서는 람다값에 따라서 성능이 다르다고 해서 이것도 실험해봄.

 

람다 1.0으로 설정해봄. 91.6보다 높게나온다며..
람다 0.8이 더높게나옴 ㅋㅋ 아오
네.. 정확도 뻥튀기인가요... 아니면 제가 잘못한걸까요,,(똑같이구현함)

 

검증된 학회에서 나온 논문을 읽자.

이거 까는 논문을 제작해야하나..

근데 이 논문에서 제시한 점수보다, 본 논문 + 내 아이디어 추가한게 점수 더 잘 나와서 이거가지고 논문 진행을 할지, 다른걸로 더 연구할지 생각 중이다,,

 

728x90