論文:
Deep Speaker: an End-to-End Neural Speaker Embedding System
思想:
Deep Speaker是百度提出的一種端到端的說話人編碼方法。該方法采樣ResCNN或GRU進行幀級別的特征提取,然后時間平均層將輸入序列幀級別的特征轉化為句子級別的特征表達,彷射變換層將編碼映射到指定維度,長度歸一化層輸出便於cosine相似度計算;模型預訓練損失為CE,重訓練損失為triplet loss

模型:
網絡架構包含ResCNN或GRU、時間平均層、彷射變換層、長度歸一化層,損失為triplet_loss
- ResCNN: ResCNN是一種比較流行的深度神經網絡,其由多個resblock組成,每個block包含兩個分支,一個分支經過若干卷積,其中最后一個卷積無激活;另一個分支不經過任何卷積;兩個分支的輸出進行加和操作,然后經過一個ReLU激活輸出

- GRU:GRU是LSTM結構的一種優化版本,GRU相比LSTM少一個門控單元,擁有更少的參數,實驗表明,在小數據集上,當GRU與LSTM參數量類似時,能夠取得相近的識別結果,但是訓練速度比LSTM更快。

- 時間平均池化層:輸入序列逐幀輸入到網絡中提取編碼,然后對該輸入序列的所有幀取平均值,得到句子級別的特征編碼

- 仿射變換層:對句子級別的特征編碼進行降維
- 長度歸一化:L2歸一化,便於后續cosine相似度計算
- cosine相似度計算:因為已進行長度歸一化,節省了cosine的分子計算

- triplet loss:三元組損失,使得正樣本對之間的相似度得分逐漸增大,負樣本對之間的相似度得分逐漸減小,且相比正樣本對至少小α


其中,a為anchor sample,p為positive sample,n為negative sample,a為中心句子,p為與a同一說話人的另外一個句子,ap組成正樣本對,n為其它說話人中選擇的句子,an組成負樣本對

訓練:
- 數據集
- UID
Train250k:249312 speakers 12202181 utts
Train50k:46835 speakers 2236379 utts
Eva200: 200 speakers 380000 trials
- XiaoDu:訓練集:11558 speakers 89227 utts; 驗證集:844 speakers 1001400 trials
- MTurk:訓練集:2174 speakers 543840 utts;驗證集:200 speakers 400000 trials

- trials選擇:每個anchor選擇一個positive樣本,99個negative樣本;negative樣本選擇策略:訓練初始階段在每個minibatch中選擇,訓練末段在整個batch中選擇,因為隨着訓練的進行,hard-negative的選擇越來越難
- 前置處理:VAD
- 輸入特征:64fbanks,方差均值歸一化CMVN
- 模型參數:

ResCNN

GRU
- 優化算法:SGD,momentum=0.99;lr=0.05線性下降到0.005
- 損失函數:前10 epochs CE交叉熵預訓練,softmax損失相比triplet損失訓練更快更穩定,因其不受樣本對的變化影響;后15 epochs采用triplet loss訓練
實驗:
- 相近參數量情況下,ResCNN的效果比GRU要好;此外,softmax預訓練+triplet重訓練相比單一的訓練模式效果要更好

- 在文本無關的說話人驗證任務上,訓練數據集越大,模型的訓練越充分,效果越好

- 在說話人驗證任務中,注冊句子的個數會對結果產生一定的影響,因為句子個數越多,包含說話人信息越多,說話人的特征表達就越充分;當然,經過一些論文實驗驗證,說話人注冊句子個數並非越多越好,當達到一定的數量后繼續增加沒有帶來額外的提升

- 模型finetune有助於提升模型的泛化能力,因為一個好的初始化模型會讓模型避免陷入局部最優;此外,從實驗結果來看,GRU的finetune效果相比Resnet效果要好

Train50k pre-train XiaoDu fintune

Train50k pre-train MTurk fintune
- 模型融合策略有助於提升說話人驗證效果;從效果來看,cosine得分的融合相比編碼層面的融合效果稍好一些

- 時間跨度魯棒性:注冊句子和test句子的時間跨度越長,模型的效果會逐漸下降,但ResCNN依然取得了最好的效果

結論:
本文提出了一種端到端的說話人編碼方法,該方法采樣ResCNN或GRU進行幀級別的特征提取,然后采用時間平均層將輸入序列幀級別的特征轉化為句子級別的特征編碼,通過softmax pretrain+triplet重訓練、以及模型融合或fintune等tricks,使得算法效果取得了遠超基於DNN i-vector+PLDA的說話人識別方法
代碼實現可參見:
(1) https://github.com/philipperemy/deep-speaker,是deep-speaker的基於keras的非官方復現;該代碼采用數據集為librispeech,模型架構為ResCNN;訓練的模型可供下載用作預訓練模型使用
(2) https://github.com/Walleclipse/Deep_Speaker-speaker_recognition_system,該復現包含ResCNN和GRU兩種結構實現,在Librispeech上EER為~5%左右,該方法經過本人實踐有效
Reference: