Sona Technical Report
Sona Team, Alexandr Udeneev, Aleksei Krasilnikov, Alexey Nadtochiy, Andrey Semenov, Andrey Tsyrkunov, Anna Krivonos, Anna Lipkina, Artem Matveev, Daniil Burlakov, Daniil Leshchev, Daria Tikhonovich, Denis Burshtein, Ekaterina Dmitrieva, Eugene Krofto, Grigorii Khlystov, Ilya Murzin, Kirill Golovko, Ksenia Sycheva, Leonid Dmitriev, Mariia Rozaeva, Mariia Ulianova, Mikhail Sandul, Nikolai Savushkin, Oleg Sorokin, Roman Odobesku, Semyon Panenko, Sergei Liamaev, Sergei Makeev, Vadim Shilov, Veronika Ivanova, Viktor Yanush, Vladimir Baikalov, Vladislav Dodonov, Vladislav Tytskiy
cs.IR
2026-08-11
在智能音箱纯推荐流上,Sona 用共享用户表征同时做候选生成和排序,换掉整条推荐级联,活跃用户涨 4.53%,收听时长涨 6.30%,点赞涨 11.42%。
听歌的反馈很瘦。歌在后台放,用户很少挑下一首,留下的多是播放和跳过,点赞偶尔才有。反复听熟歌是常态,重复就是信号。熟歌稳住当下的时长,新歌要过一阵才兑现。
Yandex Music 智能音箱上的 My Vibe 是纯推荐:开播不指定艺人、曲风或心情,也是听歌时长最大的面之一。线上级联有 15 个以上候选生成器,后面接预排序和精排。精排吃几百个特征,其中包括 Argus 这样的大 Transformer,以及 target-attention 打分器。V0、V1、V2、Argus 的增益已经留在对照里。Sona 换掉的是整条级联,涨幅要叠在这些增益之上。
生成和排序共用一次编码,一次请求不跑第二遍 encoder。输入按时间排,事件涵盖播放、跳过、点赞、点踩,外加曲目和场景,隐藏状态同时交给 decoder 和排序模块。
曲目不直接生成 ID,输出 3 个 Semantic ID,三个码本各 32000。冻结的 Qwen2.5-Omni 只做 prefill,吃前 90 秒梅尔频谱,加上标题、艺人、标签;四层四头、宽 512 的网络在协同对上精炼,池化到 256 维,再用残差 K-means 量化。协同对分两路:跨艺人的同屏共现,三周约 2.2 亿到 2.4 亿对;同艺人、高 NPMI 的共听,三个月约 2000 万对。损失是 InfoNCE,加权重 0.1 的对齐项。内容上接近的歌,听众不一定拿来互换,这一步补的就是协同关系。
评估束宽 1024,trie 约束保证三元组能对上目录。码有碰撞,一个三元组展开成那几首歌再排序。排序特征是曲目 ID、各级码和前缀 n-gram,对同一用户状态做 cross-attention,多头用平均绝对误差去贴冻结教师。服务时教师不在,多头用固定权重合成标量,这个标量不进损失。
教师更大,看一年的完整历史,不做压缩。学生离线窗口只有数周,上线后继续更新。一年的日志先压进教师,因为学生每条样本都要重编码整段历史。教师先对比学习下一个物品,再按 like、play、skip、dislike 做相邻曝光的成对排序。
学生损失是正样本的 next-token prediction,再加当前 decoder 的 rollout 和日志曝光上的蒸馏。训练束宽 32,梯度回到共享 encoder。
历史最长 8192 条。7 层深栈只打在最近 2048 条,更早的 6144 条走浅层,下游仍看见全长,推理成本大约一半。连续值只做分桶,不做手工交叉。权重 10 分钟一版,会话至少等 15 分钟,事件到上线中位 45 分钟、99 分位 60 分钟。样本按推理时的历史截止点重建。
涨点主要在表示。3×32000 码本配 Qwen2.5-Omni 协同精炼,Target-track Recall@10/100/1000 为 0.2171 / 0.5362 / 0.8524;同码本 CLMR 音频嵌入是 0.1848 / 0.4712 / 0.8111。码本从 3×8192 扩到 3×32000,Recall@1000 只从 0.8036 到 0.8111。
Medium 骨干、2k 历史、只扫一遍日志,训练窗从 1 周到 8 周,Recall@10 从 0.1798 到 0.2519,Recall@1000 从 0.8333 到 0.8947。核心参数 20M、130M、260M(含嵌入和输出头为 264M、485M、659M)时,NTP 训练损失随容量下降。
教师预训练的离线差很小:8k 历史、6 层打分器,weighted pair accuracy 从 0.6153 到 0.6215;8 层也只到 0.6219。线上实验 3 用完整两阶段教师替换生产精排,各 3% 用户,收听时长 +1.64%,活跃用户 +1.22%,点赞 +1.48% 未达 p<0.01。
没有排序头,decoder 似然贴不住教师的序。Teacher Recall@10 从无排序模块的 0.0381,到 1 层的 0.5654、4 层的 0.6005(2k 历史,编码器 7 层、解码器 2 层)。8k 全注意力、4 层排序头的 Target-track Recall@1000 为 0.8722,Teacher Recall@10 为 0.6586。History Compression 同设置为 0.8709 和 0.6474,WPA 0.6033 对 0.6029。最终模型用压缩版。
四种蒸馏损失没有一方通吃,后续固定 MAE。只蒸馏日志曝光时 Teacher Recall@10 掉到 0.2983,rollout 加曝光为 0.5654。训练束宽 128 为 0.5762,32 为 0.5654,留下 32。
实验 4 在 2k 历史上用蒸馏单模型换整条级联:活跃用户 +1.41%,收听时长 +1.62%,点赞 +7.12%。同一生成器交回教师重排,变为 +2.81%、+4.32%、+11.81%。这时单模型能上,仍明显弱于教师。
实验 5 把历史加到 8192 并启用压缩,各 15% 用户,跑 7 天,生产侧硬业务规则保留。下表相对对照的差异都达到 p<0.01。
| 指标 | 相对生产对照 |
| Active Users(主指标) | +4.53% |
| Total Listening Time | +6.30% |
| Likes | +11.42% |
| Repeat Commands | +17.99% |
| Deeply Engaged Users | +7.37% |
主指标 +4.53% 是 Argus 此前增量 +1.93% 的 2.35 倍,叠在前几代已经留在对照里的增益上。实验 4 和实验 5 分开跑,两者之差不能单独归到历史长度。
常见级联是多路召回加几百特征的精排。Sona 收成一次编码、一次短码解码、一次打分,线上不放教师。
被动听歌、会话又长的产品里,短码让新歌靠前缀进入生成,不必先攒够行为;权重 10 分钟一版,事件到上线中位 45 分钟,跟得上反馈。推理 MFU 41%,束宽 1024。实验 5 保留硬业务规则。对照已含 Argus,涨幅是成熟级联上的增量。
全量还没切。他们要先做数月长窗,并承认目录覆盖低于生产级联,原因未查。只测了音箱 My Vibe,搜索和歌单未做。强化学习没做,束宽以外的测试时计算也没做。
探索没有被测量。实验 5 里 Repeat Commands +17.99%,目录覆盖却更低。报告写明没看到探索变差,并归到训练日志来自生产,但没有新歌占比。时长和点赞的上涨,跟更会推熟歌相容,目前分不开。
预训练被写成换掉几百特征精排的关键阶段,离线却只有 WPA 从 0.6153 到 0.6215,在线没有这一项的消融。实验 4 到实验 5,活跃用户从 +1.41% 到 +4.53%,历史长度和别的改动混在两次独立实验里,论文写明不能当成因果。
线上是一个模型。教师仍看一年全历史并每天刷新,学生只在更短窗口上蒸馏。