筆者は学生時代からプログラミングをそれなりにやってきた。これまで必要に応じてC/C++やObject Pascalなどのプログラミング言語や、Ruby、PowerShellといったスクリプト言語を使ってきた。しかしPythonは、Rubyがあれば十分だと感じていたので、なんとなく手を出しかねていた。

 しかし日経NETWORKでスクリプトを使って通信ソフトの仕組みを紹介する企画を考えたとき、ディープラーニングや機械学習、データサイエンスなどでもてはやされていることもあり、Pythonを使ってみようと企んだ。実際問題として、日経NETWORKで筆者が何度となく取り上げて「推して」いたPowerShellだと、通信ソフトに不可欠なマルチスレッドの記述がやりにくい、という事情もあったのだが。

 実際に使ってみて、「Pythonやるなあ」と思ったことがいくつかある。記述のしやすさがその一つ。インデント(字下げ)でブロックを表現するのは、想像していた以上にわかりやすかった。

 たいていのプログラミング言語では、「{」と「}」や「begin」と「end」の組み合わせでブロックを表現する。Pythonの字下げによるブロックの表現よりも安全性は高い。しかしプログラムの書き手からすると、ソースコースの読みやすさを考えてどのみち正しく字下げを調整する。手間を考えると、ブロックを表現する記述は不要で、すぐに取り掛かれる。誌面に載せる場合も余計な行数を費やさなくて済むという、雑誌の作り手にはうれしいメリットもあった。

 だがそれ以上に興味深いのが、グラフ描画や行列演算など、各種ライブラリが充実している点だ。「Anaconda」という、米コンティニューム・アナリティクス社が公開している実装だと、Webブラウザーで文書を編集するように、スクリプトを部分的に編集、実行させることができ、非常に便利だった。またディープラーニングを実現するためのライブラリとして、米グーグルが開発した「TensorFlow」や日本のPreferred Networksが開発した「Chainer」などが公開されていて、誰でも手軽に試すことができる。

ディープラーニングを試してみる

 そこで“ネットワーク”違いだが、筆者もニューラルネットワークを試してみた。それほど高度なモデルではないので、ディープラーニングというよりもニューラルネットワークと呼ぶほうが正しいだろう。ただ一応は3層以上の構成なので、もしかしたらディープラーニングを名乗ってもよいのかもしれない。

 試した動機は、最近多くの場面で紹介されているAIの大半はディープラーニングであり、それが巷間言われているほど万能であるなら、筆者にも手軽に予測モデルを作成できるのではないかと考えたからだ。

 題材は、比較的簡単にデータを入手できる分野として、為替レートにした。もちろん、うまい予測モデルが作れたら、それで取引して儲けられるかも、という下心も多少はあった。ニューラルネットワークのライブラリにはTensorFlowを使った。

 ディープラーニングの解説書を見ると、ほとんどがCNN(Convolutional Neural Network:畳み込みニューラルネットワーク)を取り扱っている。ディープラーニングがその効力を最初に示したのが画像認識であり、CNNはもともと画像の特徴抽出フィルターとして作られたからだ。もしかしたら価格の推移を画像として認識し、そのマッチングで予測できるのかもしれない。

 だが今回は、CNNは使わなかった。調べたところ、時系列データを取り扱うには「リカレント型」というネットワーク構成がよいらしい。単純なリカレント型ネットワークは80年代後半には考案されていたが、3層構成のバックプロパゲーションモデル同様、重み情報が失われやすい傾向があったという。TensorFlowにはLSTM(Long Short Term Memory)と呼ぶ、リカレント型ネットワークを改良したモデルが搭載されているので、それを利用することにした。

 とりあえず単純にLSTMをニューロンとして6個並べた層を中間層としたニューラルネットワークを定義して、時間単位のデータを学習させたところ、予測としては不十分ながら多少は傾向が見える(図1)。 意外にいけるかもしれない。

図1●24時間分の推移を学習させた結果
[画像のクリックで拡大表示]
図1●24時間分の推移を学習させた結果
青が実際の値、緑が教師データに学習結果を適用した結果、赤が未学習のデータを元に予測した結果。赤い線が大きな動きに追従しようとしている様子がうかがえる。