一、Predictive Coding系列
CPC[4][8]
Contrastive Predictive Coding包含三部分:
- 编码网络
多层CNN,将输入wave进行降采样,映射为隐层表示 z t = g e n c ( x t ) z_t=g_{enc}(x_t) zt=genc(xt) - 自回归网络
多层GRU,从隐层表示提取context信息, c t = g a r ( z ≤ t ) c_t=g_{ar}(z_{\le t}) ct=gar(z≤t) - 打分函数
f k ( x t + k , c t ) = e x p ( z t + k T W k c t ) f_k(x_{t+k},c_t)=exp(z_{t+k}^TW_kc_t) fk(xt+k,ct)=exp(zt+kTWkct)
训练使用Noise-Contrastive Estimation(NCE)的损失函数,给定
N
N
N个随机样本
X
=
x
1
,
.
.
.
x
N
X={x_1,...x_N}
X=x1,...xN,里面包含一个正样本
p
(
x
t
+
k
∣
c
t
)
p(x_{t+k}|c_t)
p(xt+k∣ct)和
N
−
1
N-1
N−1个负样本,优化的目标函数是:
L
=
l
o
g
f
k
(
x
t
+
k
,
c
t
)
∑
x
j
∈
X
f
k
(
x
j
,
c
t
)
L=log\frac{f_k(x_{t+k},c_t)}{\sum_{x_j\in X}f_k(x_j,c_t)}
L=log∑xj∈Xfk(xj,ct)fk(xt+k,ct)
APC[5][7]
Autoregressive Predictive Coding主要用于无监督的语音表示学习,基本的思路是先进行无监督预训练,然后使用预训练的网络抽取特征用于下游任务。
APC的输入为语音特征,网络部分使用RNN和regression layer,训练的loss是通过历史
(
t
1
,
t
2
,
.
.
.
,
t
k
−
1
)
(t_1,t_2,...,t_{k-1})
(t1,t2,...,tk−1)来预测未来
t
k
+
n
t_{k+n}
tk+n(这里预测第n帧特征的设计,是为了让模型可以学到更全局的结构信息):
∑
i
=
1
T
−
n
∣
x
i
+
n
−
y
i
∣
\sum_{i=1}^{T-n}|{x_{i+n}-y_i}|
i=1∑T−n∣xi+n−yi∣
文章在音素识别和说话人识别两个下游任务对比了APC和CPC的效果:
- 两个任务上面,APC优于CPC
- 最优n跟不同的任务以及RNN的层数有关,一般3-5
- 说话人任务使用底层RNN的输出作为特征更好,音素识别使用高层RNN的输出作为特征更好
MPC[6]
Masked Predictive Coding的loss借鉴的BERT的Masked LM,网络使用transformer。
总结
前面CPC和APC类似于NLP领域的GPT模型,网络使用单向RNN,即使用截止到当前的所有输入来预测未来,MPC类似于NLP领域的BERT模型,网络使用transformer,使用全部的输入来预测某一段mask。
二、wav2vec系列
wav2vec系列的预训练方法是facebook AI Research团队的工作
wav2vec[9]
wav2vec基本思路类似于CPC,使用预训练网络提取特征,用于下游的语音识别任务。
框架中的两个encoder和context两个网络都是使用的多层CNN,训练loss采用contrastive loss。
vq-wav2vec[10]
vq-wav2vec在wav2vec的基础上做了进一步的改进,增加quantization模块,包括gumbel-softmax和K-means clustering两种量化方法。这样可以将输入进行离散化,这一步的目的是方便利用transformer的mask loss。整体训练流程包括三步:
- 训练vq-wav2vec
- 基于vq-wav2vec离散化的输出进一步进行BERT的预训练
- BERT预训练模型当做特征提取器,提取的特征当做AM的输入
所以本质上还是feature-based的预训练方法。
[11]进一步验证使用量化模块会带来明显的提升,说明了BERT的预训练非常依赖量化的步骤。fbank<量化的fbank<vq-wav2vec.
wav2vec2.0[12]
将vq-wav2vec的训练流程进一步改进和优化,整体训练流程如下:
- 训练wav2vec2.0,其中context部分直接使用transformer替换原来的cnn,相当于将vq-wav2vec的前两步合并为一步
- 训练好的wav2vec2.0网络,直接finetune应用到下游任务
所以本质上是finetune-based的预训练方法
wav2vec2.0的应用
多语种任务[1]
- 在西班牙语的测试集上面,100小时以上西班牙语语料预训练的模型要好于1350小时的英文预训练的模型,同时好于混合数据预训练(包含100小时西班牙语料)的模型
- 对于中文数据集合上面,50小时中文预训练的模型要差于1350小时的英文预训练模型,1350小时的英文预训练模型差于1350小时混合数据预训练模型
对于小数据量(小于100小时)的任务,1350混合数据>1350英文预训练>>对应语种的预训练
对于大数据量(几百小时)的任务,对应语种的预训练>>1350混合数据>1350英语数据
对于小数据量(小于100小时)的unseen语种任务,混合数据(不包含该语种)>对应语种的预训练
与self-training的融合[2]
结合思路:
- unlabel数据训练wav2vec
- 使用少量的label数据finetune第一步的模型
- 使用第二步的模型对unlabel数据进行标注得到
- 使用少量的label数据和第三步的数据,一起来finetune第一步的模型或者从头开始训练一个seq2seq的模型
从结果来看:
- 标注数据量小的时候(小于100小时),第四步的模型优于第一步的模型,说明pretraining进一步结合self-training,可以取得进一步的收益
- 标书数据量大的时候(大于100小时),第四步的模型跟第一步的模型基本相当;但是当使用更大数据的wav2vec模型,第四步的模型还是优于第一步的模型
所以这种算法思路想要work,需要满足一个条件,即unlabel数据远远大于label的数据。
与noise student training的融合[3]
结合思路是:
- unlabel数据训练wav2vec,M0
- 使用label数据对M0进行finetune得到M
- 使用M结合语言模型对unlabel数据进行标注
- 将第二步的数据和label进行混合,对M0进行finetune,得到新的模型
- 重复上面的过程
文章有几个结论:
- 输入使用fbank替换原来的wave,fbank后面跟两层2维CNN来降采样,步长为(2,2),当输入的句子长度越长时,降采样越大效果越好
- 使用conformer的网络结构要优于wav2vec的原始transformer网络
- 如果没有pretrain,增大网络效果反而变差;有了pretrain,网络越大效果越好
- pretrain基础上结合NST训练,会有进一步的提升
参考文献
[1].Unsupervised Cross-lingual Representation Learning for Speech Recognition
[2].Self-training and Pre-training are Complementary for Speech Recognition
[3].Pushing the Limits of Semi-Supervised Learning for Automatic Speech Recognition
[4].Representation Learning with Contrastive Predictive Coding
[5].An Unsupervised Autoregressive Model for Speech Representation Learning
[6].IMPROVING TRANSFORMER-BASED SPEECH RECOGNITION USING UNSUPERVISED PRE-TRAINING
[7].https://github.com/iamyuanchung/Autoregressive-Predictive-Coding
[8].https://github.com/jefflai108/Contrastive-Predictive-Coding-PyTorch.git
[9].WAV2VEC: UNSUPERVISED PRE-TRAINING FOR SPEECH RECOGNITION
[10].VQ-WAV2VEC: SELF-SUPERVISED LEARNING OF DISCRETE SPEECH REPRESENTATIONS
[11].EFFECTIVENESS OF SELF-SUPERVISED PRE-TRAINING FOR SPEECH RECOGNITION
[12].wav2vec 2.0: A Framework for Self-Supervised Learning of Speech Representations