zhangjunjia / zhangjunjia.github.io

blog of zhangjunjia
https://zhangjunjia.github.io/
0 stars 1 forks source link

推荐系统 | 模型开发笔记 #38

Open zhangjunjia opened 1 year ago

zhangjunjia commented 1 year ago

nvidia-smi:查看gpu卡使用率

zhangjunjia commented 1 year ago

https://mp.weixin.qq.com/s?__biz=MzA3NDIyMjM1NA==&mid=2649031658&idx=1&sn=fd1b54b24b607a9d28dc4e83ecc480fb&chksm=8712bd97b065348132d8261907c56ce14077646dfc9c7531a4c3f1ecf6da1a488450428e4580&scene=21#wechat_redirect 对于凸优化来说,任何局部最优解即为全局最优解,用贪婪算法或梯度下降法都能收敛到全局最优解。而非凸优化问题则可能存在无数个局部最优点。

zhangjunjia commented 1 year ago

https://zhuanlan.zhihu.com/p/64864995 学习率直接影响模型的收敛状态,batchsize则影响模型的泛化性能,两者又是分子分母的直接关系,相互也可影响,因此这一次来详述它们对模型性能的影响。

zhangjunjia commented 1 year ago

https://zhuanlan.zhihu.com/p/363645881 使用batch之后,每次更新模型的参数时会拿出一个batch的数据进行更新,所有的数据更新一轮后代表一个epoch。每个epoch之后都会对数据进行shuffle的操作以改变不同batch的数据。

zhangjunjia commented 1 year ago

验证集和训练集需要完全隔离,以防止数据的穿越

zhangjunjia commented 1 year ago

tensorflow训练提速 https://www.tensorflow.org/guide/data_performance#prefetching

  1. nvidia-smi查看gpu使用率,确定是慢在cpu阶段还是gpu阶段,适当调整num_parallel_calls和prefetch
zhangjunjia commented 1 year ago

https://www.jianshu.com/p/0269cd91805e 交叉熵函数是用于计算两个概率分布之间的差异,其输入为两个分布,输出为一个标量,该标量表示两个分布之间的差异程度

zhangjunjia commented 1 year ago

https://zhuanlan.zhihu.com/p/166432329 hinge loss的话当正负样本的距离大于margin后,其实已经对loss的贡献为0 了,但是BPR loss没有设置阈值,鼓励正负样本的距离越大越好;当然跟margin不好调参也有关

zhangjunjia commented 1 year ago

https://blog.csdn.net/weixin_40314737/article/details/81737101 multi-hot的原理

zhangjunjia commented 1 year ago

但是,batch内负采样确实有其存在的价值:可以方便的增加负样本的多样性,让模型收敛更迅速,参考度量学习里面n-pair loss (Improved Deep Metric Learning with Multi-class N-pair Loss Objective) 可以打压高热item,batch内的负样本都是其他user的正样本,里面高热样本的占比会比全局随机要大很多。

作者:召回粗排那些事 链接:https://www.zhihu.com/question/530278710/answer/2931994048 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

zhangjunjia commented 1 year ago

GraphSAGE是不是可以这样理解,用v在k-1跳的表示和v的邻居在k跳的表示聚合得到v在k跳的表示,因此每一跳都包含了v的上一跳信息和这一跳的邻居信息。v在1跳的表示是input(v自己),而通过递归得到的最后一跳(K跳)的表示是output z(v)。z(v)融合了从1跳到K跳所有v的表示信息,因此可以更准确地描述v在整张图里的地位,从而更好地聚类v。

https://zhuanlan.zhihu.com/p/62750137

zhangjunjia commented 1 year ago

如果我们把SENet用在特征Embedding上,类似于做了个对特征的Attention,弱化那些不靠谱低频特征Embedding的负面影响,强化靠谱低频特征以及重要中高频特征的作用,从道理上是讲得通的 https://zhuanlan.zhihu.com/p/358779957

zhangjunjia commented 1 year ago

而FM模型,感觉特性和DNN双塔正好相反,它在User侧和Item侧交互方面比较有优势,因为没有深层,也没有非线性对单侧特征的深度融合,只在两侧特征Embedding层级发生交互作用,所以在特征Embedding层级能够更好地表达User侧和Item侧特征之间的交叉作用,当然,缺点是缺乏非线性。所以,如果仔细分析的话,会发现FM和DNN双塔,是各有擅长之处的。https://zhuanlan.zhihu.com/p/358779957

在这个基础上,我们再来看为何把SENet引入双塔模型会是有效的,我推测可能的原因是:它很可能集成了FM和DNN双塔各自的优点,在User侧和Item侧特征之间的交互表达方面增强了DNN双塔的能力。SENet通过参数学习,动态抑制User或者Item内的部分低频无效特征,很多特征甚至被清零,这样的好处是,它可以凸显那些对高层User Embedding和Item Embedding的特征交叉起重要作用的特征,更有利于表达两侧的特征交互,避免单侧无效特征经过DNN双塔非线性融合时带来的噪声,同时,它又带有非线性的作用。这貌似能同时吸收了FM和DNN各自的优势,取得一个折衷效果。当然,这只是个人推测。

zhangjunjia commented 1 year ago

一行打印shape和value:

print_op = tf.Print(input_tensor, [input_tensor, tf.shape(input_tensor)], "Tensor value and shape: ")