感谢阅读「美图数据技术团队」的第 3 篇文章
在个性化推荐系统中,通常是由挖掘物品属性来理解用户兴趣,从而构建推荐模型。从用户行为去理解物品属性往往做得比较简单,通常只是一些简单的标签统计。为了深入到用户行为去理解内容,美拍利用用户的点击、播放行为对视频的内容进行聚类,一方面打破了从视觉角度去理解视频内容的限制,另一方面可以挖掘出非人工总结的分类知识,从而提升个性化推荐的效果。
在第九期美图技术沙龙中,来自美图公司的白杨介绍了基于用户行为的视频聚类方案,并探讨视频聚类在美拍推荐系统中的一些实践。
/ 聚类在美拍的应用场景 /
如图 1 所示,最左边的这个截图是美拍首页的 UI 界面,用户在这个界面能看到 4—6 个视频,视频聚类在此页面的应用场景如下:当界面展示的 6 个视频有 2 个视频是属于同一个聚类时不会间隔展示,这种情况下我们就会对视频展示做一个同聚类打散的操作,以保证用户在有限的页面中看到更多类别,做到推荐结果多样性。
图 1
第二是同类视频检索的应用场景。我们经常需要去寻找某一个视频的同类视频,或者说它相似的视频,这种情况下可以通过视频聚类来找到这个视频属于哪个聚类,再从这个聚类内找到相似的视频,达到快速检索的功能。
第三个应用场景就是通过聚类来发现一些小众视频,或者说发现一些短期热门视频,帮助产品做更好的运营策略。
第四个场景是推荐策略的拓展,可以用视频聚类来做一些常见的推荐策略。我们可以通过聚类来发现用户感兴趣的聚类是哪一些,比如用户感兴趣的聚类是美食、美女,那我们根据用户感兴趣的聚类推荐视频。
最后一个场景是把视频的聚类当做特征,加到排序模型来改善效果。以上就是视频聚类在美拍的五个比较重要的应用场景。
那怎么发现视频的内容呢?最直观的方法就是从视频内容或图象的角度来挖掘这个视频表达的信息,我们会从图象的角度挖掘出这个视频内的实体(例如图片里面的美食、宠物);第二,从声音的角度(如背景音乐或视频内的音频);第三,通过视频的文本(如视频的描述、评论、字幕等);最后,通过视频封面、关键帧、连续截图等发现视频讲述的事情。
与此同时以上方法也存在着缺陷:
视频内容 / 图象 : 需要先验知识 文本: 覆盖率不完整,描述不一定准确
因此我们从用户行为来挖掘视频的内容,用户行为由用户画像和视频画像构成。通过用户行为挖掘内容的应用场景如下:海量用户中其中大部分用户都看某两个视频,可推断出这两个视频可能有相同的受众(即这两个视频内容相关),进一步推断出这两个视频属于同一个聚类,这种方法不需要先验知识。
那么通过用户行为视频聚类需要解决什么问题?
1.海量数据。美拍每天的用户行为是以 T 级别为单位的海量数据,模型每天需要处理海量数据。
2.模型更新迅速。由于每天用户上传的新视频非常多,因此要以最快的速度去找到这个视频所属的聚类。
3.可解释性。要明白每一个聚类隐含的意思,例如这个视频同时属于美食和美女,那可以推断出这个是美女吃秀视频。
/ 视频聚类方案的演进 /
针对以上问题我们提出了四个解决方案,如图所示,是我们四个方案的演化历程。我们从最开始的 TopicModel 主题模型到 Item2vec 到关键词传播到 DSSM,我们接下来主要讲这四个模型的演化过程,以及线上的效果。
图 2
1.TopicModel-Item2vec-KeywordPropagation-DSSM
首先介绍视频的主题聚类 TopicModel,TopicModel 其实是一个在自然语言处理领域里很经典模型,可以从众多文档中挖掘出各文档的主题。通过这样的一个模型可以挖掘出各个文档都属于哪一个主题、挖掘出文档中的单词属于哪个主题。假设写文档的时候总共有 100 个主题,我们会先从 100 个主题里根据文档的主题分布选定文档的主题,选出主题之后又在从一个单词的主题分布中选取出单词,以此来完成写作。那么 TopicModel 是通过统计各个文档里面的词频、单词的共现,来推测出文档及单词的主题分布。
那么它如何应用在美拍的推荐呢?首先可以把用户行为理解为文档,然后把用户播放或者点赞过的视频理解成单词,这样就可以把用户行为数据用在 TopicModel 里得到聚类结果。
那么 TopicModel 如何满足前面说的三个需求呢?
1.处理海量数据。TopicModel 可以通过数据并行的方式来解决海量数据的问题;
2.更新迅速。针对新的视频,很快就能得到用户对新视频的行为,我们可以根据用户是属于哪个主题来推测出这个新的视频属于哪个主题,以此快速更新主题模型。
3.TopicModel 的可解释性是非常好的,我们可以很直观的去理解主题(聚类)大概是什么意思,也能得到视频在各个主题的分布情况,以此去判断分布结果是否符合现实中人们的理解。
解决了三个问题后就可以用 TopicModel 来做第一个方案,要解决四个主题模型最常见的问题:
1.模型评估。在做主题模型模型评估的时候,需要合适的方法来评估这个模型的质量。
2.建模方式。上文中提到根据用户行为来建模,就是以视频为单词来做建模,但是还有其它建模方式。
3.主题(聚类)的个数。主题个数在主题模型里面是经常需要调整的参数。
4.重复聚类。主题模型结构经常有非常多的相似聚类,这样会影响到聚类打散的场景,导致无法正确打散。
首先要解决的是模型评估,只有找到准确的模型评估方法,才能去对比各个方案的结果。
图 3
如图 3 所示,前面是主题模型里面比较常用的两个指标,下面这张图是两个指标在一次模型训练中的走势。可以利用这两个指标来判断模型是否收敛,当然这两个指标也可以简单来判断模型质量的可靠。将主题(聚类)的结果引入到排序模型中,利用排序模型的指标可以判断聚类模型效果的可靠性。想知道这样的聚类方案在后续应用上的效果如何,因此我们引入了第三个指标:排序模型。
有了这些指标之后解决第二个问题:建模方式。上文第一个例子是以视频为单词来构建的,那么反过来可以以用户为单词来做建模,即以视频为文档、用户为单词,对比这两种方案的三个指标可以发现:以用户作为单词时,三个指标都比视频作为单词高,但是它的训练时间却比视频单词来得长,需要达到 5 个小时。因为一个热门视频可能有 100 万个用户播放过,那么这个文档就有 100 万个单词,所以训练时间就会更长。
图 4
如图 4 所示,这两种建模方式在排序模型里面的效果,最下面的浅蓝色是线上的 baseline,纵坐标是排序模型的 AUC,我们发现引入了主题模型之后,不管什么方案都比线上的 baseline 有所提高,所以主题模型是有比较好的效果。
再对比第二个问题,我们发现这两个建模方案的 AUC 差别不大,为了让训练时间更短,倾向于以单词为方案。在取不同主题个数时,我们发现深蓝色的 AUC 和黄色的 AUC 也存在着一定的差别,那么这时候就要解决第三个问题,就是主题个数的选择。
主题个数与应用场景非常相关,根据上文提到的应用场景分类讨论:
1.小众视频聚类发现。尽量寻找低频、长尾的聚类,得去扩大主题的个数,根据经验发现主题个数在一千或者一千以上的时候,它的长尾视频聚类效果比较好。
图 5
2.把主题模型引入到排序模型。对比了各个主题个数 AUC 的情况,最下面依然是 baseline。上图的每一条线都代表着不同主题个数 AUC 的情况,我们发现主题个数提高到 100 到 200 的时候 AUC 变化不明显,截图是调研试验的结果,我们做了非常多次的调研试验之后,根据排序模型的各项指标 AUC、GAUC 等把主题个数定为 150 个。
3.聚类打散。在聚类打散场景下,我们发现在主题个数越少对分享指标会越有利。例如主题个数取 100 时,线上的人均分享提高了 8%,播放的指标却有一定的下降,然后把主题个数提高到 200 的时候,分享指标只提高了 2%,但它的播放指标也有一定的提升。
图 6
为什么会出现这种情况呢?可以这样理解,当主题个数比较少的时候,聚类粒度就会比较粗,也就是说用户在一屏 6 个视频中,会看到更多的类别。假设一个女生在朋友圈分享一个造型或编发视频,她一天可能只会分享一个造型、编发视频,即一个用户在一天中同一类视频分享的次数较少,因此增加她的视频推荐类别之后,更大概率的命中用户想分享的类别,从而提升了分享指标。但打散了之后用户感兴趣的视频类别会往后靠,用户的播放会有所变低。
那在提高主题个数的时候为什么两个指标都会有所提升?主要是因为打散提高了视频的多样性,聚类粒度较细,感兴趣视频不容易后靠,改善了用户的体验,增加了用户下拉,自然就带来了指标的提高。
最后一个问题就是相似主题。举个例子,一次模型训练之后我们得到两个相似的主题,这两个主题都是抓娃娃的视频,如果没有对这两个聚类做处理就没办法对抓娃娃视频做准确的一个打散。主题模型结果可以得到视频的主题分布,那对视频的主题分布做转置就会得到一个主题向量,这个主题向量每个维度都是视频属于该主题的一个概率,那么得到主题向量之后就可以做对每个话题做相似度计算,然后就可以合并相似话题,这样就能把两个抓娃娃甚至是别的一些其他相似聚类做合并,提高聚类打散的准确性,以上就是我们把主题模型运用到视频聚类的一些问题。
图 7
总结一下 TopicModel 的优缺点:
优点: 主题模型用起来比较简单,只需整理好用户行为,然后将整个的用户行为理解为文档用到主题模型里就会产生想要的聚类效果。 缺点: 聚类粒度比较粗。例如在 NLP 领域对很多新闻的语料做主题挖掘,可能会得到一个娱乐类新闻的主题,这个娱乐类的主题其实可以更细粒度(得到娱乐类新闻是哪些明星的聚类),而主题模型很难做细粒度的优化。
如何得到更细粒度的聚类呢?可以引入第二个方案 Item2vec。
2.TopicModel-Item2vec-KeywordPropagation-DSSM
Item2vec 其实是把 Word2vec 应用在我们推荐场景下的一个变种。
图 8
首先简单介绍一下其中的 SkipGram 模型。如图 8 右侧所示,这是一次正样本采样的例子,SkipGram 的主要目的是挖掘出各个单词和它语境相似的单词有哪一些。可以这样理解,是不是可以把模型用在用户行为上,和主题模型建模类似,把视频理解为单词,利用模型找出相似的视频有哪些。那怎么训练模型呢?图中蓝色框代表一个输入的单词,那白色框代表输出的单词,我们把输入和输出这两个单词整合成一个单词对,这样的单词对输入到网络结构中,网络就能学习出每个单词语境相似的单词有哪些。
这个模型跟主题模型对比有什么优势呢?为什么它的粒度会更细?将它采样的这个窗口跟主题模型进行对比,主题模型分析的是用户完整的行为,比如用户的一个月行为理解为一个文档,那么主题模型统计的是一个月内视频的共现信息,而 Item2vec 更注重的是这个视频附近的视频的共现情况,因此今天点过的视频之间相关性明显比今天点过的视频与1个月前点过的视频相关性高。因此这个模型的粒度会比主题模型更细。第二个优势就是它是一个简单网络结构,可以加入到其他深度学习的任务里做 end to end 的优化。
词向量在 NLP 领域有个有趣的类比关系,那视频向量也有一些比较有趣的类比结果。比如说在去年比较火的微信小游戏「跳一跳」,我们去找一个猫玩跳一跳的视频时找到这样一个向量,然后把它减去狗玩跳一跳视频向量,就可以类比出它是约等于猫的视频向量减狗的视频向量,这个类比代表产出的视频向量。它隐含的不仅是简单的实体信息,它可能还隐藏着一些其他的层次信息,同理可得,美女跳舞然后减去帅哥跳舞的视频向量可以类比成美女视频减帅哥视频的视频向量。
接下来是聚类的对比,为了让聚类的粒度更细,我们以一个视频的相似视频来对比聚类的力度。以美食视频为例,找到主题模型及 Item2vec 里面最相似的视频做一个对比,发现主题模型内聚类的含义是较高层面的信息,这些相似视频都是属于美食,只有少数视频可以细分为食谱、做菜的食谱,Item2vec 得到的两个相似视频很明显地从封面上就能感觉到更准确:都是吃秀视频,甚至内容非常相似的,显而易见新的聚类方案粒度更细。
图 9
我们把视频聚类作为一个特征加到排序模型中,AUC 得到了很大的提升,回顾上文提到地主题模型 AUC,当时的提升只有千分之一到千分之二,而 Item2vec 的聚类特征达到了千分之九,效果十分显著。
第二个场景是扩展推荐策略的一个方案,就是利用模型产出的视频向量对视频做聚类,找到用户感兴趣的聚类之后这个来召回推荐的视频,排序召回视频后做一个推荐,这个推荐策略在线上效果有 4%的提升,效果同样非常明显。
介绍完 Item2vec 总结一下优缺点:
优点: 聚类力度更细。 缺点: 稳定性差。 为什么要说它稳定性比较差呢?假设现在有一堆视频向量要做聚类,用最简单的方法(比如 kmeans )来做聚类,第一次聚类后 ID 为 0 的这个聚类可能代表的是美食,那第二次我们用这些向量再做聚类,ID 为 0 的这个聚类还是美食吗?肯定不是,所以说它的稳定性比较差。 稳定性差有什么影响呢?如果把聚类 ID 做为特征加到排序模型中,但是聚类 ID 隐藏的含义每次训练都不一样,对特征工程会有很大的影响,需要去做一些繁琐的工程工作,因此我们是想做一个稳定性较强的聚类结果。 基于用户行为来做存在一些低频的视频,所以准确率较差。
那如何解决以上两个问题呢?我们引入文本信息,利用文本总结聚类的含义、提升低频视频的准确度。
3.TopicModel-Item2vec-KeywordPropagation-DSSM
而用文本来做聚类也会出现问题,首先文本的覆盖率会比较低,以美拍为例,上传视频时不是每个用户都愿意填写视频的描述;第二个问题是视频描述的错误,填写描述时用户可能想蹭热点,就会写一些热点话题在描述里,但实际上视频并不属于这个话题;第三是抽取关键词时需要维护一个长尾单词库,因为我们想找出一些小众、新鲜的视频聚类。
为了解决这三个问题我们调研了传播方式。假设现在面前有一张图,图里面的节点是视频,然后视频与视频之间的关系为图中节点与节点之间的边。有些视频有关键词,有些视频没有,于是可以利用节点之间的边把关键词传播到没有关键词的视频上去。
图 10
首先将图内的节点初始化,给每一个节点(视频)一个唯一的标签,那有关键指标的视频就直接给它赋值关键词,没有关键词的节点保持初始化的唯一标签;第二步利用视频与视频之间的关系传播标签;标签传播之后我们会更新每个视频的标签,一个视频可能会获得从其他视频传播过来的很多标签,最简单的合并方式就是取本次传到该视频中数量最多的标签作为该节点的新标签。然后判断传播过程后整个图的标签变化情况,如果整张图的变化情况比较少(小)可以认为已经收敛。
那如何利用用户行为来解决呢?可以使用用户行为来构建这张图,比如有 100 个用户同时看了视频 A 和视频 B,那视频 A 和 B 这两个节点就会用一条权重为 100 的边相连,而图里的节点和边可以用来传播关键词。
回顾前面的流程:首先会从视频的描述、评论和字幕中提取出视频的关键词,然后通过用户行为来构建这张图,接着利用图传播关键词,这样每个视频都能得到传播关键词,最后使用 N-Gram 进行聚类,线上则采用 Bi-Gram 的方式。
这个关键词传播效果如下:
- 提升覆盖率 非常多的没有关键词的视频可以通过传播得到关键词,覆盖率现在已经达到了95%。
图 11
- 文本描述纠错 如图 11 所示,左下角的视频是一个编发、造型视频,但它的描述是「#好想你手势舞#双击支持一下哦」,这个描述与视频完全无关,只是单纯的蹭热点行为。通过用户行为构建的图,这个造型编发视频周围也是一些造型编发视频,那就可以用准确的关键词覆盖原有的错误关键词,完成视频描述的纠错。
- 发现小众视频的聚类 如果关键词库内没有「藏舞」这个词就抽取不出这些视频的准确关键词,自然也完成不了聚类,但是利用关键词传播能实现这样小众聚类的发现。比如有一百个「藏舞」视频,在关键词初始化第一步,由于抽不到关键词就会给这一百个视频都赋值一个唯一的标签,那在做标签传播的时候,它就会跟周围的「藏舞」视频做传播,最后他们的标签(关键词)都会趋于一致,收敛成它们节点之间权重最高的标签。因此就可以找出本来没有在关键词库里维护的小众聚类。
回顾聚类模型 Item2vec:首先用主题模型和词向量做聚类,属于无监督,紧接着利用关键词传播做一个半监督,利用存在关键词的视频以及视频与视频之间的关键词完成一个半监督的模型。那是否有一种有监督的方式来提高视频聚类的效果?这时候我们引入了深度模型 DSSM。
4.TopicModel-Item2vec-KeywordPropagation-DSSM
DSSM 初始应用场景是搜索。简单介绍搜索场景,在百度搜索输入「美拍」这个单词就会得到非常多跟美拍相关的网页,可能有美拍官网、美拍相关新闻或美拍的百度百科,我们可能会选择点击美拍官网,那一次点击行为就可以理解为正样本,同理也可以把一次视频的点击理解为是一个正样本,然后把用户不喜欢的行为、视频理解为负样本,若不喜欢的视频较少可以用曝光未点击的数据来充当负样本。
图 12
在 NLP 场景下解释 DSSM:首先得输入内容,如图 12 所示,左边的 Q 可以理解为在百度输入单词,那右边的 D 可以理解为搜索后展示的网页标题。紧接看第二层 word hashing,主要是 NLP 场景下的降维,比如五十万个的单词的维度降到三万,那在美拍视频场景上怎么做呢?可以利用上文提出的模型(如主题模型、Item2vec)来接入这层。接着是 DNN 映射到 128 维度的语义空间,然后是匹配层,一个利用 cosine 相似度来计算 Q 和 D 的相似度。最后是用 softmax 把相似度转化为后验概率。那模型应用于美拍推荐时,Q 就可以理解为用户,D 理解为视频,然后利用用户行为做弱监督学习。为什么说它是弱监督的模型呢?主要是因为负样本(即曝光未点击的视频)不一定是用户不喜欢的,有些未点击的视频可能只是排序较靠后,因此说是弱监督模型。
DSSM 在美拍采用了如下改进方案:首先在美拍播放视频分很多种场景,最常见的是在首页播放,除此之外还有其他来源,比如在关注的作者列表里播放视频、搜索之后点击视频等,在不同来源里用户点击的目的或者行为特征是不一样的。我们把不同来源进行拆分,让它们共享一个用户模式,学习用户在不同来源播放视频的目的;上文提到 DSSM 最下面的输入是 bag of word 的形式,因此我们引入了 LSTM,希望模型能学到更多的上下文信息来改善模型学习出一些用户长期的一些兴趣。
回顾 DSSM 带来的效果,最开始主题模型 AUC 的提升是 0.1%,Item2vec 提升了 0.9%,到最后 DSSM 提升了 1.3%,效果非常明显。而且需要注意的是前两个模型(特别是主题模型)需要训练数据非常庞大,可能要利用两周甚至一个月的用户行为,而 DSSM 只需两三天的行为数据就能得到一个比较好的结果。
图 13
回顾我们四个聚类方案发展路径,最开始之所以用主题模型,是因为它用起来比较简单,而且它的可解释性非常强;紧接着有细粒度聚类的的场景,因此引用了 Item2vec 聚类方案;第三个方案关键词传播主要是用文本来稳定聚类,并且提升一些低频、小众视频的聚类效果;最后一个方案 DSSM 利用有监督的方式提升用户、视频向量的结果。
/ 未来展望 /
首先是多层次,我们视频聚类目前都是只有单一层次,其实可以得到非常多的聚类,就比如说美食还能得到麻辣烫、面食、蛋糕等聚类,并且这三个聚类是有层次关系的,但目前我们的方案都是没有层次感,可以利用文本的层次感来解决层次聚类的问题。
图 14
第二是实时性,我们希望能让聚类在线分析、更新视频属于哪个聚类,更想在线得到新的视频,当它有了少量的用户行为后,马上得到该视频的聚类。
第三是准确率,对于准确率有非常多的方案,比如可以在 DSSM 上引入用户画像特征或视频画像来改进视频向量,完善视频向量之后就能得到更准确的视频聚类。
以上就是我们短期内要实现的三个方向。
-------------
作者介绍
白杨,美图云事业部高级算法工程师。曾参与人工智能客服研发、知识图谱构建,具有 4 年机器学习算法实际落地经验,对于聚类在各领域的应用有丰富的研发和优化经验。目前在美图云事业部大数据与 AI 团队的个性化智能组,负责美拍视频聚类的研发以及聚类在个性化推荐系统的应用。
----------