본문 바로가기

인공지능 확률통계

Transformer

(* 이미지는 https://wikidocs.net/31379, https://www.blossominkyung.com/deeplearning/transfomer-positional-encoding 것이 적당히 섞여 있으나 추후 변경 예정)

 

 

1. Input Embedding

Input에 입력된 데이터를 vector 행렬로 변경

Input 을 구성하는 각각의 단어는 그에 상응하는 인덱스 값에 매칭되고, 해당 값들은 Input Embedding에 전달된다.

임베딩 크기가 512인 각 단어에 상응하는 벡터를 만든다. (예: index 3412 -> vector (0.01, 0.2, 0.03, ...,~512개~))

임베딩 시 문장 내 단어의 관련성에 따라 위치가 정해지며, 유사한 단어 끼리는 비슷한 벡터공간에 위치하게 된다. (* KeyPoint)

 

* 트랜스포머 계산 특징

기존 CNN, RNN은 Sequentail 데이터 입력에 대한 계산을 수행한다. (시계열 데이터; 순서 있음)

트랜스포머는 입력데이터를 행렬계산으로 한번에 처리한다. (병렬 데이터; 순서 없음)
(* GPU에서 대량 병렬처리 가능한 구조. 그래서 빠르다.)

 

2. Positional Encoding

트랜스포머에서 병렬 계산시 위치정보가 없는 것을 보완하기 위해 Input Embedding 결과에 Position Encoding을 수행하여 위치정보 벡터를 더해주는 것

 

* 위치 지정 규칙

i. 모든 위치값은 시퀀스의 길이나 Input에 관계없이 동일한 값을 주어야 한다. (예: "This is my car"나 "That is not" 이나 각 position 에 동일한 값이 추가된다. p0 = (0.01, 0.02, ...~512~), p1=(0.02,0.012, ... ~512~) ...)

 

ii. 모든 위치 값은 너무 크면 안된다. 위치정보로 인해 단어정보의 값이 퇴색된다.

 

2.1. Positional Encoding을 위한 sin, cos 함수

위 Position Encoding 지정을 위한 2가지 규칙을 위해 sine, cosine 함수를 이용한다.

sin, cos 함수는 주기적인 값을 줄 뿐이지 sequential한 순서를 주는 것은 아니다.

 

여기서 중요한건 위치 정보는 순차정보를 뜻하는 것이 아니라, 벡터 공간의 서로 다른 위치에 대해 고유한 값을 생성하는 것이 목적이라는 것이다.

이를 통해 Input Embedding 후의 벡터가 같은 동일한 단어일지라도, Positional Encoding을 거친 후 위치가 달라서 다른 벡터로 변환이 가능하다. 즉, 문장내 위치에 따른 다른 의미를 부여할 수 있게 된다.

 

3. Input Embedding ⨁ Positional Encoding

두 벡터는 Summation (= ⨁) 연산을 수행한다. (벡터길이에 변화 없음)

두 벡터만 따로 보면 연관성이 없다.

Input Embedding 결과의 벡터에 위치 정보를 추가하는 것이 목적이기 때문에 단순 행렬덧셈을 수행한다.

summation의 단점은 기존 값을 보존하지 못함에 있고, 장점은 concatenate보다 메모리를 덜 쓰기에 비용 효율적일 수 있다.

 

 

4. Attention, Self-Atention

Attention: 주어진 입력값에서 모델이 더 중요한 부분에 집중할 수 있도록 돕는 역할

Self-Attention: 같은 문장 내에서 단어들 간의 관계를 토대로 어텐션을 계산하는 방법

 

4.1.Query, Key, Value

Attention의 목표는  value를 통해 가중치 합계를 계산하는 것이고, 가중치는 Query와 Key의 유사한 정도로 결정된다.

Query, Key, Value에 따라 집중(=Attention)하는 부분이 달라지게 된다.

 

  • Query
    • 입력 시퀀스에서 관련된 부분을 찾으려고 하는 정보 벡터 (= Source)
    • 연관된 정도를 표현하는 가중치를 계산하는데 사용
    • 디코더의 현재 상태
  • Key
    • 관계의 연관도를 결정하기 위해 query와 비교하는데 사용되는 벡터 (= Target)
    • 연관된 정도를 표현하는 가중치를 계산하는 데 사용 (Query=Value)
    • 소스 문장의 인코더 표현
  • Value
    • 특정 Key에 해당하는 입력 시퀀스의 정보. 가중치를 구하는데 사용되는 벡터
    • 관계성을 표현하는 가중치 합이 최종 출력을 계산하는데 사용
    • 소스 문장의 인코더 표현

Key가 정확히 일치해야 Value를 가져오는 Dictionary와 달리, Query와 Key가 유사한 만큼 Value를 가져오게 된다.

 

5. Self-Attention

Encoder Self-Attention은 Encoder에서 수행

Masked Decoder Self-Attention, Encoder-Decoder Attention은 Decoder에서 수행

Encoder-Decoder Attention 에서 Query는 Decoder의 것, Key와 Value는 Encoder의 것을 사용 (≠ Self-attention)

 

Query = Key = Value

 

5.1. Q, K, V 얻기

각 단어 벡터들로부터 Q, K, V 벡터를 얻는 작업이 필요.

Dmodel이 512차원이지만 Q, K, V벡터는 64차원을 가지도록 변형한다.

512 / 64 = 8 (<- num_heads)

"student"라는 단어벡터에서 Q, K, V를 얻는 과정

각 가중치 행렬 (Wq, Wk, Wv)의 크기 

$$ d_{model} × (d_{model}\text{/num_heads}) $$

 

각각의 차원을 줄여서 병렬 연산에 적합한 구조를 만들려는 목적

 

5.2. Scaled dot-product Attention

Attention score = Query • Key (내적) 

내적을 하면 두 벡터간의 유사도 값을 얻게 되고 이것이 Q, K의 Attention score 이다.

내적을 사용하므로 내적 공식에 의해 A •B = ||A|| ||B||cosθ 이고,
코사인유사도 형태로 변경하면 cosθ = A •B / ||A|| ||B||  이고, 
코사인 유사도는 두 벡터가 유사할 수록 값이 1에 가깝고, 다를수록 -1에 가깝다.

위 코사인 유사도를 다른 의미로 표현하면 다음과 같다.

cosθ = A •B / ||A|| ||B||  = A •B / scaling = similarity(A, B)

(* ||A|| 는 L2norm 이므로 scaling 값이다)

(** 여기서 scaling 상수는 Key의 Dimension에 루트를 씌운 값으로 대체해서 쓴다.)

scale down 하는 이뉴는 추후 softmax 계산시 작은 값들이 매우 작아지는 현상을 막기 위함이다.

Scaled dot product Attention 값 최종

 

softmax 함수를 사용하여 Attention Distribution을 구함. 해당 결과를 V에 가중합을 하여 Attention Value를 얻음

Attention Value = Context Vector

 

6. Multi-head Attention

Scaled(=scaled down) dot-product Attention을 여러번(=h번; 8번) 학습시키는 것이 Multi-Head Attention이다.

각 단어마다 attention 매커니즘을 수행하므로 매 Attention 들은 다른 값을 가지게 된다.

이를 종합하기 위해 concatenate 한 후 Wo 를 행렬곱하여 Multi-head Attention matrix 를 구한다.

최종 output 은 input 과 dimenstion이 같아야 Multi layer 학습이 가능하다.

 

7. Residual Connection

Attention 메커니즘을 타지 않은 input 데이터를 메커니즘 이후 데이터와 결합한다.

f(x) 가 아닌 x+f(x) 를 사용

초기 학습 단계에서의 이벽을 그대로 전달하도록 하여 모델이 더 안정적으로 학습할 수 있는 효과가 있다.

이를 통해 출력값만 학습하는 것이 아닌 입/출력 간의 차이를 학습할 수 있다.

x 값을 활용하므로 정보 손실도 비교적 줄일 수 있다.

 

8. Position-wise FFNN

Position-wise Feed Forward Neural-Network

FFNN(x) = MAX(0, xW1 + b1)W2 + b2

 

 

 

 

9. Masked Multi-Head Attention

Decoder는 생성모델이므로 예측이 필요한 데이터를 미리 알고 있지 않아야 한다. (미리 알게 되는 것을 cheating 이라 한다.)

(* Self attention 에서도 <PAD> 부분은 -INF로 변경을 한다. 무의미한 부분은 모두 -INF로 변형하여 Softmax 이후의 가중치를 주지 않는다.)

트랜스포머 Attention 구조는 한번에 데이터가 입력되는 구조이므로 미래 데이터가 없는 것처럼 만들어 줘야 한다.

모든값이 확률 값이므로 가장 작은 확률을 위해 -INF 에 해당하는 값을 Masking 할 곳에 넣어준다.

 

-INF로 된 값은 Softmax 이후 weight를 0으로 변경이 된다.

 

10. Encoder-Decoder Attention

Decoder 내의 Multi-head Attention 에서는 Q를 Decoder내 Masked Multi-head attention에서 받고, K와 V를 Encoder의 출력으로부터 받게 된다.

인코더의 출력은 전체 input 시퀀스에 대한 포괄적인 표현을 담고 있고, 이를 통해 디코더에서 생성된 Q와 상호작용하여 다음 단어 예측에 필요한 정보를 추출한다.

즉, 디코더는 입력시퀀스 전체에 대한 맥락(=K, V)을 바탕으로 예측을 수행한다.

 

반응형