#author("2017-11-06T22:45:00+09:00","default:takataka","takataka")
#author("2017-11-06T22:45:17+09:00","default:takataka","takataka")

*SJS2017 ex09 [#f69bd8f1]

&color(red){''工事中''};
//&color(red){''工事中''};

#contents

**これまでの分 [#kbc5dcd1]

- 以前の分を全て報告してokをもらってから,今回分にすすみましょう.

**準備 [#a0ff08d5]

今回の課題では,gnuplot を使います.
[[以前の作業>https://www-tlab.math.ryukoku.ac.jp/tlab?adm/config/2017fall#MacPorts]] でインストール済みのはずですが,インストールをやり直す必要があるかもしれません.
takataka に相談してください.


**課題A [#b49024d4]

***シグモイドを gnuplot でぐりぐり [#h7decb37]

次のような関数 &mathjax{s(x)}; を考える.これはシグモイド関数と呼ばれるものの一つの形である.
#mathjax( s(x) = \frac{1}{1+\exp(-x)} )
gnuplot でこの関数のグラフを描いてみよう.参考: [[wiki:Docs/gnuplot]]
 $ gnuplot
 gnuplot> s(x) = 1.0/(1+exp(-x))
 gnuplot> plot s(x)
式の形とこの結果を元に,次の問に答えなさい.
+ s(0) の値はいくつ?
+ s(x) の値域はどんな?

次に,&mathjax{a, b, c}; を定数として,&mathjax{z = s(ax+by+c)}; とおいてみる.(x,y,z)の3次元空間にこの曲面を描いて眺めよう.マウスでで3次元グラフをぐりぐり回したりズームしたりできるはず.
 gnuplot> z(x, y, a, b, c) = s( a*x + b*y + c )
 gnuplot> splot z(x,y,1,0,2)
 gnuplot> splot z(x,y,1,0,-2)
 gnuplot> splot z(x,y,1,1,-2)
 gnuplot> splot z(x,y,1,-1,-2)
ぐりぐりできない場合は,デフォルトの描画環境が対応してないのかもしれない.
 gnuplot> set terminal qt     出力先を Qt に変更
 gnuplot> replot                    再描画.これでぐりぐりできるかも
上記でうまくいかない場合は,次を試してみよう
 gnuplot> set terminal x11    出力先を X11 に変更.
 gnuplot> replot                   再描画.これでぐりぐりできるかも

***びぶん [#yb9808a7]

&mathjax{ z = s(x) }; の導関数 &mathjax{ \frac{dz}{dx}  }; を求めよう.求めた式をながめていると,&mathjax{ z }; 自身を使うと簡潔に
#mathjax( \frac{dz}{dx} = z \times  \mbox{hoge}  )
という形に表すことができることに気づく.hoge の部分には,&mathjax{ z }; を使った式が入る.これを求めなさい.

***びぶんぶん [#obb17635]

&mathjax{ X = ax+by+c }; とおくと,高校で習った合成関数の微分を思い出すと,
#mathjax( \frac{\partial z}{\partial a} =  \frac{\partial}{\partial a} s(ax+by+c) = \frac{\partial s(X)}{\partial X}\frac{\partial X}{\partial a} )
である.これと↑の結果を用いて,&mathjax{ z }; の &mathjax{ a }; に関する微分, &mathjax{ b }; に関する微分,&mathjax{ c }; に関する微分をそれぞれ,&mathjax{ z,a,b,c,x,y };を用いた式で表しなさい.


***びぶんぶんぶん [#yaef32ca]

&mathjax{ t }; を定数として,
#mathjax( h = -t\log z - (1-t) \log (1-z) )
とおく.&mathjax{ \frac{\partial h}{\partial a} };,同 b, c を↑と同様に式で表しなさい.

***なんじゃこりゃ [#f221bc5b]

次の課題を待て

**課題B [#w2a0bda3]

以下を読んで理解しなさい.


***ロジスティック回帰と2クラス識別 [#b05bb4b8]

&mathjax{D};次元特徴ベクトルで与えられるデータを「ほげクラス」に属するものとそれ以外(「ほげじゃないもののクラス」)に分類する問題(すなわち2クラスの識別問題)を考える.以下では簡単のため,&mathjax{ D = 2 }; の場合に限定する.

ある2次元データを &mathjax{ \bm{x} = (x, y) }; とする.このとき,先の課題で登場した &mathjax{ z = s(ax+by+c) }; という式の値によって,データ &mathjax{ \bm{x} }; が「ほげクラス」に属する確率を推定することにしよう(このようなモデルをロジスティック回帰モデルという).パラメータ &mathjax{ a, b, c }; を調節するとこの推定確率が変化するので,クラス既知の学習データを用いてこれらのパラメータを学習させる.

学習データとして,&mathjax{N};個の特徴ベクトル &mathjax{ \bm{x}_1, \bm{x}_2, \dots , \bm{x}_{N} }; (&mathjax{\bm{x}_n = (x_n,y_n)};)と,それぞれの所属クラスを表す教師信号 &mathjax{ t_1, t_2, \dots , t_N }; ( &mathjax{\bm{x}_n}; が ほげクラスなら &mathjax{t_n = 1};,さもなくば &mathjax{t_n = 0}; )を用意する.この学習データに対して,&mathjax{z_n = s(ax_n+by_n+c)}; が正解 &mathjax{t_n}; に近づくようにパラメータ &mathjax{a,b,c}; を決定したい.そこで,&mathjax{z_n}; の正解との近さの規準として
#mathjax( h_n = -t_n\log z_n - (1-t_n)\log ( 1 - z_n) )
というものを考える.今の問題では &mathjax{t_n}; が 0 か 1 であるから,式の形から,&mathjax{t_n = 0}; ならば &mathjax{z_n}; が小さい(0に近い)ほど &mathjax{h_n}; が小さくなり,&mathjax{t_n = 1}; ならば逆に&mathjax{z_n}; が大きい(1に近い)ほど &mathjax{h_n}; が小さくなることがわかる.全ての学習データに対する &mathjax{h_n}; の和を &mathjax{H}; と表すことにする.つまり
#mathjax( H = \sum_{n=1}^{N} h_{n} )
である.この &mathjax{H}; を最小化するようにパラメータ &mathjax{a,b,c}; を決めれば,学習データをうまく2クラスに分類できるだろう.これが,ロジスティック回帰による2クラス識別の考え方である.なんでシグモイドかとかなんで &mathjax{H}; という式(これを交差エントロピーという)を考えるのかとかは省略.

***確率的勾配降下法による交差エントロピー最小化 [#z80ac0b5]

&mathjax{H}; を最小にするパラメータ &mathjax{a,b,c}; を求める問題は非線形最適化問題なので,一撃で解を求めることは一般に不可能である.このような最適化問題の解法はたくさんあるが,今の場合は目的関数(最小化したい関数)が微分できるので,目的関数の微分すなわち勾配を利用する「勾配法」がよく用いられる.これは,パラメータを適当な初期値に設定した状態からスタートして,&mathjax{H};  の微係数の値を調べながら,&mathjax{H};  が小さくなる方向に徐々にパラメータを変化させていく方法である.

いまの学習の目的は &mathjax{H}; の最小化だから,本来は上記のように &mathjax{H};  の勾配を調べてパラメータを修正するべきだが,そのような方法には多少問題がある(ここでは詳しく述べないが,学習の進め方の微調整が必要とか,コンピュータによる計算の効率がよくないとか).実際には,&mathjax{H};  の勾配を調べてパラメータを修正するかわりに,&mathjax{h_n}; の勾配を用いて個々の学習データごとにパラメータを修正することを繰り返すことで,確率的に &mathjax{H};  が最小化されることを期待する,というアプローチをとることがある.このような方法を,確率的勾配降下法(Stochastic Gradient Desecent, SGD)という. 

&mathjax{h_n}; のパラメータ &mathjax{\theta}; に対する偏微係数 &mathjax{ \frac{\partial h_n}{\partial \theta}};(&mathjax{\theta}; は &mathjax{a,b,c};を表す)は,先の課題で得た式で計算できる.このとき,SGDによる学習の手順は次のようになる.

+ パラメータを適当な乱数で初期化する
+ 以下を適当な回数繰り返す
++ &mathjax{N}; 個の学習データの中から一つをランダムに選択する(その番号を &mathjax{n}; とする)
++ &mathjax{(x_n,y_n)}; に対するモデルの出力 &mathjax{z_n = s(ax_n + by_n + c)}; を計算する
++ &mathjax{h_n}; を計算する
++ パラメータ &mathjax{\theta}; の値を次式で更新する
#mathjax( \theta^{\rm new} = \theta -\eta \frac{\partial h_n}{\partial \theta}  )
&mathjax{ \eta }; は小さな正の定数である.

&mathjax{ \frac{\partial h_n}{\partial \theta} }; は現在のパラメータ値の地点における &mathjax{h_n}; の傾きであるから,このようにすると,&mathjax{h_n}; が少し小さくなる(下る)方向にパラメータを修正することになる.このような計算を何度も繰り返すと,やがて学習データ全体の交差エントロピーを小さくするようなパラメータにたどりつく( &mathjax{H}; を最小にするパラメータにたどり着く保証はないけれども,準最適なパラメータを見つけることができる)だろう.これが,(ロジスティック回帰モデルの)SGDによる学習の手順である.

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS