summ의 블로그

자연어처리 (6) transformer 본문

자연어처리

자연어처리 (6) transformer

summ._ 2024. 11. 9. 21:00

 

부스트코스 자연어 처리의 모든 것 

Transformer 

 

https://www.boostcourse.org/ai330/lecture/1455763?isDesc=false

 

자연어 처리의 모든 것

부스트코스 무료 강의

www.boostcourse.org

 

 

" Attention is all you need "

 

attention 으로만 구현한 인코더 디코더 구조의 모델 

   

RNN의 문제점 

 

Long-term dependency

  • 인코더는 입력 시퀀스를 처리하면서 각 시점마다 hidden state를 업데이트하고
  • 최종적으로 마지막 시점의 hidden state가 context vector로 사용
  • 전체 입력 시퀀스의 정보를 요약한 것으로, 디코더가 이를 이용해 출력을 생성 
  • 단어의 위치에 따라 순차적으로 입력받아 처리하기에 각 단어의 위치 정보를 가질 수 있음 
  • 문장이 길어질수록 앞에 있는 단어에 대한 정보 유실이 존재함

 

해결책

 

1. bi-directional RNNs

 

forward backward RNN 을 각각 만든 다음, 해당 hidden state vector를 concatenate하여 2배로 만든다. 

 

--------->         <----------

forward          backward 

I go home.     I go home. 

 

go 에대해 forward 는 I 를 담고 

                 backward는 home 을 담음

 

단일 RNN보다 정보를 잘 반영함 

 

 

2. Transformer 

 

 

기본 구조 

 

인코더 - 디코더 형태 

 

입력 시퀀스를 인코더가 처리하고 이를 기반으로 디코더가 출력 시퀀스를 생성함 

 

인코더 

  • input: 원문
  • 각 인코더는 multi-head self-attention, 피드포워드 신경망으로 이루어진 서브층의 반복 블록 구조  
    • multi-head attention (self-attention): 입력 단어들이 서로 관계를 고려하여 가중치를 계산하고 연결되어 있음
    • feedforwad: 각 위치의 출력 벡터에 대해 독립적으로 작동하며, 동일한 네트워크가 모든 단어에 적용
  • 최종 output 
    • 각 단어의 워드 임베딩 벡터는 인코더의 마지막 단까지 독립적으로 유지됨
    • 디코더의 multihead attention 으로 연결됨
  • self attention 출력은 자신에게 영향을 미치는 단어들의 정보가 결합되어 있음  
  • 주어진 쿼리에 대해서 모든 키와의 유사도를 각각 구함
  • 유사도가 반영된 벨류를 모두 가중합하여 리턴

 

 

디코더 

  • input: 현재까지 생성된 단어의 시퀀스
  • 각 디코더는 multi-head self-attention, 피드포워드 신경망으로 이루어진 서브층의 반복 블록 구조  
  • 최종 output은 분류기에서 다음 단어의 예측에 사용됨  

 

 

 

self attention 의 원리 

 

각 입력 vector가 가중치 행렬을 이용해 3가지 벡터 양상을 가짐 (qeury, key, value) 

 

why? 

나에게 영향을 미치는 단어들의 정보를 모아서 내 인코딩 벡터에 반영하고 싶음

 

입력 시퀀스 내의 각 벡터가 다른 벡터들과 관계를 평가하고 가중치를 할당함

 

W_Q, W_K, W_V: 학습이 가능한 가중치 행렬

X: input vector 

Query:

  • 입력된 각 벡터가 다른 벡터들과의 관계에서 중요한지를 판단할 때,
  • 어느 vector를 가져올지를 기준으로 사용하는 벡터 
  • "내가 어떤 정보를 찾고 있는가?"

Key:

  • Query 벡터가 다른 벡터들과의 유사도를 비교할 때, 각 key vector와 유사도를 계산하는 기준이 되는 벡터
  • "각 벡터가 갖는 특징을 요약한 벡터"

Value:

  • Query, Key의 내적으로 산출된 점수에 softmax를 취해 가중치가 적용되는 정보 vector
  • "최종 어텐션 벡터를 만들 때 사용되는 실제 정보"  

 

동작 원리 

  • 입력 벡터 X는 W_Q, W_K, W_V 가중치 행렬에 의해 query, key, value vector로 변환
  • query vector 와 key vector 간 내적을 수행하여 유사도 계산
  • 계산한 유사도를 softmax함수를 적용해 확률 분포 형태로 변환하여 가중치로 사용 
  • 가중치를 value vector에 곱하고 합산하여 최종 self-attention output vector 만듦 

 

 

 

 

 

 

 

어텐션 계산

 

q, K, V 를 입력으로 받아 i에 대한 합 계산 

 

쿼리의 행렬 Q를 이용하여 표현 

Q 와 K 전치행렬 내적계산 후 softmax를 취해 나온 가중치 값을 V에 곱하여 어텐션 벡터를 생성한다. 

 

 

 

이때 ! 

 

scaled 된 내적 사용 

 

과정: 

찾고자 하는 정보를 갖는 vector 내적 수행 -> 유사도 계산 -> softmax를 취해 가중치의 가중합 -> 가중 평균 동일

 

(문제점 발생)

유사도 계산에서 자기 자신에 대한 내적을 계산하면 자기 자신에 대한 가중치가 제일 크다.

Query 와 key의 내적 결과값이 벡터 차원이 커지면 값이 커짐 

 

이러한 결과는 특정 벡터에 너무 집중되거나, 확률 분포를 왜곡시킴

 

방지하기 위해 scaled dot-product attention 사용

 

QK를 내적한 다음, d_k의 루트로 나눠주고 softmax를 취해줌

(내적 값을 벡터 차원의 제곱근으로 나누어 줌)

 

  

표준편차로 나눔 : scaling

  분산이 1로 유지되어 입력 벡터의 차원 수가 증가해도 내적 계산이 과도하게 커지는 것을 방지함

  안정된 확률 분포를 유지해 최종 가중합을 구할 때 균형 잡힌 출력 값을 가짐 

 

 

multi-head attention 

 

<< 기존의 어텐션 매커니즘을 확장한 구조 >>

 

여러 개의 attention 매커니즘(헤드)을 병렬로 사용하는 것

Q, K, V 에 대해 각각 선형변환을 하고

각각의 헤드로부터의 결과를 concat 하고, 선형변환을 통해 전체 인코딩 벡터를 얻음 

 

계산 과정 

  • 입력벡터에 대해 Q,K,V 생성
  • 각 헤드는 scaled 내적 attention을 계산해 서로 다른 벡터 출력 생성
  • 모든 헤드에서 나온 결과 벡터를 concat해 큰 벡터 형성 
  • 다시 선형 변환을 해 최종 출력 벡터로 변환 

 

헤드가 8개, 어텐션 결과 벡터가 차원이 3인 벡터라면

결과를 concat : 총 24개의 차원인 결과벡터를 선형변환하여 원하는 차원의 출력 벡터로 변환  

입력으로 들어오는 입력값의 길이에 따라 메모리와 연산량에 영향을 받음  

 

단일 어텐션을 병렬로 조합하여 성능을 향상

 

 

 

 

 

block-based 모델

 

 

Transformer의 전체 구조나 컴퓨팅 방식에 관한 설계. 블록 단위로 구성하여 반복하는 방식으로 트랜스포머 확장

 

각 인코더와 디코더는 블록 단위로 구성됨 

 

하나의 블록 안에 멀티 헤드 어텐션, 피드포워드, 잔차 연결, 레이어 정규화 등 여러 layer를 포함되어 있음 

이 블록이 여러번 반복되며 입력 시퀀스를 효율적으로 처리하고 정보를 학습함 

 

일반적으로 2개의 주요 서브층으로 구성됨 

 

멀티헤드 어텐션 서브층

  • 입력 시퀀스의 self-attention 또는 cross-attention을 수행
  • 입력 데이터를 다양한 방식으로 분석하여 단어 간의 관계를 학습

 

피드포워드 네트워크(FFN) 서브층

  • 각 위치의 출력 벡터에 대해 독립적으로 작동하는 완전 연결 신경망
  • 비선형 변환을 통해 더 복잡한 패턴을 학습

 

각 서브층의 출력은 다음 서브층의 입력으로 사용됨  

두 서브층은 잔차 연결레이어 정규화를 통해 연결되어 한개의 블록이 됨 

 

3개의 벡터가 각각 query, key, value 로 들어가 멀티헤드 어텐션에 의해 계산

 

 

residual connection 

  • attention 을 거친 임베딩 벡터 (결과) + 기존의 임베딩 벡터 (입력) 
  • self-attention의 결과는 영향을 미치는 다른 단어들의 정보를 요약했기에 본래의 정보는 많이 변형됨. 
  • 잔차연결을 통해 본래 정보를 더해줌으로써 정보를 복원하는 것
  • 서브층의 입력과 출력은 동일한 차원을 갖고 있기에 덧셈 연산 가능  

 

layer normalization 

  • 평균 0 분산 1로 만들어주는 여러 normalization 존재 
  • 텐서의 마지막 차원에 대해 평균 0 과 분산1 으로 정규화하고, 가중치와 편향을 적용하여 학습을 도움 
  • batch normalization 과 유사하나 레이어 정규화는 각 시퀀스, 입력 단위에 독립적으로 적용
  • 학습 효율을 높이기 위한 장치 

 

 

 

 

Positional Encoding

 

각 위치마다 위치를 나타내는 정보를 추가함 

 

why?

트랜스포머는 RNN 과 달리 단어 입력을 순차적으로 입력 받지 않음

 

단어의 임베딩 벡터위치정보를 더하여 모델의 입력으로 사용함

 

포지셔널 인코딩 값을 만드는 방법 2가지 

: sin cos 함수를 사용 

 

pos: 입력 문장에서의 임베딩 벡터의 위치 

i: 임베딩 벡터 내의 차원의 인덱스 - 짝수면 sin 홀수면 cos

 

이를 사용하면 같은 단어라도 문장의 위치에 따라 입력으로 들어가는 임베딩 값이 달라짐

 

 

 

 

어텐션 매커니즘의 하이퍼파라미터 모음 

 

주요 하이퍼파라미터

d_model: 임베딩 벡터의 차원. 피드포워드 신경망 은닉층 크기 (입력, 출력층 크기)

num_layers: 하나의 인코더와 디코더를 층으로 생각했을 때, 총 몇층인지? layer 갯수

num_heads: attention을 여러 개로 분할하여 병렬로 수행하고 결과값을 하나로 합치는 방식. 병렬의 갯수

d_ff: 피드포워드 신경망의 은닉층의 크기. d_model보다 더 큰 값으로 설정

 

 

 


너무너무 어렵다 

 

 

 

 

교수님의 pdf 파일

https://wikidocs.net/31379

https://jalammar.github.io/illustrated-transformer/

https://codingopera.tistory.com/44

https://wikidocs.net/162098

'자연어처리' 카테고리의 다른 글

자연어처리 (7) GPT와 BERT  (0) 2024.11.11
자연어처리 (5) 출력값 생성기법  (1) 2024.10.29
자연어처리 (4) seq2seq with attention  (1) 2024.10.24
자연어처리 (3) RNN  (0) 2024.10.15
자연어처리 (2) w2v & glove  (2) 2024.09.30