Strive236

Strive236

生命的起伏要认可
github
zhihu

ML2022春 HW2

はじめに#

HW1 は、データ Delphi group@CMU に基づいて COVID-19 の症例予測を行うもので、アメリカのある州の過去 5 日間の調査結果をもとに、5 日目の新たに検出された陽性症例の割合を予測する回帰タスクです。

HW2 は、原音声信号データセット LibriSpeech(train-clean-100 のサブセット)から事前に抽出された MFCC 特徴を用いて、逐次フレームの音素(phoneme)分類を行う分類タスクです。

音声認識に関する知識を学んでいないため、まずは背景知識を簡単に学びました。

背景#

音素(phoneme)#

image

わかりやすい説明

MFCC 特徴#

音声信号は波の形で記録されます。このタスクでは、原音声信号から MFCC 特徴を抽出し、データ前処理を行います。なぜでしょうか?

良い回答は:

音声分類タスクは、音声信号をその内容に基づいて異なるカテゴリに分類することを指します。音声分類を行う際には、音声信号から有用な特徴を抽出する必要があります。
現在、ほとんどの音声分類タスクでは MFCC 特徴を使用して特徴抽出を行います。MFCC 特徴は、人間の耳の聴覚特性に基づいた音声特徴であり、音声信号の認識能力を効果的に模倣できます。MFCC 特徴は主に周波数やエネルギーなどの情報で構成されており、音声信号の周波数やエネルギーの変化を捉え、音声分類タスクに有効な特徴情報を提供します。
さらに、MFCC 特徴は非常に優れたロバスト性を持ち、異なる音声環境下でも良好な性能を発揮します。人声や楽器音など、さまざまな音声信号のソースに適応し、ノイズ干渉を抑制することができます。

MFCC に関する理解については、特に良い解説があります。これは今回の HW の主要な内容ではないため、簡単に理解しておけば大丈夫です。

注意点として、MFCC ではフレーム分割(各フレームは 39 次元の MFCC 特徴)を行い、各フレームはわずか 25 ミリ秒の音声を含むため、単一フレームが完全な音素を代表することは難しいです。

  • 通常、1 つの音素は複数のフレームにまたがります。
  • 隣接する音素をつなげてトレーニングします。

そのため、助教の説明では、過去と未来の各 5 フレームのデータを選択し、それをつなげて合計 11 フレームを作り、中心フレームを予測するという例が挙げられました。以下の図のように示されています。

image

データセットとデータ形式#

image

image

image

要求とヒント#

image

Kaggle 上のタスク#

シンプル#

その要求に従って直接実行するだけで大丈夫です。

トレーニングと検証セットの結果:

image

テストセットの結果:

image

ミディアム#

最適化コードにはすでに adamw が使用されており、rmsdrop+momentum+weight_decay が含まれているため、追加の最適化を考慮する必要はありません。そのため、主にフレームの結合と hidden_layers の設計を考えます。

hidden_layers を 3 に、hidden_dim を 1024 に設定し、21 フレームを結合したところ、トレーニングと検証セットの結果は以下の通りです:

image

テストセットの結果:

image

なぜこのように設計したのか:大きな concat n frames の値を選ぶことで、各時間ステップがその前後の文脈情報を認識できるようになります。これは音声認識などの時系列タスクにとって非常に重要です。モデルの hidden_layer と hidden_dim は少し大きめに選んだため、ミディアムを通過しました。

ストロング#

まず、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#

モデル構造のみを変更し、他のパラメータはそのままにした場合、結果はそれぞれ以下の通りです。

狭くて深い:

image

広くて浅い:

image

より広くて浅い方がわずかに良い結果を示し、トレーニング時間も短くなっていますが、大きな差はありません。

質問 2#

BasicBlock に dropout 層を追加し、dropout 率をそれぞれ 0.25、0.5、0.75 に設定し、他はそのままにした場合、結果はそれぞれ以下の通りです:

dropout 率 = 0.25:

image

dropout 率 = 0.5:

image

dropout 率 = 0.75:

image

dropout 率が上昇するにつれて、最良の val_acc が低下しました。さらに dropout 率を低くした場合の結果は以下の通りです:

dropout 率 = 0.2:

image

dropout 率 = 0.1:

image

dropout 率が上昇するにつれて val_acc が低下するようです。これは simple code の train_acc が低すぎるため、モデルのバイアスが大きすぎるためかもしれません。そのため、dropout を追加した後、効果が逆に悪化した可能性があります(train_acc がさらに小さくなり、一般化誤差 val_acc も元より良くならないため、適切な dropout 率を加えて数エポックを行うことで、効果が確実に向上するでしょう)。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。