巴赫涂鸦创作者Anna Huang现身上海,倾情讲解「音乐生成」两大算法

  • 2019 年 10 月 4 日
  • 筆記

作者 | camel 编辑 | 唐里

近日在上海举办的世界人工智能大会(WAIC)TensorFlow 峰会中,「巴赫涂鸦」( Bach Doodle)的创作者 Anna Huang(黄成之) 现身会场,详细讲解了「巴赫涂鸦」背后音乐生成的技术原理及相关研究,包括能在任意涂白处填充曲调的 Coconet算法,以及能够生成长时段乐曲的Music Transformer算法。

音乐生成(Music/MIDI Generation),作为一个研究领域尽管小众,却历史悠久,过去主要用遗传算法、专家系统等来实现,近几年基本都用深度学习研究。

像深度学习下的大多数研究一样,当下的音乐生成技术取得了巨大的进步,然而离自动创作出一部优美的音乐还有很大的距离。

Anna Huang作为一个作曲家兼AI研究员对音乐生成技术的定位是:人类作曲的好帮手。

1. Anna Huang 与巴赫涂鸦

Anna 出生在香港,却成长于美国。从小她接受了严苛的艺术教育,但她的矛盾在于一方面喜爱音乐,而另一方面却备受枯燥的音乐考试及音乐创作中的重复性工作的折磨。幸运的是,她的父亲是大学的计算机教授,对于用计算机代替人类重复性的劳动,Anna 有着“天然”的兴趣。[1]

Anna认为「我们上课,或者向作曲家学习的,应该是学习怎样去表达我们想表达的东西,去寻找我们到底想说的是什么」[1]。

2006年,在加州大学读书期间,Anna自编程序完成了她人生第一个音乐与计算机结合的学术课题——Palestrina Pal,这是一款基于Java的分析工具,帮助检测学生模仿文艺复兴时期作曲名家帕莱斯特里纳的作曲风格时是否存在语法、风格和规则不符的问题。

随后Anna 先后在麻省理工学院媒体实验室和哈佛大学拿到了相关专业的硕士和博士学位,并最终于2016年加入 Google Brain 中著名的 Magenta 团队,这是一支专注于音乐和艺术生成的团队。

2019 年 3 月 21 日,为纪念作曲家约翰·塞巴斯蒂安·巴赫诞辰 334 周年,Google 上线了首款基于 AI 技术的巴赫诞辰纪念 Doodle「巴赫涂鸦」。这是一款交互式的小程序,用户在五线谱上用鼠标随意点击谱写一段音乐,点击「和声」(Harmonize),几秒之后 Doodle 背后的机器学习算法就会根据用户输入的旋律,生成一段巴赫风格的协奏小曲。

巴赫涂鸦仅在谷歌搜索首页上线两天,但全球范围共创作了多达5500万首旋律,累积作曲时长长达350年。[2]

巴赫涂鸦背后的核心算法,正是Anna Huang等人提出的Coconet。

论文:Counterpoint by Convolution 论文地址:https://arxiv.org/abs/1903.07227

2. Coconet

Coconet,其名字或许来源于“Counterpoint by Convolution”,因此可以认为是“卷积对位网络”。它的基本功能就是将一个不完整的乐谱填写完整。例如为了训练它,要先随机擦除乐谱中的一些音符,然后网络以残缺的部分为基础,通过卷积的方法重建整个乐谱,通过与原来的乐谱对比来逐渐提升学习性能。这样便可以得到一个能够补全任意不完整输入乐谱的模型。

事实上,这种想法来源于对人类作曲的观察。传统音乐生成算法模型往往是将生成任务分解为按时间顺序排列的过程,从头到尾一次性构成一首音乐。但是人类作曲家却并不是这样,而常常是以非线性的方式来编写音乐,在这里或那里涂涂改改,重新审视之前写过的章节等。Coconet正是为了更好地近似这个过程而提出的。Anna表示,「很多时候我们写音乐或者写文章,并不是从头到尾一气呵成,而是会有很多次修改、很多跳动,这个模型创作的方式也是这样,一开始先写一个比较粗糙的稿,然后慢慢决定每一个地方的细节,再去修改。」

Anna等人选择了巴赫的众赞歌作为 Coconet 模型的训练数据。之所以选择巴赫作品,主要是因为它简单,这些曲目都是类似《安魂曲》这样比较安静的作品,总是四声部,而且结构化的特点较为明显。此外,就是对位(即当我们在同时写一个复杂的旋律时,如何让这段旋律和谐好听,这也是学生在学习作曲和乐器演奏要学的第一件事情),音乐不仅仅是旋律,更重要的是如何将许多条线和谐地组合到一起,而巴赫的音乐正是有这样需要多个旋律相互对位的曲子。

然而需要注意,巴赫的众赞歌只有306首,这个数据体量对于当前深度卷积网络来说太小了。不过正如刚才提到的“随机擦除”解决了问题,事实上通过“随机擦除”部分音符,Anna等人能够获得近乎无限大小的训练数据集。

针对乐谱的表示,Anna认为“乐谱”是一个三维物体。首先,巴赫的合唱包括四种声音:女高音(Soprano)、女低音(Alto)、男高音(Tenor)和男低音(Bass)。此外,每种声音都是一个二维数组:以(离散的)时间为行数据,以音高为列数据。因此对于每个时刻点的每种声音,都有一个one-hot的基音向量,除了表示正在唱的向量元素为 1外,其余元素都为0。在存在不确定的情况下(例如模型生成时),这个基音向量将包含基音上的分类概率分布。

随后他们将每种声音作为一个通道,将时间和音高构成二维卷积空间,三者共同构成卷积特征图。

注意,由于他们输入模型的乐谱是不完整的,于是他们为每种声音都提供了一个额外的掩膜通道,这是一个二进制值,用来指示每个时间点该声音的音高是否已知。因此进入模型的是一个八通道特征图。

接下来就是一个非常简单的卷积神经网络了,它具有批标准化和残差连接。对于使用 tensorflow.js 实现在浏览器中运行模型的 Doodle,可以通过切换到非纵向可分离卷积来加快计算速度。与常规的卷积网络不同的地方是,这里将空间轴上的卷积和跨越通道混合区分了开来,这样一来,它需要的参数就会更少,因此也更适合在浏览器中加速。

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

研究人员通过训练模型,来提高音高分配给真正的音符的概率。这个过程就类似于人类作曲,促使模型去理解它所接收的不完整乐谱的音乐含义——现在用的是什么音调,用的是什么乐器,下一个音符是什么,前面的音符是什么?

一旦模型得到训练,就可以从模型产生的概率分布中提取音乐。我们可以根据每个音符的分布对每个音符进行采样。然而,这不能解释被采样音符之间的相互作用。通常,确定其中一个音符会改变其他音符的分布。

计算这些交互作用的一种方法是对其中一个音高进行采样,将其添加到不完整的乐谱中,然后再次通过模型传递结果,再重新计算剩余音高的分布。通过重复这个过程直到所有的音符都确定,团队在考虑所有的关联关系的同时完成乐谱。

实际上,他们采用的方法更加强大:将模型的输出视为一个粗略的草稿,然后通过反复重写逐步细化。具体地说,他们同时对所有音符进行采样,获得一个完整的(但通常是无意义的)乐谱,然后将其部分删除并再次传递到模型中,然后重复该过程。随着时间的推移,需要抹去和重写的音符越来越少。

Anna 等人在建模的过程中,每次只建模一个变量。同时,他们采用无序建模的方式,并且采用 Gibbs 采样的方法,从多个序列中生成乐谱。因此,可以保证模型是有效的。

论文:Music Transformer 论文地址:https://arxiv.org/abs/1809.04281

3. Music Transformer

但,Coconet只能生成较短的音乐片段。一首音乐往往会在不同的时间尺度上具有多个主题、短语或重复,因此对于结构复杂的长时程音乐生成一直以来都是一个巨大的挑战。

Anna等人对此的解决之道就是引入Transformer技术,他们称之为Music Transformer。Transformer是一种基于自注意力的序列模型,在许多需要保持长时程一致性的生成任务中取得极大的成果。「这表明自注意力也可能适用于音乐的建模」Anna说道。

在这项工作之前,Magenta团队在2017年也提出了一个称为Performance RNN算法,这是一种基于LSTM的递归神经网络(RNN)算法。然而我们知道RNN(或者LSTM等)的计算限制为顺序的,也就是说RNN相关算法只能从左向右或从右向左依次计算,这种机制会带来两个问题:

  1. 时间片t的计算依赖t-1时刻的计算结果,这样限制了模型的并行能力;
  2. 顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。

这些问题也同样表现在音乐生成当中。

以上是基于Performance RNN针对肖邦的Black Key Etude生成的连续乐曲。虽然基于LSTM的模型能够在几秒左右的时间尺度上产生听起来似乎合理的音乐,但显而易见缺乏长期结构。这个模型似乎“忘了”它之前弹奏的什么内容。

而 Transformer能够解决以上两个问题。首先它使用了Attention机制,将序列中的任意两个位置之间的距离缩小为一个常量;其次它不是顺序结构,因此具有更好的并行性。

然而仅有Transformer并不够。原始的Transformer依赖绝对定时信号,因此很难跟踪基于相对距离、事件顺序和周期性的规律。如上图所示在这种情况下,生成的音乐后半部分完全不忍直视。

相对全局注意力:底下一行描述了内存高效“倾斜”算法,它不需要实例化R(上面一行,即O(L2D))。灰色表示掩膜或填充位置。每种颜色对应不同的相对距离。

Anna等人于是在Tranformer的基础上又加入了相对注意力的概念,它能够基于两个token之间的距离进行调节注意力。通过这种方式,Music Transformer便能够更多地关注关系特征。更值得强调的是,相对自注意力还允许模型生成超出训练样本长度的音乐,这是原始的Transformer模型无法做到的。

这是Music Transformer生成的乐曲:

把三者放在一起对比:

第一行:Music Transformer;第二行:Baseline Transformer;第三行:PerformanceRNN (LSTM)

可以看出它能够延续乐曲一贯的演奏风格,且能生成多个主题。相比之下,Performance RNN和Transformer这两种算法,要么完全缺乏可辨别结构,要么无法保持结构一致。

针对相对自注意力,Anna还提供了一种可视化方法。她用弧线显示了最后一层注意力权重,显示过去的那些音符会影响未来。模型会将注意力集中在各种颤音块之间,并且能够跳过不太相关的部分。

但 Anna 也承认Music Transformer并不能达到完美,它有时会重复次数过多,部分又过于稀疏。但她希望Music Transformer能成为音乐家需要灵感时有用的帮手。这为用户提供了一种可能性,他们可以指定开头,并将模型作为一种创造性工具来探索一系列可能的延续。「试想一个作曲家有一天突然没有了灵感,那么这个时候他就可以借助于这个模型获得一些启发」,Anna说。

在报告之后,AI科技评论荣幸参与了对Anna Huang的采访,以下是部分采访纪要:

Anna:我们把机器学习当做是一个非常好的工具去助推和加速整个文化和音乐创造的整个过程。我们在谈到机器学习如何去助推创作的过程当中,针对不一样的人群,它是有不同的含义的。

如果说您是一个新人,机器学习可以让你以更快的方式去了解旋律,我画出一些旋律,机器学习会告诉你这将是什么效果,巴赫 Doodle就是很好的一个例子,能够让我们只需要简单地输入一点旋律,就可以体验作曲的乐趣。

如果您是一个比较资深的作曲家,利用机器学习可以让你很快做出一个小样,先看一下这样的创作到底是什么样的效果,然后你再去看能做些什么调整,这样也是很有帮助。

记者:创造力是人类对于机器最大的优势之一,为什么人类会需要让机器来帮忙做作曲这样创造类的事情?

Anna:我自己是一个作曲家,我想从我个人感受谈下这个问题。创作的过程可以分成两个阶段。第一个阶段就是产生大量想法的阶段,这个时候你需要大量的想法,为后续的创作提供灵感来源;第二阶段是一个想法聚合的阶段,你需要从海量的想法当中找到能够表达你的述求的想法。在这两个阶段,机器学习都能够给人们提供极大的帮助。试想一个作曲家有一天突然没有了灵感,那么这个时候他就可以借助于机器学习获得一些灵感上的启发。而在创作中,如果要在结构层面上进行调整的话会是一个非常重复性的工作,这个时候机器学习便能够帮上忙了,当然后续的微调还是需要由人来完成。

记者:我们研究的目标之一,是想在未来让机器创作出完全属于它自己的一个完整的作品吗?

Anna:我不认为,未来我们会希望让机器去做出它自己的音乐作品。从我作为作曲家的角度来看,音乐其实是一种沟通方式,一种表达感情和感受的方式,而作曲家是在利用自己的作品去向他的读者或听众表达情感和感受。

所以我们要做的其实应该是给他们(作曲家)提供赋能的工具,让他们可以更直接地、更好地把自己的情感和感受表达出来。

记者:目前机器创作出来的音乐的风格,跟人类有不一样的地方吗,还是说机器创造出来的(音乐)特别像它学习到的那些人类音乐家的风格?

Anna:谈到这个问题,我想举两个例子来回答。

巴赫Doodle是一个很好的例子。如果你去学作曲的话,任何一个初学者都会先从巴赫的音乐去听、去模仿,因为它有很多的规律、很多乐理包含在里面。每一个音乐的学生,在学音乐之前都要先了解这些乐理。但是机器是非常有趣的载体,它不知道这些乐理知识,它只是从它本身的学习过程中去揣测应该怎么作曲,因此它会无意识地打破很多传统乐理上面的条条框框。机器可能会借用其他领域的内容和数据来做作曲。换句话说,某些它认为音乐性特别强的、可以放到作曲环境中表达的点,在我们人类作曲家看来可能会觉得与乐理知识相冲突、甚至格格不入。机器可以让我们从许多不同的角度来理解作曲这件事。

再来说第二个例子,目前机器学习在作曲方面还没有办法做到长时程的音乐生成。比如,我要用长段音乐来表达故事,塑造一个主人公,或和我们的听众互动,现在机器学习还做不到。所以目前人类和机器学习,还处在一种相互训练和相互学习的过程,一个过渡阶段。这个过渡阶段非常有趣。因为我们可以看到,机器认为这部分音乐性特别强,把这个元素加到创作当中;人类会觉得这违背乐理,但也有可能被激发出新的灵感来。结构化这一块,机器学习现在还没有办法做得很好,但目前机器学习生成的一些结构化的数据可以帮助我们人类去做音乐创作。这整个过程是很有趣的。

记者:以巴赫 Doodle为例,要基于 TensorFlow 去做AI Doodle的话,最大的挑战是什么?是模型数据集的建立吗?

Anna:在做巴赫Doodle的过程中,我们遇到了很多挑战。刚才你谈到数据集的问题,就是我们遇到的第一个挑战。因为我们只有306首巴赫的曲目来做训练样本,要学习一个作曲家的风格,这个数据集的规模是非常小的。我们用到了一个叫本能化,或者叫直观化的数据采样方式。什么意思呢?就是说我们输入一篇乐谱时,不是从头到尾去读这段音节或这段旋律,而是随机从中抽出几块遮盖起来,让机器去猜测这段旋律中空白的部分。如此一来,我们就将一段旋律,从不同角度、以排列组合的方式衍变成了许多段旋律,这就解决了我们数据集的问题。

第二个问题,是建模的问题。建模最大的挑战在于“速度”,因为我们需要实现互动性——在浏览器网页上与用户做互动,速度非常关键。当你输入一段旋律进去后,它会有很多重写的工作。我们做了很多架构上的改进,实现了从40秒加速到现在的2秒。除此之外,我们还纳入很多其他方面的技术来最终实现AI Doodle的互动效果。

记者:为什么选择巴赫而不选择其他一些更近现代(像施特劳斯这样的作曲家)的作品来做这个 Doodle?因为我们知道巴赫的风格和他的旋律性是特别难的。

Anna:我们在作品选择上是有一些筛选标准的。我们选了巴赫作品中相对简单的作品:都是类似《安魂曲》这样比较安静的作品,总是四声部,而且结构化的特点非常明显。此外,就是对位。对位就是,当我们在同时写一个复杂的旋律时,如何让这段旋律和谐好听。这是学作曲的学生都要做的第一个事情。因为音乐不仅是旋律,还是如何把很多条线和谐地组合到一起。结合到巴赫Doodle这个项目,作曲不是说我简单把旋律写进去,它就出一首歌,它一定是多个旋律之间相互对位,才能够形成一个非常完整的曲子。这个是谷歌 Doodle团队、Magenta团队和 TensorFlow.js 合作的一个项目。刚好 Doodle团队当时有工程师正在学习作曲,他就想说这第一个AI Doodle,能不能让每一个人都能够在浏览器上面利用机器学习来体验作曲。这也是我们开始这个项目的初衷。

记者:目前巴赫 Doodle对创作者来说是完全免费吗?

Anna:巴赫 Doodle是对所有人完全免费开放的。即使它现在不在Google的主页上了,但是在存档的网站还是可以继续玩。此外,巴赫 Doodle背后的机器学习模型和所有的代码也都是开源的[10]。除了提供开源的模型给创作者,我们同时也提供即插即用、与创作软件相融合的一个功能,因此在一些传统的、主流的音乐创作软件中也可以使用我们的这个机器学习的算法。另外我很感兴趣但还没有做很多的一项工作是,这些模型或许会对音乐教育有所帮助,可以让更多人拥有主动创作的体验、去作曲,去发掘他们的兴趣。

参考资料:

[1] Google 为你复活巴赫, https://mp.weixin.qq.com/s/wFcCnzRnI4mPIDOYD1X8yA

[2] Counterpoint by Convolution, https://arxiv.org/abs/1903.07227

[3] Music Transformer, https://arxiv.org/abs/1809.04281

[4] The Bach Doodle: Approachable music composition with machine learning at scale, https://arxiv.org/abs/1907.06637

[5] Coconet: the ML model behind today’s Bach Doodle, https://magenta.tensorflow.org/coconet

[6] Music Transformer: Generating Music with Long-Term Structure, https://magenta.tensorflow.org/music-transformer

[7] 详解Transformer (Attention Is All You Need), https://zhuanlan.zhihu.com/p/48508221

[8] 谷歌机器学习模型新进展:生成时长更长且连贯的音乐, https://cloud.tencent.com/developer/article/1380289

[9] 谷歌发布音乐 AI Doodle 庆祝巴赫生日,这里是它背后的技术, https://www.leiphone.com/news/201904/GQYJhhj91UdjSV2P.html

[11] 巴赫诞辰纪念 Doodle, https://www.google.com/doodles/celebrating-johann-sebastian-bach