티스토리 뷰

딥러닝

BPTT

4567은 소수 2021. 1. 29. 01:24

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/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
글 보관함