chatGPT를 위한 NLP 기초 : Transformer_3
드디어 길고 길었던 트랜스포머의 마지막 포스팅이다. 사실 트랜스포머의 큰 흐름에 대해서는 트랜스포머 1~2에서 모두 살펴보았다. 이번 포스팅은 핵심 개념에 더해 추가적인 개념으로 그림에 표기된 Add & Norm과 트랜스포머의 최근 동향에 대해서 간단하게 살펴보도록 하겠다.
Add는 한국말로 잔차 연결(Residual Connection)을 가리킨다. 잔차 연결은 H(x) = F(x) + x라는 아주 간단한 수식을 가지며 블록 계산을 건너뛰는 경로를 하나 더 두어 서브층의 입력과 출력을 더한다. 잔차 연결의 장점은 모델이 다양한 관점에서 계산을 수행할 수 있게 해 준다. 그리고 그레디언트가 전달되는 레이어가 많아지면 학습이 어려운 딥러닝의 단점을 블록을 건너뛰어 보완해 준다.
이를 통해서 결론적으로 서브층인 Multi-Head Attention의 입력과 출력이 더해지게 된다.
Norm은 층 정규화이다. 앞선 잔차 연결을 거친 결과는 층 정규화 과정을 거치게 된다. 층 정규화의 수식은 아래의 그림과 같다. 아래의 식을 통해서 데이터를 Feature 차원에서 정규화하여 분포를 일정하게 해 준다. 조금 더 자세히 설명하면 dmodel이라고 불리는 텐서의 마지막 차원에 대해서 평균과 분산을 구한다. 그리고 x별로 평균을 빼주고 표준 편차로 나눠서 정규화를 수행한다.
출처 : https://ratsgo.github.io/nlpbook/docs/language_model/tr_technics/
추가적으로 학습과정에서 업데이트되는 가중치인 감마와 베타를 더한 후 곱해준다. 그리고 ϵ를 통해서 분모가 0이 되는 것을 방지해 준다. 보통인 ϵ를 1e-5으로 지정해 준다. 결론적으로 층 정규화의 효과는 안정된 학습을 진행하게 되고 그 속도가 빨라지는 효과가 있다.
트랜스포머의 모델 학습 기법으로는 Dropout과 Adam Optimizer가 있다. dropout을 통해 뉴런의 일부를 확률적으로 0으로 대치하여 계산에서 제외한다. 이를 통해서 학습 데이터 그 자체를 외워버리는 과적합 현상을 방지한다. Adam Optimizer를 통해서 Learning Rate를 수시에 따라 변경시키며 사용한다. 이렇게 되면 디테일한 튜닝을 통해서 오차를 줄이는 성능을 올려준다.
참고 : Weight Sharing는 트랜스포머에서는 Decoder의 Embedding 레이어와 출력층 Linear 레이어의 Weight를 공유한다. 즉, 하나의 Weight를 두 개 이상의 레이어가 동시에 사용하는 방식을 통해서 Optimization에서 성능을 올려준다.
트랜스포머를 응용하여 BERT와 GPT가 등장하였다. GPT는 단방향 Attention을 하용하고 BERT는 양방향 Attention을 사용하여 GPT는 문장 생성에, BERT는 문장의 의미를 추출하는 데 강점을 가지고 있다. 그래서 이 둘의 장점을 합쳐 BERT를 인코더에 사용하여 문장의 의미를 추출하고 이것을 기반으로 디코더에는 GPT를 사용하여 문장을 생성하기도 한다.
트랜스포머 기반인 BERT와 GPT를 응용하여 모델은 계속해서 발전해 나가고 있다. 이러한 최신 모델들은 학습하기 위해선 SOTA 논문을 읽는 것이 가장 효과적이다. 여기에 추후 다루어 보려고 한다. 우선 다음시간에는 트랜스포머로 만든 모델의 성능을 어떻게 측정할 수 있을지에 대해서 학습해 보도록 하겠다.