1.はじめに
この記事はNeural Network Console Challenge(以下NNC)のレポートです。NNCはプログラミングやディープラーニングの知識をあまり必要とせず、直感的にネットワークを設計し、学習させることができるツールです。今回のコンテストではAudiostockのBGMデータを用いてBGM分類を行います。
2.音声データ
今回は音声データの前処理をPythonを用いて行いました。Pythonのlibrosaというライブラリにメルスペクトログラムを実装する関数があるのでそれを用いて音声データを3×128×128の画像に変換しました。
2.1 メルスペクトログラム
メルスペクトログラムの前にまずスペクトログラムについて説明します。音声信号の周波数成分を分析する手法の一つとして高速フーリエ変換というものが存在します。音声信号を一定の幅で切り取り、高速フーリエ変換を行うことで、どの周波数成分が強く表れているか調べることができます。切り取った幅を時間軸にずらしてさらに高速フーリエ変換を行い、これを繰り返すことで時間変化に対する周波数成分が分かります。

しかし、人間の聴覚は周波数を線形スケールでは認知しないので、周波数成分をメルスケールに変換することで、スペクトログラムをメルスペクトログラムに変換します。
2.2 アノテーション
データファイルのcsvファイルは下の画像のようになっています。タグを見てみると、それぞれの音声に対して単一のタグが設定されているのではなく、複数のタグが設定されていることが分かります。そこで、今回はBGM分類問題をマルチラベル問題として考え、それぞれのタグを予測することにしました。ただし、すべてのラベルに対して予想するのではなく、よく頻出する20個のラベル「"ポップ","ジングル","軽快","楽しい","ロック","ポップス","バラード","さわやか","明るい","シンセサイザー", "元気","感動","希望","ゆったり","優しい","わくわく","淡々","切ない","哀愁","おしゃれ"」に対して予測することにしました。

2.3 学習・検証用データセット
データは全てで10802個あり、今回は学習用データと検証用データを7:3の割合で分けることにしました。データを分けるときはsklearnのtrain_test_splitを用い、shuffle=Trueとしました。
3.Neural Network Console
3.1 ネットワーク設計
ネットワークの全体像は下の図のようになります。今回はNNCのユニット機能を用いて、BlockとConvという2つのユニットを作成しました。
今回のネットワークはResNetというものを参考に作成しました。ResNetは同じ処理を繰り返すので、NNCのユニット機能を使用しました。そうすることで、一回ユニットを定義すれば、そのユニットを繰り返し使うことができます。さらに、ResNetではレイヤーによって入力サイズが異なるため、レイヤーのargumentという機能を用いて、定義したユニットに対して引数を渡すことで、同じユニットでも異なるカーネルサイズやチャネル数を設定することができます。
先ほども述べたように今回扱う問題はマルチラベル問題となります。しかし、NNCのドキュメントを見てもマルチクラスに対する方法は書いてありますが、マルチラベル問題に対するレイヤーや損失関数の設計の仕方が載っていなかったので、出力層のAffineの20出力をSliceレイヤーを用いてそれぞれの出力を取り出し、Sigmoid+CrosEntropyで損失を計算しました。また、学習と検証データセットで汎化誤差が小さくなるように最終層においてDropoutを行いました。
3.2 学習結果
学習結果は下の図のようになります。NVIDIA Tesla V100を用いると100エポックがたったの2分30秒で学習し終えました。一方で、CPUでは画像はないですが、約10時間かかりました。

3.3 評価
検証用データに対しての評価が下の図のようになります。Accuracyを見てみると0.9を超えているものがたくさんあり、ぱっとみ良い予測ができていると思いがちですが、今回はマルチラベル問題であり、多くのラベルが0であるので、全部0に予測すればこれくらいのAccuracyが出るので、他の指標を見ることにします。
今回はPrecisionの指標を見ることにします。Precisionとは「1と予測したラベルのうち、実際に1であるラベルの割合」を表します。
ラベルy0は0.6以上、y1は0.9以上であり、良い予測ができている一方で、他のラベルは0.4~0.5であり、約半分しか正しく予測できていないことが分かりました。

4.まとめ
今回はNeural Network Consokeというツールを用いてBGM分類を行いました。直感的なGUI操作で複雑なニューラルネットワークを設計することができ、また、GPUも利用できるので今後の深層学習においてとても役に立つのではないかと思いました。


