语义匹配(二)搜狐文本匹配大赛BaseLine比较:P-tuning和Conditional_LN实现多任务文本匹配

  • 比赛简介
    • 数据样例
    • 任务解读
  • 即插即用的多任务模块
    • P-tuning
      • P-tuning多任务分类实现
    • Conditional Layer Normalization
      • Conditional Layer Normalization多任务分类实现
  • 实验结果
  • 总结
    • 参考资料:
    • 代码开源

比赛简介

  1. 关键词:文本匹配、多任务匹配
  2. 与我们接触的文本语意匹配任务相似:给定两个句子,判断两个句子语义是否相似。
  3. 本次比赛在原本的语义匹配的基础上将语义是否相似分成了【主题】一致判断、【事件】一致判断,并针对这两种判断标准给出了短文-短文、短文-长文、长文-长文匹配三种类型的语料。

数据样例

{"source": "英国伦敦,20/21赛季英超第20轮,托特纳姆热刺VS利物浦。热刺本赛季18轮联赛是9胜6平3负,目前积33分排名联赛第5位。利物浦本赛季19轮联赛是9胜7平3负,目前积34分排名联赛第4位。从目前的走势来看,本场比赛从热刺的角度来讲,是非常被动的。最终,本场比赛的比分为托特纳姆热刺1-3利","target": " 北京时间1月29日凌晨4时,英超联赛第20轮迎来一场强强对话,热刺坐镇主场迎战利物浦。  热刺vs利物浦,比赛看点如下: 第一:热刺能否成功复仇?双方首回合,热刺客场1-2被利物浦绝杀,赛后穆里尼奥称最好的球队输了,本轮热刺主场迎战利物浦,借着红军5轮不胜的低迷状态,能否成功复仇? 第二:利物浦近","labelA": "1"
}
{"source": "英国伦敦,20/21赛季英超第20轮,托特纳姆热刺VS利物浦。热刺本赛季18轮联赛是9胜6平3负,目前积33分排名联赛第5位。利物浦本赛季19轮联赛是9胜7平3负,目前积34分排名联赛第4位。从目前的走势来看,本场比赛从热刺的角度来讲,是非常被动的。最终,本场比赛的比分为托特纳姆热刺1-3利","target": " 北京时间1月29日凌晨4时,英超联赛第20轮迎来一场强强对话,热刺坐镇主场迎战利物浦。  热刺vs利物浦,比赛看点如下: 第一:热刺能否成功复仇?双方首回合,热刺客场1-2被利物浦绝杀,赛后穆里尼奥称最好的球队输了,本轮热刺主场迎战利物浦,借着红军5轮不胜的低迷状态,能否成功复仇? 第二:利物浦近","labelB": "0"
}

任务解读

  1. 如苏神在其博客中理解:一般来说,完成这个任务至少需要两个模型,毕竟A、B两种类型的分类标准是不一样的,如果要做得更精细的话,应该还要做成6个模型。但问题是,如果独立地训练6个模型,那么往往比较费力,而且不同任务之间不能相互借鉴来提升效果,所以很自然地我们应该能想到共享一部分参数变成一个多任务学习问题。
  2. 如果通过构建一个模型来提取文本语义,并将不同判断条件甚至是不同长度匹配作为额外的信息加入到模型中去来控制模型的判断标准。

即插即用的多任务模块

  1. 本文意在探索目前比较流行的基于P-tuning的任务提示模块,和苏神在其博客中介绍的Conditional Layer Normalization,探究这两个模块在文本多任务分类中的指挥作用,并进行比较。
  2. WHY P-tuning/Conditional LN: 作为两个可在任何语言模型中即插即用的辅助模块,P-tuning 和 Conditional LN可以让我们快速实现指挥模型并且可以完整利用预训练模型权重,只需要经过简单的微调即可。(这让我想到了关于可控文本生成中PPLM的图,我们的两个模块就像大象头上的那只老鼠,牵引着模型向我们期望的方向前进)

P-tuning

相关论文链接:GPT Understands, Too

  1. P-tuning,原本用于解决 传统的人工提示(prompt) 来控制GPT的生成文本,无法随着模型训练进行独立优化,而且依赖大量的人工设计和尝试。P-tuning将传统的人工提示Token替换为可训练的独立的Embedding,使其可以随着模型训练进行优化。这相当于让模型在训练的过程中自动计算最优的Prompt,从而在提高生产效果的同时减少了人工的实验成本。
  2. 对于BERT等MLM模型,我们可以利用其预训练预测掩码的任务特性,同样达到一些zero-shot的效果。如下图,我们通过设置“下面是MM新闻”作为人工提示,让模型对文本生产文本的类别名称,从而实现文本分类。
  3. 我们同样可以使用P-tuning的方法,如下图我们设置了u1-u6六个提示token,来替换上述的人工提示token,并在微调时同时对这6个token进行更新,从而最大化maxpromptP(x分类∣prompt,text)max_{prompt}P(x_{分类}|prompt,text)maxpromptP(xprompt,text)

P-tuning多任务分类实现

  1. 根据不同的分类标准我们设置不同的prompt,目前开放的中文预训练模型bert-base,bert-wwm等都提供了多个 [unused][unused][unused] 的备用token,这类token在模型预训练时并未参与训练,利用这类token我们可以根据不同的分类标准构建不同的任务前缀token
{
"短短匹配A类": [1, 2, 3, 4, 9, 9],
"短短匹配B类": [5, 6, 7, 8, 9, 9],
"短长匹配A类": [1, 2, 3, 4, 9, 10],
"短长匹配B类": [5, 6, 7, 8, 9, 10],
"长长匹配A类": [1, 2, 3, 4, 10, 10],
"长长匹配B类": [5, 6, 7, 8, 10, 10]A类匹配标准:[1,2,3,4]
B类匹配标准:[5,6,7,8]
短文:[9]
长文:[10]
}
  1. chinese-bert-wwm-ext中token_id 1-99均为未使用的 [unused][unused][unused] token,在prompt并没有唯一标准,此处思路为:不同的评判标准之间的差异较大,且对于模型拟合来说重要性更强,因此各占4个token,而文本长度信息本身就包含在input_legth的padding中,因此仅使用简单的两个token。
  2. 剩余的与我们熟悉的句子对数据构建方法一致,模型的输入为prompt[cls]sentence1[sep]sentence2[sep]prompt [cls] sentence1 [sep] sentence2 [sep]prompt[cls]sentence1[sep]sentence2[sep],最后通过[CLS]接全连接来输出最后的得分,亦或是对所有token作avgpooling后接全连接。这两种方法的效果本质上没有太大差异,后者在操作时记得要mask掉[pad]token。
  3. P-tuning具有极高的便捷性,我们甚至不需要修改任何模型结构,只需要在输入侧增加相应的prompt即可。

Conditional Layer Normalization

  1. Conditional Layer Normalization这一方法我们比较熟悉,在我之前的三元信息抽取中提到了通过Conditional Layer Normalization将主体的hidden state经过两次线性变换与Layer Normalization的weight和bias相加,以此信息传递给下游去识别与改主体相关的客体,对该结构感兴趣的朋友可以通过基于Conditional Layer Normalization的条件文本生成了解更多细节。
  2. 在本文的任务中,我们需要使用Conditional Layer Normalization将多任务信息传递给模型即可,至于这个信息如何产生,我们只需要对每一种任务类型初始化一个embedding向量,随着模型训练一起更新即可。

Conditional Layer Normalization多任务分类实现

  1. 本人魔改了torch原生的Layer Normalization,并保存为一个新的类ConditionalLayerNorm,方便之后随时调用,具体代码如下,值得注意的是其中reset_parameters这一步比较关键,如果按torch的默认初始化方法初始化weight_dense和bias_dense,会让模型一开始的训练非常不稳定,我理解会是影响了预训练模型的参数结构。
import torch
import numbers
from torch.nn.parameter import Parameter
from torch.nn import Module
from torch.nn import init
from torch import nn
from torch import Tensor, Size
from typing import Union, List_shape_t = Union[int, List[int], Size]class ConditionalLayerNorm(Module):__constants__ = ['normalized_shape', 'eps', 'elementwise_affine']normalized_shape: _shape_teps: floatelementwise_affine: booldef __init__(self, normalized_shape: _shape_t, conditional_size: int ,eps: float = 1e-5) -> None:super(ConditionalLayerNorm, self).__init__()if isinstance(normalized_shape, numbers.Integral):normalized_shape = (normalized_shape,)self.normalized_shape = tuple(normalized_shape)self.eps = epsself.weight = Parameter(torch.Tensor(*normalized_shape))self.bias = Parameter(torch.Tensor(*normalized_shape))self.conditional_size = conditional_sizeself.weight_dense = nn.Linear(conditional_size,self.normalized_shape[0],bias=False)self.bias_dense = nn.Linear(conditional_size, self.normalized_shape[0],bias=False)self.reset_parameters()def reset_parameters(self) -> None:init.ones_(self.weight)init.zeros_(self.bias)init.zeros_(self.weight_dense.weight)init.zeros_(self.bias_dense.weight)def forward(self, input: Tensor,condition: Tensor) -> Tensor:'''condition.shape = (batch_size,conditional_size)'''condition = torch.unsqueeze(condition, 1)'''condition.shape = (batch_size,1,conditional_size)'''add_weight =  self.weight_dense(condition)add_bias = self.bias_dense(condition)'''condition经过两次线性变换进行对齐与Layer Normalization的weight和bias相加'''weight = self.weight + add_weightbias = self.bias + add_biasoutputs = inputmean = torch.mean(outputs, dim=-1, keepdim=True)outputs = outputs - meanvariance = torch.mean(torch.square(outputs), dim=-1, keepdim=True)std = torch.sqrt(variance + self.eps)outputs = outputs / stdoutputs = outputs * weightoutputs = outputs + biasreturn outputs
  1. 模型部分比较简单,当我们需要在Bert中使用Conditional Layer Normalization,我们只需要将原生的Layer Normalization的实例化替换为上述的ConditionalLayerNorm即可,在传入input时,我们额外设置一个输入Condition。
class NeuralNetwork(nn.Module):def __init__(self,model_path):super(NeuralNetwork, self).__init__()self.linear_relu_stack = nn.Sequential(nn.Linear(768, 512),nn.ReLU(),nn.Linear(512, 2))self.standerembed = nn.Embedding(6,128)'''六个子任务,初始化6个128纬的embedding向量'''self.bert = BertModel.from_pretrained(model_path,config=Config)def forward(self, input_ids, attention_mask,token_type_ids,c):'''将任务类别作为一个输入传入,获取对应的condition'''condition = self.standerembed(c)x1 = self.bert(input_ids, attention_mask=attention_mask,token_type_ids=token_type_ids,conditional=condition)x2 = x1.last_hidden_statelogits = self.linear_relu_stack(x2[:, 0])return logits

实验结果

方法 模型 线下F1 线上F1
P-tuning chinese-bert-wwm-extinput=512_{input=512}input=512 \ 0.7166
Conditional_LN chinese-bert-wwm-extinput=512_{input=512}input=512 0.7244 0.7261
Conditional_LN wobert-baseinput=512_{input=512}input=512 0.7353 0.7279
Conditional_LN nezha-base-wwminput=1024_{input=1024}input=1024 0.7367 0.7259

总结

  1. Conditional_LN和P-tuning作为两种接插即用的多任务挂件,方便我们在不改变模型结构的前提下对庞大的预训练模型进行快速微调,经过实验两者的收敛速度相差无几,对于本文提到的分类任务性能上Conditional_LN稍优于P-tuning,直觉上Conditional_LN影响了模型每一层的输出分布,相比P-tuning仅在输入环节加入信息来说,前者更容易拟合。
  2. 利用NEZHA相对位置编码增大输入的长度并不能给我们来带提升。
  3. P-tuning作为比较新的idea,不仅给GPT等生产模型的控制带来了方便,也给MLM模型提供了更多可能。
  4. 本次比赛目前的Top1分数为0.748,于作者实现的Conditional_LN差0.022,在这个baseline的基础上通过对数据进行进一步清洗,并进行K-fold + ensamble模型融合,能进一步提高分数。

参考资料:

  1. 苏剑林. (Apr. 16, 2021). 《搜狐文本匹配:基于条件LayerNorm的多任务baseline 》[Blog post]. Retrieved from https://kexue.fm/archives/8337
  2. 《GPT Understands, Too》https://arxiv.org/abs/2103.10385

代码开源

https://github.com/zhengyanzhao1997/NLP-model/tree/main/model/model/Torch_model/Souhu_TextMatch

语义匹配(二)搜狐文本匹配大赛BaseLine比较:P-tuning和Conditional_LN实现多任务语义匹配相关推荐

  1. 第三届搜狐校园算法大赛开赛!

    第三届搜狐校园算法大赛开赛! 2019年4月8日,第三届搜狐校园内容识别算法大赛正式开赛,同期面向参赛选手开放竞赛结果提交.搜狐携手清华计算机系共同发起本届大赛,面向全球范围内的全日制在校生,旨在通过 ...

  2. 近期活动盘点:第一届“数据故事计划”、 第三届搜狐校园算法大赛

    想知道近期有什么最新活动?大数点为你整理的近期活动信息在此: 第一届 "数据故事计划" "大数据故事计划"旨在收集各类有关大数据的故事,然后进行比赛及相关的宣传 ...

  3. 竞赛 | Aspect-based的情感分析任务第一名方法解读 -- 2022搜狐校园算法大赛

    每天给你送来NLP技术干货! 来自:ChallengeHub 知乎:https://zhuanlan.zhihu.com/p/533808475 之前没认真打过炼丹的比赛,这次机缘巧合碰上了三个牛逼又 ...

  4. 2022搜狐校园算法大赛正式开启

    算法江湖风云再起,AI人才并驱争先 大咖导师坐镇,海量真实数据 顶尖高手同台,挑战再度升级 快来展现超强算法,Carry全场C位出道 参赛对象:全日制在校大学生(本科.硕士.博士均可) 参赛形式:个人 ...

  5. 【比赛报告】biendata_2021搜狐校园文本匹配算法大赛_解决方案

    [比赛报告]biendata_2021搜狐校园文本匹配算法大赛_解决方案 前言 一.赛题 二.模型设计 三.训练技巧和提升方案 四.总结 代码开源 前言 比赛网页 之前写过相关的赛题解读,想了解的朋友 ...

  6. 报名 | 搜狐×清华:第三届内容识别算法大赛,比武招新两不误!

    2019年4月8日,第三届搜狐校园算法大赛正式开赛,同期面向参赛选手开放竞赛结果提交.本次比赛联合了清华大学等机构共同组织,面向全球范围内的全日制学生. [组织方]搜狐.清华大学 [奖金]¥75000 ...

  7. 读完这些论文和代码,你就能在搜狐算法大赛中获得好成绩了

    组织方:搜狐.清华大学 奖金:¥75000 初赛提交时间:2019年4月8日 – 2019年5月10日 2019 年 4 月 8 日,第三届搜狐校园算法大赛正式开赛,同期面向参赛选手开放竞赛结果提交. ...

  8. 2022搜狐校园 情感分析 × 推荐排序 算法大赛 baseline

    比赛链接:https://www.biendata.xyz/competition/sohu_2022/ 完整代码 可关注ChallengeHub 回复"搜狐"即可获取 赛题背景 ...

  9. 【数据挖掘实验】利用朴素贝叶斯方法对百万搜狐新闻文本数据进行分类

    一.概述 本实验做的是一个很常见的数据挖掘任务:新闻文本分类. 语料库来自于搜狗实验室2008年和2012年的搜狐新闻数据, 下载地址:https://www.sogou.com/labs/resou ...

最新文章

  1. 元宇宙,分三层!香港中文大学再现「校园元宇宙」原型
  2. Myeclipse 10 利用工具生成网络服务接口并调用
  3. java.net.SocketException: 断开的管道 (Write failed) 错误,数据库隔一段时间就断开的问题...
  4. 软件开发工程师证书有用吗_bim工程师证书有用吗 含金量怎么样?
  5. QT的QMessageAuthenticationCode类的使用
  6. 关于java.net.URLEncoder.encode编码问题
  7. 工作289:js取整
  8. java 获取xml 版本号_java读取xml文件字段值
  9. matlab之统计和机器学习工具箱
  10. 基于51单片机的直流电机正反转及控速+proteus仿真图
  11. tensorflow目标检测--识别赵丽颖
  12. html中不写form的后果,html之form
  13. 制作esp32-cam拍照上传,微信小程序照片显示的监控小车
  14. 一次服务端大面积接口响应时间骤增问题排查
  15. matlab网页视频流,使用Matlab读取视频流文件
  16. Ubuntu 18.04 vscode 编辑器空格显示过小问题解决方案
  17. IBM X系列服务器装机全过程,RAID磁盘阵列制作与安装ESXI
  18. 行人重识别AlignedReID:AlignedReID: Surpassing Human-Level Performance in Person Re-Identificat 重点亮点学习资料整理
  19. kali监听拦截局域网主机上网记录
  20. 售后支持领域的服务指标

热门文章

  1. JVM-运行时数据区
  2. data structure begin!!
  3. Python+MySQL学习笔记(一)
  4. Asp.net 2.0 发送邮件
  5. csv文件怎么转成excel_怎么把word转成excel
  6. 如何发表自己的第一篇SCI?
  7. printf以及可变参数函数讲解(转载)
  8. HFSS安装提示failed to check out license during initialization,怎么解决?
  9. 数据结构学习笔记(一):链表(linked list)
  10. java把二维转换为一维_在R语言中什么函数可以将二维数组转换成一维数组