阅读大概需要10分钟
跟随小博主,每天进步一丢丢
作者 刘博
链接 https://zhuanlan.zhihu.com/p/32755043
简介
让我们从一个问题开始,你能理解下面这句英文的意思吗?“working love learning we on deep”,答案显然是无法理解。那么下面这个句子呢?“We love working on deep learning”,整个句子的意思通顺了!我想说的是,一些简单的词序混乱就可以使整个句子不通顺。那么,我们能期待传统神经网络使语句变得通顺吗?不能!如果人类的大脑都感到困惑,我认为传统神经网络很难解决这类问题。
在日常生活中有许多这样的问题,当顺序被打乱时,它们会被完全打乱。例如,
我们之前看到的语言——单词的顺序定义了它们的意义
时间序列数据——时间定义了事件的发生
基因组序列数据——每个序列都有不同的含义
有很多这样的情况,序列的信息决定事件本身。如果我们试图使用这类数据得到有用的输出,就需要一个这样的网络:能够访问一些关于数据的先前知识(prior knowledge),以便完全理解这些数据。因此,循环神经网络(RNN)粉墨登场。
在这篇文章中,我假设读者了解神经网络的基本原理。
目录
我们需要一个用于处理序列的神经网络
什么是循环神经网络(RNN)
理解循环神经元(Recurrent Neuron)的细节
用Excel实现循环神经元的前向传播
循环神经网络的后向传播(BPTT)
我们需要一个用于处理序列的神经网络
在深入了解循环神经网络的细节之前,让我们考虑一下我们是否真的需要一个专门处理序列信息的网络。还有,我们可以使用这样的网络实现什么任务。
递归神经网络的优点在于其应用的多样性。当我们使用RNN时,它有强大的处理各种输入和输出类型的能力。看下面的例子。
情感分析(Sentiment Classification) – 这可以是简单的把一条推文分为正负两种情绪的任务。所以输入是任意长度的推文, 而输出是固定的长度和类型.
图像标注(Image Captioning) – 假设我们有一个图片,我们需要一个对该图片的文本描述。所以,我们的输入是单一的图像,输出是一系列或序列单词。这里的图像可能是固定大小的,但输出是不同长度的文字描述。
语言翻译(Language Translation) – 这里假设我们想将英文翻译为法语. 每种语言都有自己的语义,对同一句话有不同的长度。因此,这里的输入和输出是不同长度的。
因此,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,我们来总结一下循环神经元的计算步骤:
将输入时间步提供给网络,也就是提供给网络
。
接下来利用输入和前一时刻的状态计算当前状态,也就是
当前状态变成下一步的前一状态
我们可以执行上面的步骤任意多次(主要取决于任务需要),然后组合从前面所有步骤中得到的信息。
一旦所有时间步都完成了,最后的状态用来计算输出
输出与真实标签进行比较并得到误差。
误差通过后向传播(后面将介绍如何后向传播)对权重进行升级,进而网络训练完成。
明日预告
详解循环神经网络RNN(实践篇):
目录
我们需要一个用于处理序列的神经网络
什么是循环神经网络(RNN)
理解循环神经元(Recurrent Neuron)的细节
用Excel实现循环神经元的前向传播
循环神经网络的后向传播(BPTT)
雅思一下下
modification n.修改,修正;改变
remedy vt. 补救;治疗;纠正
be subject to 受支配,从属于;常遭受...;有...倾向的
voracious adj.贪婪的;贪吃的;狼吞虎咽的
strife n. 冲突;争吵;不和
推荐阅读:
TreeLSTM Sentiment Classification
欢迎关注深度学习自然语言处理公众号,我会每天更新自己在机器学习,深度学习,NLP,linux,python以及各种数学知识学习的一点一滴!再小的人也有自己的品牌!期待和你一起进步!
长按识别二维码
点个赞呗