Pythonで動かして学ぶ!あたらしい線形代数の教科書
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
分類問題
- 本シリーズは分類問題を扱っていく予定。
- 機械学習のカテゴリわけを簡単に説明。
- 分類問題について簡単に説明。
- 分類手法について列挙。
- この中のパーセプトロンをベースに話を進める。
形式ニューロン
- 形式ニューロンを把握するためのロードマップを提示。
- ヘヴィサイド関数、形式ニューロン、誤差関数、決定境界直線、総当たり法について解説。
- 実際のプログラムのフローを記載。
MATLAB
- 形式ニューロンをMATLABで実現。
- ANDの真理値表と同じ結果が得らえれた。
- しかし、決定境界線はギリギリな感じ。
Python
- 形式ニューロンをPython(NumPy)で実現。
- ANDの真理値表と同じ結果が得らえれた。
- そして、決定境界線はギリギリな感じはMATLABのときと一緒。
Scilab
- 形式ニューロンをScilabで実現。
- ANDの真理値表と同じ結果が得らえれた。
- そして、決定境界線はギリギリな感じはMATLABのときと一緒。
Julia
- 形式ニューロンをJuliaで実現。
- ANDの真理値表と同じ結果が得らえれた。
- コードレベルでMATLABと近似。
決定境界直線の安定化
- 形式ニューロンのプログラムでは決定境界直線がギリギリのラインに来ていたで、どうあるべきか。について説明。
- 決定境界直線をいい感じのところに持っていくにはヘヴィサイド関数を差し替える必要がある。
- ヘヴィサイド関数の原点近辺に傾斜を付けたカスタムヘヴィサイド関数(造語)が良さげ。
MATLAB
- 形式ニューロンの活性化関数をカスタムヘヴィサイド(造語)関数にしたものをMATLABで作成。
- 狙い通りの位置に決定境界直線が移動。
- コードはヘヴィサイド関数をカスタムヘヴィサイド関数に変えただけ。
Python
- 形式ニューロンの活性化関数をカスタムヘヴィサイド(造語)関数にしたものをPython(NumPy)で作成。
- おおよそMATLABと同じ結果に。
- 毎度おなじみの表示上の誤差は出る。
Scilab
- 形式ニューロンの活性化関数をカスタムヘヴィサイド(造語)関数にしたものをScilabで作成。
- おおよそMATLABと同じコード。
- 毎度おなじみのグラフ表示部分に差が出る。
Julia
- 形式ニューロンの活性化関数をカスタムヘヴィサイド(造語)関数にしたものをJuliaで作成。
- 例に漏れずMATLABコードのコピペがベース。
シグモイドによる決定境界安定化
- 決定境界直線の一般的な安定化方法がある。
- シグモイド関数を使用する方法。
- シグモイド関数の定義について説明。
- カスタムヘヴィサイドとシグモイドの比較。
- 総当たり法では効能の差は出ないが、誤差逆伝播法を使い始めるとシグモイドじゃないと都合が悪い。
MATLAB
- 活性化関数をシグモイド関数にした形式ニューロンをMATLABで実現。
- 結果はカスタムヘヴィサイドの時と一緒。
Python
- 活性化関数をシグモイド関数にした形式ニューロンをPython(NumPy)で実現。
- 結果はカスタムヘヴィサイドの時と一緒。
Scilab
- 活性化関数をシグモイド関数にした形式ニューロンをScilabで実現。
- 結果はカスタムヘヴィサイドの時と一緒。
Julia
- 活性化関数をシグモイド関数にした形式ニューロンをJuliaで実現。
- 結果はカスタムヘヴィサイドの時と一緒。
連鎖律の前準備
- 最適化アルゴリズムを使用するには連鎖律が必要。
- 連鎖律を把握するための知識を列挙。
- まずは逆数の微分公式。
- 積の微分公式を導出。
- 商の微分方式の話。
- 逆数の微分公式と積の微分公式の合わせ技で導出。
- いままでの公式達を再掲。
- 商の微分公式を使ってシグモイド関数の導関数を求めた。
- シグモイド関数、シグモイド関数の導関数の再掲と、シグモイド関数のオイラー法による微分の数式を確認する予定。
MATLAB
- シグモイド関数、シグモイド関数の導関数、シグモイド関数のオイラー法での微分をMATLABで算出。
- グラフで比較し、導出した導関数は正しいと言える結果となった。
Python
- シグモイド関数、シグモイド関数の導関数、シグモイド関数のオイラー法での微分をPythonで算出。
- グラフで比較し、導出した導関数は正しいと言える結果となった。
Scilab
- シグモイド関数、シグモイド関数の導関数、シグモイド関数のオイラー法での微分をScilabで算出。
- グラフで比較し、導出した導関数は正しいと言える結果となった。
Julia
- シグモイド関数、シグモイド関数の導関数、シグモイド関数のオイラー法での微分をJuliaで算出。
- グラフで比較し、導出した導関数は正しいと言える結果となった。
多変量関数の連鎖律
- 多変数関数の連鎖律に突入したが、これを理解するのに必要な知識があるため、それらを列挙。
- 合成関数について説明。
- 合計関数の微分(連鎖律)について説明。
- 合成関数の微分(連鎖律)の証明を実施。
- 多変数関数の連鎖律について説明。
- ニューラルネットワークを想定した場合の多変量関数の連鎖律について説明。
- ニューラルネットワークの学習を想定した場合、暗黙的に追加される関数として入力群がある。
勾配降下法
- 勾配降下法に概念レベルの説明。
- 勾配降下法をプログラム的に確認する方法としてニューラルネットワークではなく、任意の関数に試す方法がある。
- 勾配降下法プログラムのフローで分かりにくいところを説明。
MATLAB
- 勾配降下法の実験をMATLABで実施。
- 予想通り局所最適解に陥った。
- 局所最適解の回避方法としては学習率を状況に応じて変更する様々は最適化アルゴリズムがある。
- モーメンタム、AdaGrad、Adamなどなど。
Python
- 勾配降下法の実験をPythonで実施。
- 予想通り局所最適解に陥った。
- 局所最適解の回避方法としては学習率を状況に応じて変更する様々は最適化アルゴリズムがある。
- モーメンタム、AdaGrad、Adamなどなど。
Scilab
- 勾配降下法の実験をScilabで実施。
- 予想通り局所最適解に陥った。
- 局所最適解の回避方法としては学習率を状況に応じて変更する様々は最適化アルゴリズムがある。
- モーメンタム、AdaGrad、Adamなどなど。
Julia
- 勾配降下法の実験をScilabで実施。
- 予想通り局所最適解に陥った。
- 局所最適解の回避方法としては学習率を状況に応じて変更する様々は最適化アルゴリズムがある。
- モーメンタム、AdaGrad、Adamなどなど。
逆伝播
- 誤差逆伝播法とか単純パーセプトロンに関連する用語を確認。
- 逆伝播を行う単純パーセプトロンの構成を確認。
- 一連の合成関数について書き出し。
- 合成関数を構成する各数式を書き出し。
- 合成関数の微分こと連鎖律について説明。
- 学習データを加味した場合の多変量関数の連鎖律について簡単に説明。
- 連鎖律に於ける誤差関数の位置づけと偏導関数を確認。
- 活性関数(シグモイド関数)のブロック図と連鎖律上の位置づけと偏導関数を確認。
- 入力層のブロック図と連鎖律上の位置づけと偏導関数を確認。
- バイアスのブロック図と連鎖律上の位置づけと偏導関数を確認。
- 全体の位置づけと各偏導関数を確認。
- 入力、出力(ラベル)が複数であるが故に連鎖律のルートが複数になる。
- 入力、出力が複数であるが故の連鎖律の事情のもう一つの考え方。
- 逆伝播の確認用プログラムのフローを記載。
MATLAB
- 逆伝播を行った際の重みの動き方を確認するプログラムをMATLABで作成。
- おおよそ狙ったところに収束。
Python
- 逆伝播を行った際の重みの動き方を確認するプログラムをPythonで作成。
- おおよそ狙ったところに収束。
Scilab
- 逆伝播を行った際の重みの動き方を確認するプログラムをScilabで作成。
- おおよそ狙ったところに収束。
Julia
- 逆伝播を行った際の重みの動き方を確認するプログラムをJuiaで作成。
- おおよそ狙ったところに収束。
単純パーセプトロンで分類
- 単純パーセプトロンの構造について復習。
- 逆伝播の復習。
- 重みとバイアスの連鎖律の最適化。
- 単純パーセプトロンで分類のプログラムのフローを確認。
- 学習が進むと決定境界線がどのように動くか確認。
MATLAB
- 単純パーセプトロンの分類をMATLABで実施。
- 想定通り分類可能。
- おおよそ200エポックあれば分類可能。
Python
- 単純パーセプトロンの分類をPythonで実施。
- 想定通り分類可能。
- おおよそ200エポックあれば分類可能。
Scilab
- 単純パーセプトロンの分類をScilabで実施。
- 想定通り分類可能。
- おおよそ200エポックあれば分類可能。
Julia
- 単純パーセプトロンの分類をJuliaで実施。
- 想定通り分類可能。
- おおよそ200エポックあれば分類可能。
非線形分類
- 単純パーセプトロンでは分類できないものがある。
- 決定境界直線を求めるというより決定領域を特定するというイメージになる。
- 非線形分類するにはパーセプトロンを複数使う。
- 単純パーセプトロン、多層パーセプトロンの構造と数式を説明。
誤差逆伝播法
- 多層パーセプトロンの重みを決定するための誤差逆伝播法が必要。
- 誤差逆伝播法の全体像を確認。
- 出力層の連鎖律と各偏導関数を導出。
- 隠れ層から誤差関数までの連鎖律を導出。
【入門】誤差逆伝播法①【数値計算】
多層パーセプトロンの重みを決定するための誤差逆伝播法が必要。
誤差逆伝播法の全体像を確認。
出力層の連鎖律と各偏導関数を導出。
隠れ層から誤差関数までの連鎖律を導出。
- 連鎖律の「プログラミングするための最適化」は連鎖律上の共通部分の特定が重要。
- 連鎖律の共通部分の算出。
- 共通変数で実際の処理に相当する数式を書き出し。
MATLAB
- 多層パーセプトロンによる分類をMATLABで実施。
- 一応ちゃんと分類できた。
Python
- 多層パーセプトロンによる分類をPythonで実施。
- 一応ちゃんと分類できた。
Scilab
- 多層パーセプトロンによる分類をScilabで実施。
- 一応ちゃんと分類できた。
- 等高線による分類表記がうまく行かなかったため、境界線をplotしている。
Julia
- 多層パーセプトロンによる分類をJuliaで実施。
- 一応ちゃんと分類できた。
非線形分類の問題点
- 非線形分類をしたが実は問題が発生している。
- 非線形分類が失敗する原因を特定するため決定境界線と誤差関数の推移をモニタ。
- 案の定、局所最適解にハマってる。
- つまりエポック数を増やしても対策にはならない。
- 隠れ層のユニット数を増やす、最適化アルゴリズムを使用するのが対策案。
ユニット数増加
- 多層パーセプトロンの隠れ層のユニット数を増やす。
- 表現力が上がるはず。
- 局所最適解にハマらないというより大域最適解に近い局所最適解が増えるというイメージ。
- プログラム上の修正点確認。
- ベクトル、行列演算ができるため修正範囲は極小。
MATLAB
- 多層パーセプトロンの隠れ層のユニット数を2から4に変えたMATLABコードで分類を実施。
- 大きく2パターンの分類パターン
- やや複雑な分類パターンが4ユニットにすることで出てきたもの。
Python
- 多層パーセプトロンの隠れ層のユニット数を2から4に変えたPythonコードで分類を実施。
- 大きく2パターンの分類パターン。
- やや複雑な分類パターンが4ユニットにすることで出てきたもの。
Scilab
- 多層パーセプトロンの隠れ層のユニット数を2から4に変えたScilabコードで分類を実施。
- 大きく2パターンの分類パターンがある。
- やや複雑な分類パターンが4ユニットにすることで出てきたもの。
Julia
- 多層パーセプトロンの隠れ層のユニット数を2から4に変えたJuliaコードで分類を実施。
- 大きく2パターンの分類パターンがある。
- やや複雑な分類パターンが4ユニットにすることで出てきたもの。
モーメンタム
- 最適化アルゴリズムを取り扱う。
- 今回のネットワークだとさほど恩恵はないが知っていて損はない。
- まずはモーメンタムから解説&実験をしていく。
- 最初は復習を兼ねて勾配降下法についても確認する。
- 勾配降下法の更新式を確認。
- 勾配降下法の動作イメージを確認。
- 学習率が大きい場合と小さい場合で挙動が変わる。
- ちょうど良い学習率を人間の手で探す。
- これにより、一般的なパラメータとは異なるハイパーパラメータというカテゴリになる。
- モーメンタムの更新式について確認。
- 指数移動平均を利用して直近の値を重視する。
- モーメンタムの動作イメージについて確認。
- 最初は大きく更新して、最適解が近いと小さく更新。
- 勾配降下法で言うところの学習率が可変と同義な動きになる。
- モーメンタムを確認するプログラムの方針を確認。
- 以前の勾配降下法のプログラムをベースにする。
- 隠れ層のユニット数は4。
- プログラムのフローを確認。
- モーメンタム項とパラメータ更新が基本的な差分となる。
MATLAB
- 最適化アルゴリズム モーメンタムを用いて分類の学習をMATLABで実現。
- 問題無く動作。
- 学習の収束が通常の勾配降下法よりも比較的早い。
Python
- 最適化アルゴリズム モーメンタムを用いて分類の学習をPythonで実現。
- 問題無く動作。
- 学習の収束が通常の勾配降下法よりも比較的早い。
Scilab
- 最適化アルゴリズム モーメンタムを用いて分類の学習をScilabで実現。
- 問題無く動作。
- 学習の収束が通常の勾配降下法よりも比較的早い。
Julia
- 最適化アルゴリズム モーメンタムを用いて分類の学習をJuliaで実現。
- 問題無く動作。
- 学習の収束が通常の勾配降下法よりも比較的早い。
モーメンタム(勾配降下法との差分)
- 最適化アルゴリズムを通常の勾配降下法からモーメンタムに変えた際の差分を確認。
- モーメンタムの方が学習の収束が早い。
- 勾配降下法で500エポックのところ100エポック。
- モーメンタムの場合、初期のパラメータ移動が大き目。
- これにより、大域最適化を見つける可能性が高くなる。
- モーメンタムの方が学習の収束が早い。
最適化アルゴリズム
- もう一個試す予定の最適化アルゴリズムAdamへ至る系譜を説明予定。
- AdaGradについて説明。
- 更新式をモーメンタムと比較。
- RMSpropについて説明。
- AdaGradの完了版であるため、AdaGradと更新式を比較。
- AdaDeltaについて説明。
- RMSpropの拡張版に当たる。
- 最適化アルゴリズムAdamについて説明。
- モーメンタムとRMSpropの合わせ技。
- 1次の勾配と、2次の勾配の指数移動平均を使用する。
- 各最適化アルゴリズムの依存関係を記載。
- 1次の勾配で勢いをつけて、2次の勾配で抑制するというのが全体を通しての共通点。
- Adamの更新式を実現するためのプログラムフローを記載。
- 学習率は0.001とかなり小さめの値に設定。
- これにより収束は遅くなる。
- かわりに特殊な最適解が得られるのでそれを確認する。
MATLAB
- ニューラルネットワークの最適化アルゴリズムAdamをMATLABにて確認。
- 学習率を0.001にしている都合、収束までは時間がかかる。
- 勾配降下法、モーメンタムでは見れなかった分類パターンが拾えた。
Python
- ニューラルネットワークの最適化アルゴリズムAdamをPythonにて確認。
- 学習率を0.001にしている都合、収束までは時間がかかる。
- 勾配降下法、モーメンタムでは見れなかった分類パターンが拾えた。
Scilab
- ニューラルネットワークの最適化アルゴリズムAdamをScilabにて確認。
- 学習率を0.001にしている都合、収束までは時間がかかる。
- 勾配降下法、モーメンタムでは見れなかった分類パターンが拾えた。
Julia
- ニューラルネットワークの最適化アルゴリズムAdamをJuliaにて確認。
- 学習率を0.001にしている都合、収束までは時間がかかる。
- 勾配降下法、モーメンタムでは見れなかった分類パターンが拾えた。
最適化アルゴリズム(Adamでの分類結果)
- Adamだけで出てくる分類結果を確認。
- 四角形で分類する理想的な形状。
- この分類結果になる場合は、誤差関数の値が一気に跳ね上がる時。
- これにより大域最適解を引き当てやすくなる。
次のページへ
次のページからフーリエ解析学関連。
コメント