3 月 21 日,Google 发表有史以来第一个人工智能音乐 AI Doodle,庆祝世界著名的德国作曲家和音乐家──Johann Sebastian Bach(约翰‧塞巴斯蒂安‧巴哈)的生日!
Doodle 是 Google Magenta 和 Google PAIR 团队合作完成,是一种互动游戏,玩家可创作自己选择的两种旋律音乐。按下按钮后,Doodle 会使用机器学习将旋律协调为巴哈的音乐风格(如果你碰巧在 Doodle 发现非常特别的复活节彩蛋,那可能是巴哈时 1680 年代的混合摇滚风格)。
伟大的德国音乐家巴哈
1685 年 3 月 21 日,巴哈出生在德国艾森纳赫小镇。他在一个音乐大家庭长大:父亲能用多种乐器演奏,还担任镇上乐队的指挥。大哥也是音乐家,巴哈 10 岁时父亲去世了,从此跟着哥哥长大。巴哈也是杰出的风琴手,他还懂得如何制作和修复复杂的管弦乐器。
巴哈是多产音乐家,每周都能创作一首大合唱曲,同时巴哈也非常谦逊,把自己的成功归于天赐灵感和严格的职业道德。他活着的时候只有几部作品出版,但现在散于世界各地的手稿作品超过 1,000 部。
随着 19 世纪“Bach revival”,巴哈名声一飞冲天,当时,音乐界开始认可和推崇他的四声部和声。也许衡量音乐家的最好标准是对其他艺术家的影响,几个世纪以来一直如此。
然而,音乐家并不是唯一受巴哈音乐影响的人。“旅行者 2 号”太空探测器发射后,科学家兼作家 Lewis Thomas 建议将巴哈的音乐传递到太阳系最外层。“我建议使用巴哈的音乐,所有巴哈的音乐”,他写道。
Doodle 背后的故事
我们可先看看下面的影片,了解 Doodle 诞生的经过。
开发 Doodle 的第一步是什么?就是建立机器学习模型。传统的计算机程序设计是订定一套规则让电脑给答案,但机器学习是经过输入大量资料,让电脑学会找出答案。今天 Doodle 使用的模型是由 Magenta 团队的 Anna Huang 开发,她开发了 Coconet,是一种多功能模型,可用于各种音乐工作,如协调旋律或从头开始作曲(可在 Magenta 部落格看到更多技术细节)。
具体来说,Coconet 接受 306 次巴哈合唱协调训练。巴哈的合唱团总是有四声部,每声部都有自己的旋律线,同时演奏能创造出丰富悦耳的和声。这种简洁架构成为机器学习模型良好的训练资料。
PAIR 团队使用 TensorFlow.js,使机器学习完全在 Web 浏览器进行,不需要像传统机器学习使用大量服务器。如果某人电脑或装置不够快,无法使用 TensorFlow.js 执行 Doodle,Doodle 还可与 Google 新 Tensor 处理单元(TPUs)一起使用,就是在资料中心快速处理机器学习工作。
这些套件与 Doodle 团队的工程相结合,创造了今天看到的 Doodle。
Bach Doodle 背后的机器学习模型
Doodle 背后的机器学习模型是 Coconet。3 年前 Magenta 团队成立时,开始研究这个模型。当时他们只使用机器学习(ML)生成旋律。写出好旋律很难,更不用说和弦了。但就像每个音乐系学生,他们想到了巴哈的音乐!使用巴哈 306 个合唱协调数据集,他们能训练机器学习模型,以巴哈的风格生成复调音乐。
Coconet 被训练从残缺片段回复巴哈的音乐:团队从巴哈音乐里取一片段,随机移除一些音符,然后让模型根据内文推测出缺失的音符。结果是通用的对位模型,接受任意不完全的乐谱输入,计算出完整的乐谱。这设定涵盖了各种各样的音乐工作,例如协调旋律、建立平滑过渡、重写和细化现有音乐及从头开始创作音乐。
传统的模型通常是按照开始到结束的时间顺序生成音符,而 Coconet 可从任何时间开始,以任何顺序开发音符。这种弹性使它成为有效的辅助合成工具。音乐家将这点使用于工作流程的方法是反复让 Coconet 填写分数,每次都保留好内容并移除其余内容。事实上,这就是 Coconet 的内部工作机制:在循环生成材料,反复重写和移除自己的工作。它从粗略的想法开始,然后反复算出细节,并把材料调整成连贯的整体。
模型的工作原理
Coconet 抓取不完整的乐谱并补充缺失的部分。为了训练它,团队从巴哈的四声部圣咏选出一段,随机移除一些音符,并要求模型重建移除的音符。巴哈作曲和 Coconet 作品间的差异有个学习讯号,透过这个讯号就可训练模型。
透过随机移除音符,团队希望得到能处理任意不完整输入的模型。它相当于一次训练多个模型,每个模型都适用不同场景。
在团队看来,“乐谱”是 3D 的。巴哈的合唱是为四声部创作,分别是女高音(S)、女中音(A)、男高音(T)和男低音(B)。每声部的音乐都用钢琴曲来表现:一个 2D 阵列,时间(离散)为行,音高为栏。我们假设每声部在任何给定的时间都只唱一个音。因此对每声部、每个时间点,都有一 one-hot 基音向量,除了一个单独表示正在唱音高向量,其他元素都为零。有不确定性的情况下(例如模型汇出),此基音向量将包含基音上的分类概率分布。
团队把这叠钢琴视为卷积特征图,时间和音高构成 2D 卷积空间,每声部都提供一个通道。由于他们输入模型的音符不完整,于是为每声部提供其余的掩膜通道:二进制值指示每个时间点该声部的音高是否已知。故进入模型的是八通道特征图。
模型是非常简单的卷积神经网络,有批量标准化和残差连结。对使用 TensorFlow.js 达成在浏览器执行模型的 Doodle,可透过切换到非垂直可分离卷积来加快计算速度。
团队训练该模型,以提高分配音高给真正音符的概率,促使模型去理解接收的不完整乐谱的音乐含义──现在用什么调,是什么乐器,下个音符是什么,前面的音符是什么?
一旦模型训练好,就可从模型产生的概率分布撷取音乐。我们可根据每个音符的分部取样每个音符。然而,这无法解释取样音符之间的相互作用。通常,确定其中一个音符会改变其他音符的分部。
计算互动作用的一种方法是取样其中一个音高,添加到不完整的乐谱,然后再次透过模型传递结果,再重新计算剩余音高的分散。重复这个过程直到所有音符都确定,团队考虑所有关联同时完成乐谱。
实际上他们采用的方法更强大:将模型汇出视为粗略的草稿,然后反复重写、逐步细化。具体地说,同时取样所有音符,获得完整的(但通常无意义)乐谱,然后将部分移除并再次传给模型,然后重复此过程。随着时间推移,需要抹去和重写的音符越来越少。
团队建模的过程中,每次只建模一个变数。同时,他们采用无序建模,且采用 Gibbs 取样法,从多个顺序生成乐谱,因此保证模型有效。
- Celebrating Johann Sebastian Bach
- Coconet: the ML model behind today’s Bach Doodle
(本文由 雷锋网 授权转载;首图来源:Google)
延伸阅读:
- 成为 21 世纪巴哈的接班人,让 Google AI 助你一臂之力