内容简介:在之前的深度学习简介中,我们了解了如何使用神经网络对许多示例的数据集进行建模。好消息是神经网络的基本架构在任何应用中都是非常通用的:堆叠几个感知器以组成复杂的层次模型,并使用梯度下降和反向传播进行优化。尽管如此,您可能已经听说过多层感知器(MLP),卷积神经网络(CNN),递归神经网络(RNN),LSTM,自动编码器等。这些深度学习模型彼此不同。众所周知,每个模型在某些特定任务中都具有特殊性能,即使从根本上说,它们都共享相同的基本体系结构。它们之间的区别在于它们更适合某些数据结构:文本处理可能与图像处理不
在之前的深度学习简介中,我们了解了如何使用神经网络对许多示例的数据集进行建模。好消息是神经网络的基本架构在任何应用中都是非常通用的:堆叠几个感知器以组成复杂的层次模型,并使用梯度下降和反向传播进行优化。
尽管如此,您可能已经听说过多层感知器(MLP),卷积神经网络(CNN),递归神经网络(RNN),LSTM,自动编码器等。这些深度学习模型彼此不同。众所周知,每个模型在某些特定任务中都具有特殊性能,即使从根本上说,它们都共享相同的基本体系结构。
它们之间的区别在于它们更适合某些数据结构:文本处理可能与图像处理不同,而图像处理又可能与信号处理不同。
在本文的背景下,我们将重点关注将 序列 建模 为众所周知的数据结构,并将研究其 特定的学习框架 。
序列建模的应用在日常业务实践中非常丰富。 其中一些产品的出现是为了满足当今服务质量和客户参与方面的挑战。 这里有一些例子:
-
语音识别能够倾听客户的声音。
-
机器语言从不同的源语言翻译成更常见的语言。
-
主题提取以查找客户翻译查询的主要主题。
-
语音生成具有会话能力并以类似人的方式与客户互动。
-
文本总结客户反馈,以解决关键挑战和难点。
在汽车工业中,自助停车也是一种序列建模任务。 实际上,停车可以看作是一系列的行动,其中下一个运动取决于之前的运动。
其他应用程序包括文本分类,将视频翻译成自然语言,图像标题生成,手写识别/生成,异常检测等等,这些都是我们目前无法思考(或意识到)的。
然而,在我们进一步讨论序列建模的应用之前,让我们在讨论序列时理解我们正在处理的内容。
序列建模简介
序列是一种数据结构,其中每个示例都可以看作一系列数据点。 这句话:“我目前正在阅读一篇关于使用神经网络进行序列建模的文章”,这是一个由多个单词和单词相互依赖组成的例子。 这同样适用于医疗记录。 随着时间的推移,一个单一的医疗记录包括许多测量。 语音波形也是如此。
那么为什么我们需要一个不同的学习框架来模拟序列,以及我们在这个框架中寻找的特殊功能是什么?
为了便于说明而不失一般性,让我们将文本作为一系列文字集中在一起,以激发对不同学习框架的这种需求。
实际上,机器学习算法通常要求将文本输入表示为 固定长度的 矢量。 训练模型(网络)所需的许多操作可以通过对输入特征值矩阵和权重矩阵的代数运算来表达(考虑n-by-p设计矩阵,其中n是观察到的样本数,以及p是所有样品中测量的变量数)。
对于文本而言,最常见的固定长度矢量表示可能是 单词 袋或n-gram包,因为它简单,高效并且通常令人惊讶的准确性。 然而,词袋(BOW)表示有许多缺点:
-
首先,单词顺序丢失,因此不同的句子可以具有完全相同的表示,只要使用相同的单词即可。 例如:“食物很好,一点都不差。”vs“食物很糟糕,根本不好吃。” 即使n-gram包在短时间内考虑单词顺序,它也会受到数据稀疏性和高维度的影响。
-
另外,词袋和n-gram对词语的语义知之甚少,或者更正式地知道词之间的距离。 这意味着“强大”,“强大”和“巴黎”这两个词同样遥远,尽管语义上“强大”应该比“巴黎”更接近“强”。
-
人类每时每刻都不会从头开始思考。 当您阅读本文时, 您可以根据您对之前单词的理解来理解每个单词 。 传统的神经网络不能做到这一点,这似乎是一个主要的缺点。 作为文本表示的词袋和n-gram不允许跟踪同一句子或段落内的长期依赖性。
-
使用传统神经网络(例如前馈神经网络)建模序列的另一个缺点是不跨时间共享参数的事实。 让我们举个例子:“星期一,下雪了”,“周一下雪了”。 这些句子意思相同,但细节在序列的不同部分。 实际上,当我们将这两个句子提供给预测任务的前馈神经网络时,模型将在每个时刻为“星期一”分配不同的权重。 如果它们出现在序列中的不同点,我们学习的序列将不会转移。 共享参数使网络能够在序列中的任何位置查找给定的特征,而不是仅在某个区域中查找。
因此,为了模拟序列,我们需要一个特定的学习框架,能够:
-
处理可变长度序列
-
保持顺序顺序
-
跟踪长期依赖关系,而不是过短地减少输入数据
-
在整个序列中共享参数(所以不要重新学习整个序列中的事物)
递归神经网络(RNN)可以解决这个问题。 它们是具有循环的网络,允许信息持续存在。
递归神经网络
回归神经网络如何工作?
回归神经网络的构建方式与“传统”神经网络相同。 我们有一些输入,我们有一些隐藏的层,我们有一些输出。
唯一的区别是每个隐藏单元的功能略有不同。 那么,让我们来探讨这个隐藏单元的工作原理。
循环隐藏单元计算输入的函数及其自己的先前输出,也称为单元状态。 对于文本数据,输入可以是表示 n个 单词 的句子中 的单词 x(i) 的向量 (也称为单词嵌入)。
W 和 U 是权重矩阵, tanh 是双曲正切函数。 类似地,在下一步,它计算新输入及其先前单元状态的函数: s2 = tanh ( Wx1 + Us1 ) 。此行为类似于前馈网络中的隐藏单元。差异,适用于序列,是否我们正在添加一个额外的术语来合并其自己的先前状态。
查看递归神经网络的常见方法是跨时间展开它们。 我们可以注意到 在整个序列 中 我们使用相同的权重矩阵 W 和 U. 这解决了我们的参数共享问题 。 我们没有为序列的每个点都有新的参数。 因此,一旦我们学到了什么,它就可以应用于序列中的任何一点。
对序列的每个点都没有新参数的事实也有助于我们 处理可变长度序列 。 如果序列长度为4,我们可以将此RNN展开为四个时间步长。 在其他情况下,我们可以将其展开到十个时间步,因为在算法中没有预先指定序列的长度。 通过展开我们只是意味着我们为整个序列写出网络。 例如,如果我们关心的序列是5个单词的句子,则网络将展开为5层神经网络,每个单词一个层。
注意:
-
Sn ,时刻 n 的单元状态 ,可以包含来自所有过去时间步的信息:每个单元状态是先前自身状态的函数,而前一个自身状态又是先前单元状态的函数。 这解决了我们的长期依赖问题 。
-
上图在每个时间步都有输出,但根据任务,这可能不是必需的。 例如,在预测句子的情绪时,我们可能只关心最终的输出,而不是每个单词之后的情绪。 同样,我们可能不需要在每个时间步骤输入。 RNN的主要特征是其隐藏状态,它捕获有关序列的一些信息。
现在我们已经了解了单个隐藏单元的工作原理,我们需要弄清楚如何训练整个回归神经网络,它由许多隐藏单元组成,甚至包含许多隐藏单元的多层。
我们如何训练回归神经网络?
让我们考虑以下任务:对于一组英语演讲,我们需要模型自动将口语转换为文本,即在每个时间步,模型根据语音的词性生成成绩单(输出)的预测。此时间步长(新输入)和前一个记录(前一个单元状态)。
当然,因为我们在每个时间步都有一个输出,我们可以在每个时间步都有一个损失。 这种损失反映了预测的成绩单接近“官方”成绩单的程度。
总损失只是每个时间步的损失总和。
由于损失是网络权重的函数,我们的任务是找到 实现最低损失 的权重集 θ 。 为此,正如第一篇文章“深度学习简介”中所解释的那样,我们可以 在每个时间步长应用具有反向传播(链规则)的梯度下降算法 ,从而考虑额外的时间维度。
W 和 U 是我们的两个权重矩阵。 让我们试试 W吧 。
知道总损失是每个时间步长的损失之和,总梯度只是每个时间步长的梯度之和:
现在,我们可以专注于单个时间步长来计算相对于 W 的损失的导数 。
易于操作:我们只使用反向传播。
我们记得 s2 = tanh(Wx1 + Us1) 所以s2也取决于s1而s1也取决于W. 这实际上意味着我们不能将 s2 的导数 作为常数 保留 为 W。 我们必须进一步扩大它。
那么 s2 如何 依赖 W ?
它直接取决于W,因为它直接输入(参见 s2的 公式 )。 我们也知道 s2 取决于 取决于W的 s1 。我们还可以看到 s2 取决于 s0 ,这也依赖于W.
因此,关于 W 的损失的衍生物 可以写成如下:
我们可以看到,最后两个术语基本上将 W 在之前时间步长中 的贡献与 时间步长 t 处的误差 相加 。 这是理解我们如何建模长期依赖关系的关键。 从一次迭代到另一次迭代,梯度下降算法允许移动网络参数,使得它们包括对过去时间步的误差的贡献。
对于任何时间步 t ,相对于 W 的损失的导数 可以写成如下:
因此,为了训练模型,即估计网络的权重,我们对每个权重(参数)应用相同的反向传播过程,然后我们在梯度下降过程中使用它。
为什么回归神经网络难以训练?
在实践中,RNN有点难以训练。 要了解原因,让我们仔细看看上面计算的渐变:
我们可以看到,随着时间步长之间的差距变大,渐变的产物变得越来越长。 但是,这些术语是什么?
每个术语基本上是两个术语的乘积:转置 W 和第二个 术语 取决于f',激活函数的导数。
-
初始权重 W 通常从标准正态分布中采样,然后大多数<1。
-
事实证明(我不会在这里证明,但 本文 详细说明),第二项是雅可比矩阵,因为我们采用向量函数的导数相对于向量及其2范数,你可以将其视为绝对值, 上限为1 。 这具有直观意义,因为我们的tanh(或sigmoid)激活函数将所有值映射到-1和1之间的范围,并且导数f'的边界为1(在sigmoid的情况下为1/4)。
因此,对于矩阵中的小值和多个矩阵乘法, 梯度值以指数方式快速收缩,最终在几个时间步之后完全消失 。 来自“遥远”步骤的渐变贡献变为零,并且这些步骤中的状态对您正在学习的内容没有贡献:您最终不会学习远程依赖。
消失的渐变不是RNN独有的。 它们也发生在深度前馈神经网络中。 只是RNN倾向于非常深(在我们的情况下与句子长度一样深),这使问题更加普遍。
幸运的是,有几种方法可以解决消失的梯度问题。 正确初始化 W 矩阵 可以减少消失梯度的影响。 正规化也是如此。 更优选的解决方案是使用 ReLU 而不是tanh或S形激活函数。 ReLU导数是0或1的常数,因此不太可能遭受消失的梯度。
更流行的解决方案是使用长短期存储器(LSTM)或门控循环单元(GRU)架构。 LSTM最初是在1997年提出的,也许是今天NLP中使用最广泛的模型。 2014年首次提出的GRU是LSTM的简化版本。 这两种RNN架构都明确地设计用于处理消失的梯度并有效地学习远程依赖性。 我们将在本文的下一部分介绍它们。
以上所述就是小编给大家介绍的《神经网络序列建模(一)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 神经网络的可解释性,从经验主义到数学建模(一篇icml)
- ICML 2019 | 神经网络的可解释性,从经验主义到数学建模
- 卡通ufo模型建模,C4D建模教程
- 数据建模NoSQL数据库的概念和对象建模符号
- 小商店建模教程,C4D零基础建模教程
- 面向NLP场景应用的智能辅助建模(二)--本体树建模
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。