lstm 根据前文预测词_词嵌入:ELMo原理

ELMo是一种基于深度双向语言模型的词表示方法,能够捕捉词义的多样性和上下文依赖性,有效解决一词多义问题。该模型通过预训练获得高质量的词向量,进而应用于各种自然语言处理任务,如问答系统、情感分析等。

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

29af375e0a644ebaba0f7075631f4228.png

摘要

是基于上下文的词表示模型,能学习到复杂的词语特征和这些特征基于上下文的变化,我们使用一个双向语言模型在大型语料库上预训练,该模型的内部LSTM输出作为词表示。实验证明这些词表示可以很好的集成到现有NLP任务中并显著提升效果,任务包括问答,情感分析等。同样我们的分析表明揭示预训练模型的内部信息,可以方便下游任务利用不同半监督信息。

1 介绍

对很多自然语言模型而言,预训练词向量都是重要组成部分。但是学到高质量的词向量比较困难,理想的情况下,要学到词语的多样性特征(比如句法,语义),以及它们基于上下文语义的变化。本论文,我们将使用深度上下文词表示来解决这两个问题,并且可以轻松的集成到现有模型中,在大量有挑战性的语言理解任务上带来显著提升。

我们的词向量与传统词向量不同的点在于每个词的表示都是基于当前的整个句子。这些向量来自一个双向

的输出,所以我们把它称为
(Embeddings from Language Models)。 而和之前的基于上下文的词表示不同,我们的模型更深,基于多层双向
。对各个端任务使用每层
输出的线性组合向量比使用最后一层
输出的效果更好。按这种方式组织各个内部状态会带来非常丰富的词表示。我们发现
高层
能捕获基于
上下文的词特征,这能很好处理一词多义的情况,底层
能学到
句法层次信息,可以用来做词性标注任务。模型不同层的表示可以用来做不同特性的任务。实验上
在六个不同的语言任务上表现非常好,同样比2017年的
(使用机器翻译的encoder,也是基于上下文)也好很多。这两种模型都说明了深度的表示比只取
顶层要好。

2 相关研究

由于预训练词向量可以通过大量未标注的样本学习句法和语义信息,已经是

任务标配。传统词向量没有上下文信息,为了克服这一缺陷要么用子词(比如英文的字母)来强化特征信息,或者对不同词义学习不同词向量。我们也用到了子词训练
,但是在学习多义信息的时候不需要有标注训练。

还有一些近期的研究旨在学到上下文表示,有通过双向

编码中心词附近的上下文,也有的使用有监督机器翻译或者无监督语言模型,这些方式都得益于大型数据集。本论文中,我们使用三千万条句子训练双向语言模型。

之前的研究同样表明了深度双向RNN不同层编码不同类型的信息。我们的研究表明混合不同层的信息对下游任务非常有用。

3 ELMo: 基于语言模型的嵌入

与常用的词嵌入不同,ELMO的词表示基于整个句子,并且使用双向语言模型(包含两层结构和字母级卷积)。可以使用半监督方式预训练。

3.1 双向语言模型

假定一个序列有

个token,即
,对于前向语言模型(forword LM)我们基于
预测
如下所示:

最近的语言模型都是使用非上下文的词向量

作为词嵌入输入
层的 LSTMs,在每个位置
,每层LSTM输出基于上下文的表示
,其中
。最顶层的LSTM 输出
通过一层Softmax预测
的词。

向后语言模型(backword LM)与向前语言模型类似,除了计算的时候倒置输入序列,用后面的上下文预测前面的词:

实现方式和前向LM类似,每个后向LSTM层

层模型中基于
生成
表示

一个双向语言模型包含前向和后向语言模型,我们联合前向和后向的最大似然:

我们在前向和后向结合词表示

和Softmax 层
,同时保留LSTM各方向的参数独立。总的说来和Peters et al. (2017)类似,除了我们共享一些参数而非使用完全独立的参数。下一节,我们引入一种新的词表示,和前的工作不同,我们使用双向语言模型层的线性组合。

3.2 ELMo

ELMo基于任务来组合双向语言模型的中间层表示。对于各个词汇

,一个
层的双向语言模型计算一组
的表示

其中

是token层,对于每层 biLSTM 有

对于下游模型,ELMo将所有层的表示

合并为一个向量,
。最简单的场景是,ELMo只用最顶层,
,就像TagLM和CoVe一样,但是通常我们会
计算不同任务下biLM各层的权重

其中,

是softmax规范化的权重,常量参数
允许模型缩放整个
向量。
对于帮助优化非常重要(细节论文附加材料),考虑到各个biLM层分布不同,某些情况下对各个biLM层使用layer normalization会有帮助。

下面进一步解释ELMo原理:

论文地址:https://arxiv.org/pdf/1802.05365.pdf

代码实现:https://github.com/allenai/allennlp

基于以下几个问题展开:

1、ELMO的结构是怎么样的?

2、ELMO到底在解决一个什么问题?

3、ELMO是怎么进行预训练的呢?如何使用它呢?

4、为什么ELMO用两个单向的LSTM代替一个双向的LSTM呢?

1、ELMO的结构是怎么样的?

ELMO 由一层input层 和 两层双向LSTM 组合而成的

注:input层可看为embedding层,不过ELMO是通过字符卷积来得到embedding的,不是矩阵相乘;用两个单向LSTM替代一个双向LSTM。

如图:

f714d1d7560ccd4038363f1676623f8e.png
将对应字通过正向与反向语言模型得到的vector拼接

2、ELMO到底在解决一个什么问题?

ELMO解决了大部分问题,其中最重要的一个是:它解决了一词多义的问题。

拿word2vector来说,字与vector是一一对应的,输入句子,然后输出句子中每个字对应vector,可以看成查表的过程。

如:输入 画画 ,word2vector就会输出两个一样的vector,但是第一个画是动词、第二个画是名词,他们的vector应该是不一样的,但word2vector并不能区分。即使在训练过程中对embedding矩阵进行更新,它依旧还是一一对应的关系。

向ELMO输入 画画 ,输出的两个向量是经过2层LSTM后的结果,它们是不同的。这是ELMO根据输入句子的语境得到的结果。

3、ELMO什么怎么进行预训练的呢?如何使用它呢?

论文这么说到:

The top layer LSTM output, is used to predict the next token with a Softmax layer.

即,将ELMO输出的向量映射到 vocab_size的长度,softmax后,取出概率最大的元素对应的下标,作为对下一个字的预测。相当于做一个分类,类别数量是词表大小,类似自回归。

label相对于input错位一个字,如:

8508023802f87eefec2c274fa58a1e48.png
没有找到训练代码,大致是这样,知道的欢迎指正

使用:

ELMO有三层,每一层都有一个输出,将这三层的输出按比例相加后即为所得vector。这个比例是模型学习得到的。得到加权后的向量后,如何使用取决于任务的效果。

4、为什么ELMO用两个单向的LSTM代替一个双向的LSTM呢?

这是关键!!!

用双向的模型结构去训练语言模型会导致“看到自己”或“看到答案”的问题。后来的预训练语言模型也都在避免或解决这个问题,解决的程度也影响着模型效果。

以下是几个模型的解决方法:

ELMO:使用两个单向LSTM代替一个双向LSTM

GPT :通过mask得分矩阵避免当前字看到之后所要预测的字,所以GPT是只有正向的,缺失了反向信息

BERT:将所要预测的字用[MASK]字符代替,无论你是正向的还是反向的,你都不知道[MASK]这个字符原来的字是什么,只有结合[MASK]左右两边的词语信息来预测。这就达到了用双向模型训练的目的,但也引入了 预训练-微调 不一致的问题

XLnet:不用[MASK]字符,结合GPT和BERT的思想,即:用mask得分矩阵的方法来替代[MASK]这个字符

可以看出,如果不考虑训练数据大小的影响,谁更好的解决“如何将双向融入语言模型”这个问题,谁效果就更好。

现在来说一下为什么双向LSTM会导致看见答案的问题:

如图所示的正向LSTM,"克"是根据“扑”这个字 和 隐藏向量h2 来预测出来的。h2包含了<start>和打 这两个字的信息,所以预测“克”这个字时,是根据前面所有的字来预测的。

640863b7bb03301986703d58d09d3158.png

但如果加上反向LSTM呢?

ca288cc3a26d7be569a03f4c319a59da.png

反向的话,“克”就是根据 “扑”和 h1 来预测的,但是 h1 包含了“克”的信息,所以反向的话会导致模型看到答案。

这就是双向LSTM带来的“看见答案”的问题。

Transformer 可以看成双向结构,通过它,句子间任何两个字的距离都是1,所以它是如何通过 mask 操作避免它看到下文信息的呢?这其中的原理又是什么呢?

参考:chon zhang:Bert前传(2)-ELMo

南方的仔:火热的语言模型:从被遗忘的ELMO出发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值