Lecture3 | RNNs
Full Stack Deep Learning 3강을 듣고 정리한 글입니다. 영어 강의라서 해석이 모호한 부분은 강의 내용을 영어 그대로 인용했습니다.
1. Sequence problems
Sequnce Model
- sequence model이란 연속적인 입력(sequential input)으로부터 연속적인 출력(sequential output)을 생성하는 모델이다
- 모델에 따라 입력과 출력이 모두 sequence data일 수도, 입력과 출력 중 하나만 sequence data일 수도 있다
- 여러 sequence model은 다음과 같은 sequence data들을 다루고, sequence problem의 대표적인 예시로 기계번역(machine translation)과 챗봇(chatbot)이 대표적이다
Types of sequence problems
- one-to-many
- 일대다 모델
- 하나의 입력에 대해 여러 개의 출력을 가지는 경우
- 대표적으로 Image captioning
- many-to-one
- 다대일 모델
- 시퀀스 입력에 대해 하나의 출력을 가지는 경우
- 입력 문서가 긍정적인지 부정적인지를 판단하는 sentiment classification
- many-to-many
- 다대다 모델
- 시퀀스 입력에 대해 시퀀스 출력을 하는 경우
- 챗봇이나 번역기
Why not use feedforward networks?
- 이런 시퀀스 데이터를 다루는 모델을 만들 때 feedforward 네트워크를 사용하지 않는 이유는?
- 가장 기본적인 many-to-many sequence problem에 대해 feedforward 네트워크를 사용한다고 할 때, 다음과 같은 3가지 문제점이 있다
- Problem1: variable length inputs
- 여러 개의 인풋 데이터를 한번에 처리해야 하는데, 각각의 인풋 데이터의 길이가 다를 수 있다
- max length에 맞춰 padding을 함으로써 인풋 데이터의 길이를 맞출 수 있긴 하다
- Problem2: memory scaling
- Memory requirement scales linearly in number of timesteps
- sequence의 max length가 커짐에 따라 곱해야 하는 행렬의 크기 또한 증가하게 되고, 이 계산을 하기 위한 메모리 요구사항이 시간 스텝의 수에 따라 선형적으로 증가한다
- 따라서 feedforward 네트워크는 sequence data를 인풋으로 받아들이기에 적절하지 않다
- Problem3: overkill
- 모델은 입력으로부터 매핑한 모든 행렬의 차원에 대해 학습을 하게 된다
- 시간이 지남에 따라 반복되는 패턴들을 읽어내지 못하고, 각각의 인풋 시퀀스 데이터에서 독립적으로 패턴을 읽어낸서 data inefficient한 문제가 있다
- this ignores some fundamental nature of the problem some structure that we expect the inputs of this model have which is patterns that repeat themselves over time
2. RNNs
Core idea of RNN
- 위에서 feedforward network로 시퀀스 데이터를 다룰 경우 생기는 여러 문제에 대해 알아봤다
- 시퀀스 입력들을 처리하기 위해 고안된 모델을 sequence model이라고 하고, 그중에서 RNN은 딥러닝의 가장 기본적인 시퀀스 모델이다
- Recurrent Neural Network의 약자로 순환 신경망을 뜻하고, 입력과 출력을 시퀀스 단위로 순차적인 정보를 처리한다
- 기존의 feedforward한 신경망들은 모든 입력을 독립적으로 가정한다면, RNN은 그렇지 않다. 예를 들어 문장에서 다음에 나온 단어를 예측하고자 한다면 이전에 나온 단어들을 아는 것이 필요하다
- RNN이 recurrent하다고 불리는 이유는 동일한 태스크를 한 시퀀스의 모든 요소마다 적용하고, 출력 결과는 이전의 계산 결과에 영향을 받기 때문이다
- 즉 RNN은 현재 계산된 결과에 대한 “메모리” 정보를 가지고 있다고 볼 수도 있다
- Instead of having a single massive matrix that you multiply that has independent weights for every position in the sequence, we’re going to do stateful computation
- output that your model produces depends on the input to the model at the current time step
- x_t는 시간스텝(time step) t에서의 입력값이다
- h_t는 t에서의 hidden state이다. 네트워크의 “메모리” 부분으로서, 이전 시간스텝의 hidden state(h_t-1)와 현재 시간스텝의 입력값(x_t)에 의해 계산된다.
- y_t는 t에서의 출력값이다
- hidden state는 네트워크의 메모리라고 할 수 있다. h_t는 과거의 시간 스텝들에서 일어난 일들에 대한 모든 정보를 담고 있고, 출력값 y_t는 오로지 현재 시간 스텝 t의 메모리에만 의존한다.
- 각 layer마다 파라미터 값들이 전부 다 다른 기존의 일반적인 DNN과 달리, RNN은 모든 시간 스텝에 대해 파라미터 값(weight)들을 전부 공유한다. RNN이 각 스텝마다 입력값만 다를 뿐 거의 똑같은 계산을 한다.
RNN in code
RNN for many-to-one
- RNN의 many-to-one은 sequence of words를 sentiment로 분류하는 sentiment classification에 가장 많이 활용된다
- 자연어 처리 분야에서 어떤 문장 또는 단어를 RNN으로 인코딩하고 해당 문장 또는 단어의 sentiment를 classification하는 방식으로 활용된다
- RNN이 토큰인 단어 자체를 처리할 수는 없으므로 토큰을 숫자 벡터로 바꿔주는 Embedding layer가 존재한다
- Embedding layer가 각각의 토큰을 RNN이 처리할 수 있도록 만들어주면, RNN은 토큰을 순서대로 읽어들이고 마지막 토큰을 읽었을 때 나온 출력과 정답 간의 loss를 계산한다. 그리고 back prop을 하여 RNN을 학습시킨다.
RNN for one-to-many
- RNN의 one-to-many는 Image captioning(image → sequence of words)에 활용된다
- 고정 크기 입력과 시퀀스 출력
- encoder로 CNN을 사용하여 입력 이미지를 받아 요약된 이미지 정보가 있는 vector를 출력한다
- CNN의 출력 벡터는 RNN의 초기 step의 입력으로 들어간다
- RNN에서는 캡션에 사용할 문자들을 만들어낸다
- 마지막에
END
(stop character)라는 토큰으로 문장의 끝을 알려주고,END
가 샘플링되면 모델은 더이상 단어를 생성하지 않고 이미지에 대한 캡션이 완성된다
RNN for many-to-many
- RNN의 many-to-many는 기계번역(machine translation)에 활용된다
- Many-to-many와 Many-to-one의 차이는 Many-to-one의 경우 각 time step에서 모두 output이 나오는 것이 아니라, 마지막 token이 입력되었을 때, output이 나오는 반면, Many-to-many는 매 time step마다 모두 output이 나와서 각각의 loss를 계산하여 미니배치들의 loss 평균을 낸다. 이를 sequence loss 라고 한다. 이 sequence loss를 back prop하여 학습하는 구조이다.
3. Vanishing gradients and LSTMs
RNN Desiderata (필요조건)
- Goal: handle long sequences
- connect events from the past to outcomes in the future
- Long-term dependencies, 긴 기간의 의존성
Vanilla RNN
- can’t handle more than 10-20 timesteps
- loner-term dependencies get lost → Vanishing gradient 때문!
- RNN은 특정 정보와 그 정보를 사용하는 지점 사이의 거리가 멀 경우 back prop시 그래디언트가 점점 줄어들어 학습 능력이 크게 저하되는 문제가 있다. 이를 Vanishing gradient problem 이라고 한다.
- 위 문제를 극복하기 위해서 고안 된 것이 바로 LSTM 이다
LSTM
- Idea: use a compute_next_h that preserves gradients
- LSTM은 RNN의 hidden state에 cell-state를 추가한 구조이다
- LSTM도 RNN과 똑같이 체인과 같은 구조를 가지고 있지만, 각 반복 모듈은 다른 구조를 가지고 있다. 단순한 neural network layer 한 층 대신에, 4개의 layer가 특별한 방식으로 서로 정보를 주고 받도록 되어있다
- LSTM의 위와 같은 구조 덕분에 state가 꽤 오래 경과하더라도 그래디언트가 비교적 잘 전파된다
- 위 그림의 노란색 박스는 neural network layer를 나타낸다
- LSTM의 핵심 아이디어는 이전 단계의 정보를 memory cell에 저장하여 흘려보내는 것이다
- 현재 시점의 정보를 바탕으로 과거의 내용을 얼마나 잊을지 곱해주고, 그 결과에 현재의 정보를 더해서 다음 시점으로 전달한다
- LSTM의 작동원리를 구현하게 하는 세 개의 게이트가 있다
- 1) Forget gate: decide what parts of old state to forget
- 과거의 정보를 얼마나 잊을지를 결정하는 게이트
- 현 시점의 정보와 과거의 hidden state 값에 각각 가중치를 곱하여 더한후 sigmoid 함수를 적용하여, 이 출력 값을 직전 시점의 cell에 곱한다
- sigmoid는 0과 1 사이의 값으로 1에 가깝다면 과거의 정보를 많이 활용할 것이고, 0에 가깝다면 과거의 정보를 많이 잃게 된다
- 2) Input gate: decide how to update the cell state
- 현재의 정보를 얼마나 기억할지를 결정하는 게이트
- 앞에서 계산한 forget gate와 input gate의 값을 이용하여 memory cell에 저장한다
- 3) Output gate: decide what to output as hidden state
- memory cell을 현 시점의 은닉층 값으로 출력할 양을 결정하는 게이트
4. Case study: Machine Translation
Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation (Wu et al., 2016) 논문 리뷰
- 모델의 구조
- encoder(8개의 LSTM) - attention - decoder(8개의 LSTM)
- 저자가 말한 기존 LSTM의 문제점과 해결방안
- Problem1: using single layer will underfit the task
- Solution: stacked LSTM layers
- Problem2: stacked LSTMs are hard to train
- Solution: residual connections
- Deep LSTM이 Shallow LSTM보다 좋은 성능을 낸다고 알려져 있지만, 이를 학습시키는 과정에서는 Deep한 구조때문에 Vanishing or exploding gradient 문제가 발생한다. 이를 해결하기 위해 residual connection 사용
- LSTM의 Output을 다음 LSTM의 Input으로 사용하는 과정에서 추가적으로 이전 Input을 더하는 방법이다
- Problem3: Too much information has to be encoded in the last timestep
- Solution: attention
- Key idea: Instead of compressing all past time steps into a single hidden state, give the neural network access to the entire history
- 입력 시퀀스의 길이가 긴 경우, 하나의 고정된 크기의 벡터에 모든 정보를 압축하려고 해서 정보 소실의 문제가 발생한다. 이를 위한 대안으로 입력 시퀀스가 길어질 때 출력 시퀀스의 정확도가 떨어지는 것을 보정해주기 위해 어텐션(attention) 기법을 사용한다.
- 어텐션의 기본 아이디어는 디코더에서 출력 단어를 예측하는 매 타임스텝마다, 인코더에서의 전체 입력 문장을 다시 한 번 참고한다는 것이다. 이때 해당 시점에서 예측해야 할 단어와 연관성이 높은 부분을 좀 더 집중(attention)해서 본다.
- Problem 4: LSTMs only consider backward context
- Solution: bidirectionality
- Key idea: Use one LSTM to process the sequence in forward order, the other in backward order
- Problem1: using single layer will underfit the task
Summary of GNMT approach
- Stacked LSTM encoder-decoder architecture with residual connections
- Attention enables longer-term connections
- To encode future information in the source sentence use a bidirectional LSTM
- Train using standard cross-entropy on a large dataset
- Speed up inference with quantization of weights
5. CTC loss
- CTC는 음성인식과 손글씨 인식 그리고 다른 시퀀스 문제들에서 딥 뉴럴 네트워크를 훈련시키는데 사용되는 알고리즘이다
- CTC는 학습데이터에 클래스 라벨만 순서대로 있고 각 클래스의 위치는 어디 있는지 모르는 unsegmented 시퀀스 데이터의 학습을 위해서 사용하는 알고리즘이다
6. Pros and Cons
Pros
- Encoder / decoder LSTM architectures can model arbitrary (one-to-many, many-to-one, and many-to-many) sequence problems
- Many successes in NLP and other applications
Cons
- Recurrent network training is not as parallelizable as FC or CNN, due to the
need to go in sequence - Therefore much slower!
- Also can be finicky to train
7. A preview of non-recurrent sequence models
Sequence data does not require recurrent models!
- WaveNet: A Generative Model for Raw Audio (van den Oord et al, 2016)
참고🔗
- https://wooono.tistory.com/241
- https://casa-de-feel.tistory.com/39
- https://aikorea.org/blog/rnn-tutorial-1/
- https://engineer-mole.tistory.com/23
- https://sonsnotation.blogspot.com/2020/11/10-recurrent-neural-networkrnn.html
- https://omicro03.medium.com/%EC%9E%90%EC%97%B0%EC%96%B4%EC%B2%98%EB%A6%AC-nlp-28%EC%9D%BC%EC%B0%A8-rnn-many-to-many-38b1a76a95be
- https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/
- https://dgkim5360.tistory.com/entry/understanding-long-short-term-memory-lstm-kr
- https://heiwais25.github.io/nlp/2019/06/25/GNMT/
- https://soyoung-new-challenge.tistory.com/19
'Deep Learning' 카테고리의 다른 글
[PyTorch] DALL-E 파이토치로 구현하기 (0) | 2022.07.28 |
---|---|
[Full Stack Deep Learning] Lecture 5 - ML Projects (0) | 2022.05.31 |
인공지능 모델 구현? 설계? 배포? (0) | 2021.11.15 |
논문 읽는 법 (0) | 2021.07.26 |
윈도우에 PyTorch 설치, 가상환경 만들기, GPU 설정 (0) | 2021.07.03 |