WEBVTT

00:00.960 --> 00:03.270
こんにちは､ ディープラーニングの講座にようこそ｡ 

00:03.270 --> 00:06.540
今日は確率的勾配降下法についてお話します｡ 

00:07.020 --> 00:19.410
前回､ 勾配降下法について学び､ コスト関数を最小化する最適化問題を解くのに非常に効率的な方法であることがわかりました｡

00:19.410 --> 00:30.840
基本的に10年～57年の力を､ 数分～数時間､ あるいは1日程度で問題解決に導くものです｡

00:30.840 --> 00:37.440
そして､ どちらの方向が下り坂なのかがわかるので､ その方向に進んでステップを踏めば､ より早く最低限に到達できるため､

00:37.440 --> 00:41.340
スピードアップにとても役立っています｡

00:41.340 --> 00:50.940
しかし､ 勾配降下法にこだわるのは､ この方法ではコスト関数が凸であることが必要だからです｡

00:50.940 --> 00:55.200
そして､ ここにあるように､ 特に凸のコスト関数を選びました｡ 

00:55.200 --> 01:03.180
基本的に凸とは､ 関数が今見ているものと似ていて､ 一方向に凸で､ 本質的に1つのグローバルミニマムを持ち､

01:03.180 --> 01:11.010
それがこれから見つけるものであることを意味します｡

01:11.430 --> 01:13.980
しかし､ 関数が凸でない場合はどうでしょうか？

01:13.980 --> 01:15.900
コスト関数が凸でない場合はどうすればよいのでしょうか？

01:16.290 --> 01:17.730
こんな感じだったらどうでしょう？

01:17.730 --> 01:19.590
まず､ どうしてそうなったのか？

01:19.590 --> 01:27.390
というのも､ まず､ y hatとyの差の2乗ではないコスト関数を選んだり､ そのようなコスト関数を選んだとしても､

01:27.390 --> 01:39.060
多次元空間では､ 実際には凸でないものに変わってしまうことがあるからです｡

01:39.570 --> 01:44.670
では､ この場合､ 通常の勾配降下法を適用しようとするとどうなるのでしょうか？

01:44.970 --> 01:46.290
こんなことが起こるかもしれない｡ 

01:46.290 --> 01:51.150
コスト関数の大域的な最小値ではなく､ 局所的な最小値を求めることができた｡ 

01:51.150 --> 01:54.540
だから､ これが一番良かったのに､ 間違ったものを見つけてしまったんです｡ 

01:54.540 --> 01:57.660
そのため､ 正しいウェイトを持っていないのです｡ 

01:57.660 --> 02:02.310
最適化されたニューラルネットワークではなく､ 劣悪なニューラルネットワークが存在するのです｡ 

02:02.310 --> 02:04.410
それで､ この場合はどうすればいいのでしょうか？

02:04.410 --> 02:09.930
その答えが､ 確率的勾配降下法なのです｡ 

02:09.930 --> 02:15.120
そして､ 確率的勾配降下法では､ コスト関数が凸である必要はないことがわかったのです｡ 

02:15.120 --> 02:21.150
では､ これまでお話しした通常の勾配降下法と確率的勾配法の2つの違いについて見てみましょう｡

02:21.540 --> 02:27.540
つまり､ 通常の勾配降下法とは､ すべての行をニューラルネットワークに差し込むことです｡ 

02:27.540 --> 02:35.820
ここでもニューラルネットワークが何度もコピーされていますが､ 行は毎回同じニューラルネットワークにプラグインされています｡

02:35.820 --> 02:37.140
だからニューラルネットワークは1つしかないんです｡ 

02:37.140 --> 02:39.030
これはあくまで視覚化のためのものです｡ 

02:39.030 --> 02:42.990
そして､ それらをプラグインした後､ 右側の数式と下側のチャートに基づいてコスト関数を計算し､

02:42.990 --> 02:47.130
ウェイトを調整します｡

02:47.250 --> 02:54.390
これを勾配降下法といいますが､ 正式には一括勾配降下法というそうです｡

02:54.390 --> 03:00.330
そこで､ サンプルから全バッチを取り出し､ それを適用し､ 実行するのです｡ 

03:00.840 --> 03:04.170
ここで､ 確率的勾配降下法とは少し違う｡ 

03:04.170 --> 03:11.460
行を1つずつ取り出して､ この行を取り出し､ ニューラルネットワークを走らせて､ 重みを調整するのです｡

03:11.760 --> 03:17.040
次に2行目に移り､ ニューラルネットワークを走らせ､ コスト関数を見て､

03:17.040 --> 03:19.710
またウェイトを調整します｡

03:19.980 --> 03:22.170
そして､ もう一列､ 3列目を取ります｡ 

03:22.560 --> 03:23.670
ニューラルネットワークを走らせる｡ 

03:23.670 --> 03:24.660
コスト関数を見てみる｡ 

03:24.660 --> 03:25.350
私たちは､ ただの重りです｡ 

03:25.350 --> 03:35.970
つまり､ 基本的には､ すべてを一緒にやってから異なるアプローチにウェイトを調整するのではなく､ 1行ごとにウェイトを調整することを検討しているのです｡

03:35.970 --> 03:39.630
そして今度は､ この2つを並べて比較してみるだけです｡ 

03:39.630 --> 03:40.530
そこで､ ここに紹介します｡ 

03:40.560 --> 03:42.660
こうして視覚的に記憶することができるのです｡ 

03:42.660 --> 03:49.020
つまり､ バッチ式の勾配降下法では､ ニューラルネットワークのすべての行を実行した後で､

03:49.020 --> 03:52.290
重みを調整することになるわけです｡

03:52.800 --> 03:57.360
そして､ 基本的には重みを調整し､ 全体をもう一度､ 反復､ 反復､ 反復して実行するのです｡

03:57.360 --> 04:03.840
確率的勾配降下法では､ 1行ずつ実行して､ 重みの調整､ 重みの調整､ 重みの調整､

04:03.840 --> 04:07.500
そしてすべてを何度も繰り返すのです｡

04:07.500 --> 04:09.990
そして､ それがこのカテゴリーと呼ばれるものです｡ 

04:09.990 --> 04:10.770
この方式では

04:10.980 --> 04:28.410
主な2つの違いは､ 確率的勾配降下法では､ 全体的なグローバルミニマムではなく､ それらのローカルな極値やローカルミニマムを見つけるという問題を回避することができる点です｡

04:28.800 --> 04:38.160
その理由を簡単に言うと､ SGDや確率的勾配降下法では変動に余裕があるため､ 変動が大きくなってしまうからです｡

04:38.160 --> 04:43.620
一度に1回､ 1行ずつ行うので､ 変動が大きく､ ローカルミニマムではなく､

04:43.620 --> 04:49.320
グローバルミニマムを見つける可能性が高くなります｡

04:49.320 --> 04:56.430
そしてもうひとつ､ バッチ勾配と比較して確率的勾配降下法は高速であることです｡

04:56.430 --> 04:59.700
第一印象は､ いちいちやっているから､ みたいな｡ 

04:59.960 --> 05:00.740
一人ずつ

05:00.740 --> 05:07.280
遅くはなりますが､ 実際には､ すべてのデータをメモリにロードして実行し､ それらがすべて一度に回ってくるまで待つ必要がないため､

05:07.760 --> 05:12.530
より高速に動作します｡

05:12.530 --> 05:14.150
1つ1つ実行すればいいのです｡ 

05:14.150 --> 05:15.470
だから､ もっと軽いアルゴリズムなんです｡ 

05:15.470 --> 05:16.730
そういう意味では､ より高速になりましたね｡ 

05:16.730 --> 05:25.190
そのため､ バッチ式の勾配降下法よりもはるかに多くの利点があり､ そういう意味でも優れています｡

05:25.190 --> 05:31.040
バッチ型勾配降下法の主な利点は､ 確率的勾配降下法ではなく､

05:31.040 --> 05:36.890
決定論的アルゴリズム､ つまりランダムであることです｡

05:36.890 --> 05:55.580
ニューラルネットワークの開始重みが同じであれば､ バッチ型勾配降下法を実行しても､ 毎回同じ繰り返し､ 同じ結果になります｡

05:55.790 --> 05:58.220
まず､ 確率的勾配降下法について｡ 

05:58.220 --> 06:01.100
確率論的な手法なので､ それはないでしょう｡ 

06:01.100 --> 06:07.880
行をランダムに選び､ ニューラルネットワークを確率的に更新しているのです｡

06:07.880 --> 06:12.950
したがって､ 確率的勾配降下法を実行するたびに､ たとえスタート時の重みが同じでも､

06:12.950 --> 06:20.480
そこに到達するまでのプロセスや反復回数が異なるだけなのです｡

06:20.480 --> 06:25.460
これが確率的勾配降下法というものです｡ 

06:25.970 --> 06:31.190
また､ この2つの中間的な手法として､ ミニバッチ勾配降下法というものがあります｡

06:31.190 --> 06:41.340
これは､ バッチ全体を実行したり､ 1行ずつ実行したりするのではなく､ 5～10行､ 100個のミネラルをまとめて実行します｡

06:41.390 --> 06:45.080
設定することを決定し､ その行数を時間として実行するのです｡ 

06:45.080 --> 06:47.630
そして､ ウェイトを更新して､ ウェイトを更新して......といった具合です｡ 

06:47.630 --> 06:50.300
そして､ それをミニバッチ勾配降下法と呼んでいます｡ 

06:50.330 --> 06:56.570
グラデーションデッセントについてもっと知りたい方は､ こちらの記事をご覧ください｡

06:56.570 --> 07:05.750
Andrew TraskのA Neural Network and 13 Lines of Python Part two Gradient Descentという本で､ 以下のリンクがあります｡

07:05.750 --> 07:12.500
GitHub 2015の記事で､ 非常にわかりやすく書かれています｡ 

07:12.770 --> 07:21.410
勾配降下の適用方法､ メリットとデメリット､ ある状況でのやり方など､

07:21.410 --> 07:28.070
哲学的というか､ 興味深い考え方が書かれていますね｡

07:28.070 --> 07:32.000
彼は､ とてもクールなヒントやトリック､ ハックを､ とても簡単に紹介しています｡ 

07:32.000 --> 07:33.500
だから､ ぜひチェックしてみてください｡ 

07:33.500 --> 07:36.900
そしてもう1つ､ もう少し重い読み物｡ 

07:36.920 --> 07:44.420
数学の真髄に迫りたい数学者の皆さん､ なぜ勾配降下法がそこまで特殊なのか？

07:45.230 --> 07:48.770
グラデーションを動かしている計算式は何なのか､ どのように計算されているのか､ など｡ 

07:49.130 --> 07:51.440
記事か実際に本をチェックしてみてください｡ 

07:51.530 --> 07:57.080
マイケル・ニールセンのNeural Networks and Deep Learning 2015本というオンライン無料本です｡ 

07:57.080 --> 07:59.510
ただ､ 基本的にはすべてオンラインなんです｡ 

07:59.510 --> 08:02.120
先にそちらでご確認ください｡ 

08:02.240 --> 08:05.780
そして､ そこでもまた､ 非常にソフトな数学の紹介がなされています｡ 

08:05.780 --> 08:07.160
しかし､ その後､ 数学のために｡ 

08:07.160 --> 08:13.220
でも､ 記事を読み進めていくと､ 数学は結構重いんですよ｡ 

08:13.430 --> 08:17.260
でも同時に､ その気にさせる｡ 

08:17.270 --> 08:22.610
まず算数でウォーミングアップをしてから､ それらに飛び込んでいくウォームアップ編のようなものがあると思います｡ 

08:22.610 --> 08:27.170
数学に興味があるのなら､ この記事を見て､ 行ってみよう｡ 

08:27.170 --> 08:36.260
つまり､ グランドディセントとストキャスティックスグラディエントディセントの違いとその仕組みは､ 簡単に言えばこういうことです｡

08:36.260 --> 08:39.770
ということで､ 本日のチュートリアルを終了します｡ 

08:39.770 --> 08:41.930
次回作でお会いできるのを楽しみにしています｡ 

08:41.930 --> 08:44.240
そして､ それまではディープラーニングを楽しんでください｡ 
