深度学习——语言模型和序列生成

语言模型

什么是语言模型

在自然语言处理中,构建语言模型是最基础的也是最重要的工作之一,并且能用 RNN很好地实现。
Q:什么是语言模型?
A:比如你在做一个语音识别系统,你听到一个句子,“the apple and pear(pair) salad was delicious.”,所以我究竟说了什么?我说的是 “the apple and pair salad”,还是“the apple and pear salad”?(pear 和 pair 是近音词)。你可能觉得我说的应该更像第二种,事实上,这就是一个好的语音识别系统要帮助输出的东西,即使这两句话听起来是如此相似。而让语音识别系统去选择第二个句子的方法就是使用一个语言模型,他能计算出这两句话各自的可能性。
所以语言模型所做的就是,它会告诉你某个特定的句子它出现的概率是多少

如何建立这样的模型

为了使用 RNN 建立出这样的模型,你首先需要一个训练集,包含一个很大的英文文本语料库(corpus)或者其它的语言,你想用于构建模型的语言的语料库。语料库是自然语言处理的一个专有名词,意思就是很长的或者说数量众多的英文句子组成的文本。
假如说,你在训练集中得到这么一句话,“Cats average 15 hours of sleep a day.”(猫一天睡 15 小时),你要做的第一件事就是将这个句子标记化,意思就是像之前视频中一样,建立一个字典,然后将每个单词都转换成对应的 one-hot 向量,也就是字典中的索引。可能还有一件事就是你要定义句子的结尾,一般的做法就是增加一个额外的标记,叫做 EOS,它表示句子的结尾,这样能够帮助你搞清楚一个句子什么时候结束。如果你加了 EOS标记,这句话就会有 9 个输入,有𝑦<1>,𝑦<2>一直到𝑦<9>。在标记化的过程中,你可以自行决定要不要把标点符号看成标记。
现在还有一个问题如果你的训练集中有一些词并不在你的字典里,比如说你的字典有10,000 个词,10,000 个最常用的英语单词。现在这个句,“The Egyptian Mau is a bread of cat.”, 其中有一个词 Mau,它可能并不是预先的那 10,000 个最常用的单词,在这种情况下,你可以把 Mau 替换成一个叫做 UNK 的代表未知词的标志,我们只针对 UNK 建立概率模型,而不是针对这个具体的词 Mau。
完成标识化的过程后,这意味着输入的句子都映射到了各个标志上,或者说字典中的各个词上。下一步我们要构建一个 RNN 来构建这些序列的概率模型

在这里插入图片描述
在第 0 个时间步,你要计算激活项𝑎<1>,它是以𝑥<1>作为输入的函数,而𝑥<1>会被设为全为 0 的集合,也就是 0 向量。在之前的𝑎<0>按照惯例也设为 0 向量,于是𝑎<1>要做的就是它会通过 softmax 进行一些预测来计算出第一个词可能会是什么,其结果就是𝑦^<1>,这一步其实就是通过一个 softmax 层来预测字典中的任意单词会是第一个词的概率,比如说第一个词是𝑎的概率有多少,第一个词是 Aaron 的概率有多少,第一个词是 cats 的概率又有多少,就这样一直到 Zulu 是第一个词的概率是多少,还有第一个词是 UNK(未知词)的概率有多少,还有第一个词是句子结尾标志的概率有多少,表示不必阅读。
在我们的例子中,最终会得到单词Cats。所以 softmax 层输出 10,000 种结果,因为你的字典中有 10,000 个词,或者会有 10,002个结果,因为你可能加上了未知词,还有句子结尾这两个额外的标志。
然后 RNN 进入下个时间步,在下一时间步中,仍然使用激活项𝑎<1>,在这步要做的是计算出第二个词会是什么。现在我们依然传给它正确的第一个词,我们会告诉它第一个词就是 Cats,也就是𝑦^<1>,告诉它第一个词就是 Cats,这就是为什么𝑦<1> = 𝑥<2>,在第二个时间步中,输出结果同样经过 softmax 层进行预测,RNN 的职责就是预测这些词的概率
然后再进行 RNN 的下个时间步,现在要计算𝑎<3>。为了预测第三个词,也就是 15,我们现在给它之前两个词,告诉它 Cats average 是句子的前两个词,所以这是下一个输入,𝑥<3> = 𝑦<2>,输入 average 以后,现在要计算出序列中下一个词是什么,或者说计算出字典中每一个词的概率(上图编号 4 所示),通过之前得到的 Cats 和 average,在这种情况下,正确结果会是 15,以此类推。
所以 RNN 中的每一步都会考虑前面得到的单词,比如给它前 3 个单词,让它给出下个词的分布,这就是 RNN 如何学习从左往右地每次预测一个词。
接下来为了训练这个网络,我们要定义代价函数。于是,在某个时间步词是𝑦<𝑡>,而神经网络的 softmax 层预测结果值是𝑦<𝑡>,那么这就是softmax 损失函数,𝐿 (𝑦^<𝑡> , 𝑦<𝑡> >) = − ∑ 𝑦𝑖<𝑡>log 𝑦^𝑖<𝑡> 𝑖 。而总体损失函数𝐿 = ∑𝑡 𝐿<𝑡> (𝑦^<𝑡> , 𝑦<𝑡>),也就是把所有单个预测的损失函数都相加起来。
如果你用很大的训练集来训练这个 RNN,你就可以通过开头一系列单词像是 Cars average 15 或者 Cars average 15 hours of 来预测之后单词的概率。现在有一个新句子,它是𝑦<1>𝑦<2>𝑦<3>,为了简单起见,它只包含 3 个词,现在要计算出整个句子中各个单词的概率,方法就是第一个 softmax 层会告诉你𝑦<1>的概率,这也是第一个输出,然后第二个 softmax 层会告诉你在考虑𝑦<1>的情况下𝑦<2>的概率,然后第三个 softmax 层告诉你在考虑𝑦<1>和𝑦<2>的情况下𝑦<3>的概率,把这三个概率相乘,最后得到这个含 3 个词的整个句子的概率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值