赞
踩
资源链接:https://www.bilibili.com/video/BV1r4411
感觉本节课就讲了两个内容,语言模型和RNN模型。本章我也会发力多多补充,上节课实在太难受了,感觉听不懂,大部分都是各种查资料各种参考555,终于来了个有基础的了5555
语言建模的任务是预测下一个单词是什么,其实语言模型就是用来判断生产下一个词的概率的一个模型。如下图所示:
学生打开了 。到底打开了什么呢?可能是课本,可能是书,可能是电脑,甚至是课桌,这些词语的概率是非常大的,例如烟灰缸、花瓶、房屋、摩天轮,这些词语的概率则很低,因为语义上都不通啊~
用比较官方的话就是:
举个例子就是还是上述例子,他会计算在 ‘学生打开了’ 的前提下生成,各种单词的概率是多少,选择最大的作为输出(往往就是课本、课桌之类的)。
大家肯定还有个疑问就是,这个概率是怎么算的,其实就是在语料库中的。例如一个高中学生日常的语料库,可能打开课本或者课桌都很大概率,但是如果一个研究生日常的语料库,可能预料中出现最多的就是打开论文(ahhhh~)。
我们日常生活中经常使用语言模型:例如输入法会判单你输入内容的后续内容,还有就是百度等搜索引擎,也会给我们预测没有输入完的内容。
但是上面说的太复杂了(理论上可行,实际上时间复杂度太高)~为什么复杂呢?假设你说个一个课文,让我给你生成最后一个词。我的天,按上述方程,我得算半年...而且还有个问题,你说了一段文章,可能我需要生成的词只和文章最后一句(也就是生成该词的这句)有关系。除了这句话前面都是屁话。那么怎么解决这个问题呢?
解释一下就是,其实就是公式中,条件不是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的最佳取值可能不一样)
问题 :如果“students open their w ” 从未出现在数据中,那么概率值为 0
某种解决方案 :为每个 w 添加极小数 [公式] 。这叫做平滑(这里可以百度一下拉普拉斯平滑)。这使得词表中的每个单词都至少有很小的概率。
问题 :如果“students open their” 从未出现在数据中,那么我们将无法计算任何单词 [公式] 的概率值
某种解决方案 :将条件改为“open their”。这叫做后退。
然后讨论了一下n的取值问题,这里我用自己的理解说一下吧~,首先从语义的理解上来说,肯定是n越大越好,因为依赖的前n个词越多,语义包含的越多;但是n越大,会导致时间复杂度越高(提升比线性提升还猛,具体忘了是那种提升了)而且也会增加稀疏性问题,所以往往n的取值不会大于5.
你可以在你的笔记本电脑上,在几秒钟内建立一个超过170万个单词库(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 语言模型的更加先进的地方:
存在的问题:
其实上述最关键的点就是,只能处理固定长度的文本,因为如果是可变的,那么W也需要是可变维度的,这个是不可能的。所以我们需要一个神经结构,可以处理任何长度的输入。
没错,这个就是我们可以处理任何长度输入的神经网络~
核心想法:重复使用相同的权重矩阵 W
为什么这个网络就可以呢?因为每个xi都乘相同的W,在普通的神经网络中我们知道,其实xi乘的是w中对应的一行,所以要求输入矩阵和W的维度是可以想成的(也就是输入矩阵确定后,W的其中一个维度也固定,所以被固定住了,也就是由词向量和词向量个数决定),但是RNN中每个词向量都乘W,也就是说不管来几个x/输入,都是乘以相同的W(W的维度仅由词向量维度确定)
阿se,这个具体的模型就不解释了吧?h就是隐藏层变量,有两个W矩阵哟~如果你百度RNN经常会听到一句话隐藏变量hi由hi-1和xi决定,看看图,是不是这么回事?
RNN的 优点
RNN的 缺点
具体原因有的介绍了有的下节课会说的~
(一个模型就是训练集获取、模型构建、正向传播、反向传播、损失函数、优化器等内容)
获取一个较大的文本语料库,该语料库是一个单词序列
输入到RNN模型中,计算每个步骤 t 的输出分布(课件中的LM是语言模型的意思),即预测到目前为止给定的每个单词的概率分布
步骤 t 上的损失函数为预测概率分布与真实下一个单词之间的交叉熵,即如下公式:
将其平均,得到整个训练集的总体损失
然而:计算 整个语料库xi的损失和梯度太昂贵了
在实践中,我们通常将xi看做一个 句子或是文档
回忆 :随机梯度下降允许我们计算小块数据的损失和梯度,并进行更新。
计算一个句子的损失(实际上是一批句子),计算梯度和更新权重。重复上述操作。
问题:如何计算重复的权重矩阵 的偏导数
回答 :重复权重的梯度是每次其出现时的梯度的总和,即
why?为什么?为什么是每次其出现时的梯度的总和?因为链式准则~
问题 : 如何计算蓝色框公式?
回答 :反向传播的时间步长t,t-1,...,0。累加梯度。这个算法叫做“backpropagation through time/通过时间的反向传播”
就像n-gram语言模型一样,您可以使用RNN语言模型通过重复采样/hi来生成文本 。采样输出/隐藏层hi-1是下一步的输入。
RNN可以训练各种各类的样本,例如演讲、哈利波特、食谱等,虽然有很多优势,但是也有很多缺点~
相比n-gram更流畅,语法正确,但总体上仍然很不连贯
食谱的例子中,生成的文本并没有记住文本的主题是什么
哈利波特的例子中,甚至有体现出了人物的特点,并且引号的开闭也没有出现问题
也许某些神经元或者隐藏状态在跟踪模型的输出是否在引号中
RNN是否可以和手工规则结合?可以做到,例如Beam Serach,但是可能很难做到
标准语言模型评估指标是perplexity困惑度,如上公式,T是由讲究的(貌似3/2,可以降低某些影响大的因素的影响),这等于交叉熵损失的指数,困惑度越低越好
语言模型是一项基准测试任务,它帮助我们衡量我们在理解语言方面的进展
生成下一个单词,需要语法,句法,逻辑,推理,现实世界的知识等
语言建模是许多NLP任务的子组件,尤其是那些涉及生成文本或估计文本概率的任务,例如:
语言模型: 预测下一个单词系统(循环起来就是预测文本的了~)
循环神经网络/RNN:
循环神经网络!=语言模型(RNN可以实现语言模型)
我们已经证明,RNNs是构建LM的一个很好的方法。
但RNNs的用处要大得多!(为什么说RNNs,因为除了RNN还有gru和LSTM)
输出的结果就是对应的标签/标记(标记这个可以用one-hot表示)
由两种RNN结构,一种是最后一项输出的结果作为感情分类的结果,另一种则是将所有生成结果都统计起来生成感情分类的结果。也就是课堂中的,如何计算句子编码
(Sentence encoding可能是一种处理方式,例如根据生成结果的中间形式提取出感情,或者取均值或者最值后再判断,因为我没搞过感情分类这部分,所以也有点不是很确定)
编码器和解码器是注意力机制中的一个内容,后续肯定会学习的~,编码器和解码器其实都是RNN实现的(也可能是RNN的变种)
这也就是上面一直说的这个事情,当然上面说的是文本生成后续文本,下面举个音频生成文本的例子,类似语言转文字、根据语音生成后续可能的内容或者类似语音小助手的那种问答~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。