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
相关推荐
紧跟先前的步伐7 小时前
Go AI Agent 实战 12|HTTP 状态码、API 错误处理与日志
开发语言·人工智能·http·ai·golang
LMT流氓兔7 小时前
第五单元——第10课:用自动化测试验证工具逻辑
数据库·ai·oracle·langchain
gz927cool8 小时前
在 Harness 上搭建 Agent-Native 应用:可迁移经验
服务器·人工智能·ai·系统架构
感谢地心引力8 小时前
Gemini 4 Argon 使用 REA 分析 Rstudio,实现简体中文支持
ai·逆向·r·汉化·rstudio·rea
青藤云安全9 小时前
AI攻防备战报告(运营商篇)|攻击面 “3+1” 解析:通信关基面临的新型 AI 安全风险
人工智能·网络安全·ai
秋饼9 小时前
Spring AI + MCP 工具调用可靠性实战:参数校验、权限防线与人工确认生产级落地
java·ai·技术分享·后端开发
ebok.9 小时前
低代码平台如何集成 AI:从开发侧到运行侧的技术实践与京微智枢方案
人工智能·低代码·ai·rxjava