参加 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

精彩推荐

推荐阅读:

  • 出身清华,大神朱俊彦再出GauGAN:AI让你变身神笔马良

  • 68款大规模机器学习数据集,涵盖CV、语音、NLP | 十年资源集

  • 提升效率,这十个Pandas技巧必不可少!

  • 超常用的Python代码片段 | 备忘单

  • 小米“祭出” AIoT 神器!| 技术头条

  • 工作量不断增加的微软Azure,正缩小与亚马逊AWS的差距

  • 硬核接亲!程序员被新娘要求现场写代码,结果万万没想到……

  • 理工男的网红生意, 6000万月活50万条日更的背后, 内容链还能这样操作?

  • 曝光!月薪 5 万的程序员面试题:73% 人都做错,你敢试吗?

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

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

  1. 【Python小游戏】用AI玩Python小游戏FlappyBird【源码】

    提示:如果本文对您有帮助,欢迎点赞支持! 文章目录 目录 前言 一.Flappy Bird是什么? 二.本项目简介 1.实现效果 2.游戏逻辑的相关链接 (1)游戏逻辑部分 (2)AI训练逻辑部分 说 ...

  2. 我的名片能运行Linux和Python,还能玩2048小游戏,成本只要20元

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 猜猜它是什么?印着姓名.职位和邮箱,看起来是个名片.可是右下角有芯片,看起来又像是个PCB电路板. 其实它是一台超迷你的ARM计算机,不仅 ...

  3. 使用Unity从零点五开始,做半个不能玩的小游戏(完)

    在上一回<从零点五开始做半个不能玩的小游戏(二)>中,我们完成了下列事情: 1.重构野外.城市及英雄代码. 2.为英雄添加了简单的状态机,使其可以在世界中玩耍. 3.搭建了简单的数值体系, ...

  4. python点击按钮打开游戏_Python如何入门?直接按这个方式玩炸弹超人小游戏,就能掌握编程...

    还在从基础知识点开始学python吗? 还不如直接玩python小游戏炸弹超人,跟着详细教程开始,从不会python到掌握python基础知识点,并且还有所有源码,想学不会编程都难. 下面讲一下开发P ...

  5. 吃粽子html5游戏,端午先玩个小游戏,再去吃粽子吧~

    原标题:端午先玩个小游戏,再去吃粽子吧- 这个端午节,你过的怎么样? 来和米妹玩个小游戏吧 截屏下方动图 如果截到的画面正好是大湖雪糯 请将截图私信给米妹哟- 我们将在选出3名幸运儿,送上我们精美的礼 ...

  6. Pytorch强化学习玩微信小游戏

    文章目录 1.前言: 2.环境准备: 3.代码讲解 A.首先是与调试环境交互相关的代码讲解: B.其次是神经网络代码的讲解 C.最后就是模型训练的代码了 四.总结 1.前言: 学习了DQN有一段时间了 ...

  7. C语言简单的键盘玩扫雷小游戏(完结)

    1:这次我们会将前面的代码进行整合,和整理,最终使我们的程序可以有效的运行起来. [1]初始化函数. void GameInit() {     //随机数种子     srand((unsigned ...

  8. Python如何入门?直接按这个方式玩炸弹超人小游戏,就能掌握编程

    还在从基础知识点开始学python吗? 还不如直接玩python小游戏炸弹超人,跟着详细教程开始,从不会python到掌握python基础知识点,并且还有所有源码,想学不会编程都难. 下面讲一下开发P ...

  9. python生成一笔画_用Python玩烧脑小游戏《一笔画完》,瞬间闯到100关

    原标题:用Python玩烧脑小游戏<一笔画完>,瞬间闯到100关 " 昨天和朋友出去外面吃饭,吃完饭后朋友打开了一个小程序玩了起来...... 游戏长这样 大概玩法是:从地图中猫 ...

最新文章

  1. Day1 - Python基础1作业【编写登陆接口】
  2. python绘制3维图-1、2、3维图见过,用Python画出来的六维图见过么?
  3. conductor任务域
  4. xpath的基本使用
  5. python列表赋值 连续整数_Python_03_字符串_数据类型_for循环_列表操作
  6. Intel 64/x86_64/IA-32/x86处理器 - 通用指令(7) - 标志寄存器/标志控制指令 段寄存器指令
  7. python编写个人信息_1、纯python编写学生信息管理系统
  8. 【渝粤教育】国家开放大学2019年春季 1067知识产权法 参考试题
  9. 2018-2019-1 20165319 《信息安全系统设计基础》第八周学习总结
  10. Python中各种括号的区别、用途及使用方法
  11. 现在工作和技术一般,想下班后充充电多学点东西。然而事实却相反,怎么让自己的学习更加有毅力?...
  12. Linux使用笔记: 使用Samba访问windows的共享目录(转载)
  13. 【TSP】基于matlab GUI改进的遗传算法求解旅行商问题【含Matlab源码 926期】
  14. 【第八周】程序设计方法学
  15. 霍尔高斯计G81在地磁测量上的运用
  16. 数据恢复软件性能大比拼
  17. 通过url直接访问项目图片
  18. 机顶盒及编解码器的音视频质量评价测试
  19. local class incompatible: stream classdesc serialVersionUID = -3129896799942729832, local class seri
  20. UE4超过20万个动画角色的优化实战

热门文章

  1. teigha开发从入门到精通(1)-- oda产品体系及功能简介
  2. 深入理解计算机系统_第三章_程序的机器级表示
  3. 惨遭全国大厂封杀的百分百进大厂的面试题,确定不来看看。
  4. 【爬虫之路】批量下载5sing上一位歌手的全部歌曲
  5. 使用JS报错 xx is not defined at HTMLAnchorElement.onclick
  6. 光流 | 基于KLT(Kanade-Lucas-Tomasi)算法的人脸检测与跟踪
  7. 精准表达课学习心得《一》
  8. scroll-view的横向滚动
  9. 物联网智能家居体系结构划分
  10. 【Unity】文字游戏制作插件Fungus教程(5)成熟的对话框的开发