机器学习之循环神经网络(RNN)入门
2017-11-17 22:16
435 查看
一、循环神经网络
1. 主要用途:处理和预测序列数据。
2. 区别:全连接神经网络和卷积神经网络,都是从输入层到隐含层再到输出层,层与层之间是全连接或者部分连接,但是每层之间的节点是无连接的。而循环神经网络的隐藏层之间的结点是有连接的,隐藏层的输入不仅包括输入层的输出,还包括上一时刻隐藏层的输出。循环神经网络会记忆之前信息,并利用之前的信息影响后面结点的输出。
3. 结构:
4. 前向传播:
假设输入向量的维度为x,然后在t时刻循环体的全连接层神经网络的输入大小位h+x。也就是将上一时刻的状态与当前时刻的输入拼接成一个大的向量作为循环体中神经网络的输入。输出层的节点个数为h,循环体中参数的个数(h+x)×h+h个。
前向传播计算示意图:
5. 损失函数:因为它每一个时刻都有一个输出,所以循环神经网络的总损失为所有时刻上的损失函数的总和。
6. Tensorflow用法:
二. 长短时记忆网络(LTSM)结构:
1. 目的:解决了循环神经网络的的长期依赖问题。
2. 结构:
LSTM利用一些门结构,让信息有选择性地影响循环神经网络中每个时刻的状态。所谓门的结构就是一个使用sigmod神经网络和一个按位做乘法的操作,这个两个操作合在一起就是一个门结构。于是这个结构的功能就类似一扇门,当门打开时(sigmod神经网络层输出为1时),全部信息都可以通过,当门关上的时候(sigmod神经网络层输出为0时),任何信息都无法通过。
遗忘门作用:让循环神经网络忘记之前没有用的信息。
输入门作用:为神经网络补充最新的记忆
输出门作用:输出当前时刻的状态。
3.Tensorflow用法
三. 循环神经网络的变种:
1.双向循环神经网络:
a) 目的: 用来解决那些和输出和之前的状态有关系,也和输出之后状态有关系的问题,例如:预测一个语句中的缺失单词。
b) 结构: 双向循环神经网络的主体结构就是两个单向循环神经网络的结合。
2.深层循环神经网络
a) 目的:增强模型的表达能力。
b) 结构:在每一个时刻将循环体结构复制多次,和卷积神经网络类似,每一层的循环体中参数是一致的,而不同层中的参数可以不同。
3.Tensorflow用法
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)
相关文章推荐
- [TensorFlow]入门学习笔记(5)-循环神经网络RNN
- 【机器学习笔记】循环神经网络RNN
- [机器学习入门] 李宏毅机器学习笔记-33 (Recurrent Neural Network part 2;循环神经网络 part 2)
- [机器学习入门] 李宏毅机器学习笔记-34 (Recurrent Neural Network part 3;循环神经网络 part 3)
- 简单入门循环神经网络RNN:时间序列数据的首选神经网络
- 循环神经网络(RNN, Recurrent Neural Networks)的入门必学文章
- 简单入门循环神经网络RNN:时间序列数据的首选神经网络
- 简单入门循环神经网络RNN:时间序列数据的首选神经网络
- TensorFlow人工智能引擎入门教程之九 RNN/LSTM循环神经网络长短期记忆网络使用
- [机器学习入门] 李宏毅机器学习笔记-32 (Recurrent Neural Network part 1;循环神经网络 part 1)
- 简单入门循环神经网络RNN:时间序列数据的首选神经网络
- CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
- CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构区别
- TensorFlow框架(6)之RNN循环神经网络详解
- RNN循环神经网络的直观理解:基于TensorFlow的简单RNN例子
- Hulu机器学习问题与解答系列 | 第九弹:循环神经网络
- 20170326#cs231n#11.Recurrent Neural Networks 循环神经网络RNN
- CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
- 【深度学习】RNN(循环神经网络)
- CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?(知呼回答)