介紹#
HW1 是根據數據 Delphi group@CMU 進行 COVID-19 Cases Prediction,即給定美國某個州過去 5 天的調查結果,預測第 5 天新增檢測陽性病例的百分比,是一個回歸任務。
HW2 是利用從原始音頻信號數據集 LibriSpeech(subset of train-clean-100)預先提取的 MFCC 特徵進行逐幀音素(phoneme)分類,是一個分類任務。
由於沒有學過語音識別的相關知識,所以先對背景知識進行了簡單學習。
背景#
音素(phoneme)#
MFCC 特徵#
音頻信號以波的形式被記錄。此任務從原始音頻信號中提取 MFCC 特徵,做數據預處理,為什麼呢?
音頻分類任務是指將音頻信號根據其內容劃分到不同的類別中。在進行音頻分類時,需要從音頻信號中提取有用的特徵,以便更好地進行分類。
目前,大多數音頻分類任務都會使用 MFCC 特徵進行特徵提取。MFCC 特徵是一種基於人耳聽覺特性的音頻特徵,它可以有效地模擬人耳對音頻信號的識別能力。MFCC 特徵主要由頻率和能量等信息組成,能夠捕捉音頻信號中的頻率和能量變化,從而為音頻分類任務提供有效的特徵信息。
此外,MFCC 特徵具有很好的魯棒性,能夠在不同的音頻環境下取得較好的性能。它可以適應不同的音頻信號來源,包括人聲、樂器聲等,並且能夠抑制噪聲干擾,為音頻分類任務
關於 MFCC 的理解,一個特別好的講解可供參考,由於這不是此次 hw 的主要內容,因此就簡單了解即可。
注意,由於 MFCC 中分幀(每幀為 39-dim 的 MFCC 特徵),且每幀僅包含 25 毫秒的語音,因此單幀不太可能代表完整的音素。
- 通常,一個音素會跨越多個幀。
- 將相鄰的音素連接起來進行訓練。
所以助教講解中舉了一個例子,例如選取了一個幀過去和未來各五幀的數據,然後將其連接起來,共 11 個幀,然後用其預測中心幀,如圖所示即
數據集及數據格式#
要求 & 提示#
Kaggle 上任務#
簡單#
按它的要求只需要直接運行就行。
訓練和驗證集上結果:
測試集上結果:
中等#
由於 optimization 代碼裡已經用了 adamw,即已經有 rmsdrop+momentum+weight_decay,暫時不需要再額外考慮優化的問題,因此我們主要考慮 concat 幾個 frames,和 hidden_layers 的設計。
將 hidden_layers 設計為 3,hidden_dim 設計為 1024,concat21 個 frames,訓練和驗證集上結果為:
測試集上結果:
為什麼這樣設計呢:選一個較大的 concat n frames 的值能讓每個時間步都能感知其前後上下文信息,這對於語音識別等時序任務至關重要,模型的 hidden_layer 和 hidden_dim 就是選了個大一點的,就把 medium 過了。
強#
首先將 hidden_layers 改成 6,讓 train_acc 夠大,同時再加入正則化方法。
有的帖子是將 relu 放在 batchnorm 前,實際上我覺得這是不對的,不僅是在很多網絡架構上都不是這樣,同時我覺得把 batchnorm 放 relu 前有以下理由:
- BN 的目的是對輸入進行標準化(均值為 0,方差為 1),而 ReLU 是非線性激活函數。如果 BN 放在 ReLU 前,可以確保輸入 ReLU 的數據分布更穩定,避免梯度消失 / 爆炸問題。
- ReLU 對負值的截斷(輸出為 0)可能導致部分信息丟失。若先進行 BN,負值可能被保留(通過平移和縮放),從而讓 ReLU 的激活更靈活。
具體參數為:
由於 num_epoch 有點大,為了加快訓練速度,將 batch_size 改成了 2048。這個原理在李宏毅老師的課裡有:
訓練和驗證集上結果為:
測試集上結果為:
剛好把 strong_baseline 給過了。
老闆#
由於 boss_baseline 是要引入 RNN 等架構,目前的計劃是更想有個通用的了解再去對某個方向深入,所以暫時搁置,日後有空再補。
報告問題#
問題 1#
只修改模型結構,其他參數不變,結果分別為
narrower and deeper:
wider and shallower:
可以看出越寬越淺的表現略好訓練時間略短,不過相差不大。
問題 2#
在 BasicBlock 中加入 dropout 層,dropout rate 分別為 0.25、0.5、0.75,其餘保持不變,結果分別為:
dropout rate=0.25:
dropout rate=0.5:
dropout rate=0.75:
隨 dropout rate 升高,最好的 val_acc 都降低了,再對 dropout rate 低一點的時候看看:
dropout rate=0.2:
dropout rate=0.1:
貌似隨著 dropout rate 升高,val_acc 都會降,猜想這可能是 simple code 的 train_acc 太低了,自己都沒夠好,model 的 bias 太大了,所以加入 dropout 之後,效果反而更差(train_acc 變得更小,所以減少泛化誤差 val_acc 也沒有比原來好,採取合適的 dropout rate 加幾個 epoch 效果肯定比之前好)。