독서/밑바닥부터 시작하는 딥러닝 2

[밑바닥부터 시작하는 딥러닝 2] Chapter 5. 순환 신경망(RNN)

Jesse 2024. 7. 23. 21:56

5.1 확률과 언어 모델

윈도우 크기가 1인 CBOW 모델의 사후 확률 모델링

 

좌우 비대칭으로도 윈도우 크기 설정 가능(ex:왼쪽 2, 오른쪽 0)

- 위의 사후 확률을 어떻게 구할 수 있을까?
- CBOW에서는 맥락의 크기를 특정 값으로 한정하여 근사적으로 나타낼 수 있다

여기서는 왼쪽 2개 단어로 한정
2층 마르코프 연쇄(Markov Chain: 미래의 상태가 현재 상태에만 의존해 결정되는 것)
-> 결국 특정 길이로 고정, 긴 맥락이 필요한 문제에 제대로 된 답을 도출 못함, 맥락 크기를 키울 수는 있으나 맥락 안의 단어 순서가 무시된다(bag-of-words)

일반 CBOW 모델: 은닉층에서 더해지므로 순서 무시한다

5.2 RNN이란

"순환하는 신경망"

닫힌 경로 필요 -> 데이터가 순환하면서 정보가 끊임없이 갱신 + 과거 정보 기억

시계열 데이터: 시간 방향으로 데이터 나열

현 계층으로의 입력 + 전 계층의 출력을 입력 받는다

RNN 계층: 상태를 가지는 계층, 메모리가 있는 계층 / h(t): 은닉 상태, 은닉 상태 벡터

Recursive Neural Network: 트리 구조 데이터를 처리하기 위한 신경망

시간 방향으로 펼친 신경망의 오차역전파법 -> BPTT(Backpropagation Through Time)
- 시계열 데이터의 시간 크기가 너무 크면 계산량과 메모리 사용량 등 문제
- 계층이 길어짐에 따라 기울기 값이 조금씩 작아져 역전파되기 전에 0이 되어 소멸 가능
-> Truncated BPTT

순전파의 연결은 끊어지지 않고(데이터를 시간 순서대로 입력해야) 연전파의 연결만 끊어진다, 한 블록 안에서만 역전파 수행하면 된다

  • Truncated BPTT 미니배치 학습
  • 데이터 입력 시작 위치를 각 미니배치의 시작 위치로 이동, 데이터를 순서대로 입력하다가 끝에 도달하면 다시 처음부터 입력

 

 

5.3 RNN 구현

가로 방향으로 성장하는 신경망 구현한다

5.3.1 RNN 계층 구현
- 은닉 상태 h 계산 순전파 및 역전파(총 3개의 연산:MatMul,+,tanh 로 구성)

5.3.2 Time RNN 계층 구현

  • Time RNN 계층에서 다음 블록으로 역전파의 연결은 끊어져있지만 순전파 연결은 이어져있으므로 은닉 상태를 인스턴스 변수 h에 저장해서 다음 블록에 전달한다
  • 은닉 상태 유지 여부에 대한 stateful 인수 필요하다

5.4 시계열 데이터 처리 계층 구현

Time 계층 구현

  • RNNLM(RNN Language Model): RNN을 사용한 언어 모델
    위와 같이 Embedding(단어 id를 단어 벡터로 변환), RNN 계층에서 출력된 은닉 상태가 Affine, softmax함수를 거쳐 확률을 출력하고 손실을 계산하여 학습 및 갱신한다
  • 시계열 데이터 T개를 한꺼번에 처리하는 Time 계층들
  • RNN 계층이 과거에서 현재로 데이터를 계속 흘려보내줌으로써 과거의 정보를 인코딩해 기억할 수 있음 -> RNNLM이 과거 기억 + 다음 예측이 가능해진다
  • 손실 계산: 데이터 1개당 평균 손실 계산

5.5 RNNLM 학습과 평가

Truncated BPTT로 학습

초기화: RNN 계층, Affine 계층에서 Xavier 초기값 사용

  • 언어 모델의 출력: 과거 단어로부터 다음에 출현할 단어의 확률분포
  • 언어 모델의 예측 성능 평가 척도: perplexity(혼란도)
  • perplexity는 (데이터 수가 하나일 때 정확히) 확률의 역수 -> 분기수(number of branches)로 이해 가능, 다음에 취할 수 있는 선택사항의 수
  • 입력 데이터가 여러개일 경우 다음과 같이 계산
  • perplexity가 작을수록 좋은 예측 성능을 갖는다.

RNN 계층을 이용한 조건부 언어 모델은 이론적으로는 그때까지 등장한 모든 단어의 정보를 기억할 수 있다

5.6 정리

  • RNN은 순환하는 경로가 있고 이걸 사용해서 은닉 상태를 기억
  • 긴 시계열 데이터를 학습할땐 데이터를 블록 단위로 모으고 BPTT에 의해 학습된다