LiveBot是微软亚洲研究院2019的文章,2020读过,觉得蛮有趣。前段时间,因缘巧合看了Response to LiveBot [看标题时候,还没意识到是给livebot找bug],一瞬间又想起了这篇文章。因此放在一起,记录下,便于后面工作应用。
现在很多视频网站都有弹幕功能,方便观看者进行信息交互。LiveBot,俗称弹幕机器人,是基于b站数据,根据视频帧信息及对应的弹幕信息,再生产新弹幕的模型。
图示四种文本生成任务:
- image captioning:图文描述,输入视觉信息,输出文本信息;
- vision question answering:视觉qa问答,输入视觉信息和文本信息,输出文本信息;
- machine translation:机器翻译,输入和输出都是文本信息;
- live commenting:LiveBot,输入视觉信息,以及依赖视觉信息的文本信息,输出文本信息。
4和2的最大区别,就是输入文本是否依赖视觉信息,更精确的说,2的输入视觉和文本信息是对齐的,而4的文本信息不仅与当前帧信息对齐,还可能是视频帧之前or之后【比如“前方高能预警”】的信息,或者是对之前弹幕信息的再反馈【比如弹幕的battle】,从逻辑上看更加复杂。
LiveBot的主要贡献
- 首个做弹幕机器人任务的;
- 构建了弹幕数据Live Comment Dataset,包含2361个视频及对应的895929条评论信息;
- 提供了2种融合视频和文本信息的模型方案,fusion RNN和unified transformer model;
- 提出了检索式retrieval-based的评估方案。
数据构造
数据收集
基于b站的搜索排行,爬取前10页的视频结果。搜索的信息包含宠物,体育,娱乐等19个类目。经过视频去重,过滤短视频,低质视频,以及弹幕少的视频的预处理后,共得到2361个视频。
对每个视频,抓取弹幕,及弹幕出现的时间戳。经过结巴分词后,一共得到895929条【弹幕,对应视频,弹幕出现视频时间戳】信息。
如下图所示,abc为三个时间对应的视觉信息,下面列表为每个弹幕出现的视频时间。比如,48s时,有弹幕“橘猫是短腿吗”。训练测试数据
为避免过拟合,训练和测试数据中的视频是不重叠的。
和其他数据集对比
YouCook和TACos-M-L:厨艺领域的数据集,针对行为描述;
M-VAD和MPII-MD:电影领域的数据集。
表格中的数据集,大部分数据量不大,且都是专有领域的数据,本文收集的数据从数据量,内容多样性,复杂度上,都有优越性。
数据分析
- 弹幕文本长度都偏低,大部分都低于5个词or10个字,这个长度的中文满足用户快速传递简短的信息的需求,符合弹幕的特性;
- 相邻弹幕的相关性分析,对每个评论,选择相邻的20条弹幕,计算他们之间的tfidf,编辑距离,以及人工打分。同时,还对不同时间间隔[小于1s,1-3s, 3-5s,5~10s,大于10s]的评论对进行相关性打分,结果显而易见,时间间隔短的[相邻弹幕],相关性强于非相邻弹幕。
模型结构
前文提到,LiveBot的弹幕,不仅仅和视频内容有关,还可能和其他弹幕内容有关。当前的弹幕,可以是对当前帧的内容理解,也可能是对之前或者之后视频内容的理解,还可以是和其他弹幕的互动。
对上述复杂的依赖关系,文中提出2种模型架构。
基本定义
type | concept |
---|---|
V | 视频 |
f | 视频的一帧 |
t | 对应帧的时间戳 |
C | 围绕这个时间戳的评论集 |
I | 围绕这个时间戳的帧集合 |
对长视频来说,如果将一整个视频和所有弹幕信息作为输入,不是很合理。因此,文中对一个视频,只输入m个帧信息,以及时间t时的n个评论作为输入。具体可表示为:
视频帧集合:,时间间隔为1s
弹幕集合:
输出弹幕token集合:
输出的弹幕,时间戳和输入时间戳相近,内容可能和视频相关,或和弹幕相关。
Model1: Fusional RNN Model
Fusional RNN Model由video encoder, text encoder和comment decoder组成。
Video Encoder
m个连续帧信息经过CNN编码后,经过双向LSTM,得到视频信息。
- 每帧经过CNN得到向量:;
- m个帧信息视为序列,经过LSTM,得到向量:
Text Encoder
对每个弹幕进行词级别的编码,再进行句子级别的编码。
- 对弹幕分词,经过word-level LSTM:,得到的就是该弹幕的语义信息;
- 将所有的弹幕信息经过sentence-level LSTM后,和视频信息做attention,得到融合文本和视频信息的表达:
Comment Decoder
生成的评论和周围的弹幕及相关的视频信息可以表示为:
生成的每个词可以表示为:
Model2: Unified Transformer Model
顾名思义,就是将之前的LSTM转换成Transformer。
同样由2个encoder和一个decoder组成。
Video Encoder
- ;
- 经过CNN的所有帧向量集合:
Text Encoder
1.n个弹幕拼接,结巴分词,得到词序列:
2.
Comment Decoder
生成的评论和周围的弹幕及相关的视频信息可以表示为:
每个词的概率分布可表示为:
评价指标
弹幕内容多种多样,模型的产出不能直接找到对照的候选集,因此常见的BLEU,ROUGE的评测方案就不合适了。受对话模型的评估方法启发,文中提出了一种基于log-likelihood的候选集排序方案。当模型生成的评论有很高的分数时,那么在候选集排序时,模型就能将正确的弹幕排在前列。
候选集的选择
- Correct:对应视频真人弹幕;
- Plausible:50个和视频标题最相似的弹幕。视频标题作为query,基于tf-idf对训练集中的评论进行cosine相似计算得到。其中30个评论非Correct的,作为Plausible。换句话说,有30个弹幕不是对应视频的弹幕,而是基于相似计算从训练集检索得到;
- Popular:频次最高的20个弹幕,比如‘2333’,‘太棒啦’,‘哈哈哈哈哈’,这类万金油评论,被视为不正确的评论;
- Random:除了上述3种弹幕,还随机选择其他弹幕,将候选集扩充到100个。
排序指标
- Recall@k:topk推荐中,真人评论占比;
- Mean Rank:真人评论排序求平均;
- Mean Reciprocal Rank:真人评论排序倒数求平均。
真人评价指标
评分标准[1,2,3,4,5], 越高越好。
- Fluency:流畅度;
- Relevance:生成的弹幕和视频的相关性;
- Correctness:生成的弹幕是真人弹幕的置信度。
实验
Baselines
- S3S-I:使用CNN,输入只有视觉(相邻5帧视频)信息,输出评论;
- S2S-C:使用LSTM,输入只有弹幕(相邻5个评论)信息,输出评论;
- S2S-IC:使用LSTM,输入包含视觉和弹幕信息,分别编码,输出评论。
结果
对baseline模型进行评测,结果显示,联合视觉和文本信息生产的弹幕优于comment only 优于 video only。
####################################################
2020年囫囵吞枣的看完LiveBot[1]后,留下的印象是,以后做论坛式多模态生成时,可以尝试下。虽然知道作者有公开code,草草略过就罢。前两天看到Response to LiveBot[2],作者复现了LiveBot公开的Unified Transformer model代码,发现模型结果比LiveBot的baseline差,进而发现代码漏洞,并重建了代码。
OpenNMT-Livebot code: https://github.com/fireflyHunter/OpenNMT-Livebot
####################################################
Candidate Set Ranking [Issue #1-2]
对候选集的排序,原code通过cross-entropy进行降序,而paper中提及到好的候选集应该排在前列,意味着cross-entropy应该升序。
这个问题在github已被其他研究人员指出[GitHub Issue]。
修改这个排序问题后,模型得分升了一点,和[GitHub Issue]的结果接近,但仍远低于LiveBot的baselines。Candidate Scores [Issue #1-3]
候选集得分计算,原code使用的是每个token的cross-entropy的和,而不是平均。这种计算方式对短文本很友好,作者发现,重排候选集,排在前面的很多评论都只有一个词。
原code的计算:
本文:
#Valids为候选集的非padding的token数量。
更新这个问题后,模型效果接近LiveBot的baselines。Construction of the Plausible Set [Issue #1-4]
构建Plausible候选集时,原文介绍是基于视频标题进行的检索。实际发现,是根据当前的上下文评论(围绕真实评论的评论)进行的检索。
因为原始数据和生成的数据集的映射关系原文没有提供,因此无法基于原始数据重建新的数据集,只能根据原文方案,根据视频标题重建Plausible候选集。-
The training/Testing Set [No duplicate]
前文提到,LiveBot构造了含有2361个视频和895929个弹幕的数据集,且训练集和测试集是无交集的。
实际17771个评论有5436个重叠。虽然有些常用评论可以用在不同的视频下,但有些针对视频的特殊评论,也出现在训练集和测试集了;
另一方面,在原始数据中,通过视频标题区分视频时,发现有38个视频重复多次。
因此,基于原始数据,去重,再重建数据集,结果如上图。
每个issuse解决后的结果如下: