阅读大概需要10分钟 跟随小博主,每天进步一丢丢
作者 刘博 链接 https://zhuanlan.zhihu.com/p/32755043
简介
让我们从一个问题开始,你能理解下面这句英文的意思吗?“working love learning we on deep”,答案显然是无法理解。那么下面这个句子呢?“We love working on deep learning”,整个句子的意思通顺了!我想说的是,一些简单的词序混乱就可以使整个句子不通顺。那么,我们能期待传统神经网络使语句变得通顺吗?不能!如果人类的大脑都感到困惑,我认为传统神经网络很难解决这类问题。
在日常生活中有许多这样的问题,当顺序被打乱时,它们会被完全打乱。例如,
有很多这样的情况,序列的信息决定事件本身。如果我们试图使用这类数据得到有用的输出,就需要一个这样的网络:能够访问一些关于数据的先前知识(prior knowledge),以便完全理解这些数据。因此,循环神经网络(RNN)粉墨登场。
在这篇文章中,我假设读者了解神经网络的基本原理。
我们需要一个用于处理序列的神经网络
在深入了解循环神经网络的细节之前,让我们考虑一下我们是否真的需要一个专门处理序列信息的网络。还有,我们可以使用这样的网络实现什么任务。
递归神经网络的优点在于其应用的多样性。当我们使用RNN时,它有强大的处理各种输入和输出类型的能力。看下面的例子。
因此,RNNs可用于将输入映射到不同类型、长度的输出,并根据实际应用泛化。让我们看看RNN的架构是怎样的。
什么是循环神经网络(RNN)
假设我们的任务是预测句子中的下一个词。让我们尝试使用MLP(多层感知机)完成它。先来看最简单的形式,我们有一个输入层、一个隐藏层和一个输出层。输入层接收输入,隐藏层激活,最后接收层得到输出。
接下来搭建更深层的网络,其中有多个隐藏层。在这里,输入层接收输入,第一层隐藏层激活该输入,然后将这些激活发送到下一个隐藏层,并层层进行连续激活以得到输出。每个隐藏层有自己的权重和偏差。
由于每个隐藏层都有自己的权重和激活,所以它们具有独立的行为。现在的目标是确定连续输入之间的关系。我们能直接把输入给隐藏层吗?当然可以!
这些隐藏层的权重和偏差是不同的。因此,每一层都是独立的,不能结合在一起。为了将这些隐藏层结合在一起,我们使这些隐藏层具有相同的权重和偏差。
我们现在可以将这些隐藏层结合在一起,所有隐藏层的权重和偏差相同。所有这些隐藏层合并为一个循环层。
这就像将输入给隐藏层一样。在所有时间步(time steps)(后面会介绍什么是时间步),循环神经元的权重都是一样的,因为它现在是单个神经元。因此,一个循环神经元存储先前输入的状态,并与当前输入相结合,从而保持当前输入与先前输入的某些关系。
理解循环神经元(Recurrent Neuron)的细节
让我们先做一个简单的任务。让我们使用一个字符级别的RNN,在这里我们有一个单词“Hello”。所以我们提供了前4个字母h、e、l、l,然后让网络来预测最后一个字母,也就是“o”。所以这个任务的词汇表只有4个字母h、e、l、o。在涉及自然语言处理的实际情况中,词汇表一般会包括整个维基百科数据库中的单词,或一门语言中的所有单词。为了简单起见,这里,我们使用了非常小的词汇表。
让我们看看上面的结构是如何被用来预测“hello”这个单词的第五个字母的。在上面的结构中,蓝色RNN块,对输入和之前的状态应用了循环递归公式。在我们的任务中,字母“h”前面没有任何其他字母,我们来看字母“e”。当字母e被提供给网络时,将循环递归公式应用于输入(也就是字母e)和前一个状态(也就是字母h),得到新的状态。也就是说,在t-1的时候,输入是h,输出是
,在t时刻,输入是e和
,输出是
,这里每次应用循环递归公式称为不同的时间步。
描述当前状态的循环递归公式如下:
这里
是t时刻的状态,
是前一时刻的状态,
是当前的输入。我们有的是前一时刻的状态而不是前一时刻的输入, 因为输入神经元将前一时刻的输入转换为前一时刻的状态。所以每一个连续的输入被称为时间步。
在我们的案例中,我们有四个输入(h、e、l、l),在每一个时间步应用循环递推公式时,均使用相同的函数和相同的权重。
考虑循环神经网络的最简单形式,激活函数是tanh,权重是
,输入神经元的权重是
,我们可以写出t时刻的状态公式如下
在上述情况下,循环神经元仅仅是将之前的状态考虑进去。对于较长的序列,方程可以包含多个这样的状态。一旦最终状态被计算出来我们就可以得到输出了。
现在,一旦得到了当前状态,我们可以计算输出了。
Ok,我们来总结一下循环神经元的计算步骤:
。