WEBVTT

00:00.550 --> 00:03.340
こんにちは､ ディープラーニングの講座にようこそ｡ 

00:03.340 --> 00:06.580
今日のチュートリアルでは､ 勾配降下法について説明します｡ 

00:06.580 --> 00:14.260
前回学んだのは､ ニューラルネットワークが学習するために必要なのは､ 逆伝播であるということです｡

00:14.260 --> 00:23.080
そして､ このとき､ y hatとyの誤差､ 差または2乗和がニューラルネットワークに逆伝播され､

00:23.080 --> 00:28.210
それに応じて重みが調整される｡

00:28.210 --> 00:34.150
それを見て､ 今日はこのウェイトがどのように調整されているのかを具体的に学びます｡ 

00:34.150 --> 00:35.230
では､ 見てみましょう｡ 

00:35.920 --> 00:44.590
これは､ パーセプトロン､ つまり単層のフィードフォワード・ニューラルネットワークの非常にシンプルなバージョンです｡

00:44.590 --> 00:56.920
このように､ 入力値があり､ 重みがあり､ 活性化関数が適用される､ という一連のプロセスを見ることができるのです｡

00:56.920 --> 00:59.800
ホワイトハットを取得した上で､ 実際の値と比較するのです｡ 

00:59.800 --> 01:01.570
コスト関数を計算する｡ 

01:01.570 --> 01:05.200
では､ どうすればコスト関数を最小化できるのだろうか｡ 

01:05.200 --> 01:07.270
どうしたらいいのでしょうか？

01:07.270 --> 01:18.130
そのための1つの方法として､ さまざまな重みの候補をすべて取り出して､ どれが最も効果的かを検討するブルートフォース・アプローチがあります｡

01:18.130 --> 01:24.760
そして何をするかというと､ 例えば1000個の重みで試して､ モデルを作ってみるのです｡

01:24.940 --> 01:27.640
コスト関数はこんな感じになりますね｡ 

01:27.640 --> 01:32.740
そして､ これはY軸にコスト関数､ つまり縦軸をとったグラフです｡ 

01:32.740 --> 01:41.590
横軸はyハットで､ 式はyハットからyの2乗を引いたものですから､ コスト関数はこんな感じでしょうか｡

01:42.510 --> 01:47.100
そして､ 基本的に一番いいのはこっちだと思うんです｡ 

01:47.760 --> 01:50.490
とてもシンプルで､ 直感的なアプローチですね｡ 

01:50.850 --> 01:53.130
なぜ､ このブルートフォース方式を行わないのか？

01:53.130 --> 02:02.940
1000種類のコスト､ 1000種類のパラメータ､ 重みのインプットを試して､ どれが一番うまくいくかを見ればいいじゃないですか｡

02:02.940 --> 02:04.110
そうすれば､ ベストな1台が見つかるはずです｡ 

02:04.140 --> 02:07.530
まあ､ 最適化する方法が1つだけなら､ これでもいいかもしれませんね｡ 

02:07.530 --> 02:16.310
しかし､ 重みの数を増やし､ ネットワークのシナプスの数を増やすと､ 次元の呪いに直面することになる｡

02:16.320 --> 02:18.690
それで､ 次元の呪いとは何でしょうか？

02:19.350 --> 02:24.390
このことを説明するには､ 実例を見るのが一番です｡ 

02:24.390 --> 02:30.420
ニューラルネットワークがどのように機能するかについて話したときの例ですが､ 不動産評価のためにニューラルネットワークを構築したり､

02:30.420 --> 02:36.870
実行したりしたときのことを思い出してください｡

02:36.870 --> 02:40.500
もう鍛え上げられたらこんな感じなんですね｡ 

02:40.500 --> 02:43.440
まあ､ 以前から訓練されていないときは､ 以前から訓練されているんですけどね｡ 

02:43.440 --> 02:47.520
重みのどれかがわかっている､ 実際のニューラルネットワークはこのようになっています｡ 

02:47.520 --> 02:54.960
そうですね､ さまざまなシナプスの可能性があるわけですが､ それでもウェイトをトレーニングしていかなければなりません｡ 

02:54.960 --> 03:03.330
そしてここでは､ 最初に5個を4回､ さらに隠れ層から出力層まで5個､ 合計25個の重みが設定されています｡

03:03.390 --> 03:09.030
そして､ 25個のウェイトをブルートフォース（総当り）することが可能かどうか､ 見てみましょう｡ 

03:09.150 --> 03:13.230
これは非常にシンプルなニューラルネットワークで､ とてもシンプルです｡ 

03:13.230 --> 03:14.400
隠れ層は1つだけ｡ 

03:14.400 --> 03:21.090
そして､ このサイズのニューラルネットワークを､ どうやってブルートフォースで突破するのか？

03:21.090 --> 03:24.150
では､ 簡単な数学の計算をしてみましょう｡ 

03:24.150 --> 03:25.800
25個のウェイトを用意しています｡ 

03:25.800 --> 03:30.330
つまり､ すべての重さについて試す組み合わせが1000通りあるとすると､

03:30.330 --> 03:36.960
組み合わせの総数は1000の25乗､ あるいは1000の10乗､ あるいは75乗となります｡

03:37.680 --> 03:46.800
では､ 2016年6月現在､ 世界最速のスーパーコンピュータにタイトルライトするサンウェイを見てみましょう｡ 

03:47.250 --> 03:49.590
この問題に対して､ どのようにアプローチするのでしょうか｡ 

03:49.590 --> 03:49.770
そうですね｡ 

03:49.770 --> 03:53.730
だから､ 何らかの方法で光に結びつけると､ このようになります｡ 

03:53.760 --> 03:58.770
このスーパーコンピュータ1台のために､ 巨大なビルが建っているようなものです｡ 

03:58.770 --> 04:04.470
そして､ 最速のスーパーコンピューターとしてギネス世界記録を取得しました｡ 

04:05.100 --> 04:08.160
今現在､ 世界最速のスーパーコンピューターです｡ 

04:08.160 --> 04:14.730
そして､ Sunway Tiger Lightは93ペタFLOPSの速度で動作させることができます｡ 

04:15.220 --> 04:27.930
フロップとはfloating operation per secondの略で､ 1秒間に93乗×10乗の15回の浮動小数点演算を行うことができる｡

04:27.930 --> 04:32.280
それくらい､ 比較にならないほどの速さなのです｡ 

04:32.280 --> 04:37.980
今の平均的なコンピューターは､ 数ギガフロップ強といったところでしょうか｡ 

04:37.980 --> 04:44.130
だから､ サンウェイ・トワイライトよりもずっと低いレンジのようなものです｡ 

04:44.130 --> 04:47.790
つまり､ サンウェイ・トワイライトはテクノロジーの最前線にいるわけです｡ 

04:48.150 --> 04:57.900
そして､ 仮に1フロップでニューラルネットワークの1つのテスト､ 1つの組み合わせを行うことができるとしましょう､

04:57.900 --> 05:01.320
基本的には1回の浮動小数点演算で｡

05:01.560 --> 05:03.150
それは無理な話です｡ 

05:03.150 --> 05:09.420
ニューラルネットワークの1つの重みを試すのに複数の浮動小数点演算が必要なため､ 実用的ではありません｡

05:09.420 --> 05:11.190
でも､ let'sでも先手を打ちましょう｡ 

05:11.190 --> 05:14.970
仮に理想的な状態でできるとしましょう｡ 

05:14.970 --> 05:17.310
それを1回のフローティング操作で行うことができる｡ 

05:17.310 --> 05:19.830
1回のフローティング動作で1回のテストが可能です｡ 

05:19.830 --> 05:28.470
つまり､ そのネットワークをブルートフォースで突破するためのテストをすべて実行するには､ 75の10乗÷93倍､

05:28.470 --> 05:33.900
10〜バー､ 15秒の時間が必要なのです｡

05:33.900 --> 05:41.850
つまり､ 1かおよそ10の58秒乗で､ 10の50年乗と同じということです｡

05:41.850 --> 05:44.220
これは大きな数字です｡ 

05:44.220 --> 05:48.120
それは､ 宇宙が存在するよりも長い時間です｡ 

05:48.120 --> 05:52.800
そしてそれは､ 単純にこの数字が巨大であるということでは絶対にないでしょう｡ 

05:52.800 --> 05:58.860
ただ､ 私たちの最適化にはまったく通用しないことは確かです｡ 

05:58.860 --> 05:59.970
そうそう､ そうなんです｡ 

05:59.970 --> 06:01.170
これはダメなんです｡ 

06:01.170 --> 06:05.340
世界最速のスーパーコンピューター「サンウェイ」のタイトルライトでも｡ 

06:05.340 --> 06:07.560
だから､ 別の方法を考えなければならない｡ 

06:07.560 --> 06:10.080
どうやって最適な重さを探すのか？

06:10.080 --> 06:13.500
ところで､ この私たちのニューラルネットワークは､ とてもシンプルなものでした｡ 

06:13.500 --> 06:17.060
ニューラルネットワークがこんな感じだとしたらどうでしょう？

06:17.100 --> 06:22.110
あるいはそれ以上のことも､ そう､ まったく起こらないんです､ 絶対に｡ 

06:22.530 --> 06:26.100
そこで､ これから見ていくのは､ 勾配降下法という方法です｡ 

06:26.100 --> 06:28.200
と､ もうお聞きになったかもしれませんね｡ 

06:28.410 --> 06:30.630
そうでない場合は､ 今すぐ原因を突き止めます｡ 

06:30.630 --> 06:41.910
これでコスト関数ができたわけですが､ 次はこの関数をより速く求めるための里親を見つける方法を見ていきましょう｡

06:41.980 --> 06:43.120
最高の選択肢です｡ 

06:43.120 --> 06:44.980
では､ どこかから始めるとしましょうか｡ 

06:44.980 --> 06:45.850
どこかで始めなければならない｡ 

06:45.850 --> 06:58.510
そこで､ 左上の点から始めて､ その点でのコスト関数の角度を見ます｡

06:58.510 --> 07:01.900
だから､ 基本的にグラデーションと呼ばれるのは､ 微分しなければならないからです｡ 

07:01.900 --> 07:03.790
数式を見るつもりはない｡ 

07:04.090 --> 07:09.220
次回の講義の最後に､ 副読本のヒントを提供する予定です｡ 

07:09.580 --> 07:19.180
しかし､ 基本的には微分して､ その特定の点での傾きを求め､ 傾きが正か負かを調べればいいのです｡

07:19.180 --> 07:23.890
傾きが負の場合は､ このケースのように､ 下り坂になることを意味します｡ 

07:23.890 --> 07:27.070
つまり､ 右は下り坂､ 左は上り坂ということです｡ 

07:27.070 --> 07:29.620
そして､ そこから右に行く必要があるということです｡ 

07:29.620 --> 07:32.920
基本的には､ 下り坂を進む必要があるので､ そのつもりで｡ 

07:32.950 --> 07:35.140
部屋は一歩を踏み出す､ か｡ 

07:35.380 --> 07:37.390
ボールは再び転がり落ちる｡ 

07:37.390 --> 07:38.230
同じことです｡ 

07:38.230 --> 07:39.460
傾きを計算するのです｡ 

07:39.460 --> 07:44.860
今度は傾斜が正で､ 右が上り坂､ 左が下り坂なので､ 左に行く必要があり､

07:44.860 --> 07:52.120
ボールを転がすと下り坂､ また傾斜を計算して､ ボールを右に転がすと下り坂になります｡

07:52.960 --> 07:53.470
これでよしとしよう｡ 

07:53.470 --> 08:04.420
つまり､ 簡単に言えば､ コスト関数を最小化する最適なウェイト､ 最適な状況を見つける方法です｡

08:04.420 --> 08:06.520
もちろん､ ボールのようになるわけではありません｡ 

08:06.520 --> 08:12.670
転がりながらだとジグザグになりますが､ ボールが転がっていると思えば覚えやすいし､

08:12.670 --> 08:14.860
楽しいですよ｡

08:14.860 --> 08:18.500
でも実際は､ そう､ 一歩一歩近づいていくような感じなんですね｡ 

08:18.500 --> 08:20.560
だから､ ジグザグ型の方法になるんです｡ 

08:21.820 --> 08:22.210
そうですね｡ 

08:22.210 --> 08:24.970
また､ それ以外にもさまざまな要素があります｡ 

08:24.970 --> 08:31.540
例えば､ 「なぜ下がるのか」というようなことです｡ 

08:31.540 --> 08:35.020
なぜ､ 線上に消えるようなことはないのでしょうか？

08:35.020 --> 08:40.360
だから､ この中から飛び出して､ 下ではなく上に行ったりしていたかもしれない｡ 

08:40.360 --> 08:41.890
つまり､ 微調整が可能なパラメータなのです｡ 

08:41.890 --> 08:45.460
また､ その詳細については､ どこで確認できるかを記載します｡ 

08:45.460 --> 08:50.470
そしてさらに､ これを実用化しつつ､ 最もシンプルな直感的アプローチで実現します｡ 

08:50.470 --> 08:51.670
これが現状です｡ 

08:51.670 --> 08:57.730
何千何万､ 何百万､ 何十億､ 何千何億という組み合わせをブルートフォースでこなすのではなく､

08:57.730 --> 09:02.800
どの方向に進むべきかを理解するだけで､ 底上げができるのです｡

09:02.800 --> 09:08.860
どこに何があるのか､ どの方向に傾斜しているのか､ 毎回シンプルに確認することができるのです｡ 

09:08.860 --> 09:13.720
丘の上に立っていると想像して､ どっちに下っていると感じるか､ どっちに下っていても､

09:13.720 --> 09:16.420
その道を歩き続けるんだ｡

09:16.420 --> 09:20.320
そうやって50歩進んで､ また評価をして､ どっちに進んでいるのか､ という感じですね｡ 

09:20.320 --> 09:21.370
下向きはこっち｡ 

09:21.370 --> 09:23.170
では､ 50歩以内を目安にしてください｡ 

09:23.170 --> 09:27.880
そうやって40歩ずつ､ 近づくにつれてどんどん少なくなっていくんです｡ 

09:28.390 --> 09:32.650
そこで､ 2次元空間に勾配降下を適用した例を紹介します｡ 

09:32.650 --> 09:35.440
一次元的な例だったんですね｡ 

09:36.460 --> 09:40.180
ここでは､ 勾配降下のための2次元空間を用意した｡ 

09:40.180 --> 09:44.890
見ての通り､ 最小値に近づいています｡ コスト関数の最小値に向かって降下していくので､

09:44.890 --> 09:49.240
勾配降下法とも呼ばれます｡

09:49.420 --> 09:53.260
そして最後に､ 3次元で適用したグラディエントディセントを紹介します｡ 

09:53.260 --> 09:54.340
このような感じです｡ 

09:54.340 --> 09:59.260
二次元に投影すると､ 最小値にジグザグに入り込んでいるのがわかります｡ 

09:59.440 --> 10:00.020
それでは､ どうぞ｡ 

10:00.070 --> 10:05.890
以上､ 勾配降下法でした｡ チュートリアルでは､ このチュートリアルの続きとして､ 確率的勾配降下法についてお話したいと思いますので､

10:05.890 --> 10:08.620
よろしくお願いします｡

10:08.620 --> 10:10.720
というわけで､ 次回はディープラーニングをお楽しみください｡ 
