各位大佬好,最近我又抑郁了。比上不足,我比上不足,Life is harder.
For Recommendation in Deep learning QQ Group 277356808
For Visual in deep learning QQ Group 629530787
不接受这个网页的私聊/私信!!!
说了多少次不接受网页的私信与私聊还是有人这样私信,我看了也不回的,您继续就好了。评论一下会死?加群详聊会见光死?老子又不是和你相亲。
有些公号的文章骂我,翻译paper谁不会,老子其实不是秀,我翻译下至少当时“假装理解”了,是不是真的懂不知道,但过后还可以自己再看下啊,不然又要重头看,那样太累了。另外至少我翻译时不会想很多杂乱的破事,至少我可以静下来,别乱指责别人,总有你不了解的事。
写在前面——
当你迷茫、困惑时,不妨想想来时的路,那么推荐到底是为了解决什么问题呢?在信息流APP中,有视频,文章,gif,小视频等内容,推荐的任务就是将这些分发给每个用户,如果item很少(比如1000以下),这时候其实用不上推荐,过不了两天用户都走了,用户为啥走,这时的主要原因是内容少或者内容很差(没有吸引力,这时候不能怪推荐算法),那么留住用户或者装逼的说法,留存率啥的,第一条关键因素不就是好的内容相当够吗?当item数量上来后,这时候不可能每个用户都会看完这么多信息,APP老板也不会这么做,因为累死也看不完,这就是信息过载,就是信息量远超个人消费。可能会有人想,内容多了,那就只给用户看一部分,这样就有很多item浪费了,没有发挥它的价值,也有的说,随机分发吧,这样item都可能推出去,这样是不错,但对留存和停留时长可能并不是最佳,想要最好的效果,那就投其所好(或者说读心术),知道它喜欢的东西,推给它可能喜欢的东西,这样是不是相对好一点,但这样其实也是有问题的,总有很多item还是推不出,推出的可能都是热门,推不出的原因可以从内容质量、曝光时间、分发用户等方面考虑,但绝大部分情况下很多都直接归为了内容质量不行,其实很有可能这个item没有分配给match它的用户,这不就是相亲吗?得相互看上才可。推出的热门则需要过滤下,注意用户的长期行为即可,但用户的长期行为记录长了,可能训练模型有点困难,100个item?甚至1000个item,更甚的还有1万的,这真的是大佬级别的才能做的,训练时间和内存都是很大的问题,详见这里。
初探秘境——about item cold-start
假如你做的APP通过预先加载安装到手机(预置)或者通过其他链接(比如广告)安装到了手机,这时候最关键的问题就是用户的第一印象,用户一看,刷了几次,内容一般,没有吸引力(旧事重提),可能就走了,这就是用户冷启动,可能有人觉得我是不是傻了,这里说内容冷启动啊,其实没有。用户是冷的,只能通过热的item才能将它暖热(做个广告,本人暖被窝能力超强,哈哈),这个暖也不一定就是热点(搞笑,猎奇等等),也可能是其他方法(不表)。当一个新的item引入APP,没有过去的历史信息很难将它推给合适的用户,均等机会推送可能影响APP的体验。那么在仅仅有冷的item统计信息情况下怎么再次分发这些item呢?寡人愚见,只有这些而无交互,没有user,没时间信息,这就只能用一些统计信息,哪个点击的多,哪个停留时间长,哪个分享/点赞/收藏的多来判断,其他方法就力不从心,信息太少则只能用简单的统计来做。从长远来看,本文也是这个出发点,那么尽量不给新用户推新item,而是给老用户预热item,将冷的item暖热后再推给新用户,所以这里必然要有user参数,没有user怎么知道item的一些特征,仅仅靠其本质特征(tag之类)并不能解决所有问题。因而定义问题,对于n个items,可以表示为,m表示每个item的特征维度,u个users与n个item的交互表示为,其中(i,j)表示user j对item i感兴趣(点击等行为),在测试时,给定新的item q,,目标就是预测哪个用户对该新item感兴趣。卧槽,这个是内容冷启动的概念吗?完全和上面的“item统计”做法毫无关联啊,一点相关性都没有,不妨先顺着这个paper来,其实上面都是我扯淡的,只有问题定义才是别人说的。我想大部分粉丝也就看到这里就走了,可你肯定不知道我后面还有大招吧,哈哈哈
先不要急着否定一个人,不妨等他表演结束,给他一个show的机会。
Collective Factorization背后的意图
在上面问题定义后,item是与一些描述(自身特征等比如topic/tag)和一些消费它的用户有关。以新闻为例说明,每个新闻文章都有一些words,也有一些用户的评论。这种信息可以表示为两个矩阵,一个是document-term矩阵,另一个是document-user矩阵 ,这里的定义与上面相同,document就是item,n表示item的个数,v就是词典大小(注意这里就是NLP中概念vocabulary size),u是用户个数。Xs可以是个布尔矩阵,或者document中的TF-IDF词分数。Xu则反映用户是否给一个文章进行评论。如果将Xs分解为两个低纬的矩阵,就会得知该文章中有哪些topic,以及哪些文章属于这些topic,同样,可以分解Xu为用户有哪些群体特征,以及哪些文章对这些群体有吸引力。卧槽,这特么不是一般LFM就能表示的吗?卧槽,以为多么高大上的。然而,如果分解是相互独立的,也就是说分解到不同隐空间,那么在topic和群体之间就没有什么相关性。因而LCE的idea就是将它两个分解到同一个隐空间。换言之,每个因素可以由一些words(topic等)表示,也可由一些用户群体表示。因此,同时分解到同一个低纬度空间。综合可以表达为一个目标函数:其实也就是一个优化问题
这是常见的形式,最后一项是正则项,为了解的光滑性及避免过拟合。这里有两个考虑,一个是低纬空间,一个是线性近似。一个很自然的假设在此:流形假设,如果两个数据点在无论什么角度是相近的,那么他们在其他低纬度也是相近的,这个假设是很重要的,在维度减少和半监督学习中。最近的相关研究表明,谱图理论及流形学习可以有效拟合一些数据点,通过一些近邻图。边可以是2值的,也可以是权值的。这样,一个矩阵A可以用于度量两个点的距离,collective Factorization将每个点映射到一个低纬的表达wi也就是W矩阵的每行。一个很自然的度量两个低纬表达的距离的方法是计算其欧拉距离|wi-wj|^2。A是xi和xj的局部距离,因而可以将A作为低纬表达的光滑性参数:
D是对角矩阵,每个输入都是A的行和,例如.L=D-A是图拉普拉斯矩阵,Tr是迹运算,也就是计算矩阵对角元素的和。因而1式可以修改为2式,
其实也就是增加一项,用于降维及光滑性考虑。这就是LCE优化问题,其实没啥,,,哈哈
优化方法
针对上面非凸问题的优化,期望一个算法能够找到全局最优的点是不现实的。因此,推导一个迭代算法(基于多个更新规则)获得一个稳定点。这里不再贴出来了,估计也没人去推导啥的,作为一个搬砖工,那就是了解即可,详细推导见这里。
Inference
一旦模型训练好,得到参数W,Hs和Hu,那就可以预测了,例如,给定一文章的词袋(NLP中专用术语bag of words)向量,qs,预测qu可能会留下评论。首先将qs映射到同一隐空间(通过求解最小二乘qs=w*Hs,这是个超定问题),其中的w在同一隐空间,然后由w和Hu得到qu<——w*Hu,其中qu的每个元素代表用户多大可能去评论这个new文章。效果如下,肯定是LCE最好了,不然这个文章还会让你看到?
另外这个图也说明,加不加上面的Tr项目都可以,有可能不加反而好很多,为了技算效率考虑,我觉得不加就可以了。但下面试验是有的。
参数分析——消融试验
LCE模型有三个重要的参数,一个k——隐向量的维度,alpha——权重,lambda——控制光滑解。其中k也控制着模型的复杂度,小的k欠拟合,大的k过拟合,效果都不好,所以需要试验。
paper说了,beta和lambda表现特性差不多,所以就没给,我可以大胆推测,其实beta等于0效果也不差,你看看lambda的效果。k和alpha取4或5都不错,但下文计算CPU运行时间却说k是10^2量级,这个。。。两个k不一样意思还是上图的k缺少了量级?有点懵逼啊。下图是训练时间,
这里是用MATLAB写的代码,不知道有没有大佬看的上,或者你搞成个python/Cpp版本的给我用用,哈哈。大致看了下代码并不复杂,按照我的思路搞个baseline不难,删掉beta项,去掉lambda项,这就容易多了,转成python版本也不难。我们下次再见。愿我们终有会面之时,而你还记得我们曾经讨论的话题。
像迷幻,如梦初醒的一对眼。
似夜晚,星光一般璀璨。
是常在心间,浓情从未淡。
这份爱的感叹,这一生不褪减。
【20201206-19:26补充】
我特么发完就看到有个博文与此LCE对比,肯定啊,因为这是7年前的paper了,我觉得这个理论上好理解,而且很好回答面试中的问题,如果你用高大上的问题,难免会给自己挖坑,一问三不知很可怕。
来源:oschina
链接:https://my.oschina.net/u/4397718/blog/4780791