预训练语言模型实践笔记

Roberta

output_hidden_states=True和last_hidden_states和pooler_output

在使用像BERT或RoBERTa这样的transformer模型时,output_hidden_stateslast_hidden_state是两个不同的概念。

  1. output_hidden_states: 这是一个布尔值,决定了模型是否应该返回所有隐藏层的输出。如果设置为True,模型将返回一个元组,其中包含每一层的隐藏状态。这对于某些任务(如特征提取或fine-tuning)可能是有用的,因为不同的隐藏层可能会捕获不同类型的信息。

  2. last_hidden_state: 这是模型的最后一个隐藏层的输出,通常用作下游任务的输入(如文本分类或命名实体识别)。这是模型的主要输出,通常包含了输入序列的高级表示。

在大多数情况下,您只需要last_hidden_state。但是,如果您想要进行更深入的分析或实验,可以设置output_hidden_states=True以获取所有隐藏层的输出。

在您的代码中,您已经正确地获取了最后一层的[CLS]嵌入。这是通过以下代码行完成的:

result = out.last_hidden_state[:, 0]

这行代码从最后一个隐藏状态(即最后一层的输出)中获取了每个序列的第一个标记(即[CLS]标记)的嵌入。

另一种方法是在模型配置中设置output_hidden_states=True,然后从输出的隐藏状态列表中获取最后一层的[CLS]嵌入。这将返回一个包含每一层隐藏状态的列表,您可以从中选择最后一层的[CLS]嵌入。

以下是如何实现的示例:

from transformers import BertModel, BertTokenizer, BertConfig

# Load pre-trained model tokenizer (vocabulary)
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

# Tokenize input
text = "[CLS] Who was Jim Henson ? [SEP] Jim Henson was a puppeteer [SEP]"
tokenized_text = tokenizer.tokenize(text)

# Convert token to vocabulary indices
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)

# Convert inputs to PyTorch tensors
tokens_tensor = torch.tensor([indexed_tokens])

# Load pre-trained model (weights)
config = BertConfig.from_pretrained('bert-base-uncased', output_hidden_states=True)
model = BertModel.from_pretrained('bert-base-uncased', config=config)

# Set the model in evaluation mode to deactivate the DropOut modules
model.eval()

# Predict hidden states features for each layer
with torch.no_grad():
    outputs = model(tokens_tensor)

# `outputs` is a tuple, we are interested in the third element which is all hidden states
all_hidden_states = outputs[2]

# Get the last layer's [CLS] embedding
cls_embedding = all_hidden_states[-1][0, 0]

在这个例子中,cls_embedding是一个形状为[hidden_size]的张量,包含了最后一层的[CLS]嵌入。

pooler_output

pooler_output 是一个变量,通常在自然语言处理(NLP)中,它是指经过池化(Pooling)操作后的输出。

在使用预训练的 Transformer 模型(如 BERT、RoBERTa 等)进行特征提取时,模型的每一层都会输出一个隐藏状态(Hidden State)张量,这个张量通常是 3D 的,其形状为 [batch_size, sequence_length, hidden_size]

然而,为了进行下游任务(如分类、序列标注等),我们通常需要将这个 3D 张量转换为 2D 张量。这就需要进行池化操作。最常见的池化操作是取每个序列的第一个隐藏状态(对应于 CLS 标记),或者对所有隐藏状态进行平均或最大化。这个池化后的输出就是 pooler_output

在 BERT 和 RoBERTa 等模型中,pooler_output 通常是取自每个序列的第一个隐藏状态,然后经过一个线性层和一个 Tanh 激活函数。其形状为 [batch_size, hidden_size],可以直接用于下游任务。

last_hidden_state 通常是一个三维张量,其形状为 [batch_size, sequence_length, hidden_size]

当我们执行 last_hidden_state[:, 0] 时(等价于last_hidden_state[:, 0,:],我们实际上是在获取每个批次中第一个序列的所有隐藏状态。这将返回一个二维张量,其形状为 [batch_size, hidden_size]

这个操作通常在 Transformer 模型(如 BERT、RoBERTa 等)中使用,其中每个序列的第一个隐藏状态(对应于特殊的 CLS 标记)被用作整个序列的代表,用于下游任务(如文本分类、情感分析等)。

last_hidden_state[:, 0, :] 和 last_hidden_state[:, 0]等价

是的,last_hidden_state[:, 0, :]last_hidden_state[:, 0] 在这个上下文中是等价的。

在 Python 和 PyTorch 中,如果你在切片操作中省略了某个维度,那么将会选取该维度的所有数据。因此,last_hidden_state[:, 0] 实际上等价于 last_hidden_state[:, 0, :]

这两个表达式都是选取了 last_hidden_state 张量中每个批次的第一个序列的所有隐藏状态,返回的是一个二维张量,其形状为 [batch_size, hidden_size]

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值