쉬엄쉬엄블로그

(NLP) Transformer - 1 본문

부스트캠프 AI Tech 4기

(NLP) Transformer - 1

쉬엄쉬엄블로그 2023. 7. 4. 12:15
728x90

이 색깔은 주석이라 무시하셔도 됩니다.

Transformer

Transformer : High-level view

Attention is all you need, NeurIPS’17

  • No more RNN or CNN modules
    • Transformer의 등장

Attention Is All You Need, NeurIPS’17 (http://jalammar.github.io/illustrated-transformer/)

RNN : Long-Term Dependency

  • layer를 통과할수록 정보가 유실되는 문제 발생

Bi-Directional RNNs

  • layer를 통과할수록 정보가 유실되는 문제를 개선하기 위해 Forward, Backward RNN을 둬서 양방향으로 계산을 하고 문제를 개선함

Transformer : Long-Term Dependency

http://jalammar.github.io/illustrated transformer/

  • Key
    • 인코더 hidden state
    • 인코더가 각 단어(토큰)마다 이해한 내용
  • Query
    • 디코더 hidden state
    • 디코더가 지금까지 문장을 생성하면서 정리해온 내용
    • 디코더가 특정 단어(토큰)를 번역해야할 시점이라고 가정할 때, 그 전까지 정리해온 내용들을 가져온다고 생각
  • Value
    • Query와 Key를 이용해서(dot product 연산) 유사도 score를 구한 후, softmax를 취한 값에 다시 Key 벡터를 곱한 값
    • Key별로 하나씩 있어서 value라고 부름
      • dictionary와 비슷
    • Query 벡터와 Key 벡터의 내적을 구할 때 두 벡터의 사이즈가 다르기 때문에 한 벡터를 transpose하여 사이즈를 맞춰주고 내적을 계산
  • context vector
    • Value 값들을 모두 더하여 context vector를 만듬
  • 유사도를 구하기 위해서 dot product 연산을 하는 이유는 무엇인가?
    • dot product(내적)을 한다는 것은 한 벡터를 다른 벡터에 정사영한 것의 길이를 곱하는 것
    • ⇒ Query 벡터에 Key 벡터를 정사영하여 둘의 길이를 곱하는 것
    • 비슷한 방향과 비슷한 크기를 가진 벡터는 내적 값이 커지기 때문에 유사도를 계산하는 연산으로 사용할 수 있음
  • query 벡터에 의한(내적에 의한) 유사도만 높다면 time step의 차이가 크다고 하더라도 멀리 있었던 정보를 손쉽게 가져올 수 있음
    • Long-Term Dependency 한계점을 근본적으로 개선함
  • 트랜스포머에서 제안된 self-attention 모듈은 동일한 set의 벡터에서 출발했다고 해도 각 역할에 따라 벡터가 서로 다른 형태로 변환할 수 있도록 해주는 별도의 linear transformation matrix가 적용됨
    • 주어진 벡터가 Query, Key, Value로 사용될 때 적용되는 선형 변환 행렬이 각각 $W^Q,W^K,W^V$로 정의되어 있음
  • 같은 벡터 내에서 3가지 역할이 모두 공유되는 제한적인 형태가 아니라 같은 벡터라도 Query로 쓰일 때, Key로 쓰일 때, Value로 쓰일 때 서로 다른 벡터로 변환될 수 있는 확장된 형태가 만들어지게 됨

Transformer : Scaled Dot-Product Attention

  • Inputs : a query $q$ and a set of key-value ($k$, $v$) pairs to an output

    • 입력 : query 벡터 $q$와 출력에 대한 key-value 벡터 $k,v$ 쌍의 집합
  • Query, key, value, and output is all vectors

    • query, key, value, 출력 모두 벡터로 구성
  • Output is weighted sum of values

    • 출력은 가중치가 적용된 value 값들의 합
  • Weight of each value is computed by an inner product of query and corresponding key

    • 각 값의 가중치는 query와 해당 key의 내적으로 계산됨
  • Queries and keys have same dimensionality $d_k$, and dimensionality of value is $d_v$

    • query와 key들은 같은 차원 $d_k$를 가지고 value는 $d_v$ 차원을 가짐
    • $A(q,K,V) = \sum_i \frac{\exp(q \cdot k_i)}{\sum_j \exp(q \cdot k_j)} v_i$
  • When we have multiple queries q, we can stack them in a matrix $Q$

    • query가 여러 개 있을 때 그 query들을 쌓아서 행렬 $Q$로 표현할 수 있음

  • Example from illustrated transformer

    http://jalammar.github.io/illustrated transformer/

  • Problem

    • As $d_k$ gets large, the variance of $q^Tk$ increases
      • $d_k$(key의 차원)이 커지면, $q^Tk$(query 벡터와 key 벡터의 내적 결과 값의 차원)도 증가함
      • query와 key 벡터의 차원에 따라 내적 값의 분산이 크게 좌지우지 됨
      • 이에 따라 softmax로부터 나오는 확률분포가 어떤 한 key에만 높은 확률이 나오거나 전반적으로 모든 key의 확률이 비슷하게 나올 수 있음
      • 즉, softmax의 확률 분포가 query, key 벡터의 차원때문에 의도치않게 영향을 받을 수 있음
      • 그래서 내적 값의 분산을 일정하게 유지시켜줌으로써 학습을 안정화 시켜주기 위해 계산된 내적 값에 $\sqrt {d_k}$(루트 query, key의 차원)만큼 나눠주는 연산을 추가해줌
      • 그러면 query, key 벡터의 차원에 상관없이 분산이 일정하게 1인 형태로 유지됨
    • Some values inside the softmax get large
      • softmax 내부의 값들이 커짐
    • The softmax gets very peaked
      • softmax 값이 정점에 이르게 됨
    • Hence, its gradient gets samller
      • 따라서 gradient가 작아짐

  • Solution
    • Scaled by the length of query / key vectors
      • $A(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V$
      • $\sqrt {d_k}$로 나눠주면 $Q, K$의 dimension에 관계없이 $QK^T$값의 분산이 일정하게 1인 형태로 유지되는 값이 됨
      • softmax의 값이 한 쪽으로 굉장히 몰리게 되는 상황에서 학습을 진행할 때 gradient vanishing이 발생할 위험이 있기 때문에 query, key 벡터의 차원을 크게 설정하고 scaling없이 attention 모듈을 수행하면 종종 학습이 전혀 되지 않는 경우가 발생할 수 있음
      • softmax의 출력을 적절한 정도의 범위로 조절하는 것이 학습에도 중요한 역할을 함

출처: 부스트캠프 AI Tech 4기(NAVER Connect Foundation)

Comments