#author("2017-11-25T11:29:45+09:00","default:takataka","takataka")
#author("2017-11-25T19:24:29+09:00","default:takataka","takataka")
* SJS2017 ex12 [#j771445d]

**はじめに [#j79fd70e]

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

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

***前回と今回 [#sf7ceaec]

[[SJS/2017/ex10]] のロジスティック回帰を,次の2段階で改良しよう
- [[SJS/2017/ex11]] 入力が2次元より大きい場合も扱えるようにする
- [[SJS/2017/ex12]]  出力を複数にして,クラス数が2より多い場合も扱えるようにする

**課題A [#vd0d36dc]

''クラス数を一般化しよう''

特徴ベクトルが与えられたときに,これを &mathjax{ K }; 通りのクラスのいずれかに識別したい.入力 &mathjax{ \bm{x} }; に対して &mathjax{ K }; 個の値 &mathjax{ z_1,z_2,\dots , z_K }; を出力するしくみを用意して,&mathjax{ z_k }; が,&mathjax{ \bm{x} };  が &mathjax{ k }; 番目のクラスに所属する確率の推定値となるように学習する識別器を考える.このとき,各 &mathjax{ z_k }; を2クラスの場合の式そのままで計算することにすると,&mathjax{ \sum_{k=1}^{K} z_k }; が 1 になる保証がないので,確率とみなして議論ができなくて都合が悪い.そこで,&mathjax{ z_k }; が 0 から 1 の値をとり,かつ &mathjax{ \sum_{k=1}^{K} z_k = 1}; となるように,次のようにする.
#mathjax( \begin{align} z_k &= \frac{\exp(y_k)}{\sum_{j=1}^{K}\exp(y_j)} \\ y_k &= w_{k,0} + \sum_{d=1}^{D} w_{k,d} x_d = w_{k,0} + \bm{w}_{k}^{\top} \bm{x}\end{align} )
#mathjax( \begin{align} z_k &= \frac{\exp(y_k)}{\sum_{j=1}^{K}\exp(y_j)} \\ y_k &=  \sum_{d=1}^{D} w_{k,d} x_d + b_{k} =  \bm{w}_{k}^{\top} \bm{x} + b_{k}\end{align} )
この一つ目の式の形を,softmax という(最大値に対して1を,ぞれ以外に0を割りふる関数を考えると,それを0から1の実数をとるように「柔らかく」したものと考えられるから).実は,&mathjax{K = 2}; の場合,&mathjax{z_1 + z_2 = 1}; という制約をふまえて式を整理すると,シグモイドが出てきますが,省略.

次に,多クラス問題に対応した交差エントロピーを考える.まずは,正解クラスを表す教師信号を
&mathjax{ \bm{t} = (t_1, t_2, \dots , t_K )^{\top} }; という &mathjax{ K }; 次元ベクトルとする.ただし,その要素は,いずれか一つだけが 1 で,他は全て 0 とする.例えば &mathjax{ K = 3 }; で &mathjax{ t_1 = t_3 = 0, t_2 = 1 }; なら,このデータは2番目のクラス所属,等.そして,&mathjax{h}; を次のように定義する.
#mathjax( h = - \sum_{k=1}^{K} t_k \log z_k )
これまた &mathjax{ K = 2 }; としたら前回の式と同じになってることが確認できます.というわけで,複数の学習データが与えられた場合,それぞれに対する &mathjax{h}; の和が交差エントロピー &mathjax{H}; になります.

がんばって微分して学習則を導出しよう.実は「おんなじ形になるやん」ってオチですが.
ヒント: 
#mathjax( \log z_k = y_k - \log \left( \sum_{j=1}^{K} \exp y_j \right) )
なので,
#mathjax( \begin{align} \frac{\partial h}{\partial w_{\ell,d}} &= - \frac{\partial}{\partial w_{\ell,d}}   \sum_{k=1}^{K} t_k y_k + \frac{\partial}{\partial w_{\ell,d}} \left( \sum_{k=1}^{K} t_k \log \left( \sum_{j=1}^{K} \exp y_j \right) \right) \\ &= - \frac{\partial}{\partial w_{\ell,d}}  \sum_{k=1}^{K} t_k y_k +  \frac{\partial}{\partial w_{\ell,d}}  \left(\log \left( \sum_{j=1}^{K} \exp y_j \right) \sum_{k=1}^{K} t_k \right) \end{align} )
ですね.ここで &mathjax{ \sum_{k=1}^{K} t_k }; は...だから右辺第2項はもう少し簡単になって....それから,
#mathjax( \frac{\partial y_k}{\partial w_{\ell,d}} = \left\{ \begin{array}{ll} x_d & \mbox{if}\quad k = \ell \\ 0 & \mbox{otherwise} \end{array} \right. )
ですね.

**課題B [#o23573b6]

''実験''

上記の結果を活かして,[[SJS/2017/ex11]]のプログラムの改良版を作ろう.これまではデータの一部を取り出して2クラス問題にしていたが,全部使って3クラス問題を解こう.

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