总算,我们把《深度学习专项》的最后一门课《序列模型》学完了。这门课主要讨论了和序列数据相关的深度学习方法,介绍了以RNN为代表的经典序列模型和Transformer自注意力模型这两大类模型。同时,这门课还介绍了一些常见自然语言处理问题的基础知识和建模方法。让我们回顾一下RNN、Transformer、NLP这三个方面的知识。
所有知识按技能树的形式组织,学完了上一层的才能学下一层的。部分知识是派生出来的,学会与否不影响后续知识的学习,这些知识的前置条件会特别标出。
RNN
0. RNN 处理的数据种类:序列数据
常见的序列数据有:语音、文字、DNA、视频。
1.1 RNN 的结构
使用这种结构的原因:如果用全连接网络,既无法处理任意长度的句子,又不能共享每一处数据的知识。而 RNN 既能用同样的方法处理每一处数据,又能用一个隐变量表示上下文信息以描述序列关系。
1.2 RNN 的梯度问题
RNN 的梯度可能爆炸也可能消失。梯度爆炸可以通过设置一个梯度最大值来解决。而梯度消失要靠结构改进解决。
下面是 PyTorch 的梯度裁剪函数的使用方法:
1 | optimizer.zero_grad() |
1.3 多层 RNN
竖着堆叠 RNN。由于 RNN 计算较慢,一般叠 3 层就算很多了。
想要进一步提高网络的拟合能力,可以在输出模块里多加一些非时序的神经网络。
GRU (需学习 RNN)
序列一长,靠前的数据的梯度就容易消失。GRU 解决了这一问题。
GRU 改进了普通的 RNN,每次更新隐变量时会使用一个0~1之间的更新比例,防止之前的信息被过快地忘记。
LSTM (需学习 RNN, GRU)
LSTM 的作用和 GRU 类似,效果更好,但更费时。
双向 RNN (需学习 RNN)
等价于正着跑一遍 RNN,倒着跑一遍 RNN,输出结果由前向和后向的两个隐变量决定。
碰到一个新的序列任务时,双向 LSTM 依然是首选。
2. 序列问题的 RNN 建模方法
RNN 只提供了N对N的序列问题的解决方法。对于其他输入输出格式的问题,需要进行巧妙的建模,才能使用 RNN 来解决问题。
其中,最重要的是不等长多对多数据的建模方法。前半段只输入不输出的部分叫做编码器,后半段只输出不输入的部分叫做解码器。这种“编码器-解码器”架构是一种经典的 RNN 架构。
RNN 可以轻松地完成序列生成任务:输出下一个单词的 softmax 的预测结果,挑选概率较高的一个作为下一次的输入,循环执行。找到总体较好的一个输出的算法叫做 Beam Search。
3. 注意力模型
一种加强版 RNN 架构。它依然是一种“编码器-解码器”架构。编码器是双向 RNN,解码器是单向 RNN。每个输出的 RNN 对每个输入都有一个权重,该权重叫做注意力。每个输出从每个输入接收的数据是一个加权和。
Transformer
Transformer 是一类重要的模型。学习此模型之前最好学完 RNN。
Transformer 从多个角度改进了原序列模型。学习 Transformer 时,主要关注以下几方面的知识:
- 注意力和多头注意力
- 输出是怎样并行计算的
- 位置编码
1. 注意力
注意力的本质是全局信息查询。给出问题 Q,去现有的数据库 (K, V) 里查出一个 V 的加权和,权重由 Q, K 的相似度决定。
2.1 自注意力
自注意力是注意力的一个应用。当 Q, K, V 都是同一个张量时,注意力计算起到是特征提取的作用。相对于 CNN,自注意力更能提取全局信息。
2.2 输出对输入的注意力
注意力机制在早期的注意力模型中是用来计算每个输出对每个输入的权重的。Q 来自输出,K, V 来自输入。
2.3 多头注意力
多头注意力是普通注意力计算的一个加强版。首先,它引入了可学习参数,能够让注意力模块学习要提取哪些特征;其次,它可以像卷积层一样提取多个特征。
3. 并行解码
对于输入序列$(x_1, …, x_s)$,它会被编码器编码成中间表示 $\mathbf{z} = (z_1, …, z_s)$。给定$\mathbf{z}$的前提下,解码器输入$(y_1, …, y_t)$,输出$(y_2, …, y_{t+1})$的预测。
为了模拟解码器的串行执行,其第一个多头注意力有掩码机制,盖住了此时刻之后的数据。
4. 位置编码
由于 Transformer 没有利用到数据的先后顺序这一信息,包含位置信息的位置编码会作为额外输入加到输入的张量上。
NLP 知识
为了更好地介绍 RNN,《深度学习专项》补充了很多 NLP知识。
词汇表
为了表示单词,要实现准备一个包含所有要用到的单词的词汇表。每个单词用一个 one-hot 向量表示。若一个单词在词汇表里的序号是 i,则其 one-hot 向量的第 i 个元素为1。
词嵌入 (需学习 RNN 结构、RNN 建模方法)
one-hot 编码是没有任何含义的。词嵌入是每个单词的一种有意义的表示,向量间的差能够表示语义上的差距。
词嵌入要在某些任务中学习得到。词嵌入的学习方法有:语言模型、Word2Vec、负采样、GloVe。
学习好了词嵌入后,词嵌入应该放在其他任务的神经网络的第一层,作为输入数据的一种预处理方法。
BLEU Score
BLEU Score 是为了评价机器翻译而提出的指标。如果模型输出的翻译和参考译文有越多相同的单词、连续2个相同单词、连续3个相同单词……,则得分越高。
总结
《深度学习专项》的第五门课主要介绍了这三个方面的知识。如果你以后不从事 NLP 的研究,可以略过 NLP 的知识。而 RNN 和 Transformer 的知识是必须要学的。学 RNN 时,主要关注各个问题是怎么用 RNN 建模的;而学 Transformer 时,要更加关注模型的结构和原理。
深度学习的技术日新月异。上完了课后,最好去深入阅读一下经典论文,再去跟进最新的论文,尤其是 Transformer 这种较新的领域。
在看这篇总结时,如果你看到了不懂的地方,欢迎回顾我之前的笔记。