自然语言处理从入门到应用——静态词向量预训练模型:神经网络语言模型(Neural Network Language Model)

分类目录:《自然语言处理从入门到应用》总目录


《自然语言处理从入门到应用——自然语言处理的语言模型(Language Model,LM)》中介绍了语言模型的基本概念,以及经典的基于离散符号表示的N元语言模型(N-gram Language Model)。从语言模型的角度来看,N元语言模型存在明显的缺点。首先,模型容易受到数据稀疏的影响,一般需要对模型进行平滑处理;其次,无法对长度超过N的上下文依赖关系进行建模。神经网络语言模型(Neural Network Language Model)在一定程度上克服了这些问题。一方面,通过引入词的分布式表示,也就是词向量,大大缓解了数据稀疏带来的影响;另一方面,利用更先进的神经网络模型结构(如循环神经网络、Transformer等),可以对长距离上下文依赖进行有效的建模。正因为这些优异的特性,加上语言模型任务本身无须人工标注数据的优势,神经网络语言模型几乎已经替代N元语言模型,成为现代自然语言处理中最重要的基础技术之一;同时,也是自然语言预训练技术的核心。本文将从最基本的前馈神经网络语言模型出发,介绍如何在大规模无标注文本数据上进行静态词向量的预训练;然后,介绍基于循环神经网络的语言模型,通过引入更丰富的长距离历史信息,进一步提升静态词向量的表示能力。

预训练任务

给定一段文本 w 1 w 2 ⋯ w n w_1w_2\cdots w_n w1w2wn,语言模型的基本任务是根据历史上下文对下一时刻的词进行预测,也就是计算条件概率 P ( w t ∣ w 1 w 2 ⋯ w t − 1 ) P(w_t | w_1w_2\cdots w_{t-1}) P(wtw1w2wt1)。为了构建语言模型,可以将其转化为以词表为类别标签集合的分类问题,其输入为历史词序列 w 1 w 2 ⋯ w t − 1 w_1w_2\cdots w_{t-1} w1w2wt1(也记作 w 1 : t − 1 w_{1:t -1} w1:t1),输出为目标词 w t w_t wt。然后就可以从无标注的文本语料中构建训练数据集,并通过优化该数据集上的分类损失(如交叉熵损失或负对数似然损失)对模型进行训练。由于监督信号来自数据自身,因此这种学习方式也被称为自监督学习(Self-supervised Learning)。

在讨论模型的具体实现方式之前,首先面临的一个问题是:如何处理动态长度的历史词序列(模型输入)?一个直观的想法是使用词袋表示,但是这种表示方式忽略了词的顺序信息,语义表达能力非常有限。下文将介绍前馈神经网络语言模型(Feed-forward Neural Network Language Model)以及循环神经网络语言模型(Recurrent Neural Network Language Model,RNNLM),分别从数据和模型的角度解决这一问题。

前馈神经网络语言模型

前馈神经网络语言模型利用了传统N元语言模型中的马尔可夫假设(Markov Assumption)——对下一个词的预测只与历史中最近的 n − 1 n−1 n1个词相关。从形式上看:
P ( w t ∣ w 1 : t − 1 ) = P ( w t ∣ w t − n + 1 : t − 1 ) P(w_t | w_{1:t-1}) = P(w_t | w_{t-n+1:t-1}) P(wtw1:t1)=P(wtwtn+1:t1)

因此,模型的输入变成了长度为 n − 1 n−1 n1的定长词序列 w t − n + 1 : t − 1 w_{t−n+1:t−1} wtn+1:t1,模型的任务也转化为对条件概率 P ( w t ∣ w t − n + 1 : t − 1 ) P(w_t | w_{t-n+1:t-1}) P(wtwtn+1:t1) 进行估计。前馈神经网络由输入层、词向量层、隐藏层和输出层构成。在前馈神经网络语言模型中,词向量层首先对输入层长为 n − 1 n−1 n1的历史词序列 w t − n + 1 : t − 1 w_{t-n+1:t-1} wtn+1:t1进行编码,将每个词表示为一个低维的实数向量,即词向量;然后,隐藏层对词向量层进行线性变换,并使用激活函数实现非线性映射;最后,输出层通过线性变换将隐藏层向量映射至词表空间,再通过Softmax函数得到在词表上的归一化的概率分布,如下图所示:
前馈神经网络语言模型示意图
上图的模型包含如下几个部分:

  • 输入层:模型的输入层由当前时刻 t t t的历史词序列 w t − n + 1 : t − 1 w_{t-n+1:t-1} wtn+1:t1构成,主要为离散的符号表示。在具体实现中,既可以使用每个词的独热编码(One-Hot Encoding),也可以直接使用每个词在词表中的位置下标。
  • 词向量层:词向量层将输入层中的每个词分别映射至一个低维、稠密的实值特征向量。词向量层也可以理解为一个查找表(Look-up Table),获取词向量的过程,也就是根据词的索引从查找表中找出对应位置的向量的过程: x = [ v w t − n + 1 ; v w t − n + 2 ; ⋯   ; v w t − 1 ; ] x=[v_{w_{t-n+1}}; v_{w_{t-n+2}}; \cdots;v_{w_{t-1}};] x=[vwtn+1;vwtn+2;;vwt1;]式中, v w ∈ R d v_w\in R^d vwRd表示词 w w w d d d维词向量( d ≪ ∣ V ∣ d\ll|V| dV ∣ V ∣ |V| V为词表大小); x ∈ R ( n − 1 ) d x\in R^{(n-1)d} xR(n1)d表示历史序列中所有词向量拼接之后的结果。若定义词向量矩阵为 E ∈ R d × ∣ V ∣ E\in R^{d\times|V|} ERd×V,那么 v w v_w vw即为 E E E中与 w w w对应的列向量,也可以表示为 E E E w w w的独热编码 e w e_w ew之间的点积。
  • 隐藏层:模型的隐藏层对词向量层 x x x进行线性变换与激活。令 W hid ∈ R m × ( n − 1 ) d W^\text{hid}\in R^{m\times(n-1)d} WhidRm×(n1)d为输入层到隐藏层之间的线性变换矩阵, b hid ∈ R m b^\text{hid}\in R^m bhidRm为偏置项, m m m为隐藏层维度。隐藏层可以表示为: h = f ( W hid x + b hid ) h=f(W^\text{hid}x+b^\text{hid}) h=f(Whidx+bhid)式中, f f f是激活函数。常用的激活函数有Sigmoid、tanh和ReLU等。
  • 输出层:模型的输出层对 h h h做线性变换,并利用Softmax函数进行归一化,从而获得词表 V V V空间内的概率分布。令 W out W^{\text{out}} Wout为隐藏层到输出层之间的线性变换矩阵,相应的偏置项为 b out b^{\text{out}} bout。输出层可由下式计算: y = Softmax ( W out x + b out ) y=\text{Softmax}(W^{\text{out}}x+b^{\text{out}}) y=Softmax(Woutx+bout)

综上所述,前馈神经网络语言模型的自由参数包含词向量矩阵 E E E,词向量层与隐藏层之间的权值矩阵 W hid W^\text{hid} Whid及偏置项 b hid b^\text{hid} bhid,隐藏层与输出层之间的权值矩阵 W out W^{\text{out}} Wout与偏置项 b out b^{\text{out}} bout,可以记为:
θ = { E , W hid , b hid , W out , b out } \theta=\{E, W^\text{hid}, b^\text{hid}, W^{\text{out}}, b^{\text{out}}\} θ={E,Whid,bhid,Wout,bout}

参数数量为 ∣ V ∣ × d + m × ( n − 1 ) d + m + ∣ V ∣ × m + ∣ V ∣ |V|\times d+m\times(n-1)d+m+|V|\times m+|V| V×d+m×(n1)d+m+V×m+V,即 ( 1 + m + d ) ∣ V ∣ + ( 1 + ( n − 1 ) d ) m (1+m+d)|V|+(1+(n-1)d)m (1+m+d)V+(1+(n1)d)m。由于 m m m d d d是常数,所以,模型的自由参数数量随词表大小呈线性增长,且 n n n的增大并不会显著增加参数的数量。另外,词向量维度 d d d、隐藏层维度 m m m和输入序列长度 n − 1 n−1 n1等超参数的调优需要在开发集上进行。模型训练完成后,矩阵 E E E则为预训练得到的静态词向量。

循环神经网络语言模型

在前馈神经网络语言模型中,对下一个词的预测需要回看多长的历史是由超参数 n n n决定的。但是,不同的句子对历史长度 n n n的期望往往是变化的。例如,对于句子“他 喜欢 吃 苹果”,根据“吃”容易推测出,下画线处的词有很大概率是一种食物。因此,只需要考虑较短的历史就足够了。而对于结构较为复杂的句子,如“他 感冒 了,于是 下班 之后 去 了 医院”,则需要看到较长的历史“感冒”才能合理地预测出目标词“医院”。循环神经网络语言模型正是为了处理这种不定长依赖而设计的一种语言模型。循环神经网络是用来处理序列数据的一种神经网络,而自然语言正好满足这种序列结构性质。循环神经网络语言模型中的每一时刻都维护一个隐含状态,该状态蕴含了当前词的所有历史信息,且与当前词一起被作为下一时刻的输入。这个随时刻变化而不断更新的隐含状态也被称作记忆(Memory)。下图展示了循环神经网络语言模型的基本结构:
循环神经网络语言模型的基本结构
上图的模型包含如下几个部分:

  • 输入层:与前馈神经网络语言模型不同,由于模型不再受限于历史上下文的长度,所以此时输入层可由完整的历史词序列构成,即 w 1 : t − 1 w_{1:t−1} w1:t1
  • 词向量层:与前馈神经网络语言模型类似,输入的词序列首先由词向量层映射至相应的词向量表示。那么,在 t t t时刻的输入将由其前一个词 w t − 1 w_{t−1} wt1的词向量以及 t − 1 t−1 t1时刻的隐含状态 h t − 1 h_{t−1} ht1组成。令 w 0 w_0 w0为句子起始标记(如:<bos>), h 0 h_0 h0为初始隐含层向量(可使用0向量),则t时刻的输入可以表示为: x t = [ v w t − 1 ; h t − 1 ] x_t=[v_{w_{t-1}}; h_{t-1}] xt=[vwt1;ht1]
  • 隐含层:隐含层的计算与前馈神经网络语言模型类似,由线性变换与激活函数构成。 h t = tanh ( W hid x t + b hid ) h_t=\text{tanh}(W^{\text{hid}}x_t+b^{\text{hid}}) ht=tanh(Whidxt+bhid)式中 W hid ∈ R m × ( d + m ) W^{\text{hid}}\in R^{m\times(d+m)} WhidRm×(d+m) b hid ∈ R m b^{\text{hid}}\in R^m bhidRm W hid W^{\text{hid}} Whid实际上由两部分构成,即 W hid = [ U ; V ] W^{\text{hid}}=[U; V] Whid=[U;V] U ∈ R m × d U\in R^{m\times d} URm×d V ∈ R m × m V\in R^{m\times m} VRm×m分别是 v w t − 1 v_{w_{t-1}} vwt1 h t − 1 h_{t−1} ht1与隐含层之间的权值矩阵。为了体现循环神经网络的递归特性,在书写时常常将两者区分开: h t = tanh ( U v w t − 1 + V h t − 1 + b hid ) h_t=\text{tanh}(Uv_{w_{t-1}}+Vh_{t-1}+b^{\text{hid}}) ht=tanh(Uvwt1+Vht1+bhid)
  • 输出层:最后,在输出层计算t时刻词表上的概率分布: y = Softmax ( W out x + b out ) y=\text{Softmax}(W^{\text{out}}x+b^{\text{out}}) y=Softmax(Woutx+bout)式中, W out ∈ R ∣ V ∣ × m W^{\text{out}}\in R^{|V|\times m} WoutRV×m

以上只是循环神经网络最基本的形式,当序列较长时,训练阶段会存在梯度弥散(Vanishing gradient)或者梯度爆炸(Exploding gradient)的风险(可以参看文章《机器学习中的数学——深度学习优化的挑战:梯度消失和梯度爆炸》)。为了应对这一问题,以前的做法是在梯度反向传播的过程中按长度进行截断(Truncated Back-propagation Through Time),从而使得模型能够得到有效的训练,但是与此同时,也减弱了模型对于长距离依赖的建模能力。这种做法一直持续到2015年左右,之后被含有门控机制的循环神经网络,如长短时记忆网络(LSTM)代替。

参考文献:
[1] 车万翔, 崔一鸣, 郭江. 自然语言处理:基于预训练模型的方法[M]. 电子工业出版社, 2021.
[2] 邵浩, 刘一烽. 预训练语言模型[M]. 电子工业出版社, 2021.
[3] 何晗. 自然语言处理入门[M]. 人民邮电出版社, 2019
[4] Sudharsan Ravichandiran. BERT基础教程:Transformer大模型实战[M]. 人民邮电出版社, 2023
[5] 吴茂贵, 王红星. 深入浅出Embedding:原理解析与应用实战[M]. 机械工业出版社, 2021.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/31557.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Redis基础】

Redis基础 Redis基础Note Redis基础1.初识Redis1.1.认识NoSQL1.1.1.结构化与非结构化1.1.2.关联和非关联1.1.3.查询方式1.1.4.事务1.1.5.总结 1.2.认识Redis1.3.安装Redis1.3.1.依赖库1.3.2.上传安装包并解压1.3.3.启动1.3.4.默认启动1.3.5.指定配置启动1.3.6.开机自启1.3.7.wi…

Win7系统提示Windows Defender无法扫描选定的文件解决方法

Win7 64位系统提示“Windows Defender无法扫描选定的文件”怎么办呢?使用Windows Defender扫描文件,结果弹出如下图窗口,该怎么解决呢,参考下文,一起来解决Win7系统提示“Windows Defender无法扫描选定的文件”的解决方法。 原因分析: 这是因为开启Defender扫描压…

rabbitmq第三课-RabbitMQ高级功能详解以及常用插件实战

一、选择合适的队列. 实际上是可以选择三种队列类型的,classic经典队列,Quorum仲裁队列,Stream流式队列。 后面这两种队列也是RabbitMQ在最近的几个大的版本中推出的新的队列类型。3.8.x推出了Quorum仲裁队列,3.9.x推出了Stream流…

计算机网络基础知识(九)—— 什么是TelnetS?Telnet Over TLS

文章目录 01 | TelnetS02 | OpenSSL03 | 实现思路服务器处理流程客户端处理流程 04 | 代码实现服务端代码客户端代码编译过程 & 执行结果 前面学习了什么是HTTPS协议,了解了HTTPS的工作原理以及具体的工作流程,了解了HTTP协议和HTTPS协议之间的区别。…

Elasticsearch 安装(Linux)

ElasticSearch 概念安装安装es 后台启动 & 停止启动nohup 记录pid 停止 其他启动错误max number of threads内存不足 Cannot allocate memoryfailed to obtain node locks 概念 ES是一款分布式全文搜索引擎,基于Lucene,进行了二次封装,更…

ElasticSearch-安装Head可视化插件

安装Head可视化插件 首先需要依赖node.js和npm环境 1 安装node.js 官方下载地址:http://nodejs.cn/download/ 下载LTS版本(长期稳定版本) 安装可以更改安装路径,其余的都是选择 下一步傻瓜是安装 安装成功后如下 命令测试 node -v 查看node的版本 n…

Redis 2023面试5题(二)

一、Redis key没设置过期时间却被redis主动删除了 如果一个 Redis 键没有设置过期时间,那么 Redis 无法判断该键是否应该自动删除。因此,如果一个没有设置过期时间的键被 Redis 主动删除了,可能是以下原因之一: 内存不足&#x…

【论文笔记】BEIT:BERT PRE-TRAINING OF IMAGE TRANSFORMERS

GitHub 1.介绍 1.1 挑战 视觉转换器的输入单元,即图像补丁,没有预先存在的词汇。预测遮罩面片的原始像素往往会在预训练短程依赖性和高频细节上浪费建模能力 1.2 回顾一下Bert的基本架构和流程 输入编码:通过tokenizer将输入的文本中的每…

OceanBase—01(入门篇——使用docker安装OceanBase以及介绍连接OB的几种方式)

OceanBase—01(入门篇——使用docker安装OceanBase以及介绍连接OB的几种方式) 1. 前言1.1 安装部署参考1.1.1 安装前提1.1.2 参考 1.1 修改数据库用户名密码1.2 总结常见连接命令 2. 安装部署OceanBase2.1 启动 OceanBase 数据库实例2.1.1 拉取镜像并启动…

eclipse (C/C++) 常用设置记录

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台;现公司用其作为开发单片机的IDE;因此记录一下常用的配置方法; 文章目录 零、常用默认快捷键一、高亮相同变量二、修改高亮变量颜色三、在整个工程内搜索某个函数四、切换主题五、改变字…

编译原理笔记16:自下而上语法分析(3)构造 DFA、DFA 对下一步分析的指导(有效项目)

目录 由 NFA 用子集法构造 DFA由 LR(0) 项目直接构造识别活前缀的 DFA构造 DFA求拓广文法 GCLOSURE & GO例: 构造 DFA DFA 指导下一步分析有效项目 看了前面的内容,我们已经了解到:分析表和驱动器算法,是 LR 分析器的核心。 …

基于Java+Swing+Mysql实现图书管理系统V2.0

基于JavaSwingMysql实现图书管理系统V2.0 一、系统介绍二、功能展示1.项目内容2.项目骨架3.数据库表4.主界面5.添加6、修改7、查询8、删除 四、其它1.其他系统实现五.获取源码 一、系统介绍 本系统主要有对图书信息的增删改查操作功能。 项目类型:Java SE项目&…

linux 下查看 USB 设备

文章目录 前言目录内容详解usb11-0:1.01-1.1:1.0 结构图设备信息bDeviceClassversionbusnum & devnumdevbMaxPoweridVendor & idProductproductmanufacturerbcdDevicespeedueventbmAttributesdrivers_autoprobe 前言 在 sysfs 文件系统下,查看 USB 设备&am…

Android 9-SystemUI:(1)启动流程

具体分析(以下代码示例,讲解,都是通过,Android9代码来举例) SystemUI,其实是可以看作是一个系统级的服务,也就是SystemUIService, SystemUI的服务启动,要从SystemServer.run()方法入手 main 方法里启动了…

企业级微服务架构实战项目--xx优选3-mq+nacos+es实现上下架

一 nacosmqes实现上下架 1.1 架构图 1.2 工程结构 1.3 核心代码流程 1.3.1 请求product模块 2.修改数据库,推送rabbitmq中 1.3.2 rabbitmq的工具类 1.3.3 search模块中rabbit客户端订阅信息 1.监听器监听信息 2.调用相应的上下架方法 2.1 调用product模块&…

Flink 学习三 Flink 流 process function API

Flink 学习三 Flink 流&process function API 1.Flink 多流操作 1.1.split 分流 (deprecated) 把一个数据流根据数据分成多个数据流 1.2 版本后移除 1.2.分流操作 (使用侧流输出) public class _02_SplitStream {public static void main(String[] args) throws Excep…

uniapp设置滚动条滚动到指定位置

场景:左侧菜单栏,每次切换时,需要右侧商品展示区保持滚动条及页面在最顶部 1.利用scroll-view 中scroll-top属性实现 1.1设置scrollToTop属性为0 data() {return {// 保证每次切换,滚动条位置都在最顶部scrollToTop: 0,}; } 1.…

ansible的剧本(playbook)

一、playbooks 概述以及实例操作 1、playbooks 的组成 playbooks 本身由以下各部分组成 (1)Tasks:任务,即通过 task 调用 ansible 的模板将多个操作组织在一个 playbook 中运行 (2)Variables&#xff1…

iOS 单元测试之常用框架 OCMock 详解 | 京东云技术团队

一、单元测试 1.1 单元测试的必要性 测试驱动开发并不是一个很新鲜的概念了。在日常开发中,很多时候需要测试,但是这种输出是必须在点击一系列按钮之后才能在屏幕上显示出来的东西。测试的时候,往往是用模拟器一次一次的从头开始启动 app&a…

团体程序设计天梯赛-练习集L2篇④

🚀欢迎来到本文🚀 🍉个人简介:Hello大家好呀,我是陈童学,一个与你一样正在慢慢前行的普通人。 🏀个人主页:陈童学哦CSDN 💡所属专栏:PTA 🎁希望各…