深さ学習(十一)RNN入門学習
6886 ワード
RNN入門学習
原文住所:http://blog.csdn.net/hjimce/article/details/49095371
作者:hjimce
一、関連理論
RNN(Recurrent Neural Networks)中国語名は循環ニューラルネットワーク(元はもう一つの再帰ニューラルネットワーク、RNNとも呼ばれていたが、私は少し混じっていた.菜鳥は入門したばかりで、番号が合わなかった)とも呼ばれている.コンピュータの視覚の中で使うのは比較的に少なくて、私は現在多くのコンピュータの視覚の領域の関連する深い学習の文章を見たことがあって、OCR、ピクチャーの表記、理解の問答などを除いてこれらはCNNとRNNを結合することができて、その他のめったに見ません.RNNは主にシーケンス問題、例えば自然言語、音声オーディオなどの分野に用いられ、CNNに比べて簡単で多い.CNNには、ボリューム層、プール化層、全接続層、特徴図などの概念が含まれており、RNNは基本的に3つの公式だけで済むため、RNNについては3つの公式を知るだけでRNNを理解することができる.正直に言うと、ループニューラルネットワークという名前を聞くと、難しい感じがします.CNNを習い始めたばかりの頃は、分からないこともたくさんあったからです.やはりくどくどしないで、......始める前に、簡単なMLP 3層ニューラルネットワークモデルを振り返ってみましょう.
単純MLPモデル
上の図は最も簡単な浅いネットワークモデルで、xは入力で、sは隠層ニューロンで、oは出力層ニューロンです.そしてU、Vは私たちが学ぶパラメータです.上の図は簡単で、ニューロンの数は1つしかありません.次の式を得ることができます.
(1)隠蔽層ニューロンの活性化値は:
s=f(u*x+b1)
(2)出力レイヤのアクティブ化値は次のとおりです.
o=f(v*s+b2)
これは最も簡単な3層のニューラルネットワークモデルの計算式で、もし上の式に対して、まだ熟知していないならば、やはりニューラルネットワークの本を見て、基礎を築くことをお勧めします.RNNネットワーク構造図は、上のモデルに接続線を追加しただけです.RNN構造図:
RNN構造図
構造図を見ると、RNNネットワークは簡単なように見えるのではないでしょうか.少なくともCNNプロセスほど長くはありません.上の構造図から見ると、RNNネットワークのインフラストラクチャは、入力層、非表示層、出力層が1つしかなく、従来の浅いニューラルネットワークモデルと差が少ないように見えます(出力層、非表示層、出力層のみを含む)、唯一の違いは、上の非表示層が1日接続線を多くし、円のように東に見えますが、その線はいわゆる循環再帰です.同時にそのコイル接続線にも1つのパラメータWが追加された.RNNの展開図を見てみましょう.分かりやすいです.
直接見ると,上に図中のOtの計算フローを展開すると,隠層ニューロンstの入力には,来時xtの入力とst−1からの入力の2つが含まれていることが分かった.そこでRNN,t時刻の計算式は以下の通りである.
(1)t時点で、隠層ニューロンの活性化値は:
st=f(u*xt+w*st-1+b1)
(2)t時刻、出力層の活性化値は、
ot=f(v*st+b2)
上の式は、最初に与えられたMLPと少し差があるような気がしますか.上のst計算のみの場合、関数f変数計算の場合、複数のw*s
t-1.
二、ソースコード実現
次に、コードと組み合わせて、コードレベルのRNN実装を理解します.
参考文献:
1、http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/
2、http://blog.csdn.net/danieljianfeng/article/details/42931721
**********************作者:hjimce时间:2015.10.23连络QQ:1393852684オリジナル文章,转载请保留原文住所、作者等情报***************************
原文住所:http://blog.csdn.net/hjimce/article/details/49095371
作者:hjimce
一、関連理論
RNN(Recurrent Neural Networks)中国語名は循環ニューラルネットワーク(元はもう一つの再帰ニューラルネットワーク、RNNとも呼ばれていたが、私は少し混じっていた.菜鳥は入門したばかりで、番号が合わなかった)とも呼ばれている.コンピュータの視覚の中で使うのは比較的に少なくて、私は現在多くのコンピュータの視覚の領域の関連する深い学習の文章を見たことがあって、OCR、ピクチャーの表記、理解の問答などを除いてこれらはCNNとRNNを結合することができて、その他のめったに見ません.RNNは主にシーケンス問題、例えば自然言語、音声オーディオなどの分野に用いられ、CNNに比べて簡単で多い.CNNには、ボリューム層、プール化層、全接続層、特徴図などの概念が含まれており、RNNは基本的に3つの公式だけで済むため、RNNについては3つの公式を知るだけでRNNを理解することができる.正直に言うと、ループニューラルネットワークという名前を聞くと、難しい感じがします.CNNを習い始めたばかりの頃は、分からないこともたくさんあったからです.やはりくどくどしないで、......始める前に、簡単なMLP 3層ニューラルネットワークモデルを振り返ってみましょう.
単純MLPモデル
上の図は最も簡単な浅いネットワークモデルで、xは入力で、sは隠層ニューロンで、oは出力層ニューロンです.そしてU、Vは私たちが学ぶパラメータです.上の図は簡単で、ニューロンの数は1つしかありません.次の式を得ることができます.
(1)隠蔽層ニューロンの活性化値は:
s=f(u*x+b1)
(2)出力レイヤのアクティブ化値は次のとおりです.
o=f(v*s+b2)
これは最も簡単な3層のニューラルネットワークモデルの計算式で、もし上の式に対して、まだ熟知していないならば、やはりニューラルネットワークの本を見て、基礎を築くことをお勧めします.RNNネットワーク構造図は、上のモデルに接続線を追加しただけです.RNN構造図:
RNN構造図
構造図を見ると、RNNネットワークは簡単なように見えるのではないでしょうか.少なくともCNNプロセスほど長くはありません.上の構造図から見ると、RNNネットワークのインフラストラクチャは、入力層、非表示層、出力層が1つしかなく、従来の浅いニューラルネットワークモデルと差が少ないように見えます(出力層、非表示層、出力層のみを含む)、唯一の違いは、上の非表示層が1日接続線を多くし、円のように東に見えますが、その線はいわゆる循環再帰です.同時にそのコイル接続線にも1つのパラメータWが追加された.RNNの展開図を見てみましょう.分かりやすいです.
直接見ると,上に図中のOtの計算フローを展開すると,隠層ニューロンstの入力には,来時xtの入力とst−1からの入力の2つが含まれていることが分かった.そこでRNN,t時刻の計算式は以下の通りである.
(1)t時点で、隠層ニューロンの活性化値は:
st=f(u*xt+w*st-1+b1)
(2)t時刻、出力層の活性化値は、
ot=f(v*st+b2)
上の式は、最初に与えられたMLPと少し差があるような気がしますか.上のst計算のみの場合、関数f変数計算の場合、複数のw*s
t-1.
二、ソースコード実現
次に、コードと組み合わせて、コードレベルのRNN実装を理解します.
# -*- coding: utf-8 -*-
"""
Created on Thu Oct 08 17:36:23 2015
@author: Administrator
"""
import numpy as np
import codecs
data = open('text.txt', 'r').read() # txt str
chars = list(set(data))#
print chars
# 、
data_size, vocab_size = len(data), len(chars)
print 'data has %d characters, %d unique.' % (data_size, vocab_size)
#
char_to_ix = { ch:i for i,ch in enumerate(chars) }
ix_to_char = { i:ch for i,ch in enumerate(chars) }
print char_to_ix
hidden_size = 100 #
seq_length = 20 #
learning_rate = 1e-1#
#
Wxh = np.random.randn(hidden_size, vocab_size)*0.01 #
Whh = np.random.randn(hidden_size, hidden_size)*0.01 #
Why = np.random.randn(vocab_size, hidden_size)*0.01 # ,
bh = np.zeros((hidden_size, 1)) #
by = np.zeros((vocab_size, 1)) #
#inputs t ,
#targets t+1 ,
#hprev t-1
def lossFun(inputs, targets, hprev):
xs, hs, ys, ps = {}, {}, {}, {}
hs[-1] = np.copy(hprev)
loss = 0
#
for t in xrange(len(inputs)):
xs[t] = np.zeros((vocab_size,1)) # 0、1 , input , 0
xs[t][inputs[t]] = 1
hs[t] = np.tanh(np.dot(Wxh, xs[t]) + np.dot(Whh, hs[t-1]) + bh) # RNN
ys[t] = np.dot(Why, hs[t]) + by # RNN
ps[t] = np.exp(ys[t]) / np.sum(np.exp(ys[t])) #
loss += -np.log(ps[t][targets[t],0]) # softmax
#
dWxh, dWhh, dWhy = np.zeros_like(Wxh), np.zeros_like(Whh), np.zeros_like(Why)
dbh, dby = np.zeros_like(bh), np.zeros_like(by)
dhnext = np.zeros_like(hs[0])
for t in reversed(xrange(len(inputs))):
dy = np.copy(ps[t])
dy[targets[t]] -= 1 # backprop into y
dWhy += np.dot(dy, hs[t].T)
dby += dy
dh = np.dot(Why.T, dy) + dhnext # backprop into h
dhraw = (1 - hs[t] * hs[t]) * dh # backprop through tanh nonlinearity
dbh += dhraw
dWxh += np.dot(dhraw, xs[t].T)
dWhh += np.dot(dhraw, hs[t-1].T)
dhnext = np.dot(Whh.T, dhraw)
for dparam in [dWxh, dWhh, dWhy, dbh, dby]:
np.clip(dparam, -5, 5, out=dparam) # clip to mitigate exploding gradients
return loss, dWxh, dWhh, dWhy, dbh, dby, hs[len(inputs)-1]
# , , seed_ix t=0 , n
def sample(h, seed_ix, n):
x = np.zeros((vocab_size, 1))
x[seed_ix] = 1
ixes = []
for t in xrange(n):
h = np.tanh(np.dot(Wxh, x) + np.dot(Whh, h) + bh)#h
y = np.dot(Why, h) + by
p = np.exp(y) / np.sum(np.exp(y))
ix = np.random.choice(range(vocab_size), p=p.ravel())#
x = np.zeros((vocab_size, 1))#
x[ix] = 1
ixes.append(ix)#
return ixes
n, p = 0, 0
mWxh, mWhh, mWhy = np.zeros_like(Wxh), np.zeros_like(Whh), np.zeros_like(Why)
mbh, mby = np.zeros_like(bh), np.zeros_like(by) # memory variables for Adagrad
smooth_loss = -np.log(1.0/vocab_size)*seq_length # loss at iteration 0
while n<20000:
#n 。 t=0 , 0
if p+seq_length+1 >= len(data) or n == 0:
hprev = np.zeros((hidden_size,1)) #
p = 0 # go from start of data
#
inputs = [char_to_ix[ch] for ch in data[p:p+seq_length]]
targets = [char_to_ix[ch] for ch in data[p+1:p+seq_length+1]]
# 1000 ,
if n % 1000 == 0:
sample_ix = sample(hprev, inputs[0], 200)
txt = ''.join(ix_to_char[ix] for ix in sample_ix)
print '----
%s
----' % (txt, )
# RNN ,
loss, dWxh, dWhh, dWhy, dbh, dby, hprev = lossFun(inputs, targets, hprev)
smooth_loss = smooth_loss * 0.999 + loss * 0.001
if n % 100 == 0: print 'iter %d, loss: %f' % (n, smooth_loss) # print progress
# Adagrad , :http://blog.csdn.net/danieljianfeng/article/details/42931721
for param, dparam, mem in zip([Wxh, Whh, Why, bh, by],
[dWxh, dWhh, dWhy, dbh, dby],
[mWxh, mWhh, mWhy, mbh, mby]):
mem += dparam * dparam
param += -learning_rate * dparam / np.sqrt(mem + 1e-8) #
p += seq_length #
n += 1 #
参考文献:
1、http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-introduction-to-rnns/
2、http://blog.csdn.net/danieljianfeng/article/details/42931721
**********************作者:hjimce时间:2015.10.23连络QQ:1393852684オリジナル文章,转载请保留原文住所、作者等情报***************************