Strive236

Strive236

生命的起伏要认可
github
zhihu

ML2022春季作業2

介紹#

HW1 是根據數據 Delphi group@CMU 進行 COVID-19 Cases Prediction,即給定美國某個州過去 5 天的調查結果,預測第 5 天新增檢測陽性病例的百分比,是一個回歸任務。

HW2 是利用從原始音頻信號數據集 LibriSpeech(subset of train-clean-100)預先提取的 MFCC 特徵進行逐幀音素(phoneme)分類,是一個分類任務。

由於沒有學過語音識別的相關知識,所以先對背景知識進行了簡單學習。

背景#

音素(phoneme)#

image

一個通俗易懂的解釋

MFCC 特徵#

音頻信號以波的形式被記錄。此任務從原始音頻信號中提取 MFCC 特徵,做數據預處理,為什麼呢?

一個不錯的回答是:

音頻分類任務是指將音頻信號根據其內容劃分到不同的類別中。在進行音頻分類時,需要從音頻信號中提取有用的特徵,以便更好地進行分類。
目前,大多數音頻分類任務都會使用 MFCC 特徵進行特徵提取。MFCC 特徵是一種基於人耳聽覺特性的音頻特徵,它可以有效地模擬人耳對音頻信號的識別能力。MFCC 特徵主要由頻率和能量等信息組成,能夠捕捉音頻信號中的頻率和能量變化,從而為音頻分類任務提供有效的特徵信息。
此外,MFCC 特徵具有很好的魯棒性,能夠在不同的音頻環境下取得較好的性能。它可以適應不同的音頻信號來源,包括人聲、樂器聲等,並且能夠抑制噪聲干擾,為音頻分類任務

關於 MFCC 的理解,一個特別好的講解可供參考,由於這不是此次 hw 的主要內容,因此就簡單了解即可。

注意,由於 MFCC 中分幀(每幀為 39-dim 的 MFCC 特徵),且每幀僅包含 25 毫秒的語音,因此單幀不太可能代表完整的音素。

  • 通常,一個音素會跨越多個幀。
  • 將相鄰的音素連接起來進行訓練。

所以助教講解中舉了一個例子,例如選取了一個幀過去和未來各五幀的數據,然後將其連接起來,共 11 個幀,然後用其預測中心幀,如圖所示即

image

數據集及數據格式#

image

image

image

要求 & 提示#

image

Kaggle 上任務#

簡單#

按它的要求只需要直接運行就行。

訓練和驗證集上結果:

image

測試集上結果:

image

中等#

由於 optimization 代碼裡已經用了 adamw,即已經有 rmsdrop+momentum+weight_decay,暫時不需要再額外考慮優化的問題,因此我們主要考慮 concat 幾個 frames,和 hidden_layers 的設計。

將 hidden_layers 設計為 3,hidden_dim 設計為 1024,concat21 個 frames,訓練和驗證集上結果為:

image

測試集上結果:

image

為什麼這樣設計呢:選一個較大的 concat n frames 的值能讓每個時間步都能感知其前後上下文信息,這對於語音識別等時序任務至關重要,模型的 hidden_layer 和 hidden_dim 就是選了個大一點的,就把 medium 過了。

#

首先將 hidden_layers 改成 6,讓 train_acc 夠大,同時再加入正則化方法。

image

有的帖子是將 relu 放在 batchnorm 前,實際上我覺得這是不對的,不僅是在很多網絡架構上都不是這樣,同時我覺得把 batchnorm 放 relu 前有以下理由:

  • BN 的目的是對輸入進行標準化(均值為 0,方差為 1),而 ReLU 是非線性激活函數。如果 BN 放在 ReLU 前,可以確保輸入 ReLU 的數據分布更穩定,避免梯度消失 / 爆炸問題。
  • ReLU 對負值的截斷(輸出為 0)可能導致部分信息丟失。若先進行 BN,負值可能被保留(通過平移和縮放),從而讓 ReLU 的激活更靈活。

具體參數為:

image

由於 num_epoch 有點大,為了加快訓練速度,將 batch_size 改成了 2048。這個原理在李宏毅老師的課裡有:

image

訓練和驗證集上結果為:

image

測試集上結果為:

image

剛好把 strong_baseline 給過了。

老闆#

由於 boss_baseline 是要引入 RNN 等架構,目前的計劃是更想有個通用的了解再去對某個方向深入,所以暫時搁置,日後有空再補。

報告問題#

image

問題 1#

只修改模型結構,其他參數不變,結果分別為

narrower and deeper:

image

wider and shallower:

image

可以看出越寬越淺的表現略好訓練時間略短,不過相差不大。

問題 2#

在 BasicBlock 中加入 dropout 層,dropout rate 分別為 0.25、0.5、0.75,其餘保持不變,結果分別為:

dropout rate=0.25:

image

dropout rate=0.5:

image

dropout rate=0.75:

image

隨 dropout rate 升高,最好的 val_acc 都降低了,再對 dropout rate 低一點的時候看看:

dropout rate=0.2:

image

dropout rate=0.1:

image

貌似隨著 dropout rate 升高,val_acc 都會降,猜想這可能是 simple code 的 train_acc 太低了,自己都沒夠好,model 的 bias 太大了,所以加入 dropout 之後,效果反而更差(train_acc 變得更小,所以減少泛化誤差 val_acc 也沒有比原來好,採取合適的 dropout rate 加幾個 epoch 效果肯定比之前好)。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。