Skip to content

JSB 巴赫圣咏重构

  • 来源:noai-train/联合训练/Day4/T2JSB巴赫圣咏 刘厚文
  • 类型:Misc / sequence reconstruction
  • 原始资料:题目描述.mdbaseline.pymetrics.pyDay4 ref/T2...
  • 题面完整性:完整
  • 解法资料完整性:有参考脚本;完整题解需结合代码推断

题面大意

输入损伤后的 JSB Chorales 四声部 MIDI 音高矩阵,每首曲子为 T x 4,四列依次为 Soprano、Alto、Tenor、Bass。损伤包括 -1 缺失和逻辑噪声;NaN 表示合法休止符。任务重构原始四声部序列,既要音高准确,也要减少对位法规则违规。提交 .npz,键为 y

数据特点

序列长度可变,四个声部之间有强约束:高低声部顺序、相邻声部间距、平行五/八度、隐伏五/八度等。评分 40 分来自音高准确率,60 分来自规则分;若预测仍包含 -1,总分乘以 0.6。规则分权重大,因此“音乐上合法”比单纯填常见音高更重要。

考点

核心考点是约束序列修复。题目不是普通分类,而是在已知上下文和音乐规则下填补/修正矩阵。参赛者需要结合统计模型和规则后处理,避免为了局部准确导致大量对位违规。

涉及知识点

  • 序列建模:n-gram、HMM、RNN/Transformer 可选。
  • 缺失值填补和噪声修正。
  • 约束满足:声部交错、间距、平行/隐伏五八度。
  • 动态规划 / beam search。
  • 音乐理论中的四声部基本规则。

解法思路

基础解法是用训练集中各声部最常见音高填补 -1,并保留非缺失值。它简单但准确率和规则都有限。更好的方案是按声部分别统计转移概率和同一时刻四声部联合分布;对每个时间步生成候选音高组合,再用动态规划选择全曲代价最小的序列。代价包括与原输入不一致的惩罚、候选出现频率、相邻时间转移概率和规则违规惩罚。

若使用神经模型,可训练 seq2seq/Transformer 从损伤序列预测原序列;但规则分仍建议后处理。对输出中的每个违规点,可局部搜索替换某个声部音高,使准确性损失最小且规则恢复。

可选/多种解法

统计填补 + 规则修复:实现快,规则分稳定。

动态规划/beam search:综合准确率和规则,适合四声部有限候选。

深度序列模型 + 后处理:上限更高,但需要处理变长、NaN 和小数据过拟合。

特殊技巧

由于规则分占 60 分,宁可牺牲少量音高准确率,也不要留下大面积平行八度/声部交错。对每个时间步,先按声部范围和相邻声部约束筛候选,会显著降低搜索空间。NaN 是合法休止符,不应当当作缺失值强行填。

调参优化

音乐生成/补全题的调参要同时看指标和可听/乐理约束。模型侧可调序列长度、embedding 维度、RNN/Transformer 层数、dropout、学习率、teacher forcing 比例和 batch size;生成侧可调 temperature、top-k/top-p、重复惩罚、和声合法性过滤与节拍约束。若题目评分偏向负对数似然,就优先调验证 loss 和早停;若评分包含音乐结构规则,则后处理约束权重也要纳入搜索。过高 temperature 会增加多样性但容易产生不合法和弦。

注意事项

旧 pickle/npz 读取建议 encoding="latin1"。提交结果 shape 和 object array 格式要与测试集曲目一一对应。含 -1 会触发 0.6 降权,是必须优先清除的硬伤。规则检测会跳过含 NaN-1 的相邻步,但不要用大量 NaN 逃避,因为准确率会受损。

推广意义

这题体现了“机器学习 + 领域规则”的价值。很多真实任务(代码修复、化学结构修复、排班、医学时序修正)都不能只看预测准确率,还必须满足硬约束或软规则。