谷歌首个AI版Doodle:向伟大作曲家巴赫致敬

谷歌首个AI版Doodle:向伟大作曲家巴赫致敬
2019年03月23日 11:20 机器之心

个人养老投资新时代,40家养老目标基金PK,你会选择哪一家?【寻2019基金业引领者

机器之心报道

机器之心编辑部

让巴赫弹摇滚会是什么样的体验?在最近谷歌主页的Doodle上,我们可以尝试一下。

3 月 21 日是著名音乐家约翰·塞巴斯蒂安·巴赫的生日,谷歌决定以一种特殊的方式向他致敬:让人人都能以巴赫的风格创作自己的乐曲。

通过机器学习算法,谷歌开发了 Coconet 多功能模型,可以让你用巴赫的风格演奏自己写下的乐谱。你也可以通过这个小工具来体验 AI 算法如何将一些我们熟悉的旋律「巴赫化」,亦或你和巴赫「合作」的乐曲将呈现出怎样更加现代摇滚的曲风。

Coconet的工作原理

Coconet获取不完整的乐谱,并填充缺失的材料。为了训练Coconet,我们从巴赫的四声部众赞歌数据集中取例,随意抹去一些音符,然后让模型重写。巴赫作曲与Coconet创作之间的差别为我们提供一个学习信号,我们可以通过该信号训练模型。

通过随意地抹去音符,我们希望得到一个可以处理任何不完整输入的模型。在下文的「Coconet 为什么可以运转?」章节中,我们给出了该训练流程有趣的解读,将其等同于多种模型的同时训练,并且每种模型适用于不同的场景。

Coconet 为什么可以运转?

Coconet 是一个自回归结构的集合,包含了序列模型中常见的时间结构(chronological structure)。为了将演示简单化,我们将考虑建模3个变量:X_1、X_2、X_3。具体来讲,我们可以把这视为一个三音符旋律或三音和弦,每个变量以音高作为值。建模X_1、X_2 和 X_3 就是表征和学习给定序列 X_1、X_2、X_3 在自然数据中出现可能性的联合概率分布 P(X_1,X_2,X_3)。

这是一个很难的问题,因为变量相互作用,光建模独立(边缘)分布 P(X_1)、P(X_2)、P(X_3) 是不够的。对于X_1的每个可能值,依赖于X_1值的其它变量存在条件分布 P(X_2|X_1) 和 P(X_3|X_1)。如果有 P(X_1) 和 P(X_2|X_1) 的模型,那我们可以将它们组合起来获得 P(X_1,X_2)=P(X_1)P(X_2|X_1) 的模型。而如果有 P(X_3|X_1,X_2) 的模型,我们可以将这三个模型组合起来获得期望联合分布 P(X_1,X_2,X_3)=P(X_1)P(X_2|X_1)P(X_3|X_1,X_2)。

一次建模一个变量

上述因式分解对序列数据来说最自然不过,因为它遵循序列顺序。而在单音音乐(monophonic music)中,这意味着每个音符的分布是由指向它的音符决定的。这给出了正向排序 (1,2,3)。另一种自然的因式分解是逆向排序 (3,2,1):先建立结论,然后往前推导。如下图所示:

一般来说,变量的每个可能的排序都存在自回归因式分解。在有N个变量的问题中,就存在 N! 个因式分解。在上面提到的三个变量的例子中,我们可以列举出六个自回归因式分解:

复音音乐(polyphonic music)由多个同步序列组成:多个乐器一起演奏。在这种情况中,虽然有两种明显的方式展开多个序列,但变量没有真正的自然排序。

在左图中,我们交错排列乐器,将其排序为S、A、T、B、S、A、T、B等。这种顺序有利于和声:模型会以一次生成一个和弦的方式生成音乐。在右图中,我们以另一种方式将乐器连接起来,将其排序为S、S、S、S、A、A、A、A等。这种方式有利于调式,因为模型会一行接一行地生成音符。这两种截然不同的观点是导致音乐理论中常见冲突的根源。

无序建模

当我们将部分抹去的乐谱输入至模型时,输出的结果可以解释为抹去变量的条件独立分布。回到三个变量序列 X_1、X_2、X_3 的例子,假设抹去了 X_2 和 X_3,然后模型观测到 X_1 并生成 X_2 和 X_3 的条件分布。

所以得到的条件分布 P(X_2|X_1 )和 P(X_3|X_1) 作为三个变量2种排序(总共6种排序)中的两个因子出现。通常,根据抹去的变量,我们可以从任何排序中计算任何条件因子。通过组合此类条件因子,我们可以形成对应于任何预期排序的模型。本质上,修复模型提供了一个自回归模型集合,每个可能的排序有一个自回归模型。

而且,我们可以更高效地训练这个集合,而不是简单地对排序进行采样并逐个评估其条件因子。关键的观测是每个条件在很多排序中是共享的:即使在低维样本中,P(X_3|X_1,X_2) 也是由两种排序 (1,2,3 和 2,1,3) 共享的。一般来说,所有这些条件分布 P(X_i|X_C)(X_C 是变量的任何子集,不包括 X_i)都与 X_i 之前或之后的变量排序无关,这大大减少了我们需要学习的不同概率分布的数量。

为了训练 Coconet,我们从数据集中选择了一个训练样本,统一选择要抹去的变量数量,并统一选择需要抹去的变量的特定子集。我们将部分抹去的乐谱输入至模型(以及指示哪个变量需要抹去的掩码),获得了抹去变量值的一组独立分布。我们计算了真实值的对数似然和抹去变量的平均值,由此纠正了微妙的缩放问题。我们借此得到损失函数,然后和以前一样使用反向传播和随机梯度下降来最小化损失。

使用吉布斯采样根据多个排序生成

尽管无序NADE学习一组排序,但相关的采样过程仍然根据单个排序进行有效的采样。Uria等人提出统一选择一个排序,然后根据这个排序依次生成变量。作曲仍然是在一个单一的过程中完成的,没有经过任何迭代的改进。

在一个单一的过程中作曲难在哪里?假设从一张白纸开始,我们必须写下第一个音符,而且知道之后不能改动。这是一个艰难的决定:我们必须考虑未来所有的可能,这个音符必须是正确的。接下来,有了更多的音符之后,我们就能参考前后的音符做出决定。那么,如果我们不必从无到有地进行作曲呢?如果我们从一开始就有一些音符作参考呢?

事实证明,我们可以通过吉布斯采样做到这一点!吉布斯采样是通过反复对单个变量重新采样,从联合分布中抽取样本的过程。可以用它来比喻反复修改乐谱的过程。在每一步中,抹去乐谱的某些部分并让模型重写。这样的话,模型一直都会有参考材料。尽管参考材料本身可能不断变动,也可能在之后的迭代中被重写。这没关系,因为模型当前的决策也不是一成不变的。渐渐地,乐谱就成了一首和谐的曲子。

更确切地说,这个过程可以叫做分块吉布斯采样,因为每次重新采样的不止一个变量。如果把概率分布想象成一幅风景画,可以看到处在合适位置的山峰被位置不当的巨大山谷隔开。大规模重新采样有助于通过较大的跳跃来探索可能性空间,而一次重采样一个变量往往会停留在附近的峰值上。因此,我们退火块大小:我们开始重写大部分的乐谱,以探索这个空间,然后逐渐重写得越来越少,以确定一个合理的乐谱。

参考链接:https:\/\/magenta.tensorflow.org\/coconet

本文为机器之心报道,转载请联系本公众号获得授权。

------------------------------------------------

巴赫 变量 排序

热门推荐

收起
新浪财经公众号
新浪财经公众号

24小时滚动播报最新的财经资讯和视频,更多粉丝福利扫描二维码关注(sinafinance)

7X24小时

  • 03-27 中创物流 603967 --
  • 03-21 三美股份 603379 32.43
  • 03-18 亚世光电 002952 31.14
  • 03-14 震安科技 300767 19.19
  • 03-14 永冠新材 603681 10
  • 股市直播

    • 图文直播间
    • 视频直播间