카테고리 없음

[논문] Attention Is All You Need (2017) - 2

yennle 2024. 11. 23. 20:41
728x90

 

 

3.1. Encoder and Decoder Stacks

 

- 인코더

6개의 동일한 층으로 구성. 각 층은 2개의 서브층을 가짐

서브층은 multi-head self-attention mechanismpositionwise fully connected feed-forward network로 구성

서브층 각각에 잔차 연결 residual connection 후, 정규화 진행

=> 서브층의 아웃풋은 $LayerNorm(x+Sublayer(x))$

더보기

잔차연결이 $x+Sublayer(x)$, 정규화가 $LayerNorm()$ 인듯 함. $Sublayer(x)$는 주황, 파랑이

 

* positionwise : 위치별, 개별 위치에 대해 독립적으로. 입력 시퀀스의 각 위치에서 독립적으로 작동하는 연산

* feed-forward network : 인공 신경망의 일종. 입력부터 출력을 향해 한 방향으로만 신호가 흐르는 구조

 

논문 뒤에서 position-wise feed-forward network도 다룰 예정

 

잔차연결을 쉽게 할 수 있도록 임베딩과 모델의 모든 서브층의 출력차원은 $d_{model}=512$

 

 

 

- 디코더

6개의 동일한 층으로 구성. 각 층은 3개의 서브층을 가짐

인코더와 동일한 서브층 + 인코더 스택의 아웃풋에 대해 multi-head attention을 수행하는 3번째 서브층

각 서브층에 잔차 연결과 정규화 진행

 

self-attention 서브층을 수정해 다음 위치를 참조하지 못하도록 수정 => Masked Multi-Head Attention

출력을 한 위치만큼 오른쪽으로 오프셋(shifted right)시켜 임베딩 후에 어텐션에 입력

말이 어려워보이지만 $i-1$시점에서의 출력값을 $i$의 인풋과 함께 디코더에 넣는다는 의미

 

 

 


 

3.2. Attention 

 

어텐션 함수는 쿼리와 키-값 쌍을 출력으로 매핑하는 함수

출력값은 가중합으로 계산되며, 각 값에 부여되는 가중치는 상응하는 키와 쿼리의 호환성 함수로 계산됨.

* 쿼리, 키, 값은 모두 벡터

 

 

 

 

 

3.2.1. Scaled Dot-Product Attention

입력값은  $d_k$차원의 쿼리와 키, $d_u$차원의 값으로 구성

 

모든 키와 쿼리의 내적을 계산하고, $\sqrt{d_k}$로 각각을 나눔.

그리고 값에 대한 가중치를 얻기 위해 소프트 맥스 함수 적용

 

Q : 쿼리집합, K 키 행렬, V : 값 행렬

$$ Attention(Q, K, V) = softmax(\dfrac{QK^T}{\sqrt {d_k}})V $$

 

 

 

 

가장 일반적으로 사용되는 2개의 어텐션 함수

 

- addtive attention 가산적 어텐션

단일 은닉층으로 feed-forward network를 사용하면서 호환성 함수를 계산

 

$h_i$는 $t$시점에서 인코더의 은닉상태, $s_{t-1}$은 $t-1$시점에서 디코더의 은닉상태, $W$는 가중치

$$score(s_{t-1}, h_i) = W^T_atanh(W_bs_{t-1}+W_ch_i)$$

 

 

- dot-product(multiplicative) attention 내적(곱셈) 어텐션

3.2.1의 수식에서 $\dfrac {1}{\sqrt {d_k}}$를 곱하지 않은 것

 

=> 두 어텐션 함수 모두 이론적 복잡성 측면에서 유사하나,

내적 어텐션의 경우, 최적화된 행렬 곱셈 코드를 사용할 수 있어 훨씬 빠르고 공간 효율적

torch.matmul 과같은 함수를 말하는 걸까요?

 

 

$d_k$의 값이 작을 때는 두 매커니즘이 비슷하게 작동.

그러나, 큰 값을 가질 땐 가산적 어텐션이 더 좋은 결과를 낸다.

 

논문에서는 이 이유를 $d_k$가 커질 때 내적의 값이 커지면서

소프트 맥스 함수를 적용했을 때의 그래디언트가 매우 작은 값을 가지기 때문이라고 판단

=> 내적의 값을 $\dfrac {1}{\sqrt {d_k}}$로 스케일링!

 

 

 

 

3.2.2. Multi-Head Attention

Multi-Head Attention의 그림을 식으로 표현하면 다음과 같다.

 

\begin{align}
MultiHead(Q, K, V) &= Concat(head_1, \cdots, head_h)W^O \\

where\; head_i &= Attention(QW_i^Q, KW_i^K, VW_i^V)
\end{align}

 

$W_i^Q \in \mathbb{R}^{d_{model}\times d_k}, W_i^K \in \mathbb{R}^{d_{model}\times d_k}, W_i^V \in \mathbb{R}^{d_{model}\times d_v} \; and \; W_i^O \in \mathbb{R}^{hd_v\times d_{model}}$

 

$d_k, d_k, d_u$ 차원으로 학습된 선형 투영을 $h$번 진행

=> $ QW_i^Q, KW_i^K, VW_i^V $

 

투영된 버전의 쿼리, 키, 값에 어텐션 함수를 병렬적으로 수행해 $d_u$ 차원의 출력값 생성

=> $ Attention(QW_i^Q, KW_i^K, VW_i^V) $

 

이 출력값들이 결합되고, 한 번 더 투영돼 최종값 리턴

=> $Concat(head_1, \cdots, head_h)W^O$

 

 

논문에서는 $h=8$의 병렬 어텐션 레이어(또는 헤드)를 사용했다.

$d_k = d_v = d_{model}/h = 64$

헤드의 차원이 축소되었기 때문에 총 연산 비용은 단일 헤드 어텐션을 전체 차원에서 계산할 때와 비슷하다.

 

 

 

 

 

3.2.3. Applications of Attention in our Model

트랜스포머는 3가지 방식으로 mutil-head attention을 사용한다.

 

 

 

- encoder-decoder attention 인코더-디코더 어텐션

쿼리는 이전 디코더 층에서 나오며, 메모리 키와 값은 인코더 출력값으로부터 나온다.

이렇게 하면 디코더의 모든 위치가 입력 시퀀스의 모든 위치를 참조할 수 있다.

seq2seq 모델의 전형적인 인코더 디코더 어텐션 메커니즘 모방

 

- 인코더의 self-attention

셀프 어텐션 층의 키, 값, 쿼리는 모두 같은 곳에서 나온다.

input embedding과 positional encoding이 행해지는 층의 출력값이다.

인코더의 각 위치는 인코더의 이전 층의 모든 위치 참조 가능

 

- 디코더의 self-attention

인코더와 유사하게, 디코더의 각 위치가 디코더의 모든 위치 참조 가능

자동 회귀(auto-regressive) 특성을 유지하기 위해 정보가 왼쪽으로 흐르는 것을 방지하고자 함.

=> 소프트맥스의 입력값 중 *불법적인 연결에 상응하는 값을 $ - \infty $로 마킹

*불법적인 연결 : 미래의 위치에 대한 정보를 가진

출처 : https://wikidocs.net/31379

 

 

 

 

 

 

 

 

[참고]

https://arxiv.org/abs/1706.03762

https://wikidocs.net/31695

https://tech.kakaoenterprise.com/45

https://wikidocs.net/228835

https://wikidocs.net/137253

https://tunz.kr/post/4

 

 

 

 

728x90