> For the complete documentation index, see [llms.txt](https://lswkim322.gitbook.io/til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lswkim322.gitbook.io/til/til-ml/boostcamp/u-stage-nlp/03-recurrent-neural-network-and-language-modeling.md).

# (03강) Recurrent Neural Network and Language Modeling

> RNN을 활용하는 다양한 방법과 이를 이용한 Language Model을 학습\
> RNN을 이용한 Language Model에서 생길 수 있는 초반 time step의 정보를 전달하기 어려운 점, Gradient Vanishing / Exploding 을 해결하기 위한 방법에 대한 복습
>
> **Further Reading**
>
> * [The Unreasonable Effectiveness of Recurrent Neural Networks](http://karpathy.github.io/2015/05/21/rnn-effectiveness/)
> * [CS231n(2017)\_Lecture10\_RNN](http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture10.pdf)

## 1. RNN (Recurrent Neural Network)

### 1.1. Basic Structure

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mjm8sW5xAHd1fIpyq59%2F-Mjm9pnWvz7aLulq6Rfg%2Fimage.png?alt=media\&token=35892571-29af-436c-be28-b1cd2a82efb6)

* RNN은 Sequential Data를 처리하기 위한 모델이다.
* Input Value $$x\_i$$와 Hidden Value(누적값) $$h\_i$$의 값이 다음 모델의 Input이 된다.

$$h\_t = f\_W(h\_{t-1}, x\_t)$$

* $$h\_{t-1}$$ : old hidden-state vector
* $$x\_t$$ : input vector at some time step
* $$h\_t$$ : new hidden-state vector
* $$f\_W$$ : RNN function with parameters W
* $$y\_t$$ : output vector at time step $$t$$ (해당시점의 $$h\_t$$를 바탕으로 최종 출력값을 구한다.)

※ 모든 layer 에서 같은 함수와 파라미터를 가진다.

$$h\_t = f\_W(h\_{t-1}, x\_t) \ h\_t = tanh(W\_{hh}h\_{t-1}+W\_{xh}x\_t) \ y\_t = W\_{hy}h\_t$$

* $$h\_t$$는 현재 input의 값($$W\_{xh}x\_t$$)과 지금까지의 누적 값($$W\_{hh}h\_{t-1}$$)의 합을 tanh 씌운 것이다.
* 구해진 $$h\_t$$값에 선형변환을 통해 output $$y\_t$$값을 구할 수 있다.

### 1.2. Types of RNNs

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mjm8sW5xAHd1fIpyq59%2F-MjmDj3_H2BD21DiS3tM%2Fimage.png?alt=media\&token=64b32c84-bb98-4995-ac61-d2251d93b528)

* **One to One**\
  Standard Neural Network, 일반 뉴런 네트워크\
  기본 분류
* **One to Many**\
  Image Caption Task
* **Many to One**\
  감정분석 Task, 모든 문장을 분석한 후 하나의 결과를 도출
* **Many to Many (make output when every input is trained)**\
  Machine Translation, 문장을 다 읽은 후에 번역을 진행
* **Many to Many**\
  단어별 품사 확인 Task

### 1.3. Character-level Language Model

Language Model 이란 주어진 문자를 바탕으로 다음 나타날 문자를  예측하는 Task이다. Character level의 모델을 예시로 확인해 보자.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mjm8sW5xAHd1fIpyq59%2F-MjmIUlCzbubDJcz7eoi%2Fimage.png?alt=media\&token=c522dab3-c206-45e3-a69f-28f699158452)

* 사전 구축 및 one-hot vector 로 표현
  * Vocab : "hello" -> \[h, e, l, o]
  * \[1, 0, 0, 0], \[0, 1, 0, 0], \[0,0,1,0], \[0,0,0,1]
* input layer로 부터 hidden layer의 계산
  * $$h\_t = tanh(W\_{hh}h\_{t-1}+W\_{xh}h\_t)$$
* output vector 를 구하기
  * $$Logit = W\_{hy}h\_t +b$$
  * output vector는 다음 input이 되어야하므로 input의 size와 동일하게 된다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mjm8sW5xAHd1fIpyq59%2F-MjmLRQIzMWRfMmk-MvX%2Fimage.png?alt=media\&token=c1430bd5-ea5f-45e0-a9d2-e2d2a5ee8f96)

* 위와 같은 학습 방법으로 첫 문자 "h" 만으로 다음 단어를 계속해서 예측가능한 구조가 되었다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mjm8sW5xAHd1fIpyq59%2F-MjmLq-uiwgJpF-h2Y7X%2Fimage.png?alt=media\&token=8b3b1614-e306-46a9-b6e1-9c72444840aa)

* 위는 세익스피어 글의 일부분인데 학습을 진행함에 따라 점차 문장에 가까운 글이 되어감을 확인 할 수 있다.

### 1.4. BPTT, Backpropagation through time

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mjm8sW5xAHd1fIpyq59%2F-MjmMV0PBMgLY5MgBOoK%2Fimage.png?alt=media\&token=6dc53422-fab9-48b1-a94f-1f8c862d01a2)

* 역전파를 통해 학습이 진행 되는데 문장의 길이가 길게 되면 필요한 메모리가 너무 커져 truncation으로 일정 부분만 잘라서 사용하게 된다.&#x20;

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mjm8sW5xAHd1fIpyq59%2F-MjmOXH4_ROIt9iFcOdd%2Fimage.png?alt=media\&token=97282f38-253e-43e3-bb9e-e6295942ea69)

* 위 예시는 특정한 hidden state vector의 dim을 고정해놓고, 그 해당 dim의 값의 변화를 음수는 파란색 양수는 붉은색으로 정도를 표시한 데이터 이다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mjm8sW5xAHd1fIpyq59%2F-MjmOtVWTts_yOptDjaV%2Fimage.png?alt=media\&token=058393aa-a6cd-4600-ac5d-36c90402d8cb)

* 하나 dim에 대해서 위와 같이 흥미로운 패턴을 지니는 것을 볼 수 있다. hidden state의 특정 dim이 따옴표가 열리고 닫힘에 대한 정보를 가지고 있음을 알 수 있다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mjm8sW5xAHd1fIpyq59%2F-MjmPXWu85E58URs7SQR%2Fimage.png?alt=media\&token=6322a7ec-f762-4ba3-a6d5-bda20b06ba97)

* Vanila RNN(Original RNN)은 사실 잘 사용되지 않는다. hidden state의 연산이 반복됨에 따라 같은 Matrix의 연산(등비수열)은 Gradient Vanishing, Exploding이 발생하여 학습이 잘 되지 않기 때문이다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FKL9EKXsn6HiIgWp3wTo7%2Fimage.png?alt=media\&token=56b52415-ba0c-49fc-8ff8-4dafd52152c4)

* 위 예시를 보면 $$w\_{hh}$$값 3이 반복적으로 곱해져 증폭 Gradient Exploding 문제가 발생한다.     &#x20;
* 이런 문제에 대한 해결책으로 LSTM을 다음시간에 배우기로 한다.

## 관련코드 Link

{% embed url="<https://drive.google.com/file/d/15f5FHsABTAYty5-8Dw5hAGYuB1b87J1Q/view?usp=sharing>" %}
