来源:Coursera吴恩达深度学习课程

在自然语言处理中,构建语言模型(language model)是最基础的也是最重要的工作之一,并且能用RNN很好地实现。在这篇文章中,我们将学习用RNN构建一个语言模型。所以什么是语言模型呢?

如上图,比如一个语音识别系统,你听到一个句子,“the apple and pear(pair) salad was delicious.”,所以究竟说了什么?是 “the apple and pair salad”,还是“the apple and pear salad”?(pear和pair是近音词)。你可能觉得应该更像第二种,事实上,这就是一个好的语音识别系统要帮助输出的东西,即使这两句话听起来是如此相似。而让语音识别系统去选择第二个句子的方法就是使用一个语言模型,他能计算出这两句话各自的可能性。语言模型会告诉你某个特定的句子它出现的概率是多少它是两种系统的基本组成部分:语音识别系统(speech recognition systems)和机器翻译系统(machine translation systems)

对于语言模型来说,用y来表示这些序列比用x来表示要更好,然后语言模型会估计某个句子序列中各个单词出现的可能性。那么如何建立一个语言模型呢?

如上图,为了使用RNN模型,首先需要一个训练集(training set),包含一个很大的英文文本语料库(word corpus)或者其它的语言的语料库。语料库是自然语言处理的一个专有名词,意思就是很长的或者说数量众多的英文句子组成的文本。

例如,在训练集中得到这么一句话,“Cats average 15 hours of sleep a day.”(猫一天睡15小时),接下来需要(1)将这个句子标记化(tokenization),建立一个字典,然后将每个单词都转换成对应的one-hot向量,也就是字典中的索引。可能要定义句子的结尾,一般的做法就是增加一个额外的标记,叫做EOS(End Of Sentence),它表示句子的结尾,这样能够帮助你搞清楚一个句子什么时候结束。EOS标记可以被附加到训练集中每一个句子的结尾。在本例中我们,这句话就会有9个输入(如果你加了EOS标记)。同时,我们忽略了标点符号(punctuation),当然想加入字典也可以。

现在还有一个问题如果你的训练集中有一些词并不在你的字典里,比如“The Egyptian Mau is a bread of cat.”的词Mau,可以把Mau替换成一个叫做UNK(unknown words)的代表未知词的标志,我们只针对UNK建立概率模型,而不是针对这个具体的词Mau。完成标识化的过程后,这意味着输入的句子都映射到了各个标志上,或者说字典中的各个词上。(2)下一步我们要构建一个RNN来构建这些序列的概率模型

如上图,现在来建立RNN模型。还是这个句子“Cats average 15 hours of sleep a day.”。

①在第0个时间步,你要计算激活项a^<1>,它是以x^<1>(全为0的集合,即0向量)作为输入的函数。于是a^<1>会通过softmax进行一些预测来计算出第一个词可能会是什么,这一步其实就是通过一个softmax层来预测字典中的任意单词会是第一个词的概率,比如说第一个词是a的概率有多少,第一个词是Aaron的概率有多少,第一个词是cats的概率又有多少,就这样一直到Zulu是第一个词的概率是多少,还有第一个词是UNK(未知词)的概率有多少,还有第一个词是句子结尾标志的概率有多少,表示不必阅读。它只是预测第一个词的概率,而不去管结果是什么。在这个例子中,最终会得到单词Cats。所以softmax层输出10,000种结果,因为你的字典中有10,000个词,或者会有10,002个结果,因为可能加上了未知词和句子结尾这两个额外的标志。

②然后RNN进入下个时间步,在下一时间步中,仍然使用激活项a^<1>,这一步计算出第二个词会是什么。我们会告诉它第一个词就是Cats,这就是为什么y^<1> = x^<2>。在第二个时间步中,输出结果同样经过softmax层进行预测,RNN的职责就是预测这些词的概率),而不会去管结果是什么。所以在这种情况下,Andrew猜正确答案会是average,因为句子确实就是Cats average开头的。

③然后再进行RNN的下个时间步,现在要计算a^<3>。为了预测第三个词,也就是15,我们现在给它之前两个词,告诉它Cats average是句子的前两个词,所以这是下一个输入, x^<3> = y^<2> ,计算出字典中每一个词的概率,通过之前得到的Cats和average,在这种情况下,正确结果会是15,以此类推。

一直到最后,你会停在第9个时间步,最后的得到结果会是EOS标志,在这一步中,通过前面这些得到的单词,不管它们是什么,我们希望能预测出EOS句子结尾标志的概率会很高。

所以RNN中的每一步都会考虑前面得到的单词,这就是RNN如何学习从左往右地每次预测一个词。

接下来为了训练这个网络,我们要定义代价函数(cost function)。如下式:

而总体损失函数,也就是把所有单个预测的损失函数都相加起来。表达式如下:

如果你用很大的训练集来训练这个RNN,你就可以通过开头一系列单词像是Cars average 15或者Cars average 15 hours of来预测之后单词的概率。

这就是用RNN训练一个语言模型的基础结构。下一节课用语言模型做的一件最有趣的事就是从模型中进行采样

说明:记录学习笔记,如果错误欢迎指正!转载请联系我。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐