MIR

Music Information Retrieval

Posted by LmYjQ on March 22, 2019

译自 《A Tutorial on Deep Learning for Music Information Retrieval》

目录

  • 1.动机(略)
  • 2.深度学习基础
  • 3.MIR任务介绍
  • 4.核心模块
  • 5.辅助模块
  • 6.总结

2. 深度学习基础

BP+SGD求解神经网络;CNN提取特征,LSTM针对序列数据;Relu激活函数

2.1 深度学习和”传统”方法对比

传统: 输入->特征提取(MFCC)->分类器->结果
深度学习:输入->很多很多层->结果
用“很多很多层”代替“特征提取(MFCC)+分类器”

2.2 网络如何设计&训练

设计:网络结构长什么样子,由超参数决定(hyperparameters),训练过程中不变
损失函数:定义”理想“和”现实“的差距
训练:将数据喂给定义好网络结构和损失函数的神经网络学习,学习过程中参数(weight)不停的变化,直到收敛
梯度:学习过程中需要走的路
学习率:每一步走多大。有一系列动态调节的机制,adam,rmsprop,adagrad,momentum等
激活函数:每一个神经元输入与输出的关系,产生非线性

2.3 数据量小怎么办

数据增强(data augmentation):在不破坏原始数据的前提下增加加噪声,当作新的样本
迁移学习(transfer learning):用其他任务训练好的网络当作特征提取器,前提假设是两个任务的数据有相似性
随机网络:随机初始化的CNN可以达到不错的特征提取效果(惊呆🤯了)

3. MUSIC INFORMATION RETRIEVAL

3.1 MIR任务

不是所有问题都能只靠音频信号解决,分类/标签等信息很有用。
关注两个维度

(label的)主观度: 音高/调性/节奏/和声是客观的;风格,情绪是主观的
时间跨度: 音高/和声只要很短的片段就可以判断;情绪/调性需要比较长的旋律才能判断

3.2 音频信号表达

二维2D:时间域+频率域
STFT(short-time fourier transform):
Mel频谱:
Constant-Q Transform (CQT):
Chromagram:
[hop_length图&解释] (https://www.jianshu.com/p/bf6cb803f25e)

4. 用于MIR的深度网络

4.1 DenseLayer如何定义

二维2D:时间域+频率域
N Number of channels of a 2D representation声道数
F Frequency-axis length of a 2D representation频域维度
T Time-axis length of a 2D representation时域维度
H Height of a 2D convolution kernel (frequency-axis)频域卷积核维度
W Width of a 2D convolution kernel (time-axis)时域卷积核维度
V Number of hidden nodes of a layer隐藏节点数
L Number of layers of a network网络层数
每一层有输入和输出维度Vin和Vout

4.2 DenseLayer用于MIR

在2D数据(时域+频域表达)之上使用DenseLayer,对每一帧做非线性变换,还可以利用相邻帧作为上下文信息
DenseLayer不具有平移/放缩不变性

4.3 ConvLayer卷积层


weight sharing共享权重:卷积核在输入样本中“滑动”,减少参数量
feature map: 卷积核在每一个位置激活得到的输出,空间不变性
pooling layer: 减少feature map的大小,下采样

4.4 卷积用于音乐

stacking: 多个卷积层串联,提取复杂特征 kernel size: 不宜过小,学不到信息。也不应过大,用多个小kernel stacking比用一个大kernel好 1D卷积核学到基频
2D卷积核学习时间-频率二维表达 和弦显著性增强器??输入3 bins/note CQT

4.5 RecurrentLayer循环层


和HMM类似,输入状态x和之前的隐状态生成新的隐状态,隐状态激活得到最终输出
实际使用中,因为RNN存在梯度消失/爆炸问题,通过加入遗忘机制的GRU/LSTM解决

4.6 RecurrentLayer用于MIR

输入和隐层全联接,也可以用全联接层代替
RecurrentLayer内不能使用平移不变性,RecurrentLayer适用于序列特征(为啥?),比如MFCC或卷积层输出的feature map
输出层的维度V要足够大才能保留足够多的信息
考虑性能:控制RecurrentLayer长度
不同的问题考虑用不同的结构: many-to-many, many-to-one
未来的信息有用,可以用bi-directional

5. 实践经验

5.1 预处理

预处理重要,影响训练效率
常用方法

取对数 Spectral whitening: https://dsp.stackexchange.com/questions/10183/what-is-spectral-whitening

5.2 聚合信息

pooling: max-pooling最常见 strided convolution: 卷积核移动步长大于1
recurrent layers: 汇总一个轴的特征

5.3 网络深度

趋势当然是变深了。。

5.4 输入后的第一层

d1: denselayer不具有频率平移不变性。输出层中,denselayer消除了频率域的空间性,因为整个频率域被映射到标量值 d2: 和d1类似,多帧同时操作 c1: 等价于d1或d2 c2: 输出N feature map,保留每个轴的空间性。还可用作预处理 r1: 将输入帧映射到其他维度,和d1的特性类似。因为可以输入很多个相邻帧,所以使用条件和d2类似

5.5 中间层

d1, d2, c1, r1: 叠更多层,增加非线性,还可以看到更多上下文
c2: 叠得多看的多 p1,p2: 下采样,降噪

5.6 输出层

基本都是denselayer,softmax多分类

5.7 建模建议

5.7.1 时变系统
5.7.2 时不变系统