当前位置: 首页 > news >正文

预训练语言模型实践笔记

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]

http://www.lryc.cn/news/404990.html

相关文章:

  • Perl 哈希
  • Linux之Mysql索引和优化
  • springboot业务逻辑写在controller层吗
  • Ubuntu 24.04 LTS 桌面安装MT4或MT5 (MetaTrader)教程
  • Go基础编程 - 12 -流程控制
  • 汽车信息安全--TLS,OpenSSL
  • 深入探索 SQL 中的 LIKE 右模糊匹配(LIKE RIGHT)与左模糊匹配(LIKE LEFT)
  • mybatis 多数据源 TDataSource required a single bean, but 2 were found
  • Dubbo SPI 之路由器
  • Python深度学习环境配置(Pytorch、CUDA、cuDNN),包括Anaconda搭配Pycharm的环境搭建以及基础使用教程(保姆级教程,适合小白、深度学习零基础入门)
  • 月影护眼大路灯怎么样?书客|月影|霍尼韦尔超硬核实力性能测评pk!
  • 邮件安全篇:邮件传输加密(SSL/TLS or STATRTTLS)
  • 【系统架构设计 每日一问】三 Redis支持事务么,Redis的事务如何保证
  • 【中项】系统集成项目管理工程师-第4章 信息系统架构-4.3应用架构
  • DasViewer打开Revit输出的fbx格式的模型,为啥一团黑?
  • 【05】LLaMA-Factory微调大模型——初尝微调模型
  • Training for Stable Diffusion
  • 初学51单片机之指针基础与串口通信应用
  • 【启明智显分享】甲醛检测仪HMI方案:ESP32-S3方案4.3寸触摸串口屏,RS485、WIFI/蓝牙可选
  • Linux 驱动学习笔记
  • ip地址设置了重启又改变了怎么回事
  • layui table 浮动操作内容收缩,展开
  • Ubuntu24.04 NFS 服务配置
  • vue3使用html2canvas
  • OpenCV分水岭算法watershed函数的使用
  • laravel为Model设置全局作用域
  • Leetcode之string
  • OS:处理机进程调度
  • 【车辆轨迹处理】python实现轨迹点的聚类(一)——DBSCAN算法
  • Apache Kylin