1. 自监督学习的意义
1.1.1. 网络定义:大多数时,网络=特征提取+下游任务
1.1.2. 自监督学习:目的就是从一个较难的自监督任务中,训练特征提取模块
1.1.3. 下游任务:拼接一个下游网络,例如ctc模块进行语音识别(fine-tune模块)
2. CPC
2.1 网络
2.2 训练定义:采用最小化信息量(熵)
1 分子:预测输出值,对应 ct
2 分母:真实的标签,对应 z(t+1)
3 当分子分母完全相等:预测完全准确,熵=0
2.3 量化指标:信息量怎么量化
1. 第一种:直接计算z(t+1)与ct之间的交叉熵,显然这样很垃圾,因为网络过分的关注细节信息,有很多噪声细节没意义
2. 第二种:计算乘积相似度,有点类似于矢量相乘,方向一致时,效果最好,参考上述公式(但也存在自己的问题,理论上来说,网络只需要输出足够大的数就ok,显然不符合我们的需求,因此需要采用正负例,增大学习难度)
3. 第三种:余弦相似度,wav2vec2之后等采用余弦相似度.
2.3 损失函数
1. 分子:正例
2. 分母:负例
3. 解释:采用正负例,此时学习难度变高,只学习产生一个绝对大的数,没啥意义了。
2.4 损失函数代码怎么设计:太取巧了
loss=crossEntropy(torch.zeors() , 量化指标输出)
3. wav2vec
2.1 网络
对比cpc:别卷RNNT,咱CNN不比他差
4. wav2vec2
5. Hubert
5.1 语音对比NLP/CV,面临的问题
1. 缺乏统一标准:单个音速/文字等发音音速不等,对同一个字发音,每个人都发音都不一致
2. 缺乏离散化单元:每个文字对应一个token_id,语音是频谱信号,同一个字,每个人的的频谱都不同;单一帧内,发音起始位置未知
5.1 网络
1. Acoustic unit discovery system:聚类算法,提供离散化信号:相似发音作为一个label,更容易忽略无关的细节/噪声等信息
2. 网络组成:hubert+聚类模块
3. hubert:cnn(语音特征提取)+bert
5.2 hubert预测输出
5.3 损失函数
1. 评价bert输出与label的关系:余弦相似度
2. 余弦相似度内部:hubert先经过投影层,再与聚类的label做余弦相似度计算
3. 正负例:mask对应的位置为正例,随机选取的label为负例
5.4 训练阶段:两阶段
- 第一步:先训练聚类算法,得到聚类中心
- 第二步:训练hubert模型
- loss:参考cpc,拼接正负例,再计算交叉熵
5.5 下游任务:fine-tune(asr)
- 网络:丢弃聚类部分,在hubert后拼接ctc模块
- fine-tune:开始阶段,只微调ctc,等1k-epoch,再放开hubert微调
6. 代码参考:torch.audiohttps://github.com/pytorch/audio/blob/main/examples/tutorials/speech_recognition_pipeline_tutorial.py
- wav2vec2:英文示例,不可预训练 (audio/examples/tutorials/speech_recognition_pipeline_tutorial.py)
- hubert:可预训练(内部有frozen-fine-tune,不建议采用多语种预训练,尽量同语种)