12.4 ニューラルネットワーク・モデル

人工的な神経(ニューラル)ネットワークは、脳の単純な数学モデルに基づく予測手法です。応答変数と予測変数の間の複雑な非線形関係を扱えます。

ニューラルネットワークの構造

ニューラルネットワークは、層に組織化された「ニューロン」のネットワークと考えることができます。予測変数(もしくは、入力)はボトム層を形成し、予測(もしくは、出力)はトップ層を形成します。「隠れニューロン」を含む中間層もあるかもしれません。

線形回帰と同値な単純なニューラルネットワーク

図 12.15: 線形回帰と同値な単純なニューラルネットワーク

最も単純なネットワークは隠れ層を含まず、線形回帰と同値です。図12.15は、4つの予測変数がある線型回帰のニューラルネットワーク版です。これらの予測変数に付いている係数は「ウェイト」と呼ばれます。予測は入力の線形結合として得られます。ニューラルネットワークのフレームワークでは、MSEのような「コスト関数」を最小化する「学習アルゴリズム」を使ってウェイトが選ばれます。もちろん、この単純な例では、モデルを訓練するずっと効率的な手法である線型回帰が使えます。

隠れニューロンを持つ中間層を加えると、ニューラルネットワークは非線形になります。図12.16は、単純な例です。

4つの入力と3つの隠れニューロンを含む1つの隠れ層を持つニューラルネットワーク

図 12.16: 4つの入力と3つの隠れニューロンを含む1つの隠れ層を持つニューラルネットワーク

これは多層フィードフォワード・ネットワークと呼ばれ、ノードの各層はその前の層から入力を受け取ります。ある層のノードの出力が次の層の入力になります。各ノードの入力はウェイト付けされた線形結合です。次に、非線形関数で修正されて出力されます。例えば、図12.16での各隠れニューロンへの入力は、以下のような線形結合です。 \[ z_j = b_j + \sum_{i=1}^4 w_{i,j} x_i \] 隠れ層では、これは次にシグモイドのような非線形関数を使って修正されてから、次の層への入力として渡されます。 \[ s(z) = \frac{1}{1+e^{-z}} \] これで、極端な入力値の影響が減じられ、ネットワークを外れ値に対していくらかロバスト(頑健)にします。

パラメータ\(b_1,b_2,b_3\)とウェイト\(w_{1,1},\dots,w_{4,3}\)は、データから「学習」(もしくは、推計)されます。ウェイト値は大きくなり過ぎないよう制約されるのが普通です。ウェイトを制約するパラメータを「減衰パラメータ」と言い、0.1に設定するのが普通です。

ウェイトは最初はランダムな値を取っていて、次に観測データを使ってアップデートされていきます。従って、ニューラルネットワークで生成した予測にはランダムな要素があります。ですから、違ったランダムな開始点を使ってネットワークは数回訓練されて、結果は平均されるのが普通です。

隠れ層数や隠れ層ごとのノード数は予め指定する必要があります。これらを交差検証を使ってどう選べば良いのか、本章の後ほど検討します。

ニューラルネットワーク自己回帰

時系列データでは、線形自己回帰モデル(9章)でラグ値を使ったように、ニューラルネットワークの入力として時系列のラグ値が使えます。これをニューラルネットワーク自己回帰モデル、もしくは、NNARモデルと言います。

本書では、1つの隠れ層を持つフィードフォワード・ネットワークだけを考えて、ラグ入力\(p\)個と隠れ層のノード数\(k\)個があることを指して、NNAR(\(p,k\))と表記します。例えば、NNAR(9,5)モデルは、最近の9つの観測値\((y_{t-1},y_{t-2},\dots,y_{t-9}\))を入力として使い、隠れ層に5つのニューロンを持つ、出力\(y_t\)を予測するためのニューラルネットワークです。NNAR(\(p,0\))モデルはARIMA(\(p,0,0\))モデルと同値ですが、定常性を確保するためのパラメータへの制約はありません。

季節性のあるデータでは、同季節の最近の観測値も入力に加えると役に立ちます。例えばNNAR(3,1,2)\(_{12}\)モデルは、入力が\(y_{t-1}\), \(y_{t-2}\), \(y_{t-3}\)\(y_{t-12}\)で、隠れ層に2つのニューロンがあります。より一般化して言うと、NNAR(\(p,P,k\))\(_m\)モデルは、入力が\((y_{t-1},y_{t-2},\dots,y_{t-p},y_{t-m},y_{t-2m},\dots,y_{t-Pm})\)で、隠れ層に\(k\)個のニューロンがあります。NNAR(\(p,P,0\))\(_m\)モデルはARIMA(\(p,0,0\))(\(P\),0,0)\(_m\)モデルと同値ですが、定常性を確保するためのパラメータへの制約はありません。

NNETAR()関数はNNAR(\(p,P,k\))\(_m\)モデルを適合させます。\(p\)\(P\)の値を指定しないと、自動的に選択されます。非季節性時系列では、デフォルトは線形AR(\(p\))モデルで(AICによる)最適なラグ数です。季節性時系列では、デフォルト値は\(P=1\)で、\(p\)は季節調整値への最適に当てはまる線形モデルから選ばれます。\(k\)を指定しないと、\(k=(p+P+1)/2\)(整数に丸められます)となります。

予測する段になると、ネットワークは反復的に適用されます。1期先予測では、入手可能な過去の入力を使うだけです。2期先予測では、過去のデータと合わせて、1期先予測を入力として使います。全ての必要な予測を計算するまで、このプロセスを続けます。

事例: 太陽黒点

太陽の表面には暗い点に見える磁気領域があります。電磁波の伝播に影響するので、通信会社は太陽黒点の活動を予測して、将来の困難に備えたいと考えています。太陽黒点は9年から14年の長さの循環に従っています。図12.17は、NNAR(9,5)からの予測の次の30年分です。平方根変換を使って、予測が正値になるよう確保しています。

sunspots <- sunspot.year %>% as_tsibble()
sunspots %>%
  model(NNETAR(sqrt(value))) %>%
  forecast(h = 30) %>%
  autoplot(sunspots) +
  labs(x = "年", y = "数", level = "区間予測",
       title = "年次の太陽黒点")
9個のラグ入力と5個のニューロンを含む隠れ層1つを持つニューラルネットワークからの予測

図 12.17: 9個のラグ入力と5個のニューロンを含む隠れ層1つを持つニューラルネットワークからの予測

ここでは、最近の9個の観測値を予測変数として使い、隠れ層には5個のニューロンがあります。データの循環性が上手くモデル化されています。また、循環の増加パートは減少パートよりも急という循環の非対称性を、モデルが取り込んでいることが見て取れます。これはNNARモデルと線形ARモデルの違いの一つです。つまり、ARモデルは循環性をモデル化できますが、モデル化された循環は必ず対称になります。

区間予測

本書で検討した手法のほとんどと違って、ニューラルネットワークはきちんと定義された確率モデルに基づいていないので、結果として出てくる予測の区間予測を導き出すのは容易ではありません。しかしそれでも、残差をブートストラップ(5.5節で述べたように)して使い、将来の標本経路を生成するシミュレーションを使えば、区間予測を計算できます。

太陽黒点データに適合させたニューラルネットワークは、以下のように書けます。 \[ y_t = f(\bm{y}_{t-1}) + \varepsilon_t \] ただし、\(\bm{y}_{t-1} = (y_{t-1},y_{t-2},\dots,y_{t-9})'\)は系列のラグ値を含むベクトル、\(f\)は単一の層に5個の隠れノードを持つニューラルネットワークです。誤差系列\(\{\varepsilon_t\}\)は均一分散と(そして、たぶん正規分布も)想定します。

\(\varepsilon_t\)の値を、正規分布から抽出するか、過去値から再抽出するかして、ランダムに生成することを繰り返せば、このモデルの将来の標本経路をシミュレートできます。ですから、\(\varepsilon^*_{T+1}\)\(T+1\)時点での誤差分布からランダムに抽出したものなら、 \[ y^*_{T+1} = f(\bm{y}_{T}) + \varepsilon^*_{T+1} \] は、\(y_{T+1}\)の予測の分布から抽出することがあり得る1つになります。次に、\(\bm{y}_{T+1}^* = (y^*_{T+1}, y_{T}, \dots, y_{T-7})'\)と設定して、このプロセスを繰り返せば以下を得ることができます。 \[ y^*_{T+2} = f(\bm{y}^*_{T+1}) + \varepsilon^*_{T+2} \] こうして、将来の標本経路を繰り返しシミュレートできます。繰り返し標本経路をシミュレートすることで、適合ニューラルネットワークに基づく全ての将来値の分布の知識を構築できます。

ここでは、シミュレーションにより太陽黒点データのあり得る将来の標本経路9つを得ています。各標本経路は観測データ後30年分をカバーしています。

fit %>%
  generate(times = 9, h = 30) %>%
  autoplot(.sim) +
  autolayer(sunspots, value) +
  theme(legend.position = "none")
年次太陽黒点データの将来の標本経路

図 12.18: 年次太陽黒点データの将来の標本経路

これを何度も行えば、予測の分布の良い絵が得られます。こうして、forecast()関数はNNARモデルの区間予測を生成しています。forecast()の中のtimes引数でシミュレーションの回数(デフォルトは1000回)を調整できます。デフォルトでは、誤差は正規分布から抽出しています。bootstrap引数を使えば、誤差を「ブートストラップ」する(つまり、過去値からランダムに抽出する)ことができます。.