batch内负采样

batch内负采样一般在计算softmax交叉熵时,需要用tf.nn.log_uniform_candidate_sampler多itemid做随机负采样。但是在类似dssm这种双塔模型中,item侧特征除了itemid外,还有其他meta特征,此时负样本对itemid做负采样后,还需要取相应负样本的meta特征。可是在tf训练数据中并不方便建立itemid与各类meta特征的映射表。为了解决dssm类模型的负采样问题,可以取一个batch内其他用户的正样本做为本用户的负样本,以解决负采样meta特征问题。好了,废话少说,

大家好,又见面了,我是你们的朋友全栈君。

一般在计算softmax交叉熵时,需要用tf.nn.log_uniform_candidate_sampler对itemid做随机负采样。但是在类似dssm这种双塔模型中,item侧特征除了itemid外,还有其他meta特征,此时负样本对itemid做负采样后,还需要取相应负样本的meta特征。可是在tf训练数据中并不方便建立itemid与各类meta特征的映射表。
为了解决dssm类模型的负采样问题,可以取一个batch内其他用户的正样本做为本用户的负样本,以解决负采样meta特征问题。好了,废话少说,直接上代码

     for i in range(NEG):
        rand = int((random.random() + i) * batchSize / NEG)
        item_y = tf.concat([item_y,
                            tf.slice(item_y_temp, [rand, 0], [batchSize - rand, -1]),
                            tf.slice(item_y_temp, [0, 0], [rand, -1])], 0)
      prod_raw = tf.reduce_sum(tf.multiply(tf.tile(user_y, [NEG + 1, 1]), item_y), 1, True)
      prod = tf.transpose(tf.reshape(tf.transpose(prod_raw), [NEG + 1, batchSize])) 
      # 转化为softmax概率矩阵。
      prob = tf.nn.softmax(prod)
      # 只取第一列,即正样本列概率。
      hit_prob = tf.slice(prob, [0, 0], [-1, 1])
      loss = -tf.reduce_mean(tf.log(hit_prob))

代码注解:
其中item_y和item_y_temp 初始化为item侧最后一层embedding值,shape为[batchSize, emb_size]。
user_y为user侧最后一层embedding值,shape为[batchSize, emb_size]。
NEG为负采样个数,batchSize为batch大小。

  1. 在每次循环中,通过rand值打乱item_y_temp的行顺序,相当于取其他用户的正样本做为本用户的负样本
  2. 经历NEG次循环后,item_y的shape变为[(NEG+1)*batchSize, emb_size];注:item_y初始值有batchSize行,每次循环累加batchSize行
  3. 与user_emb点乘后,prod_raw的shape为[(NEG+1)*batch_size,1],
  4. 经过reshape和转置后,prod的shape为[batch_size,(NEG+1)];注:prod的第一列为正样本,其他列为负样本。

后面即可计算出采样后的softmax交叉熵了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149671.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • ubuntu 安装多个CUDA版本并可以随时切换

    ubuntu 安装多个CUDA版本并可以随时切换CUDA是什么就不介绍了,直接讲怎么实现CUDA多版本的共存和实时切换。1、安装多个版本的CUDA这里,我们以cuda9-1版本和cuda9-0版本为例(先安装哪个无所谓) 首先,在cuda版本库中选择自己需要的cuda版本。 然后,选择对应的安装包,这里选择runfile类型的安装文件,以便后面设置每个cuda的安装路径。 下载完成以后,我们利用cd命令,进入到cuda_8.0.61_375.2…

    2022年6月17日
  • Vue父子组件传值的Demo「建议收藏」

    Vue父子组件传值的Demo「建议收藏」话不多说,直接上代码<!DOCTYPEhtml><htmllang="en"><head><metacharset="utf-8"><title>Vue父子组件传值</title><scripttype="text/javascr

    2022年5月13日
  • WPA2协议新攻击方法(KRACK)—WPA2密钥重安装漏洞[通俗易懂]

    WPA2协议新攻击方法(KRACK)—WPA2密钥重安装漏洞[通俗易懂]KeyReinstallationAttacksBreakingWPA2byforcingnoncereuse今年9月份CCS公布了一篇新论文,该论文提出了一种新的攻击方法:KeyReinstallationAttacks,这种攻击方法对WPA2危害甚大。本文简单介绍该攻击方法。我们都知道所有WiFi网络都是靠WiFiProtectedAccess协议的某个实现版

    2022年6月10日
  • win10关闭端口占用[通俗易懂]

    win10关闭端口占用[通俗易懂]查看win10所有占用端口公式:查看所有:netstat-ano查看对应端口:netstat-ano|findstr"9004"关闭端口:任务管理器中的详细信息对应的PID就是占用的端口关闭即可命令行关闭端口:taskkill-PID进程号-F进程号为19216…

    2022年7月20日
  • IPv4与IPv6的区别是什么?[通俗易懂]

    IPv4与IPv6的区别是什么?[通俗易懂]IPv4与IPv6的区别是什么?

    2022年4月22日
  • Windows.h 常用API函数【转】[通俗易懂]

    转自:https://blog.csdn.net/farmwang/article/details/50603608http://www.vbgood.com/api.htmlhttp://hi.baidu.com/3582077/item/9cc3483b581f53c5392ffae3第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄,这…

    2022年4月6日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号