ディープラーニングでコード認識(3)

ディープラーニングは最近躍進し過ぎてる印象がありますね。まあ技術的なブレイクスルーは起きてからすでに数年経っていて、今は逆に落ち着いてる方だと感じるのですが、囲碁とか打ったりして本格的に人々の視野に入り込んできたのは大きいと思います。

ところで自分が今作ってるものを本当にディープラーニングと呼んでもいいのかと、最近思い始めています。一歩退いてニューラルネットワークに呼び換えた方が適切だったでしょうか。だってディープラーニング凄すぎるんだもん。

まあ今更タイトルを変えてしまっても何なんで、いつかはディープラーニングにするぞ!という希望を込めたものだと理解していただけたら(言い訳)

さて春節期間は日本でいっぱい休んだ後、今上海に戻り引き続きこの課題に取り組んできました。あるアイデアを思いついたので、今年のISMIRに投稿できるものを目指していたのですが、なかなか上手くいかないので今の案はそろそろボツにしようかと思ってます。今回はとりあえずその案の報告。

前回「ビート単位でコード認識するべきでは」と言いました。実際後藤先生んとこのSongleもそうですし、YAMAHAのアプリもそうです。実用向けのアプローチっぽいですね。それをニューラルネットでやってみようというのが基本的な考えです。

具体的には、まず前半はこれまでと同じく、深めの多層NNを訓練して音声フレームごとの特徴抽出をしてもらいます。そのあと、特徴ベクトルの系列を拍ごとに分割して、一拍分の系列(だいたい十数フレーム)に対して一つのラベル確率分布を推定します。

系列のラベル推定をするには、深層学習の青い本に書いてある通り、RNNを使います。

なお、入力系列に対し、答えを一つだけ出力するタイプの系列データの分類問題もあります。(略)これをRNNの枠組みに当てはめるには、例えば出力系列y1…yTの時間方向の幾何平均を求め、これをクラスの確率とみなします。この場合、学習は毎時刻の目標出力をすべて同一にするだけで済みます。

こんな感じ。

これで拍ごとのクラス確率が求まりますが、最後にこれでビタビ探索を行い、ラベル系列を出力を出力します。以上。

RNNの前の設定はほぼこの前と変わりません。RNNは、DNNの出力を入力とし、LSTMの隠れ層を一つはさみ、最後はソフトマックス出力層。

これまでと同じく、Beatlesのデータセットで実験しました。ランダムに30曲選んでテストセット、それ以外は訓練セット。

結果はこんな感じです。

  1. まず訓練セットの正解率が95%以上を達成。ただしテストセット正解率は70%程度。明らかな過適合。
  2. 重みの正則化で過適合を緩和できると聞き、RNNにweight decayを適用するもあまり変化なし。
  3. 逆にDNNに適用すると訓練セットの正解率がガタ落ち。80%程度に。テストセットは73%前後になる。
  4. 入力音声はHPS(打撃音分離)済みのものだったが訓練セットに元音声も入れて二倍に水増し。1%くらい上昇。
  5. 入力のスペクトラム系列にローパスをかける。これもちょっとプラスに働く…気がする。

まあいろいろ足掻いたんですが、今のところだいたい75%前後が限界でした。DNNもstacked autoencoderなど他の形のものを作って試してみたもののいい結果は無し。

個別の認識成績は、この前のものよりも揺れが激しい印象で、正解率90%台が結構出ると思いきや30%台の大爆死事案も散見された、という感じ。

今のところこれ以上改善案は見出せないので、一旦忘れて別のアプローチを試してみたいと思います。

気になる策は2つ。

  1. 時間遅れニューラルネットワーク(TDNN)。時間方向の畳み込みができるのは重要な事かもしれない。
  2. 近年はRNNを使ってonset detection、さらにはノートレベルの耳コピもできるらしい。その技術を応用できるかどうか考えてみたい。

頑張りましょう。