4. Abstract
▪ Unsupervised pre-training은 최신 자연어 처리 분야에서 널리 사용되는 기법 (e.g. BERT, GPT-2…)
▪ 적절한 Unsupervised prediction task를 통해 훈련된 DNN은 많은 NLP Task들에서 좋은 성능 보임
▪ 웹 사이트로부터 데이터를 수집해 하나의 언어로 구성된 거대한 데이터셋을 만드는 것은 굉장히 쉬운 일이기 때문에,
우리는 대용량의 모델을 쉽게 훈련시킬 수 있음 (e.g. BERT는 Wikipedia로부터 2,500M+α개의 단어를 긁어와 훈련)
▪ 데이터셋 구하는 것은 OK. 모델을 쌓아 올리는 것도 OK. 문제는 Training efficiency를 늘리는 것 !
After BERT…
5. ▪ 잘 훈련된 BERT model 내 서로 다른 Layer에서 문장의 self-attention 분포를 시각화해본 결과,
대부분의 Layer에서 self-attention은 해당 단어와 인접한 단어, start-of-sentence(CLS) 토큰에 집중되는 것을 확인
▪ 해당 결과에서 영감을 얻어, 얕은 모델의 지식(Training result)을 깊은 모델에 넘겨주는 “stacking algorithm” 고안
▪ 결과를 넘겨주는 것 뿐만 아니라 Progressive하게 얕은 모델을 2배 씩 쌓아(stacking) 올려 나가도록 해보자 !
Abstract
Neighborhood
& [CLS]
6. Introduction
▪ DNN의 성공 배경으로는 ‘개선된 신경망 아키텍처’와 ‘라벨링 된 수많은 양의 데이터셋’을 꼽을 수 있음
그러나, 모든 데이터에 인간이 직접 라벨링을 다는 작업은 매우 비용이 많이 드는 작업 !
▪ 자연어 처리에서 Unsupervised pre-trained model(like. BERT)을 사용해 Transfer Learning을 하는 것은
라벨링 된 데이터가 충분하지 않을 때 취할 수 있는 가장 효과적인 방법
▪ Wikipedia corpus로 학습된 Word embedding은 문장 분류 / 문장 유사도 Task의 성능을 효과적으로 개선하였고,
Pre-training을 통해 문맥까지 학습하고자 하는 시도(BERT, GPT-2)는 Word embedding 보다 더 효과적이었음
▪ 현재 가장 성능이 좋은 BERT는 Masked Language modeling과 next-sentence prediction task를 통해 훈련됨
▪ 해당 Task들은 인간의 간섭을 필요로 하지 않기에, 투입 가능한 Training data는 수 십 억 개의 토큰이 될 수도 있음
7. Introduction
▪ 따라서 BERT와 같이 큰 모델을 사용하기 위해서는 훈련 성능의 개선이 필수적이며, 좋은 성능의 Hardware를
사용해야만 BERT의 사용이 가능하다는 것 자체가 해당 모델을 실용적으로 사용하지 못하게 저해하는 요인
▪ 이러한 문제를 해결하기 위해 BERT 모델의 훈련 성능을 향상하기 위한 알고리즘적 접근 방안 고안
▪ 얕은 BERT 모델과 깊은 BERT 모델의 self-attention layer들을 시각화한 결과 다음과 같은 특징을 발견
1) 얕은 모델의 attention은 서로 다른 layer에서 모두 비슷한 분포를 보임
- 첫 번째 분포는 local attention: head가 자신과 인접한 Token들에 attention을 취하는 모습
- 두 번째 분포는 CLS: head가 start-of-sentence token에 attention을 취하는 모습
2) 1번에서 언급한 얕은 모델의 attention 분포가 깊은 모델의 attention 분포에서 비슷하게 나타남
8. Introduction
“ Shallow model과 Deep model의 attention distribution이 비슷하니,
Shallow model의 training result(trained parameters)를 Deep model에 공유해서 사용할 수 있겠군 ! “
▪ Shallow model A의 훈련을 마친 후 해당 모델 위에 같은 사이즈의 Shallow model B를 쌓아 Deep model로 만든 후,
Shallow model A의 trained parameter를 위에 추가로 쌓은 shallow model B에 copy해 사용하자 !
9. Related Work: Unsupervised Pre-training in NLP
▪ Word2Vec은 대부분의 SOTA NLP 아키텍처에서 필수적으로 사용되어 온 정석적인 기법이지만,
학습된 word vector가 문맥이 아닌 단어 하나의 의미론적 표현만 포착할 수 있다는 한계를 지님
▪ Pre-trained contextual representations 모델들은 주변 문맥을 고려하며 Word2Vec의 약점을 극복
1) ELMo는 LSTM을 쌓아 올려 Language model을 학습시키는데, LSTM은 단어를 순차적으로 처리하기 때문에
한 지점에서의 hidden state는 이전에 위치한 단어들의 정보까지 포함. 이에 따라 단어의 의미론적 표현 뿐 아니라
문장의 맥락 정보 까지 얻을 수 있게 됨 !
2) BERT는 stacked-LSTM 대신 self-attention을 사용해 Masked language modeling task를 구축하였고,
문장의 맥락 정보를 attention 통해 얻음. 이후 다양한 NLT task에서 SOTA 기록 !
10. Related Work: Network Training by Knowledge Transfer
▪ 우리가 제시하는 iterative training 방법론은 Knowledge Transfer(“Net2Net”)와 굉장히 유사
▪ Net2Net은 얕은 모델을 가지고 있을 때 어떻게 깊은 모델을 효과적으로 확장해 훈련시킬 수 있을지에 대해 다룸
: 이 때, function-preserving initialization을 제안하는데, 이는 깊은 모델이 얕은 모델과 같은 function을
수행하도록 초기화한 후 optimization method에 의해 차후 훈련되도록 하는 단순한 방법
▪ +) PR-12에서 Net2Net 리뷰한 동영상 참조하면, Knowledge Transfer 개념 이해하는데 좋을 것 ! ( 8분 40초 ~ )
: https://youtu.be/btsZOMsyH_o?t=520
▪ 그러나 Transformer는 굉장히 정교하고 복잡한 구조를 지니고 있어, 해당 기법을 적용하기에 적합하지 않음
: Feed-forward layer를 0에 가깝게 설정하고, self-attention layer를 random하게 초기화하는 것이 Transformer에서의
function-preserving initialization 일텐데 이렇게 하면 self-attention이 전혀 훈련되지 않는 문제 !
11. Method
▪ BERT 내부 메커니즘을 분석해보기 위해 self-attention layer를 12개 쌓아 올린 12-layer BERT 모델을 훈련
▪ 이후, corpus에서 랜덤하게 한 문장 추출해 서로 다른 layer의 head attention 분포를 시각화
1) 다시 말하지만, head가 ‘local attention’과 ‘CLS’ 토큰에 집중하는 분포를 보임
: 이는 하나의 Token을 이해하기 위해 이웃 정보와 시작점(global information)이 중요함을 시사!
2) 이 분포는 Low-level layer들과 High-level layer에서 공통적으로 나타남: ‘훈련을 해도 얼추 비슷하구만 ! ‘
12. Method
▪ L개의 Layer를 가지는 BERT 모델이 있다면, 우리는 해당 모델을 쌓아 올려 2L Layer BERT를 만들 수 있음
▪ for i <= L 일 때, i번째 layer와 i+L번째 layer의 파라미터를 같게 설정 (e.g. L=3일 때 , 1번 layer와 4번 layer의 파라미터를 맞춤)
▪ 얕은 모델은 대개 깊은 모델보다 빠르게 훈련되므로, 얕은 모델을 쌓아 올리는 것이 깊은 모델을 한 번에 훈련시키는 것
보다 더 빠르게 수행될 것이며, 우리는 해당 기법을 “Progressive stacking “이라 부름
e.g.) L = 12, k = 2
1. 12/4 => ‘3-Layer BERT’ 초기화
2. 3-Layer BERT Training
<반복문 시작>
3. (i=1, k=2) 3-Layer + 3-Layer Stacking
& 6-Layer BERT Training
4. (i=2, k=2) 6-Layer + 6-Layer Stacking
& 12-Layer BERT Training
<반복문 종료>
5. return 12-Layer BERT
13. Experiments
▪ Wikipedia corpus와 BookCorpus를 사용해 대략 3400M개의 단어를 얻었으며, 이는 BERT와 유사한 수준
▪ Baseline으로 사용하기 위해, 12-layer BERT-base model을 훈련 시킴
400,000번의 Train step을 거쳤으며, 매 step 마다 122,880개의 Token을 batch로 전달
▪ 실험 모델은 3-Layer BERT를 50,000번, 이후 stacking을 거쳐 6-Layer BERT를 70,000번,
마지막 stacking 후, 12-Layer BERT를 280,000번 훈련시켜 총 400,000번의 Train step을 baseline과 맞춤
▪ Optimizer로는 Adam을 사용하였으나, Stacking을 적용하는 모델에는 매 stacking 이후
이전 optimizer state들을 초기화 시켜 주었음
14. Experiments
▪ 훈련 결과를 비교해보니 실험 모델은 Baseline과
유사한 validation loss를 기록했으며,
이에 더해 훈련 시간은 25% 감소했음
(338 hours vs. 441 hours)
▪ Convolutional network에서 주로 사용되는
Knowledge Transfer 기법 identity와도
비교해보았으나, 유의미한 결과 도출하지는 못함
15. Experiments
▪ 첫 번째 행: 6-Layer BERT model에서 랜덤하게 뽑은 6개 문장의 head attention 분포 ( 1~6 Layer )
▪ 두 번째 행: 6-Layer + 6-Layer BERT model에서 동일한 6개 문장의 head attention 분포 ( 7~12 Layer )
+) 추가 훈련을 진행하지 않은 상태이기 때문에 Original과 파라미터가 같으며, 그림은 추가적으로 쌓아 올린 6-Layer의 attention 분포
▪ 세 번째 행: 두 번째 행의 12-Layer BERT model을 70,000번 더 학습 시킨 후의 head attention 분포 ( 7~12 Layer, Original과 유사 )
16. Experiments
▪ 이러한 결과에도 기존 BERT 모델과 같이 NLP Task에서 좋은 성능을 낼 수 있을까라는 의문이 들 수 있음
▪ 이를 증명하기 위해 BERT-base model과 stacking algorithm을 적용한 실험 모델을 NLP Task에 적용해 결과 비교
▪ 실험 모델은 더 적은 시간을 들여 훈련되었음에도 불구하고, 경쟁력 있는 결과를 도출
이는 굉장히 흥미로운데, 같은 Training step을 밟았다 하더라도 우리 모델은 얕은 모델에서의 훈련을 포함하기 때문
▪ 결과적으로 progressive stacking algorithm 을 적용한 모델이 더 빠르게 훈련되었고, 경쟁력 있는 성능까지 달성 !
17. Conclusion and Future Work
▪ BERT의 훈련 성능을 개선하기 위해 잘 훈련된 BERT 모델의 self-attention의 분포를 시각화해본 결과,
self-attention은 대개 local-attention을 취하거나 CLS(start-of-sentence token)을 취한다는 사실을 알게 되었음
▪ 해당 사실에 힘입어 progressive하게 얕은 모델을 stacking하는 알고리즘을 고안하였고, 결과는 성공적이었음
▪ 이후, 기계번역, 텍스트 요약 등 self-attention layer를 사용하는 다른 어플리케이션에도 우리의 Train algorithm이
적용될 수 있을 것인지에 대한 추가 실험을 진행해볼 것임
+) 이미 훈련된 파라미터를 재사용해 더 큰 모델의 학습을 가속화 시킬 수 있는 더 나은 방안이 있는지도 궁금해짐 !