seq2seq召回(u2i)

概述:利用用户点击历史,来给用户进行召回的u2i召回。

样本格式:按照item点击顺序组装 user1:[item1,item2,item4..];   user2:[item2,item9,item10...]

参数说明:

seq_length:序列最大长度,70。

batch_size:198。

Seq2seq模型流程:

第一步:输入n条样本序列sequence 为[198, 70]

第二步:对序列进行itemEmbedding:item_embeddings [198, 70, 64]

第三步:根据padding的个数进行posiitonEmbedding:position_embeddings[198, 70, 64]

第四步:合并item_embeddings+position_embeddings:得到sequence_emb[198, 70, 64]

第五步:sequence_emb经过两层Encoder(SelfAttention),最后一个encoder输出得到seq_out[198, 70, 64]

第六步:随机生成neg_label,合并正负样本矩阵得到label[197, 70](padding位置随机取负样本,未padding取正样本)

第七步:求每个位置的相似度:对label使用outputs_embedding进行向量化ids_emb,seq_out与ids_emb相乘(同shape)

第八步:计算loss(详见下)

Self-Attention的实现:

第五步:对sequence_emb使用K、Q、V进行变化,分别得到mixed_key_layer、mixed_query_layer、mixed_value_layer 均为 [198, 70, 64]

第六步:把每个64维向量切成head_num个小向量,平均分成每个head。例如head=2,则query_layer [198, 2, 70, 32]

第七步:对K进行变化,点乘V得到attention_scores [198, 2, 70, 70]。 query_layer([198, 2, 70, 32])*key_layer_transpose([198, 2, 32, 70])=attention_scores([198, 2, 70, 70]) attention_scores记录的是当前位置与其他位置的相关权重。

第七步:attention_scores缩小:attention_scores = attention_scores / math.sqrt(self.attention_head_size)

第八步:剔除穿越问题 attention_scores([198, 2, 70, 70]) = attention_scores([198, 2, 70, 70])+ attention_mask([198, 1, 70, 70])

第九步:对attention_scores进行softmax得到attention_probs([198, 2, 70, 70])。#sattention_probs记录是记录当前位置与其他位置相似性的权重。

第十步:对attention_probs点乘value_layer,再合并成64维。得到context_layer([198, 70, 64])

十一步:再过一层Dense,得到hidden_states([198, 70, 64])#hidden_states后可以追加dropout

十二步:残差处理:hidden_state+input_tensor。

十三步:过LayerNorm。

说明:self.attention_head_size = int(args.hidden_size / args.num_attention_heads) # 为了使每个头能够处理相等大小的隐藏状态,需要将隐藏状态大小平均分配给每个头。

SelfAttention-Mask的实现:

  • 创建两种mask:
    • subsequent_mask:([1, 1, 70, 70])信息是否可用矩阵。其实就是一个序列长度n*n 的方形矩阵。右上角部分是0,左下角和对角线是1(1代表当前信息可用。例如(20,2)值为1,即在进行20次输出时,第2个token的影响信息是可以使用的。(我们希望每个位置的注意力权重只受到当前位置及之前位置的影响,而不受到之后位置的影响)
    • padding_mask:([198, 70])序列中有padding的值为0,没有padding的值为1。
  • 合并mask:attent_mask = padding_mask * subsequent_mask (只有一个为0,则值为0,[199, 1, 70, 70] *[1,1,70,70]得到[199, 1, 70, 70])
  • 转成权重:attention_mask_score = (1.0 - attention_mask) * -10000.0 (值为1起始分为0,值为0起始分为-10000)
  • 应用:与attention_scores相加
attention_scores = tf.matmul(query_layer, tf.transpose(key_layer, (0,1,3,2)) )

attention_scores = attention_scores / self.norm

attention_scores = attention_scores + attention_mask_score ##

attention_probs = tf.nn.softmax(attention_scores)

模型的训练输入和输出

loss, logits, seq_embed = self.model.fit_city(input_ids, label, weights=hot_weight)
    • input_ids:(196, 70),也就是196条样本,每条样本是长度为70的序列,被点击序列。
    • label:(196, 70),196条样本,每条样本有最多有70个label(实际长最多69个)。
    • hot_weight:其实就是input_id中每个节点(元素)对应的权重值(小于0)。(item节点的度越大,被抽样的概率越大)

损失函数

总结:正样本就是当前序列的预测拟合当前位置的label,负样本为当前位置的其他样本的label(batch内负采样)。

  • weights = tf.convert_to_tensor(weights) * attention_mask # attention_mask是padding矩阵,最终weights有padding位置值为0,其他为小于0的一个权重值。
  • loss计算流程总结:
  • seq_out:(200,70,64) 代表200个序列,在不同位置都预测了一个输出,他们在每一个位置都对应一个label。所以label也是(200,70,64)。
  • pos_logits:是序列中某个位置的预测和label之间的logit,也就是对角线上的相似度。
pos_logits, logits = self.bert_logits(sequence_output, label, weights)

#计算正样本和全部样本的损失当做loss

loss = self.softmax(pos_logits, logits, tf.transpose(attention_mask)) #attention_mask 是是否padding的矩阵。



"""

bert_logits 函数的作用是计算序列输出与目标序列的对应位置的相似度得分。



softmax:

正样本:预测当前位置的label的logit。

负样本:把原本的概率相乘转换为概率相加。???

"""

def bert_logits(self, seq_out, ids, weights=None): # seq_out:(200,70,64) ids:(200,70)

ids_emb = self.outputs_embedding(ids, 'sample') # ids_emb:(200,70,64)

seq_out, pos_emb = seq_out, ids_emb

# 输出向量与真实向量,在每个位置(1~70)上的相似度。第2、3个维度表示seq_out、pos_emb中的样本序列长度。

logits = tf.einsum('bld,mld->lbm', seq_out, pos_emb) # logits:(70,200,200)

# weight (200,70)表示为每个位置上的初始权重值,padding的位置为0,无padding的值为一个负数。

if weights is not None:

logits = logits - tf.transpose(tf.expand_dims(weights, 1), (2, 1, 0))

pos_logits = tf.linalg.diag_part(logits) # 提取矩阵对角线上的元素 (70,200,200)-> (70,200)

return pos_logits, logits





def softmax(self, pos_logits, logits, mask=None, weight=1.0): # pos_logits: (70,200) 不同位置下,n样本的相似度。

if mask is None:

mask = tf.ones_like(pos_logits)

loss = -tf.reduce_sum((pos_logits * mask * weight))

loss += tf.reduce_sum((tf.math.log(tf.reduce_sum(tf.exp(logits), axis=-1)) * mask * weight))

return loss / tf.reduce_sum(mask)



说明:计算softmax时 把当前样本 当前位置的预测与当前样本当前位置的label计算得到pos_logits当做正样本收益,

把当前样本 当前位置的预测与其他样本的的当前位置的label计算得到叫负收益neg_logits(负收益需要e次方,在加和)

mask:是由padding的矩阵进行transpose得到,即从“n个样本,每个位置是否mask”变成了“n个位置,每个样本是否mask“

Predict流程:

  • 获取user信息和user点击序列
  • 执行模型call函数,得到每个user最后一个位置的向量表征;item来自与outputs_embedding。
  • 把两种向量concat,保存在本地npz。

Recall流程:

  • 读取主动方被动方向量:
  • 被动方(geek)建索引:faiss.IndexFlatIP(self.geek_embedding.shape[1]).add(self.geek_embedding)。
  • 查询每个user相似的topK,并剔除已点击的item:index.search(self.boss_embedding[i:i + 1],int(self.top_n * 24 + 3 * len(visited))

其他:

  • Seq2seq模型有3个Embedding层:item_embeddings(输入id),outputs_embedding(预测label的Embedding),position_embeddings(位置编码)
# csr的adj.indptr[i] - adj.indptr[i+1]表示提取当前行中所有非零元素的列索引,减去user_id,即得编码后的item_id

visited = set([self.datasets.adj.indices[j] - self.datasets.n_user for j in range(self.datasets.adj.indptr[i], self.datasets.adj.indptr[i + 1])])

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/601226.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

文献速递:深度学习医学影像心脏疾病检测与诊断--CT中的深度学习用于自动钙评分:使用多个心脏CT和胸部CT协议的验证

Title 题目 Deep Learning for Automatic Calcium Scoring in CT: Validation Using Multiple Cardiac CT and Chest CT Protocols CT中的深度学习用于自动钙评分:使用多个心脏CT和胸部CT协议的验证 Background 背景 Although several deep learning (DL) calc…

微软开发新模型;YouTube 推出新AI功能;可折叠iPhone 或发布?

微软或开发新模型与 Google、OpenAI 竞争 The Information 报道,微软正在训练一种新的 AI 大模型「MAI-1」,规模上足以与 Google、Anthropic 乃至 OpenAI 的先进模型抗衡。 据报道,这个 MAI-1 模型由微软聘请的 Inflection 前 CEO Mustafa S…

unity基础(二)

debug方法 Debug.Log(" 一般日志 ");Debug.LogWarning(" 警告日志 ");Debug.LogError(" 错误日志 ");// Player Informationstring strPlayerName "Peter";int iPlayerHpValue 32500;short shPlayerLevel 10;long lAdvantureExp 1…

爱普生MCU系列语音芯片S1C31D41

随着科技的发展和产品的集成化,语音芯片已经逐渐替代了多种语音设备应用在各场合。语音芯片主要特性是功耗低,抗干扰能力强,外围器件少,控制简单,语音保存时间久(某些语音芯片可以保存内容100年),掉电不丢失…

yolo-world:”目标检测届大模型“

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享,包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

【Git】Git学习-16:git merge,且解决合并冲突

学习视频链接: 【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 1 创建分支dev,并用merge合并master分支,使dev分支合并上master分支中内容为…

[Algorithm][多源BFS][矩阵][飞地的数量][地图中的最高点][地图分析] + 多源BFS原理讲解 详细讲解

目录 0.原理讲解1.矩阵1.题目链接2.算法原理详解3.代码实现 2.飞地的数量1.题目链接2.算法原理详解3.代码实现 3.地图中的最高点1.题目链接2.算法原理详解3.代码实现 4.地图分析1.题目链接2.算法原理详解3.代码实现 0.原理讲解 注意:只要是用**BFS解决的最短路径问题…

韩顺平0基础学Java——第5天

p72——p86 今天同学跟我说别学java,真的吗?唉,先把这视频干完吧。 逻辑运算符练习 x6,y6 x6,y5 x11,y6 x11,y5 z48 错了&a…

【web网页制作】html+css旅游家乡河南开封主题网页制作(4页面)【附源码】

HTMLCSS家乡河南主题网页目录 🍔涉及知识🥤写在前面🍧一、网页主题🌳二、页面效果Page1 首页Page2 开封游玩Page 3 开封美食Page4 留言 🌈 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 🐋四…

【Git】Git学习-14:VSCode中使用git

学习视频链接:【GeekHour】一小时Git教程_哔哩哔哩_bilibili​编辑https://www.bilibili.com/video/BV1HM411377j/?vd_source95dda35ac10d1ae6785cc7006f365780 在vscode中打开文件 code . 自行修改内容,在源代码管理器中测试下

flutter报错

组件相关 type ‘List’ is not a subtype of type ‘List’ children: CardList.map((item) > Container( 加上 *** < Widget>*** 正常 type ‘(dynamic, dynamic) > Container’ is not a subtype of type ‘(CardType) > Widget’ of ‘f’ children: CardL…

Spring Data JPA自定义Id生成策略、复合主键配置、Auditing使用

前言 在Spring Data JPA系列的第一篇文章 SpringBoot集成JPA及基本使用-CSDN博客 中讲解了实体类的Id生成策略可以通过GeneratedValue注解进行配置&#xff0c;该注解的strategy为GenerationType类型&#xff0c;GenerationType为枚举类&#xff0c;支持四种Id的生成策略&…

详细讲解lua中string.gsub的使用

string.gsub 是 Lua 标准库中的一个函数&#xff0c;用于全局替换字符串中的某些部分。string.gsub 是 Lua 中非常实用的一个函数&#xff0c;它可以用来进行字符串的处理和替换操作。 它的基本语法如下&#xff1a; string.gsub(s, pattern, replacement [, n])s 是要处理的…

鸿蒙开发核心技术都有哪些【都是从零开始】

鸿蒙开发核心技术都有哪些&#xff1f;&#xff1a;【持续1年的时间公关鸿蒙技术】 我们能做哪些呢&#xff1f; 还是从UI业务开始吧 面试题1&#xff1a; 基于STAGE模型项目重构等问题 代理设计模式&#xff0c;业务与架构隔离 中介者模式&#xff0c;和代理设计模式的区别…

项目管理-项目绩效域1/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 1.项目绩效域--整体框架 项目绩效域 重点&#xff1a; ①八大绩效域的含义。 ②八大绩效域的问题和解决方案。 ③八大绩效域与十大管…

Go标准库——Flag库和Log库

一.Flag Go语言内置的flag包实现了命令行参数的解析&#xff0c;flag包使得开发命令行工具更为简单。 1.1 os.Args 如果你只是简单的的想要获取命令行参数&#xff0c;可以像下面代码示例一样使用os.Args来获取命令行参数。 os.Arg实际是一个存储命令行参数的字符串切片([]stri…

Linux最新提权通杀五大绝招(上)

点击星标&#xff0c;即时接收最新推文 本文选自《内网安全攻防&#xff1a;红队之路》 扫描二维码五折购书 Linux 主机权限提升问题是普遍存在的。在Web 服务器、数据库、防火墙、IOT等基础设施中&#xff0c;大部分都运行着Linux 操作系统&#xff0c;鉴于Linux 设备在大量基…

【负载均衡在线OJ项目日记】项目简介

目录 前言 什么是负载均衡 所用的技术和开发环境 所用技术 开发环境 项目的宏观结构 leetcode 结构 结构 编写思路 前言 从C语言的文章到现在Linux网络部分&#xff0c;我已经涉猎了很多知识&#xff1b;终于在今天我要开始搞项目了&#xff0c;通过项目我也可以开始…

鸿蒙OS NEXT的推出,不仅面向App端

华为官方公布6月份的版本为beta版&#xff0c;依然属于开发者测试版&#xff0c;但可以向普通用户开放了。这点和苹果iOS系统测试形式略微相似&#xff1a;6月份开放首个测试版&#xff0c;随后过渡到公测版&#xff0c;最后再和年度新机一起发布正式版系统。 如果按照这个进度…

DNS域名解析服务的部署及优化方案

实验要求: 1.配置2台服务器要求如下&#xff1a; a&#xff09;服务器1&#xff1a; 主机名&#xff1a;dns-master.timinglee.org ip地址&#xff1a; 172.25.254.100 配置好软件仓库 b&#xff09;服务器2&#xff1a; 主机名&#xff1a;dns-slave.timinglee.org ip地址&am…
最新文章