本例是为了配合NLP学习中的RNN网络,斯坦福CS224n课程里面使用的是Tensorflow进行,所以提前熟悉一下,使用Tensorflow生成一个echo-rnn。
说实话,这个例子是照着教程敲出来的,仅仅实现了,但是没有对后面的原理进行分析,目前还是在一步一步往前推。
代码同样更新在github:https://github.com/jwc19890114/-02-learning-file-100days
什么是RNN?
RNN是循环神经网络(Recurrent Neural Network)的英文缩写,它能结合数据点之间的特定顺序和幅值大小等多个特征,来处理序列数据。更重要的是,这种网络的输入序列可以是任意长度的。
举一个简单的例子:数字时间序列,具体任务是根据先前值来预测后续值。在每个时间步中,循环神经网络的输入是当前值,以及一个表征该网络在之前的时间步中已经获得信息的状态向量。该状态向量是RNN网络的编码记忆单元,在训练网络之前初始化为零向量。
RNN和CNN、DNN
CNN 专门解决图像问题的,可用把它看作特征提取层,放在输入层上,最后用MLP 做分类。对于输入数据的维度约束是比较严重的,其训练和预测的输入数据都必须完全相同,但是如果用CNN去做一个智能问答系统,CNN会需要所有的问答数据都是固定的长度,这就很可怕了,这种模型会让问答变成对对子,必须每句话长短固定。而RNN没有这种约束。
RNN 专门解决时间序列问题的,用来提取时间序列信息,放在特征提取层(如CNN)之后。RNN更多的考虑了神经元之间的联系,例如训练机器翻译,那么对于一个短语的翻译一定要考虑前因后果,这就需要模型对于数据输入的前后因素都要考虑
DNN 说白了就是 多层网络,只是用了很多技巧,让它能够 deep 。
RNN和LSTM
为了解决原始RNN网络结构存在的梯度消失(vanishing gradient)问题,设计了LSTM这种新的网络结构。但从本质上来讲,LSTM是一种特殊的循环神经网络。
其和RNN的区别在于,对于特定时刻t,隐藏层输出st的计算方式不同。故对LSTM网络的训练的思路与RNN类似,仅前向传播关系式不同。
本文借鉴Erik Hallström教程
引入所需库
构建一个回声状态网络Echo-RNN,能记忆输入数据信息,在若干时间步后将其回传。
生成随机训练数据,输入为一个随机的二元向量,在echo_step(3)个时间步后,得到输入的回声
构建计算视图
占位符是计算图的“起始节点”。在运行每个计算图时,批处理数据被传递到占位符中。
另外,RNN状态向量也是存储在占位符中,在每一次运行后更新输出。
权重
拆分序列
开始构建RNN计算视图的下个部分,首先我们要以相邻的时间步分割批数据。
可以按批次分解各列,转成list格式文件。RNN会同时从不同位置开始训练时间序列
在我们的时间序列数据中,在三个位置同时开启训练,所以在前向传播时需要保存三个状态。我们在参数定义时就已经考虑到这一点了,
故将init_state设置为3,[batch_size, state_size]。
前向传播
计算损失
这里调用的tosparse_softmax_cross_entropy_with_logits函数,能在内部算得softmax函数值后,继续计算交叉熵。
可视化结果
生成会话
领取专属 10元无门槛券
私享最新 技术干货