Hulu 是美国领先的互联网视频流媒体平台,拥有大量的电影、电视剧等视频资源,对这些内容的理解和表示是 Hulu 的一个重要研究方向。Content Embedding 技术将内容表示为向量,以利于后续算法、模型的处理和分析。本次分享将介绍 Hulu 在 content embedding 方面的一些实践和尝试,包括 embedding 的生成及其在业务场景中的应用。
About Hulu
Hulu 是一个视频流媒体平台,主要由三个要素构成,分别是用户 (users)、内容 (contents) 和广告 (ads)。Hulu 的商业模式也是围绕着这三个要素进行的,即 Hulu 花钱购买内容资源并提供广告展示位,用户付费观看内容,广告主付费购买广告位。
1. Contents on Hulu
Hulu 提供了种类丰富的内容资源,主要是电影、电视剧,以及一些体育、新闻、儿童相关的节目;既有点播的内容 (VOD contents),也有直播频道 (LIVE channels)。
2. Content understanding in Hulu
Hulu 的内容理解可以分为四个不同的层次:
第 1 层,对视频的理解,比如检测和识别视频中出现的特定目标、事件、场景、明星演员、商标等,以及一些特定的片段(如片头、片尾、highlight 片段等);
第 2 层,对整个剧集(包括电影、电视剧)的理解,比如为每个剧打一些标签 (tags) 或生成向量表征 (embeddings),或者分析剧与剧之间的相关性等;
第 3 层,对 collection 的理解,这里的 collection 是 Hulu 页面上每一行所展示的剧构成的集合,我们需要为每个 collection 也生成一个表征,并分析不同 collection 之间的关系,以及思考如何用算法来辅助 collection 的创建;
第 4 层,对内容在 Hulu 平台上生命周期的理解,主要是分析用户与内容之间的交互信息。
3. Contents & corresponding metadata/videos
Hulu 上的每个剧集(电影/电视剧),除了最直接的视频资源外,还有一些与之相关的信息,包括剧的标题 (title)、简介 (description)、导演 (director)、演员 (actor)、主题 (topic)、类型 (genre)、标签/关键词 (tag/keyword)、获奖情况 (award)、分级情况 (rating)、字幕信息 (caption)、海报/封面图 (cover image) 等。
4. How to represent contents?
上面提到,与一个剧集相关的数据有很多(如下右图所示),它们具有不同的形式(标签类、文本类、图像、视频、音频等),从不同维度刻画剧集,具有丰富的信息。那么,如何综合考虑这些信息,给每个剧一个表征呢?表征,从某种意义上来说也是一种信息压缩,用更简洁、有效、本质的形式来刻画一个东西。典型的表征有如下几种:
ID 类型的表征,用一个 id(一般是数字或字符串)来表示一个剧集。这类表征只能反映出两个剧是相同的或者不同的(看 id 是否相同),不能带来其它额外信息。One-hot encoding 也是这类表征的一种形式。
标签类型的表征,用若干个关键词来刻画一个剧集,每个关键词具有一定的语义信息,比较方便人类理解。
向量类型的表征,用一个向量来标识一个剧集,这类表征可以很方便地用在后续的模型和计算中,对机器比较友好。我们接下来要介绍的 content embedding 就属于这一类表征。
Generation of content embeddings
1. Content embedding
Embedding 是数学上的一个概念,指把一个数学结构经过某种映射嵌入到另一个数学结构中,这个映射需要保持某种意义下的结构不变性。类似地,content embedding 是将剧集映射到一个低维稠密的向量空间中,并尽可能让内容相似的剧对应的 embedding 向量也比较接近。在 Hulu,生成 content embedding 时需要考虑多种不同模态的数据,包括标签类数据(导演、演员、类型、标签/关键词等)、文本数据(标题、简介等)、图像(海报、封面图等)、视频、音频等;另外,考虑到电影/电视剧都是长视频,要压缩为一个低维向量需要很高的压缩率,并且在算法的训练和测试过程中都没有 ground-truth 可以参考,因此生成 content embedding 还是一个比较有挑战性的任务。
2. Tag-based embeddings (Graph Embedding)
Step 1:
首先,介绍如何利用剧集的标签类型数据来生成 content embedding。前面提到,每个剧集都或多或少会有一些标签类型信息,比如导演、演员、类型、关键词/标签等,我们把它们称为该剧的属性 (attribute) 信息。由此,我们可以构建一个 content-attribute graph,其中剧集和属性是该 graph 中节点,它们之间的对应关系用 graph 中的边来连接。由于不同的剧可能有相同的属性(比如两个剧有相同的导演或关键词),这些共同的属性节点可以将不同的剧连接起来,如下图所示,最终会构成一个非常庞大的 content-attribute graph。
Step 2:
有了 content-attribute graph 之后,可以用 node2vec 技术为 graph 中每个节点(包括剧节点和属性节点)学习出一个 embedding 向量,其中剧节点对于的向量即为我们需要的 content embedding。大致的步骤是先根据 graph 采样获得一些 path,然后调用 word2vec 方法学习得到节点的 embeddings。我们略过细节,这里的基本思路是:如果 graph 中两个节点之间的 path 越多,则希望它们对应的 embedding 向量越接近。
3. To be improved …
上述基于 content-attribute graph 生成的 content embedding,有如下几个不足的点:
只使用了标签类型数据,没有考虑非标签类型的文本数据(如标题、简介等);
在标签类型数据中,GraceNote keywords 和 genres 是最重要的,但它们的覆盖率并不高,很多剧会缺失这些数据;
构建 content-attribute graph 时候,并没有利用上这些标签的语义信息(只根据标签是否相同来构建 graph 中的连接边);
在建模过程中,不同类型的标签之间没有足够的信息交互。
4. Considering non-tag textual data
接下来,我们思考如何利用非标签类型的文本数据(标题、简介等)。我们尝试了两种处理方法:
方法一:直接根据文本数据生成 content embedding;
方法二:先根据文本数据预测出一些标签,然后将预测的标签加到前面的 content-attribute graph 来生成更高质量的 content embedding。
上图是我们尝试的方法一,对于剧集简介,先用 BERT 模型得到句中每个 token 的 embedding,然后利用 SIF 算得每个句子的 embedding,最后将剧集简介中所有句子的 embedding 做平均后得到整个剧集简介的 embedding。这个方法的效果比较一般,接下来我们重点介绍方法二。
Metadata-BERT:
use metadata to predict/complement content tags
方法二,主要是先根据文本数据来预测剧集的一些标签信息,然后将这些标签加到 content-attribute graph 中,接着调用前面的 tag-based embedding 方法即可。我们对原始 BERT 模型进行了改进,使得它可以接受各种类型的数据作为输入,包括标签类型数据 (tag-like metadata) 和非标签类型的文本数据 (non-tag textual metadata) 。新的模型被称为 Metadata-BERT,它能根据输入的 metadata 信息预测出更多的 tags,可以作为原始标签数据的一个扩展和补充。Metadata-BERT 模型利用 GraceNote keywords 数据进行训练,在测试集上的标签预测准确率达到 83%(比原始 BERT 的 61%有显著提升)。将 Metadata-BERT 预测出来的标签添加到之前的 content-attribute graph 中,能够进一步丰富 graph 的节点和边,从而产生质量更高的 content embedding。
5. Further: how about visual/audio data?
除了上述提到的标签类型数据和非标签类型的文本数据,一个剧还有对应的音频资源和视频资源。与前面的数据不同,音视频信息是一帧一帧的,一部剧是由一个图片序列和音频序列构成的。如何将整个序列转化为一个 embedding 向量,这是我们需要重点考虑的地方。我们的做法是:先将整个视频的视频帧和音频帧抽出来,然后用一些神经网络(如 Inception/VGGish)为每个视频帧和音频帧提取特征,最后用一些聚合模型(如 NeXtVLAD/BERT 等)将帧级的特征聚合为整部剧的 embedding。整个模型可以借助一些诸如标签预测、推荐排序等任务来训练。
6. A try: two-level-BERTs for v/a embedding learning
我们做了一个尝试,用两层 BERT 模型来做推荐业务中的 CTR 预估任务,简单来说,就是先用一个 BERT 模型来聚合视频的帧级/片段级的特征,以得到每部剧的 content embedding 向量;然后再用一个 BERT 模型来聚合用户信息,主要是历史观看记录 (history_shows) 以及目标剧集 (target_show);最后再接 MLP 进行 CTR 预估。这个框架比较大,将 content embedding 的学习直接放到具体的推荐业务中,是一个 end-to-end 的学习过程;缺点是两个 BERT 模型体量太大,收敛不太稳定。
7. Overview: generation of content embeddings
上图是 content embedding 生成过程的一个概览图。图中的 content data 包括剧的 metadata 信息、视频文件和字幕文件,其中 metadata 又分为标签型数据和非标签型的文本数据,而视频文件又包含视觉图像和音频信息。针对不同类型的数据,我们采用不同的模型,从而产生不同的 content embeddings,而这些不同的 embedding 也融合成一个终极 embedding。在实际应用中,可以根据业务特点来使用不同类型的 embeddings,或者使用最终的融合版 embedding。
Applications of content embeddings
1. Content similarity
接下来我们介绍 content embedding 的一些应用。content embedding 最直接的应用是可以简单方便地计算两个剧在内容上的相似性(比如计算 embedding 向量的余弦相似性)。下图右侧是完全基于 content embedding 向量计算出的与“钢铁侠”最相关的剧,可以看到大部分结果都还是比较合理的。在推荐业务中,很多时候需要计算 show-to-show relevance,而内容相似性可以作为其中的一个重要因子(其它可能需要考虑的因子包括基于用户 co-watching 信息的相关性等)。Show-to-show relevance 可以应用在 Hulu 的 You May Also Like (YMAL)、UpNext 等场景中,下图左侧是 Hulu 的 YMAL 页面。
2. Content embeddings as features in TV/Movies ranker, PCS, etc.
Content embedding 的另外一个应用是可以作为很多算法、模型的输入特征。如上图所示,左边是 Hulu 推荐业务中对 TV/Movie 的排序模型,右边是对 Home 页面的 collections 的排序模型,这两个模型中都使用了 content embeddings 作为输入特征(图中绿色框所示)。
3. Content embeddings for content cold start (in Retriever)
Content embedding 在内容冷启动方面也有着重要应用。以推荐系统的召回模型为例,如果召回模型只是基于用户的 co-watching 信息(如下图左侧分支),这样对于新加入的内容或冷门内容,可能采集不到足够多的用户观看记录,从而影响召回效果。这时候可以根据 content embedding 来构建另外一个基于内容信息的召回分支(如下图右侧分支),然后再用一些方法(比如 gate 函数)将两个分支融合起来(如下图中间的分支所示),从而提升对新内容或冷内容的召回效果。
4. Collection modeling with content embeddings
前面提到,Hulu 页面上每一排展示的内容被称为一个 collection(一个 collection 也即若干个剧构成的一个集合)。在 Hulu 的 Home 页面,会根据用户的行为数据对 collection 进行动态选择和排序,这就需要大量的 collections 供算法选择,仅靠 editor 手动创建 collections 是非常低效和耗时的。这里我们尝试利用算法,从如下几个角度来加速 collection 的创建:
对已经存在的 collections 进行建模,从而可以对 collection 里面的剧进行扩展和更新;
在 editor 手工创建 collections 时,让 editor 可以根据 embeddings 或 tags 来搜索相似的剧集,或者直接根据 editor 已选的剧作为种子来自动推荐合适的剧加入到 collection 中,从而提高 collection 的创建效率;
用算法直接创建 collections,然后经过人工审核并命名后即可入库。
Thinking
最后,关于 content embedding 的一些思考:
如何评价 content embedding 的效果?是建立一套以内容为主视角的评价指标,还是看 embedding 在推荐、搜索等业务中的效果?
Content embedding 与具体业务场景之间的 gap。比如,content embedding 的训练通常与业务目标是分开的,如何保证 content embedding 在业务场景中的效果呢(泛化性能)?如何利用业务相关的数据集或任务来调整 content embedding 呢?是否可以直接用业务相关的任务对 content embedding 进行 end-to-end 的训练?是提供内容理解的数据(比如像 content embedding 这种),还是提供内容理解的能力(比如算法模块等)更好呢?
上述问题都是开放的,没有定论,欢迎大家思考和讨论。
今天的分享就到这里,谢谢大家。
嘉宾介绍:
江云胜,Hulu | Senior Research Lead。
本文转载自:DataFunTalk(ID:datafuntalk)
评论