RCOと機械学習:ニューラルネットワーク編

アドテクにおいて、データを分析したり最適化を行うために機械学習を使う事があります。少なくともRCOアドテク部では、しばしば機械学習のお世話になっています。

この機械学習ですが、結構昔から研究されている割に、いまだにブレイクスルーがあって、研究の流行がガラっと変わることがあります。近年だとDeep Learningが有名ですかね。多層(5〜10段くらい)のニューラルネットワークを使う学習手法で、多層ニューラルネットワークが持つ、出力層から遠くなるほどエラーが拡散してしまって上手く伝わらないという問題と、学習に使うデータに過剰に適合してしまって未知データへの適合が悪くなる過学習の問題を改善しました。もちろん万能ではありませんが、画像認識や音声認識の分野では無双していると訊きます。

というわけで、この記事でもDeep Learningの躍進に便乗して、ニューラルネットワークの学習について考えてみようと思います。テーマはニューラルネットワークによる時系列予測です。時系列予測というのも、離散時間モデルなら \vec{x}(t) から \vec{x}(t+1) を、連続時間モデルなら \vec{x}(t)) から \frac{d\vec{x}}{dt} を予測する問題として扱えます。
離散時間の場合、単純なモデルとして次のような式が考えられますね 1

\displaystyle\vec{c}(t) = f(W_{cx} \vec{x}(t) + W_{cc} \vec{c}(t-1) + \vec{v}_{c})

\displaystyle\vec{y}(t) = g(W_{yc} \vec{c}(t) + \vec{v}_{y})

\vec{x}(t)が時刻tの入力、\vec{c}(t)がネットワークの内部状態、\vec{y}(t)が出力です。||\vec{y}(t) - \vec{x}(t+1)||を0に近づけることで、モデルを予測対象となるシステムに近づけて行きます 2。f, gが微分可能のときは、教師データとモデルの出力の差に対する偏微分を解くことで、パラメータW_{cx}, W_{cc}, W_{yc}, \vec{v}_{c}, \vec{v}_{y}を調整して誤差を0に近づけるための勾配方向を得る事ができます 3

関数fやgには何を使っても良いのですが、ニューロンの発火率をモデル化したシグモイド関数や、Radial basis functionが使われる事が多いようです。で、ここからは経験則的な話になりますが、同じシグモイド曲線を持った関数でも、sigmoid 4よりはtanh 5を使った方が良い学習結果が得られやすいようです。例えば図1は、fにsigmoidと使った場合とtanhを使った場合(ただし、両者ともg = sigmoid)のそれぞれについて、Mackey Glass time series (delay=17) をBPTTで学習させた結果です。学習後のエラーの大きさに差があるのが見て取れます。

  error-mg

図1. Mackey Glass time series (delay=17) をsigmoidモデルとtanhモデルに学習させた結果。
各ニューロン数に対して学習させた結果のエラーの中央値をプロットしている(サンプル数は100)。
エラーバーは25%パーセンタイルと75%パーセンタイルの値。

しかし、なぜこのような差が出るのでしょう?sigmoidを使ったモデルとtanhを使ったモデルは、表現能力の意味では完全に等価です。実際、tanhモデルのパラメータを適当にアフィン変換してsigmoidモデルに適用すると、全く同じ結果が得られます。それなのに、この学習性能の差。不思議じゃないですか?え、自明ですか?まあ自明かもしれませんが、私は最初分からなかったので、そこのところをちょっと考察してみました。

次のような最小のモデルを考えましょう。

\displaystyle y = w f(x)

エラーをE = \frac{1}{2} (y - y^{\mathrm{teach}})^2としたとき、パラメータwと変数xにback propagationで流れるエラーはそれぞれ

\displaystyle \frac{\partial E}{\partial w} = (y-y^{\mathrm{teach}})\frac{\partial y}{\partial w}

\displaystyle \frac{\partial E}{\partial x} = (y-y^{\mathrm{teach}})\frac{\partial y}{\partial x}

になります。ここで(y-y^{\mathrm{teach}})は誤差の項で\frac{\partial E}{\partial x}, \frac{\partial E}{\partial w}で共通ですので、ここでは\frac{\partial y}{\partial x}\frac{\partial y}{\partial w}に焦点を絞ります。

f = sigmoid のとき

\displaystyle \frac{\partial y}{\partial w} = f(x)

\displaystyle \frac{\partial y}{\partial x} = w f(x) (1 - f(x))

f = tanh のとき

\displaystyle \frac{\partial y}{\partial w} = f(x)

\displaystyle \frac{\partial y}{\partial x} = w (1 - f(x)^2)

sigmoidtanh

図2.  \frac{\partial y}{\partial w}, \frac{\partial y}{\partial x}の絶対値のグラフ。f=sigmoidのときw=4, f=tanhのときw=1。

それぞれの式の絶対値をグラフにすると図2になります。f=tanhのときは、f(x)がどのような値を取ろうとも、wかxのどちらかにエラーが流れることが分かります。一方、f=sigmoidのときは、f(x)=0の場合、wとxの両方共にエラーが流れて行きません。wが更新されないのに back propagationも途切れてしまっているため、上手く学習できそうも無いことが予想されます。もちろん、\mathrm{sigmoid}(x) = 0になるのはx = -\inftyのときですので、厳密にback propagation が途切れる事はないのですが、殆ど0になることは十分にありえますし、エラーがxとwにバランス良く流れるtanhモデルに比べるとどうしても見劣りしますね。

そんなわけで、モデルとしての表現能力は等価でも、些細な差で性能に差がでるところが機械学習の面白いところです。RCOでは、日々こんな感じで機械学習の性能を上げるための試行錯誤をしつつ、アドテク領域に機械学習を適用しています。次回以降の記事では、もう少しアドテクに踏み込んだ話題も紹介できればと思います。


Notes:

  1. Simple Recurrent Neural Network や Elman Networkと呼ばれます。
  2. ただし、訓練データに対して誤差が0になったからと言って、未知のデータに対する予測精度が高いとか限りません。また予測対象となる系がカオスである場合は、モデルと対象の構造が完全に一致したとしても、一定以上の未来を予測する事はできません。
  3. そのような学習手法のひとつがBPTT(Back propagation through time)法で、ネットワークを時間方向に展開して多層のニューラルネットワークとみなしてBack propagationを適用します。このときの層の深さは学習に使う時系列の長さで決まるため、多層ニューラルネットワークにおいてエラーが上手く伝わらないという問題がここでも顔を出します。
  4. \mathrm{sigmoid}(x) = \frac{1}{1 + \exp(e^{-x})}
  5. \tanh(x) = \frac{\exp(x)-\exp(-x)}{\exp(x) + \exp(-x)}. sigmoidとは次の関係がある:\mathrm{sigmoid}(x) = \frac{1}{2} (\tanh(\frac{x}{2}) + 1)