[论文阅读笔记62]KnowPrompt - Knowledge-aware Prompt-tuning with Synergistic Optimization for RE

46 篇文章 0 订阅

1. 题目

KnowPrompt: Knowledge-aware Prompt-tuning with Synergistic Optimization for Relation Extraction
the paper has been accepted by WWW2022.

Alibaba Group && Zhejiang University

2. 模型

2.1 摘要

把关系标签之间的知识整合到关系提取的prompt-tuning中,并提出了一种使用协同优化的Knowledge-aware Prompt-tuning方法(KnowPrompt)。

首先把关系的潜在知识注入到带有可学习的虚拟类型词回答词的prompt的构造中,然后,用结构化约束协同优化prompt的表示;最后,在5个数据集之上对于标准与low-resource的情况进行了实验,并开源了代码【2】。

2.2 问题及最近提出

​ fine-tuning的缺点: 需要进一步进行训练,还需要花费人工与大量时间去标注数据,给模型一般化操作带有麻烦。

​ 最近的prompt-tuning方法:[11, 18, 27, 43, 44] —采用预训练的模型直接作为预测器,通过完形填空的任务为pre-training与fine-tuning之间搭上桥梁。prompt-tuning将原始输入与提示模板融合来预测[MASK],然后将预测的标签词映射到相应的类集,对PLMs在few-shot任务上这种方法已经有很好的效果了。

例如(a),Prompt for Text Classification,文本分类典型,由一个模板(“<𝑆1> It is [MASK] ”)与一个标签词集(“great”, “terrible”etc.)。

总的来说,prompt-tuning包括了模板工程与语言表达工程,目标是去搜索最佳的模板与答案空间。[35] – 刘鹏飞的综述中提到的

在文本分类上有些成就,对于RE的问题:

​ 第一方面:确定模型要领域专家或者自动生成要额外的资源;

​ 第二方面:当关系标签变化时标签词的搜索计算高复杂度,经常是类别的指数;

例如(b)©, 如果一对实体包含“person”和“country”的语义,则关系“org:city_of_headquarters”对[MASK]的预测概率应该是低的;

加入关系知识(实体的类型)对于关系抽取是有帮助的 [4, 13, 33],注入知识是论文的研究重点—KnowPrompt

​ 通过可学习的虚拟回答词虚拟类型词来构建具有知识注入的提示词;可学习的虚拟类型词来根据上下文进行动态调整,而不是利用标注的实体类型.

image-20220211103303772

2.3 方法

image-20220212170135615

Entity Knowledge Injection

image-20220212170510789

表示围绕在sub与obj的虚拟类型词的嵌入表示。I(.)函数是去重操作,𝜙是先验分布, 在这里是通过词频来统计的。例如根据表可以计算𝜙**𝑠𝑢𝑏 = {“𝑜𝑟𝑔𝑎𝑛𝑖𝑧𝑎𝑡𝑖𝑜𝑛” : 3/6*,*“𝑝𝑒𝑟𝑠𝑜𝑛” : 3/6}。e表示预训练所给的向量嵌入。

这个意思就是说,先把各个sub的词向量找出来,然后就是把每个sub的权重计算出来,最后就是加权求和形成新的组合向量。即是对于某个sub或obj把多向量加权合并成一个向量

Relation Knowledge Injection

image-20220212171747389

e表示预训练所给的向量嵌入。 𝜙_r表示在候选词C_r上的分布(关系的词是打散的),即是C_r是关系打散的词。带帽的e表示词v_`的加权求和的向量。

未太明白??

image-20220211103444080

基于知识约束的协同优化—两个损失函数

Context-aware Prompt Calibration

image-20220214161250260

Implicit Structured Constraints

image-20220214164852093

$(𝑠_𝑖^′,𝑟, 𝑜_𝑖^′) $表示负样本。

两阶段优化:

step1:使用比较大的学习率𝑙𝑟1:

image-20220214165649104

step2:使用小的学习率lr1去学习[MAsk]:

image-20220214165907178

3. 实验

3.1 数据集

image-20220211104024437

3.2 实验设置

预测训练模型:RoBERT_large(除了DialogRE采用RoBERTa_base)

测试指标: micro 𝐹1 scores

Standard Setting:

​ 采用合部样本数据进行fine-tune.

​ Baseline – SpanBERT [30], KnowBERT [38], LUKE [52], and MTB [3]

Low-Resource Setting:

​ 主要参考:LM-BFF [15, 22]

3.3 标准结果

image-20220211104101458

3.4 低资源结果

image-20220211104153095

3.5 消融研究

image-20220211104226724

4. 代码研究

代码采用pyTorch Lightning来实现的, 另外还有可视化日志用到了wandb[https://wandb.ai/],这个需要注册一个账号. 跑了Re-Tacred数据,因为基于RoBERT_large显存不够用。只用了RoBERTa_base,每批size只设置为5条,如果如下:

image-20220211181730966

5. 相关技术

5.1 RE
5.2 Prompt-tuning

Prompt-tuning开始于GPT-3;

Hu et al. [28]:建议把外部知识加入了;

Ding et al. [12] :通过构建面向实体的表达器和模板,将快速学习应用于实体类型;

自动建建模板:

​ Gao et al. [15], Schick et al. [42]:首先提出自动生成回答与模板;

​ Shin et al. [46]:进一步提出梯度引导搜索自动生成词标注;

​ 提出continuous prompts:[21, 25, 34, 36]:利用可学习的连续嵌入作为prompt templates而不是标注词,可是这些方法不适应RE。????

对于RE,Han et al. [22] 提出PTR,使用逻辑规则使用子prompt去构建prompts.

5.3 相关定义

RE

Fine-tuning PLMs for RE

Prompt-Tuning of PLMs.

6. 参考

【1】论文: https://arxiv.org/pdf/2104.07650.pdf
【2】github: https://github.com/zjunlp/KnowPrompt

cumbersome adj. 笨重的;累赘的,难以携带的;缓慢复杂的,冗长的;麻烦的

fuse 英[fjuːz] 美[fjuːz]

vi. 熔化;融合

vt. 使融合;使融化;给…装信管

n. 保险丝;导火线;雷管;引信

[verbalizer](javascript:😉 在言语

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
"Structure-Aware Transformer for Graph Representation Learning"是一篇使用Transformer模型进行图表示学习的论文。这篇论文提出了一种名为SAT(Structure-Aware Transformer)的模型,它利用了图中节点之间的结构信息,以及节点自身的特征信息。SAT模型在多个图数据集上都取得了非常好的结果。 以下是SAT模型的dgl实现代码,代码中使用了Cora数据集进行示例: ``` import dgl import numpy as np import torch import torch.nn as nn import torch.nn.functional as F class GraphAttentionLayer(nn.Module): def __init__(self, in_dim, out_dim, num_heads): super(GraphAttentionLayer, self).__init__() self.num_heads = num_heads self.out_dim = out_dim self.W = nn.Linear(in_dim, out_dim*num_heads, bias=False) nn.init.xavier_uniform_(self.W.weight) self.a = nn.Parameter(torch.zeros(size=(2*out_dim, 1))) nn.init.xavier_uniform_(self.a.data) def forward(self, g, h): h = self.W(h).view(-1, self.num_heads, self.out_dim) # Compute attention scores with g.local_scope(): g.ndata['h'] = h g.apply_edges(fn.u_dot_v('h', 'h', 'e')) e = F.leaky_relu(g.edata.pop('e'), negative_slope=0.2) g.edata['a'] = torch.cat([e, e], dim=1) g.edata['a'] = torch.matmul(g.edata['a'], self.a).squeeze() g.edata['a'] = F.leaky_relu(g.edata['a'], negative_slope=0.2) g.apply_edges(fn.e_softmax('a', 'w')) # Compute output features g.ndata['h'] = h g.update_all(fn.u_mul_e('h', 'w', 'm'), fn.sum('m', 'h')) h = g.ndata['h'] return h.view(-1, self.num_heads*self.out_dim) class SATLayer(nn.Module): def __init__(self, in_dim, out_dim, num_heads): super(SATLayer, self).__init__() self.attention = GraphAttentionLayer(in_dim, out_dim, num_heads) self.dropout = nn.Dropout(0.5) self.norm = nn.LayerNorm(out_dim*num_heads) def forward(self, g, h): h = self.attention(g, h) h = self.norm(h) h = F.relu(h) h = self.dropout(h) return h class SAT(nn.Module): def __init__(self, in_dim, hidden_dim, out_dim, num_heads): super(SAT, self).__init__() self.layer1 = SATLayer(in_dim, hidden_dim, num_heads) self.layer2 = SATLayer(hidden_dim*num_heads, out_dim, 1) def forward(self, g, h): h = self.layer1(g, h) h = self.layer2(g, h) return h.mean(0) # Load Cora dataset from dgl.data import citation_graph as citegrh data = citegrh.load_cora() g = data.graph features = torch.FloatTensor(data.features) labels = torch.LongTensor(data.labels) train_mask = torch.BoolTensor(data.train_mask) val_mask = torch.BoolTensor(data.val_mask) test_mask = torch.BoolTensor(data.test_mask) # Add self loop g = dgl.remove_self_loop(g) g = dgl.add_self_loop(g) # Define model and optimizer model = SAT(features.shape[1], 64, data.num_classes, 8) optimizer = torch.optim.Adam(model.parameters(), lr=0.005, weight_decay=5e-4) # Train model for epoch in range(200): model.train() logits = model(g, features) loss = F.cross_entropy(logits[train_mask], labels[train_mask]) optimizer.zero_grad() loss.backward() optimizer.step() acc = (logits[val_mask].argmax(1) == labels[val_mask]).float().mean() if epoch % 10 == 0: print('Epoch {:03d} | Loss {:.4f} | Accuracy {:.4f}'.format(epoch, loss.item(), acc.item())) # Test model model.eval() logits = model(g, features) acc = (logits[test_mask].argmax(1) == labels[test_mask]).float().mean() print('Test accuracy {:.4f}'.format(acc.item())) ``` 在这个示例中,我们首先加载了Cora数据集,并将其转换为一个DGL图。然后,我们定义了一个包含两个SAT层的模型,以及Adam优化器。在训练过程中,我们使用交叉熵损失函数和验证集上的准确率来监控模型的性能。在测试阶段,我们计算测试集上的准确率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值