热门推荐

随便看看

用中文传话游戏理解 RNN

2018-06-16 08:45

  循环神经网络(RNN)是人工神经网络中非常流行的一个版本,其可以很好地处理序列数据类型。该数据类型指的是将一组数据点以特定顺序排列,从而使相关的数据点一个挨着一个,具体的例子有:股票市场价格、音频和视频数据、DNA 序列、传感器数据、自然语言文本等等。

  为了直观地了解 RNN 是如何工作的,假设我们正在玩一个很受欢迎的儿童游戏--中文传话。该游戏的目的是最后一个人能准确预测出句子中所漏掉的词语,比如「The brown dog has four _____」。

  玩家们需要排成一队,并且根据句子中词语的排列,每个人都会得到其中的一个词语,比如玩家 1 得到词语「the」,玩家 2 得到词语「brown」,玩家 3 得到词语「dog」,以此类推。首先,队伍中的第一个人把他听到的词语悄悄地告诉队伍中站在他身后的玩家。然后这个玩家将这个词语和自己的词语一起悄悄地告诉他身后的人。接下来,整个队伍不断重复这个过程直到最后一个玩家。最后的玩家需要预测出所漏掉的词语,并大声地把这个消息告诉整个集体。

  显而易见的是,最后一个玩家可以准确地猜出漏掉的词语是「legs」。这是因为前一个玩家告诉了他这个句子的前面部分:「The brown dog has four」,所以他能够通过该语境推导出这个词语。

  由上文可知,RNN 能够通过对整个序列重复同样的过程,从而做出预测。左下图显示了循环网络的基本结构。它同时接收序列数据输入向量(x)和隐藏状态信息(a),然后使用二者去预测序列数据的输出。

  为了正确地将系统工作方式可视化,我们通常把 RNN 展开成与序列数据长度一致的一连串重复的单元或称之为时间步(如右上图所示)。比如我们需要处理的序列是一个有三个词语的句子时,那么其将被展开成有三个时间步的 RNN 网络,每一个时间步处理一个词语。

  序列数据的输入和输出有各种各样的形式和长度。比如在情感分析任务中,输入通常是一串文本,而期望的输出是一个整数(1-5 的评分范围)或是单个文本(好的、坏的,积极的、消极的、中性的)。然而在语音文本任务中,输入则是声波中的一串声音信号,其输出则是一串对应的文本。

  当需要处理输入和输出序列的数量不一致时,我们便可采用多对多架构的另一种版本。而机器翻译任务就是这样的一个应用实例:输入是原文的一串词语(比如法文),而输出是的一串词语(比如英文)。这个架构有两个不同的模块:编码器和解码器。前者接受输入的句子,将其映射成内部状态表征,然后将其传给后者,以供其生成输出的句子。

  在此架构中,当编码器将全部的输入序列处理完后,解码器才开始对输出的序列进行预测。这与前面提到的相同序列长度架构完全不同,在那个架构中,其每收到一个输入序列对象后,马上开始对每一个输出序列对象进行预测。

  此处的 RNN 在第一个时间步接受一个单一值,然后在剩余的时间步中输出一串值。基于此架构的应用通常会取得每个时间步的预测输出,并把它传递给下一层,作为该层的输入值。一个应用实例是图像标注:RNN 接受一幅图像作为输入,然后输出描述图像中所发生事情的一串词语。