前言
问渠哪得清如许,为有源头活水来---朱熹
数据冷启,即是新闻推荐系统的源头活水。
新闻推荐必须面对的入场问题
简单讲一下新闻推荐里面不怎么被提到的重要环节:数据冷启。在某些童鞋的认知里,一个新闻推荐系统,最重要并且最出彩的部分肯定是排序模块,推荐就等于Rank;其实不然,一个完备的推荐系统,是包括方方面面的,简单划分模块如下:
【推荐的模块图】数据抓取==》数据冷启==》召回==》粗排==》精排==》展示策略
![](https://i-blog.csdnimg.cn/blog_migrate/81663c6dc3f76e08d7644a8e4b3f0704.jpeg)
新闻推荐系统不同于商品/广告推荐系统,具有自己的特色。
1)新闻时刻在产生。
每时每刻,新闻都在源源不断地产生的,当你看到这段文字的时候,可能又有个新闻爆出来,或者某个地方发生了一件事情被新闻报道。在商品或者广告推荐系统里,也有新物品或者广告在产生,但是没有新闻流这样频繁和规模庞大。
2)新闻重在新。
新闻的受众,更乐于接收没看过的新闻,而非已看过的旧闻。在信息熵里面,确定的消息都是没有信息量的,只有未知的才是有信息量的。对用户而言,没看过的才是对他来说有信息量的。如果某条新闻没有很快进入推荐流,则会严重影响用户体验,现在的信息化时代,讲究地是信息的快速传播。
举个例子,在实际场景中,一条事件新闻发生了,用户或许可以接受1个小时的延迟,但万万是无法接受半天时间的延迟的。如果延迟过长,用户会产生这样的疑问=>为啥我的其他小伙伴们,在另外渠道都已经能看到某个明星出轨的消息了,而我在这款新闻流产品里还没刷到任何相关信息?久而久之,就会吐槽做的什么鸡毛玩意,我要卸掉换个更好的。
3)数据依赖重,入场是关键。
没有数据,信息流推荐产品玩转不动;没有新的新闻进来,全是旧闻旧颜,看多了腻,最终无内容可推。咋整?新的数据赶紧滴呀,抓紧时间入场,抓紧时间见到用户,在兼顾效率的同时,还要兼顾效果。
总之,数据被抓取到或者以UGC的形式产生,然后,这些规模看着还挺大量的新闻要快速有效地进入整个推荐流。
于是,怎么入场,就成了整个推荐系统首要解决的问题。解决地漂漂亮亮,数据很快就入场,很快大规模被以更柔和且精准的方式推荐给用户,获得最大的推荐受益和体验。解决地不那么漂亮,数据也能磕磕绊绊地入场,也可以被大规模投放,就是初始几步没走好,后面难免有各种坑等着。
而数据的入场效率和效果,构成了数据冷启的整个目标,根据不同环境,我们要区分性地对待这一推荐系统必须要解决的问题。
简单粗暴有时更救命止渴
有时候,系统已经跑起来了,如夸父追日般风驰电掣地向前推进着,整个系统的后续环节都依赖数据,有需要积累行为的,有需要积累特征的,有需要海量数据规模支撑的。数据冷启这个时候压力山大呀!还管啥试投姿势好看呀,先把每天到手的几百万或者几千万的数据,怼到系统里再说。甭管黑猫白猫,能够投放出去数据就是好的冷启姿势。这个时候,投放效果是其次的,投放效率更为重要。简单总结下有用的数据入场姿势。
1)热点运营
顾名思义,就是人工运营挑选爆点新闻,做专门投放,不管是将爆点置顶还是push。该方法特点,能解决掉最热的爆点新闻,缺点就是可用新闻量太少。
2)全局随机试投
推荐系统连接了用户和数据,决定了用户接受到什么样的数据,也决定了数据能见到什么样的数据。如果我们什么都不做,直接做随机试投怎么样呢?事实证明,在精细试投不允许的情况下,也是可行的,总不能啥都不干吧。随机试投,听上去好像很弱鸡的样子,也很不高端的样子。让我来给他用数学理论来解释下,大概就高级了哈哈。
我们在中学数学里,应该就学过蒙特卡洛估值的方法,比如下图,估计1/4圆的面积,或者更复杂图形的面积。背后的思路是:采样越多,越近似最优解。在最近的围棋智能对抗中,AlphaGo就用到了蒙特卡洛搜索法来找最优解,是典型的以蛮力实现智慧的方法。
![](https://i-blog.csdnimg.cn/blog_migrate/bfe52c32c0bf70404627362245c7c7e4.gif)
思考的角度,决定了如何处理试投的结果。我们如果认为是将数据随机投放到了用户上,则得到了用户的特点分布;如果认为是将用户随机投放到了数据上,则得到了数据的特点分布。现在,通过随机试投,我们对用户的分布和数据的分布都有了。那么就可以挑选出全局较优的数据了,也可以挑选出全局较优的人群了。
3)统计赤膊上阵
系统有啥统计用户画像之类的东西,借鉴过来搞啊。比如,总得有个基于用户点击历史的关键词之类的用户画像,此时它就成了很好地载体,可以作为连接数据和用户的中间媒介。虽然是个统计的画像,但是不耽误使用哈~最简单的使用方式是,统计每个新闻在每个关键词下面的后验CTR,然后分别取头部,作为每个关键词的候选新闻集;线上每有一个用户来访问时,先获取他的关键词画像,然后根据点击频率来取对应的候选新闻集合。
4)rank的粗糙处理
在召回的结果中,已经存在了新数据集合,但是Rank模块极有可能不会将这些数据排序到前面。Rank是追求数据指标的,给用户更合适的数据来获得更好的系统指标是Rank的目标;而召回更多的是在不同维度来描述用户,针对性地召回数据。在Rank的目标里,新数据是很吃亏的,完全没有或者只有稀疏且不置信的行为统计,压根搞不过那些已经投放了相当量的数据哇~咋整,懒人有懒招,反正试投要保证一定的投放量,那就直接固定下来,每屏的返回里面必须有一条新数据。
从上面虽然粗暴但是不失简洁的搞法中,我们可以大体了解到,数据冷启是个全局的任务,不仅仅是有个试投就完事大吉了,而是涉及整个推荐系统的每个环节。哪个环节搞不定,都不会很好地进行到下一步。让我们在这里简单总结下数据冷启,在每个环节都要干的事情。
【图:冷启涉及的各个环节,及其需要达成的状态】
![](https://i-blog.csdnimg.cn/blog_migrate/f3fdfd0fe345b314831339e4ca81f9f3.png)
更漂亮优雅的入场姿势
生活要有张有弛,不能总是疾风暴雨,对待用户要像春天的清风一样温柔,不能像夏天的烈日般太过热情。要时刻记得,我们是基于用户行为的大数据推荐算法系统,是比用户爹妈还了解他们内心世界的推荐系统,总是能够根据用户的需求,分配给他们最爱的新闻内容。很喜欢一个图,如下,解释了用户和新闻之间的联系纽带。
![](https://i-blog.csdnimg.cn/blog_migrate/d414a40e6a800ae609205bd45c6520f2.jpeg)
1)召回
针对性地召回新数据,是首先要处理好的环节,新数据上的行为毕竟不多,所以只能借助用户的其他信息。
1.1)用户
⟶
\longrightarrow
⟶数据
这里,一方面可以挖掘用户的相关信息,另一个就是借助新闻的描述信息。
根据对URL和不同URL级信息的重视程度,可以将<user, url>分成不同的模型类型。
type | optimize | means |
---|---|---|
⟨ u s e r , u r l ⟩ \langle user, url \rangle ⟨user,url⟩ | a r g m a x θ ∏ P ( V u s e r ⋅ V u r l ) \underset{\theta}{argmax} \prod P(V_{user}·V_{url}) θargmax∏P(Vuser⋅Vurl) | 单纯使用用户和URL来学习用户间在点击新闻上的关系 |
⟨ u s e r , m e a n ( t a g s ) ⟩ \langle user, mean(tags) \rangle ⟨user,mean(tags)⟩ | a r g m a x θ ∏ P ( V u s e r ⋅ V t a g s m e a n ) \underset{\theta}{argmax} \prod P(V_{user}·V_{tags}^{mean}) θargmax∏P(Vuser⋅Vtagsmean) | URL用标签或者关键词表示,学习用户和标签的关系 |
⟨ u s e r , u r l + m e a n ( t a g s ) ⟩ \langle user, url + mean(tags) \rangle ⟨user,url+mean(tags)⟩ | a r g m a x θ ∏ P ( V u s e r ⋅ [ V u r l + V t a g s m e a n ] ) \underset{\theta}{argmax} \prod P(V_{user}·[V_{url}+V_{tags}^{mean}]) θargmax∏P(Vuser⋅[Vurl+Vtagsmean]) | 同时考虑URL和tag信息,但是tag的总体与URL平级 |
⟨ u s e r , m e a n ( u r l + t a g s ) ⟩ \langle user, mean(url+tags) \rangle ⟨user,mean(url+tags)⟩ | a r g m a x θ ∏ P ( V u s e r ⋅ [ V u r l + V t a g s ] m e a n ) \underset{\theta}{argmax} \prod P(V_{user}·[V_{url}+V_{tags}]^{mean}) θargmax∏P(Vuser⋅[Vurl+Vtags]mean) | 将每个Tag与URL作为同级处理 |
在新数据的召唤逻辑里,d)这种形式是效果较好,并且数据不容易那么集中在头部。
1.2)数据
⟶
\longrightarrow
⟶数据
将用户点击过的新闻与当前待试投的新闻联系起来。不管是用纯粹的行为学习到的url-emb,还是word2vec,或者是title2vec,亦或者bert的词向量表示的向量,都可以作为Item-Item相似计算。
1.3)用户
⟶
\longrightarrow
⟶桥梁
⟶
\longrightarrow
⟶数据
甭管啥中间层,只要能借助地,都可以作为中间桥梁,管你是统计的用户点击行为描述,还是隐藏空间表述,还是主题模型的主题,搞起来不要停,简直就是姿势不要太多。
2)RANK
暂无。有野路子搞,但是会损伤系统指标,哈哈。在这里最大的难点是新数据的行为少,在排序时天然比积累了更多行为的旧数据处于劣势。
3)策略
并不是排序的顺序,就是展示的顺序,还有各种各样的展示策略。因此,也需要搞个时间策略,使得Rank排序到候选集内的数据,能够在展示时更靠前,而不是由于策略导致新数据压根不往上冒。
单独提一句,监控项目及评估指标的设定很重要。
探索
+. 在阿里的DIEN模型上作简化,在历史点击上加以Attention。
+. 对新数据做上采样,也会大大增加新数据召回比例,并且效果奇佳。
+. 主题模型,对后验统计依赖更重,相比较而言不太适合新数据的投放。
+. 多目标下的对抗生成式推荐策略,增加时间策略的生成。
后记
此文更侧重术,而非道~所谓数据引入并无定式,大胆探索