吴恩达《深度学习》第五课第一周

序列模型——循环序列模型

1.1为什么选择序列模型?

1.使用序列模型的实例:

语音识别、音乐合成、情感分类、DNA序列分析、机器翻译、视频行为检测、命名实体识别

1.2数学符号

1.命名实体识别示例:

X:输入(待识别的文本)

Y:输出(某单词是否为人名,是=1,不是=0)

T_x:输入序列的长度

T_y: 输出序列的长度

X<t>:时序输入数据的t索引值

Y<t>:时序输出数据的t索引值

X(i):第i个样本

X(i)<t>:第i个样本的第t个元素

T(i)_x:第i个样本的长度

y(i)<t>:第i个样本输出序列的第t个元素

T(i)_y:第i个样本的输出序列的长度

2.如何表示句子中的单词

(1)创建词典/词表,其中包含表示方法中要用到的单词,通常词典的规模在3-5千,大型互联网公司甚至可以使用10万甚至更大的词典

(2)使用one-hot法表示输入数据中的每个单词(one-hot即生成一个向量,该向量中除了单词在词典中的对应位置赋值1,其余为0)

(3)将输入的各个单词的one-hot矩阵组合在一起构成输入矩阵,与之对应的样本输出y,二者之间构成对应关系,进行监督训练

(4)如果遇到不在词典中的单词,则新建

1.3循环神经网络模型

1.为什么不使用标准网络

存在的问题:输入和输出数据在不同的样本中有不同的长度;权重无法共享,输入层的权重系数太复杂

2.循环神经网络RNN结构

RNN中只引入了当前步骤之前的信息,对于之后的信息不能有效利用,BRNN可以处理这个问题。

前向传播的计算

3.简化计算

1.4RNN的穿越反向传播

1.RNN前向反向传播流程图

其中最重要的递归运算是针对a<t>的反向传播过程,这个过程也成为通过时间(穿越时间)反向传播,因为从右到做左传播正好与时间顺序相反,如同穿越了一般。

1.5不同类型的循环神经网络

1.在RNN中并不是每种网络中T_x总等于T_y

2.RNN的常见结构

(1)多对多

(2)多对一

(3)一对一

(4)一对多

(5)数量不同的多对多

1.6语言模型和序列生成

1.语言模型是什么?

例如在语音识别系统中,如果对一段语音有多种可能输出,那么语言模型可以为这些输出赋予一个概率,然后根据概率的高低来选择一个作为输出。因此语言模型要做的就是:当输入一个句子(文本序列),然后在输出序列中估计每个单词出现的可能性,也就是更符合人类语言习惯的一个模型。

2.RNN语言模型

(1)设定训练集:某种语言的文本资料库

(2)标志化:对输入的文本进行标识y<1>,y<2>,…在结尾加<EOS>字符;如果遇到不在词典中的单词,可用<UNK>来标识。

(3)使用RNN来构建序列的概率模型,在该模型中会考虑前一步预测出的结果(由softmax层给出,因为one-hot对应着整个词典),并将其赋值给本步的输入。

1.7对新序列采样

1.作用:在训练好序列模型之后,想了解模型学习到了什么的一种非正式做法。

2.序列采用:对于已训练好的RNN会根据大量的语言文本来训练模型,其最终会输出一个符合某一语言习惯的模型,也可以说是一个单词间关系的概率分布。当听到第一个词之后不给予其任何提示,让语言模型按照概率给出一个y<1>_hat值,并将这个值作为第二个时间步输入,直到<EOS>

3.字符语言模型:该模型将字符a-z,0-9,符号作为词典,对文本中逐个字符进行识别,这样模型会消耗大量的算力。

1.8RNN的梯度消失

1.深层神经网络反向传播的过程中会存在梯度消失的问题,影响模型训练的时间和速度,RNN也同样存在这样的问题,后面时间步的偏差很难回传到前面的时间步,导致模型不能长期依赖。直观理解就是很难让一个神经网络能够意识到它自己需要记住前面看到的名词是单数还是复数,即摆脱下图中两个逗号之间的可任意长的句子,这是RNN的主要问题。

2.RNN也会出现梯度爆炸问题,但是由于梯度爆炸问题中参数会溢出而导致出现nan或者不正常的数据,因而我们能够及时发现并采用梯度修剪来解决。梯度修剪就是观察梯度向量,如果大于某个阈值则缩放向量,保证它不会太大。

1.9 GRU(Gated Recurrent Unit)门控循环单元

1.作用:改变RNN的隐藏层,使其可以更好的捕捉深层连接,改善梯度消失问题。

2.RNN单元

下图为RNN隐藏层中一个单元的可视化呈现

3.GRU单元(简化)

门控循环单元可以更好的捕捉非常长范围的依赖,让RNN更加有效。GRU增加了memory cell(C)用来提供记忆功能,在GRU中令

在每个时间步上,我们将用一个候选值重写记忆细胞C<t>_tilde

在GRU中最重要的部分是设置一个更新(u)门(gamma_u),其值介于(0,1)之间

通常gamma_u取之为非常接近0或1,其决定是都更新c,即是否让C<t>_tilde生效

因此在解决cat的单复数问题时,可以假设将c=1表示单数,C=0表示复数,然后GRU单元将会一直记住这个c值一直传递到句子后面的be动词处,此时将告诉这个be动词c=1,因此采用was。gamma_u决定了什么时候更新C值,因此C<t>的实际值为:

如果gamma_u=1即需要更新时C<t>=C<t>_tilde,在往后传递的过程中gamma_u=0则不更新C<t>使得一直传递到be动词处。

4.完整的GRU算法

增加了gamma_r表征C<t-1>与C<t>的关联性

1.10LSTM

长短时记忆法比GRU更强大更常用,在LSTM中C<t>不再等于a<t>。LSTM与GRU的公式对比如下图:

这是一个LSTM的简单实现,应用中更新门、遗忘门和输出门中还会增加“偷窥孔连接”来引入C<t-1>的值。

2.GRU和LSTM的选择没有一个准则,LSTM有三个门因此更灵活,而且提出时间比较早,目前是工业界默认的选择方式,但是GRU是对LSTM的简化,训练更快速更适合扩展网络的深度。

1.11 双向RNN

在RNN中存在这样一个问题,仅凭当前和之前的信息无法判断当前信息的真正含义,比如:

为了解决这个问题我们需要一种新的架构,试着将未来的信息反传回来供训练使用,于是双向RNN被提出。

绿色的激活值回路表示反传的信息,但需要加以区分的是反传与反向传播不同,它属于前向传播的一部分。在前向传播中激活单元可以是GRU也可使LSTM

12.深层RNN

1.通常在学习非常复杂的函数时,需要把RNN多个层堆叠起来构成深层RNN,如下是一个三层的RNN网络:

计算a[2]<3>激活值的公式如下:

每一层有各自的W[l]_a和b[l]_a

猜你喜欢

转载自blog.csdn.net/u013093426/article/details/81411241