-
Transformer카테고리 없음 2024. 3. 11. 20:23
최근 NLP에서 빠지지않고 들어가는 Transformer에 대해서 리뷰해보겠다.
Attention is all you need(2017)를 참조하여 작성하였다.
1-1.I/O->Encoder
input data가 인코더로 들어가는 과정이다.
이때 문장들의 sequences가 주어졌을 때, 가중치 행렬에 대하여 내적을 수행한다.(embedding)
그 결과 각 문장들의 토큰들이 학습시 임베딩 레이어를 통해 벡터로 들어가게 된다.
1-2.장점
이로 인한 장점으로는 seq2seq는 RNN을 사용하여 순차적 데이터 처리과정을 밟게 되는데 반해
transformer는 한 번에 내적을 수행함으로 기울기 소실 문제가 해결되게 된다.
1-3.문제점과 해결책
하지만 문장내에서 순서가 중요하고, 각 토큰에 유일한 값과 토큰 간 차이가 일정한 의미를 가져야한다.
그래서 embedding된 vector에 대해서 PE_{pos,2i}=sin(pos/10000^{2i/d_model})같은 postional한 encoding를
한 번 더 거치게 된다.
2-1.Multi-head Self Attention
Multi-head Self Attetion에 대해 알아보겠다.먼저 기반이 되는 Attention
주어진 질의에 대해 비슷한 key들을 찾아 그에 해당하는 value들을
출력하게된다. 이러한 Attention들을 여러 Layer로 구성한다.
2-2.구체적 과정
3개의 vector를 copy하고(순서대로 Query,Key,Value), 각 토큰마다 d_{k}개만의 칸을 할당한다.
3개의 vector에 Scaled-Dot-Product Attention을 진행한다.
다음은 Scaled-Dot-Product Attetion 진행 과정이다.
1.Q,K^{t}를 내적한다.
2.내적 한 행렬을 \sqrt{d_{k}}만큼으로 스케일링한다.(논문에서 d_{model}는 512)
3.d_{k}가 작으면 additive attention과 dot-product attention은 유사하고, 크면 가중치 소실 우려
4.스케일링 한 행렬과 V 행렬을 내적한다.
위 과정을 수식으로 나타내면 다음과 같다.
Attetion(Q,K,V)=softmax(QK^{T}/\sqrt{d_{k}})*V
3.Encoder(FFN, Feed Forward Net)
FFN(x)=max(0,xW_{1}+b_{1})W_{2}+b_{2}로 정의되는데,
이때 2번에서 구했던 행렬을 x로 두고 W와 b 행렬은
각각 d_{model}*d_{hid},enc_seq_len*d_{hid}의 크기를 가진다.
이 후 FFN을 진행한 행렬을 재귀적으로 2-3번을 반복하여
encoder layer들을 형성한다.
4.Output(Attention)
Encoder와 유사하게 주어진 문장에 대해서 Query matrix를 형성한다.
Encoder의 최종 행렬이 Query에 대해서 Multihead attention에서 Key^{T}와 Value다.
Query와 내적을 진행 한 후 Softmax로 바꿔 weights를 만들고, Value와 내적한다.
그 후 선형 변환 후 Softmax를 거친다.
5.결론
Drop-out으로 신경망내 간선을 줄이거나, Label-smoothing을 진행하는게
Regularization에 좋았고, 모델의 사이즈가 클 수록 성능이 좋아졌다.
Key의 크기가 작으면 성능이 저하되고, Head가 너무 커지면 성능이 하락 되었다.