https://www.youtube.com/watch?v=mxGCEWOxfe8
- encoder와 decoder를 사용한 모델
- RNN을 사용하지 않음 -> multi head attention을 사용
- RNN을 사용하는 것보다 속도가 빠름
- 문장을 순차적으로 처리하는 RNN에 비해 parallel하게 문장을 처리하기 때문에 속도가 빠름
Encoder
- 문장의 모든 단어의 attention을 한번에 계산함.
- Encoder의 입력과 출력의 dim은 같아야 함. -> 이는 encoder를 여러개 붙일 수 있음
- transformer는 encoder layer를 6개 붙임 -> 각 encoder layer는 서로의 weight을 공유하지 않고 따로 학습함.
Positional Encoding
- encoder decoder 입력값마다 상대적인 위치를 더해주는 작업.
- sin, cos function을 사용해서 positional encoding을 사용함
- positional encoding값이 [-1, 1]이 나옴
- 학습데이터 중 가장 긴 문장보다 더 긴 문장이 들어와도 에러없이 상대적인 값을 계산할 수 있음
Self Attention
- encoder에서 이루어지는 attention 연산
- 각 단어마다 query, key, value 존재(벡터 형태) -> 단순 weight matrix로 딥러닝 학습시에 최적화 된다.
- query - 현재 단어
- 어떤 단어와의 상관관계를 구할때 query를 해당 단어의 key 값과 곱해줌(dot product) -> attention score라고 한다 -> 이 값이 높을수록 연관성이 높다.
- attention score을 key의 차원수의 루트값으로 나눠서 softmax를 취해줌 -> key 벡터의 차원이 커질수록 값이 커지는 문제를 막기위해.
- 이렇게 softmax를 취한 값을 각 단어의 value값과 곱해주고 모두 더한다 -> 이것은 문장속에서 현재 단어가 지닌 전체적인 의미를 나타낸다.
- query, key, value가 모두 행렬이기 때문에 모든 단어에 대해서 한번에 계산이 진행될 수 있고 이것이 transformer의 최대 장점인 parallelism이다.
Multi Head Attention
- transformer는 8개의 attention layer를 병렬적으로 처리한다. -> 이를 multi head attention이라고 부른다.
- 하나의 정보는 attention은 모호한 정보를 갖고 있기 때문에 multi head attention을 통해 다양한 관점에서 수집해서 보완한다.
- 단어 -> word embedding -> positional encoding -> multi head attention -> 결과를 concat해서 weight을 곱해서 입력과 동일한 차원인 matrix로 만듬 -> 행렬을 이루는 각각의 벡터는 또 따로 FC(Fully connected layer)로 들어가서 입력과 동일한 사이즈의 vector로 출력 -> output
- backpropagation에 의해 positional encoding이 많이 손실될 수가 있는데, 이를 보완하기 위해 residual connection으로 입력된 값을 한번 더 더해줌
- residual connection 뒤에는 layer normalization을 통해 학습의 효율을 높임.
Feed-Forward
- 각 단어마다 독립적으로 적용되어 output vector를 만든다.
Decoder
- attention + 이전 단어를 통해 다음 단어를 찾아냄.
- transformer는 6개의 decoder layer를 갖고 있다.
- 최초 단어부터 끝 단어까지 순차적으로 단어를 출력 - 현재까지 출력된 값들의 attention과 encoder 최종 output의 attention이 적용이 된다.
Masked Multi head Attention
- decoder의 첫번째 multi head attention layer는 masked multi head attention layer다.
- decoder layer에서 지금까지 출력된 값들에만 attention을 적용하기 위해서 출력값 이후의 단어들에 대해 masking을 진행.
Multi head Attention
- Encoder의 Multi head Attention과 다른 점은 현재 decoder의 입력값을 query로 사용하고 encoder의 최종 output을 key와 value로 사용
- decoder의 입력값을 통해 encoder의 최종 출력값에서 가장 연관이 있는 단어를 찾아내는 작업
Feed-Forward
- multi head attention의 출력값을 feed-foward layer를 통해 최종값을 vector로 출력
Linear + Softmax
- vector를 실제 단어로 출력하기 위해 사용하는 방법
- linear를 통해 softmax에 입력으로 될 logits을 생성
- softmax는 모델이 알고있는 모든 단어에 대한 확률값을 출력하고 가장 높은 확률을 가진게 다음 단어가 된다.
- label smoothing을 통해 성능향상 -> 모델이 너무 학습데이터에 치우치게 학습하지 않도록 - 학습데이터의 label이 noisy한 경우 큰 효과를 낸다.