如何用飞桨实现 Bengio 经典神经网络语言模型?

本文介绍了如何使用百度的飞桨平台实现Bengio的经典神经网络语言模型,包括语言模型的概念、早期的n-gram实现,以及神经网络语言模型的架构。通过一个简单的三元组语言模型示例,展示了飞桨的基本使用,包括数据预处理、模型构建、训练、保存和预测等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚入门深度学习与自然语言处理(NLP)时,在学习了 Goldberg 特别棒的入门书 NN4NLP,斯坦福 cs224n 等等后,也无限次起念头,写个系列吧,但都不了了之了。

近来,NLP 领域因为超大预训练模型,很多研究需要耗费大量计算资源(比如百度新发布持续学习语义理解框架 ERNIE 2.0,该模型在共计 16 个中英文任务上超越了 BERT 和 XLNet,取得了 SOTA 效果),这样的项目基本上就是在烧钱,小家小户玩不起,于是就傻傻地等着大佬们发出论文,放出代码,刷新榜单。不过这也意味着一个总结的好机会,加上额外的推动,便重新起了念头。

这个系列会介绍我认为现代 NLP 最重要的几个主题,同时包括它们的实现与讲解。

这里会使用的百度的开源深度学习平台飞桨(PaddlePaddle),关于这点,有如下几个原因。

首先,不久前和一个科技媒体朋友聊天,因为当时封锁华为事件的原因,聊到了美国企业是否可能对我们封锁深度学习框架,比如说主流的 Tensorflow 和 Pytorch,我当时答是说不定可能呢,毕竟谷歌连 Dropout 都能去申请专利。只要之后改一下许可,不让使用这些框架的更新,估计我们也没办法,于是就想着可以了解一下国内百度的框架飞桨。

去飞桨的 PaddleNLP 看了一下,内容很丰富,感觉飞桨对 NLP 这块支持非常好,值得关注。

项目地址:
https://github.com/PaddlePaddle/models/tree/develop/PaddleNLP

语言模型

现代 NLP 领域的一个核心便是语言模型 (Language Model),可以说它无处不在,一方面它给 NLP 发展带来巨大推动,是多个领域的关键部分,但另一方面,成也萧何败也萧何,语言模型其实也限制了 NLP 发展,比如说在创新性生成式任务上,还有如何用语言模型获得双向信息。

那到底什么是语言模型?

什么是语言模型

 

640?wx_fmt=png

就是语言的模型(认真脸),开个玩笑,语言模型通俗点讲其实就是判断一句话是不是人话,正式点讲就是计算一句话的概率,这个概率值表示这个本文有多大概率是一段正常的文本。

对于一句话,比如说用脸滚出来的一句话:“哦他发看和了犯点就看见发”,很明显就不像人话,所以语言模型判断它是人话的概率就小。而一句很常用的话:“好的,谢谢”,语言模型就会给它比较高的概率评分。

用数学的方式来表示,语言模型需要获得这样的概率:

640?wx_fmt=png

其中 X 表示句子,x1,x2… 代表句子中的词。怎么计算这样一个概率呢,一个比较粗暴的方法就是有个非常非常大的语料库,里面有各种各样的句子,然后我们一个个数,来计算不同句子的概率,但稍微想想就知道这个方法不太可能,因为句子组合无穷无尽。

为更好计算,利用条件概率公式和链式法则,按照从左到右的句序,可以将公式转换成:

640?wx_fmt=png

题变成了如何求解:

640?wx_fmt=png

怎么根据前面所有的词预测下一个词,当然这个问题对于现在还有点复杂,之后可以用 RNN 模型来计算,但现在让我们先假设对于一个词离它近的词重要性更大,于是基于马尔可夫性假设,一个词只依赖它前面 n-1 个词,这种情况下的语言模型就被称为 N-gram 语言模型。

比如说基于前面2个词来预测下一个词就是 3-gram (tri-gram) 语言模型:

640?wx_fmt=png

细心些的话,会发现,当 n-gram 中的 n 增大,就会越接近原始语言模型概率方程。

当然n并不是越大越好,因为一旦n过大,计算序列就会变长,在计算时 n-gram 时词表就会太大,也就会引发所谓的 The Curse of Dimension (维度灾难) 。因此一般大家都将n的大小取在3,4,5附近。

早期实现:数一数就知道了

最早了解类似语言模型计算概率,是在研究生阶段当时号称全校最难的信息论课上,老师强烈安利香农的经典论文 A Mathematical Theory of Communication,论文中有一小节中,他就给利用类似计算上述语言模型概率的方法,生成了一些文本。

640?wx_fmt=png

其中一个就是用 2-gram (bi-gram) 的频率表来生成的,这已经相当于一个 bi-gram 语言模型了。

640?wx_fmt=png

同样,要构建这样一个 n-gram 语言模型,最主要工作就是,基于大量文本来统计 n-gram 频率。

当时有个课程作业,就是先准备一些英文文本,然后一个一个数 n-gram,之后除以总数算出语言模型中需要的概率估计值,这种方法叫 Count-based Language Model。

传统 NLP 中搭建语言模型便是这样,当然还有更多技巧,比如平滑算法,具体可以参考 Jurafsky 教授的书和课。

但这种方法会有一个很大的问题,那就是前面提到的维度灾难,而这里要实现的神经网络语言模型(Neural Network Language Model),便是用神经网络构建语言模型,通过学习分布式词表示(即词向量)的方式解决了这个问题。

语言模型能干什么

不过在谈神经网络语言模型前,我们先来看看语言模型的用途。

那它有什么用呢,如之前提到,语言模型可以说是现代 NLP 核心之一,无处不在。比如说词向量,最早算是语言模型的副产品;同时经典的序列到序列(seq2seq) 模型,其中解码器还可以被称为,Conditional Language Model(条件语言模型);而现在大火的预训练模型,主要任务也都是语言模型。

在实际 NLP 应用中,我认为能总结成以下三条:

第一,给句子打分,排序。先在大量文本上训练,之后就能用获得的语言模型来评估某句话的好坏。这在对一些生成结果进行重排序时非常有用,能很大程度地提高指标,机器翻译中有一个技巧便是结合语言模型 Loss 来重排序生成的候选结果。

第二,用于文本生成。首先其训练方式是根据前面词,生成之后词。于是只要不断重复此过程(自回归)就能生成长文本了。比较有名的例子就包括最近的 GPT2,其标题就叫 “ Better Language Models and Their Implications.” 它生成的句子效果真的非常棒,可以自己体验一番 https://talktotransformer.com/.

640?wx_fmt=png

第三,作为预训练模型的预训练任务。最近很火的预训练模型,几乎都和语言模型脱不开关系。

比如说 ELMo 就是先训练双向 LSTM 语言模型,之后双向不同层向量拼接获得最后的 ELMo词向量,还有 BERT 里最主要的方法就是 Masked Language Model (遮掩语言模型)。

而最近的 XLNet 中最主要训练任务也叫做 Permutation language Model (排列语言模型),可见语言模型在其中的重要性重要性。

神经网络语言模型架构

接下来简单介绍一下这里要实现的网络结构,借鉴自 Bengio 的经典论文 A Neural Probabilistic Language Model 中的模型。

640?wx_fmt=png

这里我们训练 Tri-gram 语言模型,即用前面两个词预测当前词。

于是输入就是两个单词,然后查表取出对应词向量,之后将两个词向量拼接起来,过一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值