3. 참가 배경
KorQuAD 2.0 페이지를 접속하다가 업데이트 된 배너를 발견하게 되
었고 늦게나마 대회에 참가하게 되었다
3
조금만 더 일찍 봤다면 ㅠㅠ
4. 제약 사향
이번 대회의 모델 튜닝을 위한 제약 사항은 다음과 같았다
- 모델 학습을 위한 짧은 준비기간
- 대회에서 제공되는 경량화 모델을 이용(12 Layer, 256 Hidden Size)
이전에는 Tensorflow만을 실험에 사용해왔기에 짧은 시간으로 모델을 튜닝하
고 다양한 하이퍼 파라미터를 돌려보기에는 시간이 빠듯했다
그렇기에 성능을 높이는 것 보다는 현재 상황에서 해볼 수 있는 실험이 무엇인
가 고민을 하게 되었다
3
5. 제약 사향
대회에서 함께 제공되는 Large 모델의 경우 너무 많은 GPU Memory를 요구하
기 때문에 직접 학습을 시켜볼 엄두를 내지 못하였다.
그러던 중 대회 소스코드를 제공하는 Github에서 감사하게도 KorQuAD 1.0에
학습을 시킨 Large 모델을 함께 배포하는 것을 보았고, 기왕이면 모두 활용하
면 좋겠다고 생각하여, Large Model을 Teacher Model로 설정하여 대회 참가
를 위한 모델에 Knowledge Distillation을 적용하는 방향으로 성능을 개선해보
기로 하였다.
3
Kor_pretrain_LM 깃헙
6. 제약 사향
본 대회를 위해 튜닝한 부분
-distillation을 위한 Loss 변형
-Large Model에서 soft label 생성
대회에서 제공된 부분을 그대로 사용
-KorQuAD 데이터 전처리 및 정답추론
(Random Seed는 기본 코드에서 설정된 값을 그대로 사용하였다)
3
7. 실험 방법
우선 Distillation을 위한 Soft Label을 얻기 위해 학습 데이터에 Large Model을 실행시키
고 출력 값을 Numpy로 저장하였다.
Tokenizing은 Large 모델의 Vocab을 사용하는 Tokenizer를 이용하였으며, Token을 ids
로 convert할 때에는 Large와 Small 두 모델의 Vocab을 모두 이용하여 각각 저장하도록
하였다.
저장되어야 할 데이터 목록은 아래와 같다.
- Start/End Soft Label
- Start/End Hard Label
- Segments, Mask
- Token ids(Large Model Vocab), Token ids(Small Model Vocab)
3
8. 실험 방법
Large Model과 Small Model의 Vocab은 구성에 차이가 존재하기 때문에 Bert_Tokenizer로 토큰화를 했
을 때 다른 결과가 나온다.
그리고 이로 인해서 다른 Vocab의 Tokenizer에서 생성된 토큰에 convert_tokens_to_ids 함수를 적용하
면 vocab의 차이로 인해서 [UNK] 토큰이 생기는 경우가 생긴다. (paragraph당 2~3개 토큰)
이를 노이즈로 생각하고 실험을 진행해보았고 평가 결과, 이로 인한 문제가 성능에 큰 하락을 일으키진 않
았다.
예문: “김철수와 김영희는 부리나케 집으로 갔다”
Samll Model Tokenizer: ['김', '##철수', '##와', '김영', '##희', '##는', '부리', '##나', '##케', '집', '##으로', '갔', '##다']
Large Model Tokenizer: ['김철', '##수', '##와', '김영희', '##는', '부리', '##나', '##케', '집', '##으로', '갔', '##다']
3
Tokenizing 과정에서의 문제
9. 실험 방법
모델의 경우, 큰 변형은 하지 않고 이전 히든 레이어를 활용하거나, 추가적인
Transformer 레이어를 추가하는 등의 변형을 적용해보았다.
3
모델 변형
Transformer
Transformer
Transformer
Transformer
…
…
Transformer
Concat Hidden
Start End
Transformer
Transformer
Transformer
…
…
Concat Hidden
Transformer
Start End
Transformer
Transformer
Transformer
Transformer
Start End
…
10. 실험 방법
Distillation에서는 Loss를 설정하는 것이 중요하며, Loss에서 설정 할 수 있는 파라미터는
크게 T(Temperature), a(Alpha)이다.
Temperature가 높을수록 더 soft한 라벨에 학습이 되도록 하며, Alpha 값은 soft label의
Loss와 hard label의 Loss 중 어느 것을 더 많이 적용하여 학습할 것인지를 설정하는
Weight 값이다.
3
Loss 함수
11. 연구 개요
본 실험에서 Distillation을 적용하는 방법으로 3가지로 분류하여 실험
을 진행하였다.
3
Distillation 방법
Soft Label
Training
Hard Label
Training
Soft Label
Training
Hard Label
Training
Soft Label
Training
Evaluation
Evaluation
Evaluation
a: 1.0
a: 0
a: 1.0
(1)
(2)
(3)
여기서 2번의 경우, Hard Label로 학습 할 때 학습률을 1e-5로 작게 설정하여 학습을 했다.
a: 0.5 a: 0.5
12. 실험 결과 3
Distillation에 따른 결과
방법 T F1
1 2.5 88.68
2 2.5 88.71
3 2.5 88.31
1 3.5 89.75
2 3.5 89.89
3 3.5 88.95
1 5.0 89.12
2 5.0 89.45
3 5.0 88.93
실험 결과, T를 3.5로 설정하고
Soft Label로 학습한 후에 작은
학습률로 Hard Label로 학습한
방법의 성능이 가장 좋았다.
그 이유는 Soft Label을 얻는 과정에서
Vocab의 차이로 생기는 [UNK] 토큰으로
인한 노이즈가 영향이 있을 것이라고
생각한다.
(%, dev)
13. 실험 결과 3
모델 변형에 따른 결과
모델 변형 F1
Original 88.21
concat 87.98
layer+ 88.25
concat + layer+ 88.32
단순하게 최종 레이어와 이전 2개의
레이어를 concat 했을 때는 기존보다
오히려 성능이 감소하는 것을 보였다.
추가적인 Transformer Layer를 붙였을
때는 성능이 오르긴 했지만 매우 적은
수준이였으며, Concat된 벡터에 추가적인
레이어를 붙였을 때는 소폭 성능이 상승했지만
더 많은 파라미터를 사용한 것에 비해
큰 상승이 존재하진 않았다
최종 레이어와 이전 레이어를 concat한 것을 conat, 추가적인 레이어를 추가한
것을 Layer+로 표기하였다.
14. 실험 결과 3
모델 변형에 따른 결과
모델 변형 방법 F1
Original 1 88.75
concat 1 88.49
layer+ 1 88.97
concat + layer+ 1 89.32
Original 2 89.50
concat 2 89.27
layer+ 2 89.56
concat + layer+ 2 90.00
Distillation과 추가적인 레이어를 함께
적용했을 때는 기존보다 성능 상승의
폭이 좀 더 컸으나, 여전히 더 많은
파라미터를 사용하는 것이 비해 만족할
수준은 아니였다.
(%, dev, T=3.5)
15. 결론 및 느낀점
Large Model을 Teacher Model로 설정하고 Knowledge Distillation을 적용하는 실험을
진행했다. 모델의 변형없이 적용했을 때 F1 1.3%의 향상을 보였다. Transformer의 최종 레
이어와 이전 레이어 2개를 concat하여 추가적인 레이어를 적용했을 때 F1 1.8% 향상되어
가장 높은 성능을 보였다.
교사와 학생 모델의 Vocab이 조금씩 다르다면 2번의 distillation 방법으로 노이즈로 인한
에러를 다소 감소 할 수 있을 것으로 생각된다. 또한 T의 경우 학생 모델의 Bias/Variance
의 영향도 존재했다.
(본 실험에서는 Variance가 높을수록 높은 T가 좋은 성능을 보였다)
3
16. 결론 및 느낀점
이전 다른 실험에서 vocab이 완전히 같은 Mecab-base 모델과 Mecab-small 모델을
distillation 했을 때는 1번 distillation 방법이 가장 높은 성능을 보였었다. 또한 단순하게
모델을 변형하거나 입력을 그대로 사용하는 것이 아니라 추가적인 feature (개체명, 품사
등…)을 추가로 적용했을 때 distillation의 효과가 컸었다.
대회를 늦게 알게 되어서 촉박하게 준비하여 feature를 추가하여 모델을 학습해보지 못한
것이 많이 아쉬우며, 비록 대회는 끝났지만 이후에 모델을 학습하여 실제 성능을 평가해보
고자 한다.
좋은 대회를 통하여 전부터 미루고 있던 PyTorch를 빠르게 공부하여 사용해볼 수 있어서
좋았으며, 어렵게 생각했던 KorQuAD 제출을 직접 해볼 수 있어서 좋은 경험이었다.
3
17. 참고 문헌 17
Sun, Siqi, et al. "Patient knowledge distillation for bert model
compression." arXiv preprint arXiv:1908.09355 (2019).
Turc, Iulia, et al. "Well-read students learn better: On the
importance of pre-training compact models." arXiv preprint
arXiv:1908.08962 (2019).
https://light-tree.tistory.com/196
https://jamiekang.github.io/2017/05/21/distilling-the-
knowledge-in-a-neural-network/
https://blog.lunit.io/2018/03/22/distilling-the-knowledge-in-a-
neural-network-nips-2014-workshop/