Recurrent Neural Networks
Why Sequence Models?
Speech recognition, music generation, Sentiment classification, DNA sequence analysis, machine translation, video activity recognition, Name entity recognition 등 sequential data를 사용하는 task들이 있다.
Notation
Superscirpt \( ^{<t>} \) : t\( ^{th} \) element of a sequence
\( T_x \), \( T_y \): the number of a sequence
Representation words by classes (one-hot)
Recurrent Neural Network Model
문장을 인풋이나 아웃풋으로 가지고 싶다고 할 때, 당연히 인풋과 아웃풋 길이는 example마다 다를 것이다.
또한 이제까지 배운 일반적은 model의 경우 같은 단어임에도 불구하고 다른 위치 때문에 feature가 공유되지 않는 문제점이 있다.
따라서 RNN이 필요하다.
일반적으로 RNN은 현재와 이전에 나온 단어들만 반영하는 문제가 있는데 이를 보완한 BRNN이 있다.
\( a^{<t>} = g( W_{aa} a^{<t - 1>} + W_{ax} x^{<t>} + b_a) = g( W_a [ a^{<t - 1>}, x^{<t>} ] + b_a) \)
\( \hat{y}^{<t>} = g( W_{ya} a^{<t>} + b_y) \)
Backpropagation Through Time
순차적으로 다음 단어를 계속해서 예측하기 때문에 backpropagation도 시간에 따라 반대방향으로 진행된다.
Different Types of RNNs
\( T_x = T_y \), machine translation -> many-to-many
Sentiment classification -> many-to-one
이전에 배운 architecture -> one-to-one
Music generation -> one-to-many
Language Model and Sequence Generation
Language model은 어떤 조건(과거에 나온 단어들의 sequence)상에서 현재 단어가 나올 확률을 계산한다.
Sampling Novel Sequences
단어 단위가 아닌 character-level language model도 있다.
장점은 고유명사같은 단어도 unknown token으로 표현하지 않아도 된다는 점이다.
단점은 sequence가 길어진다.
Trained network에서 문장 하나를 sampling 하는 것은 간단한데 원래의 language model에서는 정답인 previous word를 input으로 넣어줬다면 sampling을 할 때에는 그전에 output으로 나온 단어를 다시 현재의 input으로 넣어준다.
Vanishing Gradients with RNNs
RNN에서도 vanishing gradient가 일어나는데 이 때문에 long-term dependency를 재대로 기억하지 못한다.
당연히 Exploding gradient도 일어날 수 있는데 gradient clipping이라는 방법으로 gradient scaling을 통해 이를 막을 수 있다.
Vanishing gradient를 처리하는게 exploding gradient 보다 더 어렵다고 한다.
Gated Recurrent Unit (GRU)
RNN Unit : \( a^{<t>} = g(W_a[a^{<t - 1>}, x^{<t>}] + b_a) \)
In GRU, c = memory cell ( \( c^{<t>} = a^{<t>} \) )
\( \tilde{c}^{<t>} = \text{tanh}(W_c [c^{<t - 1>}, x^{<t>}] + b_c ) \)
\( \Gamma_u = \sigma(W_u [ \Gamma_r * c^{<t - 1>}, x^{<t>} + b_u) \) (u: update) (in range 0 - 1)
\( \Gamma_r = \sigma(W_r [ c^{<t - 1>}, x^{<t>} ] + b_r) \)
\( c^{<t>} = \Gamma_u * \tilde{c}^{<t>} + (1 - \Gamma_u) * c^{<t - 1>} \)
\( a^{<t>} = c^{<t>} \)
\( \Gamma_r \)을 통해서 현재 output의 candidate를 계산할 때 과거 output이 얼마나 영향을 주는지 결정한다.
\( \Gamma_u \)를 통해서 과거 output을 그대로 가져갈 것인지 현재 output candidate를 통해 update 할 것인지를 결정한다.
Long Short Term Memory (LSTM)
\( \tilde{c}^{<t>} = \text{tanh}( W_c [ a^{<t - 1>}, x^{<t>} ] + b_c ) \)
\( \Gamma_u = \sigma( W_u [ a^{<t - 1>}, x^{<t>} ] + b_u ) \) (update)
\( \Gamma_f = \sigma( W_f [ a^{<t - 1>}, x^{<t>} ] + b_f ) \) (forget)
\( \Gamma_o = \sigma( W_o [ a^{<t - 1>}, x^{<t>} ] + b_o ) \) (output)
\( c^{<t>} = \Gamma_u * \tilde{c}^{<t>} + \Gamma_f * c^{<t - 1>} \)
\( a^{<t>} = \Gamma_o * \text{tanh} c^{<t>} \)
이러한 LSTM의 변형으로 gate value에 \( c^{<t - 1>} \)를 추가하는 peephole connection라는 것이 있다.
Bidirectional RNN
앞의 문맥으로만 현재의 단어가 어떤 의미인지를 알 수 없는 경우가 있다.
(He said, "Teddy ...", bear? or Roosvelt?)
그래서 양 방향으로 propagation을 할 필요가 있고 그러한 model이 bidirectional RNN이다.
Deep RNNs
RNN을 쌓아서 deep RNN을 만들 수 있다.
당연하지만 기본적인 RNN 대신 GRU, LSTM, Bidirectional RNN을 사용할 수도 있다.
'Google Machine Learning Bootcamp 2022 > Sequence Models' 카테고리의 다른 글
3. Sequence Models & Attention Mechanism #2 (0) | 2022.08.15 |
---|---|
3. Sequence Models & Attention Mechanism #1 (0) | 2022.08.15 |
2. Natural Language Processing & Word Embeddings #3 (0) | 2022.08.12 |
2. Natural Language Processing & Word Embeddings #2 (0) | 2022.08.12 |
2. Natural Language Processing & Word Embeddings #1 (0) | 2022.08.12 |
댓글