- RNN简介
RNN是用于处理序列数据的神经网络
百度百科词条:时间序列数据是指在不同时间点上收集到的数据,这类数据反映了某一事物、现象等随时间的变化状态或程度。这是时间序列数据的定义,当然这里也可以不是时间,比如文字序列,但总归序列数据有一个特点——后面的数据跟前面的数据有关系。
a. 回忆一下普通的神经网络是如何运作的:
把训练数据一条条的放进去,对每一条数据做很多加权处理,通过输入层->隐层->输出层->跟期望数据对比得到误差->反过来调整整个网络的权值->下一条数据
简单来说:input -> hidden -> output,这是个封闭的网络
b. 问题在哪:
我们想象一个场景,一个不规则曲面,一个球在上面运动,每秒记录一次位置,十次位置作为一条训练数据,我们需要通过前9次的位置来判断最后一次球应该在哪。
如果放到普通的神经网络,我们会把前九次位置都作为特征值输入,但想象一下,其实这个球最后在哪应该是跟最后一次位置最密切相关,并且依次会同时需要前面的位置信息一起判断,会更精确。
c. 这时候RNN就可以派上用场了
RNN里可以先把最后一次位置作为输入,得到一个结果,统计误差 - 但是不回调各层权值,而是继续输入第8次的位置,同时也把前面计算得到的结果作为隐层的一个输入:
(input + prev_hidden) -> hidden -> output
我们可以设置隐层循环的次数,也就是对应于要考虑前面的多少个位置信息,这样很灵活而且引入了经验判断。在设定的次数都完成之后再去计算跟期望值的误差,回过头来调整各层之间的权值。
下图就是具体的RNN神经网络结构图,可以注意到对于多次隐层的循环,我们用的权值是一样的
延伸阅读:LSTM
- 一个最简单的python例子+详细解释
这里要感谢下文的作者,真的讲的非常好,这个例子也是他写的
http://iamtrask.github.io/2015/11/15/anyone-can-code-lstm/
下面是对于这个例子的理解,记录下来便于以后翻阅和大家读代码
我们要解决的问题:两个8位以内的二进制数加法(足够简单)
a+b=c
9 + 60 = 69
9 = [0 0 1 1 1 1 0 0]
60 = [0 0 1 1 1 1 0 0]
69 = [0 1 0 0 0 1 0 1]
基本思想:
构造一个2(input) * 16(hidden) * 1(output)的神经网络,不设置bias值,注意除了普通神经网络的权值synapse_0(2 * 16)和synapse_1(16 * 1),我们还有隐层的自身权值synapse_h(16 * 16)
激活函数如下:
hidden layer : layer_1 = sigmoid(np.dot(X, synapse_0) + np.dot(layer_1_values[-1], synapse_h))(hidden layer的激活函数用上了前面一次计算的结果l