我想知道能不能训练一个模型,写出人们真正会点赞的 YouTube 评论。最直观的训练信号就是点赞数,而最近已经有工作这么做了:在点赞数前 10% 的评论上做微调,报告的互动量大约是用随机评论训练的模型的 3 倍。

接着我去看了点赞数究竟在衡量什么。一条在视频上线第一小时内发布的评论,看到它的人数比一周后发布的评论要多出好几个数量级,而 YouTube 的「热门评论」排序还会放大这一点,因为排得高会带来点赞,点赞又会让它排得更高。两条一模一样的评论,仅凭出现时间的差别就能相差三个数量级。

于是问题不再是「模型能不能写出好评论」,而变成了「点赞数里到底有没有关于评论本身的信息」。

用公开数据回答不了这个问题

两个大型公开 YouTube 评论语料 YT-30M 和 YTCommentVerse,合计约有 3200 万条评论。两者都给了 upvotes,但都没有给时间戳。

没有发布时间,你就无法把评论说了什么和它何时出现区分开。在这些语料上训练的每个模型,都在拟合那份先发优势,却完全看不见它。

所以我自己采集了一份带时间戳的语料:来自 34 个频道、633 个视频的 1,345,353 条顶层评论,包含发布时间、抓取时间、回复数、视频统计数据,以及 YouTube 自家算法给每条评论的排名。耗时三天,约 14,900 个 API 配额单位。

有一个决定比其他都重要。commentThreads.list 返回评论时是最新优先,因此任何按视频设置的翻页上限都会丢掉最早的评论,而那正是本研究关心的高曝光评论。所以每个视频都被完整枚举。体量太大、无法在当日配额内跑完的视频,一开始就被排除,并记入清单,而不是被悄悄截断。

曝光占了 83.5%

预测每条评论在自己所属视频内的点赞排名,这样就把视频层面的效应从训练信号里剔除了。然后逐项加入特征:先是曝光特征,再是长度与形态,接着是 20 万维 TF-IDF 特征,最后是 MiniLM 嵌入。按频道切分,绝不按评论切分,这样问的就是模型能否迁移到它从未见过的受众。

成分 超越随机水平的排序能力占比
曝光(发布时间、视频体量) 83.5%
长度与形态 8.4%
评论实际说了什么 8.2%

评论长度可以说算内容,而不算曝光。若这样计入,内容就升到 16.5%。无论如何曝光都是 83.5%,所以这个结论不取决于你把界线划在哪里。

让我下定论的数字是:一个 384 维的句子编码器相比词袋只带来 0.0015 的 AUC 提升。对词汇层面零结果的常见反驳是文本模型太弱,而一个完全不同的表示族落在了同一个位置。

整体上绝对可预测性很低。最好的模型 AUC 为 0.671,随机水平是 0.5。曝光大幅领先内容,而两者都比不过决定哪些评论会被点赞的其他因素。

这份数据集里的陷阱

同一批 135 万条评论在两种分组下,按出现时间的 log1p(likes) 均值 两幅图是同一批评论、同一 y 轴。视频内的相对位置和视频上线时长都呈现同样的下滑。

我一开始把这个搞错了,你在动手处理数据之前应该先知道。

按评论发布得多晚来分桶,取每个桶的平均点赞数

发布时视频已上线时长 <1h 1-6h 6-24h 1-7d 1-30d >30d
平均点赞数 19.8 21.7 19.5 19.8 25.8 20.4

一条平线。完全没有出现时间效应。我还把它当成一个发现写了出来。

现在在完全相同的分桶上取 log1p(likes) 的均值:

发布时视频已上线时长 <1h 1-6h 6-24h 1-7d 1-30d >30d
log1p(likes) 均值 0.764 0.387 0.230 0.181 0.163 0.129

下滑达 5.9 倍。这个效应一直都在。

82.1% 的评论零点赞,而点赞数最高的 1% 占据了全部点赞的 94.9%。在这样的分布上取组均值,得到的是关于该组离群值的统计量,而不是关于这一组的。一条爆火评论就决定了整个桶的平均值。

任何对这份语料做原始点赞数平均的汇总,都会在效应很大的地方报告出没有效应。

认定 3 倍的那个指标

此前的工作给生成评论打分的方式是:把它嵌入,从参考语料里取出 K 个最近邻,再对它们的点赞数求平均。我原以为这个指标可以靠「像不像」来钻空子:在高赞文本上训练,落到高赞文本附近,就能拿高分,不管人类会不会真的点赞。

我错了,而且错了两次。挑选真实的高赞评论并不能复现出 3 倍的比值(我得到 0.88 到 1.21)。生成 960 条评论、其中一半用高赞样例做少样本条件生成,也不行。

我反而发现这个统计量根本稳不住。在 K=5 时,均值之比显示条件生成让结果差了 3 倍,且置信区间不含 1.0。而在同样的 480 个样本上,中位数之比却显示好了 2 倍。三次运行中,同一个数字先是 138,然后 0.09,再是 0.25(按均值),按中位数则是 2.00。

同样的重尾,与我上面自己犯的错误是同一种失效模式。一个方向会随汇总方式翻转的指标撑不起 3 倍的论断,无论某个已发表数字是怎么得出来的。

它对自己所估计的东西也几乎追踪不上。对照真实点赞结果,它对评论的排序只有 Spearman 0.050。而一个只知道评论何时发布、视频有多大的模型,在同一批评论上得到 0.19。

如果你只是想让自己的评论被看见

把同样这些数字对准人而不是模型,它们就读成了一套策略。大致按影响大小排序:

要早。在同一个视频内,最早的那一成评论平均是最晚一成的 5.4 倍。按视频上线后的绝对时间看,第一小时内的评论是一个月后发布的评论的 5.9 倍。你能控制的其他任何因素都远不及它。

在大视频上抢早。视频体量会放大其他一切。在原始数据里,NileRed 一条上传视频下晚了六周发布的评论,仍然胜过 Computerphile 视频下第一小时内的评论。500 万播放视频下一条平庸的评论,表现好过 7 万播放视频下一条不错的评论。

评论首页才是真正的奖品。显示在上面的评论平均 419.5 个赞,其余全部只有 1.13。这是 373 倍的门槛,不是渐变的坡度,而且由于排序依赖早期点赞,买到入场券的正是第一小时。

挑频道。零点赞评论的占比从 Vox 的 52.8% 到 Davie504 的 90.7%。在你写下一个字之前,光是选在哪里评论,就能让你拿到任何点赞的概率差出近一倍。

在 Shorts 上要更快。那里的早发优势是 7.6 倍,长视频是 5.3 倍。

你写了什么大约只占 8%。它呈现的形态是短。评论平均长度随点赞上升,随后反转:100-999 赞档为 171 个字符,1000 赞以上降到 147。语料里的顶级评论是对某个具体瞬间的浓缩呼应,而不是展开的观察:

炼金术士最恨这一招

这段视频几乎全是灰度的

那句硬憋出来的「支持本地小店」把我笑到了

引用一个瞬间,压缩它,然后收住。

有两点重要的限制。所有评论中 82% 零点赞,而即便用上我构建的全部特征,模型的排序 AUC 也只有 0.671,所以这里面大部分是你控制不了的方差。另外我衡量的是什么能预测点赞,而不是什么导致点赞。时机效应大概率是因果的,因为它是机械性的曝光。而「短呼应」很容易只是别的因素的相关物。

诚实的总结是:取胜的策略主要靠调度安排,而不是写作。

由此得出的结论

以点赞数为目标去优化评论生成器,主要是在对着一只时钟做优化。在高赞评论上训练的模型,学到的是大视频下早期评论长什么样,而可归因于评论内容本身的部分大约只有 8%。

这并不意味着评论质量无法衡量。它意味着衡量必须先对曝光做条件控制,而在此之前没有任何公开数据集能让你这么做。我接下来想做的,正是我没能做到的那一块:在曝光固定的条件下让人来评分评论,这份语料让它成为可能,但它本身并不包含这些评分。

数据集已发布在 Hugging Face,采用 CC BY 4.0 许可;代码和冻结的总体清单在 GitHub论文里有完整的特征阶梯、数据切分,以及我搞错的那些地方。