海淀网站建设怎么样,天津建设网站,网站优化外链怎么做,广告公司企业画册设计最近的工作有涉及该任务#xff0c;整理一下思路以及代码细节。
流程
总体来说思路就是首先用预训练的bert模型#xff0c;在训练集的序列上进行CLS任务。对序列内容#xff08;这里默认是token id的sequence#xff09;以0.3左右的概率进行随机mask#xff0c;然后将相…最近的工作有涉及该任务整理一下思路以及代码细节。
流程
总体来说思路就是首先用预训练的bert模型在训练集的序列上进行CLS任务。对序列内容这里默认是token id的sequence以0.3左右的概率进行随机mask然后将相应sequence的attention mask原来决定padding index和label也就是mask的ground truth输入到bert model里面。
当然其中vocab.txt并不存在的token是需要add进去的具体方法不再详述网上例子很多注意word embedding也需要初始化就行。
模型定义 self.model AutoModelForMaskedLM.from_pretrained(./bert) 模型的输入 result self.bert_model(tail_mask, attention_mask, labels) 得到模型训练的结果之后要做一个选择
1transformer的bert model可以输出要预测时间步的hidden state可以选择取出对应的hidden state其中需要在数据处理的时候记录下每个sequence的tail position也就是要预测位置的idx。另外我认为既然要进行序列推荐那么最后一个tail position的token表征一定是最重要的所以需要对tail position的idx专门给个写死的mask效果会好一些。然后与sequence中item的全集进行相似度的计算再去算交叉熵loss。
bert_hidden result.hidden_states[-1]
bert_seq_hidden torch.zeros((self.args.batch_size, 312)).to(self.device)
for i in range(self.args.batch_size):bert_seq_hidden[i,:] bert_hidden[i, tail_pos[i], :]
logits torch.matmul(bert_seq_hidden, test_item_emb.transpose(0, 1))
main_loss self.criterion(logits, targets)2同时也可以result.loss直接数据mask prediction的loss我理解这个loss面对的任务是我要求sequence中的各个token表征都要尽可能准确都要考虑1可能更加注重最后一个位置的标准的准确性。
然后在evaluate阶段需要注意输入到模型的不再是tail_mask而是仅仅mask掉tail token id的sequence因为我们需要尽可能准确的序列信息只需要保证要预测的存在mask就够了。
由于是推荐任务而且bert得到的hidden state表征过于隐式所以需要一定的个性化引导它进行训练。经过个人的实验也确实如此而且结果相差很多。
以上就是我个人的总结经验欢迎大家指点。