RNN - LSTM - seq2seq - Attention - Transformer
기존 Recurrence가 아닌 Attention 기법만으로 성능 향상을 이룬 transformer
입력 시퀀스 전체에서 정보를 추출하는 방향으로 발전
고정된 크기의 context vector에 정보를 압축할 때, 병목이 발생해 성능 하락의 원인이 됨
그럼 소스 문장의 출력 전부를 디코더의 입력으로 받는다면?
즉 context vector와 encoder의 hidden state를 모두 사용한다면?
이를 각 hidden state의 softmax를 취해 어떤 값에 가중치를 두어야 하는지 설정하는 것이 바로 Attention
Decoder의 출력 하나 마다 decoder 출력 직전 값, encoder 출력들간의 연관성을 고려한 energy를 softmax해 weighted sum한 값으로 가장 높은 확률의 단어를 y로 결정하는 것
Attention을 사용하면 성능 향상 뿐만이 아니라 어떤 값이 출력되었을 때 어떤 Input이 가장 큰 영향을 미쳤는지 알 수 있음
RNN, CNN이 아닌 attention 알고리즘 만으로 구성된 architecture라도 높은 성능을 얻을 수 있다
순서 정보는 positional encoding으로 대처
단어 정보를 넣기 위해서는 embedding이 필수
전통적인 임베딩은 단어의 개수만큼 행 개수와 embedded_dim 만큼의 열로 구성된 matrix
RNN 기반 임베딩은 자연스레 순서가 embedding에 포함되어 있지만, attention에서는 위치 정보가 없음
이를 해결하기 위해 위치 정보가 포함 된 positional encoding을 수행
단어의 상대적인 위치정보를 네트워크에 입력
Sine 함수와 같은 주기 함수를 사용 (어떤 함수든 주기함수면 상관 X)
Input embedding Matrix에 positional encoding을 진행한 후, Input 끼리의 attention을 구하여 Input 간의 관계를 학습
추가적으로 residual learning 등과 함께 진행 (성능 향상과 속도 향상)
이후 add, Normalization 등을 통해 정규화하여 하나의 encoding layer를 완성하고 이러한 encoding layer를 중첩시켜 encoder를 완성
각각의 layer는 모두 다른 parameter를 가짐
decoder의 layer들 또한 구성은 encoding layer와 동일하며 마지막 encoding layer의 출력을 함께 학습하는 attention 알고리즘을 수행
다만 하나의 decoding layer에는 두 개의 multi-head attention으로 하나는 decoder의 Input 사이의 관계를, 하는 encoding layer의 출력과의 관계를 학습하는 attention layer로 구성
decoding layer도 중첩하여 학습할 수 있음
보통 encoding layer와 decoding layer는 같은 개수로 설정
근데 그래서 multi-head attention이 뭔데?
연관성을 가지는지 물어보는 주체 - 즉 본 단어
답하는 주체 - 본 단어를 포함한 나머지 단어들
쿼리와 키의 행렬곱 한 값에 scailing 과 masking 후 Softmax로 확률 값을 구해 value 값과 행렬곱하는 것이 최종적인 attention mechanism
H개의 서로 다른 value, key, query를 행렬 곱으로 h개의 쌍들을 구하고 이를 concat, linear layer를 통해 차원을 Input과 동일하게 함
수식을 보는것이 이해가 편함
Attention energy matrix에 음의 무한으로 곱해주면, softmax를 했을 때 출력이 0에 가까워지게 하는 것
즉 특정 단어에 attention을 수행하지 않게 함
Encoder의 Input들 끼리의 연관성을 학습
Decoder의 Input들 끼리의 연관성을 학습하는데, 뒤에 나올 것 까지 attention을 수행하는 것은 일종의 cheating 이므로, masking 해 앞의 단어들만 학습에 사용
Decoder의 값이 query가 되어 encoder의 key, value를 학습하는 것
시각화를 통해 attention score를 구할 수 있음
같은 문장 사이의 단어와 어떤 단어가 연관성이 있는지 알 수 있음
나는 감자다