SYDLAB_hanyang/Frame Interpolation

FI - Attention(Query,Key,Value) / Transformer / Scaled dot-product / Multi head attention

빈그레 2024. 4. 28. 01:23

 

 

 

 

Attention

 

 

 

 

 

Attention 구조 간략히 정리

 

Attnetion은 Q,K,V를 입력으로 갖는다.

 

 querying

: query에 해당하는 값이 입력되었을 때, query에 해당하는 key 값을 찾아서 그 key값에 해당하는 value를 출력하는 작업을 말한다. 이때, query와 똑같은 key값을 선택할지, 가장 유사한 key 값을 선택할 지는 문제에 따라 달라지게 된다.

 

Attention에서는 query에 대해 어떤 key와 유사한지 보고 유사도를 반영하여 key에 대응하는 value를 합성(Aggregation)한 것이 Attention value가 된다. 

 

 

하나의 query에 대해 여러 key값들과 유사도를 계산한다. 여기서 유사도는 내적을 통해 구할 수 있다.

위 그림에서 빨간 값이 유사도의 값이고 해당 값에 파란 원인 value를 곱한 후 모두 더하면 attention value가 되는 것이다. 

 

[query,key 역할]

 

RNN 구조에서 하나 앞선 time-step의 hidden state가 해당 transformer 구조에서는 query이다. query가 deocder의 hidden state 역할을 한다. 

 

그리고, encoder의 hidden state를 key와 value로 사용한다. 즉, 이 구조에서 key와 value는 갖고 단어의 개수만큼 key 값을 갖는다. 대부분의 attention network에서 key와 value는 같은 값을 갖도록 하며, key는 유사도 측정해 쓰이고, value는 해당 값을 유지하다가 최종 attention map을 합성할 때의 각각의 '값'으로서 곱하여 쓰인다.

 

 

 

위 RNN 구조에서 si들이 decoder로 들어갈 hidden state 역할을 한다. 

 

 

attention  연산은 위 메커니즘을 따른다. 

Decoder에 si라는 query가 입력되면 모든 key값인 hi와 내적 ( comparison ) 을 통해 유사도를 구한다. 이 유사도 값을 softmax 함수를 거쳐서 확률로서 만들어 그 총 합이 1이 되도록 한다. 

 

softmax 함수를 거친 유사도 확률값을 가중치처럼 사용하여 각 value들을 곱하고 합하여 최종적으로 ai라는 attention value를 만들게 된다. 

 

 

 

수식은 위와 같다. 내적 결과를 softmax를 취하고 value값과 곱하고 총합을 구한다.

 

 

 

convolution 연산의 한계

 

 

convolution 연산은 필터 크기만큼의 영역을 순차적으로 이동하면서 각 영역의 정보를 읽는다.

각 필터가 local한 정보를 읽고 이해하며 layer가 쌓임에 따라 더 층층이 쌓인 더 넓은 영역으 정보(feature)를 읽을 수 있게 되는 것이 convolution layer의 동작 원리이다. 

 

이 특성이 convolution layer의 장점이자 단점이 된다. 얕은 layer에서는 local 영역을 자세히 볼 수 있고, 깊은 layer에서는 더 넓은 영역을 볼 수 있는 장점이 있으나, 

 

위와 같이 두 영역을 한 번에 볼 수는 없다. layer가 깊어져서 전체 이미지에 대한 정보를 한 번에 볼 수는 있어도, 지엽적으로 특정 두 부분만을 인식할 수 없다는 것이 convolution layer의 단점이다. 

 

이미지를 도는 동안 모든 부분에 대하여 동일한 가중치로 연산을 한다. 

 

 

위 attention 메커니즘을 보면 layer 초반부터 background와 같으 부분에 대한 중요도를 줄인다. 즉, low-level feature에 대한 영향을 줄이는 것이다. 대신 high level feature에 대한 영향은 키워 실제 객체에 집중하도록 만들어둔다. 

 

 

 

 

 

 

 


 

 

 

 

Transformer

 

 

 

 

 

 

 

 

Transformer에 관하여

 

 

 

Transformer는 다음과 같이 encoder,decoder 구조로 되어있다.

 

CNN에서의 feature extraction과 달리, Transformer에서는 sequence간의 관계를 학습하는 데에 초점을 맞춘다.

 

인코더에서는 input sequence를 고차원적인 표현으로 변환하고, 디코더는 이 표현을 사용하여 새로운 sequence를 생성한다. Transformer 모델에서 인코더와 디코더는 입력 내의 모든 요소 간의 복잡한 관계를 학습한다.

 

인코더 : input sequence 내의 각 요소들 간의 관계를 모델링

디코더 : 인코더 정보 사용하여 output sequence를 하나씩 생성

 

Transformer 모델은 인코더 디코더 구조를 통해 병렬철가 가능

-> RNN 기반 모델의 순차 처리 한계 뛰어넘는다. seq2seq에서는 encoder에 입력되어야할 모든 input이 처리된 후에 decoder 연산이 시작되지만, transformer는 encoder의 계산과 deocder의 계산이 동시에 일어난다는 차이가 있다.

 

 

[자연어 번역을 위한 Transformer]

 

Transformer의 전체 입출력은 행렬로 되어있다.

 

input 

: one-hot encoding 형태의 벡터로 나타내어있다. 즉 열벡터(세로)가 한 단어에 해당하며, 열 벡터의 길이 즉, 행의 개수는 단어의 개수와 관련이 있다.  ( 새로 열벡터에서 한 단어만 표현 / 단어 개수만큼 행 존재 ) 

문장에 단어가 10개 있으면 열벡터의 크기는 10이 된다. 

( 열벡터의 크기 = 행의 개수 = 단어의 개수 )

 

 

 

output

RNN

 

RNN구조에서 decoder의 첫 번째 rnn에서의 output은 다음 rnn의 input으로 들어간다. 이와 같이 transformer에서도 deocder의 output을 다시 decoder의 input으로 사용한다.

 

Transformer에서 decoder위쪽에서 나오는 output은 transformer 모델을 통해 출력되는 실제 출력이고, 아래쪽 decoder의 입력으로 들어가고 있는 output은 transformer에서 만들어낸 output을 다시 입력으로 사용하는 것이다.

 

다시 입력으로 사용되는 output의 첫 열벡터는 sos(start of sequence)rk ehlrh, X표시가 되어있는 마지막 열벡터는 EOS(End of Sequence)가 된다. output의 첫 열벡터와 마지막 열벡터로 output의 한 묶음에 대한 처음과 끝을 알려준다.

 

 

 

word embedding

 

 

 

one-hot encoding 타입의 벡터를 실수 형태로 변경하면서 차원의 수를 줄일 수 있다.

 

 

Positional Encoding

 

 

 

word embeding을 통해 차원의 수를 줄인 이후에는 해당 embedding된 값과  positional encoding을 통해 얻은 값이 더해지게 된다. 

 

RNN처럼 순차적으로 들어가지 않으므로 positional encoding을 통해 시간적 위치 정보를 추가해줘야한다. 즉, 시간적 위치별로 고유한 code를 생성하여 더하는 방식이다.

 

 

scaled dot-product attention

 

 

Q와 K의 비교 함수는 Dot-product와 scale로 이루어진다. 

 

Matmul

: dot product에 해당하고 inner product(내적)과 같다.

 

Scale

: 아래 식처럼 dk값을 조정하여 Matmul에서 내적된 결과값이 너무 커지거나 너무 작아지지 않도록 해준다. 

 

Mask

: mask를 이용해 illegal connection의 attnetion을 금지한다. 

illegal attention은 self attention의 개념과 연관되어 있다.

 

Softmax

: 가중치의 전체 합을 1로 만들어주기 위한 normalization 과정이다. 

 

*** Self atttention : 각각의 입력이 서로 다른 입력에게 어떤 연관성을 가지고 있는 지를 구하기 위해 사용된다.

 

즉, self attention에서는 query,key,value가 모두 같다! 지금 들어오는 input에 대해 서로간의 관계를 파악하는 것이기 때문이다. self attention 을 통해 attention이 강조되어있는 feature를 추출할 수 있다. 

 

 

Self attention은 입력 문장에 대해 문맥에 대한 정보 학습할 수 있도록 만들어준다. 

"I am a teacher"에서의 각 단어가 서로 어떤 연관을 가지고 있는지를 학습할 수 있다.

 

 

self attention에서는 decoder가 똑같은 decoder 자기 자신과 연산을 할 수 있다. 

단, 특정 layer보다 앞선 layer들만을 가지고만 attention 연산을 할 수 있다. 

 

 

[1]

위 그림에서와 같이 디코더는 이전 디코더 layer의  output을 입력으로 받아 그것에 대한 self-attention을 진행한다. 

위 그림에서 decoder 가장 아래에 처음으로 수행되는 attention 구조가 self-attention으로서 입력으로 들어온 sequence에 대해 관계를 학습하는 것이다. 마스킹 기법이 사용되며, 과거의 decoder layer에 대한 정보만 활용할 뿐, 미래에 대해서는 참조해서는 안된다.

 

[2]

그 이후, 위쪽 attention구조는 인코더-디코더 어텐션이다. 여기서 디코더는 인코더의 출력을 참조하여 각 토큰이 입력 sequence 내의 모든 토큰에 주의를 기울인다. 이 메커니즘을 통해 디코더는 과거 정보들을 이용하여 인코더에서 받은 값[3]을 참조하여 다음 토큰을 정확하게 예측하도록 한다. 

 

 

Mask ( illegal connection 방지 )

 

decoder는 이전 layer의 output을 참조하되, 이후 layer에 대한 value값은 참조해서는 안 된다. 

 

 

 

 

따라서, 자기 자신을 포함한 미래의 값과는 attention을 구하지 않기 위하여 mask를 씀으로서 illegal connection을 막는다.

 

sequence를 생성하는 작업에서 디코더 output으로 현재 나와야할 단어를 생성할 때, 아직 생성되지 않은 미래의 단어들에 대한 정보는 사용하지 않도록 해야한다. 이것이 마스킹의 주된 목적이다. 

 

예를 들어 The quick brown fox를 번역하는 중에 quick을 생성할 때는 The의 정보만 사용하고, brown이나 fox의 정보는 사용하지 않아야 한다. 미래의 단어는 계산에서 제외되며, softmax 단계에서 이들에 대한 attention 가중치는 0이 된다. 

 

이러한 마스킹 과정은 디코더가 학습 중에 미래의 정보를 불필요하게 이용하는 것을 방지함으로써, 실제 추론(inference) 단계에서도 각 시점에서 사용할 수 있는 정보에만 기반하여 단어를 순차적으로 생성할 수 있도록한다.

 

Q,K,V는 다음과 같이 행렬 형태로 변환 후에  연산된다. 

 

 

C는 softmax까지의 결과값이므로 확률값으로서, 가중치의 역할을 하여 value와 곱해지면 attention value가 된다. 

 

 

Multi-Head attention

 

 

위에서 설명한 scale dot product attention을 h개 모아서 attention layer를 병렬적으로 사용하는 것을 말한다. 

 

 한번에 scaled dot product attention을 연산하지 않고, 여러 개의 작은 scaled dot product attention으로 분할하고 병렬적으로 연산한 다음에 concat하여 합치는 drive & conquer 전략이라고 할 수 있다. 

 

여기서 h를 몇으로 하느냐, 즉 몇개로 분할하느냐에 따라 각 scaled dot product attention의 입력 크기가 달라지게 된다. 

 

h개의 scaled dot product attention은 병렬적이며, 독립적이다. 병렬 연산을 마친 뒤에 concat을 하는데, concat을 하면 차원이 커지므로, 출력 진전에 linear 연산을 한 번 더 거쳐, attention value의 차원을 필요에 따라 변경한다. 

 

[Linear]

위 그림에 있는 linear module은 linear 연산 ( matrix multiplication ) 을 이용해 query,key,value의 차원을 맞춰주는 것이다. 

 

차원을 바꿔주기 위한 W 행렬과의 곱을 통해 model이 target으로 하는 크기로 query,key,value의 차원을 모두 감소 및 변경한다.

dmodel은 multi head attention에서 scaled dot product attention에 사용되는 dimension을 뜻한다.

 

 

[의의]

 

Multi attention의 핵심 목표는 input sequence를 h번 변환하여, 다양한 방식으로 포착하여 sequence의 전체적인 문맥을 더 더 잘 이해하는 것이다. 즉, 같은 입력에 대해 다양한 방식으로 정보를 처리하고 관계를 학습하는 것을 목표로 한다. 

 

 

 

정리

self attention 구조는 query,key,value가 모두 동일하며, 서로 간의 관계를 파악하는 것이다.

 

encoder의 self attention은 현재 input에 대해 관계를 파악하는 것이므로 mask가 없으나,

decoder의 self attention은 과거 값들만을 가지고 정보를 분석하는 것이므로 mask가 필요하다. 

 

붉은 박스인 encoder-decoder attention은 encoder로부터 key와 value를 받고, decoder의 self attention으로부터 query값을 받는다. 이를 통해 seq2seq의 attention과 동일한 구조를 갖게 된다.