您的位置:首页 > 理论基础 > 计算机网络

机器学习之循环神经网络(RNN)入门

2017-11-17 22:16 435 查看
一、循环神经网络

1. 主要用途:处理和预测序列数据。

2. 区别:全连接神经网络和卷积神经网络,都是从输入层到隐含层再到输出层,层与层之间是全连接或者部分连接,但是每层之间的节点是无连接的。而循环神经网络的隐藏层之间的结点是有连接的,隐藏层的输入不仅包括输入层的输出,还包括上一时刻隐藏层的输出。循环神经网络会记忆之前信息,并利用之前的信息影响后面结点的输出。

3. 结构:



4. 前向传播:



假设输入向量的维度为x,然后在t时刻循环体的全连接层神经网络的输入大小位h+x。也就是将上一时刻的状态与当前时刻的输入拼接成一个大的向量作为循环体中神经网络的输入。输出层的节点个数为h,循环体中参数的个数(h+x)×h+h个。

前向传播计算示意图:



5. 损失函数:因为它每一个时刻都有一个输出,所以循环神经网络的总损失为所有时刻上的损失函数的总和。

6. Tensorflow用法:

# coding:utf-8
import numpy as np

#输入序列
X=[1,2]
#上一层状态
state=[0.0,0.0]

#定义不同输入部分的权重以方便操作
w_cell_state=np.asarray([[0.1,0.2],[0.3,0.4]])
w_cell_input=np.asarray([0.5,0.6])
b_cell=np.asarray([0.1,-0.1])

#定义用于输出的全连接层参数。
w_output=np.asarray([[1.0],[2.0]])
b_output=0.1

#按照时间顺序执行循环神经网络的前向传播过程
for i in range(len(X)):
#计算循环体中的全连接层神经网络
#这里是分开乘的然后相加,也可以先把w_cell_state和state合并起来
# 和w_cell_state和w_cell_input相乘

before_activation=np.dot(state,w_cell_state)+X[i]*w_cell_input+b_cell
state=np.tanh(before_activation)

#根据当前时刻状态计算最终输出。
#每一个循环网络神经元都有一个输出
final_output=np.dot(state,w_output)+b_output

#输出每个时刻的信息
print "before activation:",before_activation
print "state:",state
print "output:",final_output


二. 长短时记忆网络(LTSM)结构:

1. 目的:解决了循环神经网络的的长期依赖问题。

2. 结构:



LSTM利用一些门结构,让信息有选择性地影响循环神经网络中每个时刻的状态。所谓门的结构就是一个使用sigmod神经网络和一个按位做乘法的操作,这个两个操作合在一起就是一个门结构。于是这个结构的功能就类似一扇门,当门打开时(sigmod神经网络层输出为1时),全部信息都可以通过,当门关上的时候(sigmod神经网络层输出为0时),任何信息都无法通过。

遗忘门作用:让循环神经网络忘记之前没有用的信息。

输入门作用:为神经网络补充最新的记忆

输出门作用:输出当前时刻的状态。

3.Tensorflow用法

# coding: utf-8
import tensorflow as tf
from tensorflow.models.rnn import rnn_cell
#长度都是随便定义
lstm_hidden_size=10
batch_size=10
num_steps=10
#定义一个LSTM结构。在Tensorflow中通过一句简单的命令就可以实现一个完整LSTM结构
#LSTM中使用的变量也会在该函数中自动被声明
lstm=rnn_cell.BasicLSTMCell(lstm_hidden_size)

#将LSTM中的状态初始化为全0数组,和其他神经网络类似,在优化循环神经网络时,
#每次也会使用一个batch的训练样本,以下代码中 batch_size给出了一个batch的大小
#BasicLSTMCell类提供了zero_state函数来生成全0的初始状态
state=lstm.zero_state(batch_size, tf.float32)

#定义损失函数
loss=0.0
X=[]#输入值
#虽然理论上循环神经网络可以随意处理任意长度的序列,但是在训练时为了
#避免梯度消散的问题,会规定一个最大的序列长度。
for i in range(num_steps):
#在第一个时刻声明LSTM结构中使用的变量,都需要复用之前定义好的变量
if i>0:tf.get_variable_scope().reuse_variables()

#每一步处理时间序列中的一个时刻,将当前输入(X[i])和前一个时刻
#状态(state)传入定义的LSTM结构可以得到当前LSTM结构的输出和最后状态
lstm_output,state=lstm(X[i],state)
#进入全连接层(以下全为伪代码)
#final_output=fully_connected(lstm_output)
#计算损失函数
#loss+=calc_loss(final_output,expected_output)


三. 循环神经网络的变种:

1.双向循环神经网络:

a) 目的: 用来解决那些和输出和之前的状态有关系,也和输出之后状态有关系的问题,例如:预测一个语句中的缺失单词。

b) 结构: 双向循环神经网络的主体结构就是两个单向循环神经网络的结合。



2.深层循环神经网络

a) 目的:增强模型的表达能力。

b) 结构:在每一个时刻将循环体结构复制多次,和卷积神经网络类似,每一层的循环体中参数是一致的,而不同层中的参数可以不同。



3.Tensorflow用法

#coding :utf-8
import tensorflow as tf
from tensorflow.models.rnn import rnn_cell
lstm_size=10
number_of_layers=10
batch_size=10

#定义一个基本的LSTM结构作为循环体的基础结构,深层循环神经网络也支持是使用
#其他的循环体结
lstm=rnn_cell.BasicLSTMCell(lstm_size)
#通过MultiRNNCell类实现深层循环神经网络中每一个时刻的前向传播过程。
#其中number_of_layers表示有多少层,也就是,每一个结构要循环多少次
stacked_lstm=rnn_cell.MultiRNNCell([lstm]*number_of_layers)
#和经典的循环神经网络一样
state=stacked_lstm.zero_state(batch_size,tf.float32)
#计算每一个时刻的前向传播过程
for i in range(len(num_steps)):
if i>0:tf.get_variable_scope().reuse_variables()
#current_input 当前层输入
stacked_lstm_output,state=stacked_lstm(current_input,state)
# 进入全连接层(以下全为伪代码)
# final_output=fully_connected(lstm_output)
# 计算损失函数
# loss+=calc_loss(final_output,expected_output)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RNN LSTM deepRNN Tensorflow
相关文章推荐