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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux rsync同步操作和inotify实时同步 、 Cobbler装机平台 (SERVICE06—-DAY21)[通俗易懂]

    Linux rsync同步操作和inotify实时同步 、 Cobbler装机平台 (SERVICE06—-DAY21)[通俗易懂]rsync同步操作•命令用法–rsync[选项…]源目录目标目录•同步与复制的差异–复制:完全拷贝源到目标–同步:增量拷贝,只传输变化过的数据同步控制•rsync操作选项–-n:测试同步过程,不做实际修改––delete:删除目标文件夹内多余的文档–-a:归档模式,相当于-rlptgoD–-v:显示详细操作信息–-z:传输过程中启用压缩/解…

    2022年7月18日
    15
  • Linux操作系统平台Vi指令大全

    Linux操作系统平台Vi指令大全

    2021年7月28日
    62
  • 卸载LuDaShi时弹出“正在运行”“已被打开”的一种解决方法

    卸载LuDaShi时弹出“正在运行”“已被打开”的一种解决方法找软件资源的时候偷懒下载了三流网站的东西,结果被LDS(不知道是真LuDaShi还是山寨LuDaShi)缠上了。斗智斗勇一晚上,有了以下俩想法。(小白乱说不一定对)1、LDSGameMaster文件夹下,无法删除的子项疑似会在被用户选中执行删除命令时调用自身,以逃避卸载。笔者第一次选中LDSGameMaster时删除中断,显示有程序调用该文件夹,打开任务管理器后并未找到任何在运行中的LDS进程。一级一级打开子文件夹,发现最后不能被删除的子项,调用者是Win资源管理器——搁这儿搁这儿呢!于是试着改了下这个

    2022年5月30日
    72
  • 粒子群算法matlab代码(注释很详细哦,图像也美美哒,任意维度)[通俗易懂]

    粒子群算法matlab代码(注释很详细哦,图像也美美哒,任意维度)[通俗易懂]整个程序分为5个脚本pso1_mian.m:主程序,在此脚本内设置参数。pso1_im.m:画出函数图像(仅1维和2维)pso1_in.m:初始化pso1_in2.m:迭代寻优并输出结果另外还有一个目标函数,单独为一个脚本。推荐的测试函数—>这里先上运行结果图下面是源码1.pso1_mian.m这里的目标函数用函数句柄的形式调用(第15行)%%粒子群算法%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%pso1_im

    2022年5月1日
    75
  • django 项目部署详细教程 【uwsgi + nginx】「建议收藏」

    django 项目部署详细教程 【uwsgi + nginx】「建议收藏」django项目部署详细教程【uwsgi+nginx】

    2025年10月30日
    2
  • python bz2模块

    python bz2模块单次压缩和解压缩单次压缩(bz2.compress)In[40]:compressStr=’usebz2moduletocompressstring’In[41]:bz2.compress(compressStr,6)Out[41]:’BZh61AY&SY\xa5i\x9c”\x00\x00\x0f\x99\x80@\x00\x10\x00\x1e\xa7\xde\x

    2022年5月3日
    33

发表回复

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

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