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