deeplearning.ai 第五部分

Week 1

1. 为什么选择序列模型

语音识别,输入语音,识别出内容。音乐生成,随便输入,输出一个音乐。语义识别。识别DNA序列,判断是哪个蛋白质。机器翻译,从一个语言到另一个语言。视频行为识别,从视频帧识别运动。名字识别。

image-20200816160530980
image-20200816160530980

2. 数学符号

输入一句话,输出任意一个单词是否是人名的一部分。输入一句话,每个单词进行一个二分类。

首先要有一个单词表,几万大的单词表比较常见。这里用10000单词的单词表。然后用one-hot编码表示句子里每一个单词。

image-20200830085949173
image-20200830085949173

3. 循环神经网络

第一个问题,输入的长度不一致。我们可以用padding。但似乎不好。第二个问题,似乎前后单词的联系没建立起来,不同位置的同一单词没有共享信息。

循环神经网络每一个时间步参数是共享的。有一个缺点,只用到了前面的信息,没有用到后面的信息。

image-20200830092749460
image-20200830092749460
image-20200830092800372
image-20200830092800372

4. 通过时间的反向传播

image-20200830093723117
image-20200830093723117

5. 不同类型的循环神经网络

循环神经网络是多对多的结构,如果要处理情感分类问题,那么输入应该是一个序列,但是输出可能就只是1-5中的1个数字。这时候我们可以对网络进行简化,只进行最后一个的输出。也就是多对一的结构。一对一就是将结构简化,类似我们之前学过的。还有一类,音乐生成,这就是一对多的结构,把第一次输出再放入第二次输入。

如果像语言翻译,长度不同,那可能要另一种多对多的结构。一个编码器部分,一个解码器部分。

严格来说,还有一种结构是注意力结构。

image-20200830095916919
image-20200830095916919

6. 语言模型和序列生成

对于语言识别,一句话的不同翻译都能计算出一个概率。比较这两个概率值,然后给出结果。

训练集是语料库。得到一个句子,将每个单词用one-hot编码。然后标注上\,可以识别出句子的结尾。要不要忽略标点符号。

如果有单词不在你的单词表里面,这种情况下可以把单词替换成\

每次输入前一个单词,输出预测的下一个单词。这样我们可以得到一个预测单词的模型。

image-20200830101134645
image-20200830101134645

7. 对新序列采样

训练一个之前的模型,然后我们用这个模型进行测试,输入一个单词,然后对输出的概率分布进行采样。把这个输入输出后面,作为$x^{<2>}$。一直采样,直到生成$$。这个过程中中间可能出现未知标记的词,也可以将其排除。

基于字符的语言模型。基于字符的语言模型可能会得到很多很长的序列,它在捕捉句子的依赖关系时候不是很行。

image-20200830102030699
image-20200830102030699

8. 循环神经网络的梯度消失

序列结构其实有长期依赖,比如主语和谓语的单复数之间有一个很长的定语。这样的序列模型,很难隔很久产生影响。

训练很深的网络时候会遇到梯度消失和梯度爆炸,时间序列很长那层数就会非常长。梯度爆炸比较容易解决,梯度消失很难解决。

image-20200830103304985
image-20200830103304985

9. GRU单元

GRU里面有个memory cell,所以后面帮助进行判断。$c^{}=a^{}$。GRU单元分为三个部分,一个计算,一个计算门,一个两者结合。很大概率保持不变,所以很可能传递记忆。

Full GRU

增加了新的门单元。

image-20200830110857740
image-20200830110857740

10. 长短期记忆网络

首先计算出$\tilde{c}^{}$,然后计算u门,f门和o门。单独记录更新门和遗忘门,最后输出门与之前结合。它有两条线,上面一条线很容易传递长期记忆。

什么时候GRU,什么时候LSTM,不同问题可以应用不同的算法。GRU优点是比较简单,可以构建比较多的模型,可以两个门,LSTM更大更灵活,三个门。一般来说,LSTM是默认的选择。但是GRU使用的越来越多,因为适合大模型而且更简单。

image-20200830111903587
image-20200830111903587

11. 双向神经网络

双向RNN。实体命名的网络,只看前面的信息是不够的,还需要更多的信息。

我们首先定义出一个普通的RNN,我们还要增加一个反向循环层。

获取整个语音表达,再识别。

image-20200830121636350
image-20200830121636350

12. 深层循环神经网络

就是竖着增加深度。但是一般不会很多,然后可以叠几个层,显得深度很高,然后左右不相互连接。

image-20200830122225419
image-20200830122225419

Week 2

1. 词汇表征

深度学习中的词嵌入很重要。通过词嵌入,就可以构建NLP模型了。

对于one-hot编码,这样每个单词的关联性太低了。算法不知道苹果和橘子的关系很近,所以算法很难从橘子的某种特性了解到苹果的某种特性。

特征进行表示,就是词嵌入了。后面我们回学习高维特征表示的算法。我们最终学习的特征,没有这么好理解,很难搞清楚,但却能使算法快速地发现。

得到300维的特征嵌入之后,通常还是会二维化一下,通常用t-SNE方法。

2. 使用词嵌入

继续实体识别的例子。对于生僻的词语,词嵌入比较有效,因为它有很多的无标签文本训练,通过读取大量的互联网文本,即便自己的数据集很小,效果也可以。迁移学习。

3. 词嵌入的特性

类比。对于两个向量,直接做差。发现man和wowan主要差距是性别,然后king和queen也是这样的差距,那么我们就完成了推理。找到两个平行向量即可。

image-20200830181229765
image-20200830181229765

如果映射到t-SNE再找平行线可能不行,因为t-SNE是非线性的。

所以找到平行时的位置,再找一个离算出来的距离比较近的点,余弦相似度这里用得多。余弦和欧式距离不同。

4. 嵌入矩阵

词嵌入实际就是学习一个嵌入矩阵。这个矩阵大小是嵌入的维数乘以单词数。实践中我们选择某列不是用乘法,而是切片。

5. 学习词嵌入

在深度学习历史上,人们最开始词嵌入很复杂,后面用简单的方法就能达到同样的效果。

假设正在构建一个语言模型,用到神经网络。首先得到one-hot编码向量,然后与嵌入矩阵相乘,得到嵌入向量。我们把这句话单词放入神经网络,然后softmax会在10000个单词中预测最后的单词。可能我们不是基于所有单词预测,而是有一个小的窗口,这样输入会小一点。用固定窗口导致输入总是相同的尺寸。

我们弄两个窗口,句子前面一个窗口,后面一个窗口。

还有一种做法是用nearby 1 word,这用到了skip-gram方法。

image-20200830184525831
image-20200830184525831

6. Word2Vec

Skip-grams

在模型中,我们抽取上下文与目标词对应,上下文不一定是离得最近的。我们随机抽取一个单词,然后在一定距离内选择目标词。

假设使用10000词的词汇表。我们要解决的基本监督学习问题是从某个单词映射到目标单词。比如orange到juice。我们可以从one-hot开始。然后找到在已知这个单词时,目标词是不同单词的概率。

softmax加速

但是每次softmax时候会有点慢,因为目标类太大了上万,这个算出求和来其实很慢。我们可以加速,比如用二叉树的思想构造一个分级的分类器。计算成本就是对数的了。实际使用中不是一个完全按平衡的二叉树,而是可能会被构造成类似霍夫曼树的样子。

7. 负采样

softmax算起来很慢,负采样能做到和skip-grams一样的效果,但是更快。

给定orange,juice,判断样本为正还是为负。选定一个上下文词,一个目标词,给定标签0或者1。接下来构造一个监督学习问题。我们不使用一个巨大的softmax,而是转化成10000个二分类的问题。每次训练k+1个二分类问题。

怎样选择负样本?可以根据词出现的频率对其采样,这样会导致对the之类的单词选取较多。对词频的3/4次方的采样。

image-20200830191813864
image-20200830191813864

8. GloVe词向量

image-20200830192855546
image-20200830192855546

9. 情感分类

情感分类就是给一句话,判断它的情感。

我们首先找一句话,每个单词找到词嵌入向量,然后把几个词嵌入求和或者平均,然后利用softmax进行判断。

或者用RNN,逐个单词输入,多对一,最后输出。不像之前加和平均不能意识到good和not good的区别。

10. 词嵌入除偏

减少歧视。就是说男的对应计算机程序,女性对应家庭主妇,这样的是存在偏见的。

如果我们要扩大人工智能的影响力,更广泛地使用,就得消除里面的偏见。人们逐渐在偏见上有了进展,但是实际语料中还是有很多的偏见。

词嵌入向量的简单做差,对于不该有偏见的,找到偏见的方向。

对于找到的偏见的方向,进行投影,摆脱bias。如doctor, babysitter这样的词。

最后对于本身存在差距的,把它们做到对称。如grandmother,grandfather。

image-20200830200044617
image-20200830200044617

Week 3

1. 基础模型

序列到序列模型。

对于翻译问题,我们想将依据法语翻译成英语,这时一个多对多的问题。

我们构造一个RNN的神经网络。一个编码网络,一个解码网络。

image2sequence。也可能输入一个图片,输出一个句子是对图像的描述。对于Alex网络,我们去掉最后的Softmax。

image-20200830201816683
image-20200830201816683

2. 选择最可能的句子

机器翻译模型的解码器其实跟语言模型很相似。翻译可以成为条件语言模型。

因为这样的翻译都是重新生成的,所以很可能有多种选择,我们要让条件概率最大化。我们要提出一个算法,让某个值最大化。

贪心算法其实不是很有用,我们要等到整个句子出来。我们定义一个y,需要让这个的概率最大化。相比之前的模型,随机生成,这里我们要找到最可能的生成,所以我们需要找一种合适的搜索算法。

image-20200830203857136
image-20200830203857136

3. 定向搜索

集束搜索算法。这里忽略大小写。我们设置beam width,那么模型不只考虑一个选择,而是考虑多个选择。然后beam search会把这几个都放到内存里。然后对于这几个单词之后的每一种可能都进行计算,这样我们选择可能很多,比如30000个选择,我们要从里面挑出最可能的几个结果。

beam width决定了不同的网络副本,如果等于1就是贪心算法。

image-20200830205401994
image-20200830205401994

4. 改进定向搜索

定向搜索的时候我们要找句子,有很多种可能。这个概率的计算,为了避免数值下溢,我们经常取个对数。因为log函数,它是严格单调递增的。所以我们最大化log跟原式结果是一样的。另外,还要除以长度,避免对长的式子的惩罚。另外,除以长度也可能是长度的某个指数,这个理论没有证明,但我们很多时候能得到一个更好的结果。

如何选择B?当然越多越好,但是计算代价越大。不是精确搜索,运行地较快,但可能找不到结果。

image-20200830215504619
image-20200830215504619

5. 定向搜索的误差分析

判断哪里除了问题。

我们有一个真实结果,一个开发集的结果,分别对应不同的概率。比较这两个概率,如果开发集小,代表没搜索到更好地结果。如果真实集小,那代表模型不太对。

image-20200830220507999
image-20200830220507999

6. Bleu得分

如果有多个很好的结果,如何评估准确性?

Bleu就是给定一个机器翻译,它可以计算一个分数,判断翻译得是否足够好。

image-20200830220937326
image-20200830220937326

7. 注意力模型直观理解

对于长句子,人工可能是一点一点地翻译。机器对于长句子,翻译地准确率效果可能会逐渐降低,因为记忆长句子比较困难。

注意力模型也会像人类一样,一点一点地翻译,所以长句子时候效果不会降低很多。

image-20200830221934215
image-20200830221934215

8. 注意力模型

image-20200830225519241
image-20200830225519241

9. 语音辨别

Sequence to Sequence,我们想实现的是从一个麦克风的语音序列生成文本。

以前的做法是把语音分成更小的音位单元来表示音频。不过在端到端的做法中,我们直接构建一个模型。用大量的数据进行训练。

10秒的视频很可能转化为1000个输入。CTC损失函数,允许ttt_h_eee这样的输出。CTC允许空之间是重复的字符。

image-20200830230524531
image-20200830230524531

10. 触发字检测

唤醒设备,就是触发字检测。

其中很可能有一个不平衡的问题,就是说触发词在整体语料中的比例太小了。

image-20200830231051379
image-20200830231051379
image-20200830231553599
image-20200830231553599