【论文翻译学习】MIDINET: A CONVOLUTIONAL GENERATIVE ADVERSARIAL NETWORK FOR SYMBOLIC-DOMAIN MUSIC GENERATION

论文来源:Yang L C , Chou S Y , Yang Y H . MidiNet: A Convolutional Generative Adversarial Network for Symbolic-domain Music Generation[J]. 2017.

ABSTRACT

大多数现有的用于音乐生成的神经网络模型都是使用RNN。然而近期,由DeepMind提出的WaveNet模型显示,CNN同样可以在音频领域生成波形文件形式的音乐。基于这个研究,我们探索使用CNN生成一个又一个小节的旋律(一系列MIDI音符)。除了生成音乐外,我们还使用一个鉴别器来学习旋律的分布,使其成为一个生成对抗网络(GAN)。此外,我们提出一个机制,利用现有的先验知识,使该模型可以生成旋律从零开始,通过遵循和弦序列,或通过调整之前的小节旋律(如启动旋律),以及其他可能性。由此产生的模型被命名为MidiNet,它可以被扩展来生成具有多个MIDI通道(即音轨)的音乐。我们对MidiNet生成的八小节长旋律和谷歌的MelodyRNN模型进行了用户研究,每次使用相同的启动旋律。结果表明,与MelodyRNN模型相比,MidiNet的演奏更真实、更悦耳,而且MidiNet的旋律更有趣。

INTRODUCTION

算法作曲并不是个新想法。根据Papadopoulos和 Wiggins的研究,第一个算法作曲的模型可以追溯到1959年。自从1989年开始,人们也开始用神经网络来生成音乐。然而,直到最近深度神经网络展示了它从大数据中学习的能力之后,用神经网络生成音乐才称为趋势。很多用于生成音乐的深度神经网络模型在过去两年都被提出。

大部分网络主要使用的是RNNs或它的变种,大概是因为RNNs就是为了生成序列存在的。这些模型在模型假设和音乐事件表示和预测的方式上有所不同,但它们都使用来自以前事件的信息来约束当前事件的生成。著名的例子包括用于符号域生成的MelodyRNN模型(即生成MIDIs)和用于音频域生成的SampleRNN模型(即生成波形)。

使用深度卷积神经网络(CNNs)进行音乐分类的尝试相对较少。一个值得注意的例外是最近提出的用于音频域的WaveNet模型。它每次生成一个音频样本,每个样本的预测分布以之前的样本为条件,通过扩展的因果卷积。WaveNet展示了CNNs生成真实音乐的可能性。这是令人鼓舞的,因为CNNs通常比RNNs训练更快,更容易并行化。

基于以上的研究,我们在这篇文章中提出一种新型的基于CNN的符号域音乐生成模型,这个模型主要应用与旋律的生成。我们以连续的方式,一个小节接着一个小节地生成旋律,而不是连续地创建一个旋律序列。这使得我们可以在一个二维矩阵上使用卷积来表示条状中不同时间步长的音符。我们可以为每一个真实的或生成的MIDI的小节有这样一个分数的表现(2-D score-like representation)

此外,为了生成更具创造性和多样性的音乐,我们使用随机噪声作为CNN生成器的输入。生成器的目标就是将随机的噪声转化成前面提到的二维计分的形式(2-D score-like representation)。这个转化使用的是转置卷积。同时,我们还训练了一个鉴别器CNN,它将一个二维的分数样表示(2-D score-like representation)作为输入,并预测它是来自真实的MIDI还是生成的MIDI,从而通知生成器如何显示为真实的。这相当于一个生成对抗网络(GAN),它在博弈论的概念下迭代地学习生成器(generator)和鉴别器(discriminator)。

这个GAN单独没有考虑不同小节之间的时间依赖性。为了解决这一问题,我们提出了一种新的条件机制,利用前几个小节的音乐来决定目前几个小节的生成。这是通过学习另一个CNN模型来实现的,我们称之为调节器CNN(conditioner CNN),它将之前的条形图信息整合到生成器CNN的中间层中。这样,我们的模型可以“回顾”,而不需要像在RNNs中使用的重复单元。与RNNs一样,我们的模型可以生成任意数量的小节的音乐。

因为我们使用随机噪声作为生成器的输入,我们的模型可以从头开始生成旋律,也就是说,不需要任何其他提前有的信息。然而,由于调节器CNN,我们的模型有能力利用任何现有的信息,并可以表示为一个矩阵。例如,我们的模型可以通过遵循和弦进行,或者通过遵循几个起始音符(即一个启动旋律)来生成音乐。给定相同的启动旋律,我们的模型每次都会产生不同的结果,同样是由于随机输入。

利用不同的调节器CNN,可以将所提出的模型扩展到生成不同类型的音乐。基于特征匹配的思想,我们提出了一种控制这些调节器CNN对生成结果影响的方法。然后我们可以控制,例如:当前的小节应该听起来和以前的小节有多像。此外,我们的CNNs可以很容易地扩展到处理张量而不是矩阵,所以可以利用多通道MIDIs并生成多个轨道或声部的音乐。我们相信这种高度自适应和通用的模型结构可以成为基于RNN的一个有用的替代方案。我们把这种新模式称为MidiNet。

在我们的实验中,我们进行了一个用户研究来比较MidiNet和MelodyRNN模型生成的旋律。为了进行公平的比较,我们使用相同的启动旋律来生成8小节长的旋律(包括启动词),没有任何其他的事先信息。为了演示MidiNet的灵活性,我们提供了两个附加设置的结果:一个附加使用八小节长的和弦进行来调节生成,另一个使用稍微不同的网络架构来生成更有创意的音乐。为了便于再现,MidiNet的源代码和预先训练的模型在网上发布。

RELATED WORK(可以用在文献综述上)

在这里插入图片描述
近年来,人们提出了大量用于音乐生成的深层神经网络模型。这包括生成旋律序列或音频波形的模型,其方法是跟随一些启动音符,将旋律序列与其他部分的音乐伴奏,或与人类一起演奏二重唱。表1比较了MidiNet和一些主要的相关模型。我们将在下面简要描述每一个。

Google Brain团队的Magenta项目提出的MelodyRNN模型可能是神经网络生成符号域音乐的最著名例子之一。总共提出了三个基于RNN的模型,包括两个旨在学习长期结构的变体:回望RNN和注意RNN。三个模型的源代码和预先训练的模型都是公开的。由于MelodyRNN的主要功能是从启动旋律生成旋律序列,因此我们使用MelodyRNN模型作为评估的基准。

Song from PI是一个层次化的RNN模型,它使用递归层的层次来生成旋律和鼓和弦,从而生成多声道流行歌曲。该模型很好地证明了RNNs同时生成多个序列的能力。然而,它需要事先了解音乐的音阶和一些旋律的轮廓,这在许多其他的模型中是不需要的,包括MidiNet。

DeepBach是由Sony CSL公司提出的,专门为创作J.S.巴赫风格的复调四段合唱音乐而设计。它是一个基于RNN的模型,允许执行用户定义的约束,如节奏、音符、部分、和弦和节奏。
据我们所知,C-RNN-GAN是迄今为止唯一使用GAN来产生音乐的现有模型。它也像MidiNet一样以随机噪声作为输入,生成不同的旋律。然而,它缺乏一种条件机制,通过跟随一个启动旋律或和弦序列来产生音乐。

WaveNet是DeepMind提出的一个基于CNN的模型,用于创建语音和音乐的原始波形。音频域生成的优点是可以产生新的声音,但是本文选择了符号域生成。

METHODS

在这里插入图片描述
MidiNet的系统图如图1所示。下面,我们将介绍每个主要组件的技术细节。

1、卷积的符号表示
我们的模型使用固定时间长度的音乐符号表示,将MIDI文件分割成条。MIDI频道的音符事件可以用h乘w实值矩阵X表示,其中h表示我们考虑的MIDI音符的数量,可能还包括一个表示没有声音的维度,w表示我们在一个条中使用的时间步数。对于旋律生成,每个时间步最多有一个活动音符。如果忽略了音符事件的力度(velocity),我们使用二元矩阵X∈{0,1}h×w。如果我们想产生多音轨音乐,我们在每个小节使用多个矩阵。在这种表示法中,我们可能无法轻易区分长音符和两个短重复音符(即具有相同音高的连续音符)。以后的扩展可以用来强调布景上的音符。

2、生成器CNN和鉴别器CNN
MidiNet的核心是改进后的DCGAN,这个网络的目的是在于训练鉴别器D去识别真实数据和生成数据,然后让生成器G去“欺骗”D。在传统GANs中,G的输入是一个随机噪声向量,输出是一个h×w的矩阵,并且这个输出要尽可能的能欺骗D的识别。GANs训练G和D的方法是通过解下面这个函数:
在这里插入图片描述
其中X代表真实数据中的样本,z代表随机分布生成的样本。在传统GANs中,我们需要迭代多次来训练G和D以获得更好的G。

本文模型中的D是有着几个卷积层+全连接层的CNN网络。这些层通过交叉熵损失函数(cross-entropy loss function)进行优化,所以D的输出越接近1则越接近真实数据,越接近0则越接近生成数据。我们使用sigmoid层来保证D的最后输出是在0-1之间的。

另一方面,我们G的目的是让D的输出更接近1。对于G的生成来说,它要将随机生成的向量z转化成矩阵X。这是通过以下步骤实现的:首先通过几个全连接层;然后几个转置卷积层(transposed convolution layers)。
由于极小极大对策的性质,GANs的训练存在不稳定性和模式崩溃的问题。在改进GANs训练的各种可能技术中,我们在模型中采用了所谓的特征匹配和单侧标签平滑。特征匹配的思想是在上述公式1中加入额外的L2正则化,使得真实数据和生成数据的分布更加接近。

此外,当我们训练G的时候我们还添加了下面两项:
在这里插入图片描述
其中 f 表示G的第一个卷积层,λ1和λ2是根据经验设置的参数。

3、调节器CNN
在基于GAN的图像生成中,人们经常使用一个矢量来编码可用的先验知识,这些先验知识可用于条件生成。这是通过重塑向量的形状,然后将其添加到G和D的不同层来实现的,以提供额外的输入。假设条件向量的长度为n,将其添加到形状a×b的中间层,我们可以重复值ab次以得到形状a×b×n的张量,然后将其与特征映射轴中的中间层连接。图1中的浅橙色块说明了这一点。我们称这种条件向量为一维条件。

由于我们的GANs的生成结果是一个由音符和时间步组成的h×w矩阵,因此如果我们可以直接对矩阵的每个条目执行条件化,就很方便了。例如,前一个节的旋律可以表示为另一个h×w矩阵,并用于调节当前节的生成。我们可以有多个这样的矩阵,从多个以前的小节学习。我们可以直接将这样的条件矩阵添加到D的输入层,来影响所有后续层。然而,要利用G中的这种二维条件,我们需要一种机制将条件矩阵重塑为不同形状的较小向量,将它们包含到G的不同中间层。

我们通过使用一个调节器CNN来实现这一点,这个调节器CNN可以被看作是生成器CNN的颠倒。如图1中的蓝色块所示,调节器CNN使用几个卷积层来处理输入的h×w条件矩阵。调节器和发生器CNN在其卷积层中使用完全相同的滤波器形状,因此其卷积层的输出具有“兼容”形状。这样,我们可以将调节器CNN的卷积层的输出连接到发生器CNN的相应转置卷积层的输入,以影响生成过程。在训练阶段,通过共享相同的梯度,同时训练调节器和发生器CNN。

4、为了创造性的调整
我们提出了两种方法来控制MidiNet的创造性和纪律性之间的权衡。第一种方法是通过仅在G的中间转置卷积层的一部分中使用这些条件来操纵这些条件的效果,以使G从强加的条件中获得更大的自由度。第二种方法利用特征匹配技术的效果:我们可以增加λ1和λ2的值,使生成的音乐声音更接近现有音乐(即在训练集中观察到的音乐)。

INPLEMENTATION

1、数据集
由于本文考虑的主要任务是旋律的生成,为了训练MidiNet,我们需要一个MIDI数据集,该数据集清楚地指定每个文件中哪个频道对应于旋律。为此,我们从TheoryTab抓取了1022个流行音乐MIDI选项卡,每个选项卡正好提供两个频道,一个用于旋律,另一个用于基本和弦音程。利用这个数据集,我们可以实现至少两个版本的MidiNet:一个只从旋律通道学习,以便与不使用和弦的MelodyRNN进行公平比较;另一个额外使用和弦来调节旋律生成,以测试MidiNet的能力。

为了简单起见,我们过滤掉了包含24个基本和弦三和弦(12个主和弦和12个副和弦)以外的和弦的MIDI选项卡。接下来,我们每隔8个小节分割剩余的选项卡,然后分别预处理旋律通道和和弦通道,如下所述。

对于旋律,我们将最小的音符单位固定为第十六个音符,使w=16。具体地说,我们将后面有暂停音符(pause note)的音符延长。如果一个小节的第一个音符是暂停,我们会延长第二个音符,让它在小节开始时播放。还有其他的例外,比如三元组和较短的音符(比如第32个音符),但是我们选择在这个实现中排除它们。此外,为了简单起见,我们把所有的旋律转换成两个八度音阶,从C4到B5,忽略了音符事件的力度(velocity)。尽管在这些预处理步骤之后,我们的旋律将只使用24个可能的音符,但我们在符号表示中考虑了所有128个MIDI音符(即从C0到G10)。这样做,我们可以通过检查模型是否在这些八度音阶之外生成音符来更容易地检测模型的崩溃。由于预处理后数据中没有暂停音符(pause notes),因此我们不需要维度来表示无声的音符。因此,h=128。

对于和弦,我们发现使用只有13个维度的和弦表示(前12个维度用于标记键,最后一个维度用于表示和弦类型(即主和弦或副和弦),而不是使用24维的一个one-hot,这样更有效,如表2所示。我们修剪了和弦,使每个小节只有一个和弦。
在这里插入图片描述
在这些预处理步骤之后,剩下526个MIDI标签(即4208条)。为了增加数据,我们循环地将旋律和和弦移到12个等音阶的任意一个键上,最终得到50496条旋律和和弦对的数据集。

2、网络的具体实现
我们的模型是在TensorFlow中实现(也有PyTorch版本)的。对于生成器,我们使用长度为l=100的高斯白噪声的输入随机向量。每个随机向量经过两个全连接层,分别有1024个和512个神经元,然后被重塑为1×2矩阵。然后我们使用四个转置卷积层:前三个使用形状1×2和两步的滤波器,最后一个使用形状128×1和一步的滤波器。因此,我们的调节层(conditioner)有四个卷积层,第一层使用128×1滤波器,另三层使用1×2滤波器。为了创建一个单音音符序列,我们在G的末尾添加了一个层来关闭每个时间步,除了激活度最高的音符。

与GANs中的典型情况一样,鉴别器可能会压倒生成器,导致所谓的消失梯度问题。我们采用了两种策略来削弱鉴别器。首先,在每次迭代中,我们更新了G和C两次,但D只更新一次。其次,我们只使用了两个卷积层(形状128×2,两步的14个滤波器,形状1×4,两步的77个滤波器)和一个完全连接层(1024个神经元)作为D。

我们微调了MidiNet的其他参数,并在实验中考虑了以下三种变体。
模型1:旋律生成,没有和弦
模型2:旋律生成,有和弦,稳定版本(没有2-D condition)
模型3:旋律生成,有和弦,创造版本(在G的每个转置卷积层中都放个2-D condition)

RESULT和CONCLUSION这两个部分不翻译了,大致就是MidiNet有多好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值