一个独立开发者花了一年时间、十四轮实验,训练出一个1.25亿参数的模型,专门做一件很小的事:接上MIDI钢琴,弹几个音符,AI接着往下弹。它跑在iPhone 15上,速度是每秒108个音符,比任何人类演奏需要的都快,已经装进一个叫RollTab的免费iOS应用。这条新闻本身不大,但里面藏着一个很多AI项目回避的问题:模型多大才够用,数据多少才算够,答案未必是"越大越多"。
MIDI是事件流,天然适合当"下一词预测"来做
MIDI记录的不是声音,是按键、力度、踏板这些事件,结构上很像文本序列——弹出的音符是上文,续写的音符就是下一个token。区别在于代码补全能停下来挑一挑再采纳,弹琴不能停,双手已经占满,续写必须实时、不能打断。
编码方式,比模型大小更决定跑得快不快
最直接的做法是给每个音符的开/关做单独token,小模型常常忘记关,留下悬音、状态漂移。改进版把音高、力度、时长拆开,用语法规则强制合法输出,更稳但慢——生成一个音符要跑四次前向传播,上下文窗口很快耗尽。
最终方案把音高、时间差、时长、力度打包成一个复合token,一个音符只需一次前向传播。这才是108音符/秒的真正来源:不是模型变小了,是每一步做的事变多了。延音踏板也没单独建模,预处理阶段直接把音符时值拉长到抬踏板为止,省掉一个维度。
数据翻5倍,效果反而更差
训练语料最终是几十万个MIDI文件、约3亿个音符事件,以公共领域古典钢琴曲为主。清洗流程剔除多轨乱炖的素材、按密度过滤、按移调和变速去重、把同一首曲子的不同版本放进同一个数据分割,避免训练和验证撞车。
作者试过把数据集扩到5倍,指望更多数据换更好效果,结果模型反而变差——新增数据噪声更大,拖累了整体质量。这条教训比108音符/秒更值得记住:小模型时代,洗数据的收益可能高于囤数据。
DPO才是真正的分水岭
预训练完的模型只是偶尔弹得不错。真正让它稳定输出好续写的是DPO——对同一个提示生成多个续写,用AI评委成对打分挑出更好和更差,让模型学着更倾向那个更好的。
评判标准也调整过:一开始AI评委容易被"单独听起来顺不顺"带偏,后来拆成续写跟随度和独立听感两个维度,前者才是DPO真正优化的目标。基础模型在成对偏好里只能拿24.55%的胜率,DPO之后最好的配置能到69.05%。约束力度也不是越大越好——从0.01加到0.03效果都在提升,加到0.10反而把模型推得太远,胜率掉回38.10%。
模型看着更快更小,真正撑起体验的是后训练那一刀。
好听的demo,离好用的工具还有距离
这套方案证明的是:小模型加对的编码、加干净数据、加DPO,能在手机上跑出实时连贯的续写。没证明的是长程结构——音符级续写能保证局部顺耳,一段旋律有没有清晰的乐句和风格一致性,靠几个到几十个音符的提示很难验证,提示音符越少续写越随意。
- 风险.训练语料以老式古典公共领域曲目为主,模型是在创作还是在背谱,目前没有去重验证或"留出作曲家测试"的证据。
真实弹奏时双手和注意力都被占满,AI建议什么时候插进来、会不会打断节奏,这是比推理速度更难量化的问题,目前也看不到相关数据。108音符/秒证明的是速度,不代表有人愿意采纳。
从"给钢琴接上Copilot"到跑通一个手机上能实时干活的模型,一年、十四轮实验,教训比结论多:编码方式比模型大小更决定速度,数据干净比数据多更决定质量,后训练比预训练更决定好用不好用。对独立开发者来说,这可能是比堆更大模型更划算的路——demo顺耳,和真正帮人弹好琴,中间还差一段没被量化的距离。
