ml我是程序员@IT·互联网

理解递归神经网络-part1

2018-04-16  本文已影响100人  阿里云云栖号

摘要: 递归神经网络是什么?传统的神经网络有哪些局限性?本文会为你揭开递归神经网络的面纱。

在本文的第一部分中,我们将介绍递归神经网络的来源,说明传统神经网络的局限性。然后,我们将深入探讨其技术架构的细节,这对于我们在下一部分用numpy从头进行编码很有用。

人类学习

B.J. Neblett曾经说过:我们是经验的总和,我们不会和昨天一样,也不会和明天一样。

他道出了一个固有的真理。我们的大脑将过去的经验汇集在一起,并以一种很复杂的方式将它们结合在一起,来解决新的未知的任务。在生活中,我们很难处理曾经存储和呼叫的信息序列。人类学习可以被分解为两个基本的过程:

1.记忆:每获得一次新的信息,我们将其存储起来作为将来的参考。

2.组合:并非所有的任务都是相同的,因此,我们将分析能力与记忆中的经验结合起来,然后进行推理。

如上图所示。即使这只猫的形状很怪异,一个孩子也能够立刻辨认出这是一只猫。然而,孩子可能会无意识的想到人类伸展变形和姿势,并推断出猫也发生了同样的变化。

然而,并非所有任务都需要过去的经验。有时候,解决问题就是利用刚才处理的信息。例如,看看这个不完整的句子:

我买了平时爱吃的焦糖爆米花和冰茶,然后前往___

如果让你填写遗漏的单词,你可能会猜测“电影院”。但是,你怎么知道不是“图书馆”或者“星巴克”呢?也许是因为你根据上下文或者前面的信息来推断正确的答案。现在,考虑以下几点:如果让你倒序背诵最喜欢的歌曲的歌词,你能做到吗?倒序数数还差不多!

那么为什么倒序背诵歌词很难呢?由于每个数字之间都有一个逻辑关系,并且知道9位数字的顺序以及减法,这就意味着,即使以前从未这样做过,也可以将1845098倒序数数。另一方面,你以特定的顺序来记歌曲的歌词,从第一个单词开始,大脑就开始对下一个单词进行索引。由于之前从未做过这种倒序索引,所以倒序背诵歌词特别难。把要记忆的歌词序列想象成一个巨大的毛线球,如上图所示,只有在正向序列中正确的第一个字开始,才可以继续访问下去。

主要原因就是,我们的大脑可以很自然的处理序列,它依靠一种看似简单实则强大的信息持久性来实现识别。

传统神经网络的困境

我们生活在一个有固定顺序的世界中。音频、视频和语言(甚至是DNA!)只是数据的一些例子,在这些数据中,给定时间步的信息与以前时间步的信息错综复杂。那么,这与深度学习有什么关系?比如从视频中提取一系列帧送入神经网络中,我们来预测接下来会发生什么…….或者将一句不完整的话送入神经网络中,并要求它完成这个句子。

很明显的是,过去的信息对于能否输出一个合理的预测至关重要。但是传统的神经网络根本无法做到这一点,因为它们的基本假设是输入是相互独立的!这是一个问题,因为这意味着任何一个时间点的输出都完全并且唯一由输入确定。没有历史纪录,我们的神经网络就无法利用不同帧或单词之间的复杂时间依赖性,进而无法对输出的预测进行优化。

需要注意的是,递归神经网络不仅仅局限于有序数据,因为很多问题都可以分解为一系列的子问题。想法如下:我们并不要求神经网络一次性预测输出(这样会增加模型的负担),而是对迭代子输出进行预测,并且这相对来说更加容易,其中每个子输出都是前一次的改进。例如,我们用递归神经网络产生带有某种顺序的手写数字,模仿艺术家的字迹,来对作品进行改进和重新评估。

记忆增强神经网络

那么,我们怎样赋予神经网络以记忆呢?为了回答这个问题,我们来回顾一下基本的神经网络隐藏层:一个向量X作为输入,乘以权重矩阵W并应用一个非线性。当我们将三个连续的输入送入网络时,将会考虑输出y。请注意,为了简化符号,忽略偏差。我对如下的方程式做了彩色处理,以便能够看出模型的结构。

如上述函数所示,每个输出完全由其输入决定,也就是说,在计算其输出值时,并不存在过去的输入。因此,我们在隐藏层上将当前的输入和前一个输入组合起来作为一个新的输入,看看发生了什么变化。

很棒!通过在公式中引入过去的输入,我们设法在每个隐藏层中获得了2种颜色的组合。直观地来说,我们现在的网络记忆深度为1,即相当于“看到”时间倒退一步。请记住,我们的目标是,捕获到以前所有时间步的信息,因此,这不会削弱网络的性能。

那么,如果我们将当前的输入和前一个隐藏层组合在一起,作为网络的输入,会发生什么情况呢?

好多了!我们的网络层在每个时间步中都混合了之前所有的颜色,从而使我们的网络在计算其输出时,会将所有的历史时间步纪录在内。这是重现其辉煌的力量:创造一个信息可以持续跨越历史时间步的循环。

递归神经网络原理

作为其核心部分,递归神经网络可以用一个内部隐藏状态h来表示,该状态在每个时间步上都进行更新。此更新方式的函数表示如下:

虽然看起来很复杂,我们来解剖一下,就会变得很简单。

1.Wxhxt:我们将输入xt和一个权重矩阵Wxh作点积运算。你可以将此点积运算作为隐藏层从输入中提取信息的一种方式。

2.Whhht−1:这个点积运算允许网络从过去的全部历史输入中提取信息,并和当前输入所收集到的信息组合在一起,来计算其输出。这是递归神经网络最关键的一个自定义属性。

3.f和g是激活函数,将点积运算压缩到一定的范围内。函数f通常是tanh或ReLU。当我们希望输出是某个类别的概率时,函数g通常是一个softmax。

4.b1和b2表示输出和原值之间的偏差(类似于线性函数ax+b中的b)。

正如你所看到的那样,Vanilla递归神经网络模型非常简单。我们一旦定义了它的架构,就可以像正常的神经网络一样训练递归神经网络,即初始化权重矩阵和偏差,定义损失函数并用某种形式的梯度下降将损失函数最小化。

以上为译文。

本文由阿里云云栖社区组织翻译。

文章原标题《Understanding Recurrent Neural Networks - Part I》,译者:Mags,审校:袁虎。

详情请阅读原文

上一篇下一篇

猜你喜欢

热点阅读