cedro-blog

SONY Neural Network Console 未来を予測するニューラルネットワーク

今回は、航空会社の乗客数を予測してみます

こんにちは cedro です。

過去から現在までが一定のトレンドで推移していて、未来もそのトレンドが続くと仮定するならば、未来予測ができるはずです。

分かりやすい例が、ムーアの法則。

ムーアの法則とは、インテル創業者の一人であるゴードン・ムーアが、1965年に自らの論文上で唱えた「半導体の集積率は18か月で2倍になる」という半導体業界の経験則で、50年経った今でも通用していると言われています。

ニューラルネットワークの中には、過去の時系列データの流れからその後のデータを予測する、リカレント・ニューラル・ネットワークというのがあり、主に文章・対話の生成、音素・音声認識、 映像認識等に使われています。

今回は、このリカレント・ニューラル・ネットワークを使って、航空会社の乗客数を予測してみます。

データの収集・加工

今回は、オリジナルのデータ収集は行わず、ネットにあるものをダウンロードして使います。

これは、超有名な統計データで、1949年から1960年(12年間)のインターナショナル・エアラインズの乗客数の月別推移です。

毎年、ピークがあるのはバカンスで乗客数が急増するためでしょうか。

明らかな季節変動要素を持ち、かつ長期的には綺麗な右肩上がりのトレンドで、サンプルデータとしてはもってこいです。

今回は、1949年から1956年の8年間をニューラルネットワークに学習させ、1957年~1960年のその後の4年間を予測させてみたいと思います。

 

早速、DataMarket というサイトへ行き、Exportタブを選んで、Excel(.xls)をダウンロードします。

ダウンロードしたら、その後のデータ加工のことを考えて、OpenOfficeのCalcで開いて下さいね。

 

データは、おおむね-1~+1の範囲でなければならないので、各データを月別乗客数の最大値622で割ったものを計算します。

これを12か月分づつ、コピーしてデータファイルを作成します。

まず、黄色の部分をコピーします。

 

新しいファイルを開き、A1のところで右クリックし、「形式を選択して貼り付ける」を選択します。

 

ポップアップが出たら、「OK」を押します。

 

新しいファイルに、12か月分のデータがコピーされました。

 

名前を付けて保存を選び、ファイル名は「」とし、「テキストCSV(.csv)」を選んで「保存」を押します。

 

文字の種類を聞いてくるので、「Unicode(UTF-8)」を選択して、「OK」を押します。

 

こんな警告は出ますが、問題ありません。「OK」を押します。

これで、SONY Neural Network Console が読める、CSV形式で文字コードUTF-8の、0.csv というファイルが出来ました。

同じ要領で、全部で12個のファイル(0.csv11.csv)を作成します。

それでは、学習ファイルと評価ファイルを作成します。

 

学習ファイル air_train.csv は、これだけ。

 

評価ファイル air_test.csv もこれだけ。

C:直下に、SNNC75フォルダーを作成しその中に、学習ファイルair_train.csv、評価ファイルair_test.csvair_dataフォルダーを格納します。

そして、air_dataフォルダーの中に、0.csv11.csv を格納します。

SONY Neural Network Console を起動し、DATASET画面の Open dataset で、air_train.csv とair_test.csv を登録しておきます。

ニューラルネットワークの作成・学習・評価

さて、今回流用するプロジェクトは、リカレントニューラルネットワークの中でも、最もシンプルな、eleman_net.sdcproj です。

一端、SNNC75フォルダーにセーブして、編集します。

 

EDIT画面での変更点は以下の様です。

レイヤーについては、Slice を削除し(MNIST用なので不要です)、BinaryCrossEntropy → SquaredError に変更します(分類から数値へ)。

パラメーターについては、Input1,28,28 → 12,1 (白黒28×28画像から12行×1列の行列に変更)し、それに従って、関係するところを変更します(図を参照)。

RecurrentInput、Concatenate、RecurrentOutputaxisを「」にします。

そして、SquaredErrorT.Datasetを y → x  に変更します。

 

学習データと評価データをMNISTから入れ替えたら、Batch Size4(評価データが4個しかないので)、Max Epoch 500で、学習のスタートです。

 

最初、評価誤差がポンと上がりましたが、すぐ収束しました。

 

評価結果がこれです。Neural Network Consoleには、こういう場合にグラフ表示してくれる機能がないので、表示はそっけないです。

これは、8.csv に対する予測結果は、.\0_0000\0.csv に出力されています、という意味です。

具体的に、このファイルが何処にあるかと言うと、

 

SNNC75フォルダーの内容を表示し、air_eleman_net.files をクリックします。

 

その中に、実行した日付と時刻別のフォルダーがあるので、見たいフォルダーをクリックすると、

この0_0000フォルダーの中に、出力の0.csv〜3.csv が入っています。

 

中身をみると、1行×12列のデータになっていますので、これを自分で加工して、Calcでグラフ表示させます。

青色がActual(実績)、赤色がForcast(予測)です。ピークとボトムは合っているようですが、段々ピークが上がっているところの予測がイマイチなようです。

 

LSTMで予測してみる

リカレント・ニューラル・ネットワークの中には、1995年に登場した有名なLSTM(Long Short-Term Memory Network)というのがあります。

これは、短期だけでなく長期の時系列データでも適切に学習が行われるように工夫がされたものです。

Neural Network Console の中にも、long_short_term_memory(LSTM).sdcproj というプロジェクトが登録されています。

結構複雑そうなニューラルネットワークですね。

ところで、Neural Network Consoleには、この複雑なニューラルネットワークを1つにまとめたUNITが登録されているのはご存知ですか?

 

実は、EDIT画面の左側のComponentsの真ん中あたりに、LSTM‗Unitがあるんです。

今回は、これを使って、LSTMのニューラルネットワークをゼロから作ってみます。

 

はい、出来ました(笑)。

えっ?これだけでいいんですか?って思うでしょ。でも、これだけでいいんです(笑)。

実は、LSTM Unit は、long_short_term_memory(LSTM).sdcproj RecurrentInput からRecurrentOutput までをまとめたものなんです。

なんて便利なんでしょう。

 

では、Batch Size 4、Max Epoch 500、Structure Seaech Enable にチェックを入れ、自動最適化をさせてみます。

 

60回くらいやって、一番良かったのがこれ

 

最初と比べると、LSTM UnitAffine の間に「Dropout」が追加され、AffineSigmoid の間に 「BatchNormalization」が追加されました。

予測結果です。eleman_net.sdcproj と比べて、段々ピークが上がって行くところも、ある程度追従できるようになったようです。

では、また。