AlphaImpact 会社概要 事業内容 開発情報 お問い合わせ

第11回 競馬で学ぶニューラルネットワーク 〜パーセプトロン編〜

2017/05/04更新

NUKUI

今回の記事ではディープラーニングの説明に入る前に、ニューラルネットワークの基本形であるパーセプトロンについて説明していきます。

パーセプトロン

我々生物の脳は無数の神経細胞(ニューロン)から構成されており、その神経細胞の相互的な電気信号によって学習や思考といった機能を獲得しています。人工知能の分野において、ニューロンの神経ネットワークを模倣した計算モデルをニューラルネットワークと呼びます。

ニューラルネットワークの研究は約半世紀以上も前から行われており、長い歴史があります。1958年にフランク・ローゼンブラットが提案したパーセプトロンは現在広く使われているニューラルネットワークやディープラーニングの基礎となっている理論です。パーセプトロンは $ y={+1, -1} $ を識別する二値分類器であり、以下の図ようにS層、A層、R層の3層から構成されています。

perceptron

S層(入力層)に入力された信号はA層(中間層)で重み係数 $ w_j $ が掛けられ、その総和 $ z $ が出力層のユニットに入力されます。総和 $ z $ は以下の式のように表されます。

$$ z = \sum_{j}w_j x_j \tag{1}$$

そして、出力層のユニットでは信号の総和 $ z $ があるしきい値 $ \theta $ 以上だったときに $ +1 $ 、 $ \theta $ 未満のときに $ -1 $ となるような変換を行ないます。この変換には以下で表されるヘビサイド関数が用いられます。

$$\begin{eqnarray}f(z) =\begin{cases}1 & (z \geqq \theta) \\\-1 & (z < \theta)\end{cases} \tag{2}\end{eqnarray}$$

一般には、 $ w_0=\theta $ 、 $ x_0=+1 $ と置いて、 $ z=\sum_{j}w_j x_j=\mathbf{w}^T\mathbf{x} $ として簡潔に表現します。

このような一定以上の強い信号が来た時にユニットがアクティブになる挙動は、脳のニューロンが一定以上の電気信号を受け取ると発火し、シナプスで結合している別のニューロンに神経伝達物質が伝わる機能をモデル化したものです。ユニットが発火するかどうかを決定する関数は活性化関数と呼ばれ、ヘビサイド関数はその中で最も単純な関数の1つです。活性化関数には非連続な関数の他に、シグモイド関数tanhなどの微分可能な関数もあり、現在ではそちらが主流になっています。また、中間層が1層の単純パーセプトロンの活性化関数にシグモイド関数を選ぶと、第8回理論記事で紹介したロジスティック回帰と等価な識別器になることが知られています。

パーセプトロンの学習規則は以下のステップにより行われます:

  1. 重みベクトル $ \mathbf{w} $ を適当に初期化する
  2. 入力 $ \mathbf{x_i} $ に対する予測ラベルを $ \hat{y_i} $ 、正解ラベルを $ y_i $ としたとき、以下の式により重み係数を更新する$$\mathbf{w} \leftarrow \mathbf{w} + \eta (y_i - \hat{y_i}) \mathbf{x_i} \tag{3}$$
  3. 収束するか、最大更新回数(最大エポック数)に達するまでステップ2を繰り返す

ただし、式(3)中の $ \eta $ は正の値をとる学習係数です。パーセプトロンの学習規則による重みの更新は、訓練サンプルのクラスラベル $ {+1, -1} $ が線形分離可能な場合にのみ収束することが証明されています。そのため、競馬予測のように線形非分離不可能なデータに対して学習を行なうときは、最大更新回数(最大エポック数)を設定しないと無限に更新が続いてしまうので注意が必要です。

実験設定

今回の実験には中間層が1層で、出力層の活性化関数をヘビサイド関数とした古典的な単純パーセプトロンを用います。解く問題は過去記事の分類問題の設定と同様に、複勝圏内に入るかどうかの2クラス分類とします。

特徴量はこれまでの実験と同様に以下の14個を用います。

特徴量名 カラム名 説明
出走頭数 num_horse レースに出走する頭数
1着賞金 win_prize レースレベルの指標
馬齢 age 馬の年齢
性別 gender 牡・牝のダミー変数(騙馬は少ないのでダミー変数にしない)
斤量 burden kg
脚質 run_style 逃げ=1, 先行=2, 差し=3, 追込=4
馬複勝率 place_ratio 馬の通算複勝率
前走距離 prev_length メートル
前走タイム差 prev_time_diff 1着との秒差
前走前3Fタイム prev_first3f
前走後3Fタイム prev_last3f
馬体重 horse_weight kg
馬体重増減 delta_weight kg
騎手複勝率 jockey_place_ratio 過去1ヶ月の騎手の複勝率

また、パーセプトロンの実装にはscikit-learnのPerceptronを利用しました。

重み係数の更新回数の上限は1000回として、その他のパラメータはデフォルト値としました。また、特徴量間のスケールを統一するために、前処理として標準化を行ないました。

学習の進行

更新ステップごとの精度の変化をグラフに示します。精度の指標には正規化相互情報量(NMI)を用いました。

perceptron_nmi_progress

学習がどれだけ進行しても収束しそうにないことがわかります。これは競馬のデータが線形非分離であるためで、妥当な結果と言えるでしょう。

予測ラベルを可視化する

1000回の更新の中で最もNMIスコアが高かったときの重み係数で評価用テストデータの予測をしたときの結果を可視化してみます。高次元データの可視化は、多次元尺度法であるt-SNE1を利用して2次元平面上へ射影した点をプロットします。

まずは、正解ラベルを可視化した結果です。

perceptron_true_label

次に、単純パーセプトロンによる予測ラベルを可視化した結果です。

perceptron_pred_label

図中のx_tsne1とx_tsne2はt-SNEにより15次元の入力データを2次元に圧縮した後の値を示しています。

正解ラベルと予測ラベルを見比べてみると、左下と右上のTrueラベルをいくつか的中させているので、多少の予測性能は有していると推測されます。

2016年ジャパンカップを予測する

レース結果と単純パーセプトロンによる予測ラベルは以下の通りです。

着順 馬番 馬名 人気 予測ラベル(複勝圏内)
1 1 キタサンブラック 1 False
2 12 サウンズオブアース 5 False
3 17 シュヴァルグラン 6 False
4 3 ゴールドアクター 3 False
5 16 リアルスティール 2 False
6 14 レインボーライン 8 True
7 5 イキートス 16 False
8 7 ワンアンドオンリー 14 False
9 4 ルージュバック 7 False
10 6 ラストインパクト 13 False
11 10 トーセンバジル 12 False
12 15 ナイトフラワー 9 False
13 9 ディーマジェスティ 4 True
14 8 イラプト 10 False
15 13 ヒットザターゲット 17 False
16 2 ビッシュ 11 False
17 11 フェイムゲーム 15 False

レインボーラインとディーマジェスティの2頭が複勝圏内に入るという予測結果となりました。中穴狙いの渋い予想ですが、これまでの実験で試したSVMランダムフォレストなどはキタサンブラックを最上位に予測できていたことを考えると、単純パーセプトロンはあまり精度が高くないということが見てとれます。

まとめ

今回はニューラルネットワークの中でも最もシンプルな単純パーセプトロンによる競馬予測を試しました。単純パーセプトロンは理解が容易く、機械学習の導入には良い手法ですが、非線形なデータだと収束しないという性質は競馬を含む多くの実問題に適用するときの障害となります。そういうわけで、次回はその問題を解決するため、誤差逆伝播法(バックプロパゲーション)で学習を行なう多層ニューラルネットワークを使って競馬予測をしていきたいと思います。


  1. t-SNEに使用したライブラリ: t-SNE ↩︎