본 글은 동빈나님의 <유튜브 강의 [딥러닝 기계 번역] Transformer: Attention Is All You Need >와 유원준 외 1명님의 <딥러닝을 이용한 자연어 처리 입문>을 참고하여 작성했습니다
목차
서론
- 딥러닝 기반의 기계 번역 발전 과정
- 기존 Seq2Seq 모델들의 한계점
- Seq2Seq with Attention
- Decoder
- 어텐션 시각화
본론
- Transformer
- 트랜스포머의 동작 원리
- 인코더
- 임베딩
- 멀티헤드 어텐션,피드 포워드
- 잔여학습, 정규화
- 인코더와 디코더
- 인코더
1-1. 딥러닝 기반의 기계 번역 발전 과정
2021 기준으로 최신 고성능 모델들은 대부분 트랜스포머(Transformer) 아키텍처를 기반으로 하며, 트랜스포머를 기점으로 다양한 NLP Task들은 RNN을 사용하지 않고 어텐션(Attention) 기법을 사용하여 입력 시퀀스 전체에서 정보를 추출하는 방향으로 연구가 발전하게 됨
- GPT, Generative Pre-Trained Transformer
- 언어모델(LM, Language Model)로 이전 단어들이 주어졌을 때 다음 단어가 무엇인지 맞추는 과정에서 사전학습(Pre-train)을 진행
- 문장 시작부터 순차적으로 계산한다는 점에서 일방향(uni-direction)임
- Transformer의 Decoder architecture 활용
- BERT, Bidirectional Encoder Representation from Transformation
- 마스크 언어모델(Masked LM)으로 문장 중간에 빈칸을 만들고 해당 빈칸에 어떤 단어가 적절할지 맞추는 과정에서 사전학습을 진행
- 빈칸 앞뒤 문맥을 모두 살필 수 있다는 점에서 양방향(bi-directional)성격을 가짐
- 트랜스포머의 Encoder architecture 활용
1-2. 기존 Seq2Seq 모델들의 한계점
시퀀스-투-시퀀스(Seq2Seq, Sequence-to-Sqeunce)는 입력된 시퀀스로부터 다른 도메인의 시퀀스를 출력하는 방식으로, 챗봇(Catbot)과 기계번역(MT, Machine Translation)을 대표적인 예로 들 수 있다
- 챗봇
- 입력 시퀀스 : 질문
- 출력 시퀀스 : 대답
- 기계번역
- 입력 시퀀스 : 소스 문장
- 출력 시퀀스 : 타겟 문장(번역 문장)
Seq2Seq는 아래와 같이 크게 두개로, 인코더(Encoder)와 디코더(Decoder)로 아키텍처가 구성되어있다
인코더는 입력 문장의 모든 단어들을 순차적으로 입력받은 후 마지막에 이 모든 단어 정보를 압축해 하나의 벡터로 만드는데 이를 문맥벡터(context vector)라고 한다. 입력 문장의 정보가 하나의 문백 벡터로 모두 압축되면 인코더는 문맥벡터를 디코더로 전송하며, 디코더는 컨텍스트 벡터를 받아 번역된 단어를 한 개씩 순차적으로 출력한다
즉, Seq2Seq는 고정된 크기의 문맥 벡터에 소스 문장의 정보를 압축하는 방식으로 학습이 되기 때문에, 이 경우 병목현상(bottleneck)이 발생하여 성능 하락의 원인이 됨
1-3. Seq2Seq with Attention
RNN의 구조적 문제점은 문맥(Context)의 정보를 가지고 있는 은닉 상태 벡터(Hidden state vector)가 하나이기 때문에 병목현상이 생긴다는 점이다. 이를 해결하기 위해 고안됨 개념이 어텐션(Attention)이다. 어텐션은 모델이 아이템을 출력할때마다 입력 시퀀스에서 어떤 아이템을 주목(Attention)해야 하는지를 가중치 벡터로 표시해준다
Seq2Seq에 어텐션을 적용할 경우, 인코더는 마지막 은닉 상태 벡터(=문맥 벡터)만을 디코더에 입력하지 않는다. 각 time step마다
생성되는 은닉 상태 벡터를 보관하며, 인코딩이 끝나면 생성된 모든 은닉 상태 벡터를 디코더에 넘겨준다. 따라서 생성되는 벡터를 모두 넘겨주므로 시퀀스 앞쪽의 정보도 디코더에 손실없이 넘길 수 있어 RNN의 장기 의존성 문제도 해결할 수 있다
1) Decoder(디코더)
디코더는 매번 인코더의 모든 출력 중에서 어떤 정보가 중요한지 계산
- i = 현재 디코더가 처리 중인 인덱스
- j = 각각의 인코더 출력 인덱스
Energy
$e_{ij} = \alpha (s_{i-1}, h_j)$
- Energy는 매번 디코더가 출력 단어를 만들 때마다 모든 인코더 출력을 고려하는 것
- $h_j$ : 디코더가 이전에 출력했던 단어를 만들기 위해 사용했던 hidden state
- $s_{i-1}$: 인코더 파트 각각의 state
Weight
$$\alpha_{ij} = \sum\limits_{k=1}^{T_x}\frac{exp(e_{ij})}{exp(e_{ik})}$$
- 에너지 값에 softmax(0~1사이의 확률 값)를 취한 값
2) 어텐션 시각화
어텐션 가중치를 사용해 각 출력이 어떤 입력 정보를 참고했는지 알 수 있다
2-1. Transformer(트랜스포머)
- 2021 기준으로 현대의 NLP 네트워크에서 핵심이 되는 논문
- RNN/CNN을 전혀 필요로 하지 않음
- 대신 문장내의 순서들을 알려주기 위해 Positional Encoding을 사용
- 단어의 위치 정보를 포함시키기 위함
- 대신 문장내의 순서들을 알려주기 위해 Positional Encoding을 사용
- BERT/GPT와 같이 향상된 네트워크에서도 채택하는 모델
- BERT에서는 인코더에서, GPT는 디코더에서 트랜스포머 구조를 사용
- 인코더와 디코더로 구성
- Attention 과정을 여러 레이어에서 반복함
2-2. 트랜스포머의 동작 원리
1) 인코더(Encoder)
트랜스포머(Transformer)는 하이퍼파라미터(hyper-parameter)인 num_layers 개수의 인코더 층을 쌓는다. 논문에서는 총 6개의 인코더 층을 사용한다. 인코터를 하나의 층이라는 개념으로 생각한다면, 하나의 인코더 층은 크게 2개의 서브층(sub-layer)인 셀프 어텐션과 피드 포워드 신경망으로 나눠진다
인코더의 역할은 주어진 입력값을 인풋 임베딩(input embedding)과 포지셔널 임베딩(positional embedding)을 통해 주어진 토큰들을 벡터화시키며 멀티헤드 어텐션과 피드 포워드로 구성된 인코더에 넣는 과정을 거쳐 디코더의 입력값을 생성하는 것이다
1-1) Embedding : Input Embedding + Positional Embedding
- 입력 임베딩(Input Embedding) : 입력 토큰을 벡터화 함
- 포지셔널 임베딩(Positional Embedding) : 포지셔널 인코딩(Positional Encoding)을 통해 생성한 테이블 값을 참조하여 위치 정보를 포함시킴
- 포지셔널 임베딩의 결과 값의 차원은 단어 임베딩 벡터의 차원과 같으며, 두 벡터를 더하여 인코더 값으로 넘겨주게 된다
- RNN은 데이터를 순차적으로 받으면서 자동으로 순서에 대한 정보를 기록하나 transformer는 RNN을 사용하지 않으므로 위치 정보를 포함시키고 있는 임베딩을 사용해야 함
- Positional Encoding : 위치 정보 테이블을 계산
- 위치 정보 k가 짝수인 경우(k = 2i) : $PE(pos, 2i) = sin(\frac{pos}{10000^{2i/d_{model}}})$
- 위치 정보 k가 홀수인 경우(k = 2i + 1) : $PE(pos, 2i+1) = cos(\frac{pos}{10000^{2i/d_{model}}})$
1-2) Encoder : Multi-Head Self-Attention + Position-wise FFNN
멀티 헤드 셀프 어텐션(Multi-Head Self-Attention)
스케일드 닷 프로덕트 어텐션(Scaled Dot-Product Attention)을 여러개 만들어 다양한 특징에 대한 어텐션(Attention)값을 볼 수 있게 만드는 과정
- Multi-Head Self-Attention
- Input : Qeury, Key, Value
- output : context(attn_prob와 Value값을 내적한 값), attn_prob
- Attention
- 쿼리(Q)와 비슷한 값(V)을 가진 키(K)를 찾아 그 값을 얻는 과정으로 Transformer에서는 문장에서 각 단어끼리 얼마나 관계가 있는지를 계산하기위해 사용하는 방법
- $Attention(Q,K,V) = Softmax(\frac{QK^T}{\sqrt d_k})V$
- $\sqrt d_k$ : scaling factor로 gradient vanishing 문제를 피하기 위해 나누어주는 값
- Self-Attention : Q, K, V 값이 동일할 때
- 트랜스포머에 사용되는 어텐션 종류
- 인코더의 셀프 어텐션 : Q = K = V
- 디코더의 첫번째 서브층인 마스크드 셀프 어텐션 : Q = K = V
- 디코더의 인코더-디코더 어텐션 : Q(Decoder vector) / K = V(Encoder Vector)
- Scaled Dot-Product
- Q, K, V는 모두 문장이며 각 단어가 벡터로 되어있고, 이들이 모여 결국 행렬로 되어 있는 구조
- 계산 과정
- Q, K 는 내적 계산을 먼저 진행
- 어떤 Q, K가 중요한 역할을 하고 있다면 어텐션 블록은 이들 사이의 내적 값을 키우는 방식으로 학습
- 내적 값이 커지면 해당 쿼리와 키가 벡터 공간상 가까이 있을 가능성이 높아짐
- 내적 연산 후 벡터의 차원이 커지면 학습이 잘 안될 수 있으므로 스케일링 진행
- 자신보다 뒤에 있는 단어를 참고하지 않게 하기 위해 mask 진행
- 전체 문장을 한 번에 행렬 형태로 입력해주는 구조이므로 자신보다 뒤에 있는 단어를 참고해서 단어를 예측을 하지 않기 위함
- mask 후 softmax로 확률 값으로 변환시켜주고 V와 내적을 해주어 context vector를 구함
- Q, K 는 내적 계산을 먼저 진행
포지션 와이즈 피드포워드 신경망(Position-wise FFNN)
하나의 어텐션 레이어를 거쳐 나온 출력값이 다음 어텐션 레이어를 위해 더 나은 값으로 업데이트 되기 위함
- Position-wise FFNN
- input : Multi-Head Attention의 output 중 context vector 필요
- output : feed forward를 통해 업데트 된 context vector
1-3) 잔여학습과 정규화
잔여학습(Residual Learning)
레이어를 거쳐 값을 단순히 갱신하는 것이 아닌 특정 레이어를 건너 띄어서 복사가 된 값을 그대로 넣어주는 것 → 성능 향상을 위해 잔여 학습을 사용함
Add&Norm
어텐션과 정규화(Normalization) 과정을 반복하며, 각 레이어는 서로 다른 파라미터를 가짐
2) 인코더와 디코더
마지막 인코더 레이어의 출력이 모든 디코더 레이어에 입력됨
- 인코더와 디코더의 레이어 수는 보통 같음
트랜스포머에서도 인코더와 디코더의 구조를 따름
- RNN을 사용하지 않으며 인코더와 디코더를 다수 사용한다는 점이 특징이다.
- 트랜스포머는 RNN과 다르게 위치 정보를 한 번에 넣어서 한 번의 인코더를 거칠 때마다 병렬적으로 출력 값을 구해낼 수 있기 때문에 계산 복잡도가 일반적으로 RNN보다 낮다
- <eos>가 나올 때까지 디코더를 이용
'인공지능(AI) > 자연어처리(NLP)' 카테고리의 다른 글
[NLP] 단어 표현 방법(Word Representation) (0) | 2021.10.13 |
---|---|
[NLP] 단어 표현 방법 : Bag-of-Word Model(Bow) (0) | 2021.10.13 |
[NLP 개념] 언어모델(Language Model) (0) | 2021.05.03 |
01 자연어처리 소개 (0) | 2020.12.17 |
08 텍스트 분류 (0) | 2020.12.17 |