递归神经网络的不合理有效性

 

 递归神经网络(Rnns)有一些神奇之处。我仍然记得当我训练我的第一个递归网络进行图像捕捉时。在训练后的几十分钟内,我的第一个婴儿模型(带有相当随意选择的超参数)开始生成非常好看的图像描述,这些图像处于有意义的边缘。有时,你的模型的简单程度与结果的质量的比率。你的打击超出了你的期望,这也是其中的一次。当时令人震惊的是,人们普遍认为Rnns应该是很难训练的(事实上,我有更多的经验,得出了相反的结论)。快进大约一年:我一直在训练Rnns,我已经见证了这一点。他们的力量和活力很多次,但他们的神奇输出仍然找到了有趣的方式。这篇文章是关于分享一些魔术与你。

 

我们将训练rnn逐个字符生成文本,并思考“这怎么可能?

 

顺便说一句,我还在GitHub上发布了一些代码,让你可以根据多层语言来训练字符级的语言模型。你给了它大量的文本,它将学会一次只生成一个字符的文本。你也可以用它来复制我的实验。但是我们正在超越我们自己;不管怎么说,Rnns是什么?

 

递归神经网络;

 

顺序。根据您的背景,您可能想知道:是什么使递归网络如此特殊?香草神经网络(以及卷积网络)的一个明显的限制是它们的API太受限制:它们接受一个固定大小的向量作为输入(例如图像),并生成一个固定大小的向量作为输出(例如不同类的概率)。不仅如此:这些模型使用一定数量的计算步骤来执行这种映射。(例如,模型中的层数)。递归网更令人兴奋的核心原因是它们允许我们对向量序列进行操作:输入、输出或最一般情况下的序列。几个例子可能使这一点更加具体:

每个矩形是一个向量,箭头表示函数(例如矩阵乘)。输入向量是红色的,输出向量是蓝色和绿色向量,保持RNN的状态(稍后会有更多信息)。从左到右:(1)没有RNN的普通处理模式,从固定大小的输入到固定大小的输出(例如图像分类)。(2)序列输出(例如,图像标题获取图像并输出单词的句子)。(3)顺序输入(例如,将某一句子归类为表达积极或消极情绪的情感分析)。(4)序列输入和序列输出(例如机器翻译:RNN读取英文句子,然后输出法语句子)。(5)同步序列输入和输出(例如,我们希望对视频的每一帧进行标记的视频分类)。注意,在每一种情况下,对于序列长度都没有预先规定的约束,因为递归转换(绿色)是固定的,可以任意多次应用。

如你所料,相对于固定的网络来说,操作顺序比固定数目的计算步骤要强大得多,因此对于那些渴望建立更智能系统的人来说,也更有吸引力。此外,正如我们将看到的那样,rnns将输入向量与其状态向量与固定的(但已学习的)结合在一起。函数来生成一个新的状态向量。在编程术语中,这可以解释为运行具有某些输入和一些内部变量的固定程序。从这个角度来看,rnns本质上描述了程序。事实上,众所周知,rnns是图灵的-完全可以模拟任意程序(具有适当的权重)。但是,类似于神经网络的通用逼近定理,您不应该读太多。对此很感兴趣。事实上,忘了我说了什么。

如果训练香草神经网络是优化的功能,训练递归网是优化程序。

在没有顺序的情况下进行顺序处理。你可能会认为,将序列作为输入或输出可能相对较少,但重要的一点是,即使您的输入/输出是固定的向量,仍然可以使用这种强大的形式对它们进行顺序处理。例如,下图显示了来自深度思维的两篇非常好的论文的结果。算法学习一种循环网络策略,该策略引导它的注意力围绕一幅图像;特别是它学会从左到右读出房屋号码(ba等人)。在右边,递归网络通过学习为画布依次添加颜色来生成数字图像(Gregor等人):

优点是,即使你的数据不是序列的形式,你仍然可以制定和训练强大的模型来学习如何连续地处理它。你正在学习处理固定大小数据的有状态程序。rnn计算。那么这些事情是如何工作的呢?在核心,rnns有一个看似简单的api:它们接受一个输入向量x,并给你一个输出向量y。然而,。至关重要的是,输出向量的内容不仅受您刚才输入的影响,还受您过去输入的整个历史的影响。RNN的API是作为一个类编写的,它由一个单步函数组成:

RNN类有一些内部状态,它可以在调用每一步时进行更新。在最简单的情况下,这种状态由单个隐藏向量H组成。下面是一个普通RNN中STEP函数的实现:

以上指定香草RNN的正向通过。这个RNN的参数是三个矩阵WYHH,WXXH,WYHY。隐藏状态自H。NP.TANH函数实现了将激活压制到范围[-1, 1 ]的非线性。请注意,这是如何工作的:在TANH中有两个术语:一个是基于先前隐藏的状态,一个是基于当前输入。在NUMPY NP.点是矩阵乘法。这两个中间体与加成物相互作用,然后被TANH压扁成新的状态向量。如果您对数学符号更为舒适,我们也可以将隐藏状态更新写为(Hyt=谭(W{{HH}Ht{1} W{{XH}XXT)),其中TANH被应用于元素。

我们用随机数初始化RNN的矩阵,训练期间的大部分工作将用于寻找产生理想行为的矩阵,这是用某种损失函数来衡量的,该函数表示您希望看到什么样的输出,以响应您的输入序列X。深入。Rnns是神经网络,一切都是单调地更好地工作(如果这样做的话)。(对)如果你戴上深造的帽子,开始像煎饼一样堆叠模型。例如,我们可以形成一个2层的递归网络,如下所示:

换句话说,我们有两个独立的Rnn:一个RNN接收输入向量,第二个RNN接收第一个RNN的输出作为它的输入。除了这两个rnn都不知道或关心-它们都只是向量进入和输出,以及在反向传播过程中通过每个模块的一些梯度。实践中,我们大多数人使用的公式与我上面提到的长时记忆(Lstm)网络略有不同。lstm是一种特殊类型的递归网络,由于它更强大的更新方程和一些吸引人的反向传播动态,因此在实践中工作得稍微好一些。我不想详细讨论,但是我说的关于rnns的一切都是完全一样的,除了数学。计算更新的表单(行Sel.h=.)变得更加复杂。从这里开始,我将交替使用术语“RNN/LSTM”,但是本文中的所有实验都使用了LSTM。

字符级语言模型好,所以我们有一个关于RNNs的概念,为什么它们是超级令人兴奋的,以及它们是如何工作的。现在我们将在一个有趣的应用程序中对此进行研究:我们将训练RNN字符级语言模型。也就是说,我们将给rnn一大块文本,并让它对给定先前字符序列的序列中的下一个字符的概率分布进行建模。这将允许我们一次生成一个字符的新文本。作为工作示例,假设我们只有四个可能的字母“helo”的词汇表,并且希望对训练序列“hello”上的rnn进行训练。这个训练序列实际上是4个单独的训练例子的来源:1。“E”的概率应该是“H”,2的上下文。“L”应该是在“He”的上下文中,3。“L”也应该是“HEL”的上下文,最后是4。“O”很可能被赋予“地狱”的背景。具体地,我们将使用1-of-k编码将每个字符编码成一个向量(即,除了词汇表中字符的索引处的单个字符外,所有字符都为零),并且利用阶跃函数一次将它们馈送给rnn。然后,我们将观察一个四维输出向量序列(每个字符一个维度),我们将其解释为rnn当前分配给序列中接下来的每个字符的置信度。下面是一个图表: 一个具有4维输入和输出层的RNN示例,以及一个由3个单元(神经元)组成的隐层。此图显示了RNN被输入字符“地狱”时的激活情况。输出层包含RNN为下一个字符分配的信任(词汇表为“h,e,l,o”);我们希望绿色数字高,红色数字低。

例如,在第一步,当RNN看到字符“h”时,它为下一个字母“h”分配了1.0的信心,将2.2的字母“e”,-3.0到“l”和4.1到“o”分配给下一个字母,因为在我们的训练数据中(字符串“hello”)下一个正确的字符是“e”,我们希望增加它的可信度(绿色),并降低所有其他字母(红色)的可信度。同样,我们希望网络给出更大的可信度的四个步骤中的每一个步骤都有一个理想的目标字符。因为RNN完全由可微操作组成,所以我们可以运行反向传播算法(这只是一个递归的应用程序。)从微积分的链式规则),以确定我们应该调整它的每一个权重,以增加正确目标的分数(绿色粗体数字)。然后,我们可以执行一个参数更新,它在这个梯度方向上将每个权重推到一个很小的数量。如果我们要在参数更新后向rnn提供相同的输入,我们会发现正确的字符(例如,第一步中的“e”)会稍微高一点(例如2.3而不是2.2),而不正确字符的分数会稍微低一些。然后我们反复重复这个过程多次,直到网络收敛,它的预测最终与训练数据一致的正确字符总是预测下一个。

 

猜你喜欢

转载自blog.csdn.net/weixin_38241876/article/details/84975349