大约半年前在coursera上学完了Ng的深度学习,受益匪浅。只不过时间长了,有的知识点也忘了。趁着寒假宅家,索性复习总结一遍。

第一周主要引入了循环神经网络,然后介绍了其基本结构,随后抛出普通RNN的问题(不能记录先前信息、梯度消失等),引出用于解决这些问题的改进RNN结构——GRU和LSTM,最后介绍了双向RNN和深层RNN。


Why sequence models

这一小节,介绍了序列模型的应用领域。比较常见的有语音识别情感分析机器翻译命名实体识别(前三个,在后面的编程作业都有涉及)。此外,还有音乐生成(文本生成)(作业有涉及)、DNA序列分析和视频动作识别。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结


Notation

这一小节,介绍了序列模型的标注方法,可以根据不同的应用场合采用不同的标记方法。比如在命名实体识别里面,对于一个句子x,如果出现的是人名,则输出1,否则为0。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结

对于每一个序列问题,都应该有一个词汇表,用于将序列中的每一个单词,映射成一个one-hot向量。但是仅仅映射成one-hot向量是不够的,还需要添加词向量才行(第二周会讲)。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结


Recurrent Neural Network Model

这一小节,从用传统神经网络来处理序列模型引发的问题,引出了RNN模型。

有两个问题,第一个是对于序列模型而言,每个样本的长度是不一样的,而传统NN的第一层Neuron数量又是固定的。第二个是对于序列问题而言,前后一般都有联系(单复数、时态等),而传统NN不能捕捉到这种联系。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结

由此,就引入了RNN模型

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结

让每一个样例中的每一个单词,依次循环进入网络,有多少个单词,循环多少次就行了,解决了长度不一的问题。让每一次循环都计算一个由前一次传来的激励a,解决了前后联系的问题,这就是RNN。

RNN Cell有两个输入,一个是前一次的激励a<t-1>,一个是当前文本x<t>。输出也有两个,一个是当前激励a<t>,一个是当前文本输出y-hat<t>。

但这种RNN也有一个问题,就是只能利用前面的信息,而不能利用后面的信息,后面介绍的双向RNN就能解决这个问题。


Backpropagation through time

这一小节,讲了RNN中的BP算法,跟传统NN一样,用来更新参数。既然是BP算法,首先就得确认一个损失函数,对于每个样例的每个序列,用了交叉熵损失,然后把每个样例的所有序列的损失加起来,得到一个样例的损失,最后把所有样例的损失加起来,就是总损失。然后,就用这个总损失,依次对网络的参数进行求偏导,利用梯度下降,进行更新。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结


Different types of RNNs

这一小节讲了不同的RNN结构。

One to Many:只有一个输入,N个输出。应用有音乐生成、文本生成。

Many to One:只有一个输出,N个输入。应用有情感分析。

Many to Many:N个输入和N个输出,如下图有两种结构。第一种可以用于命名实体识别,第二种则用于机器翻译(前面编码,后面解码)。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结


Language model and sequence generation

语言模型就是评估一个模型生成的句子的概率,是序列生成和机器翻译的基础。下例中,pear的概率应该要比pair大。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结

语言模型需要一个大的文本,需要Tokenize,即把文本中的每一个单词映射成一个one-hot向量。对于末尾则添加EOS标记,对于没有在词汇表中出现,无法映射成one-hot向量的单词,则标记为UNK

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结

语言模型的训练过程是:先用初始化的a<0>,x<1>送入RNN,得到一个输出y-hat<1>,然后把序列中的单词依次送入RNN,得到相应的输出y-hat<t>,(注意这里跟稍后的采样不一样,采样是把y-hat作为下一次的输入),最后定义一个交叉熵损失,看模型依次生成的单词原文本单词的损失。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结


Sampling novel sequences

采样,是作用于训练好的模型上的。每一次,用上一次RNN的输出y-hat作为下一次的输入,依次生成出序列。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结

常见的有两种语言模型。一种是基于的,一种是基于字符的。字符级别的语言模型不用担心UNK的问题,但缺点是遇到长的文本,序列会很长,无法有效记住之前的信息,同时训练难度大。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结


Vanishing gradients with RNNs

层数比较深的网络,多少都会遇到梯度爆炸梯度消失的问题。梯度爆炸相对来说要好解决一点,可以利用gradient clip(大于小于某个值,置为这个值)。而梯度消失则比较难办。

RNN的梯度消失,表现在越靠前的梯度信息越不好计算,也就是后面词前面词联系越来越模糊。比如一个cat一大串was,cats一大串were,很难捕捉到是was还是were,这样的RNN记忆力不行。

 


Gated Recurrent Unit(GRU)

为了解决普通RNN记忆力不行(同时解决梯度消失)的问题,人们提出了改良的RNN Cell——GRU Unit。

GRU的脑洞是这样:既然随着网络层数的增加,前面的信息不容易保留,那么让它一直保留不就行了?(有点ResNet的感觉!)所以,GRU每一次的激励a,不一定要重新计算,而是有一个“”来控制,该你a更新的时候你才能更新

具体一点,在下例的The cat,which already ate ... was full,“门”在cat的时候为1,在其它地方,“门”都是关着的,这样,cat时的c值就不会改变,到了be动词需要确定单复数的时候,由于c值保留的是cat的信息,所以be动词就是was,而不是were。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结

此外,完整的GRU还有个Relevance Gate,用来表示c<t-1>和c<t>的相关程度。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结


LSTM

LSTM,长短记忆模型,是GRU的升级版(应该来说GRU是LSTM的简化版,毕竟LSTM比GRU早)。思路和原理跟GRU如出一辙,只是门更多了,同时输入也多了一个。两者都能记忆,效果差别不大。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结

两者对比

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结


Bidirectional RNN

前面说了,单向的RNN无法利用后面的信息,而双向RNN可以解决这个问题。这里的绿线路径,可不是BP,而是一个反向FP,从文本末尾馈入,看某个词的前一个词是什么。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结


Deep RNNs

前面的RNN都是单层的,多层RNN就是把前面一层的输出作为下一层的输入,如此联系,得到深度RNN。

【笔记】吴恩达 深度学习 序列模型 第一周 知识点总结


至此,第一周完结。

相关文章:

  • 2021-08-13
  • 2021-05-10
  • 2021-09-15
  • 2021-08-01
  • 2021-07-18
  • 2021-05-08
  • 2021-07-17
  • 2021-10-08
猜你喜欢
  • 2021-08-09
  • 2021-09-18
  • 2021-05-24
  • 2021-04-17
  • 2021-12-21
  • 2021-06-14
  • 2021-04-24
相关资源
相似解决方案