티스토리 뷰
RNN이란, 순환 신경망을 의미합니다.
기본적인 RNN 구조는 다음과 같습니다.
시계열 데이터 X_t = (x0, x1, ..., xt) 가 RNN 계층에 입력되어 h_t 가 출력됨을 나타내면 다음과 같습니다.

RNN의 출력은 다음과 같은 식으로 계산됩니다.

W_x : x를 h로 변환하기 위한 가중치
W_t : 다음 시각으로의 출력으로 변환하기 위한 가중치
b : 편향
BPTT : 시간 방향으로 펼쳐진 신경망의 오차역전파법
BPTT를 이용하면 RNN에 오차역전파법을 적용할 수 있습니다.
하지만 기본적인 BPTT를 이용하면 시계열 데이터의 크기가 커짐(길어짐)에 따라 메모리 사용량이 증가하고, 기울기가 불안정해지기 때문에 Truncated BPTT를 이용합니다.
Truncated BPTT : BPTT를 끊어서 계산한 것
신경망의 순전파는 그대로 두고, 역전파만 특정 길이로 잘라 블럭 별로 오차역전파법을 수행하는 것이 Truncated BPTT 입니다.
TimeRNN : 이 책에서는 RNN을 T개로 묶은 것을 TimeRNN이라 합니다. 마찬가지로 다른 데이터 또한 묶어서 표현할 때 Time을 붙혀 씁니다.
간단한 RNN language model
import sys
sys.path.append('..')
import numpy as np
from common.time_layers import *
class SimpleRnnlm:
def __init__(self, vocab_size, wordvec_size, hidden_size):
V, D, H = vocab_size, wordvec_size, hidden_size
rn = np.random.randn
embed_W = (rn(V, D) / 100).astype('f')
rnn_Wx = (rn(D, H) / np.sqrt(D)).astype('f')
rnn_Wh = (rn(H, H) / np.sqrt(H)).astype('f')
rnn_b = np.zeros(H).astype('f')
affine_W = (rn(H, V) / np.sqrt(H)).astype('f')
affine_b = np.zeros(V).astype('f')
self.layers = [
TimeEmbedding(embed_W),
TimeRNN(rnn_Wx, rnn_Wh, rnn_b, stateful=True),
TimeAffine(affine_W, affine_b)
]
self.loss_layer = TimeSoftmaxWithLoss()
self.rnn_layer = self.layers[1]
self.params, self.grads = [], []
for layer in self.layers:
self.params += layer.params
self.grads += layer.grads
def forward(self, xs, ts):
for layer in self.layers:
xs = layer.forward(xs)
loss = self.loss_layer.forward(xs, ts)
return loss
def backward(self, dout=1):
dout = self.loss_layer.backward(dout)
for layer in reversed(self.layers):
dout = layer.backward(dout)
return dout
def reset_state(self):
self.rnn_layer.reset_state()
퍼플렉서티 (혼란도) (perplexity) : 확률과 반대되는 개념, 분기 수를 나타낸다.
(ex. perplexity=5.0 => 취할 수 있는 선택사항이 5가지, 단어 선택으로 예를 들면, 다음에 출현할 수 있는 단어의 후보가 5개)
perplexity의 식은 다음과 같습니다.

p = perplexity
N : 총 데이터 수
t_n : 원-핫 벡터로 표현된 정답 레이블
t_nk : t_n의 k번째 값
y_nk : 확률분포 (softmax 출력값)
L : 신경망에서 손실값
perplexity를 통해 모델의 예측 성능을 평가할 수 있습니다. perplexity의 최솟값은 1입니다.
'딥러닝' 카테고리의 다른 글
밑바닥부터 시작하는 딥러닝 2권 후기 및 앞으로 계획 (0) | 2021.02.19 |
---|---|
기울기 클리핑 / 기본적인 LSTM (0) | 2021.01.29 |
네거티브 샘플링 (0) | 2021.01.27 |
CBOW 1 (0) | 2021.01.26 |
통계 기반 기법 2 (0) | 2021.01.24 |