728x90
1. INTRO
- RNN
- 자연어라는 data가 특정한 순서를 가지고 들어오는 입력 data라는 것에 착안하여 sequence data를 처리할 수 있는 핵심요소
- RNN을 기반으로 입력, 출력이 sequence로 주어지는 Seq2Seq라는 Task
- 그에 대한 special case인 language modeling task까지 자연어 처리를 중심으로 함
2. RNN
- Sequence Data에 특화된 형태
- RNN이라는 동일한 Function을 반복적으로 호출
- $X_{t}$ : 특정 time step $t$에서의 input vector
- $h_{t-1}$ : 이전 time step $t-1$에서의 동일한 RNN Function이 계산했던 hidden state vector
- $f_{W}$ : $h_{t-1}, X_{t}$ 두 개를 입력으로 받아서 현재의 time step $t$에 RNN Modue의 output인 $h_{t}$인 current hidden state vector를 만들어주게 됨
- 매 time step 마다 동일한 function $f_ {w}$ (동일한 Parameter set을 가지는 layer)가 반복적으로 수행됨
- 여러 time step 동안에 특정 time step에서 prediction을 해야 하는 경우는 현재 time step $t$의 hidden state vector $h_{t}$를 다시 입력으로 output layer $y_{t}$에 전달해 줌으로써 최종 예측 결과를 생성
- Input vector & 이전 time step의 hidden state vector 각각 fully-connected layer를 통과해서 (model parameter와 input feature간의 linear combination) output vector $W_{hh}h_{t-1}, W_{xh}x_{t}$를 각각 생성
- 두 개의 output vector를 합산해서 중간결과물을 만들고 이를 activation function $tanh$ 에 합성시켜서 현재 time step의 hidden state vector $h_{t}$ 생성
- $h_{t}$와 $h_{t-1}$의 차원이 동일하게끔 matrix $W_{hh}, W_{xh}$의 size를 조정
- 특정 time step t에서 어떤 output을 predict 하기 위해서는 hidden state vector를 output layer 가 입력으로 받아서 $W_{hy}h_{t}$ 선형변환을 통해 최종 output vector를 반환
- Multi-Class Classification: $y_{t}$에 softmax layer를 거는 형태로 output vector를 확률 분포 vector로 변환
- Regression Task: $y_{t}$ 자체의 실수 값을 최종 예측 output으로 사용하게 되는 다양한 형태를 띄게 됨
3. Various Problem Settings of RNN-based Sequence Modeling
- Vanilla Neural Networks (one to one)
- time step의 개념없이 한번에 하나의 data item을 입력으로 받아서 해당 예측 결과를 반환
- time step t = 1일 때만 입력이 주어지고 그때 바로 해당하는 출력 결과물이 각각 나오게 되는 경우
- one to many
- 최초 time step에 딱 한번 입력이 주어짐
- 출력 결과물은 여러 time step에 걸쳐서 순차적인 예측 결과를 생성 (입력이 하나고, 출력이 여러 개로 이루어진 sequence data)
- Ex) Image Captioning Task: RNN Module은 출력 결과물로서 이미지를 설명하는 텍스트의 각각의 단어들을 특정 sequence로 예측해주는 형태
- Many to One
- 입력이 sequence 형태로 주어지되, 최종적인 마지막 time step에서 단일한 time step의 예측결과를 생성
- Ex) 문장 분류 (Sentiment Classification)
- Many to Many (Sequence-to sequence)
- 일반화된 형태 (Seq2Seq Model의 기본적인 문제 setting)
- 입력, 출력 모두 sequence 형태로 주어짐: 입력 sequence를 다 읽은 후에 예측 sequence를 생성
- Ex) Machine Translation: 번역기
- 특수한 형태
- 입력이 sequence로 주어졌을 때 예측 결과물을 실시간으로 그때까지 주어졌던 sequence를 바탕으로 매 time step마다 바로바로 예측 결과를 생성
- delay를 허용하지 않음
- Ex) Video Classification on Frame Level
4. Character-level Language Model
- Language Modeling Task 중 하나
- 각 character level에서 input을 매 time step마다 받았을 때 다음에 나타날 character를 예측
- Delay를 허용하지 않음
- 각각의 character를 하나의 vocabulary로 구성하고 vocabulary상에서 각각의 워드를 categorical variable 형태로 encoding
- Vocabulary: [h, e, l, o]
- Vocabulary상에서 각각의 워드를 one-hot vector 형태로 나타냄
- one-hot vector를 input vector $x_{t}$로 받고, 전 time step에서 넘어오는 $h_{t-1}$를 이용하여 현재 hidden state vector $h_{t}$를 계산
- $x_{t}$: 4차원 vector
- $W_{xh}$: $3 \times 4$ Matrix
- $h_{t-1}$: 3차원 vector
- $W_{hh}$: $3 \times 3$ Matrix
- 최초의 time step에는 $h_{t-1}$이 존재하지 않기 때문에 Zero Vector를 입력으로 준다
- 각 time step 기준으로 그 다음에 나타내아 할 character를 예측해야 함
- prediction을 위해 output layer $y_{t}$를 이용
- 매 time step마다 4개의 class 중에 하나의 class를 예측하는 Multi-Class Clasification을 수행
- Output Vector $y_{t}$를 4차원 vector로 만든 후 softmax layer를 통과시키면 h, e, l, o의 4개의 class에 대응하는 probability vector를 얻게됨
- Softmax Layer: 예측하고자 하는 대상인 4개의 character 중에 하나로 classification 해주는 probability vector를 반환
- 최종 예측값은 가장 큰 확률값을 부여하게 된 해당 class 를 다음에 나타날 character로 예측하게 됨
- Trainable한 parameter: $W_{hy}, W_{hh}, W_{xh}$ 모두 Gradient Descent를 이용하여 학습이 진행됨
- Ground Truth class info: 실제 'h' 뒤에 순서가 'ello'라는 정보
- 해당 softmax 확률값에 log를 취하고 -를 붙여 softmax loss 값을 최소화하는 방식으로 학습을 진행
- 해당 time step에서 다음에 나타날 character를 예측
- 그 예측된 character를 다음 time step에서 실제로 나타난 character라고 생각해서 다음 time step에 RNN에 입력으로 주게 됨
- 연쇄적으로 최초의 time step에서 character하나만 입력으로 준다면 character의 예측된 sequence를 무한정 길이만큼 생성할 수 있음
- Auto Regressive Model
- Sequence Model에서 이전 time step에 예측한 결과가 다음 time step에 입력으로 주어지는 경우
- Model의 output이 다음 time step의 input으로 주어지는 경우
- 학습을 진행할수록 유의미한 character sequence를 반환
- 논문 Paper이나 C code와 같은 코드도 만들어준다
5. Vanila RNN 구조의 문제점
- 실질적으로 많이 사용하지는 않음: 학습이 불안정해짐
- Problem
- Gradient Vainishing Problem
- Gradient Exploding Problem (gradient가 폭발적으로 늘어나게 되는 문제)
- Solution
- RNN의 기본적인 입출력 setting은 동일하게 유지하되, 특정한 구조의 RNN 모델을 많이 사용
- LSTM(long-short term memory) or GRU(gated recurrent unit)를 사용
- LSTM
- 기본적인 i/o setting은 동일하게 유지
- RNN에서의 hidden state vector는 기존의 hidden state vector와 cell state vector로 두 가지 버젼의 vector들을 통해 입력 신호를 잘 처리하고 그 정보를 encoding한다
6. Seq2Seq and Attention Model
- 앞에서 제시한 5가지 유형 중 Many to Many에 해당된다 (입력, 출력이 모두 sequence 형태로 들어옴)
- ENCODER
- 단어별로 각 time step에 해당 vector input으로 주어져서 RNN Module이 매 time step마다 잘 처리하고 축적하는 과정이 일어남
- 마지막 hidden state vector $h_{t}$는 입력 sequence에 주어진 모든 단어들의 정보들을 잘 축적한 vector
- DECODER
- 특정 단어들의 sequence로 이루어진 답을 output으로 반환
- RNN Module이 동작해서 각 time step에 해당하는 단어를 예측해야 하는 task가 수행됨
- 가장 최초로 등장하는 단어로서, 특수문자로서 start of sentence라는 단어를 입력으로 주어 '문장의 생성을 시작할 것이다'라는 것을 알려주고 첫번째 단어를 예측해주는 task를 수행하게 됨
- 다음 단어로서 예측한 단어를 다음 time step에 input으로 입력으로 줘서 그 다음 단어를 연쇄적으로 예측하게 됨
- 최종적으로 '단어 생성이 끝이 났다'라는 end of sentence 토큰이 예측될 때까지 생성 과정을 반복적으로 수행
- Encoder와 Decoder는 서로 parameter가 공유되지 않는 별개의 RNN을 사용한다
- 입력 sequence의 길이와 상관없이 각 time step마다 생성되는 hidden state vector는 같은 dimension으로 이루어져 있음
- 그래야만 output vector 다시 input vector로 사용이 가능하다
- 축적해야 하는 정보는 time step이 더 길어짐에 따라서 점점 더 많아지지만 정보는 결국 동일한 dimension으로 이루어진 vector 안에 어떻게든 욱여 담아야 한다
- 즉, Sequence가 길어질 때 정보를 유실하는 경우가 많다
- Seq2Seq with Attention
- Solution
- Bottleneck problem or 병목 현상을 해결하기 위해 Attention이라는 추가적인 Module이 기존 Seq2Seq model에 도입
- 입력 Sequence로서 어떤 한자로 된 문장이 주어져서 이를 영어로 번역하는 task
- 입력 Sequence에 주어지는 각각의 한자 워드를 encoder에서 encoding을 한 후
- Decoder가 encoder의 마지막 hidden state vector & encoding된 hidden state vector 중에 필요로 하는 vector를 가져가서 time step의 prediction에 직접적으로 사용
- Decoder의 각 time step에서 추가적으로 Encoder에 있는 여러 hidden state vector로부터 필요로 하는 정보를 취사선택해서 추가적인 입력으로써 예측에 사용하는 형태로 동작
- decoder의 첫 번째 time step의 hidden state vector를 가지고 4개의 word에 대한 encoder의 각 time step별 hidden state vector와의 유사도를 계산
- 실제 Decoder의 첫 번째 time step에서 가장 필요로 하는 encoder time step의 hidden state vector와 높은 유사도를 띄도록 model이 전체적으로 학습이 됨
- 유사도: 초록색 vector와 빨간색 vector가 내적을 함으로써 그 scalar 값이 클수록 관련성이 높은 정보라고 생각함
- 네 개의 서로 다른 encoder hidden state vector와 특정 decoder hidden state vector가 내적한 네 개의 값을 가지고 softmax layer를 통과시켜 어떤 확률 vector를 얻게 됨
- 확률 벡터를 encoder hidden state vector에 가중치로 반영하여 네 개 encoder hidden state vector의 가중합을 뽑아냄으로써 attention model의 output을 생성
- Encoder hidden state vector의 가중합에 해당하는 vector를 decoder의 output layer에 추가적인 입력으로 사용
- Total Process
- 1) Decoder의 각 time step의 hidden state vector를 기준으로
- 2) Encoder의 모든 hidden state vector와 내적하여 유사도를 구하고 거기에 softmax를 취하여 나온 상대적인 합이 1인 형태인 가중치 vector를 구하고
- 3) 각 가중치를 각각의 encoder의 hidden state vector에 반영하여 encoder hidden state vector의 가중합을 attention model의 결과값으로 주어 추가적인 입력으로 설정
- 총 8개의 dimension으로 이루어진 입력 vector(decoder 이전 time step의 hidden state vector + 추가적인 입력) 가 output layer에 input으로 주어짐
- decoder time step이 진행됨에 따라 그때그때 만들어지는 decoder hidden state vector를 새로운 유사도를 측정할 기준이 되는 vector로 사용
- 새로운 내적을 통한 유사도 vector를 뽑고 다시 softmax layer를 취해서 상대적인 가중치를 뽑고 그 가중치를 encoder hidden state vector에 적용해서 최종 attention output을 얻게 된다
- 이를 두 번째 time step에 추가적인 입력 vector로서 output 단어를 예측하게 됨
- Advantages
- 기존 Seq2Seq Model의 병목현상을 해결
- NMT(기계 번역 task)의 성능을 끌어올리게 됨
- Gradient Vanishing 문제를 해결
- Attention Module이 없었다면 매우 긴 path: Decoder -> Encoder
- 추가적인 path를 생성: encoder의 hidden state vector까지 갈 수 있는 지름길을 제공
728x90