Attention 정리

Kiwoong Park·2024년 3월 6일

attention 네트워크

내적(inner product)

  • 벡터와 벡터 간의 닮은 정도를 보는 것

C4 = S4,

Transformer
: attention 기반의 encoder-decoder 알고리즘

  • 순환신경망 기반의 방법X
    순환신경망을 하나도 사용하지 않음.
    Attention is all you need ~ 순환신경망은 필요하지 않음.
  • BERT
  • GPT
  • BART

Attention

  • Why was it proposed?
    . 순환신경망 기반의 seq2seq 모형이 갖는 문제점을 보완하기 위함
    . 순환신경망 기반의 seq2seq의 주요한 문제점?
    • 입력된 sequence data에 대해서 하나의 고정된 벡터 정보
      (마지막 hidden state)만을 decoder로 전달한다는 것
      -> 그렇게 되면 입력된 모든 단어들의 정보가 제대로 전달되지 못한다는 문제 발생
      특히, 입력된 단어가 많은 경우 앞쪽에서 입력된 단어들의 정보는 전달이 거의 안되는 문제 발생
    • Ex. 오늘은 / 금요일 / 입니다 -> 입니다가 가장 중요해짐

. 그렇다면 어떻게 하면 되는가?

  • Encoder 부분에서 생성되는 각 단어에 대한 hidden state 정보를 모두 decoder로 전달

  • 만약 hidden state vector가 5차원이면 3개의 단어에 대한 hidden state vector는 3x5차원

  • 예: 오늘은 수요일 입니다 => Today is Wednesday 로 번역하는 경우
    . Wednesday를 예측하기 위해 수요일에 해당하는 hidden state vector h1에 더 가중치를 줌
    . 즉, 디코더 부분에서 예측하고자 하는 단어와 더 관련이 높은 인코더의 입력 단어와 매칭되는 hidden state vector에 더 가중치를 준다!
    . 가중치의 합은 1이 되도록 weight 를 줌 ~ Ex. h0의 w0: 0.1 / h1의 w1: 0.8 / h2의 w2: 0.1

  • Attention 층에서 출력되는 값은? : 위의 결과 벡터들을 더한 벡터
    h0xw0+h1xw1+h2xw2 :

  • 가중치의 계산
    . 유사도를 구하기 위한 방법 ~ 내적, 유클리디안 거리, 등등
    . 내적이 속도가 훨씬 빠름
    . 가중치는 hs의 각 hidden state와 decoder에 예측하고자 하는 단어에 대한
    hidden state와의 유사도를 가지고 계산
    . decoder 부분의 첫번째 RNN층에서 출력되는 'Today' 단어를
    예측하는데 사용되는 hidden state => hd,0
    . h0, h1, h2와 hd,0과의 내적 연산
    -> 이 값들을 attention score라고 함 -> 값이 클수록 관련도가 크다!
    . Attention score를 가지고 가중치를 계산
    . 가중치는 확률값으로 표현
    . 확률값을 계산하기 위해서 attention score에 softmax()를 적용

    • e^5(e^5+e^3+e^3) ~ 0.8
  • 최종적으로 출력되는 값
    . Attention에서 출력되는 값과 RNN 층에서 출력되는 값 간의 이어붙이기(concatenation)
    . 즉, Concat((1.0 0.1 0 0.9 1.8),(1 0 0 0 2)) = (wxh, hd,0)

seq2seq 구조의 단점

  • 병렬화 문제
  • Long Distance Dependency 문제

왜 소프트맥스 함수를 사용하여 확률로 해석?
: 단순히 모든 출력값을 더해서 각 원소에 나눠주면 각 값들에 대한 확률로 해석할 수 있지 않나?

  1. 벡터의 원소값이 음수인 경우를 다룰 수 없다..
  • 딥러닝 연산에는 벡터의 값이 음수가 포함될 수 있으므로 확률값이 음수가 되는 경우를 방지
  1. 숫자의 크기가 다르면 비율이 일정하더라도 확률이 크게 차이난다.
    . softmax는 등장한 값에 대한 비율만을 고려하는 것이 아니라 값의 크기까지 고려한다.
    동일한 비율로 등장하더라도 더 많은 횟수로 예측되었다면 등장할 확률을 높게 계산함
    . 단점 : 값이 지수함수적으로 변하다 보니 너무 커지는 바람에 overflow 문제가 자주 발생

  2. 자연로그를 사용하는 주요 손실함수
    . cross-entropy함수를 비롯한 다양한 함수에서 확률 값에 log를 취한 값 logpi를 사용
    여기에 exp 함수를 취해주면 확률값 자체만을 가져올 수 있는 효과를 줌
    이런 경우 softmax는 최대 가능도를 추정하도록 학습함

boltzmann factor = e^-{E(s)/kT}
E(s) : 어떤 상태 s일 때 입자의 에너지
k : 볼츠만 상수
T : 열평형 상태에서의 온도

어떤 상태 s에서 에너지 E(s)를 가지는 입자를 발견할 확률
P(s) = 1/Ze^-{E(s)/kT}

P(s) = e^-{E(s)/kT} / \sum e^-{E(s)/kT}

=> 이 식은 온도 T인 열평형 계에서 상태 s에 있는 입자를 발견할 확률을 의미함.

많은 과학 분야에서 사용되다가 1959년 Robert Duncan Luce
자신의 책 : Individual Choice Behavior: A Theoretical Analysis
기계학습에서 소프트맥스로 알려진 위 식을 사용할 것을 제안
1989년 Hohn S. Bridle은 비선형성 네트워크 출력을 확률로 처리하고자 소프트맥스 사용을 제안


지금까지 설명한 어텐션: encoder-decorder attention

. self-attention은 입력된 텍스트 데이터 내에 존재하는 단어들간의 관계를 파악하기 위해 사용

  • 관련이 높은 단어에 더 많은 가중치를 주기 위해 사용
    . 지시대명사가 무엇을 의미하는지 등을 파악하는데 유용
    . Example
  • 입력 데이터 : The cat likes a ball, It has a long tail.
  • 이러한 경우, 입력된 데이터 내에 존재하는 다른 단어들하고의 관계를
    파악할 수 있다면, it이 cat이라는 단어와 관련이 높다는 것을 알 수 있다.
  • 그렇다면 it을 예측하는데 있어서는 cat에 더 많은 가중치를 주자

Self-attention
Simple example

  • 입력 sequence = 'Today is Monday'
  • 각 단어에 대한 embedding vector(가정)
    [e0;e1;e2] = [1 0 0 1 1; 1 0 0 1 0; 1 1 0 0 1]
  • 예: 'Monday'에 대한 self-attention 결과를 얻고자 하는 겨웅
  • 순서 (앞에서 설명한 attention 과 유사)
    . Attention score 계산 => 'Monday'에 대한 embedding vector와
    다른 단어들의 벡터들(자기 자신포함)간의 내적 연산
    . 가중치의 값 계산 => Attention score를 softmax()에 적용해서 계산
    . 각 단어의 embedding vector에 가중치를 곱한 후, 더해서 self-attention의 결과값 도출

Transformer에서의 self-attention( or attention)

  • 앞의 예에서는 입력된 단어들의 임베딩 정보를 그대로 사용하여 attention score와 가중치를 구한다고 설명
  • Transformer의 self-attention은 입력 받은 단어들 중에서 어떠한
    단어에 더 많은 가중치를 줘야 하는지 파악하기 위해서
    각 단어들에 대한 Query, Key, Value라고 하는 서로 다른 3개의 벡터들을 사용
    • Key, Value 벡터들은 사전 형태의 데이터 의미 : key는 단어의 id와 같은 역할,
      value는 해당 단어에 대한 구체적 정보를 저장하는 역할을 한다고 생각
    • Query 벡터는 유사한 다른 단어를 찾을 때 사용되는 (질의) 벡터라고 생각 가능

작동 순서

  • 단계1: 입력된 각 단어들에 대해서 Query, Key, Value 벡터를 계산
    • 이때 각각의 가중치 행렬이 사용됨
  • 단계2: Attention score 계산
    • Query를 이용해서 각 Key들하고의 유사한 정도를 계산 : 내적 연산
  • 단계3: Attention score를 이용하여 가중치 계산
    • softmax() 함수를 적용
  • 단계4: 가중치를 value 벡터에 곱함
  • 최종 결과물
    • 가중치가 곱해진 value vector들의 합

Query, Key, Value 벡터 구하기

  • 별도의 가중치 행렬 (weights matrix)을 사용
  • 입력된 각 단어의 임베딩 벡터와 가중치 행렬의 곱을 통해 Q, K, V 벡터를 구함.
  • Example
    . Embedding vector size = 5
    . Q, K, V vector size = 3인 경우
    . 각 가중치 행렬의 크기는?
    Query 가중치 행렬 : 5 x 3
    Key 가중치 행렬 : 5 x 3
    Value 가중치 행렬 : 5 x 3

Today = (1 0 0 1 1), is = (1 0 0 1 0), Monday = (1 1 0 0 1)
Today에 대해서 Attention 작업을 수행하는 경우
Query 가중치 행렬 : 5 x 3 형태로 가중치 행렬 생성 후 초기화(랜덤)
Today embedding vector x Query 가중치 행렬 = (2 0 2)

Key 가중치 행렬
단어 1에 대한 Query 벡터 : (2 0 2)
단어 1에 대한 Key 벡터 : (3 2 1)
단어 2에 대한 Key 벡터 : (2 2 0)
단어 3에 대한 Key 벡터 : (2 1 2)
내적 연산

  • 8
  • 4
  • 8

softmax 적용
softmax(8 4 8) = (0.5 0 0.5)

  • Value vectors에 가중치 곱하기
    단어1의 value 벡터 : (1 2 2)
    단어2의 value 벡터 : (1 1 1)
    단어3의 value 벡터 : (1 2 2)

0.5 x (1 2 2) = (0.5 1 1)
..

최종 결과물: 각 벡터의 합

  • (0.5 1 1) + (0 0 0) + (0.5 1 1) = (1 2 2)
    동일한 작업을 단어 2, 3에 대해서 수행

Attention(Q,K,V) = Softmax(QK^T)V
Softmax(QK^T) = 가중치

profile
You matter, never give up

0개의 댓글