你曾想过文本预测算法是怎么工作的吗?语音识别软件如何辨别我们的声音?在图像分类方面,卷积神经网络像一个神秘的黑盒。而这些事情,都可以用循环神经网络(RNN)实现。循环神经网络很强大,在自然语言处理领域有着相当特别的作用。
为什么如此特别?到目前为止,我们研究的网络,标准神经网络和卷积神经网络都接受固定大小的向量作为输入,并产生固定大小的向量作为输出。
但是,人类的思考却不是这样的,我们不会丢弃掉所有东西从头开始,而是会应用之前获得的上下文和信息。当你阅读该文章时,你对文字的理解都会基于前面的文字,这说明我们人类是按照顺序思考的——新的输入+之前的经验形成思考。
循环神经网络也是这样的,对输入和输出序列进行操作,并将结果反馈给我们。
RNN的结构
循环神经网络的结构和人工神经网络的结构一样,不过会把输出返回给输入。用T时刻的输出来计算T+1时刻的网络输出。RNN简单结构图示:
这就是说输出会被送回到输入,然后在下一个时刻,和下一个输入一同使用。基本的,网络的状态是通过时间向前传播的。我们可以按照时间展开这个结构,如下所示:
我们可以这样理解,RNN具有“记忆”,里面存储着迄今为止计算出的信息。无论如何,从上面的图片中可以看出我们正在使用某种过程来组合前一时间的输出和当前时刻的输入,以计算当前时刻的输出。
有人可能会想序列输入或序列输出的数据很少,但重要的是要意识到即使输入/输出是固定的向量我们也可以用这种方式处理。例如,在下面的图片中,可以看到RNN如何通过学习逐层向画布添加颜色来生成数字图片:
RNN背后的数学原理
循环神经网络有一个简单的数学表达式:
从本质上讲,该等式表示网络在当前时间ht的状态可以被描述为在前一时间步长中的状态和在当前时间步长中的输入的函数。函数f通常是非线性的,例如tanh或者ReLU。当前时间步长ht中的网络状态成为下一时间步长的输入值。如果采用的是最简单的RNN形式,即使用tanh作为激活函数的RNN,可以表示如下:
其中,Whh是循环神经元的权重,而Wxh是输入神经元的权重。在这个例子中,考虑的只是前一个时间步长,但是一般来说,是可以观察多个时间步长的状态,这样预测会更加精确。
简化的RNN示例
RNN的数学表达式看起来好像没有想象中那么可怕。如果将数学表达式转化为代码,就能实现一个简单的RNN。这里会用时间步长(timestep)来模拟时间。x代表一个时间步长的输入;y表示RNN的输出。在类内部,将保留有关以前输入和网络状态的信息。C#实现简单RNN的代码:
这里注意一点,要使用Matrix类型,需要安装Mathnet。Numerics NuGet软件包。使用tanh函数将激活压缩到[-1,1]的范围。在函数调用中,将当前状态与循环神经元权重相乘,将输入与输入神经元相乘,然后两者相加(同上面的公式),然后将当前状态乘以输出权重来计算输出。
由于Python是实现神经网络的首选语言,下面使用Python来实现:
当然,上面的都只是简化的循环神经网络表达。这个例子只是让大家感受一下网络的状态是如何随时间保存下来的。
时间反向传播
领取专属 10元无门槛券
私享最新 技术干货