---
# System prepended metadata

title: 'wav2vec: Unsupervised Pre-training for Speech Recognition'
tags: [NLP, jayTsai, Unsupervised]

---

# wav2vec: Unsupervised Pre-training for Speech Recognition

## Unsupervised的精神

要直接讓模型訓練好，不如先讓模型自己先了解可能會碰到的資料長什麼樣子(過程中沒有label)，熟悉未來的方向後，再讓模型進行supervised的訓練。

本篇論文就是讓模型先學會用"目前的的特徵"預測預測'未來的特徵"，經過這個過程，有效提升最終的辨識效果。

## 貢獻與地位

第一個在語音辨識使用unsupervisised pre-training的方式，改善最終語音識別效果。

> We pre-train a simple multi-layer convolutional neural network optimized via a **noise contrastive binary classification task.**

## 主要架構

![image](https://hackmd.io/_uploads/B1_ZeXjC6.png =80%x)
這個模型希望使用過去的一段歷史訊息去預測未來某時間點的訊息

文中主要架構都使用CNN。
網路有兩個，兩個模型輸出都會在loss計算並修正

- F: encoder network(將一段輸入編碼成一個特徵向量)，x->z
- G: context network(結合多個特徵向量轉換成上下文表示特徵)，z->c

x是**原始音頻訊號**，輸入一段到F(encoder network)得到特徵向量z
z是特徵向量，G用v個z得到"上下文特徵c"，v可以理解成感受視野

實驗中，使用了兩種感受視野分別對應現實時間210ms、810ms

Loss會同時對兩個model做修正。
並使用了Contrative Learning的概念，對正樣本之間要接近，負樣本之間遠離。

![image](https://hackmd.io/_uploads/r112QDaCT.png =80%x)

<!-- $$
L_k = -\sum_{i=1}^{T-k}(\log\sigma(z_{i+k}^Th_k(c_i))+\lambda E[\log\sigma(-\tilde z^Th_k(c_i))])
$$ -->

$\sigma$是sigmoid函數，$h_k$是$c$共用的linear projection，$z$是正樣本，$\tilde z$是負樣本
## 實驗結果
注意，本篇討論的是pre-training的部分，實驗結果都是語音辨識是否加上pretrain的比較。

![image](https://hackmd.io/_uploads/HyCQvshAT.png)
標記數量少的時候，跟baseline對比，改善幅度巨大呀

## 訓練簡記
> 這邊比較是NLP領域，目前以下是胡亂整理的狀態

sequence modeling toolkit for training custom models for translation, summarization, and other text generation tasks
- [Fairseq](<https://ai.meta.com/tools/fairseq/>)
- [wav2letter++](<https://github.com/flashlight/wav2letter>)

baseline基於wav2letter++的設定訓練於WSJ資料集

資料集:
- WSJ
- TIMIT
- Librispeech

預測31個字母的機率 : 
- 包含26個英文(a-z)
- aposrophe(')
- period(.)
- 兩種重複字元<font color='red'>(目前沒看懂)</font>
- silence token(|)  <-- 表示文字邊界

實驗硬體:
8 台 V100 GPU