全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
1065 0
2020-11-03
神经网络的序列建模-第一部分
Zied HY的客座博客文章。Zied是 Capgemini Consulting的高级数据科学家。他 专门研究利用传统统计方法(广义线性模型,混合效应模型,Ridge,Lasso等)和现代机器学习技术(XGBoost,随机森林,内核方法,神经网络等)构建预测模型。Zied 为对数据科学及其应用感兴趣的大学生(ESSEC,HEC,Ecole理工学院)举办了一些研讨会,他是 总部位于巴黎的中央采购办公室全球国际贸易(GIT)的联合创始人。
语境
在上一课程《深度学习简介》中,我们了解了如何使用神经网络为许多示例的数据集建模。好消息是,无论什么应用,神经网络的基本体系结构都是通用的:几个感知器的堆叠以构成复杂的层次模型,并使用梯度下降和反向传播对其进行优化。
尽管如此,您可能已经听说过多层感知器(MLP),卷积神经网络(CNN),递归神经网络(RNN),LSTM,自动编码器等。这些深度学习模型彼此不同。尽管从根本上说,每个模型都共享相同的基本体系结构,但众所周知每个模型在某些特定任务中的性能都很高。
它们之间的区别在于它们更适合某些数据结构的能力:文本处理可能与图像处理不同,而图像处理又可能与信号处理不同。
在本文的上下文中,我们将重点介绍将序列建模为众所周知的数据结构,并将研究其特定的学习框架。   
在日常业务实践中,序列建模的应用很多。他们中的一些人在服务质量和客户参与度方面迎接了当今的挑战。这里有一些例子:
语音识别可聆听客户的声音。
机器语言翻译,从多种源语言到更通用的语言。
主题提取以查找客户翻译查询的主要主题。
语音生成具有对话能力并以类似于人的方式与客户互动。
文字总结客户反馈,以应对关键挑战和痛点。
在汽车工业中,自动泊车也是序列建模的任务。实际上,停车可以看作是一系列运动,下一个运动取决于前一个运动。
其他应用程序包括文本分类,将视频翻译为自然语言,图像标题生成,手写识别/生成,异常检测,以及将来的更多功能……我们目前尚无法想到(或意识到)。
但是,在继续进行序列建模的应用程序之前,请让我们了解谈论序列时要处理的内容。
序列建模简介
序列是一种数据结构,其中每个示例都可以看作一系列数据点。这句话:“我目前正在阅读有关使用神经网络进行序列建模的文章”,这是一个由多个单词组成且彼此依赖的单词的示例。同样适用于病历。一份单一的病历包含跨时间的许多测量。语音波形也一样。
那么,为什么我们需要一个不同的学习框架来对序列进行建模,以及我们在该框架中寻找的特殊功能是什么?
出于说明目的,在不失一般性的前提下,让我们将文本作为单词序列来关注,以激发对不同学习框架的这种需求。
实际上,机器学习算法通常要求将文本输入表示为固定长度的向量。训练模型(网络)所需的许多操作可以通过在输入特征值矩阵和权重矩阵上进行代数运算来表示(想想一个n-p设计矩阵,其中n是观察到的样本数, p是在所有样本中测得的变量数)。
文本的最常见固定长度矢量表示法是单词袋或n-gram袋,这是由于其简单性,效率和通常令人惊讶的准确性。但是,词袋(BOW)表示有许多缺点:  
首先,单词顺序丢失了,因此只要使用相同的单词,不同的句子就可以具有完全相同的表示形式。例如:“食物很好,一点也不差。” vs“食物不好,一点也不好。”。即使n-gram袋在短上下文中考虑单词顺序,它也会遭受数据稀疏和高维度的困扰。
另外,单词袋和n-gram袋对单词语义的了解甚少,或更正式地说,单词之间的距离也很少。这意味着,尽管在语义上“强大”比“巴黎”更接近“强大”,但“强大”,“强大”和“巴黎”两个词的距离相等。
人类不会每秒都从头开始思考。阅读本文时,您会基于对先前单词的理解来理解每个单词。传统的神经网络无法做到这一点,这似乎是一个重大缺陷。单词袋和n-gram袋作为文本表示形式不允许跟踪同一句子或段落内的长期依存关系。
使用传统神经网络(例如前馈神经网络)对序列建模的另一个缺点是无法跨时间共享参数。让我们以这两个句子为例:“星期一下雪”和“星期一下雪”。尽管细节在序列的不同部分中,但这些句子含义相同。实际上,当我们将这两个句子输入到前馈神经网络中以进行预测任务时,该模型将在每个时间为“星期一”分配不同的权重。如果有关序列的事情出现在序列中的不同点,则不会转移。共享参数使网络能够在序列中的任何地方而不是仅在某个区域中查找给定的功能。  
因此,要对序列建模,我们需要一个特定的学习框架,该框架应能够:
处理可变长度序列
维持顺序
跟踪长期依赖关系,而不是将输入数据缩短得太短
在整个序列中共享参数(因此不要在整个序列中重新学习事物)
递归神经网络(RNN)可以解决此问题。它们是具有循环的网络,可以使信息持久存在。
因此,让我们进一步了解RNN!
递归神经网络
递归神经网络如何工作?
循环神经网络的构建方式与“传统”神经网络相同。我们有一些输入,我们有一些隐藏的层,我们有一些输出。
唯一的区别是每个隐藏单元的功能都略有不同。因此,让我们探索这个隐藏单元的工作方式。
循环隐藏单元计算输入及其自身先前输出(也称为单元状态)的函数。对于文本数据,输入可以是代表n个单词的句子中的单词x(i)的向量(也称为单词嵌入)。   
W 和U是权重矩阵,tanh是双曲正切函数。   
同样,在下一步中,它计算新输入及其先前单元状态的函数:s2 = tanh(Wx1 + Us1)。此行为类似于前馈网络中的隐藏单元。序列的不同之处在于,我们要添加一个附加术语以合并其自身的先前状态。   
查看递归神经网络的一种常见方法是跨时间展开它们。我们可以注意到在整个序列中我们使用相同的权重矩阵W和U。这解决了我们的参数共享问题。我们没有针对序列中每个点的新参数。因此,一旦我们学到了一些东西,它就可以应用于序列中的任何一点。     
对于序列的每个点都没有新参数的事实也有助于我们处理可变长度序列。如果序列的长度为4,我们可以将此RNN展开为四个时间步长。在其他情况下,由于该序列的长度未在算法中预先指定,因此我们可以将其展开到十个时间步长。通过展开,我们仅表示我们为整个序列写出了网络。例如,如果我们关心的序列是5个单词的句子,则该网络将展开为5层神经网络,每个单词一层。
注意:
Sn(时间n处的单元状态)可以包含来自所有过去时间步长的信息:每个单元状态都是前一个自身状态的函数,而后者又是前一个单元状态的函数。这解决了我们的长期依赖问题。  
上图在每个时间步都有输出,但是根据任务的不同,可能没有必要。例如,当预测一个句子的情感时,我们可能只关心最终的输出,而不关心每个单词之后的情感。同样,我们可能不需要每个时间步都输入。RNN的主要特征是其隐藏状态,该状态捕获有关序列的一些信息。
现在我们了解了单个隐藏单元的工作原理,我们需要弄清楚如何训练由许多隐藏单元甚至许多隐藏单元的多层组成的整个递归神经网络。
我们如何训练递归神经网络?
让我们考虑以下任务:对于一组英语语音,我们需要模型自动将口语转换为文本,即在每个时间步,该模型都会根据语音的一部分生成笔录(输出)的预测此时间步(新输入)和上一个记录(上一个单元格状态)。
自然,因为我们在每个时间步都有输出,所以在每个时间步都可能会有损失。这种损失反映了预测的笔录与“正式”笔录相距多少。
总损失只是每个时间步的损失之和。
由于损失是网络权重的函数,因此我们的任务是找到实现最低损失的权重theta集。为此,如第一篇文章“深度学习简介”中所述,我们可以在每个时间步上应用带有反向传播(链规则)的梯度下降算法,从而考虑到额外的时间维度。   
W 和U是我们的两个权重矩阵。让我们为W尝试一下。   
知道总损耗是每个时间步的损耗之和,总梯度就是每个时间步的梯度之和:
现在,我们可以专注于单个时间步,以计算损耗相对于W的导数 。
易于处理:我们只使用反向传播。
我们记得s2 = tanh(Wx1 + Us1),所以s2也取决于s1,而s1也取决于W。这实际上意味着我们不能只将s2的导数相对于W保留为常数。我们必须进一步扩展它。           
那么s2如何依赖W呢?   
它直接取决于W,因为它正好进给(参见s2的公式)。我们还知道s2取决于s1,而s1取决于W。并且我们还可以看到s2取决于s0,而s0也取决于W。         
因此,关于W的损失的导数  可以写成:
我们可以看到,后两项基本上是将先前时间步长W对时间步长t的误差求和。这是了解我们如何建模长期依赖关系的关键。从一个迭代到另一个迭代,梯度下降算法允许移动网络参数,以使它们包括过去时间步长对误差的贡献。   
对于任何时间步长t,关于W的损失的导数可以写为:   
因此,为了训练模型(即估计网络的权重),我们对每个权重(参数)应用相同的反向传播过程,将其随时间推移,然后在梯度下降过程中使用它。
为什么递归神经网络很难训练?
在实践中,RNN很难训练。要了解原因,让我们仔细看一下上面计算出的渐变:
我们可以看到,随着时间步长之间的差距越来越大,梯度的乘积也越来越长。但是,这些术语分别是什么?
每个项基本上都是两个项的乘积:换位的W和第二个项,后者取决于激活函数的导数f'。  
初始权重W通常是从标准正态分布中采样的,然后大多<1。  
事实证明(这里我不会证明,但本文会详细介绍),第二项是雅可比矩阵,因为我们针对向量及其2范数采用向量函数的导数将其视为绝对值,上限为1。这很直观,因为我们的tanh(或S型)激活函数将所有值映射到-1和1之间的范围内,并且导数f'以1为界(在S型中为1/4)。   
因此,对于矩阵中的较小值和多个矩阵乘法,梯度值将呈指数级快速缩小,最终在几个时间步长后完全消失。来自“遥远”步骤的梯度贡献变为零,并且这些步骤的状态不会对您所学的内容有所贡献:您最终不会学习长期依赖关系。
消失的梯度并非RNN专有。它们也发生在深层前馈神经网络中。只是RNN往往很深(在我们的案例中和句子长度一样深),这使问题变得更加普遍。
幸运的是,有几种方法可以解决梯度消失的问题。W矩阵的正确初始化可以减少梯度消失的影响。正则化也可以。更优选的解决方案是使用ReLU代替tanh或S型激活函数。ReLU导数为0或1的常数,因此不太可能出现梯度消失的情况。     
更为流行的解决方案是使用长短期内存(LSTM)或门控循环单元(GRU)体系结构。LSTM于1997年首次提出,可能是当今NLP中使用最广泛的模型。GRU是2014年首次提出的,是LSTM的简化版本。这两种RNN架构均经过明确设计,以应对逐渐消失的梯度并有效地学习远程依赖性。我们将在本文的下一部分中介绍它们。
1
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群