什么是语言模型

比如你听到一句话“他在洗澡”,同时还有一种可能就是“他在洗枣”。但是你更容易想到的是第一句,因为你的大脑里有一个语言模型。在一般人的语言模型里第一句话在现实中出现的概率更大。我们这篇文章就是要来看一下如何用RNN来建立一个语言模型。
一个语言模型可以给出任意一句话的概率。所以它的用途可以是:
1. 语音识别。因为有同音字。
2. 机器翻译。因为一个词有多个意思。具体是哪个意思概率更高可以由语言模型给出。

如何训练一个语言模型

为了训练一个语言模型,首先你需要一个大量的正常语句的语料库,比如论坛的帖子,报纸或者杂志上的文章等。
然后我们看一下其中一句话:
“Cats average 15 hours of sleep a day.”
首先我们需要建立一个字典,并且把句子中的每一个单词用one-hot encoding来编码。
需要注意的是两个特殊的符号<EOS>和<UNK>
<EOS>用来表示一句话的结尾。
<UNK>用来表示不在字典的未知字符。所有未知字符都被当成一个字符,他们出现的概率是同样的。

在构建语言模型的RNN时,我们每一次循环输出当前字出现的概率。我们以这句话里上一个字作为输入。对于第一个字,因为没有前继。所以可以认为它的前继是一个0向量。所以在建立语言模型的RNN是我们上一篇文章说过的多对多并且个数一样的RNN。

以上边的例子中第一个单词Cats为例,这是第一次循环,t=1。
它的输入有两个:
一个是上一次循环的激励函数a^{<0>}的输出。
一个是本次循环的输入x^{<1>}(注意,当前处理Cats这个单词,这里的输入应该是它的前一个单词,因为Cats是这句话的第一个单词,它前边的单词并不存在。)
因为这是第一次循环,没有上一次循环。同时这也是输入句子的第一个单词,没有前一个单词。所以两个输入都是0向量。
它的输出也有两个:
一个是计算出所有字典里的单词出现在当前位置的概率。输出函数选择用softmax。
一个是给下一次循环的激活函数输出a^{<1>}

对于第二个单词average,
它的输入,同样是两个:
一个是第一次循环(处理Cats)的激励函数输出a^{<1>}
一个是本次循环的输入,Cats one-hot encoding后的向量。
它的输出,同样也是两个:
一个是计算出所有字典里的单词出现在cats后边的概率。
一个是计算出给后边下一次循环用的激活函数值。

以此类推,可以对一句话所有单词进行正向计算。

Loss Function

对于一句话,还是以上边那句话为例,我们如何计算它的Loss Function。对于每一次循环,我们都有输出,这个输出是一个softmax输出。它是一个有多个元素的向量。每个元素代表着在字典里这个index的单词出现在句子里这个位置的概率。正常情况下,softmax输出的向量都是非0的。但是在一句话里,一个位置出现那个单词时固定的。所以对应的label 向量,只有一个位置为1,其余为0.
我们用softmax的loss function,也就是交叉熵loss function来表示一次循环的loss。
假设我们的字典里有n个单词:
\sum_{i=1}^{n}-y_ilog\hat{y_i}
然后我们再把每次循环的loss加起来,构成这一句话的loss。
然后你可以选择从语料库里随机选一批话,做一个mini batch来进行训练这个语言模型的RNN。

训练好语言模型的RNN后,我们就可以给出一句话里每一个单词的出现概率了,而且这个概率是考虑了它前边出现的单词的。我们把每一个单词这种条件概率再相乘,就得到了这一句话在语言模型里的概率了。这时你就发现“他在洗澡”的概率比“他在洗枣”大不少。

语言模型学了什么

当你训练好一个语言模型后,你可以让它根据自己的概率自动生成一些话,这样可以帮助你看一下你的语言模型到底学到了什么。比如开始你给一个0向量,它会输出一个概率向量,表示字典里每一个单词出现在句子首位的概率。这时你可以按概率来随机选取。比如np.random.choice。 概率大的样本会高概率选中。然后把选择出来的第一个单词作为输入进入下一次循环,同样这次循环会输出一个概率向量,我们根据概率再随机选出第二个单词,依次类推,把第二个单词作为第三次循环的输入。最终我们就得到一句话。
下边这两段话都是语言模型自己生成的,左边这篇是用新闻语料库生成的,后边这篇是用莎士比亚作品训练的:

用词还是字符

也有一些人用字符来训练语言模型,而不是用词。如果用单词作为字典,再加上空格和数字,和一些符号,那么字典里的元素就很少。这样就不会出现不认识的单词了。它对于出现很多生僻不认识单词的领域有些意义,但是它带来了一些其他问题,比如一句话从单词拆成字母,序列变长,意味着循环次数变多。前边的影响传递到后边变弱。训练变得更难等。但这也是一种可能性,也有人在尝试。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

%d 博主赞过: