SampleRNN
1. 介绍
SampleRNN 是用于处理声音合成的层次化循环神经网络,是一个端到端的无条件合成模型,其对于超长序列之间的依赖关系处理的效果很好。在采样率为16 KHz的情况下依然能保持比较好的性能和依赖关系,适用于高保真的声音合成。
其采用了多层的RNN类神经网络在不同的分辨率下对序列进行处理和预测,最后输出一个波形样本,最上层的分辨率最低,计算量最小,处理的时间域最长,只需要接受多个输入数据帧作为输入,随后层数越低,其分辨率越高,处理的时间域越短,计算量越大,最后一层仅对单个样本做处理,并输出预测波形。
在论文中,其将SampleRNN网络结构分层了两层:1. 帧级层,2. 采样级层,其将除了最低层以外的更高级层统称为帧级层,而最低层称为采样级层。
下图展现了其结构
SampleRNN 将波形样本序列 X = { x 1 , x 2 , … , x T } X=\{x_1,x_2,\dots, x_T\} X={x1,x2,…,xT}的可能性建模为每个样本以前面所有样本为条件下的概率的积,即:
p ( X ) = ∏ i = 0 T − 1 p ( x i + 1 ∣ x 1 , x 2 , … , x i ) p(X)=\prod \limits _{i=0}^{T-1}p(x_i+1|x_1,x_2,\dots,x_i) p(X)=i=0∏T−1p(xi+1∣x1,x2,…,xi)
2. 帧级层
帧级,采样级都是相对而言的,相比采样级只针对一个样本做处理,第 k k k 层的帧级层需要对 F S ( k ) FS^{(k)} FS(k) 大小样本的非重复帧做处理,每个帧级层模块都是一个深度 RNN,可以是GRU,LSTM等其他RNN 变体,其用于将它的输入的历史数据进行处理使之成为一个用于下一层处理数据的条件向量。
二话不说,我们先砸公式,针对公式我们慢慢讲解,下面的公式仅对帧级层而言:
KaTeX parse error: No such environment: eqnarray* at position 9: \begin {̲e̲q̲n̲a̲r̲r̲a̲y̲*̲}̲inp_t&=&\begin …
其中 k k k 表示第 k k k 层, f t ( k ) f_t^{(k)} ft(k) 表示第 k k k 层的输入帧,公式(1)表示当前层的输入取决于当前的时间步骤和当前所在的层,对于中间层,输入由当前输入帧和上一层输出的条件向量线性组合而成,而对于最高一层而言,输入就只是输入帧了。公式(2)是将截止到时间 t − 1 t-1 t−1 的变数量帧表达为一个定长的状态或者说记忆态 h t ( k ) h_t^{(k)} ht(k) , RNN 在时间t 利用一个对于之前的记忆态 h t − 1 k h_{t-1}^{k} ht−1k 和时间t 时刻的输入的函数计算后的结果更新记忆态,而 KaTeX parse error: Expected 'EOF', got '\cal' at position 1: \̲c̲a̲l̲ ̲H 可以是任意的已知记忆单元种类,如GRU,LSTM 等。
而由于不同的模块处理的分辨率不一样,我们就需要将条件向量 c c c 上采样成一系列的 $ r^{(k)}$ 个向量,其中$ r^{(k)}$是模块间处理分辨率的比,之后才能作为紧接下来的一层的模块的输入。公式(3)则是对此进行了一系列 r ( k ) r^{(k)} r(k) 个独立线性投影。
3. 采样级层
最低层,也就是采样级层,输出一个 x i + 1 x_{i+1} xi+1 上的概率分布,论文使用了Softmax对输出结果进行了离散化,已得到更好的声音效果,将其映射到了256维的离散空间。
由于要处理的帧很少,并且相邻样本的以来也很容易由无记忆性模块模拟出来,所以论文中摒弃了RNN, 而是采用了MLP模型以提升效率,同时离散输入数值映射到实值向量嵌入来获得更好的语音质量。
在采样级层,公式表示如下:
KaTeX parse error: No such environment: eqnarray* at position 8: \begin{̲e̲q̲n̲a̲r̲r̲a̲y̲*̲}̲ f_{i-1}^{(1)}&…
其中 e i e_i ei 表示通过了嵌入层后的 x i x_i xi , 公式(2)的 W x W_x Wx 只是将输入帧和上一层条件向量线性组合起来,最后使用 S o f t m a x Softmax Softmax 将输出离散化。
4. 压缩反向传播
为了能够提升训练效率,将每个序列都切分为比较短的若干子序列,并且只传播梯度给子序列的最开始的部分,子序列越长,内存占用越高,收敛时间越长,训练时间越长,性能也会越好,论文中给的最好的子序列长度为512.