详述DeepMind wavenet原理及其TensorFlow实现

2017 年 6 月 26 日 深度学习每日摘要 DLdigest

详述DeepMind wavenet原理及其TensorFlow实现

本文参考文献

van den Oord A, Dieleman S, Zen H, et al. Wavenet: A generative model for raw audio[J]. CoRR abs/1609.03499, 2016.
被引次数:46

Yu F, Koltun V. Multi-scale context aggregation by dilated convolutions[J]. arXiv preprint arXiv:1511.07122, 2015.
被引次数:223

深度学习的兴起使得语音领域取得了较快的突破,例如,标准测试集上语音识别的准确率已经接近97%左右,而现在正要解决的问题是含噪的语音识别以及远场的语音识别。语音识别(Automatic Speech Recognition,ASR)是利用计算机将音频数字信号转化成可以阅读的文本,而与语音识别互逆的一个过程是语音合成,语音合成(Text to Speech,TTS)是利用计算机的数字处理技术将文本以合适的语音信号传达出来。无论是语音识别还是语音合成,本质上都是一个sequence-to-sequence的问题。

语音合成现在面临的最大问题是合成的流畅度以及是否具备情感,今天要讲的wavenet是由DeepMind团队提出的完全基于深度神经网络的原始音频的语音合成,该文章一经发布便掀起热烈讨论,迄今为止已经被引用了46次,足以证明其影响力之巨大。那么wavenet究竟是什么呢?亮点在哪里?我觉得本文最重要的亮点有以下三个:

提出了一个完全基于神经网络的自然流畅的语音合成系统,并且是直接生成原始的语音波形信号

本文模型基于深度卷积神经网络,为了扩大长程关联性以及减少计算量,采取了dilated causal convolutions

本文模型不仅可以用于语音合成,也可以用于音乐合成,甚至可以用于语音识别

1.什么是dilated causal convolutions

wavenet借助条件概率来生成音频波形数据,即每一时刻的音频数据是由前面所有时刻的数据基础上进行抽样得到的。wavenet模型虽然是基于深度卷积神经网络,不过与普通卷积神经网络不同的是,wavenet重点是运用了dilated卷积。可能有读者会比较疑惑,什么是dilated卷积?为什么要采用dilated卷积?它相比传统的卷积有什么特别之处?要了解dilated卷积的由来,可以阅读第二篇参考文献《Multi-scale context aggregation by dilated convolutions》,我从这篇参考文献中筛选出了一句概括性的描述。“exponentially expanding receptive fields without losing resolution or coverage”,用中文描述,就是dilated卷积可以以指数级别进行扩充卷积的感知区域,同时又不会牺牲模型的收敛性能和精度。下面一幅图就是从参考文献中截取的,我想看了下面一幅图以后读者大概就可以明白了dilated卷积的核心思想。如下图所示,在dilated卷积中,引入了一个新的超参数dilate,它的意思是每隔dilate-1个像素点就取一个像素点进行卷积。可以看到,在图a中,dilate的值为1;在图b中,dilate的值为2;在图c中,dilate的值为3。直观来看,从a->b->c,卷积的感知区域在以指数范围扩大,但是由于它们的卷积核大小始终设定为3×3,因此实际上它们的参数个数是一样的,只不过卷积感知的区域不同而已

那么dilated卷积有什么作用呢?其实,我们平时一想到卷积神经网络,不免就会想到它的三个最大的特性:

浅层卷积神经网络可以发掘局部特征

深层神经网络可以学习到全局特征

卷积神经网络相比于循环神经网络而言,计算量大大降低

由此可以认为,设计dilated卷积的目的也是为了更好地实现这三点。传统的卷积操作虽然可以处理局部信息,就获取长程关联性而言,其需要设置较大的卷积核范围或者采取多层卷积堆叠才可以有效处理,然而这种方法带来的后果是计算量增加。如何有效地解决长程关联性与计算量之间的矛盾?这就是dilated卷积的作用了,简而言之,dilated卷积恰好利用了dilate这个参量,一方面可以处理长程信息,另一方面计算量也没有额外的增加。

明白了dilated convolution以后,我们回到wavenet原理中。由于语音序列有时候是比较长的,无论是对于语音识别还是语音合成而言,因此采取dilated convolution可以解决这个长程信息问题,wavenet的主要模块就是dilated convolution,在功能实现上,二维的dilate convolution可以通过mask来操作,因为语音和图像不同,语音更像是一个一维的信号,而对于一维的dilate convolution,可以在正常convolution的基础上对输出在时间维度上进行平移。如下图所示,本文采取的就是这样一个dilated convolution网络,不同层的dilation依次成倍增长,并且每层的输入和输出的长度是相同的。

wavenet在训练阶段和推理阶段是不一样的操作,训练阶段由于每个时刻的标准输出是已知的,所以每个时刻的操作可以并行处理;而在推理阶段,需要根据前面时刻的输出进行条件抽样才能得到后面时刻的输出,因此前面时刻的输出需要返回到网络中作为输入进行处理。

计算机将音频以离散的数字信号来存储的,例如对于一个采样频率为16KHz、比特数为16bit的音频,意思就是这段音频每秒钟会有16000个采样点,而计算机将每个采样点以16bit的整型数据进行存取,也就是说语音信号的每个采样点的振幅范围是0~65535。那么,在dilate convolution网络的末端,进行softmax分类的时候,会有65536种类别。但是我们知道类别太多肯定不利于分类,于是本文中采用的是u-law展开算法(ITU-T),将原本65536个类别量化成了256个种类,然后再根据u-law展开的逆函数转换成0~65535之间的数,虽然这种量化算法对数据精度作出了牺牲,但实验结果表明,这种量化对语音信号几乎没有损失。

u-law算法的表达式如下,其中xt的范围是-1到1,u的值为256,关于u-law算法的更多细节,可以参见维基百科: https://en.wikipedia.org/wiki/%CE%9C-law_algorithm。

wavenet另外一个亮点就是其使用了gated激活函数,这种gated激活函数我们并不陌生,原因是去年12月份,Facebook提出了使用门卷积神经网络来进行自然语言处理任务,一度掀起了门卷积神经网络是否会替代LSTM的广泛探讨。Facebook提出的门卷积神经网络的核心思想和这里的gated激活函数其实是一样的,如下图所示就是gated激活函数的表达式。⋆表示卷积操作,可以看到,式中有两个对输入进行卷积的操作,一个卷积的激活函数是tanh,另外一个卷积的激活函数是sigmoid,通过这两个卷积操作相乘得到了最终的激活输出,我们也可以认为其中一个卷积操作充当了门的作用,借用此门得以控制另外一个卷积的输出,这种做法源自LSTM的工作机制。除此之外,模型中还添加了残差连接,这一技巧最近被广泛使用,目的是加快深度模型的收敛速度,从而可以加快训练,关于什么是残差网络,可以阅读我之前的推送。

文章最后给出了基于wavenet的语音合成实验结果,两个对照模型分别是基于HMM的语音合成模型和基于LSTM-RNN的语音合成模型,并且实验所采取的数据集都是一样的(24.6小时的北美音频,34.8小时的汉语音频),这样对照起来也具有说服力。实验结果如下图所示,可以看到wavenet显著刷新了准确率。除此之外,文中还提及了将wavenet用于音乐建模以及语音识别上,均取得了较好的效果。

wavenet的原理部分就介绍到这里,接下来基于TensorFlow实现文中最核心的模型,模型示意图如下所示。

def causal_convolution(inp, num_filter):
    output = tf.layers.conv1d(inp, num_filter, 2, strides=1, padding='same') 
    return output

def dilated_causal_convolution(inp, out_filters, filter_size, layer_id, dilation_rate):    in_filters = inp.shape[2]    
   with tf.variable_scope('dilated_causal_convolution_'+str(layer_id)):        _filter = tf.layers.conv1d(inp, out_filters, filter_size, padding='same', dilation_rate=dilation_rate)        _gate = tf.layers.conv1d(inp, out_filters, filter_size, padding='same', dilation_rate=dilation_rate)        conv = tf.tanh(_filter) * tf.sigmoid(_gate)        conv = tf.layers.conv1d(conv, out_filters, 1, padding='same')
       ## skip connection        if in_filters != out_filters:            output = tf.layers.dense(inp, out_filters) + conv        
       else:            output = inp + conv
       return output
       
       
if __name__ == '__main__':    batch = 2    in_width = 30    in_channels = 1    in_filter = 4    inp = tf.constant(np.random.rand(batch, in_width, in_channels).astype(np.float32))    o = causal_convolution(inp, in_filter)    dilation_rates = [1, 2, 4, 8]
   for i in range(len(dilation_rates)):        o = dilated_causal_convolution(o, 16, 2, i, dilation_rates[i])    o = tf.layers.conv1d(o, 16, 1, padding='same', activation=tf.nn.relu)    o = tf.layers.conv1d(o, 16, 1, padding='same', activation=tf.nn.softmax)
   with tf.Session() as sess:        sess.run(tf.global_variables_initializer())        print(sess.run(o).shape)        print(sess.run(o))


题图:Crystal Liu


你可能会感兴趣的文章有:

Layer Normalization原理及其TensorFlow实现

Batch Normalization原理及其TensorFlow实现

Maxout Network原理及其TensorFlow实现

时延神经网络(TDNN)原理及其TensorFlow实现

ConvLSTM原理及其TensorFlow实现

Network-in-Network原理及其TensorFlow实现

如何基于TensorFlow实现ResNet和HighwayNet

常见的两种注意力机制

深度残差学习框架(Deep Residual Learning)

深度残差学习框架(续)

语音识别领域三十年来重要论文合集及其下载地址

推荐阅读 | 如何让TensorFlow模型运行提速36.8%

推荐阅读 | 如何让TensorFlow模型运行提速36.8%(续)

拥有1200多star的项目是什么样的心情

深度学习每日摘要|坚持技术,追求原创

微信ID:deeplearningdigest
长按二维码关注我
登录查看更多
12

相关内容

在数学(特别是功能分析)中,卷积是对两个函数(f和g)的数学运算,产生三个函数,表示第一个函数的形状如何被另一个函数修改。 卷积一词既指结果函数,又指计算结果的过程。 它定义为两个函数的乘积在一个函数反转和移位后的积分。 并针对所有shift值评估积分,从而生成卷积函数。
注意力机制介绍,Attention Mechanism
专知会员服务
168+阅读 · 2019年10月13日
基于Tacotron模型的语音合成实践
深度学习每日摘要
15+阅读 · 2018年12月25日
漫谈语音合成之Char2Wav模型
深度学习每日摘要
8+阅读 · 2017年12月31日
循环神经网络的介绍、代码及实现
AI研习社
3+阅读 · 2017年11月21日
SampleRNN语音合成模型
深度学习每日摘要
4+阅读 · 2017年7月3日
Layer Normalization原理及其TensorFlow实现
深度学习每日摘要
32+阅读 · 2017年6月17日
时延神经网络(TDNN)原理及其TensorFlow实现
深度学习每日摘要
56+阅读 · 2017年5月19日
Arxiv
6+阅读 · 2020年4月14日
Neural Speech Synthesis with Transformer Network
Arxiv
5+阅读 · 2019年1月30日
Arxiv
3+阅读 · 2018年11月13日
Arxiv
7+阅读 · 2018年9月27日
VIP会员
相关VIP内容
注意力机制介绍,Attention Mechanism
专知会员服务
168+阅读 · 2019年10月13日
相关资讯
基于Tacotron模型的语音合成实践
深度学习每日摘要
15+阅读 · 2018年12月25日
漫谈语音合成之Char2Wav模型
深度学习每日摘要
8+阅读 · 2017年12月31日
循环神经网络的介绍、代码及实现
AI研习社
3+阅读 · 2017年11月21日
SampleRNN语音合成模型
深度学习每日摘要
4+阅读 · 2017年7月3日
Layer Normalization原理及其TensorFlow实现
深度学习每日摘要
32+阅读 · 2017年6月17日
时延神经网络(TDNN)原理及其TensorFlow实现
深度学习每日摘要
56+阅读 · 2017年5月19日
Top
微信扫码咨询专知VIP会员