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가 양수일 확률을 계산
- dropout, zoneout, ReLU 를 결합
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 적용 후에는 행이 입력되었던 토큰이고 열이 임베딩했던 단어 사전의 크기라고 생각하면 번역하는 경우에 각 행에서 가장 높은 확률을 가지는 열에 해당하는 단어가 출력이 된다
참고
트랜스포머를 활용한 자연어 처리
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 |