作者:jliang
《深度学习工程师-吴恩达》04序列模型--循环序列模型 总结
1.重点归纳
1)循环神经网络(RNN)
(1)循环神经网络(RNN)之类的模型在语音识别、自然语言处理和其他领域中一起变革,它属于监督学习,X和Y有时会不一样长,有时候会一样长。
(2)例子:语音识别、音乐生成、文本情感分类、DNA序列分析、机器翻译、视频行为识别、命名实体识别
(3)符号说明
- x<t>代表一个输入序列某个值,y<t>代表输出序列中某个值
- x(i)<t>代表第i个输入序列中的第t个元素,训练集里不同的训练样本有不同的长度
- y(i)<t>代表第i样本的输出序列中的第t个元素
(4)在NLP领域,输入单词x<t>使用固定大小(商业领域一般使用3万-5万大小,大型互联网公司甚至使用上百万)字典的onehot向量表示,目的是用这样的表示方式表示X,用序列模型在X和目标输出Y之间学习建立一个映射。如果单词在字典中没有出现,则使用一个叫unknown word(UNK)的伪造单词表示。
2)RNN对比标准神经网络预RNN
(1)标准的神经网络的问题
- 不同的样本输入和输出数据有不同的长度。使用填充的方式使每个输入语句都达到最大长度,但仍然不是很好的表达方式。
- 神经网络结构并不共享从文本的不同位置上学到的特征。
- 例子:已经学习到了在位置1出现Harry可能是人名的一部分,如果Harry出现在其他位置时,它也能够自动识别其为人名的一部分的话就很棒了。
- 输入序列是onehot向量(如每个值用10000维代表),这会是一个十分庞大的输出层,第一层的权重矩阵就会有着巨量的参数。
(2)RNN没有以上两个问题
- x<t>代表一个输入序列中的某个元素(字符串中的一个词/字),相当于把输入序列的每个元素逐个输入到模型中,而不是一次把所有元素一次输入。网络结构共享了从文本不同位置上学习到的特征,并且有效的减少了权重矩阵的参数。
- a<t>为时间步t的激活值,被传递到时间步t+1中。在零时刻a<0>可以随机用其他方法初始化,但是可以使用0初始化是最常见的初始化方法。
- 在预测y<3>时,不仅要使用x<3>的信息,还要使用x<1>和x<2>的信息。
- 公式
3)通过时间的反向传播
(1)正向传播:
(2)损失函数为交叉熵
- 单个输出的损失:
- 序列的总损失:
(3)
- 用梯度下降法来更新参数
- 反向传播过程中最重要的信息传递是参数a从右到左的运算,这个算法另外一个名字叫通过/穿越时间反向传播
4)不同类型的循环神经网络
(1)one to one网络是一个小型的标准神经网络,输入x,输出y,就是前面讨论的神经网络。
(2)many to many网络中还有一种输入和输出数量不一样的情况,像机器翻译的应用中,输入句子的单词的数量和输出句子的单词数量可能不同。
5)语音模型和序列生成
(1)语言模型的基本工作就是输入一个文本序列,会估计某个句子序列中各个单词出现的可能性。
- 例子:语音识别系统中,听到的声音可能如下。从语义理解上应该是第二句,使用语言模型的语义识别系统能计算出两句话的可能性。
- The apple and pair salad.
- The apple and pear salad.
(2)语言模型训练
- 需要一个包含很大的文本语料库的训练集。
- 句子标记化:转换成one-hot向量,如果单词不在预定义字典中,使用UNK来代表
- 构建一个RNN来构建这些序列的概率模型
(3)RNN模型
- a<0>和x<0>初始化为0向量作为输入,经过softmax后输出句子中第1个输出单词的概率
- 使用上一步得到的a<1>以及训练样本中的第一个词y<1>,经过softmax后输出句子中第2个单词的条件概率p(x | cats)(x代表字典中每个词)
- 第3个输出是前面两个词出现的前提下的概率p(x|"cates average")
- RNN的每一步都会考虑前面得到的单词,给出下一个词的分布
- 代价函数是交叉熵
6)对新序列采样
(1)在训练一个序列模型之后,要想了解这个模型学到了什么,一个非正式的方法就是进行一次新序列采样。
(2)基于字符的语言模型的采样例子
- 左边是使用新闻文章训练的模型,采样得到的内容有点像不太合乎语法的新闻文本。
- 右边是使用莎士比亚的文章训练的模型,采样得到的内容听起来很像莎士比亚写的东西。
(3)基于字符的RNN结构
- 字典仅包含从a-z的字母、空格、标点符号、数值0-9、A-Z大写字母(如要区分)
- 基于字符的语言模型比基于词汇的语言模型,输入输出序列元素都是单独的字符,不会出现未标识的词汇的情况
- 主要的缺点就是最后会得到太多太长的序列,很难捕捉句子中的依赖关系,训练起来计算成本比较高昂
- 绝大多数语言模型都是使用基于词汇的语言模型。如需要处理大量未知的文本或未知词汇的应用,或者面对很多专业词汇的场景会使用基于字符的RNN。
7)RNN梯度问题
(1)梯度消失是RNN的一个很大的问题:句子有长期的依赖,最前面的单词对句子后面的单词有影响,基本RNN模型不擅长捕获这种长期依赖效应,
- RNN从左到右前向传播(在时间步上的传播),然后再从右到左反向传播。类似深层神经网络很难把输出层的梯度传播到前面层,CNN反向传播会很困难,因为同样的梯度消失的问题,后面层的输出误差很难影响前面层的计算。
- 基本的RNN模型会有很多局部影响,意味着这个输出只会收到最近的输入值影响,而很难受序列比较靠前的输入的影响。
- 在训练RNN时首要的问题是梯度消失问题,梯度消失更难解决
(2)梯度爆炸问题
- 在一个很深的网络中,还会遇到梯度爆炸问题,随着层数的增多,梯度不仅可能指数型下降,也可能指数型上升。
- 梯度爆炸很容易被发现,参数变得极其大以至于网络参数崩溃;会看到很多NaN或者不是数字的情况,意味着计算出现数值溢出。
- 解决方法就是梯度修剪:观察你的梯度向量,如果它大于某个阈值,缩放梯度向量,保证它不会太大。这是相对鲁棒的解决办法。