week8

目标:

在另外两个文本匹配数据集试验不同方法效果。

解读:

在已有 AFQMC 文本匹配实验基础上,保持模型、超参数和训练流程基本不变,将相同的 3 种方法迁移到 LCQMC 和 BQ Corpus 两个数据集上,比较不同文本匹配方法在不同数据分布下的效果。

本次实验的方法:

内容:

python 复制代码
pip install torch transformers scikit-learn pandas tqdm

1. BiEncoder
import torch
import torch.nn as nn
import torch.nn.functional as F

from transformers import AutoModel


class BiEncoder(nn.Module):

    def __init__(
        self,
        model_name="bert-base-chinese"
    ):
        super().__init__()

        self.bert = AutoModel.from_pretrained(
            model_name
        )

    def mean_pooling(
        self,
        hidden,
        attention_mask
    ):
        mask = attention_mask.unsqueeze(-1)

        hidden = hidden * mask

        return hidden.sum(dim=1) / mask.sum(
            dim=1
        ).clamp(min=1e-9)

    def encode(
        self,
        input_ids,
        attention_mask
    ):

        output = self.bert(
            input_ids=input_ids,
            attention_mask=attention_mask
        )

        embedding = self.mean_pooling(
            output.last_hidden_state,
            attention_mask
        )

        # L2 Normalization
        embedding = F.normalize(
            embedding,
            p=2,
            dim=1
        )

        return embedding

    def forward(
        self,
        input_ids_a,
        attention_mask_a,
        input_ids_b,
        attention_mask_b
    ):

        va = self.encode(
            input_ids_a,
            attention_mask_a
        )

        vb = self.encode(
            input_ids_b,
            attention_mask_b
        )

        return va, vb



2. CrossEncoder
import torch.nn as nn

from transformers import AutoModel


class CrossEncoder(nn.Module):

    def __init__(
        self,
        model_name="bert-base-chinese"
    ):
        super().__init__()

        self.bert = AutoModel.from_pretrained(
            model_name
        )

        hidden_size = (
            self.bert.config.hidden_size
        )

        self.dropout = nn.Dropout(0.1)

        self.classifier = nn.Linear(
            hidden_size,
            2
        )

    def forward(
        self,
        input_ids,
        attention_mask,
        token_type_ids=None
    ):

        output = self.bert(
            input_ids=input_ids,
            attention_mask=attention_mask,
            token_type_ids=token_type_ids
        )

        cls = output.last_hidden_state[:, 0]

        cls = self.dropout(cls)

        logits = self.classifier(cls)

        return logits
相关推荐
深度智能Ai1 小时前
IndexTTS 2.5 语音合成 API 接口使用文档
ai·语音合成·tts·在线语音合成
liulilittle2 小时前
多智能体编排的三个点
ai·llm·agent·tools·opencode
七夜zippoe3 小时前
第一季·阶段总结:Agent 核心技能栈检查清单与实战自测
网络·ai·agent·核心技能·实战自测
一 铭11 小时前
Pi实战 05:本地模型 · MCP · 安全沙箱篇
人工智能·ai·agent·harness
落魄实习生15 小时前
Agent Scope Java 2.x 系列【10】Middleware
java·开发语言·ai
通信瓦工16 小时前
利用浊度和电导率测量确定乙二醇基流体的质量
网络·数据库·ai
林伽一16 小时前
100 万输出词元与窄开放,前沿模型发布范式正在改写|2026年10月02日
人工智能·科技·安全·ai
bigdata-余建新16 小时前
week5
ai
孙启超18 小时前
【FDE开发指南】第 1 课:认识 FDE —— 从一次生产事故说起
人工智能·ai·职场技能