查看原文
其他

Google首页玩起小游戏,AI作曲让你变身巴赫

一一 AI科技大本营 2019-03-31

参加 2019 Python开发者日,请扫码咨询 ↑↑↑


整理 | 一一

出品 | AI科技大本营(ID:rgznai100)     


看到今天的 Google Doodle 图标了吗?(不能FQ的也请假装看到)


Google 在节日以及重大事件或人物纪念日上都会展示定制版谷歌图标,是的,它就叫 Google Doodle。近几年,Google Doodle 有时更是做成了有趣味性的小视频形式,其中包括声效与互动游戏功能,使得 Doodle 更具观赏性和娱乐性。


3 月 21 日(格林尼治时间)是世界著名作曲家巴赫的生日,为了纪念他,Google Doodle 在搜索主页上配上了巴赫的巴洛克式的乐曲。


不过每个用户听到的乐曲可以是多样化的,这主要是因为 AI 的作用,有了 AI 的 Doodle 能让用户输入任何旋律来生成巴赫风格的和声。据了解,Google 使用机器学习分析了 306 种巴赫作品的和声数据集,以此生成巴赫风格的复调音乐。


比如你可以输入两小节长的单行旋律,并且改变音乐的音调和节奏,你也可以将生成的作品下载为 MIDI 文件与朋友分享。Google Doodle 还有一些隐藏的惊喜,单击键盘右侧的迷你放大器能使乐器升级为 80 年代的合成器。总之,无论你点击输入怎样稀奇古怪的音符,它都能给你自动匹配出巴赫风格的旋律。


Doodle 是人工智能产生音乐的可能性和局限性的完美演示。Google Magenta 项目的人工智能研究员 Anna Huang 告诉外媒 The Verge ,基础的 AI 模型是根据巴赫的合唱和声训练而成的。


Huang 表示,那些数据特别适合人工智能进行学习。“这个数据集中的巴赫作品是高度结构化的,风格非常简洁,但具有丰富的和声,允许机器学习模型用更少的数据进行学习。”巴赫是巴洛克音乐的作曲家,这种音乐是一种有着高度形式化的一致规则的流派。


不过让 AI 完美生成一首音乐作品不太现实,比如机器学习生成器要解决的问题是创建长期的结构和一致性,如何像巴赫这样的艺术家平衡简洁度和表现力,对 AI 来说更是异常困难。


当然,让 AI 作曲与人类作曲家碰撞出火花,显然更多是希望给作曲者提供灵感来源,能让他们填补一首作品中难以谱写的乐章部分。


Doodle 背后的机器学习模型


这是一个称为 Coconet 的机器学习模型。经过训练后的 Coconet ,可以从乐曲片段中恢复出巴赫的音乐,比如从巴赫乐曲中取出一块,随机删除一些音符,然后让模型从上下文中猜出丢失的音符。Coconet 可以协调旋律,平滑过渡,甚至从头开始编写乐曲,这是传统模型所做不到的,这种灵活性使其成为支持作曲过程的很好的工具。


由于 Coconet 能重写乐章,能找到适应不平衡的协调旋律部分:



为了将Coconet 进行更广泛的交互,Doodle 团队还构建了一个名为 Coucou 的扩展接口 。它支持人类与 AI 协作作曲,例如音乐家可以通过删除不满意的部分并要求模型再次填充来迭代音乐作品,也可以反复单击 infill 以获得不同的乐曲变化。


可以设想,音乐家利用其反复填写乐谱,直到生成让自己满意的旋律。当然,如果你不熟悉编曲,不要紧,只需要记住这句话:这款模型会尽力让输出的音乐听起来像巴赫的作品。


Coconet 如何运作的?


Coconet 获得不完整的乐谱并填写缺失的内容。为了训练这个模型,Doodle 团队从四部分对位的巴赫合唱数据集作为例子,随机擦除一些音符,并要求模型重建擦除的音符。巴赫与 Coconet 作品之间的差别提供了一个学习信号,通过它可以训练模型。


通过随机删除音符,Doodle 团队希望获得一个可以处理任意不完整输入的模型,这相当于同时训练多个模型,每个模型适用于不同的场景。



对他们而言,“乐谱”是三维物体。巴赫的合唱曲分为四种声音:女高音(S)、中音(A)、男高音(T)和低音(B)。每个声音的音乐都以 piano roll (钢琴卷轴)表示:二维阵列、时间水平延伸(离散化)、音高垂直布置。假设每个声音在任何给定时间都只唱一个音高。


因此,通常对于每个声音,在每个时间点,都有一个 one-hot 音高向量,除了一个表示正在演唱的音高向量外,其他元素全部为零。在存在不确定性的情况下(如在模型输出中),该音高向量将包含音高上的分类概率分布。


1


将这堆 piano roll 视为卷积特征映射,时间和音高形成二维卷积空间,每个声音提供一个通道。由于放入模型的乐谱不完整,他们为每个声音提供一个额外的通道,带有一个掩码:即二进制值,表示在每个时间点上是否已知该声音的音高。因此,模型中的内容是八通道特性映射。


该模型是一个相当简单的卷积神经网络,具有批量归一化和残差连接(residual connections)。对于使用 Tensorflow.js 实现在浏览器中运行模型的 Doodle,能够通过切换到深度可分离的卷积来加速计算。与常规卷积的不同之处在于,研究人员将空间轴上的卷积和跨越通道轴的混合分开,这样需要的参数更少,更适合在浏览器中加速。由于空洞卷积(dilated convolutions),他们通过减少模型中的层数,同时在不损失性能的情况下来进一步实现加速。

2

模型的结果再次是一堆 piano rolls,但这次包含了删除音符的音高上的概率分布。该模型使用给出的音符来试图找出被删的音符,从而在每个时间点的每个声音演唱的音调上形成一个分类分布。


他们训练这个模型给真音高分配高概率,让 AI 去理解不完整的音乐含义——我们在唱什么音调,唱什么和弦,要去哪里,从哪里来?

3

一旦模型被训练,他们有几种方法从模型产生的概率分布中提取音乐。比如可以根据其分布同时对每个音高进行采样,但这并不能解释被采样的音高之间的相互作用。通常,确定其中一个音高会改变其他音高的分布。


考虑这些相互作用的一种方法是对其中一个音高进行采样,将其添加到不完整的乐谱,并再次通过模型传递结果以重新计算剩余音高的分布。通过重复此过程直到确定所有音高,他们在考虑所有交互的同时完成乐谱,该顺序采样程序期望模型能够一个接一个地准确地确定未知的音高。


不过,Doodle 团队使用更强大的过程:将模型的输出结果视为草稿,然后通过重复重写逐步完善。具体来说,他们同时对所有音高进行采样,获得完整(但通常是无意义的)乐谱,然后将其部分擦除并再次传递到模型中,之后重复该过程。随着时间的推移,通过擦除并重写越来越少的音符使该过程能够确定一致的结果。


以上过程中,有一个关键问题是:为什么 Coconet 会有效?


实际上,他们对 Coconet 作为一个自回归结构集合进行了更为技术性的理解,其中包括序列模型中常见的时间结构。他们还从一次建模一个变量来写,无序建模,以及使用从多个排序生成的吉布斯采样(Gibbs sampling)等三大方面进行了具体说明。


更多详情内容,给出传送门:

https://magenta.tensorflow.org/coconet

相关论文链接:

https://arxiv.org/abs/1903.07227


精彩推荐

推荐阅读:


点击“阅读原文”,查看历史精彩文章。

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存