当前位置:   article > 正文

自然语言处理基础知识入门(五) ELMo模型详解

elmo模型

请添加图片描述

前言

https://arxiv.org/pdf/1802.05365v2 原始论文链接

在之前的章节中,深入讨论了 Word2vec 模型对自然语言处理领域的深远影响。以及讲解了大名鼎鼎的变形金刚Transformer对多模态技术发展的影响,虽然按照逻辑顺序,接下来的章节应该是学习 Bert 模型,但是为了在学习Bert过程中能够与 ELMo 进行深入对比并且保持学习过程中的连贯性,本章节将先行讲解 ELMo 模型。

ELMo 模型与传统的 Word2vec 模型之间的一个关键区别是其有能力在于解决多义词问题。Word2vec 模型在训练完成后,简单的索引操作就足以获得单词的嵌入表示;然而,在真实语境中,同一个词在不同的上下文中可能代表完全不同的概念。这种静态的词嵌入处理方式并不能真正贴合人类对词义随上下文变换的直观理解。因此,ELMo 的诞生正是为了弥补这一不足,它通过分析单词的上下文信息来适当调整该词的嵌入表示,使得模型能够更加精准地捕捉词义的动态变化。

一、ELMo

按照惯例,首先对ELMo模型给出一个简单直白的定义,那么可以说:

ELMo实质上是由多层双向LSTM(Long Short-Term Memory,长短期记忆网络)构成的模型。

这种定义虽然简洁,但背后蕴含的原理和应用是极其丰富的。

1.1 为什么选择LSTM作为模型架构?

在先前的讨论中,涉及了循环神经网络(RNN)的概念,它是一种用于处理序列数据的神经网络架构。相对而言RNN比LSTM(RNN的变种)好理解本节都是使用RNN进行举例子。RNN的核心特点之一是在生成当前时间步的输出时,模型会考虑当前的输入以及上一时间步的输出。这种设计非常贴近于人类对语言的理解和处理方式,即人类在理解或生成语言时,往往会依赖于前文的信息。

举一个简单的例子来说明这一点:

假设有一句话:“我昨天去了图书馆,因为我想借一本书。”

当我们阅读或听到这句话的前半部分“我昨天去了图书馆,因为我想借”时,我们的大脑会自然地根据已有的上下文信息,预测下一步可能会出现的内容。在这个例子中,紧随“我想借”之后的可能是“书”、“碟片”、“笔记本电脑”等物品。而在实际上文中,“一本书”是最符合上下文的选项。

RNN正是通过类似的机制来处理语言的,模型在每个时间步都会接受两个输入:一个是当前时间步的输入(比如一个单词或字符),另一个是上一个时间步的隐藏状态(捕获了之前所有时间步的信息)。由此,RNN能够在生成文本、音频处理或者时间序列预测等任务中,累积地利用历史信息,从而做出更加准确的预测。设计的初衷就是希望模型输出的词嵌入表示能够因为上文的改变而发生变化,故此选择RNN作为模型的基本结构。

1.2 为什么选择BiLSTM?

然而在实际的过程中,单向的RNN生成信息只能考虑模型的上文内容,在翻译任务中就已经暴露了诸多缺点,并不能够很好的发挥作用。具体的可以参考本专栏中对RNN的讲解

考虑使用一个简单的循环神经网络(RNN)模型来应对一个典型的语言模型应用场景:预测句子中下一单词的任务。

设想现在有一句话:“天气预报说今天___,所以我带了雨伞出门。”模型的目标是填充这个空缺,预测正确的下一单词。为此,RNN会将“天气预报说今天”这一部分作为一系列的输入,逐个单词地进行处理。在这个过程中,RNN利用其内部的“记忆”功能,累积之前的单词信息,来帮助它作出预测。

考虑到“天气预报说今天”后面通常会紧跟天气情况,模型可能会预测“晴”或“雨”等与天气相关的单词。这时候模型能力有限,如果是可以让模型在考虑当前词时候能够看到后面的词就可以,根据“所以我带了雨伞出门”这一后文信息,可以推断出,句子中的空缺应该填上“雨”。

为了更精确地解决这类问题,可以构建一个双向RNN(BiRNN)模型。通过同时考虑单词前后的上下文信息,双向RNN能够提供更为丰富而准确的预测结果,从而更好地适应语言模型的需求。
在这里插入图片描述
上文中举例子一致采用RNN,图中展示了双向RNN的概念模型,但在实际应用中,为了捕获和处理更复杂的依赖关系,通常会结合使用更先进的循环单元,如LSTM或GRU,它们能更有效地处理长期依赖问题。此外,可以通过堆叠多个这样的RNN层来构建多层双向RNN,从而进一步提高模型的性能。

BiLSTM,或者双向长短期记忆网络(Bi-directional Long Short-Term Memory Network),它实际上由两个LSTM网络组成,分别用于处理数据的正向(正时序)和反向(逆时序)序列。这两个LSTM网络完全独立,它们各自从输入序列的两个方向学习信息, 然后将这些信息进行某种形式的合并或融合,以得到更全面的序列表示。


BiLSTM的工作原理如下:

  1. 正向LSTM:它按照正常的顺序(从第一个元素到最后一个元素)处理序列数据。这个过程中,正向LSTM会逐渐累积历史信息,即从序列开始到当前时间点的所有信息。

  2. 反向LSTM:它按照相反的顺序(从序列中的最后一个元素到第一个元素)处理同一序列数据。这种做法允许反向LSTM捕获从序列末尾开始直到当前时间点的未来信息。

  3. 信息合并:一旦正向和反向LSTM各自处理完整个序列,我们会有两组输出,分别代表了考虑了过去(正向)和未来(反向)信息的序列表示。这两组输出接下来需要通过某种方式结合起来,形成一个统一的输出。常见的合并方法包括但不限于连接(concatenation)、求和(summing)、平均(averaging)等。

这种结构使得BiLSTM非常适合处理需要考虑上下文信息的任务,如文本序列中的词性标注、命名实体识别、情感分析等,因为在很多情况下,一个词的含义不仅受到其前面词的影响,同时也受到后面词的影响。简而言之,BiLSTM通过并行地从两个方向学习序列信息,能够更加全面地捕捉上下文信息,从而提高模型在处理序列数据时的性能和准确性。


再次强调理解ELMo模型要明确是深层双向LSTM,不同方向的LSTM都是独立的,模型运行中见不交换数据,不共享参数。

二、ELMo: Embeddings from Language Models

ELMo和Word2vec最大的不同就是Word2vec生成的词嵌入是静态的,不会随着上下文或者任务的改变而改变,ELMo是动态的可以按照任务的需求动态的调整。

那么这个能力是如何做到的呢?

具体而言,ELMo模型首先会使用一个双向的长短期记忆网络(bi-directional Long Short-Term Memory network, biLSTM)。
(预训练) 部分 ,来分别处理文本中的前向和后向上下文。每个时间步(即每个词汇位置)biLSTM都会输出一个隐藏状态向量,这些向量编码了词汇上下文信息。
(对任务需要的参数调整) 随后,ELMo将这些不同层次的双向上下文表示合并,得到一个综合表征。每个词的最终嵌入向量是这些叠加隐藏状态的加权和,通过学习这些权重,ELMo可以为不同的下游任务动态调节词义表示 。这样的设计使得ELMo能够根据不同的语言环境和任务需求,灵活调整词汇的嵌入表示,显著提升了模型在多种自然语言处理任务上的表现。

2.1 预训练BiLM阶段:

可以看到ELMo: Embeddings from Language Models的全称,本质上就是语言模型,实际上就是概率预测。哪种概率出现最大,即这个句子最合理,因此语言模型追求的就是一个句子的概率最大化:
对上文这句话不理解的读者可以参考当前专栏下N-gram那篇文章

前向计算的概率公式:

p ( t 1 , t 2 , … , t N ) = ∏ k = 1 N p ( t k ∣ t 1 , t 2 , … , t k − 1 ) p(t_1, t_2, \ldots, t_N) = \prod_{k=1}^{N} p(t_k | t_1, t_2, \ldots, t_{k-1}) p(t1,t2,,tN)=k=1Np(tkt1,t2,,tk1)

  • 其中, t 1 , t 2 , … , t N t_1, t_2, \ldots, t_N t1,t2,,tN表示单词序列。
  • p ( t k ∣ t 1 , t 2 , … , t k − 1 ) p(t_k | t_1, t_2, \ldots, t_{k-1}) p(tkt1,t2,,tk1)表示在前 k − 1 k-1 k1个单词都已经出现的前提下,第 k k k个单词 t k t_k tk出现的条件概率。
  • 通过从 k = 1 k=1 k=1 N N N的累乘可以得到整个序列的联合概率。

而 ELMo模型使用了两个LSTM模型去预测结果,因此预测一个单词需要前后两个概率。

前向语言模型(forward LM)预测下一个单词的条件概率不同,后向语言模型从句子的末尾开始,向前预测每个单词,基于其之后的单词(或称未来上下文)来预测当前单词。这可以通过以下公式表达:

p ( t 1 , t 2 , … , t N ) = ∏ k = 1 N p ( t k ∣ t k + 1 , t k + 2 , … , t N ) p(t_1, t_2, \ldots, t_N) = \prod_{k=1}^{N} p(t_k | t_{k+1}, t_{k+2}, \ldots, t_N) p(t1,t2,,tN)=k=1Np(tktk+1,tk+2,,tN)

这里:

  • p ( t 1 , t 2 , … , t N ) p(t_1, t_2, \ldots, t_N) p(t1,t2,,tN)表示整个单词序列出现的概率。
  • p ( t k ∣ t k + 1 , t k + 2 , … , t N ) p(t_k | t_{k+1}, t_{k+2}, \ldots, t_N) p(tktk+1,tk+2,,tN) 表示在未来上下文 t k + 1 , t k + 2 , … , t N t_{k+1}, t_{k+2}, \ldots, t_N tk+1,tk+2,,tN已知的情况下,预测当前单词 t k t_k tk 出现的条件概率。

这样预测一个单词生成的概率就是在同时考虑正向模型和方向模型生成的概率,从而优化目标就变成下述公式:

∑ k = 1 N ( log ⁡ p ( t k ∣ t 1 , … , t k − 1 ; Θ x , Θ L S T M → , Θ s ) + log ⁡ p ( t k ∣ t k + 1 , … , t N ; Θ x , Θ L S T M ← , Θ s ) ) \sum_{k=1}^{N} \left( \log p(t_k | t_1, \ldots, t_{k-1}; \Theta_x, \overrightarrow{\Theta_{LSTM}}, \Theta_s) + \log p(t_k | t_{k+1}, \ldots, t_N; \Theta_x, \overleftarrow{\Theta_{LSTM}}, \Theta_s) \right) k=1N(logp(tkt1,,tk1;Θx,ΘLSTM ,Θs)+logp(tktk+1,,tN;Θx,ΘLSTM ,Θs))

可以看出模型的目标函数是两个模型生成概率的乘法,通过log改写成加法。这表明ELMo使用的BiLSTM对于目标的预测是独立的。而训练模型的最终目标是就是上述公式结果最大化。通过公式可以看到两个方向的LSTM具备相同的部分就是 Θ x \Theta_{x} Θx Θ s \Theta_{s} Θs 这部分共享的。

  • Θ x \Theta_{x} Θx则是嵌入表示参数,类似于word2vec模型中的参数用于对输入单词向量化
  • Θ s \Theta_{s} Θs则是模型最终预测阶段softmax层的参数
  • Θ L S T M → \overrightarrow{\Theta_{LSTM}} ΘLSTM 则是前向模型参数
  • Θ L S T M ← \overleftarrow{\Theta_{LSTM}} ΘLSTM 则是后向模型参数

前后向中 Θ x \Theta_{x} Θx Θ s \Theta_{s} Θs 这两部分是共享的参数。整个句子在模型的初始阶段都会经过一个带有 Θ x \Theta_{x} Θx 参数的模块,用以生成词汇的向量表示。这些向量表示矩阵随后被分成两个部分:前一部分送入前向LSTM处理,后一部分送入反向LSTM处理。通过这种方式,模型能够利用正向和反向的上下文信息来预测当前词汇的最终结果。预测的每一部分最后都会汇集进相同的softmax层,进行最后的概率输出。

通过一个具体的例子来理解ELMo的双向语言模型(BiLM)是如何预训练的。

假设我们有一个非常简单的英文句子:“The cat sat on the mat.” 我们希望通过这个句子来训练我们的双向语言模型。:

  • 前向LSTM:从左到右开始处理句子。“The”之后是"cat",“cat"之后是"sat”,以此类推。
  • 后向LSTM:从右到左处理句子。“mat"之前是"the”,“the"之前是"on”,再往前是"sat",依此类推。

目标函数:

  • 对于前向LSTM,预测每个词的目标是其右边的词;反之,对于后向LSTM,预测的目标是其左边的词。

例如,对于词“cat”:

  • 前向LSTM的训练目标是预测“sat”,它是“cat”的后一个词。
  • 后向LSTM的训练目标是预测“The”,它是“cat”的前一个词。

训练过程:

  • 给定句子,前向LSTM和后向LSTM独立预测句子中每一个词的下一个和上一个词。
  • 通过计算预测的准确性,更新LSTM网络中的权重,提升预测能力。

训练完成后,通过目标函数使得两部分的结果最大化,不仅得到了作为下游任务输入的词向量,而且这些词向量融入了词汇所在上下文的信息,为更复杂任务的模型微调打下了良好的基础。通过在不同任务中的微调,ELMo生成的词嵌入能够有效捕捉词汇在不同语境下的含义,提升最终模型在特定任务上的表现。

2.2 微调阶段:

在训练好了这样的模型后能够用来做什么呢?ELMo模型如何使用训练好的BiLM模型呢?

简单的说就是对这个BiLM的中间层输出加权求和作为每一个词的向量表示

具体点就是ELMo模型的最终输出是基于双向语言模型(biLM)的中间层表示的一个特定任务的加权组合。它并不仅仅使用双向LSTM的隐藏状态的和作为模型的最终表示。相反,对于每个词汇,在ELMo中,来自不同层次的表示(包括原始词嵌入以及所有LSTM层的前向和反向表示)会被组合起来,通过学习到的权重进行加权求和,以产生该词汇的最终上下文化表示。具体的这个加权求和的比例可以按照后续的任务不同自行训练学习。
是不是有点bert的影子了,上一步是预训练下面的是按任务需求调整参数,当然这个是前辈模型

论文中指出模型最终对每个词生成的嵌入表示是由于多层构成。故此ELMo 是双向语言模型(biLM)中间层表示的特定任务组合。对于每个单词,一个 L L L 层的 biLM 计算一组 2 L + 1 2L + 1 2L+1 个表示:

请添加图片描述
一个 L L L 层的双向语言模型(biLM)会为每个单词计算出一组共 2 L + 1 2L + 1 2L+1 个表示:因为单侧(单向)深度为 L L L 的 LSTM 模型会生成 L L L 个中间层的表示,由于双向语言模型(BiLM)同时使用了两个这样的 LSTM 模型(一个处理正向序列,另一个处理反向序列),因此会有 2 L 2L 2L 个这样的表示。再加上每个词的初始表示 x x x,总共就是 2 L + 1 2L + 1 2L+1 个表示。这些表示最终会通过一定的方式融合,以生成每个词的最终表示。

上图中公式第二行则使用了 h k , 0 L M h^{LM}_{k,0} hk,0LM 来表示第一层的,即模型的输入的嵌入表示 x k L M x^{LM}_k xkLM 因此简化成第二行公式。

下图是单层RNN和多层RNN的详解结构:
在这里插入图片描述
可以看到多层RNN中每一个输入单词会生成两个嵌入表示,中间层有两个,这是在单向RNN的情况下,双向RNN结构如下图:
在这里插入图片描述

可以看到上图中分别由正反的两个RNN构成,这里再次强调在与训练BiLM两个RNN是独立的,成图中虚线部分是BiLM的一层,每一个单词的嵌入表示都是由正反,两部分构成。下图是以 ‘退了’ 举例子:

在这里插入图片描述

每个单词的嵌入表示将由这两个方向的RNN输出合并而成。这种结构让模型能够同时考虑到单词的前文和后文信息,从而获取更加丰富的语义表示。然后,模型会分别处理单词在正向和反向循环网络中的特征,然后通过拼接(或加法)操作将这两部分特征合并。之后,模型可以实现多层聚合,对不同中间层产生的单词嵌入表示进行加权,进一步丰富了模型的表达能力。

接下来看下论文中对当前部分的公式表述:

在这里插入图片描述
上文中已经解释了 h k , j L M h^{LM}_{k,j} hk,jLM 是单词 k k k 通过正反向模型计算得到的嵌入表示。这里的 j j j 是用来指示特定的层级,每个单词 k k k 在每层 j j j 的嵌入表示都被捕获在一个嵌入矩阵中。该嵌入矩阵中,每一行对应着同一单词不同的向量表示。权重向量 s s s 的每一个元素则被用来表示不同层(行)的向量表示对于最终生成当前单词的嵌入表示的重要性,即通过 s s s 来进行加权求和,得到最终的单词嵌入表示。

这里有些熟悉,有点类似Transformer的自注意力机制,按行操作,只不过生成的方式略微简单,只需要将相同单词不同层的嵌入进行拼接,和可学习的权重矩阵 W W W 进行乘积就能得到这个权重向量 s s s 。实际上在上文中讲解Transformer的时候提到自注意力机制是向量级别的特征融合,所以考虑到还需要元素级别的嵌入表示,故此采用了一个前馈层,在ELMo中这个 s s s的目的是相同单词不同层聚合就是向量级别的,为了实现元素级别的控制需要一个参数 γ \gamma γ,具体这里存在迷惑可以结合上一章节的内容思考下这里的含义。

在实现了 s h sh sh 进行乘积操作的时候会得到多个单词最终的表示,这个时候会生成一个矩阵。矩阵的每一行就是一个单词向量表示,而 γ \gamma γ向量进行乘积就是对不同的元素内容按照任务的需求进行缩放。故此实现了元素级别的信息处理,也有博文将这和BN进行类别,本文不做这部分赘述。

三、论文细节

ELMo的一个关键特性是它提取并结合了从模型的所有层的表示信息,而不是仅仅使用顶层或底层。这意味着,每个单词的最终嵌入表示是其在网络中各层表示的加权组合。

不同层的表示捕获了不同类型的信息:

  • 底层通常捕获与语法相关的特征,比如词性标签。
  • 中间层可能更侧重于词汇之间的语义关系,比如同义词或反义词。
  • 顶层则更可能捕获与整个句子的上下文相关的信息,反映更复杂的语义特征,如句子的情感倾向或主题。

由于这些层表示的不同特性,ELMo通过结合这些信息,能够生成非常丰富和灵活的词嵌入表示,适用于多种不同的下游NLP任务。
在这里插入图片描述

论文中大篇幅的讲解了针对不同任务进行训练模型调整参数,有兴趣的读者可以读原文理解这些任务的作用。

在这里插入图片描述
文中使用两层的BILSTM,针对不同的下游任务,所使用的层数的权重是不同的,比如qa的任务则对初始特征更佳敏感,再次证明了根据任务不同优化模型的重要性。

四、总结

本章节通过对比分析,突出了微调(Finetune)过程在动态词嵌入模型中的重要性。ELMo模型并未采用Transformer架构,而是选择了LSTM作为其核心构件,从参数 s s s γ \gamma γ 的使用中我们依然可以感受到,模型在捕捉深层次语义信息方面确实受到了架构本身的一定限制。

在下一章节中,我们会聚焦于Bert模型——一个结构更为先进、性能更佳的NLP模型。Bert通过引入Transformer架构,它不仅可以更有效地捕捉全局上下文信息,避免了LSTM在长距离依赖上的局限,也在微调过程上表现出卓越的灵活性和效果。这标志着NLP模型发展的一个新阶段,为本专栏画上完美的句号。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/677291
推荐阅读
相关标签
  

闽ICP备14008679号