当前位置:   article > 正文

2019年CS224N课程笔记-Lecture 6: Language Models, RNN, GRU and LSTM_gru处理英语句子

gru处理英语句子

资源链接:https://www.bilibili.com/video/BV1r4411

正文

感觉本节课就讲了两个内容,语言模型和RNN模型。本章我也会发力多多补充,上节课实在太难受了,感觉听不懂,大部分都是各种查资料各种参考555,终于来了个有基础的了5555

Language Modeling/语言模型

语言建模的任务是预测下一个单词是什么,其实语言模型就是用来判断生产下一个词的概率的一个模型。如下图所示:

学生打开了         。到底打开了什么呢?可能是课本,可能是书,可能是电脑,甚至是课桌,这些词语的概率是非常大的,例如烟灰缸、花瓶、房屋、摩天轮,这些词语的概率则很低,因为语义上都不通啊~

用比较官方的话就是:

举个例子就是还是上述例子,他会计算在 ‘学生打开了’ 的前提下生成,各种单词的概率是多少,选择最大的作为输出(往往就是课本、课桌之类的)。

大家肯定还有个疑问就是,这个概率是怎么算的,其实就是在语料库中的。例如一个高中学生日常的语料库,可能打开课本或者课桌都很大概率,但是如果一个研究生日常的语料库,可能预料中出现最多的就是打开论文(ahhhh~)。

我们日常生活中经常使用语言模型:例如输入法会判单你输入内容的后续内容,还有就是百度等搜索引擎,也会给我们预测没有输入完的内容。

但是上面说的太复杂了(理论上可行,实际上时间复杂度太高)~为什么复杂呢?假设你说个一个课文,让我给你生成最后一个词。我的天,按上述方程,我得算半年...而且还有个问题,你说了一段文章,可能我需要生成的词只和文章最后一句(也就是生成该词的这句)有关系。除了这句话前面都是屁话。那么怎么解决这个问题呢?

n-gram Language Models

  • 问题 :如何学习一个语言模型?(或者说最初的语言模型是有问题的,如何学习一个合理可行的语言模型?)
  • 回答 :使用n-gram 语言模型~
  • 定义 :n-gram 是 一个由n个连续单词组成的块
  • n=1: “the”, “students”, “opened”, ”their”(只来依赖生成位置的前1个词)
  • n=2: “the students”, “students opened”, “opened their”(只来依赖生成位置的前2个词)
  • n=3: “the students opened”, “students opened their”(只来依赖生成位置的前3个词)
  • n=4: “the students opened their”(只来依赖生成位置的前4个词)
  • 想法 :收集关于不同n-gram出现频率的统计数据,并使用这些数据预测下一个单词。


解释一下就是,其实就是公式中,条件不是1到t了,而是t-n+2到t了,这里面实际上就是t+1前面的n个词的意思。
那么如何得到n-gram和(n-1)-gram的概率?
答案 :通过在一些大型文本语料库中计算它们(统计近似)

其实就是词频统计,例如你语料库中,‘学生打开课本’出现的最多,假设10次,那么统计次数在‘学生打开’的次数,假设为20次,但是其他的例如‘打开电脑’,‘打开各种’总共才10次,那么百分之50的概率生成‘学生打开课本‘,其他的概率都小于50%,所以就会生成他们打开课本。

看一个课堂中的例子:

例如使用4元模型(n=4),假设在语料库中:

“students opened their” 出现了1000次
“students opened their books” 出现了400次

“students opened their exams” 出现了100次

我们应该忽视上下文中的“proctor”吗?
在本例中,上下文里出现了“proctor”,所以exams在这里的上下文中应该是比books概率更大的。

这个“proctor”的意思,其实是students opened their exams往往和proctor一起出现,但是因为n=4,所以只关注了students opened their,实际上可能是,in a proctor students opened their出现了100次,也就是如果n=5可能实际上就发生了惊天逆转了(打开书出现了个位数--作弊啊小伙子 ahh也可能开卷,但是打开考试出现的可能是100次),所以说n的取值很重要,甚至是不同场景下,n取不同的值会有不同的表现(不同情况下n的最佳取值可能不一样)

n-gram模型的稀疏性问题

问题 :如果“students open their   w   ” 从未出现在数据中,那么概率值为 0
某种解决方案 :为每个   w    添加极小数 [公式] 。这叫做平滑(这里可以百度一下拉普拉斯平滑)。这使得词表中的每个单词都至少有很小的概率。
问题 :如果“students open their” 从未出现在数据中,那么我们将无法计算任何单词 [公式] 的概率值
某种解决方案 :将条件改为“open their”。这叫做后退。

N的取值问题

然后讨论了一下n的取值问题,这里我用自己的理解说一下吧~,首先从语义的理解上来说,肯定是n越大越好,因为依赖的前n个词越多,语义包含的越多;但是n越大,会导致时间复杂度越高(提升比线性提升还猛,具体忘了是那种提升了)而且也会增加稀疏性问题,所以往往n的取值不会大于5.

N-gram语言模型生成文本的实例

你可以在你的笔记本电脑上,在几秒钟内建立一个超过170万个单词库(Reuters)的简单的三元组语言模型

  • Reuters 是 商业和金融新闻的数据集

稀疏性问题 :概率分布的粒度不大。“today the company” 和 “today the bank”都是4/26 ,都只出现过四次

继续使用这个生成文本(如何出现上述概率相同的情况,我们可以随机选其中一个,或者选概率第二名(例如price))

关于生存文本我说一下,要不然可能有些人会有疑问~

不是说语言模型是生成下一个词吗,为什么生成一个词的模型可以生成一段文本?

举例子:‘我喜欢   ’。生成了 ‘我喜欢nlp’,但是如果继续把生成的话当成输入,是不是就是 ‘我喜欢nlp    ’,也就是循环的生成一个词,把生一次生成的句子作为下一次的输入,这样就可以循环输出文本。

这个地方不知道你有没有疑惑,这样是不是停不下来了/无限生成词?nonono~例如生成了 ‘了’,可能后面生成‘。’的概率非常大,如果生成‘。’就停止(人为写判断)。别较真哟,说什么‘。’可能一个文章中有很多,用‘。’当停止不合适,这个其实有道理嗨,例如生成一个文章,我们可以自己创造一个字符叫<END>,然后在语料库中文章结尾都加上,那就等生成到我们创造的字符就停止就可以了~

例如上述例子,生成流程为(n=2):

最终结果:

today the price of gold per ton , while production of shoe lasts and shoe industry , the bank intervened just after it considered and rejected an imf demand to rebuild depleted european stocks , sept 30 end primary 76 cts a share .

令人惊讶的是其具有语法但是是不连贯的。如果我们想要很好地模拟语言,我们需要同时考虑三个以上的单词。但增加 n 使模型的稀疏性问题恶化,模型尺寸增大。

如何建立神经元的语言模型

有点绕口,就是如何用神经网络来实现我们刚刚描述的语言模型,上面说的无论是最初的模型(其实就是n=无穷的那个复杂模型)还是n-gram模型都是基于词频的~现在来考虑深度学习解决它~

回忆一下语言模型任务

(刚刚学完,就不翻译了...)

window-based neural model 在第三讲中被用于NER问题

固定窗口神经语言模型

(用刚刚讲的n-gram模型理解就是个n=4的模型)

用上述的例子就是,输入‘学生打开了他们的’然后神经网络会给我们预测出许多词的概率,然后选择最高的作为结果~

比n-gram 语言模型的更加先进的地方:

  • 没有稀疏性问题
  • 不需要观察到所有的n-grams

存在的问题:

  • 固定窗口太小
  • 扩大窗口就需要扩大权重矩阵W
  • 窗口再大也不够用
  • x1和 x2 乘以完全不同的权重。输入的处理不对称

其实上述最关键的点就是,只能处理固定长度的文本,因为如果是可变的,那么W也需要是可变维度的,这个是不可能的。所以我们需要一个神经结构,可以处理任何长度的输入。

循环神经网络/RNN

没错,这个就是我们可以处理任何长度输入的神经网络~

核心想法:重复使用相同的权重矩阵 W

为什么这个网络就可以呢?因为每个xi都乘相同的W,在普通的神经网络中我们知道,其实xi乘的是w中对应的一行,所以要求输入矩阵和W的维度是可以想成的(也就是输入矩阵确定后,W的其中一个维度也固定,所以被固定住了,也就是由词向量和词向量个数决定),但是RNN中每个词向量都乘W,也就是说不管来几个x/输入,都是乘以相同的W(W的维度仅由词向量维度确定)

阿se,这个具体的模型就不解释了吧?h就是隐藏层变量,有两个W矩阵哟~如果你百度RNN经常会听到一句话隐藏变量hi由hi-1和xi决定,看看图,是不是这么回事?

RNN的 优点

  • 可以处理任意长度的输入
  • 步骤 t 的计算(理论上)可以使用许多步骤前的信息
  • 模型大小不会随着输入的增加而增加
  • 在每个时间步上应用相同的权重,因此在处理输入时具有对称性

RNN的 缺点

  • 递归计算速度慢
  • 在实践中,很难从许多步骤前返回信息
  • 梯度爆炸和梯度衰减

具体原因有的介绍了有的下节课会说的~

RNN模型的训练

(一个模型就是训练集获取、模型构建、正向传播、反向传播、损失函数、优化器等内容)

获取一个较大的文本语料库,该语料库是一个单词序列
输入到RNN模型中,计算每个步骤 t 的输出分布(课件中的LM是语言模型的意思),即预测到目前为止给定的每个单词的概率分布
步骤 t 上的损失函数为预测概率分布与真实下一个单词之间的交叉熵,即如下公式:

将其平均,得到整个训练集的总体损失

然而:计算 整个语料库xi的损失和梯度太昂贵了

在实践中,我们通常将xi看做一个 句子或是文档
回忆 :随机梯度下降允许我们计算小块数据的损失和梯度,并进行更新。
计算一个句子的损失(实际上是一批句子),计算梯度和更新权重。重复上述操作。

反向传播

问题:如何计算重复的权重矩阵 的偏导数 

回答 :重复权重的梯度是每次其出现时的梯度的总和,即

why?为什么?为什么是每次其出现时的梯度的总和?因为链式准则~

问题 : 如何计算蓝色框公式?
回答 :反向传播的时间步长t,t-1,...,0。累加梯度。这个算法叫做“backpropagation through time/通过时间的反向传播”

用RNN语言模型生成文本

就像n-gram语言模型一样,您可以使用RNN语言模型通过重复采样/hi来生成文本 。采样输出/隐藏层hi-1是下一步的输入。

RNN可以训练各种各类的样本,例如演讲、哈利波特、食谱等,虽然有很多优势,但是也有很多缺点~

相比n-gram更流畅,语法正确,但总体上仍然很不连贯
食谱的例子中,生成的文本并没有记住文本的主题是什么
哈利波特的例子中,甚至有体现出了人物的特点,并且引号的开闭也没有出现问题
也许某些神经元或者隐藏状态在跟踪模型的输出是否在引号中
RNN是否可以和手工规则结合?可以做到,例如Beam Serach,但是可能很难做到

评价模型

标准语言模型评估指标是perplexity困惑度,如上公式,T是由讲究的(貌似3/2,可以降低某些影响大的因素的影响),这等于交叉熵损失的指数,困惑度越低越好

RNN大大改善了困惑/降低了困惑值

为什么要关心语言建模

语言模型是一项基准测试任务,它帮助我们衡量我们在理解语言方面的进展
生成下一个单词,需要语法,句法,逻辑,推理,现实世界的知识等
语言建模是许多NLP任务的子组件,尤其是那些涉及生成文本或估计文本概率的任务,例如:

  • 预测性打字
  • 语音识别
  • 手写识别
  • 拼写/语法纠正
  • 作者识别
  • 机器翻译
  • 摘要
  • 对话
  • 等等

概要重述

语言模型: 预测下一个单词系统(循环起来就是预测文本的了~)

循环神经网络/RNN:

  • 包括一系列神经网络
  • 可以采用任意长度的顺序输入
  • 在每一步上应用相同的权重
  • 依赖上一步的隐藏层hi-1生成i次输出

循环神经网络!=语言模型(RNN可以实现语言模型)
我们已经证明,RNNs是构建LM的一个很好的方法。
但RNNs的用处要大得多!(为什么说RNNs,因为除了RNN还有gru和LSTM

RNN可以用于标记

输出的结果就是对应的标签/标记(标记这个可以用one-hot表示)

RNN可以用于感情分类

由两种RNN结构,一种是最后一项输出的结果作为感情分类的结果,另一种则是将所有生成结果都统计起来生成感情分类的结果。也就是课堂中的,如何计算句子编码

  • 使用最终隐层状态
  • 使用所有隐层状态的逐元素最值或均值

(Sentence encoding可能是一种处理方式,例如根据生成结果的中间形式提取出感情,或者取均值或者最值后再判断,因为我没搞过感情分类这部分,所以也有点不是很确定)

RNN可以实现编码器

编码器和解码器是注意力机制中的一个内容,后续肯定会学习的~,编码器和解码器其实都是RNN实现的(也可能是RNN的变种)

RNN-LMs可用于生成文本

这也就是上面一直说的这个事情,当然上面说的是文本生成后续文本,下面举个音频生成文本的例子,类似语言转文字、根据语音生成后续可能的内容或者类似语音小助手的那种问答~

RNNs和声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】

推荐阅读
相关标签