当前位置:   article > 正文

预训练语言模型实践笔记

预训练语言模型实践笔记

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]
  • 1

这行代码从最后一个隐藏状态(即最后一层的输出)中获取了每个序列的第一个标记(即[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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

在这个例子中,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]

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

闽ICP备14008679号