티스토리 뷰

 

"해당 포스팅은 Coursera 에서 수강한 Andew Ng 의 deep learning specialization 코스를 요약한 것입니다." 


이번 수업은 Sequence Model 에 대해 얘기하고, Sequence model 에 적합한 Recurrent Neural Network 에 대해서 배워본다. 

 

1. Sequence model 의 정의 

우선, Sequence model 이란 건 뭐고 왜 그게 필요한 거지? 

 

Sequence model 이란, sequence data 를 다루기에 적합한 모델을 의미한다. Sequence data 라는 건 연속적인 데이터를 의미하는데, 예를 들어 음성, 음악 (음의 연속), 텍스트, 비디오 등 다 연속적인 데이터이다. 

 

Sequence model 이란 이런 데이터를 다루기 위한 모델로, 인풋 데이터가 sequence 일 수도, 아웃풋 데이터가 sequence 일 수도, 아니면 둘 다 일 수도 있다. 

Input 이 seq  Output 이 seq  예시 
X Sentiment analysis 
Music generation 
Speech recognition 
Named Entity Recognition 
Machine transation 

2. Sequence data indexing

그럼 일단 앞으로 수식에 쓰일 index 에 대해서 한번 짚고 넘어가자. 

그동안 트레이닝 데이터에 대해서 얘기할 때, i 번째 data 에 대해서 $x^{(i)}$ 라고 로 표기했다. 근데 sequence 데이터에는 time index t 차 추가된다. 

예를 들어, 트레이닝 데이터 내 i 번째 데이터가 다음과 같은 text 라고 하자. 

"Harry Potter and Hermione Granger invented a new spell."

그럼 각 위치의 단어의 index 가 필요하고 다음과 같이 표기한다. $x^{(i)<t>}$ i 번째 데이터의 t 번째 단어. 

문장의 길이는 $T_x$로 표기하고 위의 예시가 i 번째 데이터라면 ${T_x}^{(i)} = 9$ 이 되는거임. 

 

$x^{(i)<t>}$, $y^{(i)<t>}$ , ${T_x}^{(i)}$, ${T_y}^{(i)}$ 를 기억해! 

 

그럼 이 단어들을 트레이닝 시키기 위해서는 어떤 식으로 numerical 하게 표현할 수 있을까? 이미지의 경우에는 pixel value 가 숫자이니까 그대로 가져다 쓸 수 있었는데, 단어는 어떻게 encoding 을 해야하지? 

 

3. Sequence data 의 대표적인 데이터 text ! 단어를 어떻게 표현할까? 

보편적인 방법 중에 하나인 one-hot encoding 방식을 알아보자. 

 

우리한테 10,000 개의 단어를 포함한 vocabulary 가 있다고 할 때, a, arron, .... zebra 까지 단어가 있으면 각각의 단어에 index 가 있는거다 1부터 10,000 까지. 이게 길이 10, 000의 벡터에 있다고 할 때 해당하는 단어만 1 로 표시하고 나머지는 0로 표현하는 게 one-hot encoding 방식이다. 

예를 들어 'a'  는 [1 0 0 0 0 .... 0 ] 이고, arron 은 [0 1 0 0 0 ... 0] 이런식으로. 보통 10, 000 은 작은 크기의 vocab 에 해당하고, commercial 한 use 의 경우 vocab 의 크기가 30 ~ 50, 000 정도 된다고 한다. 

 

4. RNN 기초 

왜 RNN 을 쓰는거지? (= 왜 Standard DNN 을 쓰지않는거지?) 

  1. Sequence data 의 Input 사이즈가 일정하지 않다. 

    Machine translation 의 input 의 경우, 각 문장마다 input size 다 다르기 때문에 정해진 크기의 데이터를 input 으로 받는 standard DNN 은 적합하지 않다. 물론, training 을 위해서 maximum length 를 정해놓고, 그보다 짧은 건 다 제로 패딩 할 수 있긴 함.  
  2. DNN doesn't share features learned across dofferent positions of text.
  3. 예를 들어, 문장 처음에 나온 Harry 가 사람의 이름이라는 걸 배웠다면, 문장 끝에 Harry 가 나와도 이게 사람의 이름이라는 걸 배우는 모델이 필요한데 DNN 으로는 이게 안 됨 (왜 안되는거죠..? 이해 잘 안 됨). Image 를 처리하기 위해 conv net 을 사용했을 때처럼, 이미지의 한 부분에서 배운 것을 generalize 해서 이미지의 다른 부분에서도 사용할 수 있도록 하고 싶은데, DNN 으로는 이게 안 된다는 거임.
    나름대로 이해하기 위해서 RNN 과 비교해서 생각해보면, 아무래도 RNN 은 각 time step 마다 같은 parameters 을 사용한다. 즉, 문장의 각 위치에 있는 단어들을 같은 weight 을 가진 layer 로 처리함. 결국 단어의 위치에 상관없이 모든 단어에 같은 parameters 를 사용하는거임. 반대로 DNN 은, 각각의 단어들이 다른 위치의 weight 를 사용하잖아 (각 weight matrix 의 특정 column 만 계산에 사용). 그러니까 결국은 position 을 뛰어넘는 features 는 배우기 어렵겠지. 
  4. 학습해야 할 Parameter 의 크기가 너무 크다. 
  5. 앞서 말했듯이 단어를 one-hot encoding 으로 표현하면 vocab 사이즈에 따라 10, 000 차원 혹은 그보다 큰 차원의 벡터가 인풋으로 주어진다. DNN 의 경우, 아래의 그림처럼, 각각의 unit 의 weight matrix 가 그에 따라 커지게 되고, units 의 개수가 많고, deep 한 network 일수록 학습해야 하는 parameters 가 굉장히 많아진다. 이미지 데이터를 사용하기 위해서 convolution network 를 써서 학습해야 하는 parameters 를 엄청나게 줄일 수 있었던 것처럼, 적절한 network 를 통해 학습해야 하는 parameters 의 개수를 획기적으로 줄일 수 있고, RNN 이 그런점에서 sequence data 를 다루기에 더 적합하다. 

 

RNN 의 특징 

  1. 왼쪽에서 오른쪽으로 데이터를 스캔한다. 
    current state 를 계산하기 위해 previous hidden state 를 current input 과 함께 pass 함. 이게 RNN 의 약점이기도 하다. 오직 information in earlier steps 만 고려하기 때문에, 현재 위치보다 오른 쪽에 위치한 단어는 고려못함. 예를 들어, He said, "Teddy Roosebelt was a great president" 와 He said, "Teddy bears are on sale" 같은 문장이 있을 때 Teddy 가 사람인지 아닌지 알기 위해서는 뒤에 나오는 president 나 bears 가 중요한 hint 가 되는데, 왼 -> 오로 데이터를 스캔하는 RNN 으로는 이 부분을 처리하기가 어렵다. (이를 보완하기 위해서 양방향 RNN 인 Bi-directional RNN 이 나오기도 했다). 
  2. Parameters for each time step are shared. 각 time step (예, 각 단어) 에 같은 parameters 를 사용한다. 
  3. Each prediction 을 내기 위해, 이전 time step 의 모든 input 사용.  

(좌) flattened RNN (우) folded RNN

5. RNN 계산 (forward propagation , backward propagation through time) 

Forward propagation 

 

$$a^{<1>} = g_{1}(W_{aa}*a^{<0>} + W_{ax}*x^{<1>} + b_{a}) \leftarrow tanh  \ \cdots \ (1) $$

$$y^{<1>} = g_{2}(W_{ya}*a^{<1>} + b_{y}) \leftarrow sigmoid \ \cdots \ (2) $$

 

1) 수식은 첫번째 activation $a^{<1>}$ 구하는 방법. 우선, 0 만 있는 vector 인 $a^{<0>}$ 와 첫번째 인풋인 $x^{<1>}$ 를 pass 해서 구한다. $W_{ax}*x^{<t>}$ 에서 아래 첨자 a 는 결과값으로 a-like quantity 를 계산하기 위해서 쓰인다는 의미이고, 아래 첨자 x는 여기에 x를 x-like quantity 를 곱한다는 것을 의미한다. 2) 수식도 마찬가지로 이해하면 된다.

 

좀 더 일반화 한 수식은 다음과 같다. 

 

$$a^{<t>} = g_{1}(W_{aa}*a^{<t-1>} + W_{ax}*x^{<t>} + b_{a})$$

$$y^{<t>} = g_{2}(W_{ya}*a^{<t-1>} + b_{y})$$

 

아래 그림을 보면, time step = 1 일 때, x<1> 를 인풋으로 사용하는데, a<0>는 그냥 0로 채워진 벡터이다 (previous time step 이 없으니까). 각 step 마다 $a^{<t-1>}$ 과 $x^{<t>}$ 를 사용해서 prediction 값인 $\hat{y}$ 를 구한다. 

위 수식을 더 간단하게 나타내보면 

$$a^{<t>} = g_{t}(W_{a}[a^{<t-1>}, x^{<t>}] + b_a)$$

여기서 $W_{a}$ 는 $W_{aa}$ 와 $W_{ax}$ 를 horizontal 하게 concatenate 한 벡터이고, $[a^{<t-1>}, x^{<t>}]$ 는 $a^{<t-1>}$ 와 $x^{<t>}$ 를 vertical 하게 stack 한 것임. 

$W_{a}$

 

$[a^{<t-1>}, x^{<t>}]$
결과적으로 이전 식과 같은 결과를 얻게 된다

Backward propagation through time

Backward propagation 은 $$L\:(loss)\rightarrow \hat{y} \underset{W_{y}, b_{y}}{\underbrace{\rightarrow}} a\underset{W_{a}, b_{a}}{\underbrace{\rightarrow}} x$$ 의 방향으로 진행된다. 그리고 $W_{y},\: b_{y},\:W_{a},\: b_{a} $ 가 update 된다. 

 

t 번째 time step 의 $y^{<t>}$ 의 loss (=loss for single prediction) 는 이전 처럼 cross entropy 사용. 

$$L^{<t>}(\hat{y}^{<t>}, {y}^{<t>}) = -y^{<t>} * log\:\hat{y}^{<t>} - (1-y^{<t>})*log\:(1-\hat{y}^{<t>})$$

 

loss for entire sequence 는 다음과 같다 

$$L(\hat{y}, {y}) =\sum_{t=1}^{T_{y}}L^{<t>}(\hat{y}^{<t>}, y^{<t>}) $$

 

아래 그림을 보면, 초록색 선은 각 forward propagation 에서 사용되는 parameters 을 보여주고, 파란 선은 forward propagation, 그리고 붉은 선은 backward prop 을 나타낸다. 

이전의 뉴럴넷에서 배운 것처럼 Loss 에서 y prediction, 거기서 activation, 그이후 x 까지 가는 vertical backprop 은 다를게 없는데 RNN back prop의 핵심은 $a_{<t>}$ 에서 $a_{<t-1>}$, $a_{<t-2>}$ 로 뻗어나가는 동그라미 쳐진 화살표 부분!! 이 horizontal backprop 때문에 RNN  의 backprop 은 Backpropagation through time 이라고 불리는 것! t index 를 줄여나가면서 backprop 이 진행된다. 

6. 다양한 RNN architectures 

초반에 sequence model 에는 다양한 타입이 있다고 얘기했다 (input 과 output 에 따라). 그리고 그에 따라 RNN 의 architecture 도 조금씩 다르다. 

 

우선 one to one 은 RNN 이 필요없고, 그냥 classic 한 neural net. 

  • One to many : music generation 을 예로 들 수 있는데, 음정이 하나 주어지면, 거기서부터 sequence output 생성. 
  • Many to one : sentiment analysis 가 대표적. 
  • Many to many 2)$T_{x} \neq T_{y}$ input length 와 output length 가 다른 경우 : Machine translation
    => 우선 input 을 모두 read 한 다음에, 그 다음에 차례로 prediction 생성 (인코더 - 디코더 !! 그동안 정확히 왜 어떤 NLP task 에서는 인코더 디코더가 쓰이고 안 쓰이는지 몰랐는데 그걸 이해시킨 갓 Andrew..  ) 
  • 1) $T_{x} = T_{y}$ 즉, input length 와 output length 가 같은 경우 : NER 
    => each time step 에서 각 input 에 대해 prediction 생성.  

 

7. Language Model 과 Text generation 

석사 논문부터 시작해서 숱하게 배운 내용이지만 직접 training 해본 적은 없어서 뭔가 찝찝했던 LM 을 드뎌 수업에서 다루게 됨.

 

Language model 이란? 

주어진 sequence 에 대한 probability 를 반환하는 모델! 

 

그 Probability 는 어떻게 구하는데?

$$P(w_{1}, w_{2}, w_{3}) = P(w_{1})*P(w_{2}\:|\:w_{1})*P(w_{3}\:|\:w_{1},\:w_{2})$$

 

이 때, $P(w_{2}\:|\:w_{1})$ 란,  $w_{1}$ 가 previous word 로 주어졌을 때, $w_{2}$ 가 그 다음에 올 확률. 

 

구체적으로 training 은 어떻게 하는데? 

Training dataset 만들기  - Tokenization 

"Cats average 15 hours of sleep a day." 라는 문장이 있을 때 이 문장을 tokenize 한다. 마침표를 토큰으로 추가할지 안 추가할지는 선택사항이다. 각 문장이 끝날 때 마다 end of sentence 를 의미하는 <EOS> 토큰을 추가하는 것도 가능하다. 그리고 내가 가진 vocab 에 해당 해당 단어가 없는 경우에는 unknown 을 의미하는 <UNK> 를 사용한다. 

Training

1번째 time step 의 x 는 0 벡터 (문장의 시작이니까 아직 아무 것도 없음). 이 때 y prediction 은 어떤 단어가 문장의 처음으로 올 확률임. 

2번째 time step 의 x 는 $y^{<1>}$ 이다. 예를 들어 cats 가 $y^{<1>}$ 라고 할 때 y prediction 은 cats 이 주어졌을 때 어떤 단어가 올 확률을 계산한다. (궁금한 점. y prediction 은 그럼 vocab 내 모든 단어에 대해서 이 확률을 계산하는 건가? 그래야지 sigmoid 를 통해서 하나의 단어를 output 으로 할 수 있는거잖아.) 그리고 원래 문장은 $P(average | cats) = 1$ 이니까 여기에 대한 cross entropy loss 를 구하면 되겠지? 

어쨌든 LM 에서 y prediction 은 "probability" 임을 명심하자! 

 

근데 이렇게 training 시킨 LM 이 잘 작동하는지 인간의 입장에서 어떻게 확인할 수 있을까? LM 이 문장은 generate 하도록 만들어서 그 문장을 평가하는 거임. 그리고 이 과정을 sampling 이라고 한다. 

 

이 sampling 을 어떻게 하냐면, 

time step = 1 일 때, 0 vector 를 주고 단어를 생성하게 한다 (= $\hat{y}^{<1>}$). 

time step = 2 일 때, 이전 스텝에서 생성한 $\hat{y}^{<1>}$ 를 $x^{<2>}$ 로 주고, $\hat{y}^{2}$ 를 생성하게 한다 (<=> training 할 때 와의 차이. training 할 때는 실제 문장의 input word 가 주어짐) 

 

여기서 이해가 안 됐던 부분이 바로 random sampling 이었음. $\hat{y}^{<1>}$ 값은 softmax 를 통과한 값이다. 즉, vocab 에 있는 각 단어에 대한 probabilty distribution 이다. 그런데, 문장을 생성할 때는 이 distribution 을 가지고 vocab 에서 random sampling 을 해서 distribution 을 단어로 generate 한다. 여기서 왜 random sampling 을 하는지 이 부분이 이해가 안 됐었음. 기껏 softmax 로 각 단어에 대한 probability 를 뽑아놓고, 단어를 생성할 때는 random 으로 pick 할거면 왜 softmax 하는거야? 그럼 이게 어떻게 LM 을 평가하는 지표가 될 수 있어? 라는 질문을 했던 나.. forum 글을 뒤져본 결과, random 이라는 건 여전히 probability law 에 지배를 받는다고 한다. 예를 들어 사과가 10개가 있는데, 그 중 하나꼴로 썩은 게 들어있다고 하자. 이 중에서 무작위로 사과를 뽑았을 때에도 여전히 실한 사과가 나올 확률이 더 높은 거임. 자세한 글은 다음 링크를 확인 (포럼 1, 포럼 2)

 

8. RNN 의 취약점: vanishing gradient

RNN 의 장점은 우선, current prediction 을 위해서 current input 뿐만이 아니라, 이전 step 의 정보들을 함께 사용한다는 점이었다. LM 을 만들 때는 특히나 이런 정보들이 상당히 중요하다. 한 예로, 영어에서 주어-동사 단수 복수 일치하는 문장을 만들기 위해서 앞서 나온 주어가 단수인지 복수인지에 대한 정보가 중요하다. 다음과 같이 주어가 동사가 멀리 떨어져 있는 경우는 어떨까? 

 

The cat, which always ate ... , was full. 

The cats, which always ate ..., were full. 

 

아쉽게도 이전 step 의 정보가 너무 멀리 있는 경우에 RNN 은 이 long term distances 를 잘 캐치하지 못한다고 알려져있다. 왜일까? 

답은 Vanihisng gradient 에 있다. 

 

앞서서 RNN 의 back prop 의 핵심은 horizontal backprop 즉, back prop through time 에 있다고 얘기했다. 근데 이 time step 의 간격이 너무 크면 earlier step 의 weight update 에 영향을 주기가 어렵다. 이건 그냥 이전에 배운 generic DNN 에서 vanishing gradient 가 일어나는 거랑 같은 문제다 (그래서 그걸 보완하기 위해 residuals 를 사용했었지). 그리고 standard DNN 과 마찬가지로 exploding gradient 문제도 생길 수 있는데 해결방법은 같다. threshold 를 설정해서 gradient 가 그 이상이면 그냥 threshold 값을 사용하는 것. (exploding gradient 가 발생할 경우 output 값으로 NaN (Not-a-Number) 값이 출력된다고 한다)  

 

9. Vanishing gradient 를 보완하기 위한 GRU, 그리고 LSTM 

GRU (Gated Recurrent Unit) 

 

앞서서 한 개의 RNN unit 을 식으로 나타내었다.  $$a^{<t>} = g_{1}(W_{aa}*a^{<t-1>} + W_{ax}*x^{<t>} + b_{a})$$

GRU 는 이걸 좀 변형한 거라고 할 수 있는데 핵심은 C 라는 변수로 표현되는 Memory cell에 있다. 핵심만 나타내기 위해서 simplifed 식을 보면 다음과 같다. 

 

$$\begin{align*}c^{<t>}&=a^{<t>}&\cdots \:(1)\\tilde{c}^{<t>} &= tanh\:(\:W_c\:[\:\:c^{<t-1>},\: x^{<t>}\:\:]+b_c\:)&\cdots\:(2)\\\gamma_u &= \sigma\:(\:W_u\:[\:c^{<t-1>},\: x^{<t>}\:]+b_u\:)&\cdots \:(3)\\c^{<t>}&=\gamma_u\:*\:\tilde{c}^{<t>} + (1-\gamma_u)\:*\:c^{<t-1>}&\cdots \:(4)\end{align*}$$

 

(1) time step t 에서 activation 값을 그대로 memory cell 값으로 취한다. 

(2) 그리고 이 memory cell 값을 replace 할 memory cell candidate $\tilde{c}^{<t>}$ 을 계산한다. 

(3) 그리고 update gate $\gamma_u $ 값을 계산한다. 이제 함수는 시그모이드 함수! 즉 0 ~ 1 사이 값을 반환한다. 이 때, $\gamma_u $ 는 벡터이므로 모든 값이 각각 0~1 사이의 값을 갖는 벡터를 반환한다. 

(4) update gate 인 $\gamma_u $ 값을 candidate memory cell 와 element-wise 곱하고 (update gate 와 candidate memory cell 의 벡터는 같은 크기여야 함), 1-$\gamma_u$ 를 previous memory cell $c^{<t-1>}$ 와 element-wise 곱해서 그 값으로 current memory cell 값을 replace 한다.

 

이제 이 GRU 가 왜 vanishing gradient를 해결하기에 좋은지 보려면 (4) 를 보면 된다. 

Update gate 값에 따라서 $c^{<t>} = c^{<t-1>} $ 가 가능하다. 그래서 time step 의 간격이 커지더라도 previous steps 의 information 이 오래 기억될 수 있고, 따라서 backprop 으로 값을 update 할 수 있게된다. 

 

GRU 의 핵심을 정리하면 다음과 같다. 

  1. $a^{<t>}$ 에서 출발하는 memory cell 값. 이 값은 update gate 에 따라 candidate memory cell 로 교체된다. 
  2. memory cell dimension  = update cell dimension 이 둘의 elememt wise 곱으로 이전의 기억을 기억할 수도 update 할 수도 있다. 즉, memory cell 에 위치한 각 값에 대해서 update gate 이 어떤 값은 그대로 가져가고, 어떤 값은 update 가 가능하다는 뜻. 예를 들어, memory cell 의 i 번째 위치에는 단수, 복수를 표현하는 information 이 위치한다고 하자 (단수 = 0, 복수 =1 로 표현). 동일 위치의 update gate 값이 1이면 해당 정보는 새롭게 update 된다. 반대로, j 번째 위치의 벡터는 content 를 나타내는 값이라고 하자. j 위치의 update gate 값이 0이면 해당 정보는 이전 그대로 유지되고, update 되지 않는다. 

 

Recurrent unit 을 표현하는 데는 아래와 같은 그림이 자주 사용되는데, 사실 설명없이 그림만 등장하면 이해하기 어렵다. 아래 그림을 아주 단순하게 설명하면 이렇다. 

1) $x^{<t>}$ 값과 $c^{<t-1>}$ 값이 각각 candidate memory cell 과 update gate 를 계산하기 위해서 사용된다. 

2) candidate memory cell 과 update gate 가 combine 된 값을 가지고 

3) current step 의 activation 즉, memory cell 로 쓰기도 하고 또 softmax 에 통과시켜 y prediction 을 얻기도 한다. 

 

 

페이퍼에 따라 각각 다른 변수를 쓰기도 하지만, 내용은 같다.

LSTM 

GRU 보다 조금 더 강려크한 LSTM! 

GRU 와 LSTM 의 차이! (=LSTM 의 특징)  

  1. LSTM 은 좀 더 명확하게 $a^{<t-1>}$ 을 사용한다 (GRU 는 memory cell 인 c 사용). 
  2. LSTM 은 3개의 gate 가 있다 (update gate 는 GRU 와 공통적이지만, forget gate 와 output gate 가 추가됨). GRU 은 그냥 $1-\gamma_u$ 를 썼지만 LSTM 은 forget gate 를 쓴 것을 볼 수 있음 
  3. LSTM 는 output gate 를 사용해서 $a^{<t>}$ 계산 (<=> GRU 는 $a^{<t>} = c^{<t>}$

앞서서 GRU 보다 LSTM 이 더 강려크하다고 했는데, 아래 그림의 빨간 라인을 따라가면 이해하기 쉽다. earlier step 의 memory cell 이 곱하기와 더하기만 거쳐서 current memory cell 까지 그대로 pass 되는 것을 볼 수 있다. 

Andrew Ng 의 종합결론: 

GRU 는 simpler, faster 하지만 충분히 robust 하고 많은 후속 모델들을 낳았다 (조상급..) LSTM 보다 가벼워서 요새 다시 base model 로 인기가 느는 중. 

LSTM 은 stronger. 그리고 한 때 가장 많이 사용하는 base model 이기도 했죠.. 

 

10. Bidirectional RNN

앞서 말했듯이, uni-directional RNN 은 단점은 current time step 이후로 나오는 단어들의 정보는 prediction 에 포함되지 않는다는 것! 그래서 이걸 극복하기 위해 Bidirectional 을 도입. 

Key 순서는 다음과 같다.

  1. Input sequence (x1, x2, x3... xt) 가 input 으로 주어진다.  
  2. $\overrightarrow{a}^{<1>}$, $\overrightarrow{a}^{<2>}$, $\overrightarrow{a}^{<3>}$ ... $\overrightarrow{a}^{<t>}$ 순으로 activation 계산
  3. $\overleftarrow{a}^{<t>}$, $\overleftarrow{a}^{<t-1>}$, ..., $\overleftarrow{a}^{<2>}$, $\overleftarrow{a}^{<1>}$ 순으로 activation 계산
  4. 2, 3 에서 계산된 activation 을 가지고 $\hat{y}$ 계산 

우선 forward propagation 중에 left to right (2번) 이 먼저 계산되고, right to left 가 계산되기 때문에 Acyclic 하다고 한다. 

이 구조의 단점 : 어떤 지점에서든 prediction 을 하기 위해서는 entire sequence 가 처리될 때까지 기다려야 한다. 예를 들어, $\hat{y}^{<2>}$ 를 계산하려고 한다면, $\overrightarrow{a}^{<2>}$ 와 $\overleftarrow{a}^{<2>}$ 가 계산될 때까지 기다려야 하는데, 그러려면 결국 entire sequence 의 activation 이 계산되어야 함. 그렇기 때문에 real time speech recognition 같은 경우에는 적합하지 않다. 화자가 speech 를 끝날 때까지 기다렸다가 해야되니까. 

 

11. Deep RNN 

여태까지 한 개의 layer 만으로 RNN 을 만드는 방법을 배워봤다면 여러 개의 layer 로 만드는 Deep RNN 도 배워봐야지. $a^{[2]<3>}$ 는 2번째 layer 의 3번째 time step activation. 이 부분을 계산하려면 아래 슬라이드처럼 $a^{[2]<2>}$, $a^{[1]<3>}$ 이 필요하다 (unidirectional 기준). 

근데 RNN 은 connection in time (그래프에서 horizontal connection) 을 계산하기 위해서 activation 이 순차적으로 계산되기 때문에 상당히 computationally heavy 한 계산이다. Ng 는 RNN 은 3겹만 쌓아도 많다고 그랬음. 그래서 실제로 y prediction 을 output 하기전에, vertical connection 만 있는 unit 을 연결해서 쓰는 경우가 많다고 한다. 

중요! 

명심할 것 : RNN 에서는 같은 layer 내에서는 같은 parameter 를 share 한다는 점! 그러니까 $a^{[2]<2>}$ 을 계산할 때도, $a^{[2]<3>}$을 계산할 때도 모두 $W^{[2]}$, $b^{[2]}$ 가 쓰이는 거임! 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함