Deep Learning/트랜스포머를 활용한 자연어 처리

[Chapter 3] 트랜스포머

notty 2024. 5. 22. 18:56
728x90

트랜스포머

  • 인코더-디코더의 구조를 가지며 어탠션 매커니즘을 적용
  • 기존의 RNN기반의 seq2seq의 한계
    • decoder hidden state에서 인코더에서 도출된 하나의 context vector를 사용하여 디코딩 하여 앞선 정보는 적게 반영됨
    • 순차적으로 전달되어야해서 병렬화 불가능
  • RNN기반의 seq2seq에서 어탠션 매커니즘만을 사용하여 구현하였음

 

**어탠션 메커니즘**

이전에는 디코더의 각 시점에 인코더에서 도출된 하나의 context vector를 사용하였음 (오래된 정보 소실)

하지만 디코더의 각 시점에 인코더의 모든 정보에 대해서 가중치를 다르게 하여 참고한다. 

  • 현 시점 디코더의 hidden state(Q)와 인코더의 모든 정보(K)에 대해 유사도 계산 (dot product)
  • 계산된 유사도를 softmax로 합이 1이 되도록 변환
  • Key에 대응되는 Value의 가중합 계산

트랜스포머 전체 구조

입력 (input / output)

 

(Input/Output) Embeding

  • 토크나이저 적용(토큰별 정수 할당) -> 참고할 단어사전을 적용, 임베딩 차원을 지정
  • 입력 text : time flies like an arrow
  • 사전훈련된 임베딩 사용시 config.vocab_size, config.hidden_size로 불러온다
  • seq = 5 (입력 text 단어의 갯수)
  • d_model = 768 (hidden_size)
  • vocab_size (단어사전에 포함된 단어의 갯수)

 

(Input / Output) Positional Encoding

 

  • 순환신경망을 사용하지 않기 때문에 위치에 대한 정보가 포함되어야 한다. 
  • i : 원소의 위치 (홀수자리 : cos, 짝수자리 : sin)
  • pos : 문장 토큰 위치
  • positional encoding을 진행한 tensor와 input embeding tensor의 element-wise addition을 수행하여 위치정보를 추가

Encoder

 

Multi-head attention

  • Queries (Q): 입력 시퀀스의 각 단어에 대한 쿼리 벡터
  • Keys (K): 입력 시퀀스의 각 단어에 대한 키 벡터
  • Values (V): 입력 시퀀스의 각 단어에 대한 값 벡터
  • size가 (seq, d_model)인 인코더 입력에 대하여 h개로 나누어 각각에 대해 scaled dot-product attention을 수행한 후 h개의 attention matrix를 concatenate 하여 선형 변환한다
  • h개로 나누어 독립적으로 수행 후 concatenate하여 병렬적 처리가 가능하다입력 size와 최종 출력 size는 동일하다

* d_model : embedding시 적용한 차원 (여기에서는 768)

* seq : 입력 문장 내 단어(토큰)의 갯수

* h : d_model을 나눌 갯수

 

Add & Norm 

  • skip connection (스킵연결): 처리하지 않은 텐서를 모델의 다음 층으로 전달한다 (x + Sublayer(x))
  • layer normalization (층 정규화) : 배치에 있는 각 입력을 평균이 0이고 분산이 1이 되도록 정규화
  • 사전 층 정규화 / 사후 층 정규화
    • 사전 층 정규화 (보통 많이 사용) : layer norm -> multi head attention -> skip connection
    • 사후 층 정규화 (Attention is all you need 에 사용됨) : multi head attention -> skip connection -> layer norm
      • "학습률 웜업"이 필요

 

Feed Forward

  • input = output = 512
  • hidden = 2048
  • GeLU 활성화 함수를 사용
    • dropout, zoneout, ReLU 를 결합
      - dropout : 랜덤으로 뉴런 비활성화
      - zoneout : RNN계열에서 랜덤으로 이전의 타임 스탬프를 유지
      - RELU : 입력 값이 0보다 작으면 출력을 0으로 하고, 0보다 크면 입력 값을 그대로 출력
    • Gaussian Error Linear Unit, Gaussian 분포의 오류 함수(erf)를 사용한 활성화 함수
    • 입력 값의 전체 분포를 반영하여 비선형성을 추가
    • 는 표준 정규 분포의 누적 분포 함수(CDF) 이를 통해 x가 양수일 확률을 계산

Decoder

 

Masked Multi head attention

  •  Encoder의 multihead attention처럼 Q, K, V 연산을 진행한 후 현 시점보다 미래의 값에 대해서 masking을 진행한다.
  • Masking 방법 : 미래의 요소들에 대해 -inf 값을 넣고 softmax함수를 적영시키면 -inf가 0으로 나오고 각 행의 합은 1

 

Add & Norm

 

Multi head attention (Multi head cross attention)

  • Queries (Q): 디코더 입력 시퀀스의 각 단어에 대한 쿼리 벡터
  • Keys (K): 인코더 출력 시퀀스의 각 단어에 대한 키 벡터
  • Values (V): 인코더 출력 시퀀스의 각 단어에 대한 값 벡터
  • Multi head attention과 동일한 방법으로 연산을 수행하지만 이때 Q는 디코더의 입력에서, K, V는 인코더에서 받아온다

 

Add & Norm

 

FFNN

 

Add & Norm

 

출력

  • (Linear) size가 (seq, d_model)을 선형변환(Linear)을 통과시켜 (seq, vocab_size)로 변환한다
  • (Softmax) softmax를 적용하여 해당 seq에서 가장 확률이 높은 값을 출력으로 한다
  • Linear 적용 후에는 행이 입력되었던 토큰이고 열이 임베딩했던 단어 사전의 크기라고 생각하면 번역하는 경우에 각 행에서 가장 높은 확률을 가지는 열에 해당하는 단어가 출력이 된다

참고

Attention is all you need

트랜스포머를 활용한 자연어 처리

728x90
반응형

'Deep Learning > 트랜스포머를 활용한 자연어 처리' 카테고리의 다른 글

[chapter 6] 요약  (0) 2024.06.22
[Chapter 5] 텍스트 생성  (0) 2024.06.19
[Chapter 4] NER  (1) 2024.06.01
[Chapter 3] 코드_1  (0) 2024.05.17