Chainer と TensorFlow でロジスティック回帰を実行、比較


ロジスティック回帰の2クラス分類を ChainerTensorFlow でやってみます。

データは \(x,y\) の 2次元とし、下図のように赤と青のグループを生成します。それぞれ クラス 0クラス 1 とし、両クラスをうまく分類できそうな境界線を Chainer と TensorFlow で探します。

color_circle

- 目次 -

スポンサーリンク

ロジスティック回帰の(超)概要

ロジスティック回帰の詳細は専門の書籍なり Web を見てもらうしかありませんが、端折りに端折って説明するとこうなります。

\(x,y\) を \(w_1x+w_2y+bias\) と線形変換し、その値をシグモイド関数

\(\small{P(x,y)=} \large\frac{1}{1+ \exp (-(w_1x+w_2y+bias))} \)

に代入します。得られた値 \(p\) は 0~1 の実数値をとりますが、この値を確率値とみなします。なんの確率かというと \(x,y\) がクラス 1である確率 です。

なぜ、この値が確率になるのか
もちろん、ただ計算するだけではまともな確率は求まりません。そもそも \(w_1, w_2, bias\) の値がどうなっているのか不明ですから、そんなよく判らない係数で計算しても、出てくる値はでたらめです。そこで、どうするかというと \(w_1, w_2, bias\) を調整してやります。確率をうまく計算できるように調整してやるわけです。

どのように調整するか
まず正解のデータを用意しておきます。正解とは、実際のクラス(0 または 1)のことです。実際のクラス(0 または 1)を事前に確認しておき、それを正解 \(t\) とします。

計算した確率 \(p\) (0~1)と 正解 \(t\) (0 または 1)が一致するかどうかは \(w_1, w_2, bias\) 次第です。\(p\) と \(t\) がなるべく多くののデータで一致するように、上手に \(w_1, w_2, bias\) を求めるのがロジスティック回帰です。

うまく調整するには数学的な手順が必要ですが Chainer や TensorFlow はその辺をすべてやってくれるので、自力でロジックを組む必要はありません。

Chainer で

Chainer では数式が表にでてきませんが、Linear クラスで線形変換 \(w_1x+w_2y+bias\) を行い、その出力を活性化関数 F.sigmoid に与えます。sigmoid の出力が上式の \(\small{P(x,y)}\) に相当し、その値を二乗平均誤差の関数 F.mean_squared_error に渡して損失を求めます。

color_circle

TensorFlow で

TensorFlow の場合、線形変換や損失の計算式を自前で定義します。損失は次の式で求めます。

\(loss=-\sum_{i=1}^n \Bigl[ t^{(i)} log ( P(x,y)) + (1-t^{(i)})log (1-P(x,y) ) \Bigr] \)

結果

同じデータを使って、3000回ループさせた結果です。上が Chainer、下が TensorFlow です。

color_circle
color_circle

なんか、TensorFlow のほうがいい感じになっています。

Chainer のループを増やしてみる

ループが 3000回だと Chainer の結果がイマイチだったので、ループ回数を増やしてみました。思いきって1万回まわした結果です。

color_circle

TensorFlow の結果とほぼ同じになりました。

おわり

TensorFlow のほうが良い結果になりましたが、あくまで単純なデータを単純なモデルでパラメータも特に指定せずに実行した結果です。

スポンサーリンク
その他の記事
  1. 2つのフレームワークを比較するなら、
    損失関数をどちらかに合わせたほうが良いのでは?
    平均二乗誤差にしてもクロスエントロピーにしても。

    • なるほど、そうですね。
      ご指摘ありがとうございます。m(_ _)m

      TensorFlow も平均二乗誤差にしてみました。
      (結果は同じでした)

diesel spare parts へ返信する コメントをキャンセル