You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何同时获取预训练RoBERTa的pooled_output与Splade风格嵌入?

同时获取RoBERTa的pooled_output与Masked LM Logits实现双嵌入方案

你不需要分别加载两个独立模型,通过复用基础RoBERTa模型并手动构建MLM预测头,就能一次前向传播同时拿到两种输出,既省资源又高效。

方案一:自定义双输出模型(推荐)

直接基于基础RoBERTa模型搭建带MLM头的自定义模型,同时输出pooled_output和MLM logits:

import tensorflow as tf
from transformers import TFAutoModel, AutoTokenizer

model_name = "roberta-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
base_model = TFAutoModel.from_pretrained(model_name)
config = base_model.config

# 实现RoBERTa的MLM预测头,与官方TFAutoModelForMaskedLM结构一致
class TFRobertaMLMHead(tf.keras.layers.Layer):
    def __init__(self, config):
        super().__init__()
        self.dense = tf.keras.layers.Dense(config.hidden_size, activation=config.hidden_act, name="dense")
        self.layer_norm = tf.keras.layers.LayerNormalization(epsilon=config.layer_norm_eps, name="layer_norm")
        self.decoder = tf.keras.layers.Dense(config.vocab_size, name="decoder")

    def call(self, features):
        x = self.dense(features)
        x = self.layer_norm(x)
        return self.decoder(x)

# 构建双输出模型
input_ids = tf.keras.layers.Input(shape=(None,), dtype=tf.int32, name="input_ids")
attention_mask = tf.keras.layers.Input(shape=(None,), dtype=tf.int32, name="attention_mask")

# 基础模型输出
base_outputs = base_model(input_ids, attention_mask=attention_mask)
pooled_output = base_outputs.pooler_output
sequence_output = base_outputs.last_hidden_state

# MLM头输出logits
mlm_head = TFRobertaMLMHead(config)
mlm_logits = mlm_head(sequence_output)

# 定义模型,同时返回两种结果
dual_model = tf.keras.Model(inputs=[input_ids, attention_mask], outputs=[pooled_output, mlm_logits])

使用示例

# 处理输入文本
text = "Your input text here"
inputs = tokenizer(text, return_tensors="tf", padding=True, truncation=True)

# 一次前向传播获取双输出
pooled_embedding, mlm_logits = dual_model(inputs)

# 常规嵌入:直接用pooled_embedding
print("Pooled Embedding Shape:", pooled_embedding.shape)

# Splade风格嵌入:对logits取绝对值后按token维度取最大值
splade_embedding = tf.reduce_max(tf.abs(mlm_logits), axis=1)
print("Splade Embedding Shape:", splade_embedding.shape)

方案二:复用预训练MLM模型(简单但稍低效)

如果你不想手动构建MLM头,也可以直接加载TFAutoModelForMaskedLM,然后从它的base_model属性获取基础模型的pooled_output:

from transformers import TFAutoModelForMaskedLM

mlm_model = TFAutoModelForMaskedLM.from_pretrained(model_name)
base_model = mlm_model.base_model

# 前向传播获取MLM logits
mlm_outputs = mlm_model(inputs)
mlm_logits = mlm_outputs.logits

# 前向传播获取pooled_output
base_outputs = base_model(inputs)
pooled_output = base_outputs.pooler_output

这种方式需要两次前向传播,资源消耗比方案一高,适合快速验证场景。

内容的提问来源于stack exchange,提问作者Want_to_be_unknown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:00:17