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

news2024/11/19 7:49:24

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


《自然语言处理从入门到应用——自然语言处理的语言模型(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.

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一道算法---数组中出现次数超过一半的数字

数组中出现次数超过一半的数字 1.题目2.思路3.代码 1.题目 链接: 数组中出现次数超过一半的数字 2.思路 【解题思路1】: 思路一:数组排序后,如果符合条件的数存在,则一定是数组中间那个数。这种方法虽然容易理解,但…

gcov的使用

什么是代码覆盖率? 代码覆盖率是对整个测试过程中被执行的代码的衡量,它能测量源代码中的哪些语句在测试中被执行,哪些语句尚未被执行。 代码覆盖率的指标种类 代码覆盖率工具通常使用一个或多个标准来确定你的代码在被自动化测试后是否得…

SQL注入第一章节

SQL注入第一章节 1.1 什么是SQL注入 SQL 注入(Injection) 概述 SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情…

合并表格的指定列按序号排序

这里有一个Excel需求: 如下图所示,需要在序号那一列自动排序下去。 但是是合并的行,而且合并的行数还是不确定的,那怎么给他自动排序下去呢? 解决方法可供参考:使用筛选和COUNT函数完成。 1.第一步筛选 首…

Collection集合

Collection集合面试题 导学 这次课程主要涉及到的是List和Map相关的面试题,比较高频就是 ArrayList LinkedList HashMap ConcurrentHashMap ArrayList底层实现是数组LinkedList底层实现是双向链表HashMap的底层实现使用了众多数据结构,包含了数组、…

5.MySQL索引事务

文章目录 🐾1. 索引🐾💐1.1 概念💐🌸1.2 作用与缺点🌸🌷1.2.1作用🌷🍀1.2.2缺点🍀 🌹1.3 使用场景🌹🌻1.4 使用&#x1f3…

阿里云服务器官网

阿里云服务器官网:https://www.aliyun.com/product/ecs 阿里云服务器分为云服务器ECS、轻量应用服务器、GPU云服务器等,云服务器ECS是阿里云明星级产品,专业级云服务器,如下图: 阿里云服务器ECS 阿里云服务器网分享阿…

【论文阅读】Learing to summarize from human feedback

前言 更多关于大模型的文章可见:ShiyuNee/Awesome-Large-Language-Models: Papers about large language models (github.com) 该仓库持续更新 Abs 通过训练模型来向着人类偏好优化可以显著提高摘要质量。 Method High-level methodology 从一个在摘要数据集上…

剑指offer(C++)-JZ3:数组中重复的数字(算法-排序)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几…

攻防世界-web-Web_python_template_injection

题目描述:只有一句话,翻译出来时python模板注入 1. 思路分析 1.1 什么是python模板注入? 做这道题之前我也不知道什么是python模板注入,问了下chatgpt,回答是这样的: 回答很简洁,举个例子&…

AUTOSAR 架构下的SPI模块的理解

一、SPI模块 1、模块简介 SPI处理程序/驱动程序为单片SPI [串行外设接口]处理程序/驱动程序提供功能和API。该软件模块包括处理和驱动功能。这种单片SPI处理器/驱动器的主要目标是充分利用每个微控制器的功能,并根据静态配置实现优化,以尽可能地满足ECU…

医疗虚拟仿真和虚拟现实有什么区别?哪个更好?

随着我们在仿真教育中越来越多地使用新技术,区分虚拟模式的类型很重要。虚拟仿真是一个统称,用来概括术语来描述各种基于仿真的体验,从基于屏幕的平台到沉浸式虚拟现实。然而,各虚拟平台在保真度、沉浸感和临场感的水平上有很大差…

java 调用 opencv 识别图片

前言 opencv 的 github 地址 opencv 官网 本文介绍如何使用 java 来调用 opencv 下载opencv opencv下载 页面根据自己电脑操作系统下载最新的安装包,我这里下载的是 4.7.0 版本。 (4.7.0 版本里的 opencv-470.jar 包是使用 jdk11 编译的&#xff0c…

从0到1ES集群搭建实践

ES集群搭建实践 创建虚拟机 创建Linux新用户elastic 必须信息 使用elasticsearch账号操作:启动,关闭等 配置网卡信息 vi /etc/sysconfig/network-scripts/ifcfg-ens33TYPE"Ethernet" PROXY_METHOD"none" BROWSER_ONLY"no…

pytorch笔记:transformer

来自B站视频,API查阅,TORCH.NN seq2seq 可以是 CNN,RNN,transformer nn.Transformer 关键源码: encoder_layer TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout,activation, layer_norm_eps, ba…

Github官网进不去怎么办?Github无法访问怎么办?

1.操作方法: 打开hosts文件,可能需要管理员权限。 win10 hosts位置:C:\Windows\System32\drivers\etc 在末尾新建一行,添加如下内容: 2.1方法一 Host文件追加 140.82.112.26 alive.github.com140.82.114.25 live.…

【electron】 客户端调试小技巧

1、谷歌浏览器输入:chrome://inspect打开开发者工具 可以方便拦截electron内的请求,也可以通过f12的开发者工具中的source打断点。 虽然在electron客户端内也能审查元素。 PS:但是其有局限性,如果是窗体套窗体(webview)&#xff…

Android——基本控件(十)

1. 图片视图:ImageView 1.1 知识点 (1)掌握ImageView组件的使用; (2)掌握图片的保存; 1.2 具体内容 之前我们讲过了RadioGroup是提供了一个存放RadioButton的一个容器,ImageVie…

STM32速成笔记—中断

文章目录 一、什么是中断二、中断的相关概念2.1 中断优先级2.2 中断嵌套2.3 中断服务函数2.4 中断标志位 三、外部中断EXIT四、中断程序配置4.1 设置中断分组并使能中断4.2 初始化EXIT4.3 编写中断服务函数 五、注意事项 一、什么是中断 首先介绍一下什么是中断。在实际开发过…

OpenCV 笔记_2

文章目录 笔记_2图像尺寸变换resize 图像缩放 (重置图像大小)flip 图像翻转hconcat 横向连接vconcat 纵向连接 图像方式变换warpAffine 仿射变换函数:矩阵M(2*3)getRotationMatrix2D 获取图像旋转矩阵M:矩阵M&#xff…