前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >李宏毅深度学习之Deep Learning深度语言学习模型

李宏毅深度学习之Deep Learning深度语言学习模型

作者头像
瓜大三哥
发布2020-04-14 15:43:13
7500
发布2020-04-14 15:43:13
举报
文章被收录于专栏:瓜大三哥

6 深度语言学习模型

Deep Learning for Language Modeling

语言模型要做的事情就是估测一个word sequence(也就是一句话的概率),也就是说给你一个句子(由一串词汇word构成的),这个w就代表的是word,例子中有n个word,这n个w合起来就是一个句子。language model要做的事情就是,你要找一个function告诉我们说这个句子出现的概率有多大。

那这件事情有什么用呢?比如你可以用在语音辨识上面,在语音辨识上你一定需要languagemodel,因为在做语音辨识的时候,有时候不同的wordsequence,他可能有同样的发音。

举例来说:  recognize speech和wreck a beach,他们的发音其实是一样的(破坏一个海滩和语音辨识的英文发音是一样的)。所以光听语音你是没有办法去判断,是破坏一个海滩还是语音辨识,所以你要通过概率来发现说语音辨识句子出现的概率比破坏海滩句子出现的概率还要大(因为我们不该常常破坏海滩),最后的output就是语音辨识。

在翻译有时候也需要language model。他其实还有一个很好的应用,就是sentencegeneration(句子的生成),如果有一个app是要让你的machine说一句话,这个时候你就需要用到languagemodel,machine有很多个句子是可以进行选择的,通过languagemodel来选择哪个句子是最有可能的。

如果不用neuralnetwork,那传统上language model是怎么做的呢?

就用N-gram,那怎么去估计一句话的概率呢?概率这个东西,我们可以收集一个很大的database[数据库],去统计w1-wn出现的次数。然后我们就可以知道如果说一句话的话,w1-wn的概率是多少,但是麻烦的就是,w1-wn这个句子,在我们的语料库中,可能一次都没有出现过,那要怎么办呢?我们要把p(w1-wn)的概率拆成比较小的component(成分),而每一个component的概率使我们可以从database里面估测出来的,在把每一个conponent的概率乘起来,就变成这一整个sequence的概率。

所以说N-gram的概念就是说,我们把w1-wn的概率拆成条件概率,而这里面的每一个概率都是可以从训练数据中估测出来的,假设我们要估测p(“beach/nice”)的概率是多大(nice后面接beach的概率有多大的话),我们只需要计算nicebeach这两个词汇在整个训练数据里面出现的次数再除去nice这个词汇出现的次数,你就可以得到在nice后面接beach的概率。上面那个例子叫做2-grammodel,如果你每一个component只考虑前一个word的话,这个叫做2-gram(bi-gram也就是binarygram的缩写),如果考虑前两个word就是3-gram...

6.1NN-based Language Model

首先要收集training data,接下来学习一个neural network,这个neural network的作用就是预测下一个词汇,我们学习一个neural network,他的input是潮水退了 ,他的目标就是,然后你就用cross entropy去minimize你的network output还有他的target。input是退了,他的output就是知道,input是知道,output就是。NN-base language model就是这个样子。有了neural network以后要怎么算句子的概率呢?

我们同样把一个句子拆成2-gram概率的相乘。但是我们现在用NN-base language model的话,这些概率就不是从统计来,就不是从count database里面那些词汇出现的次数来得到这个概率,这个概率就是network的output,也就是说,假设现在我们想要知道wreck,放在句首的概率的话,我们需要有一个Token(标记),代表说句子的起始,我们把句子的起始这件事情也当做是一个词汇来看待,我们的neural network就input句子的起始的这一个Token(标记),然后让他去预测wreck,这个word是下一个word的概率,你把这个概率拿出来就放在上面拆分的那个地方。然后你把wreck这个词汇,用1-of-Nencoding来表示,然后把它丢到network里面,然后让他predict下一个词汇是什么,假设世界上有十万个词汇,那么他的output就有十万维,那每一维都会有一个数字,你把wreck丢进去的话,每一个词汇都会有一个数字代表这个词汇是wreck这个词汇下一个词汇的概率,如果a的概率是多少,那么wreck后面就是接a的概率,然后就反复下去。把所有的词的概率统统乘起来,就是得到这个句子的概率了。

6.2RNN-base Language Model

也就是说我收集了很多数据,这个RNN的input begin的时候,他就要output潮水,input潮水他就output退了,input的退了他就output,input就output知道...那和NN不一样的地方就是他在output为"知道"的时候,他是看了"潮水","退了","就"...这么多的词汇,才能决定说接下来的output会是"知道",如果是NN的话,他现在的input就predict output,如果是RNN的话,他会看这个句子之前所有的词汇,再决定他的output。

如何去估测这个p(w1,w2,w3,…,wn)这个概率呢?你把RNN learn出来以后,你就丢一个begin进去,看他在w1这个词汇的分数也就是p(w1),接下来把w1丢进去,就得到p(w2|w1)依次类推。然后把所有的概率统统的乘起来,你就得到一个句子的概率。那做RNN的好处就是可以建模long-term的信息,也可以用多层的RNN或者LSTM。

接下来,解释一下,为什么需要NN-based language model,用NN-basedlanguage model相较于传统的model有什么好处?

那我们先看一下传统的N-gram的language model,传统的最大的问题就是,那个概率你很难估测的准,因为我们永远没有足够的data(语料库),让我们把概率真的估计的很准,尤其是当我们的N很大的时候,我们会遇到data sparsity[数据稀疏],因为我们的data不够,所以我们没有办法把所有的n-gram在database上都观察的到。所以有一些n-gram概率,我们是估计不准的。

举例来说:假设我的training data里面有一个句子是"thedog ran",另一个句子是"thecat jumped"。那如果你在估计一个3-gramlanguage model的概率的时候,"thedog"后面接"jumped"的概率就会变成是0,"thedog"后面接"ran"的概率是有值的,同理"thecat"后面接"ran"的概率就会是0,但是这件事情并不是正确的,因为"dog"不只会"jump"也会"ran","cat"不止会"jumped"还会"ran"。只是因为我们的database太小了,如果你把全世界中所有时间的句子统统的收集起来的话,你就可以正确的用N-gramlanguage mode估测出概率来。但是我们没有办法来做这件事情,所以我们估测的概率是不准的,有一些N-gram,比如"thedog"后面接"jumped",这样的概率是0,但是实际上他并不一定是0,他其实还是有可能会出现的,但是database不够大,所以我们没有办法观察到这件事情。所以传统的一个解法叫做smoothing(平滑处理),smoothing意思就是说不要真正给一个N-gram概率为0,你给他一个小小的概率。怎样使用smoothing其实也是一个很大的学问,这个就不在讨论。那今天用NN的话,用deeplearning有什么好处呢?

6.3Matrix Factorization(矩阵因子分解)

想到datasparsity[数据稀疏]的问题,你就会想到matrixfactorization[矩阵因子分解]。我们可以把n-gram的概率看成是一个table,这个table其中一个dimension代表的是history,另外一个dimension代表的是vocabulary[词汇],这个table上面的每一个element,代表的是给某一个history,他之后接下一个word的概率。比如0.2代表的是看见"cat"作为history,接下来接"jumped"的概率是0.2,所以我们可以估计一个2-gramlanguage model,然后把2-gramlanguagemodel的值写作是一个table。当然你也可以很轻易的概括到3-gram,你把table上的history上的词汇改成三个词汇,就可以泛化到3-gram...,那你会发现说,在这个表格里面,大部分的空格其实都是0。很多2-gram在你的database里面一次都没有看到,所以他estimate出来的概率都是0。但是他的概率是0,不代表说他真的就是0,只是我们的database不够大,所以我们没有看到。

这种问题和推荐系统的问题是一样的。所以我们可以套用推荐系统的方法来解这个问题。那如何去解呢?

每一个history,我们都用一个vector来表示。每一个vocabulary我们也都用vector来描述,这个v和h的dimension要是一样的,因为一会要做他们的innerproduct[内积],dimension一样的才能乘起来。这个v和h是要被学出来的,那怎么去学他呢?你要去minimizing右下角的那个function。我们假设这个table里面的element都用n加上两个下标来表示,你希望minimizing的东西就是你希望让vi*hi他的值和ni越接近越好。接下来你用gradientdescent运算,你就可以把v和h的vector统统都找出来,你就可以给每一个history一个vector,就可以给vocabulary每一个词汇一个vector。接下来你就可以根据找出来的vector,把这些是0的数值空格的分数算出来,也就是说n12就变成了v1和 h2。你就可以把是0空格的哪些分数把他算出来,他们相乘的时候不会是0。

这样的好处就是,有两个词汇,他们是相近的,有两个history他们是很相近的。比如说"dog"和"cat",他们其实是很相近的,他们的hdog和hcat是很接近的。如果vjump*hcat是很大的,那vjump*hdog也会跟着值很大,就算是你在trainingdata里面从来没有看到过"dog"后面接"jumped",但是凭着"dog"的vector和"cat"vector很像这件事情,你就可以估测出既然"cat"和"jumped"相接的概率很大,"dog"与"jumped"相接的概率也会很大。

这个和一般的smoothing不一样,用这个matrix factorization的方法等于也是做了smoothing,但是和一般的smoothing的方法是不一样的,一般的smoothing方法,你是没办法真正的去考虑词汇的意思是什么,只是说这边0.2太大减一点分给其他的词,但是如果你今天用matrix factorization的方法,你可以真的把词汇的意思考虑进去,会考虑说这个"dog"和"jumped"他们这个0可能是会有值的,但是"dog"和"cried"以及"dog"和"laughed"这些值通常是比较小的。

那这个东西和NN有什么关系呢?其实matrix factorization是可以写成NN的,可以写成只有一个layer的neural network:

因为需要考虑的是概率,所有每一个column的和都是1,这才能是概率。某一个history后面接某一个vocabulary的概率。每一个column的和必须要是1,才是一个概率。

假设"dog"这个history的vector就是hdog。把hdog和vrun做内积,我们可以把hdog和vcried做内积,对每一个vocabulary的v做内积。每一个vocabulary就可以得到一个数值,但是这些数值的和没有办法当成概率来看,因为和不是1,甚至有可能是负数。那怎么办呢?做一个softmax,做一个softmax以后,就可以把hdog*vrun的结果通过softmax结果看成是dog后面接ran的概率。就可以把hdog*vcried的结果通过softmax的结果看成是"dog"后面接"cried"的概率。

接下来在training的时候,根据trainingdata,假设"dog"后面接"ran"的概率是0.2。"dog"后面接"cried"的概率是0,那这个vector就是所需要的target。那再learn参数的时候,就会希望这些做完inner product的结果和这个target的cross entropy是被minimizing的。

这个过程其实可以当做一个NN,history就是这个NN的input。input的dimension就是看history有几个可能,假设考虑2-gram。那input每一个dimension与hiddenlayer相接的这些weight,就是哪一个history对应的vector,也就是对用到"cat"的哪个history,后面跟hiddenlayer这些dimension相接的这些weight,就是hcat,对应到"dog"哪个dimension,与之间hiddenlayer相接的这些value就是hdog。那input就是用1-of-Nencoding来表示,假设history是"dog"的话,用1-of-Nencoding来表示的话,就是"dog"那一维度是1,其他的都是0。把这个vector丢到network里面去,如果不考虑激活函数的话,得到的就是hdog,接下来乘以v这件事情,相当于是是另外一个layer,那把h与v做内积想成是做另外一个layer,然后在使用softmax得到一个layer的output,然后一直train下去。这就是为什么NN用来做languagemodel的应用。那其实在这种n-gram language model,这种新的n-gram language model在2010年以后才比较流行。一开始用matrix factorization来做,后来发现使用NN的performance是比较好的,使用NN的话,不仅可以迭一层,还可以考虑RNN。

那使用NN到底会有什么好处呢?如果现在比较用NN和做N-gram language model所需要的参数量,NN所需要的参数量是比较小的,如果做n-gram language model,需要估计的参数,是history的数目乘上vocabulary的数目,但是在这个neuralnetwork里面,需要估计的参数远小于history的数目乘以vocabulary的数目,要估计的参数是每一个history要给一个vectorv,每一个vocabulary word都给他一个vectorv,v和h的dimension不要设的太大,neural network所需要的参数是远小于language model所需要的参数的。也就是说假设history的数目有h的绝对值,vocabulary的数目是v的绝对值,如果用n-gram language model的话,需要估测的参数是h的绝对值乘上v的绝对值,很大。如果今天使用NN-base language model,需要的参数是你对每一个history都有一个vector,这个vector的dimension是可以自己决定的,假设是k,k不要设的太大,可以设k=100之类的,然后为每一个vocabulary都给一个vector,这个vector的dimension也是k,这个东西其实他会远小于这个数值,所以使用NN的好处并不是NN很大,NN有很多层,所以可以暴力的去fitmodel,其实不是,用n-gram才是暴力的方法,参数很多,用neural network的时候,用的参数是比较少的,比较不容易overfitting,所以会得到比较好的performance,NN的好处通常是因为用的参数比较少,比较不会overfitting。

那为什么要用RNN?

使用RNN的好处就是可以更减少参数。如果考虑的history,非常的长,(w1-wt)个词那么长,前t个词汇所组成的history有多少个可能呢?有vt那么多,如果word的size有10万个,那这个可能的history数目就变成了一个天文数字,用1-of-n encoding描述他很显然是不行的。

这个时候,就可以使用RNN来描述,RNN就是反复使用某一个function,所以把一个functionf拿出来,每次把w1丢到f里面得到h1,依次类推,最后把wt丢进f里面产生ht,ht就是这一整个history的表示,这一整个history,可以用RNN最后的outputht来表示他,不管history有多长,RNN的参数都不会变多。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 瓜大三哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 6.1NN-based Language Model
  • 6.2RNN-base Language Model
  • 6.3Matrix Factorization(矩阵因子分解)
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档