ディープラーニングでコード進行認識(1)

HMMはしばらくそばに置いて、今ホットなディープラーニングに目を向けてみます。

今年のISMIRに、ディープラーニングなコード認識を扱った論文が二つあったので、まずそのうち一つから見ていきます。

Audio Chord Recognition with a Hybrid Recurrent Neural Network

この論文は、DNN(深層ニューラルネットワーク)を使ったフレーム単位の分類+LSTMを使ったRNN(回帰型ニューラルネットワーク)の言語モデル、という、一般的な音声認識の枠組みに基づいた手法です。まずは言語モデルは無視して、DNNのフレームごとの分類だけやらせてみましょう。

この手法の分類パートは、特徴抽出用DNNと、分類用DNNの、二つのネットワークを使います。まず一つ目のDNNは、音声のCQT(Constant-Q Transform)スペクトラムを入力とし、普通に教師あり学習をさせる。そして学習されたDNNの最後の隠れ層の出力を、このフレームの音響特徴量として、次のDNNの入力とする。

二つ目(分類用DNN)は、この特徴量を入力として再び教師あり学習。最終的にソフトマックス出力層で結果を判断。ディープにディープを重ねて更にディープになるといった感じでしょうか。

論文から分かるDNNに関する情報は、

*隠れ層が三つ、各層のノード数は100

*学習時の各層のドロップアウト率は0.3

*最適化アルゴリズムはADADELTA

*出力層はsoftmaxで活性化して、誤差関数は交差エントロピー関数

隠れ層の活性化関数が分からない。あとAutoencoderなどの事前学習を行ったか、それとも直接全体をバックプロパゲーションで訓練させたか(三層のMLPでそれをやってもいいのか、微妙だと思うので)。

この作者のホームページで、別の論文(2014)で使ったDNNのソースコードが公開されてたので、読んでみると、どうやら活性化関数はsigmoidかReLUで、特に事前学習したわけでもなかった模様。

とりあえず、ここではわかりやすい方法である、識別的事前学習という手法をとります。説明すると、

*まず隠れ層1層のMLPで普通に教師あり学習

*学習したパラメーターを保持したまま隠れ層を一つ追加してもう一回学習

*そしてまた一つ追加して繰り返し

つまるところ、RBMやAutoencoderと違って、教師あり学習で事前学習するわけです。活性化関数はReLUにします。

そして、特に特徴学習用、分類用に分けることをせず、まずは一つのDNNだけでやってみます。

実装にはkerasを使ってみたんですが思ったほどやりたいことが出来なかったので検討し直した結果、Chainerに決定。Chainerなら学習済みの層を組み立て直したり、隠れ層の出力を直接取り出すということが簡単にできます。すばらしい。最近知ったけど日本語コミュニティでもChainer結構人気がある模様。

使い方を理解するまで結構時間を食いましたが。

データセットはビートルズ。20曲選び出してテストセットとし、それ以外(159曲)を訓練セットとして学習してもらいます。

(補足:入力音声をCQTする前に、librosaに付いているリズム楽器分離のアルゴリズムを使って、ドラムなどのパーカッション音を除去する前処理を行いました。この前処理に言及した論文は何故か多くないのですが、パフォーマンスへの影響はかなり大きいです。)

DNNとの比較用に、隠れ層一層だけの普通のMLPも作りました。隠れ層の活性化関数はtanh,最適化アルゴリズムはSGD、誤差関数は同じくsoftmax-crossentropyです。

結果、フレームごとの分類の正解率は以下のとおり。

DNNで分類:訓練セット85.7%、テストセット69.0%

三層MLPで分類:訓練セット73.6%、テストセット68.4%

訓練セットでの分類性能が大きく上がりました。ただの過学習ですね、はい。

えーなんでだろう。ドロップアウトも付けたのに・・・

三層ともユニット数が同じなのがいけなかった気もしますが、二つ目のDNNを加えるとどうなるか(そのまま加えても意味ないと思いますが)も含めて、もうしばらく検証が要ると思います。

それらの検証も含めて、次回はRNNの言語モデルを付け加えたものを見ていきます。

『ディープラーニングでコード進行認識(1)』へのコメント

  1. 名前:ボンバー 投稿日:2016/06/20(月) 16:49:46 ID:15e1e946c 返信

    こんにちは。この作者のホームページで、別の論文(2014)で使ったDNNのソースコードとありますが、こちらのソースコード探したのですが見つかりませんでした。もしよろしければ教えていただけないでしょうか?