05.序列模型

循环序列模型

序列模型的应用

下图是序列模型的部分应用场景:序列模型应用场景在深度学习中,序列模型的代表是循环神经网络Recurrent NeuralNetwork, RNN

数学符号

对于某一个序列数据 \(x\) (输入时间序列数据)相关符号约定如下:

  • \(x ^{\langle t\rangle}\) :表示这个数据中的第 \(t\) 的元素;
  • \(y ^{\langle t\rangle}\) :表示这个数据中的对应的第 \(t\) 的标签;
  • \(T _x\) :输入的数据长度;
  • \(T _y\) :输出的数据长度;
  • \(x ^{\left (i\right )\langle t\rangle}\):第 \(i\) 个输入序列数据(第 \(i\) 个样本)的第 \(t\) 个元素;
  • \(y ^{\left (i\right )\langle t\rangle}\):第 \(i\) 个输出(第 \(i\) 个样本对应的输出)的第 \(t\) 个标签;
  • \(T _x ^{(i)}\) :第 \(i\) 个输入序列数据(第 \(i\) 个样本)的长度;
  • \(T _y ^{(i)}\) :第 \(i\) 个输出(第 \(i\) 个样本)的长度。

例如输入是一段话, \(x ^{\langle t\rangle}\) 的表示方式为:首先建立一个词汇表(或者称为字典),根据要表示单词在词汇表中的位置,采用 one-hot 编码表示 \(x ^{\langle t\rangle}\) 对应的单词。例如单词 zulu 在词汇表的最后一位,则 \(x ^{\langle T _x\rangle}\) 表示为:$$\begin {bmatrix} 0\\0\\\vdots\\1\end {bmatrix}$$

  • 杂谈: one-hot 编码的缺点:
    每个单词被表示为完全独立的个体, 因此单词间的相似度无法体现。例如单词 hotelmotel 意思相近,但与 cat 不同,但:$$(x ^{\langle \text {hotel}\rangle}) ^T x ^{\langle \text {motel}\rangle} = (x ^{\langle \text {hotel}\rangle}) ^T x ^{\langle \text {cat}\rangle} = 0$$

循环神经网络模型

对于序列数据,如果使用标准的神经网络则存在如下问题:

  • 对于不同的例子,输入和输出可能有不同的长度,因此输入层和输出层的神经元个数无法确定;
  • 从文本的不同位置学习到的特征无法共享;
  • 模型参数多,计算量大。

循环神经网络Recurrent Neural Network, RNN )则没有上述问题。基本的 RNN 网络结构如下图所示:基本RNN结构当元素 \(x ^{\langle t\rangle}\) 输入相对应的时间步的隐藏层的同时,该隐藏层同时接收上一时间步的隐藏层的激活值 \(a ^{\langle t-1\rangle}\) 。图中的 \(a ^ {\langle 0\rangle}\) 一般初始化为零向量,每个时间步对应输出一个预测值 \(\widehat y ^{\langle t\rangle}\) 。
RNN 网络从左到右扫描输入数据,每个时间步对应参数共享。输入、激活、输出对应的参数分别为:\(W _{ax}\)、\(W _{aa}\)、\(W _{ya}\)(注:图中是 \(W _{ay}\) 最好改过来和视频一致)。
下图是一个基本的 RNN 网络的单元:基本RNN单元前向传播的计算公式为:$$a ^{\langle t\rangle}=g _1 (W _{aa}a ^{\langle t-1\rangle}+W _{ax}x ^{\langle t\rangle}+b _a)$$$$\widehat y ^{\langle t\rangle}= g _2 (W _{ya}a ^{\langle t\rangle}+b _y)$$$$a ^{\langle 0\rangle}=\overrightarrow 0$$激活函数 \(g _1\) 一般选择 tanh 函数,偶尔也选择 Relu 函数。激活函数 \(g _2\) 选择 Sigmoid 或者 Softmax 函数,取决于具体的应用(多分类还是二分类)。
将上述的前向传播公式符号简化如下:$$W _a =[W _{ax}, W _{aa}]$$$$a ^{\langle t\rangle} = g _1 (W _a [a ^{\langle t-1\rangle}, x ^{\langle t\rangle}]+ b _a)$$$$\widehat y ^{\langle t\rangle} = g _2 (W _y a ^{\langle t\rangle}+ b _y)$$将 \(W _{aa}\) 和 \(W _{ax}\) 水平并列为一个矩阵 \(W _a\) 将 \(a ^{\langle t-1\rangle}\) 和 \(x ^{\langle t\rangle}\) 堆叠为一个矩阵。
下图是 RNN 网络的前向传播示意图:RNN前向传播

反向传播

为了计算反向传播,需要定义一个损失函数。一个元素的损失函数(一个时间步)定义为交叉损失函数,如下:$$L ^{\langle t\rangle}(\widehat y ^{\langle t\rangle}, y ^{\langle t\rangle}) = -y ^{\langle t\rangle}\log \widehat y ^{\langle t\rangle} - (1- y ^{\langle t\rangle})\log (1- \widehat y ^{\langle t\rangle})$$进而得到整个序列的损失函数如下:$$J = \sum _{t=1} ^{T _x}L ^{\langle t\rangle}(\widehat y ^{\langle t\rangle}, y ^{\langle t\rangle})$$基本RNN 网络的反向传播公式如下图所示:RNN反向传播

不同类型的循环神经网络

某些应用场景中,输入和输出的长度可能不一样,根据输入和输出的序列长度,可以将循环神经网络划分为如下几种结构:RNN的几种结构目前介绍的模型只是使用序列之前的信息来预测当前的值,没有使用后文的信息。可以引入双向循环神经网络Bidirectional RNN, BRNN )解决。

语言模型和序列生成

语言模型会告诉特点句子出现的概率是多少,并以此为依据作出准确判断。建立语言模型所采用的训练集是一个大型的语料库,指众多句子组成的文本。第一步需要将输入的某个数据 \(x\) 标记化,即建立字典,采用 one-hot 编码。
将标记化后的训练集用于训练 RNN 网络,如下图所示:RNN训练在第一个时间步中,输入 \(a ^{\langle 0\rangle}\) 和 \(x ^{\langle 1\rangle}\) 其都是零向量,\(\widehat y ^{\langle 1\rangle}\)是通过 Softmax 预测出的字典中每个单词作为该句子第一个单词出现的概率;
在第二的时间步中,输入 \(x ^{\langle 2\rangle}\) 和 上一层的激活值 \(a ^{\langle 1\rangle}\) ,其中 \(x ^{\langle 2\rangle}\) 是训练样本标签中的第一个单词 \(y ^{\langle 1\rangle}\)(即单词 cats ),输出的 \(y ^{\langle 2\rangle}\) 是通过 Softmax 函数预测的以单词 cats 为条件出现字典中其他每个词的条件概率,以此类推得到整个句子出现的概率。
训练网络定义的损失函数为:$$L(\widehat y ^{\langle t\rangle}, y ^{\langle t\rangle}) = -\sum _{i}y _i ^{\langle t\rangle}\log \widehat y _i ^{\langle t\rangle}$$总体损失函数为:$$L = \sum _{t}L ^{\langle t\rangle}(\widehat y ^{\langle t\rangle}, y ^{\langle t\rangle})$$将训练好的网络用于新的句子,例如一个新句子只有三个单词 \(y ^{\langle 1\rangle}\) 、\(y ^{\langle 2\rangle}\) 、\(y ^{\langle 3\rangle}\) 如要按公式:$$P(y ^{\langle 1\rangle}, y ^{\langle 2\rangle}, y ^{\langle 3\rangle})= P(y ^{\langle 1\rangle})P(y ^{\langle 2\rangle}|y ^{\langle 1\rangle})P(y ^{\langle 3\rangle}|y ^{\langle 2\rangle}, y ^{\langle 1\rangle})$$得到整个句子的概率。

采样

当训练好一个语言模型后,可以通过非正式方法采样新的序列来了解模型学到的什么。
采样在第一个时间步中,输入 \(a ^{\langle 0\rangle}\) 和 \(x ^{\langle 1\rangle }\) 其都是零向量,输出预测出字典中每个词作为第一个词的概率,根据 Softmax 分布进行随机采样( np.random.choice ),将采样得到的 \(\widehat y ^{\langle 1\rangle}\) 作为第二个时间步的输入 \(x ^{\langle 2\rangle }\) 。以此类推,直到采样到句子结尾标志(例如 EOS 等)或采样达到特定的时间步长,最后该模型可以生成一些句子。
实际中也可以考虑建立基于字符的语言模型(上述是基于词汇的语言模型),基于字符的语言模型得到的序列过长,计算成本高。

RNN 的梯度消失

$$\text {The cat, which already ate a bunch of food, was full.}$$$$\text {The cats, which already ate a bunch of food, were full.}$$对于上面的两句话,后面谓语动词单复数形式由前面主语名词的单复数形式决定。但基本的 RNN网络不擅长获取这种长期依赖关系。其原因主要是由于梯度消失,在反向传播时,后面层的输出误差很难影响前面层的计算,网络很难调整前面层的计算。反向传播如下图所示:反向传播在反向传播过程中,也有可能出现梯度爆炸问题(较容易发现,参数会快速膨胀到数值溢出,可能显示 NaN 。可以采用梯度修剪解决。观察梯度值,如果大于某个阈值,则缩放梯度向量保证其不会太大。相比之下,梯度消失问题更难解决,目前GRU 和 LSTM 可以作为缓解梯度消失问题的解决方案

GRU(门控循环单元)

对于句子$$\text {The cat, which already ate a bunch of food, was full.}$$当从左到右读的时候,GRU 有一个新的变量称为 c ,表示记忆细胞Memory Cell ),其提供记忆的能力,例如记住前面的主语是单数函数复数。在时间 t 记忆细胞的值 \(c ^{\langle t\rangle}\) 等于激活值 \(a ^{\langle t\rangle}\) 。\(\widehat c ^{\langle t\rangle}\) 表示下一个 \(c\) 的候选值。\(\Gamma _u\) 表示更新门,用于决定什么时候更新记忆细胞的值。具体公式如下:$$\widehat c ^{\langle t\rangle}= \tanh (W _c [c ^{\langle t-1\rangle}, x ^{\langle t\rangle}] +b _c )$$$$\Gamma _u = \sigma (W _u [c ^{\langle t-1\rangle}, x ^{\langle t\rangle}] + b _u )$$$$c ^{\langle t\rangle} = \Gamma _u \times \widehat c ^{\langle t\rangle} + (1-\Gamma _u)\times c ^{\langle t-1\rangle}$$$$a ^{\langle t\rangle}= c ^{\langle t\rangle}$$上述公式是简化过的 GRU 单元,实际中完整的 GRU 单元还有一个新的相关门 \(\Gamma _r\) ,表示 \(\widehat c ^{\langle t\rangle}\) 和 \(c ^{\langle t-1\rangle}\) 间的相关性,完整的公式如下:$$\widehat c ^{\langle t\rangle}= \tanh (W _c [\Gamma _r c ^{\langle t-1\rangle}, x ^{\langle t\rangle}] +b _c )$$$$\Gamma _u = \sigma (W _u [c ^{\langle t-1\rangle}, x ^{\langle t\rangle}] + b _u )$$$$\Gamma _r = \sigma (W _r [c ^{\langle t-1\rangle}, x ^{\langle t\rangle}] + b _r )$$$$c ^{\langle t\rangle} = \Gamma _u \times \widehat c ^{\langle t\rangle} + (1-\Gamma _u)\times c ^{\langle t-1\rangle}$$$$a ^{\langle t\rangle}= c ^{\langle t\rangle}$$为了便于理解,给出下图(下图中符号和上面公式表示不同):GRU结构
相关博客:
Understanding GRU networks
相关论文:
Cho et al., 2014. On the properties of neural machine translation: Encoder-decoder approaches
Chung et al., 2014. Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling

LSTM (Long Short Term Memory)

LSTMGRU 更加灵活,其引入了遗忘门 \(\Gamma _f\) 和输出门 \(\Gamma _o\) ,其一个单元结构如下图所示:LSTM单元结构LSTM 网络如下图所示:LSTM网络实际使用中,几个门值不仅取决于 \(a ^{\langle t-1\rangle}\) 和 \(x ^{\langle t\rangle}\) ,有时候可以偷窥上个记忆细胞的输入值 \(c ^{\langle t-1\rangle}\) 此被称为窥视连接
\(c ^{\langle 0\rangle}\) 通常初始化为零向量。
相关博客:
Understanding LSTM Networks

双向循环神经网络

单向的循环神经网络在某一时刻的预测结果只能使用之前输入的序列信息。双向循环神经网络(Bidirectional RNN,BRNN )可以在序列的任意位置使用之前和之后的数据。其工作原理是增加一个反向循环层,如下图所示:BRNN结构根据上图有:$$y ^{\langle t\rangle} = g(W _y [\overrightarrow a ^{\langle t\rangle}, \overleftarrow a ^{\langle t\rangle}]+ b_y )$$其中基本单元不仅可以是标准的 RNN 模块,也可以是 LSTMGRU 模块。缺点是需要完整的序列数据,才能预测任意位置的结果。例如构建语音识别系统,需要等待用户说完并获取整个语音表达,才能处理这段语音并进一步做语音识别。因此,实际应用会有更加复杂的模块。

深度循环神经网络( DRNN )

深度循环神经网络(Deep RNN)的结构如下:DRNN结构以 \(a ^{[2]\langle 3\rangle}\) 为例,有:$$a ^{[2]\langle 3\rangle} = g(W _a ^{[2]}[a ^{[2]\langle 2\rangle}, a ^{[1]\langle 3\rangle}]+ b _a ^{[2]})$$

自然语言处理和词嵌入

词嵌入

one-hot 表示法将每个单词都表示为完全独立的个体,不同词的表示向量都是正交的,不同单词间的相似性无法体现(上面的杂谈中有提到这点)。
采用特征化表示法(词嵌入)可以避免提到的问题。可以通过用语义特征作为维度来表示一个词,因此语义相近的词,其词向量也相近。
词嵌入Word Embedding )是指把一个维数为字典中所有词的高维空间(one-hot 表示法)嵌入到一个维数低的连续向量空间中,每个单词被映射为实数域上的向量。对大量词汇进行词嵌入后获得的词向量,可用于 NLP 相关的任务。
将高维的词嵌入到一个二维空间中,可以进行可视化,常用的可视化算法是 t-SNE 算法。通过复杂的非线性的方法映射到二维空间后,每个词会根据语义和相关程度聚在一起。
相关论文van der Maaten and Hinton., 2008. Visualizing Data using t-SNE

词嵌入和迁移学习

对于小样本的学习任务,迁移学习可以达到较好的效果,步骤如下:

  1. Learn word embedding from large text corpus.(Or download pre-trained embedding online.)
  2. Transfer embedding to new task with smaller training set.
  3. Optional: Continue to fine-tune the word embedding with new data.

注:词嵌入和之前介绍的用于人脸验证的 siamese 网络相似, siamese 网络是将输入的人脸图像通过卷积神经网络编码为特征向量,而词嵌入也是将词嵌入到某个维度相对低的空间中。

词嵌入和类比推理

词嵌入可以用于类比推理。例如给定对应关系$$\text {男性 man}\rightarrow \text {女性 woman}$$$$ \text {then}$$$$ \text {国王 king}\rightarrow ?$$根据词嵌入,则有$$e _{\text {man}}- e _{\text {woman}}\approx e _{\text {king}}-e _{?}$$因此需要找到词向量 \(w\) 使得相似度 \(\text {sim}(e _w , e _{\text {king}}-e _{\text {man}}+e _{\text {woman}})\) 最大。常用的计算相似度函数是余弦相似度:$$\text {sim}(u, v)=\dfrac {u ^T v}{||u|| _2 ||v|| _2}$$相关论文:Mikolov et. al., 2013, Linguistic regularities in continuous space word representations

嵌入矩阵

我们的目标是需要学习一个词嵌入矩阵 E ,矩阵中的行代表用于表示每个词的特征向量,矩阵中的列表示字典中的每个词,如下图所示:词嵌入矩阵将字典中位置为 \(i\) 的词对应的 one-hot 表示记为 \(o _i\) ,词嵌入后生成词向量用 \(e _i\) 表示,有:$$E\cdot o _i = e _i$$由于 \(o _i\) 是很高维的,上式效率比较低,实际中一般不用上式找 \(e _i\),深度学习框架中有专门的函数查找矩阵 \(E\) 的特定列。

学习词嵌入

利用神经网络构建语言模型也可以学习词嵌入,神经网络语言模型如下:神经网络语言模型训练过程中,将语料库中的某些词作为目标词,以目标词的部分上下文作为输入,Softmax 输出的预测结果为目标词。嵌入矩阵 Ewb 为需要通过训练得到的参数。这样,在得到嵌入矩阵后,就可以得到词嵌入后生成的词向量。
如果目标是建立语言模型,通常选择目标词的前几个词作为上下文,如果是学习词嵌入矩阵,则可以选择其他的上下文。
相关论文:Bengio et. al., 2003, A neural probabilistic language model

Word2Vec

相比于神经语言模型学习词嵌入,Word2Vec 是一种简单而且更加高效的方式来学习词嵌入。

Word2Vec 有两种模型:

  • Skip-gram 模型:用一个词语作为输入,预测其周围的上下文;
  • CBOW 模型:用一个词语的上下文作为输入,预测这个词语本身。

每种模型都包含负采样分级 Softmax两种训练技巧。
下图中训练神经网络时候的隐藏层参数即是学习到的词嵌入。
Skip-gramskip-gram模型上图中的输入层和输出层都采用 One-hot 编码,输出层是 Softmax 层,\(W\) 是要学习的词嵌入矩阵,\(W’\) 是输出层参数。
设某个词为 \(c\) ,在该词一定词距内选取一些目标上下文 \(t\) ,输出层是 Softmax 层,则对应的条件概率为:$$P(t|c)= \dfrac {\text {exp}(\theta _t ^T e _c)}{\sum _{j=1} ^{m}\text {exp}(\theta _j ^T e _c)}$$其中 \(\theta _t\) 是一个与输出 \(t\) 有关的参数(上式省略的偏差参数),损失函数可选择交叉熵:$$L(\widehat y , y)=-\sum _{i=1} ^{m}y _i\log \widehat y _i$$由于每次计算条件概率需要对词典中所有词求和,计算量大,因此解决方案之一是采用分级 Softmax ,实际中采用非平衡的二叉树形式,保证常用的此可以很快找到。
CBOWCBOW模型其工作方式与 Skip-gram 相反。
相关文章:
[NLP] 秒懂词向量Word2vec的本质
word2vec原理推导与代码分析-码农场
课程 cs224n 的 notes1
相关论文:
Mikolov et. al., 2013. Efficient estimation of word representations in vector space.
word2vec Parameter Learning Explained

负采样

生成数据的方式:在给的一段话中选择一个上下文词,再选择一个目标词,组成一个正样本。然后给定 \(k\) 次,用相同的上下文词,再从字典中选择随机的词,组成负样本,若从字典中选择的词刚好出现在给的一段话的词距(在一定的词距内选择目标词)内也没关系。负采样对于小数据集,\(k\) 取 \(5-20\) 较合适,对于大数据集,\(k\) 取 \(2-5\)较合适。
问题为监督学习,输出改用 Sigmoid ,输入是上下文-目标词 ( \((c, t)\) ),对应的条件概率为:$$P(y=1|c, t)=\sigma (\theta _t ^T e _c)$$其中,\(\theta _t\) 和 \(e _c\) 参数和之前一样。
之前训练中每次要更新 \(n\) 维的多分类 Softmax 单元( \(n\) 为词典中词的数量)。现在每次只需要更新 k+1 维的二分类 Sigmoid 单元,计算量大大降低。
关于计算选择某个词作为负样本的概率,推荐采用以下公式(而非经验频率或均匀分布):$$p(w _i)=\dfrac {f(w _i) ^{\frac {3}{4}}}{\sum _{j=0} ^{m}f(w _j) ^{\frac {3}{4}}}$$其中,\(f(w _i)\) 表示语料中单词 \(w _i\) 出现的频率。
相关论文:
Mikolov et. al., 2013. Distributed representation of words and phrases and their compositionality

GloVe 词向量

GloVe (global vectors for word representation) 是另一种学习词嵌入的方法。其代价函数如下:$$J = \sum _{i=1} ^{N}\sum _{j=1} ^{N}f(X _{ij})(\theta _i ^T e _j + b _i + b _j - \log(X _{ij})) ^2$$其中 \(X _{ij}\) 表示单词 \(i\) 和单词 \(j\) 为 上下文-目标词 的次数。参数 \(b _i\) 、\(b _j\) 和 \(f()\) 函数用来避免 \(X _{ij}=0\) 时 \(\log (X _{ij})\) 为负无穷大情况,并在其他情况下调整权重。
上下文-目标词 可以代表两个词出现在同一个窗口。在这种情况下,\(\theta _i\) 和 \(e _j\) 是完全对称的。因此,在训练时可以一致地初始化二者,使用梯度下降法处理完以后取平均值作为二者共同的值。
相关论文:
Pennington st. al., 2014. Glove: Global Vectors for Word Representation

情感分类

情感分类是指分析一段文本对某个对象的情感是正面的还是负面的。情感分类的问题之一是标记好的训练数据不足。但是有了词嵌入得到的词向量,中等规模的标记训练数据也能构建出一个效果不错的情感分类器。

情感分类模型上图中 \(E\) 表示词嵌入法获得的矩阵,计算出单词的词向量取平均,输入 Softmax 单元,得到预测结果。缺点是没有考虑词的顺序,对于包含多个正面评价词的负面评价,效果不好。
使用 RNN 网络可以得到一个有效的情感分类器:RNN 情感分类器

词嵌入除偏

此部分暂时先不写了,具体可参考视频类容。

序列模型和注意力机制

Seq2Seq 模型

Seq2Seq ( Sequence-to-Sequence ) 模型能够应用于机器翻译、语音识别等各种序列到序列的转换问题。Seq2Seq 模型包含编码器( Encoder)和解码器( Decoder )两部分,通常是两个不同的 RNN 。如下图所示,将编码器的输出作为解码器的输入,由解码器负责输出正确的翻译结果。序列到序列模型
相关论文:

图像描述中也用到类似的结构。如下图所示:图像描述网络AlexNet 网络作为编码器,最后的 Softmax 层替换为 RNN 网络作为解码器,该网络的输出是对输入图像的描述(一段话)。
相关论文:

选择最可能的句子

Seq2Seq 机器翻译模型和之前介绍的语言模型有很多相似的地方,也有区别。主要区别就是用编码器的输出作为解码器的输入,而不是输入零向量。因此机器翻译过程相当于建立一个条件语言模型条件语言模型我们不想让解码器的输出是随机的(结果可能有好有坏),需要一种算法找到使得条件概率最大化的翻译,即:$$\text {arg max} _{y ^{\langle 1\rangle}, \ldots , y ^{\langle t\rangle}}P(y ^{\langle 1\rangle}, \ldots , y ^{\langle t\rangle}|x)$$由于贪心算法得到的结果难以满足要求,实际中使用集束搜索 ( Beam Search ) 。

集束搜索

集束搜索Beam Search )会考虑每个时间步多个可能的选择。有一个参数集束宽Beam Width )\(B\) ,表示解码器中每个时间步保留的预选单词数量。本例中设 \(B=3\) 。
集束搜索第一步:将第一个时间步最可能的三个预选单词及其概率值 \(P(\widehat y ^{\langle 1\rangle}|x)\) 保存。
第二步:分别将第一步保存的三个预选词作为第二时间步的输入,得到 \(P(\widehat y ^{\langle 2\rangle}|x, \widehat y ^{\langle 1\rangle})\) 。由于实际需要第一个单词和第二个单词的联合概率最大(不是只有第二个单词条件概率最大),因此根据条件概率公式有:$$P(\widehat y ^{\langle 1\rangle}, \widehat y ^{\langle 2\rangle}|x)= P(\widehat y ^{\langle 1\rangle}|x)P(\widehat y ^{\langle 2\rangle}|x, \widehat y ^{\langle 1\rangle})$$设字典中有 \(N\) 个单词,当 \(B=3\) 时,有 \(3N\) 个 \(P(\widehat y ^{\langle 1\rangle}, \widehat y ^{\langle 2\rangle}|x)\) ,取概率最大的 \(3\) 个保存。以此类推,直到最后输出一个最优结果,满足下列公式:$$\text {arg max}\prod _{t=1} ^{T _y}P(\widehat y ^{\langle t\rangle}|x, \widehat y ^{\langle 1\rangle}, \ldots , \widehat y ^{\langle t-1\rangle})$$当设置 \(B=1\)时,集束搜索算法变为贪心算法。

改进集束搜索

长度标准化 ( Length Normalization ) 是对集束搜索算法的优化方式

对于公式:$$\text {arg max}\prod _{t=1} ^{T _y}P(\widehat y ^{\langle t\rangle}|x, \widehat y ^{\langle 1\rangle}, \ldots , \widehat y ^{\langle t-1\rangle})$$当有多个小于 \(1\) 的概率值相乘时,可能会有数值下溢的问题,实际中会取 \(\log\) 将乘法变为加法。$$\text {arg max}\sum _{t=1} ^{T _y}\log P(\widehat y ^{\langle t\rangle}|x, \widehat y ^{\langle 1\rangle}, \ldots , \widehat y ^{\langle t-1\rangle})$$但上面两个式子存在问题,即当输出的句子比较长时,上式变得更小,因此上式趋向于更短的输出。因此需要归一化,即:$$\text {arg max}\dfrac {1}{T _y ^{\alpha}}\sum _{t=1} ^{T _y}\log P(\widehat y ^{\langle t\rangle}|x, \widehat y ^{\langle 1\rangle}, \ldots , \widehat y ^{\langle t-1\rangle})$$其中 \(T _y\) 表示输出结果单词数,\(\alpha\) 是一个需要调整的超参数(\(0-1\) 之间)。归一化用于减少对输出长的结果的惩罚(因为翻译结果一般没有长度限制)。
关于集束宽 \(B\) 的取值,较大的 \(B\) 值意味着可能更好的结果和巨大的计算成本;而较小的 \(B\) 值代表较小的计算成本和可能表现较差的结果。对于产品来说,\(B\) 可以取 \(10\) 。

集束搜索的误差分析

集束搜索是一种启发式搜索算法,不总是输出可能性最大的句子。当结合 Seq2Seq 模型和集束搜索算法所构建的系统出错(没有输出最佳翻译结果)时,我们通过误差分析来分析错误出现在 RNN 模型还是集束搜索算法中。
例如对于下面的人工翻译和模型输出结果:$$\text{Human: Jane visits Africa in September. (\(y ^*\))}$$$$\text{Algorithm: Jane visits Africa last September. (\(\widehat y\))}$$将翻译中没有太大差别的前三个单词作为解码器前三个时间步的输入,得到第四个时间步的条件概率 \(P(y ^*|x)\)、\(P(\widehat y|x)\) 比较大小分析:

  • 若 \(P(y ^*|x) > P(\widehat y|x)\) 说明集束搜索算法出错;
  • 若 \(P(y ^*|x) \leq P(\widehat y|x)\) 说明 RNN 模型效果不好。

建立一个如下图所示的表格,记录对每一个错误的分析,有助于判断错误出现在 RNN 模型还是集束搜索算法中。如果错误出现在集束搜索算法中,可以考虑增大集束宽 \(B\) ;否则,需要进一步分析,看是需要正则化、更多数据或是尝试一个不同的网络结构。误差分析

Belu 得分

Belu 得分用来评估机器翻译的好坏,机器翻译的结果越接近人工翻译,则得分越高。

开始衡量机器翻译输出质量方法之一是观察输出结果中每一个词是否出现在参考中(人工翻译中),但此方法容易出现错误,如下图左边结果(精度为 \(1\) ,实际结果很差)。改进的方法是将输出的每个单词在人工翻译结果中出现的次数作为分子(分子取最大的一个,因为可能有多个人工翻译参考),输出的单词数为分母,如下图所示:belu得分例子上述方法是以单个词为单位进行统计,称为一元组 ( unigram ),也可以以成对的词(连续的两个词)为单位进行统计,称为二元组 ( bigram ) ,对于二元组合,分母为每个二元组在输出中出现的次数之和,分子为二元组在人工翻译中出现的次数之和。以此类推,得到以 \(n\) 个单词为整体的 \(n\) 元组 ( n-gram ) ,对应的 Belu 得分计算公式为:$$p _n = \dfrac {\sum _{\text {n-gram} \in \widehat y}\text {count} _{\text {clip}}(\text {n-gram})}{\sum _{\text {n-gram} \in \widehat y}\text {count}(\text {n-gram})}$$最后将得分组合(一元组,二元组等等)得到最终的 Belu 得分。公式如下:$$p _{\text {avg}} = \text {exp}(\dfrac {1}{N}\sum _{i=1} ^{N}\log p _i)$$上述公式存在一个问题就是机器翻译结果输出很短时,较容易得到更大的分值,因为输出的大部分词可能出现在人工翻译中,实际中对上述公式加一个调整项 \(BP\) ,用以惩罚较短的输出:$$\text {BP} = \begin {cases}1 & , \text {MT length }\geq \text {BM length}\\ \text {exp}(1-\dfrac {\text {MT length}}{\text {BM length}}) & , \text {MT length} < \text {BM length} \end {cases}$$最终的 Belu 得分为:$$p _{\text {avg}} = \text {BP}\times\text {exp}(\dfrac {1}{N}\sum _{i=1} ^{N}\log p _i)$$Bleu 得分的贡献是提出了一个表现不错的单一实数评估指标,因此加快了整个机器翻译领域以及其他文本生成领域的进程。
相关论文:
Papineni et. al., 2002. A method for automatic evaluation of machine translation

注意力模型

对于一大段文字,人工翻译一般每次阅读并翻译一小部分。因为难以记忆,很难每次将一大段文字一口气翻译完。同理,用 Seq2Seq 模型建立的翻译系统,对于长句子,Blue 得分会随着输入序列长度的增加而降低。实际上,我们也并不希望神经网络每次去“记忆”很长一段文字,而是想让它像人工翻译一样工作。因此,注意力模型 ( Attention Model) 被提出,如下图:注意力模型图中低层是一个双向 RNN 网络,该网络每个时间步的激活值包含前向传播和反向传播激活值:$$a ^{\langle t’\rangle}=(\overrightarrow a ^{\langle t’\rangle}, \overleftarrow a ^{\langle t’\rangle})$$顶层是一个多对多的 RNN 网络,每个时间步 \(t\) 的输入包括该网络前个时间步的激活值 \(s ^{\langle t-1\rangle}\) 、输出 \(y ^{\langle t-1\rangle}\) 和低层网络中多个时间步的激活 \(c\)(上下文),其中 \(c\) 计算如下:$$c ^{\langle t\rangle} = \sum _t’ \alpha ^{\langle t, t’\rangle}a ^{\langle t’\rangle}$$其中 \(\alpha ^{\langle t, t’\rangle}\) 表示 \(y ^{\langle t\rangle}\) 对 \(a ^{\langle t’\rangle}\) 应该保持的注意力权重,需要满足:$$\sum _t’ \alpha ^{\langle t, t’\rangle}=1$$可以使用 Softmax 函数确保上式成立,有:$$\alpha ^{\langle t, t’\rangle} = \dfrac {\text {exp}(e ^{\langle t, t’\rangle})}{\sum _{t’=1} ^{T _x}\text {exp}(e ^{\langle t, t’\rangle})}$$对于 \(e ^{\langle t, t’\rangle}\) 通过神经网络学习得到。输入是 \(s ^{\langle t-1\rangle}\) 和 \(a ^{\langle t’\rangle}\) 如下图所示:注意力模型学习参数注意力模型缺点是时间复杂度为 \(O(n ^3)\) 。
相关论文:
Bahdanau et. al., 2014. Neural machine translation by jointly learning to align and translate
Xu et. al., 2015. Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

语音识别

语音识别任务中,输入是一段以时间为横轴的音频片段,输出是文本。

音频数据的常见预处理步骤,生成一个声谱图 ( a spectrogram ) 。同样地,横轴是时间,纵轴是声音的频率 ( frequencies ) ,而图中不同的颜色,显示了声波能量的大小 ( the amount of energy ) ,也就是在不同的时间和频率上这些声音有多大。语音信号预处理语音识别系统可以用注意力模型来构建,如下图所示:语音识别注意力模型CTC ( Connectionist Temporal Classification ) 损失函数来做语音识别的效果也不错。语音识别中输入时间步一般比输出大的多,CTC 损失允许下图所示的输出:CTC损失结构CTC 损失函数的一个基本规则是将空白符 ( blank ) 之间的重复的字符折叠起来,再将空白符去掉,得到最终的输出文本。
相关论文:
Graves et al., 2006. Connectionist Temporal Classification: Labeling unsegmented sequence data with recurrent neural networks

触发字检测

触发词检测 ( Trigger Word Detection ) 常用于各种智能设备,通过约定的触发词可以语音唤醒设备。
使用 RNN 来实现触发词检测时,可以将触发词对应的序列的标签设置为 \(1\) ,而将其他的标签设置为 \(0\) 。触发字检测

致谢

至此,吴恩达老师的深度学习五大讲视频学习笔记已经全部完成。
特别感谢