article thumbnail image
Published 2022. 8. 14. 17:55

Transfermer Network Intuition

[Transformer Network Motivation]

- 갈수록 복잡해진 모델

- 모두 sequential 모델 : input 문장을 한 단어/토큰씩 받아들임 - "as if each unit was like a bottleneck to the flow of information" - 예를 들어, 마지막 unit을 계산하기 위해서는 앞 unit들을 먼저 모두 계산해야 함

- transformer : 전체 sequence에 대한 계산을 병렬(in parallel)로 처리하게 됨

 

[Transfermor Network Intuition]

- Attention + CNN

     - attention based representation과 CNN processing을 합침

     - sequential 하게 데이터 처리하는 attention 모델과 parallel 하게 데이터 처리하는 CNN이 대조적으로 보일 수 있음

     - attention처럼 단어들의 rich, useful한 representation을 계산하면서, CNN 스타일로 병렬 처리를 하도록

- self-attention & multi-head attention

     - self-attention : 단어 5개로 이루어진 문장을 처리한다고 했을 때, 각 단어에 대한 representation을 가지게 됨 ($A^{<1>}$, $A^{<2>}$, $A^{<3>}$, $A^{<4>}$, $A^{<5>}$) -> 병렬적으로 처리하게 될 것임

     - multi-head attention : self-attention 에 대한 for-loop - 위와 같은 representation을 여러개 가지게 됨

 

Self-Attention

[Self-Attention Intuition]

*5개 단어로 이루어진 문장을 예시로 함

- attention-based representation for each word in input sentence 

 

$A(q,K,V)$ = attention-based vector representation for a word 

--> $A^{<1>}$, $A^{<2>}$, $A^{<3>}$, $A^{<4>}$, $A^{<5>}$

 

Jane visite l'Afrique en septembre

-> 맥락에 따라 representation이 다를 수 있음 : 역사적 장소로서의 아프리카? 세계에서 가장 큰 대륙으로서의 아프리카? 여행지로서의 아프리카?

-> $A^{<3>}$: l'Afrique 주위 단어들을 통해서 어떤 의미로 해당 단어를 말하는지 고려하고 가장 적절한 representation으로 나타낸다

-> 지난번에 배웠던 attention 계산방식과 크게 다르지 않으나 - 문장의 모든 단어에 대해 병렬적으로 계산한다는 점이 다름

 

RNN Attention

$$\alpha^{<t, t'>}=\frac{\exp{(e^{<t, t'>})}}{\sum_{t'=1}^{T_{x}}\exp{(e^{<t, t'>})}}$$

 

Transformers Attention

$$A(q, K,V) = \sum_{i} \frac{\exp{(q \cdot k^{<i>})}}{\sum_{j}\exp{(q \cdot k^{<j>})}}v^{<i>}$$

 

- 주요 공통점 : Softmax

- 주요 차이점 : 세번째 단어 l'Afrique 에 대하여 세 개의 vector - query($q^{<3>}$), key($k^{<3>}$), value($v^{<3>}$) 가 있음

 

[Self-Attention]

"l'Afrique"에서 self-attention representation $A^{<3>}$를 도출하기까지 ...

 

이것도 기억..

 

Transformers Attention

$$A(q, K,V) = \sum_{i} \frac{\exp{(q \cdot k^{<i>})}}{\sum_{j}\exp{(q \cdot k^{<j>})}}v^{<i>}$$

 

- 문장 내 모든 단어에 대해 query, key, value 를 세팅한다

Jane            $x^<1>$ ->  $q^{<1>}, k^{<1>}, v^{<1>}$

visite           $x^<2>$ ->  $q^{<2>}, k^{<2>}, v^{<2>}$

l'Afrique      $x^<3>$ ->  $q^{<3>}, k^{<3>}, v^{<3>}$

en                $x^<4>$  ->  $q^{<4>}, k^{<4>}, v^{<4>}$

septembre  $x^<5>$ ->  $q^{<5>}, k^{<5>}, v^{<5>}$

 

 

$x^<3>$ 가 l'Afrique 에 대한 word embedding 이고, $q, k, v$ 는 학습되는 matrix임

$$q^{<3>} = W^{Q} \cdot x^{<3>}$$

$$k^{<3>} = W^{K} \cdot x^{<3>}$$

$$v^{<3>} = W^{V} \cdot x^{<3>}$$

 

$W^{Q}, W^{K}, W^{V}$ 는 각 단어에 대해 query, key, value 를 계산할 수 있게 하는 파라미터

 

$q^{<3>}$ : destination l'Afrique 에 대한 질문 - "What's happening there?"

 

$q^{<3>} \cdot k^{<1>}$ : $q^{<3>}$ 와 $k^{<1>}$의 inner product(내적)을 구한다

-> "What's happening in l'Afrique?" 에 대한 대답으로서 Jane 이 얼마나 적합한지 알려준다

 

$q^{<3>} \cdot k^{<2>}$ : $q^{<3>}$ 와 $k^{<2>}$의 inner product(내적)을 구한다

-> "What's happening in l'Afrique?" 에 대한 대답으로서 visite 가 얼마나 적합한지 알려준다

 

... 나머지에 대해 동일하게 계산

 

 

-> 가장 useful한 representation $A^{<3>}$을 계산하는 데에 가장 필요한 정보가 무엇인지 알아내는 과정

 

 

만약 $k^{<1>}$ 가 '사람'을 represent 하고 있고, $k^{<2>}$가 'action'을 represent 하고 있다면, 

$q^{<3>} \cdot k^{<2>}$ 가 가장 큰 값을 가지게 될 것임 - "방문하다"라는 말이 "What's happening in l'Afrique?"에 대해 가장 유의미한 맥락을 제공하고 있으므로 - a destination for a visit

 

$q^{<3>} \cdot k^{<1>}$, $q^{<3>} \cdot k^{<2>}$, $q^{<3>} \cdot k^{<3>}$, $q^{<3>} \cdot k^{<4>}$, $q^{<3>} \cdot k^{<5>}$ 에 대해 softmax 계산

 

그 다음 각 단어의 value 값과 곱한다

두번째 단어가 내적값이 가장 컸으므로 파란색으로 표시

 

그 다음 다 더한다

 

 

최종적으로 이 식을 나타내게 됐음

$$A(q, K,V) = \sum_{i} \frac{\exp{(q \cdot k^{<i>})}}{\sum_{j}\exp{(q \cdot k^{<j>})}}v^{<i>}$$

 

- 장점 : l'Afrique을 고정된 word embedding으로 표현하지 않고 - visite 의 종착점이라는 의미를 포함함

- 위와 같은 과정을 모든 단어에 대해 실시 - $A^{<1>}$, $A^{<2>}$, $A^{<3>}$, $A^{<4>}$, $A^{<5>}$

 

$$Attention(Q, K, V) = softmax(\frac{QK^{T}}{ \sqrt{d_{k}}})V$$

 

- $Q, K, V$ : 모든 단어에 대한 query, key, value 나타낸 matrix

- 뒷부분은 $A(q, K,V) = \sum_{i} \frac{\exp{(q \cdot k^{<i>})}}{\sum_{j}\exp{(q \cdot k^{<j>})}}v^{<i>}$을 vectorized 로 표현한 것

- $\sqrt{d_{k}}$ : explode 하지 않도록 스케일 해줌 --> scaled dot-product attention 이라고 부르기도.

 

 

Multi-Head Attention

- basically, self-attention의 거대한 for-loop 이라고 생각하면 됨

- sequence에 대해 각 self-attention 계산하기 = head

 

각 단어에 대해 query, key, value값이 있고, 여기에 weight matrix 를 곱함으로써 새로운 set of query, key, value 를 계산함

- $W_{1}^{Q}$, $W_{1}^{K}$, $W_{1}^{V}$ -> "What's happening there?" 라는 질문을 하도록 학습됨

 

- l'Afrique 에 대해서 "What's happening there?"라는 질문에 가장 잘 답변해주는 것은 visite 이므로, visite의 key가 l'Afrique의 query와 inner product(내적)값이 가장 크다

--> 위처럼 l'Afrique에 대한 representation 구한 방식으로 다른 단어들에 대해서도 representation 구하면 됨

--> 해당 sequence 에 대한 representation으로 다섯 개 vector 가 발생함

$$Attention(W_{1}^{Q}Q, W_{1}^{K}K, W_{1}^{V}V)$$

--> 여기까지가 multi-head attention 에서의 첫번째 head 계산! ($W$의 subscript로 표시됨)

 

위의 계산을 예를 들어 여덟번 수행한다고 하자 (8 heads)

두번째 head 계산

 

- $W_{2}^{Q}$, $W_{2}^{K}$, $W_{2}^{V}$ matrix 준비, 두번째 질문을 하도록 함 - "When is it happening?"

빨간색

 

두번째 head 계산을 stack 해둠

이 두번째 질문에 대해서 l'Afrique의 query는 septembre의 key와 내적값이 제일 클 수 있음

 

검정색

- $W_{3}^{Q}$, $W_{3}^{K}$, $W_{3}^{V}$ matrix 준비, 세번째 질문을 하도록 함 - "Who?"

이 두번째 질문에 대해서 l'Afrique의 query는 Jane의 key와 내적값이 제일 클 수 있음

 

- head의 개수는 $h$로 나타냄

- 각 head를 각 feature 로 생각할 수 있음

head들의 계산값들을 concatenate 한 후, matrix $W$ 곱함 -> multi-headed attention의 결과값

 

$$head_{i} = Attention(W_{i}^{Q}Q, W_{i}^{K}K, W_{i}^{V}V)$$

$$MultiHead(Q,K,V) = concat(head_{1} head_{2} \cdots head_{h}) W_{0}$$

 

 for-loop으로 위에서 설명하긴 했는데, 실제로는 병렬적으로 head들을 계산하게 됨 (하나의 head값이 다른 head값에 의존하는 관계가 아니므로)

 

 

Transformer Network

[Transformer]

 

입력 시퀀스의 각 단어 embedding 준비

 

<SOS> $x^{<1>}$ $x^{<1>}$ ... $x^{<t-1>}$ $x^{<t>}$ <EOS>

Jane visite l'Afrique en septembre 

 

--> encoder block

앞에서 했던 대로 Multi-head attention을 계산 - N번 반복 (논문에서는 6번)

 

- decoder : 매 step 마다 먼저 translate된 output을 input으로 넣음

- 처음 시작할 때, "<SOS>" 토큰의 입력으로 시작

- 먼저 입력된 <SOS>으로 Q, K, V 를 계산하여 multi-head attention block에 입력

- 첫번째 multi-head attention block의 output으로 Q matrix 를 계산, K와 V는 encoder의 output을 활용한다

-> 처음 입력된 <SOS>로 query를 던지면, context로부터 key와 value를 가져오는 셈

- 그 다음 Feed Forwad NN 에 입력 --> 이러한 과정을 N번 반복

-  Feed Forwad NN는 다음 단어를 예측한다 -> Jane 출력

 

다음 step에서는 "<SOS> Jane" 이 입력 query로 들어간다

반복 ...

 

 

[Transformer Details]

 

- positional encoding of the input

     - attention 연산 과정을 살펴보면 단어의 position에 대한 내용이 없음

     - 따라서 단어의 position을 encoding 하기 위해 일정한 식을 사용함

Positional Encoding

$$PE_{(pos,2i)} = \sin{(\frac{pos}{10000^{\frac{2i}{d}}})}$$

$$PE_{(pos,2i+1)} = \cos{(\frac{pos}{10000^{\frac{2i}{d}}})}$$

- $d$: 만약에 word embedding이 4차원으로 되어 있다고 해보자. $d=4$

- $pos$: 이와 동일한 차원의 positional embedding $P^{<1>}$를 생성한다. (첫번째 단어 Jane에 대한 거니까 $pos=1$)

- $i$ : encoding의 차원 - 즉 4차원 중에서 첫번째 차원은 $i=0$, 두번째 차원은 $i=1$, 세번째 차원은 $i=2$, 네번째 차원은 $i=3$

--> positinal encoding에 사용되는 세 개의 변수

--> 각 단어에 대해서 unique한 positional vector 생성됨

 

$\sin$ & $\cos$ 함수..

- 첫번째 단어에 대한 positional vector $P^{<1>}$ 은 $x^{<1>}$에 그대로 더해짐

 

- encoding block의 output은 "contextual semantic embedding" 그리고 "positioinal encoding information"을 포함한다

- "The outputs of the embedding layer is then d, which in this case is 4, by the maximum length of sequence your model can take." -> 다른 layer (attention 레이어라든지, FFNN 이라든지) 들의 output도 동일한 shape

 

- 그 외에

- residual connection 있음

- batch norm과 매우 유사한 레이어 사용 -> Add&Norm 레이어

- decoder의 출력 부분에 한번에 한 단어씩 예측하는 softmax, linear 레이어 있음

- masked multi-head attention 있음 : 학습시에만 중요한 역할. 

     - 학습할 때는 정답 문장이 전부 있으므로 한번에 한 단어씩만 출력할 필요가 없음

     - training할 때는 뒷부분을 마스킹해서 실제 예측할 때처럼 훈련을 하게 됨 (앞부분 번역이 완벽하게 됐다고 했을 때 나머지 부분도 정확하게 예측할 수 있는지)

복사했습니다!