기존의 자연어 처리 기법
Bag-of Words
-딥러닝 기술이 적용되기 이전 많이 사용되던 기법으로, 문장 내 단어들을 하나의 원소로 이해하여 정리하는 방법이다.
-워드별로 가방을 준비하고, 특정 문장에서의 워드들을 순차적으로 해당하는 가방에 넣어준 후, 각 가방들의 워드의 수를 세서 벡터로 나타낸 것이라고 보면 된다.
-Bag of Words는 NaiveBayes Classifier로 정리할 수 있다.
Bag-of Words에 필요한 사전 정리, One-hot 벡터
-카테고리들을 one-hot 벡터로 정리
-단어가 3개면 3개의 one hot 벡터로 정의하며, 모든 단어가 동일한 관계로 이루어진다.
Bag-of Words 예시
'CODE is Good Good'
One-hot vectors: CODE=[1 0 0], is=[0 1 0], Good=[0 0 1]
Bag-of-Words: [1 1 2]
NaiveBayes Classifier
베이즈 정리에 의해 다음과 같은 식으로 정리된다.
(알아야 할 점)
C_map: 최대 사후 확률, 주어진 d에 대해 가장 가능성이 높은 클래스
argmax P(c|d) : 문서 d가 주어졌을 때 특정 클래스 c가 될 확률이 가장 높은 클래스
Word Embedding
-자연어가 각 단어들을 좌표공간에 최적의 벡터로 임베딩하는 기법으로, 유의어끼리는 좌표 상에서 서로 가까운 좌표값을 가지고 있다. 예를 들면,
CODE: 경영대 데이터사이언스 동아리
경영학회: 경영대 학술 동아리
경희태권도: 그냥 동네 태권도
위 단어들이 한 좌표공간에 표현한다면 CODE와 경영학회는 비슷한 위치에 임베딩될 것이며, 경희태권도는 먼 거리에 있을 것이다.
Word2Vec
-문장 내에서 유사한 의미를 가진 단어들이 좌표에서 비슷한 위치로 맵핑되게 하는 것
ex)
The cat purrs.
This cat hunt mice.
이 문장들에서 관련성 높은 단어들:
(The와 This)는 cat을 의미, (purrs와 hunt)는 cat을 꾸밈. mice는 행위를 꾸며주기 때문
window 방법
ex:I study math.
I를 기준:(I,study)
study를 기준:(study,I)
study를 기준:(study,math)
Word2Vec 계산 방법 설명
예시 문장: I study math
Input layer: 3차원
Hidden layer: 2차원
Output layer: 3차원
▶Input과 Output 벡터의 사이즈는 문장의 단어의 갯수만큼 입/출력한다.
▶Hidden layer의 노드 수는 사용자가 정하는 하이퍼파라미터로서, 워드 임베딩을 수행하는 좌표 공간의 차원 수와 동일하게 설정
! One-hot 벡터에서의 내적 행렬 곱은 무조건 해당 문자 임베딩 레이어라고 불림
->행렬 곱 수행하지 않고 원 핫 벡터에서 1에 해당하는 인덱스 자리의 컬럼 벡터를 선형 행렬에서 뽑아옴
GloVe(Global Vectors for Word Representation)
-사전에 미리 각 단어들의 동시 등장 빈도수를 계산해 단어간 내적값과 사전에 계산된 값의 차이를 줄여가는 형태로 학습.
종류 | 단어들의 동시 등장 빈도수 계산 시기 | 연산 방법 |
Word2Vec | 사후 | 모든 연산 반복 |
Glove | 사전 | Ground Truth로 반복 계산 줄임 |
RNN(Recurrent Neural Network): 순환 신경망
▶ 입력과 출력을 시퀀스 단위로 처리하는 시퀀스 모델(Sequence model), 가장 기본적인 인공 신경망 시퀀스 모델
▶ 순차적인 데이터 패턴을 학습하기 위해 설계된 신경망
▶ 시계열 데이터*를 처리하기 좋은 뉴럴 네트워크 (*시간에 따라 변화하는 데이터)
ex. 음성인식, 음악 생성기, DNA 염기 서열 분석, 번역기, 감정 분석
▶ LSTM, GRU도 근본적으로 RNN에 속함(RNN의 구조를 기반으로 더 긴 종속성을 학습할 수 있는 메커니즘을 추가함)
▶ 다른 모델들은 은닉층에서 활성화 함수를 지난 값은 오직 출력층 방향으로만 향하지만, RNN 모델은 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을 출력층 방향으로도 보내면서, 다시 은닉층 노드의 다음 계산의 입력으로 보내는 특징을 갖고 있다.
- RNN은 현재 타임스텝에 대해 이전 스텝까지의 정보를 기반으로 예측값을 산출하는 구조의 딥러닝 모델이다.
- 각 타임 스텝에서 입력 벡터 xt와 이전 타임 스텝의 히든 상태 ht−1를 사용하여 현재 타임 스텝의 히든 상태 ht를 계산함
- 매 타임스텝마다 동일한 파라미터를 가진 모듈을 사용하므로, '재귀적인 호출'의 특성을 보여주어 'Recurrent Neural Network'라는 이름을 가지게 되었음
▨ ANN: self feedback 없음(RNN과 차이점)
▨ CNN: 공간 weight, 이미지 구역별로 같은 weight 공유
▨ RNN: 시간 weight, 시간 별로 같은 weight 공유(과거와 현재는 같은 weight 공유)
Fisrt Order System
현재 시간의 상태가 이전 시간의 상태와 관련 있다고 가정
- 외부 입력 없이 자기 혼자서 돌아감(autonomius system)
xt=f(xt-1)
- 현재 시간의 상태(xt)가 이전 시간의 상태(xt-1)와 현재의 입력(ut)에 관계가 있는 경우
xt=f(xt-1,ut)
- 1차원 시스템의 모형 xt = f(xt-1,ut)
- 상태 xt = hidden layer의 state
- 상태 xt는 이전까지의 상태와, 이전까지의 입력을 대표할 수 있는 압축본이라 할 숭 ㅣㅆ음
- 상태 xt는 시계열로 들어오는 입력들을 최대한 상세히 표현할 수 있어야 함
Q. 모든 시간 t에서 모든 상태 xt가 관측 가능한가? No, 일부만 관측 가능함
∴ 각 시간에서 관측 가능한 상태의 모음: 출력 yt = h(xt)
어떤 시스템을 해석하기 위한 3요소: 입력(u), 상태(x), 출력(y)
원래 풀고 싶었던 문제: xt = f(ut, ut-1, ut-2, ..., u0)
대신해서 풀 문제: xt = f(xt-1, ut) = First-order Markov Model
1. RNN 계산 방법
- t : 현재 타임스텝(time step) , w : 웨이트(weight)
- ht-1 : old hidden-state vector
- xt : input vector at some time step
- ht : new hidden-state vector
- fw : RNN function with parameters W
- yt : output vector at time step t
- RNN에서 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드를 셀(cell)이라고 함, 이 셀은 이전의 값을 기억하려고 하는 일종의 메모리 역할을 수행하므로 이를 메모리 셀 또는 RNN 셀이라고 표현함
- 위의 변수들에 대하여, h_t = f_w(h_t-1,x_t)ht=fw(ht−1,xt) 의 함수를 통해 매 타임스텝마다 hidden state를 다시 구해준다.
- 이 때, W와 입력값( x_t, h_t-1xt,ht−1 )으로 tan_htanh 를 곱해서 h_tht 를 구해준다.
- 구해진 h_t, x_tht,xt 를 입력으로 y_tyt 값을 산출하게 된다.
2. 다양한 타입의 RNN 모델
- RNN은 입력과 출력의 길이를 다르게 설계 할 수 있음
1) One to One(일 대 일): 하나의 입력에 대해서 여러개의 출력
ex. 하나의 이미지 입력에 대해서 사진의 제목을 출력하는 이미지 캡셔닝(Image Captioning) 작업
[키, 몸무게, 나이]와 같은 정보를 입력값으로 할 때, 이를 통해 저혈압/고혈압인지 분류하는 형태의 태스크
2) One to many(일 대 다): 생성
ex. '이미지 캡셔닝'과 같이 하나의 이미지를 입력값으로 주면 설명글을 생성하는 태스크
3) many to one(다 대 일): 시퀀스에 대해서 하나의 출력, 예측
ex. 입력 문서가 긍정적인지 부정적인지를 판별하는 감성 분류(sentiment classification),
메일이 정상 메일인지 스팸 메일인지 판별하는 스팸 메일 분류(spam detection)
4) many to many(다 대 다): 번역
ex. 사용자가 문장을 입력하면 대답 문장을 출력하는 챗봇
입력 문장으로부터 번역된 문장을 출력하는 번역기,
'태깅 작업' 챕터에서 배우는 개체명 인식이나 품사 태깅과 같은 작업
비디오 분류와 같이 영상의 프레임 레벨에서 예측하는 태스크
각 단어의 품사에 대해 태깅하는 POS와 같은 태스크
cf. seq2seq = mny-to-one + one-to-many
3. RNN 모델이 학습하는 방법 : Truncation , BPTT
1) Truncation: 시퀀스를 일정 길이로 잘라서 RNN이 처리할 수 있게 하는 기법
- RNN이 학습할 시퀀스의 길이를 제한하여, 계산 효율을 높이고 기울기 문제를 완화하는 방법
2) BPTT( Backpropagation through time): 신경망이 시간 축을 따라 펼쳐진 상태에서의 역전파를 통해 학습하는 방식
- 딥러닝 모델은 forward propagation을 통해 계산된 W를, backward propagation을 지나면서 W를 미분한 값인 gradient를 통해 학습
- RNN에서 타임스텝마다 계산된 weight를 backward propagation을 통해 학습하는 방식
4. RNN 모델의 한계점: exploding/vanishing gradient
state xt에는 w가 계속 곱해지게 됨
- 곱해지는 값이 1보다 크다면? 무한대로 발산
- 곱해지는 값이 1보다 작다면? 0으로 수렴
1) exploding gradient
- 학습 도중 loss가 inf가 뜰 경우, 학습이 더 이상 진행 불가함
- 해결책: Gradient Clipping
2) vanishing gradient
- 학습 도중 파악이 어려움
- 초기화를 간결하게 해주는 방법이 존재하지만 다른 네트워크 구조를 제안하는 것이 훨씩 편함
- Grated RNNs: LSTM/GRU
Long Short-Term Memory (LSTM)
- LSTM의 중심 아이디어는 단기 기억으로 저장하여 이걸 때에 따라 꺼내 사용함으로 더 오래 기억할 수 있도록 개선
- 다시 말해 Cell state에는 핵심 정보들을 모두 담아두고, 필요할 때마다 Hidden state를 가공해 time step에 필요한 정보만 노출하는 형태로 정보가 전파됨
-
1. LSTM의 여러 gate
- 위 그림을 살펴보면 input으로 x_t, h_t-1xt,ht−1 이 들어오게 되고 이를 W에 곱해준 후 각각 sigmoid or tanh로 연산해줍니다. 게이트별로 설명은 아래와 같습니다. Ifog 로 불리는 게이트들은 그림에서 순서대로 나타납니다.
- I : Input gate로 불리며, cell 에 쓸 지말지를 결정하는 게이트입니다. 즉, 들어오는 input에 대해서 마지막에 sigmoid를 거쳐 0-1 사이 값으로 표현해줍니다. 이 값은 cell state와 hidden state 두 갈래로 흐르게 됩니다.
- 표현식 : sigmoid(W(xt, ht-1)sigmoid(W(xt,ht−1)
- f : Forget gate 로 불리며, 정보를 어느정도로 지울지를 0~1사이의 값으로 나타냅니다.
- 표현식 : sigmoid(W(xt, ht-1)sigmoid(W(xt,ht−1)
- o : Output gate로 불리며, Cell 정보를 어느정도 hidden state에서 사용해야할 지를 0~1사이 값으로 나타냅니다.
- 표현식 : sigmoid(W(xt, ht-1)sigmoid(W(xt,ht−1)
- g : Gate gate로 불리며, 어느정도로 Cell state에 반영해야할 지를 -1 ~ 1 사이의 값으로 나타냅니다.
- 표현식 : tanh(W(xt, ht-1)tanh(W(xt,ht−1)
Grated Recurraent Unit (GRU)
- LSTM과 전체적인 동작원리는 유사하지만, Cell state, Hidden state를 일원화하여 경량화한 모델
- GRU에서 사용되는 h_t-1ht−1 은 LSTM에서의 c_tct 와 비슷한 역할을 함
- forget gate 대신 (1-input gate)를 사용하여 h_tht 를 구할때 가중평균의 형태로 계산
- 계산량과 메모리 요구량을 LSTM에 비해 줄여준 모델이면서 동시에 성능면에서도 LSTM과 비슷하거나 더 좋은 성능을 내는 모델
RNN , LSTM , GRU 요약
- RNN은 들어오는 입력값에 대해서, 많은 유연성을 가지고 학습되는 딥러닝 모델입니다.
- RNN에서는 그레디언트 소실/증폭 문제가 있어 실제로 많이 사용되지는 않지만, RNN 계열의 LSTM, GRU 모델은 현재도 많이 사용되고 있습니다.
- LSTM과 GRU 모델은 RNN과 달리 가중치를 곱셈이 아닌 덧셈을 통한 그레디언트 복사로 그레디언트 소실/증폭 문제를 해결했습니다.
- GRU에는 2개의 게이트가 있고 LSTM에는 3개의 게이트가 있습니다.
- GRU에는 내부 메모리가 없으며 LSTM에 있는 출력 게이트가 없습니다.
- LSTM에서 입력 게이트와 타겟 게이트는 업데이트 게이트에 의해 연결되고 GRU 리셋 게이트는 이전 숨겨진 상태에 직접 적용됩니다. LSTM에서 리셋 게이트의 책임은 입력과 타겟이라는 두 개의 게이트에 의해 수행됩니다.
Seq2Seq Model
: RNN에서 many-to-many에 해당되는 모델
- 입력 문장을 읽어오는 부분: 인코더
출력 문장을 생성하는 부분: 디코더 - 디코더의 첫번째 입력값(input)은 SoS(Start of Sentence)에 들어가며 결과값을 생성하기 시작하고, EoS(End of Sentece) 토큰이 디코더의 출력값(output)으로 나오면 생성을 멈추게 됩니다.
* 인코더와 디코더는 별개의 RNN 모델
Attention이 등장한 배경
- 인코더 마지막 히든 스테이트(hidden state)에 모든 인코더 정보 저장, LSTM을 통해 Long-term dependency 문제를 해결 -> 뒤 타임 스텝에서 앞쪽의 정보를 잘 저장하지 못하는 현상 발생
=> 'Attention' 등장
Attention의 개념
- Attention(어텐션): 디코더(Decoder)가 각 타임 스텝(time step)에서 결과를 생성할 때에 인코더(Encoder)의 몇번째 타임스텝을 더 집중(Attention)해야하는 지를 스코어 형태로 나타내는 것
- 각 디코더의 타임 스텝마다 인코더의 히든 스테이트 백터(hidden state vector)와의 유사도 계산 -> 인코더의 몇번째 타임스텝의 히든 스테이트 백터가 더 필요한 지 적절히 고려 가능
Attention 동작원리
- Seq2Seq Model의 경우: 이전 스텝의 히든스테이트(hidden state)와 현재 스텝의 디코더 입력값을 통해, 디코더 히든스테이트를 구해줌.
- 어텐션 구조가 추가된 형태에서는 현재 스텝의 디코더 히든 스테이트와 각각의 인코더 타임스텝의 히든 스테이트들을 내적해서 어텐션 스코어(Attention scores)를 구해줌.
- 구해진 스코어를 인코더 히든스테이트 벡터들의 가중치로 사용하여 가중 평균인 Attention output, 즉 하나의 백터를 구해줌.
- 마지막 아웃풋 레이어에는 디코더 타임스텝의 히든스테이트 백터와 어텐션 아웃풋(attention output)을 concat해서 입력.
티쳐포싱(Teacher forcing)
- 티쳐포싱(Teacher forcing): 디코더의 다음 타임스텝에 입력값, 이전 타임스텝의 결과값이 아닌 정답값을 넣어 학습하는 형태.
- 장점: 디코더에서 추론(inference)할때, 틀린값이 입력값으로 들어가지 않으므로 학습이 빠름.
- 단점: 주어진 데이터를 가지고 학습할 때와, 실제 환경에서 테스트할 때의 환경이 다름.
=> 적용할 때 초기에만 티쳐포싱으로 동작, 모델이 어느 정도 정확도가 높아지면 기존 방식(디코더 전 타임스텝의 예측값을 다음 타임스텝의 입력으로 넣음) 사용
다양한 어텐션 메카니즘
- Luong - dot: 간단한 내적을 통한 유사도(어텐션) 측정하는 기법. 학습 가능한 파라미터 존재 X
- Luong - general: 유사도를 구하고자 하는 두 벡터 사이에 학습 가능한 파라미터로 구성된 행렬 사용.
- Luong - concat: 유사도를 구하고자 하는 두 벡터를 concat하여 선형변환(비선형성(선형변환(x)))으로 감싸서 계산.
* x: 두 벡터를 concat한 벡터
어텐션의 장점
- 기계번역(NMT)에서 성능 향상
: 각 디코더 스텝마다 인코더의 어떤 스텝에 더 집중(어텐션)해야할 지 알려주므로 성능 향상. - 병목현상(bottleneck problem) 해결
: 기존 Seq2Seq구조에서는 인코더의 마지막 타임스텝의 hidden state vector를 통해서 정보를 넘길 때, 병목현상(bottleneck problem) 발생 -> 어텐션은 한 번에 정보를 전달하지 않으므로 병목현상 해결. - 그레디언트 베니싱(gradient vanishing) 문제 해결
: RNN의 한계인 오차역전파 과정에서의 그레디언트 베니싱(gradient vanishing)문제 발생 -> 역전파 과정에서 서로 멀리 있어도 여러 스텝을 거쳐 역전파 되지 않고, 어텐션 구조를 통해 한 번에 역전파될 수 있으므로 그레디언트 베니싱 문제 해결.
* 역전파: 가중치를 업데이트하는 것 - 해석 가능성 제공
: 디코더가 어느 부분에 집중했는지 파악 가능, 네트워크가 스스로 정렬 학습.
3가지 생성기법
- Greedy decoding: 생성하는 현재 시점에 가장 좋은 것(스코어가 높은것)을 생성하는 알고리즘.
- Exhaustive search: 가능한 모든 경우의 수를 고려하여 생성하는 알고리즘.
- Beam search: 위 두 가지 기법의 중간에 있는 기법, 매 타임 스텝마다 k개의 경우의 수만을 고려하여 생성하는 알고리즘. (생성하는 속도와 성능 고려)
Beam search
- k: beam size, 대체로 5에서 10 사이의 값.
- 작동 원리: 현재 타임 스텝 기준으로 <START> 토큰 이후 등장한 단어들의 점수를 모두 고려하여 가장 높은 k개의 후보(Candidate)만을 생존시킴.
- 탐색을 끝내는 시점
- <END> 토큰이 등장한 가설만 중지, 나머지는 다시 <END>토큰이 나올때까지 진행하여 모든 가설에 <END>가 나오면 탐색을 끝냄.
- T라는 타임스텝 파라미터를 지정하여 T 스텝이 지나면 탐색을 끝냄.
- 최종 생성결과 선정
- 탐색(search)이 종료되고 남은 가설들 중 가장 스코어가 높은 가설 생성.
- 동시사건확률을 고려하여 스코어를 계산하므로 문장이 짧을수록 더 높은 스코어를 낸다는 단점.
=> 타임스텝갯수(t)로 최종 스코어를 나눠서 평균 확률값을 최종 스코어로 사용.
Precision and Recall (정밀도와 재현율)
- Precision(정밀도): 검색된 결과들 중 관련 있는 것으로 분류된 결과물의 비율
- Recall(재현율): 관련 있는 것으로 분류된 항목들 중 실제 검색된 항목들의 비율
# 예시 - Precision(정밀도) = 맞은 단어의 수 / 예측한 문장의 길이
- Recall(재현율) = 맞은 단어의 수 / 정답 문장의 길이
- F-measure = Precision과 Recall의 조화평균
* 3가지 평균방식
- 산술평균 : n개의 값을 더한 후, n으로 나눠준 값
- 기하평균 : n개의 값을 모두 곱한 값의 n제곱근
- 조화평균 : 주어진 값들을 역수를 취하여 산출평균을 구한 후 역수를 취한 값
* 산술평균 ≥ 기하평균 ≥ 조화평균 (모든 경우)
BLEU score 특징
- recall이 아닌 precision 기반: 번역 태스크에서 재현율이 떨어져도(ex. 정답 문장의 몇 단어가 빠지는 경우) 문장의 의미가 유사할 수 있지만, 정밀도가 떨어지면(ex. 문장에 없는 단어가 오역되어 들어오면) 영향이 클 수 있기 때문.
- 문장을 평가할 때, n-gram(n은 보통 1에서 4 사이의 값)의 n값에 따라 문장을 나눠서 정답값(ground truth)과 얼마나 겹치는 지 다각도로 평가함.
- n-gram 평가 방식을 사용할 때, 단어들의 일치도가 높을지라도 정답 문장과 연속적으로 단어가 일치하지 않는다면 BLEU score값이 0이 나올 수 있음.
BLEU score 구하는 방법
- n = 1~4에 대한 각각의 precision의 기하평균을 구해줌.
- 문장의 길이가 짧은 경우를 보정하기 위해, brevity penalty를 적용하여 위에서 구한 기하평균에 곱해줌.
* brevity penalty: reference 문장보다 짧은 예측문장을 내놓을 시, 1 이하의 값을 곱해서 precision의 값을 낮게 보정.
트랜스포머의 핵심 개념: "Attention is All You Need"
- 트랜스포머 모델은 기존의 RNN이나 CNN 모듈을 완전히 배제하고 어텐션 메커니즘을 핵심적인 연산으로 사용합니다.
- 어텐션 메커니즘을 통해 입력 문장에서 각 단어의 상관관계를 동적으로 파악할 수 있습니다. 예를 들어, 번역 작업에서 각 단어가 다른 언어로 변환될 때 서로 어떻게 영향을 미치는지 계산할 수 있습니다.
모델 구조
- 트랜스포머는 크게 인코더(Encoder)와 디코더(Decoder) 두 가지 파트로 구성됩니다. 이 두 부분은 각각 여러 층의 모듈로 쌓여 있으며, 일반적으로 인코더와 디코더를 여러 층 (Layer)으로 반복합니다.
인코더(Encoder)
- 입력 문장이 임베딩된 후, 각 단어의 위치 정보를 포함하는 포지셔널 인코딩(Positional Encoding)이 추가됩니다. 트랜스포머는 순차적인 구조가 아니기 때문에 단어 순서 정보를 명시적으로 추가해야 합니다.
- 인코더의 각 층은 두 가지 주요 부분으로 구성됩니다:
- 멀티헤드 어텐션(Multi-Head Attention): 입력 단어 간의 관계를 여러 관점에서 학습할 수 있도록 여러 개의 어텐션 헤드를 사용합니다. 이를 통해 단어 간의 다양한 상관 관계를 포착할 수 있습니다.
- 피드 포워드 네트워크(Feed Forward Network): 각 단어의 표현을 개별적으로 비선형 변환합니다.
- 각 모듈의 출력은 Add & Norm이라는 레이어 정규화와 잔차 연결을 통해 안정적으로 학습됩니다.
디코더(Decoder)
- 디코더도 인코더와 유사하게 여러 층으로 이루어져 있으며, 각 층은 세 가지 주요 모듈로 구성됩니다:
- 마스크드 멀티헤드 어텐션(Masked Multi-Head Attention): 출력의 이전 단어들만 참조하여 다음 단어를 예측할 수 있도록 마스킹을 적용합니다. 이를 통해 순차적인 생성이 가능합니다.
- 멀티헤드 어텐션: 인코더에서 생성된 표현을 참조하여 입력 문장과의 관계를 학습합니다.
- 피드 포워드 네트워크: 인코더와 동일하게 각 단어의 표현을 개별적으로 변환합니다.
- 디코더의 최종 출력은 소프트맥스(Softmax) 함수를 통해 확률 분포로 변환되어, 다음 단어를 예측하는 데 사용됩니다.
입력과 출력의 흐름
- 왼쪽 하단의 입력 문장은 "je suis étudiant"와 같은 프랑스어 문장입니다. 이 문장이 인코더를 거쳐 입력 각 단어의 의미와 관계가 반영된 벡터 표현으로 변환됩니다.
- 디코더는 인코더의 출력을 참조하며 각 단계에서 영어로 번역된 출력 문장을 생성합니다. 오른쪽 그림에서는 "I am a student"라는 출력 문장이 생성됩니다.
어텐션 메커니즘의 중요성
- 트랜스포머 모델에서 어텐션은 모든 단어가 서로의 관계를 직접 참조할 수 있게 하여 문장 내 긴 거리 의존성 문제를 효과적으로 해결합니다. RNN과 달리 이전 상태에 종속되지 않기 때문에 병렬 처리가 가능하고, 학습 속도와 성능 면에서 큰 장점이 있습니다.
RNN과의 차이점
- RNN은 순차적 구조로 인해 문맥을 유지할 수 있지만, 문장이 길어질수록 장기 의존성 문제가 발생하여 정보 손실이 발생합니다.
- 트랜스포머는 이러한 문제를 해결하기 위해 고안된 모델로, 어텐션 메커니즘을 사용하여 모든 단어 간의 상관관계를 효율적으로 학습할 수 있습니다.
Bi-directional RNN
- 순방향(Forward) RNN과 역방향(Backward) RNN의 두 가지 RNN을 사용하여 입력 시퀀스를 동시에 처리합니다.
- 순방향 RNN은 입력 시퀀스를 왼쪽에서 오른쪽으로, 즉 시간 순서대로 처리하고, 역방향 RNN은 입력 시퀀스를 오른쪽에서 왼쪽으로 처리합니다.
- 양방향으로 정보를 처리하면, 각 단어가 문장의 이전과 이후 문맥을 동시에 참조할 수 있게 됩니다.
어텐션 매커니즘
- 입력 임베딩 (Embedding): 입력 문장의 각 단어, 예를 들어 "I go home" 또는 "Thinking Machines",는 단어의 임베딩 벡터로 변환됩니다. 이 임베딩 벡터는 입력의 의미적 정보를 포함하는 고정 길이 벡터입니다.
- 쿼리 (Query), 키 (Key), 밸류 (Value):
- 트랜스포머는 각 단어에 대해 세 가지 벡터를 생성합니다: 쿼리 q, 키 k, 밸류 v.
- 이를 위해 세 개의 가중치 행렬을 사용하여 입력 임베딩을 변환합니다.
- 이 과정을 통해 입력 X에 각 가중치 행렬을 곱하여 쿼리, 키, 밸류 벡터를 생성합니다.
어텐션 스코어 계산
- 쿼리와 키의 내적 (Dot Product):
- 어텐션 메커니즘의 핵심은, 각 단어가 다른 단어와 얼마나 관련 있는지 파악하는 것입니다.
- 이를 위해, 각 쿼리 벡터와 모든 키 벡터들 간의 내적을 계산하여 어텐션 스코어를 생성합니다.
- 이 내적 값이 클수록 두 단어의 관련성이 크다는 의미입니다.
- Softmax를 통한 정규화:
- 어텐션 스코어는 Softmax 함수에 통과되어 정규화됩니다. 이로써 각 단어에 대한 어텐션 가중치가 확률 분포로 변환됩니다.
- 이러한 가중치는 각 단어가 문맥 내에서 얼마나 중요한지 결정하는 데 사용됩니다.
어텐션 출력 계산
- 각 밸류 벡터에 Softmax를 통해 계산된 가중치를 곱한 후 이를 합산하여 최종 어텐션 출력을 생성합니다.
- 이 출력은 입력 단어가 문장 내 다른 단어들과의 상관성을 반영하여 조정된 값입니다.
어텐션 메커니즘은 입력 문장의 각 단어가 다른 단어와 얼마나 관련이 있는지를 동적으로 계산하여, 장기 의존성을 효과적으로 학습합니다.
트랜스포머는 쿼리, 키, 밸류 벡터를 사용해 어텐션 스코어를 계산하고, Softmax로 가중치를 부여하여 최종 어텐션 출력을 생성합니다.
Scaled Dot-Product Attention
스케일링 기법
- 문제점: 쿼리-키 내적 값이 커질수록 Softmax가 특정 값에 집중하게 되어 학습에 문제가 생길 수 있습니다.
- 해결 방법: 내적 결과를 dk\sqrt{d_k}로 스케일링하여 값의 크기를 조정해 Softmax가 적절히 작동하게 합니다.
- 전체 과정: 쿼리-키 내적 → 스케일링 → (선택적 마스크) → Softmax → 밸류와 곱 → 최종 어텐션 출력
Multi-Head Attention
Multi-Head Attention은 여러 개의 어텐션 "헤드"를 사용하여 서로 다른 어텐션 맵을 생성합니다. 이를 통해 단어 간 관계를 여러 각도에서 파악할 수 있으며, 문맥에서의 다양한 의미와 상관관계를 반영할 수 있습니다.
1) Q, K, V를 여러 차원으로 매핑
2) 각 헤드에 대해 Scaled Dot-Product Attention 계산
3) 어텐션 헤드들을 연결(Concatenate)
4) 최종 선형 변환
Layer Normalization
- Layer Normalization은 각 레이어의 출력을 정규화하여 평균이 0이고 분산이 1이 되도록 변환합니다.
- 이 정규화는 학습 안정성과 수렴 속도를 높이며, 네트워크가 다양한 입력 크기나 길이에 대해 일관된 학습 성능을 유지하도록 돕습니다.
- Batch Normalization 등과 다르게 배치 크기에 독립적이어서 시퀀스 모델에 적합하며, 트랜스포머와 같은 모델에서 널리 사용됩니다.
- Layer Normalization의 주요 단계
- 정규화 (Normalization):
- 입력 벡터의 평균을 0, 분산을 1로 조정하는 과정입니다.
- 각 단어 벡터가 정규화되어, 평균과 분산이 일정한 분포를 가지게 됩니다.
- Affine Transformation (Affine 변환):
- 정규화된 값에 학습 가능한 매개변수 g와 b를 사용하여 선형 변환을 적용합니다. 이를 통해, 단순히 0과 1의 정규화된 분포에 머무르지 않고, 네트워크가 학습한 적절한 분포를 갖도록 조정합니다.
Positional Encoding
- Positional Encoding은 트랜스포머 모델에서 위치 정보를 추가하여 단어의 순서를 모델에 알려주는 역할을 합니다.
- 사인/코사인 함수를 사용하여 각 위치와 차원에 대해 고유한 패턴을 생성하고, 이를 단어 임베딩에 추가하여 트랜스포머가 단어의 순서와 위치 관계를 학습할 수 있도록 돕습니다.
Warm-up Learning Rate Scheduler
- Warm-up 스케줄링은 학습 초기에 학습률을 작게 시작하여 점차 증가시키는 단계입니다.
- 이후 학습이 진행됨에 따라 학습률을 점차 감소시키며, 모델이 안정적으로 수렴할 수 있도록 돕습니다.
- 학습률이 너무 큰 상태로 학습을 시작하면 모델이 불안정해질 수 있는데, Warm-up 단계가 이를 방지해줍니다.