こんにちは､ ディープラーニングの講座にようこそ｡
今日は確率的勾配降下法についてお話します｡
前回､ 勾配降下法について学び､ コスト関数を最小化する最適化問題を解くのに非常に効率的な方法であることがわかりました｡
基本的に10年～57年の力を､ 数分～数時間､ あるいは1日程度で問題解決に導くものです｡
そして､ どちらの方向が下り坂なのかがわかるので､ その方向に進んでステップを踏めば､ より早く最低限に到達できるため､
スピードアップにとても役立っています｡
しかし､ 勾配降下法にこだわるのは､ この方法ではコスト関数が凸であることが必要だからです｡
そして､ ここにあるように､ 特に凸のコスト関数を選びました｡
基本的に凸とは､ 関数が今見ているものと似ていて､ 一方向に凸で､ 本質的に1つのグローバルミニマムを持ち､
それがこれから見つけるものであることを意味します｡
しかし､ 関数が凸でない場合はどうでしょうか？
コスト関数が凸でない場合はどうすればよいのでしょうか？
こんな感じだったらどうでしょう？
まず､ どうしてそうなったのか？
というのも､ まず､ y hatとyの差の2乗ではないコスト関数を選んだり､ そのようなコスト関数を選んだとしても､
多次元空間では､ 実際には凸でないものに変わってしまうことがあるからです｡
では､ この場合､ 通常の勾配降下法を適用しようとするとどうなるのでしょうか？
こんなことが起こるかもしれない｡
コスト関数の大域的な最小値ではなく､ 局所的な最小値を求めることができた｡
だから､ これが一番良かったのに､ 間違ったものを見つけてしまったんです｡
そのため､ 正しいウェイトを持っていないのです｡
最適化されたニューラルネットワークではなく､ 劣悪なニューラルネットワークが存在するのです｡
それで､ この場合はどうすればいいのでしょうか？
その答えが､ 確率的勾配降下法なのです｡
そして､ 確率的勾配降下法では､ コスト関数が凸である必要はないことがわかったのです｡
では､ これまでお話しした通常の勾配降下法と確率的勾配法の2つの違いについて見てみましょう｡
つまり､ 通常の勾配降下法とは､ すべての行をニューラルネットワークに差し込むことです｡
ここでもニューラルネットワークが何度もコピーされていますが､ 行は毎回同じニューラルネットワークにプラグインされています｡
だからニューラルネットワークは1つしかないんです｡
これはあくまで視覚化のためのものです｡
そして､ それらをプラグインした後､ 右側の数式と下側のチャートに基づいてコスト関数を計算し､
ウェイトを調整します｡
これを勾配降下法といいますが､ 正式には一括勾配降下法というそうです｡
そこで､ サンプルから全バッチを取り出し､ それを適用し､ 実行するのです｡
ここで､ 確率的勾配降下法とは少し違う｡
行を1つずつ取り出して､ この行を取り出し､ ニューラルネットワークを走らせて､ 重みを調整するのです｡
次に2行目に移り､ ニューラルネットワークを走らせ､ コスト関数を見て､
またウェイトを調整します｡
そして､ もう一列､ 3列目を取ります｡
ニューラルネットワークを走らせる｡
コスト関数を見てみる｡
私たちは､ ただの重りです｡
つまり､ 基本的には､ すべてを一緒にやってから異なるアプローチにウェイトを調整するのではなく､ 1行ごとにウェイトを調整することを検討しているのです｡
そして今度は､ この2つを並べて比較してみるだけです｡
そこで､ ここに紹介します｡
こうして視覚的に記憶することができるのです｡
つまり､ バッチ式の勾配降下法では､ ニューラルネットワークのすべての行を実行した後で､
重みを調整することになるわけです｡
そして､ 基本的には重みを調整し､ 全体をもう一度､ 反復､ 反復､ 反復して実行するのです｡
確率的勾配降下法では､ 1行ずつ実行して､ 重みの調整､ 重みの調整､ 重みの調整､
そしてすべてを何度も繰り返すのです｡
そして､ それがこのカテゴリーと呼ばれるものです｡
この方式では
主な2つの違いは､ 確率的勾配降下法では､ 全体的なグローバルミニマムではなく､ それらのローカルな極値やローカルミニマムを見つけるという問題を回避することができる点です｡
その理由を簡単に言うと､ SGDや確率的勾配降下法では変動に余裕があるため､ 変動が大きくなってしまうからです｡
一度に1回､ 1行ずつ行うので､ 変動が大きく､ ローカルミニマムではなく､
グローバルミニマムを見つける可能性が高くなります｡
そしてもうひとつ､ バッチ勾配と比較して確率的勾配降下法は高速であることです｡
第一印象は､ いちいちやっているから､ みたいな｡
一人ずつ
遅くはなりますが､ 実際には､ すべてのデータをメモリにロードして実行し､ それらがすべて一度に回ってくるまで待つ必要がないため､
より高速に動作します｡
1つ1つ実行すればいいのです｡
だから､ もっと軽いアルゴリズムなんです｡
そういう意味では､ より高速になりましたね｡
そのため､ バッチ式の勾配降下法よりもはるかに多くの利点があり､ そういう意味でも優れています｡
バッチ型勾配降下法の主な利点は､ 確率的勾配降下法ではなく､
決定論的アルゴリズム､ つまりランダムであることです｡
ニューラルネットワークの開始重みが同じであれば､ バッチ型勾配降下法を実行しても､ 毎回同じ繰り返し､ 同じ結果になります｡
まず､ 確率的勾配降下法について｡
確率論的な手法なので､ それはないでしょう｡
行をランダムに選び､ ニューラルネットワークを確率的に更新しているのです｡
したがって､ 確率的勾配降下法を実行するたびに､ たとえスタート時の重みが同じでも､
そこに到達するまでのプロセスや反復回数が異なるだけなのです｡
これが確率的勾配降下法というものです｡
また､ この2つの中間的な手法として､ ミニバッチ勾配降下法というものがあります｡
これは､ バッチ全体を実行したり､ 1行ずつ実行したりするのではなく､ 5～10行､ 100個のミネラルをまとめて実行します｡
設定することを決定し､ その行数を時間として実行するのです｡
そして､ ウェイトを更新して､ ウェイトを更新して......といった具合です｡
そして､ それをミニバッチ勾配降下法と呼んでいます｡
グラデーションデッセントについてもっと知りたい方は､ こちらの記事をご覧ください｡
Andrew TraskのA Neural Network and 13 Lines of Python Part two Gradient Descentという本で､ 以下のリンクがあります｡
GitHub 2015の記事で､ 非常にわかりやすく書かれています｡
勾配降下の適用方法､ メリットとデメリット､ ある状況でのやり方など､
哲学的というか､ 興味深い考え方が書かれていますね｡
彼は､ とてもクールなヒントやトリック､ ハックを､ とても簡単に紹介しています｡
だから､ ぜひチェックしてみてください｡
そしてもう1つ､ もう少し重い読み物｡
数学の真髄に迫りたい数学者の皆さん､ なぜ勾配降下法がそこまで特殊なのか？
グラデーションを動かしている計算式は何なのか､ どのように計算されているのか､ など｡
記事か実際に本をチェックしてみてください｡
マイケル・ニールセンのNeural Networks and Deep Learning 2015本というオンライン無料本です｡
ただ､ 基本的にはすべてオンラインなんです｡
先にそちらでご確認ください｡
そして､ そこでもまた､ 非常にソフトな数学の紹介がなされています｡
しかし､ その後､ 数学のために｡
でも､ 記事を読み進めていくと､ 数学は結構重いんですよ｡
でも同時に､ その気にさせる｡
まず算数でウォーミングアップをしてから､ それらに飛び込んでいくウォームアップ編のようなものがあると思います｡
数学に興味があるのなら､ この記事を見て､ 行ってみよう｡
つまり､ グランドディセントとストキャスティックスグラディエントディセントの違いとその仕組みは､ 簡単に言えばこういうことです｡
ということで､ 本日のチュートリアルを終了します｡
次回作でお会いできるのを楽しみにしています｡
そして､ それまではディープラーニングを楽しんでください｡