带你了解 — 方法

Posted 嵌入式职场

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了带你了解 — 方法相关的知识,希望对你有一定的参考价值。

目录

1、Go 函数方法定义


1、Go 函数方法定义

在Go语言中,函数和方法不太一样,有明确的概念区分。其他语言中,比如Java,一般来说,函数就是方法,方法就是函数,但是在Go语言中,函数是指不属于任何结构体、类型的方法,也就是说,函数是没有接收者的;而方法是有接收者的,我们说的方法要么是属于一个结构体的,要么属于一个新定义的类型的。

方法的声明和函数类似,他们的区别是:方法在定义的时候,会在func和方法名之间增加一个参数,这个参数就是接收者,这样我们定义的这个方法就和接收者绑定在了一起,称之为这个接收者的方法。

Go中的struct结构类似于面向对象中的类。面向对象中,除了成员变量还有方法。

方法定义:

    func (recevier type) methodName(参数列表)(返回值列表

带你了解3类预训练语音模型预测方法

摘要:在调研多篇论文后,笔者发现预训练语音模型的预测方法基本可以分为以下3类:<1>用前文预测当前及后文(自回归)<2> 随机mask 一些帧并预测 <3> 用两侧上下文预测中间帧。

本文分享自华为云社区《预训练语音模型调研小结》,作者: Hudson。

在调研多篇论文后,笔者发现预训练语音模型的预测方法基本可以分为以下3类:<1>用前文预测当前及后文(自回归)<2> 随机mask 一些帧并预测 <3> 用两侧上下文预测中间帧。下文会按照这三类来介绍预训练语音模型的方法。

1.用前文信息预测当前信息及后文信息

(1)CPC & Modified CPC

CPC(Contrastive Predictive Coding)[1] 是预训练语音模型中较早提出的模型。它的模型架构如下图所示。

首先,语音信号被分成段输入到CNN模型,用于抽取特征,CNN层的输出Z再作为GRU层的输入,拿到带有时序信息的输出C,然后用当前时刻t的带有时序信息的Ct(见过序列前面的信息),来预测后续k个时刻的CNN层输出Zt+k。Loss的是一个contrastive loss,它的公式如下图所示。

这个loss看起来复杂,其实原理很简单,就是想让基于Ct的预测值更接近 Zt+k (分子),而更远离其他的CNN层输出Z,即negative sample (分母)。最小化整体的loss,会使分子最大化,分母最小化。这就是CPC训练的原理。

Modified CPC [2] 是对CPC的一个改进。其改进主要分成以下两点:
<1> 由于batch normalization 会破坏sequence的信息,他们用channel wise normalization替代batch normalization。
<2> 对模型的一些改进,包括将从Ct预测Zt+k的网络由linear layer替换成一层transformer;将CNN层的维度从512变为256 (memory小了但performance不变); 用LSTM替换GRU。

(2)APC & VQ-APC

APC(Autoregressive Predictive Coding)[3] 以及它的改进,VQ-APC(Vector Quantization- Autoregressive Predictive Coding)[4] 也是一组基于自回归的预训练语音模型,它们的模型架构如下图所示。APC没有VQ-layer,而VQ-APC添加了一个VQ layer。

APC模型的输入是80维的log Mel spectrogram 特征,其模型也十分简单,就是一个3层的LSTM。训练的loss如下图所示。

这里我们可以看出,这就是一个简单的L1 loss,但其中不同的是,它并不是同一时刻的xi和yi之间做L1 loss,而是用xi+n和yi之间做L1 loss。也就是说,它希望能用第i时刻的信息去预测n个时刻后的信息,这么做的原因是希望LSTM 不陷入Local information,从而可以infer 更多的全局信息(global structure)。

VQ-APC是在APC的基础上加了一个VQ layer。VQ,向量量化,可以简单的理解为对无限种可能的连续向量的一个聚类,让语音的表征vector也变为有限种可能,类似于NLP中有限数量的单词表征(一个单词一个表征,单词数量有限)。实验结果标明,在APC模型的LSTM层中间加入VQ layer会是最终学到的向量表征更好,在下游任务(如 phone classification; speaker classification)中表现出更好的性能。

2. 随机mask一些帧并预测

(1)VQ-wav2vec & wav2vec2.0

前面介绍的4个模型都是基于自回归的思想,用前文预测后文信息,模型也是基于LSTM或者GRU模块来实现。随着transformer在越来越多的任务上被证实有更优越的性能,很多预训练语音模型的研究人员也把目光投入到了transformer模型上。VQ-wav2vec [5] 就是其中一个较早的尝试。下图是VQ-wav2vec模型架构图。

原始音频片段首先输入到CNN层提取特征,再做一个VQ,最后将VQ的output输入下一个CNN层再进行一次特征的抽象。最后用CNN层在第i个时刻的输出Ci来预测后面k个时刻VQ的输出Zi+k,并做一个contrastive loss,目的是让Ci能更好的预测Zi+k,而更远离negative sample(不是Zi+k的其他Z)。训练完毕后,将VQ层的输出作为后面BERT的输入,随机mask掉一些帧并预测,训练一个BERT模型,得到拥有时序信息的表征。最后将这个信息作为声学模型的输入,进行下游任务。

上面的模型是把BERT和VQ-wav2vec单独训练的,先训练VQ-wav2vec,再训练BERT模型。而wav2vec2.0 [6] 对VQ-wav2vec整体框架进行了改进,将VQ-wav2vec模型和BERT模型放在一起做一个jointly training,达到了非常好的效果(目前的state-of-the-art)。Wav2vec2.0的模型框架如下图所示。

首先,音频也是分段输入CNN层提取特征,然后一方面输入到VQ层,另一方面随机mask掉一些帧然后输入到Transformer层提取context representation C。训练的loss如下图所示。

Loss是两部分loss的叠加。第一部分loss是contrastive loss,目的就是让同一时刻的Context representation (Ct)与Quantized representation (Qt) 的similarity越大越好,Ct与其他时刻的Quantized representation的similarity越小越好。第二部分loss是diversity loss,这个loss是用于鼓励各个codeword(VQ操作后的离散的类别vector,类似于NLP中的词典中的一个词)被使用的概率相同。训练好模型后,context representation可以被用于做下游任务。

(2)Mockingjay & Audio Albert & TERA

除上述两个模型外,还有一个系列的模型(均来自台湾大学语音组)也是基于transformer模型,用随机mask掉一些帧并预测的方式做语音模型的预训练。第一个工作是Mockingjay [7],其模型框架如下图所示。首先,提取一些handcrafted feature(fMLLR, MFCC, FBank)并做random masking,然后经过下采样后,输入到transformer模型中,来预测mask掉的帧,并做L1 loss。

在Mockingjay模型的基础上,Audio Albert模型 [8] 进行了些许改进。下图是Audio Albert和Mockingjay模型的区别。可以看出,Audio Albert基于Mockingjay的改进,是把多层的transformer都共享参数。其他地方没有任何区别。通过这样的改进,效过和不共享参数接近(comparable),但是确可以显著的降低参数量。

还有一个基于Mockingjay改进的模型 —TERA (Transformer Encoder Representations from Alteration)[9],是在输入端上,对输入进行了一些alteration,从而达到提升预训练模型效果的作用。下图是TERA如何进行输入的alteration的示意图。Alteration主要分为3种,在时间维度上mask,在特征维度上mask,以及对于整个segment加一些高斯白噪声。

3. 用两侧上下文信息预测中间帧

除上述两种预训练方式外,还有一种预训练方式 – 用两侧的信息预测中间帧的信息,NPC(Non-Autoregressive Predictive Coding)[10] 模型就是用这种方式进行的预训练。下图为NPC的模型框架。

输入是MFCC (80dim),但NPC模型训练时,输入模型的并不是整个sequence,它只需要输入被mask掉的帧前后的一些帧(例如前后各10帧),而被mask掉的帧一般为3帧。Mask掉3帧而不是1帧,可以防止模型直接复制mask 点的相邻点(xt-1,xt+1)的值作为当前时刻输入xt的预测值,从而防止预测值yt并没有相对于xt的信息增益。被mask的input输入模型后,经过几层ConvBlock,每层ConvBlock也会mask中间的帧,且会层层递增,目的是防止输出yt见到任何mask size内的数据。经过几层ConvBlock后的数据会加到一起得到ht(当前时刻做VQ之前的hidden representation),ht再经过一个VQlayer和一个linear layer,最后预测中间帧xt,loss用L1 Loss。这个模型的效果比autoregressive的模型都要好,况且可以显著的减小模型的大小。

总结

预训练语音模型是现在语音界十分热门的一个科研方向。目前来看,基于transformer 的模型要好于早期基于LSTM或GRU的模型。若追求性能,那目前公认最好的预训练语音模型应该是wav2vec 2.0。但如果追求速度,那Audio ALBERT,以及NPC模型都是不错的选择,这两个模型能够在保证comparable的性能的情况下,减小模型的大小并提升模型的速度。相信不久的将来,随着深度学习技术的进一步发展,预训练语音模型无论在性能,还是在速度上,都会迎来新的提升。

Reference

[1] Oord, Aaron van den, Yazhe Li, and Oriol Vinyals. “Representation learning with contrastive predictive coding.” arXiv preprint arXiv:1807.03748 (2018).

[2] Riviere, Morgane, et al. “Unsupervised pretraining transfers well across languages.” ICASSP 2020-2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2020.

[3] Chung, Yu-An, et al. “An unsupervised autoregressive model for speech representation learning.” arXiv preprint arXiv:1904.03240 (2019).

[4] Chung, Yu-An, Hao Tang, and James Glass. “Vector-quantized autoregressive predictive coding.” arXiv preprint arXiv:2005.08392 (2020).

[5] Baevski, Alexei, Steffen Schneider, and Michael Auli. “vq-wav2vec: Self-supervised learning of discrete speech representations.” arXiv preprint arXiv:1910.05453 (2019).

[6] Baevski, Alexei, et al. “wav2vec 2.0: A framework for self-supervised learning of speech representations.” arXiv preprint arXiv:2006.11477 (2020).

[7] Liu, Andy T., et al. “Mockingjay: Unsupervised speech representation learning with deep bidirectional transformer encoders.” ICASSP 2020-2020 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2020.

[8] Chi, Po-Han, et al. “Audio albert: A lite bert for self-supervised learning of audio representation.” 2021 IEEE Spoken Language Technology Workshop (SLT). IEEE, 2021.

[9] Liu, Andy T., Shang-Wen Li, and Hung-yi Lee. “Tera: Self-supervised learning of transformer encoder representation for speech.” IEEE/ACM Transactions on Audio, Speech, and Language Processing 29 (2021): 2351-2366.

[10] Liu, Alexander H., Yu-An Chung, and James Glass. “Non-autoregressive predictive coding for learning speech representations from local dependencies.” arXiv preprint arXiv:2011.00406 (2020).

 

点击关注,第一时间了解华为云新鲜技术~

以上是关于带你了解 — 方法的主要内容,如果未能解决你的问题,请参考以下文章

爬虫带你了解一下Golang的市场行情

带你用 Go 搭建一个最简单的 Web 服务了解 Golang 运行 web 的原理

Go 后端主要做什么

译Golang 的艺术哲学和科学 #导入Word文档图片#

手把手带你从0搭建一个Golang ORM框架(全)!

手把手带你从0搭建一个Golang ORM框架(全)!