前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >让深度学习帮你创作爵士乐

让深度学习帮你创作爵士乐

作者头像
AI研习社
发布2018-03-19 16:07:39
7150
发布2018-03-19 16:07:39
举报
文章被收录于专栏:AI研习社AI研习社

数学与音乐有着内在的联系。

用算法作曲的历史,可以追溯到计算机科学出现的初期。翻译模型可以把一张图片转译为音乐。这都是基于规则的:如果图片里有一条水平的线,就会把它译为持续的高音;反之,一条垂直的线会表示为上升的音阶。

第一次尝试使用计算机作曲的是伊利诺伊大学厄巴纳 - 香槟分校的两位美国教授,Hiller 和 Issacson。他们通过在学校的 Iliac 计算机上编程来作曲,输入随机数字来制定音高,并利用古典对位法测试这套程序。因此如果音高不适合这个作品,就会生成另一个音符。这还依赖于通过马尔可夫链利用过去的概率预测未来的概率。

这台计算机在 1957 年创作出第一首乐曲,叫做 “Iliac 弦乐四重奏组曲”,虽然登上了《Scientific American》的头条,但许多音乐界的权威对此并无善意,他们认为这会逐渐削弱人类的创造力。直到 Hiller 去世后,才把这件新闻刊登在音乐界的主流期刊上。

现如今,有许多神奇的生成软件可以帮助作曲家们作曲。接下来,我们要学习用 Keras 建立一个能生成爵士乐的模型。

1. 获取数据

我们将会输入一段 MIDI 格式的钢琴曲。MIDI 是乐器数字接口,它就像表示音乐的数字字母表,里面包含许多信息。因为这些信息是一个序列,所以我们会把递归网络用做序列学习模型。

我们将会抽取每一个 MIDI 文件中旋律与和声的节点流,和声的和弦伴随着旋律的单音,然后通过节拍的数量将它们分类使每个节拍都有它自己的一组和弦,这种节拍和弦对就是我们所说的抽象文法( abstract grammars)。

我们将把输入内容转化为二进制矩阵,使得输入内容矢量化,这样就可以将它们输入模型中。

2. 建立 2 层 LSTM 模型

我们将会制作一个 LSTM 网络。计算图是这样的:

音符的矢量化序列会被输入第一个 LSTM 单元格中,然后我们会应用 Dropout 来确保模型泛化合适。之后重复一遍刚才的步骤。

接着把数据输入最后一个标为密集(Dense)的完全连接层,正因为前几个图层中的每一个神经元都连接着这层中的每个神经元,这会把所有学习过的信号混合在一起,因此我们的预测是真正地基于整个输入序列。

最后,把结果用 softmax 激活函数转换为输出概率,这个结果可能就是序列中的下一个音符。

当我们建立第一个 LSTM 层时,默认返回上个矢量,而不是整个序列。所以我们要把返回序列设为 True,这样才能返回整个序列,在这个基础上就可以叠加另一个 LSTM 层了。

使用两个而非一个 LSTM 层允许输入内容有更加复杂的特征表示,也就是更高的泛化能力,这样我们就会获得更好的预测。

递归网络 RNN 本质上是一系列互相联系的前馈网络,每个前馈网络的输出与隐藏层会被输入下一个网络中。

当每一层都反向传播时梯度会呈指数级减小,因此步长也会变得非常小,这会使深度网络中较低层权重的学习速率变得十分缓慢,这就是 “梯度消失问题”。LSTM 递归环节可以通过保留误差来解决这个问题,而这些误差必须是可以通过时间和分层反向传播的。

一个 LSTM 神经元包含三个门:输入门,遗忘门和输出门。这就好像一个细胞状态,细胞状态就像是一个传送带,它只允许记忆流过而且保持不变。

这些交互动作也是门,可以从被它们控制的细胞状态中添加或清除记忆。它们可以随意选择是否让记忆通过。每一个门都包含一个 sigmoid 神经网络层和一个乘法运算,sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少可以通过。

用以下方程式表示每一个门:

w 表示每个门的权重。内部记忆改变的方式就像水流从水管里通过一样。把记忆想象成水流,水流进管道,如果我们想要改变记忆(水流)的流向,可以通过两个阀门控制。首先是遗忘阀,当我们关上遗忘阀,以前的记忆不再被保存;当我们打开遗忘阀,所有以前的记忆都会通过。

另一个阀门是新记忆阀。新记忆通过一个 T 形节点流入,然后与以前的记忆合并,而流入的新记忆的多少则由这个阀门控制。输入存在于以前的记忆中,并且从遗忘阀中通过。这个过程实际上是一个乘法运算。接着以前的记忆到达 T 型接管,这是一个加法运算。新的记忆与以前的记忆通过这个运算合到一起。

总的来说,这个运算将以前的记忆更新为新的记忆。

3. 训练模型

我们会把损失函数定义为分类交叉熵,用两种概率分布间的交叉熵测量平均位数,需要从一系列的可能性中确定一个事件。因为数据已经输入序列中,交叉熵就能够测量出真正的下个音符与我们预测的下个音符之间的区别。

4. 预测序列

通过使用 rmsprop 算法来使损失函数最小化,它是一种随机梯度下降算法。因此我们会一遍又一遍地预测序列中的下一个音符,直到有了一系列生成的音符。

5. 将输出保存为 MIDI

把这些音符译成 MIDI 格式然后写进文件里,这样我们就可以听了。快去视频中听一下最终输出的音乐吧!

  • 我们可以使用 LSTM 网络,预测音符序列从而生成音乐
  • LSTM 网络包含三个门:输入门,遗忘门和输出门,我们可以把这些门看做阀门
  • 这些阀门可以控制记忆的在网络中的储存以解决梯度消失问题
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档