- 해당 논문 리뷰에는 Transformer을 구체적으로 알기 위해서 다양한 정보를 추가하였습니다.
편하게 봐주시면 감사하겠습니다!
- Sequential computation 감소의 목표는 Extended Neural GPU, ByteNet, ConvS2S를 기초로 형성했다.
Transformer 등장 배경에 앞서서 Attention의 등장 배경을 알아야지 이해되기 때문에 간단히 짚고 넘어가겠다.
그렇다면 '입력 문장의 길이에 맞게 Encoder의 출력 벡터의 길이를 변화시키면 어떻게 될까?' 라는 질문에서 출발한 것이 Attention 접근 방식이다.
여기서
hs
란모든 시점에 대해 정보를 갖고 있는 행렬
을 의미한다.
어떻게 하면 Encoder에서 전달 받은 행렬을 잘 활용할 수 있을까?
행렬 내 각 벡터의 중요도를 계산하여 가중치 합
을 구해야 한다.
- 위의 그림에서
a
란벡터의 중요도
를 의미한다.
- Decoder에서 LSTM을 거쳐서 나온 vector가 얼마나 유사한지를 vector의 중요도로 판단한다.
- 즉, 현 시점에서 어떤 값에 집중할지를 나타내는 것을 의미한다.
그렇다면 벡터의 중요도는 어떻게 구하는 것일까..?
그 과정은 다음과 같다.
1) hs행렬(Encoder에서 받은 행렬)과 h벡터(LSTM을 거쳐서 나온 벡터)를 내적한다
-> 내적한 값이 크다는 의미는 두 벡터의 방향이 유사하다는 의미이고, 내적 값이 큰 벡터가 더 많이 유사하다는 것을 알 수 있다.
2) softmax함수를 적용한다.
-> 구하고자 하는 것은 가중치이므로 그대로 사용하면 안되고 가중치처럼 보이게 하기 위해 softmax를 적용한다.
hs 행렬
과 h벡터
의 내적 + softmax
함수 적용3) Weight sum 계층을 통해 맥락벡터(c)를 출력한다.
-> Weight 계층으로부터 입력 받은 가중치(a)와 hs 행렬을 곱하여 맥락벡터(c)를 출력
- Attention이란, Encoder에서 각 계층마다 나오는 벡터(모든 위치에서의)를 행렬로 묶어서 전달하는 것을 의미한다. 이때, Weight 계층과 Weight Sum 계층이 하는 일에 대해서 잘 알아야 한다.
- 맥락백터(c)란, Encoder에서 전달받은 hs행렬에서 현 시점에서 가장 필요한 정보만을 담은 벡터를 의미한다.
-> 이를 활용해 단어를 예측하면 기존의 Seq2seq 모델보다 더 정확한 예측이 가능하다.
1) 기존의 Seq2seq 모델 같은 경우, Encoder를 거친 최종 마지막 벡터만 Decoder로 전달하였다. 즉, input 정보를 고정된 길이의 벡터로 Decoder에 전달했기 때문에 input 데이터의 정보가 너무 압축되어서 정보 손실이 일어난다.
-> Attention의 출현으로 보정
2) 하지만 Attention 또한 RNN 모델에 의존적이다.(병렬화를 배제)
-> 여기서 병렬화를 배제했다는 것은 RNN 구조 자체가 하나씩 전달 해야 하는데, 이렇게 데이터를 앞에서 하나씩 읽어야 되는 단점이 있다.
-> Encoder or Decoder에 LSTM(RNN)이 존재한다.
3) Attention mechanism은 모델이 아니라 RNN을 보정하는 정도이다.
그렇다면 '
RNN 모델을 사용하지 않고 Attention 구조만을 사용해서 모델 구현할 순 없을까?
' 라는 질문으로 시작해서 Transformer가 나오게 되었다.
Encoding Block vs Decoding Block
=Unmasked
vsMasked
= 2단 구조 vs 3단 구조
1. 인코더의 모든 구조는 동일하지만 해당하는 가중치를 share하는 것은 아니다.
- 예를 들어, 1번째 Encoder block과 3번째 Encoder block의 구조는 동일하지만, 다만 그 구조 안에서 가질 수 있는 가중치들은 학습을 통해서 달라질수 있다.
2. 인코더의 구조는 2개의 sub-layers로 구성된다.
- 먼저 self-attention layer를 거치고 feed-forward neural network를 거쳐서 output이 나오게 된다.
- 예를 들어, 위의 그림처럼 5개의 word가 있다고 가정하면, self-attention을 통해서 5개의 word가 position을 유지한 채 그대로 나오게 된다. 그 뒤 feed forward nerual network를 적용할 때 한꺼번에 적용 하는 것이 아니라, 각각의 단어들에 대해서 각각 feed forward nerual network를 적용한다. 이것이 Transformer Encoder의 가장 큰 특징이다.
Transformer의 Encoder 과정은 다음과 같다.
- 입력된 행렬을 Query, Key, Value 3개로 나눈다.
- Multi-Head Attention 계층을 거친다.
- Skip-Connection이 적용된 행렬과 Add & Norm을 수행한다.
- Feed Forward 계층을 거친다.
- Skip-Connectrion이 적용된 행렬과 Add & Norm을 수행한다.
- 해당 행렬을 다시 1번 과정으로 돌아간다.
위 과정을 총 N번 수행하는데, 이 논문에서는 이를 총 6번 수행하였다.
Transformer의 Decoder 과정은 다음과 같다.
- 입력된 행렬을 Query, Key, Value 3개로 나눈다.
- Masked Multi-Head Attention 계층을 거친다.
- Skip-Connectrion이 적용된 행렬과 Add & Norm을 수행한다.
- Encoder로부터 입력된 행렬을 Key, Value 3번 과정으로 부터 나온 행렬을 Query(Decoder에서 나오는 h벡터)로 사용한다.
5.Multi-Head Attention 계층을 거친다.- Skip-Connectrion이 적용된 행렬과 Add & Norm을 수행한다.
- Feed Forward 계층을 거친다.
- Skip-Connectrion이 적용된 행렬과 Add & Norm을 수행한다.
- 해당 행렬로 다시 1번 과정을 수행한다.
위 과정을 총 N번 수행하는데, 이 논문에서는 이를 총 6번 수행하였다.
- Self-Attention은 dependency O <-> Feed Forward에는 dependency X
- dependency가 있다는 것은 서로 영향을 미친다는 의미이지, 서로 바뀐다는 의미는 아니다.
Self-Attention이 하는 역할은?
- 예를 들어, The animal did't cross the street because it was too tired 라는 문장이 있다. 이때 it은 The animal이라고 사람은 금방 생각할 수 있지만 컴퓨터는 바로 생각할 수 없다.
- Self Attention은 input sequence에 있는 다른 단어들도 다 훑어 가면서 it과 연관되는 단어가 무엇인지 찾는 것이다. 즉, 현재 processing 중인 단어에 대해서 의미를 정확히 파악하고, 그것에 대한 처리를 보다 정확하게 하기 위해서 동일한 input sequence 단어에 대해서 살펴보겠다는 것이다.
1) encoder 각각의 3개의 input vector를 만든다.
Query
: 현재 내가 보고 있는 단어의 representation이다. 다른 단어들을 scoring하기 위한 기준이 된다.Key
: labels과 같은 역할을 하며, 어떤 Query가 주어지고 유의미한 단어를 찾을 때, key값은 identity로 원하는 값을 쉽게 찾을 수 있게 하는 역할을 한다. (=labels 값)Value
: 실제 단어의 representation이다. (=실제 값)2) Calculate a score
3) Divide the score by (= 8 in the original paper since dk=64)
4) Pass the result through a softmax operation
5) Multiply each value vector by the softmax score
6) Sum up the weighted value vector which produces the output of the self-attention layer at this position
Scaled Dot-Product Attention 계산 순서는 다음과 같다.
- 하나의 입력만으로
Q,K,V
를 생성- Query 행렬과 Key행렬을 행렬 곱 수행
- 기존 Attention 계층에서 hs 행렬과 h 벡터 사이의 유사도를 구하는 과정
- 출력된 행렬에
Scaling
을 적용
- 위 식에서 로 나누는 것(dk= Key행렬의 차원 수)
기울기 소실 문제를 방지
하기 위함
Masking
과정을 거친다.
- 해당 과정은 Decoder에 위치한 Masked Multi-Head Attention에서만 수행
Softmax
함수 적용
- 기존 Attention 계층과 마찬가지로 가중치로 사용하기 위해 수행
- 가중치와 Value 행렬을 행렬 곱하여 새로운 Value 행렬을 생성
- 기존 Attention 계층에서
맥락벡터(C)
를 구하는 것과 동일
논문에서는 Dot Products는 크기를 키우고, 큰 dk 는 좋지 않은 영향이 있을거라고 주장한다.
마스킹하는 방법은 다음과 같다.
- 입력 받은 행렬에서 본인 시점 이후의 값을 모두 -♾️로 변경
- 변경한 후 Softmax 함수를 적용하게 되면 변경된 값이 모두 0이 된다. 즉, 가중치가 0이 된다.
가중치가 0
이기 때문에 실제 계산에서는 제외된다. 즉, 마스킹 과정을 통해 본인 시점 뒤에 값는 전부 사라지는 효과가 있다.
1) 동일한 self-attention 계산을 서로 다른 가중치 행렬로 8번만 수행하면 결국 8개의 서로 다른 가중치 행렬이 생성된다.
2) 각각의 개별적인 attention을 8개 만들어서 Concatenate을 한다.
3) 전체적인 과정 요약
Multi-headed Attention(2개) vs Multi-headed Attention(8개) 비교
Multi-Head Attention 계산 순서는 다음과 같다.
- 입력된 Query, Key, Value 갑에 각각 다른 가중치를 곱한다
- 각각 총 h개씩 곱하여 Query, Key, Value를 생성
- 서로 다른 가중치를 h개 곱해줘서 서로 다른 행렬 h개를 만들어낸다.
- h개 생성된 Query, Key, Value를 각각 Scaled Dot-Product Attention을 수행
- 총 h번 수행되는 것이며 출력 역시 새로운 Value 행렬 h개가 출력
- h개의 새로운 Value 행렬을
Concat
- Scaled Dot-Product Attention을 거친 h개는 모두 형상이 동일하므로 옆으로
이어붙히기 가능
출력 형상을 조정
하기 위해 가중치 행렬과 행렬 곱
- 출력 형상 조정을 위한 과정이며
가중치 행렬
은새로운 가중치
Residual Block: Resnet에 나온 개념으로 입력의 input(x)과 self-attention 값 (f(x))을 더해주는 것이다. (= f(x) + x)
이렇게 하는 이유는 미분을 했을 때, f'(x)가 값이 작아져도 gradient가 최소 1만큼을 흘러보낼 수 있다는 장점을 가지고 있어서 학습할 때 매우 유용하다.
이 후 LayerNorm을 거친 뒤, Feed Forward에 input으로 들어갈 z1과 z2가 만들어진다.
모든 Encoder와 Decoder Block에 Residual connection과 LayerNormalization은 계속적으로 수행한다.
Multi-Head Attentiond에서 출력 형상을 조정하는 이유는 무엇일까?
Skip-Connection과 Add & Norm을 거치기 위해서 Multi-Head Attention에서 출력 형상을 조정하게 된다.
Skip-Connection
을 의미한다. Add
: Skip-Connection 행렬 + Multi-Head Attention의 출력 행렬
Norm
: Add한 행렬을 정규화(Layer Normalizaiton
이 둘을 하는 이유는 Scaling과 같이 기울기 소실 문제를 해결하기 위해서이다.
입력 데이터
마다 평균과 분산을 활용하여 데이터의 분포를 정규화하는 과정을 의미한다.Feed Forward의 계산식은 다음과 같다.
- 입력된 행렬을 Fully-Connected Layer를 거친다.
- ReLU 함수 적용
- 다시 Fully-Connected Layer 거친다.
Feed Forward는 왜 하는걸까...?
- 이 과정에서 Fully-Connected Layer를 거치면서 차원을 키운다. 즉, 좀 더 다양한 정보를 행렬에 담을 수 있기 때문에 Feed Forward를 거치게 된다.
Learned Embedding
을 사용한다.Learned Embedding
을 사용한다.Learned Embedding이란 embedding 값을 고정해두는 것이 아닌, 학습 과정에서 가중치를 업데이트 하듯이 계속하여 갱신해 나가는 방식을 의미한다.
위의 그림 아래를 보면, Positional Encoding이라는 개념이 나온다. 이것은 무엇일까?
위의 그림의 왼쪽 Encoder Block에서의 N=6인데, 이것을 풀어서 그리면 Encoder Block이 6개 쌓아진다. 여기서 첫번째 Encoder Block에서만
Input Embedding
이 그대로 들어가게 되고, 실질적으로 두번쩌 Encoder Block에서의 Input은 첫번째 Encoder Block에서의 output이 들어가게 된다는 것이다.
지금까지의 RNN은 하나의 sequence만 들어갔기 때문에 어떠한 단어가 언제 들어왔는지에 대한 정보를 알 수 있었다. 하지만 Transformer는 한번에 전체 sequence를 집어넣기 때문에 어떤 단어가 몇번째에 위치 되어있는지에 대한 정보를 손실 될 수 있다.
그래서 그 정보를 완벽하게 복원을 하지는 못하더라도 각각의 단어가 가지고 있는 위치 정보를 보존해주자는 목적으로 만들어진 것이 `Positional Encoding
이다. 즉, 단어 Input의 sequence에서의 단어의 순서를 어느정도 고려해주는 것이 목적이다.
Input Embedding과 Positional Encoding을 concat이 아닌 더해준다.
아래 그림과 같이 concat은 512차원의 벡터를 옆으로 붙어주기 때문에 1024차원의 벡터가 만들어진다. 하지만 더한다는 개념은 말 그대로 같은 차원의 벡터를 각각의 위치끼리 더해서 결과물도 같은 차원의 벡터가 되는 것이다.
위치 정보
를 추가할 수 있다.문장 전체
로 한번에 학습시키고 이로 인해 병렬 처리가 가능해졌다.계산 수식은 다음과 같다.
이때 sine / cosine 함수를 사용하는데, 그 이유는 무엇일까?
- 각각의 고유한 토큰 위치 값은 유일한 값을 가진다.
-> 전부 값이 달라야 이 값이 어디에 위치해 있는지 알 수 있다.
- 서로 다른 두 토큰이 떨어져 있는 거리가 일정해야한다.
-> 떨어진 정도가 같아야 입력을 할 때, 정보 손실이 일어나지 않는다.
최종 정리하면
1) 각각의 Input에 대한 Embedding과 Positional Encoding을 서로 더해준다.
2) 새로운 Embedding with Time Signal을 만들어준다.
- 그래서 Positional Encoding을 왜하는 것일까?
Transformer는 한번에 모든 sequence를 입력 받기 때문에 단어가 가지고 있는 위치 정보를 고려하지 못하는 단점이 있다. 그래서 단어가 가지고 있는 위치정보를 최대한 반영하고자 하는 장치를 마련햊기 위해 Positional Encoding을 하는 것이다.
- 좋은 Positional Encoding vector가 가져야 하는 조건은?
1) 해당하는 Encoding vector 자체의 크기는 동일해야한다.
2) 위치 관계를 표현하고 싶기 때문에 두 단어 간의 거리가 실제로 input sequence에서 멀어지게 되면 이 둘 사이의 posional encoding 사이의 거리도 멀어져야 한다.
-> The further the two positions, the larger the distance
- 결론적으로 말하면, 연산량이 적고 속도가 빠르다는 장점이 있기 때문에 Self-Attention을 사용한다.
1.layer별 총 연산의 complexity
2.필요한 최소 sequential operations으로 측정한 병렬처리 연산량
3. Network에서 long-range dependencies 사이 path length
-> long-range dependencies의 미치는 한가지 요소는 forward 및 backward signal의 길이이다.
-> Input의 위치와 Output의 위치의 길이가 짧을수록 dependencies 학습은 더욱 쉬워진다.
-> 서로 다른 layer types로 구성된 네트워크에서 input과 output 위치 사이 길이가 maximum 길이를 비교한다.
1) 기존 Attention
1번: Query 라고 부른다. (Q)
2번: Key 라고 부른다. (K)
3번: Value 라고 부른다. (V)
2) Self-Attention
Idea
: 하나의 행렬에 서로 다른 가중치 합을 통해 3개로 나눌 수 있다.
- Attention에서 나온 개념이기 때문에 앞에 Attention과 연결 짓는다면 도움이 될 것이다.
생략하겠습니다.
저자가 뭘 해내고 싶어 했는가?
이 연구의 접근 방식에서 중요한 요소는 무엇인가?
어느 프로젝트에 적용할 수 있는가?
참고하고 싶은 다른 레퍼런스에는 어떤 것이 있는가?
느낀점은?
지금까지의 논문 리뷰 중 제일 어려웠다. Encoder에서 시작되어 Decoder 구조까지.. 복잡하였다. 한 5번 정도 계속 보았고, 블로그랑 유튜브 등 다양한 자료를 찾아가면서 논문 리뷰 정리를 하였다. 사실 아직도 완전히 내 꺼로 만들지 못했다. 시간 날 때마다 Transformer 관련 영상이나 블로그 그리고 논문을 보면서 또 공부해야겠다.
Transformer는 NLP뿐만 아니라 CV, Rec에서도 최근 활발하다. 이를 기반으로 많은 모델이 만들어진만큼 이 논문은 정말 정말 시간 투자를 꼭 해야 된다. 다음은 Item2Vec, Doc2Vec이다. BERT 논문 리뷰를 하는 그 날까지..! 파이팅!