广东网络公司网站,域名网站怎么打开,wordpress get tags,高端网站设计新鸿儒一.论文
1.1 P-tuning
区别于之前的工作#xff0c;这篇工作认为promote可以在句子中的任意位置起到作用#xff0c;可以将它们插入上下文或目标中 上图中#xff0c;左图是不使用任何操作#xff0c;右图是选择在居首和目标前插入promote的embedding#xff0c;插入pro…一.论文
1.1 P-tuning
区别于之前的工作这篇工作认为promote可以在句子中的任意位置起到作用可以将它们插入上下文或目标中 上图中左图是不使用任何操作右图是选择在居首和目标前插入promote的embedding插入promote的过程可以表示为 其中x代表一系列离散的输入令牌y代表目标可以理解为希望模型想要给你的回答e表示对应的embedding其实就是将其参数化映射成为伪tokens即 通过最小化这些参数 1.2 promote生成
嵌入的promote实际上可以理解为不一定离散且不相互关联的而实际上的promote其实应该是高度离散的且具有关联性的因此作者选择使用双向长短期记忆网络(LSTM)激活函数和MLP来建模这种关系
在推理中我们只需要输出嵌入h并且可以丢弃LSTM头
二.代码
本质上是使用一个PromptEncoder来生成伪的embedding添加到原先的embedding中
2.1 训练
训练过程只更新promote_encoder中的参数 2.1.1 PromptEncoder
在PTuneForLAMA中实例化了PromptEncoder PromptEncoder本质上是一个(嵌入 LSTM MLP)
import torch
import torch.nn as nnclass PromptEncoder(torch.nn.Module):def __init__(self, template, hidden_size, tokenizer, device, args):super().__init__()self.device deviceself.spell_length sum(template)self.hidden_size hidden_sizeself.tokenizer tokenizerself.args args# ent embeddingself.cloze_length templateself.cloze_mask [[1] * self.cloze_length[0] # first cloze [1] * self.cloze_length[1] # second cloze [1] * self.cloze_length[2] # third cloze]self.cloze_mask torch.LongTensor(self.cloze_mask).bool().to(self.device)self.seq_indices torch.LongTensor(list(range(len(self.cloze_mask[0])))).to(self.device)# embeddingself.embedding torch.nn.Embedding(len(self.cloze_mask[0]), self.hidden_size).to(self.device)# LSTMself.lstm_head torch.nn.LSTM(input_sizeself.hidden_size,hidden_sizeself.hidden_size // 2,num_layers2,dropoutself.args.lstm_dropout,bidirectionalTrue,batch_firstTrue)self.mlp_head nn.Sequential(nn.Linear(self.hidden_size, self.hidden_size),nn.ReLU(),nn.Linear(self.hidden_size, self.hidden_size))print(init prompt encoder...)def forward(self):input_embeds self.embedding(self.seq_indices).unsqueeze(0)output_embeds self.mlp_head(self.lstm_head(input_embeds)[0]).squeeze()return output_embeds2.1.2 调用
在PTuneForLAMA的forward函数中调用了embed_input来实现