ELMo模型

ELMo(Embeddings from Language Models)是 2018 年由 AllenNLP 团队提出的上下文相关词向量模型,它在当时显著提升了多个自然语言处理任务的表现,为后来的 BERT 和 GPT 等预训练模型奠定了重要基础。

一、ELMo 是什么?

ELMo 是一种基于语言模型(Language Model)的词向量表示方式,它的最大特点是:

同一个词在不同语境中可以有不同的表示。

传统词向量(如 Word2Vec、GloVe)是静态的:

  • “bank” 无论出现在金融语境还是河岸语境中,其词向量都一样。

而 ELMo 是上下文相关的词向量:

  • “bank” 在句子 “He went to the bank to deposit money” 和 “The boat floated to the river bank” 中会有不同的表示。

二、ELMo 的模型结构

ELMo 架构基于双向语言模型(BiLM),即结合:

  1. 前向语言模型(从左到右)
    P(w_1, w_2, ..., w_n) = \prod_t P(w_t \mid w_1, ..., w_{t-1})

  2. 后向语言模型(从右到左)
    P(w_1, w_2, ..., w_n) = \prod_t P(w_t \mid w_{t+1}, ..., w_n)

模型核心组件:

  • 字符卷积层(CNN over char):输入的词是由字符组成,解决 OOV 问题;

  • 双向 LSTM:捕捉上下文语义;

  • 向量融合(task-specific combination):将不同层的 LSTM 输出进行加权求和,得到最终词向量。

三、ELMo 的词向量生成方式

ELMo 并不是单一的词向量,而是一个任务敏感的加权和:

\text{ELMo}_k = \gamma \sum_{j=0}^{L} s_j h_{k,j}

  • h_{k,j}:第 j 层的第 k个 token 的隐藏状态

  • s_j:softmax 得到的权重(可学习)

  • \gamma:整体缩放参数(可学习)

不同任务中,ELMo 会自动学习如何加权不同的层表示

四、ELMo 如何使用?

使用方式:作为词向量特征加入下游模型中,例如 BiLSTM + ELMo + Softmax。

在 NLP 任务中,一般流程如下:

输入文本 → 分词 → ELMo 向量(上下文相关) → 输入分类器或序列标注模型

官方提供了 Python 接口,可快速加载预训练模型。

五、ELMo 与传统词向量的对比

特性Word2Vec / GloVeELMo
向量类型静态上下文相关动态表示
上下文建模双向 LSTM 建模
OOV 问题严重基于字符,OOV 稀少
模型参数训练后固定可用于下游微调
效果(NER、QA等)较低提升数十个百分点

六、典型任务中的效果提升

ELMo 发布时在多个任务上提升显著:

任务提升值
NER(命名实体识别)+5.6
SRL(语义角色标注)+4.8
QA(问答)+4.2
文本蕴含(SNLI)+2.9

七、代码示例(使用 AllenNLP)

from allennlp.commands.elmo import ElmoEmbedder

elmo = ElmoEmbedder()

tokens = ["The", "cat", "sat", "on", "the", "mat"]
vectors = elmo.embed_sentence(tokens)

# vectors 是 shape: (3层, 句长, 1024)
# 可取平均或指定层向量作为词表示
import numpy as np
word_vecs = np.mean(vectors, axis=0)  # (句长, 1024)

八、ELMo 的局限与影响

局限:

  • 基于 BiLSTM,训练速度慢,扩展性不如 Transformer;

  • 不能预训练 Decoder,只是词表示工具;

  • 只能通过特征融合(Feature-based),不如 fine-tuning 灵活。

影响:

  • 为 BERT 开创了上下文相关词向量的潮流;

  • 首次将预训练语言模型与下游任务结合变得系统化;

  • 引发了 NLP 领域对“预训练 + 微调”范式的热潮。

九、总结

属性ELMo 模型解释
模型结构双向语言模型(BiLSTM + char-CNN)
表达方式每个词根据上下文获得不同的向量
应用方式作为词向量输入给下游模型(不可微调参数)
优势上下文感知、无 OOV、支持多层加权组合
不足模型较重,训练慢,不支持端到端 fine-tune

### ELMo模型概述 ELMo(Embeddings from Language Models)是一种用于自然语言处理的深度学习模型,其核心思想在于通过双向语言模型(BiLM)生成具有上下文感知能力的词嵌入表示[^3]。相比于传统的静态词嵌入(如Word2Vec或GloVe),ELMo能够根据具体的语境动态调整单词的表示形式。 #### 模型结构 宏观上看,ELMo由三个主要模块组成: 1. **Embedding模块**: 这一部分利用卷积神经网络(CNN)对字符级别的特征进行编码,从而得到静态的词嵌入向量作为后续网络的输入[^5]。 2. **双向LSTM(BiLSTM)模块**: 中间层包含两个堆叠的双向LSTM层,分别捕捉前向和后向的语言信息。这种设计使得ELMo能够在不同层次上捕获丰富的语法和语义特性[^2]。 3. **词向量表征模块**: 上层负责整合来自各层的信息,最终输出带有上下文依赖性的词嵌入表示[^5]。 #### 使用方式 目前存在多种途径来获取并使用预训练好的ELMo模型: - TensorFlow-Hub提供了便捷的方式加载Google官方维护的ELMo版本。例如,在TensorFlow环境中可以通过以下代码片段完成模型初始化: ```python import tensorflow_hub as hub elmo = hub.Module("https://tfhub.dev/google/elmo/2", trainable=True) embeddings = elmo(["A example sentence.", "Another one."], signature="default", as_dict=True)["elmo"] ``` - AllenNLP框架也支持两种实现方案——一种基于PyTorch,另一种则继续沿用原始的TensorFlow技术栈[^4]。开发者可以根据具体项目需求选择合适的工具链。 #### 应用场景 由于具备强大的泛化能力和灵活性,ELMo广泛应用于各类NLP任务之中,比如但不限于情感分析、命名实体识别以及机器翻译等领域。它不仅可以直接充当下游模型的一部分,还可以与其他先进架构相结合进一步提升性能表现。 ### 实现案例 下面给出一段简单的Python脚本演示如何借助TensorFlow Hub中的ELMo资源计算给定文本序列对应的词嵌入矩阵: ```python import tensorflow as tf import tensorflow_hub as hub def get_elmo_embeddings(sentences): with tf.Graph().as_default(): elmo_module = hub.Module("https://tfhub.dev/google/elmo/2", trainable=False) input_placeholder = tf.placeholder(tf.string, shape=(None,)) embedding_op = elmo_module(inputs=input_placeholder, signature='default', as_dict=True)['elmo'] init_op = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_op) result = sess.run(embedding_op, feed_dict={input_placeholder: sentences}) return result sentences_to_embed = ["This is a test sentence.", "Here's another."] embeddings_result = get_elmo_embeddings(sentences_to_embed) print(f'Shape of the resulting embeddings tensor: {embeddings_result.shape}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

00&00

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值