WEBVTT

00:00.700 --> 00:03.010
こんにちは､ そしてコースとディープラーニングにようこそ｡ 

00:03.010 --> 00:08.190
さて､ ニューラルネットワークの動きを見てきましたが､ 次は学習方法についてです｡ 

00:08.200 --> 00:09.820
では､ さっそく飛び込んでみましょう｡ 

00:10.270 --> 00:16.000
プログラムを思い通りに動かすには､ 2つの根本的なアプローチがあります｡ 

00:16.030 --> 00:24.580
一つはハードコーディングで､ プログラムに具体的なルールや求める結果を伝え､ 全体を通してガイドし､

00:24.580 --> 00:32.920
プログラムが対処しなければならないすべての可能な選択肢を考慮するものです｡

00:33.070 --> 00:37.300
一方で､ ニューラルネットワークを作るところがありますよね｡ 

00:38.700 --> 00:43.430
プログラムが自分で必要なことを理解できるようにするための設備｡ 

00:43.440 --> 00:49.410
つまり､ ニューラルネットワークを作り､ 入力を与え､ 出力として欲しいものを指示し､

00:49.410 --> 00:52.980
あとは自分ですべてを解決させるということです｡

00:53.310 --> 00:55.650
根本的に異なる2つのアプローチ｡ 

00:55.770 --> 01:00.450
このことは､ このチュートリアルを進めていく上で､ 心に留めておくべきことです｡ 

01:00.660 --> 01:05.910
私たちが目指しているのは､ このネットワークを作り､ 自ら学習していくことです｡ 

01:05.920 --> 01:10.920
ルールを入れようというのは避けようと思っています｡ 

01:10.920 --> 01:18.030
今すぐできる良い例として､ これはコースの後半で出てきますが､ 非常に視覚的な例です｡

01:18.030 --> 01:23.660
例えば､ 左側の犬4匹と猫4匹はどのように区別するのですか？

01:23.670 --> 01:30.480
左図のようなアプローチで､ 猫の耳はこうでなければならない､ というようなことをプログラムしていくわけです｡

01:30.480 --> 01:34.080
ひげに注目､ こんな鼻に注目｡ 

01:34.080 --> 01:37.680
このような顔の形に注目してください｡ 

01:37.740 --> 01:38.790
この色に注目してください｡ 

01:38.790 --> 01:43.650
耳がとがっていたら猫､ 耳が垂れていたら犬といった具合に､

01:43.650 --> 01:48.960
いろいろと条件をつけていくんですね｡

01:49.440 --> 01:54.690
一方､ ニューラルネットワークの場合は､ ニューラルネットワークをコーディングし､ アーキテクチャをコーディングし､

01:54.690 --> 02:02.580
そして､ すでに分類された猫や犬の画像があるフォルダに､ ニューラルネットワークを向けるだけでいいんです｡

02:02.580 --> 02:04.530
そして､ 「よし､ つかまえた」と言い聞かせるのです｡ 

02:04.530 --> 02:06.630
猫や犬の画像もあるんだけどね｡ 

02:06.660 --> 02:08.790
猫とは何か､ 勉強してこい｡ 

02:08.790 --> 02:10.470
犬とは何かを学んできてください｡ 

02:10.470 --> 02:15.030
そして､ ニューラルネットワークは､ 理解すべきことはすべて自力で理解する｡ 

02:15.030 --> 02:21.390
そして､ さらにその下､ トレーニングが進んだら､ 新たに猫や犬の画像を与えると､ それが何であったかを理解できるようになるのです｡

02:21.390 --> 02:23.070
そこで

02:23.100 --> 02:25.440
この2つは､ 根本的に異なるアプローチです｡ 

02:25.440 --> 02:30.920
そして今日は､ その2つ目のアプローチがどのように機能するのか､ ゆっくりと解説していきます｡ 

02:30.930 --> 02:31.410
わかりました｡ 

02:31.410 --> 02:33.480
では､ ここで本題に入りましょう｡ 

02:33.480 --> 02:39.450
1層の非常に基本的なニューラルネットワークがありますが､ これは1層のフィードフォワードニューラルネットワークと呼ばれ､

02:39.450 --> 02:42.540
パーセプトロンとも呼ばれます｡

02:42.540 --> 02:47.910
さて､ 話を進める前に､ ひとつだけ調整する必要があるのは､

02:47.910 --> 02:50.970
今の出力値です｡

02:50.970 --> 02:56.400
その理由は､ 通常Yは実際の値を表し､ それを使うことになるからです｡ 

02:56.400 --> 02:59.910
つまり､ Yは実際に見ることができる値になるわけです｡ 

02:59.910 --> 03:06.750
実際には､ 出力値とは､ アルゴリズムによって､ ニューラルネットワークによって､ 予測された値であり､

03:06.750 --> 03:09.150
yハットは､ 出力値である｡

03:09.150 --> 03:11.460
基本的には出力値に対するデノミです｡ 

03:11.460 --> 03:17.220
そしてパーセプトロンは､ 1957年にフランク・ローゼンブラットによって初めて発明された｡ 

03:17.220 --> 03:24.930
そして､ 彼のアイデアは､ 実際に学習して調整することができるものを作ることでした｡ 

03:24.930 --> 03:27.780
そしてこれが､ これから見ていくことになるのです｡ 

03:27.780 --> 03:30.150
そこで､ パーセプトロンを導入しました｡ 

03:30.150 --> 03:31.830
パーセプトロンの学習の仕方を見てみましょう｡ 

03:31.830 --> 03:40.080
では､ パーセプトロン､ つまりニューラルネットワークに供給される入力値があるとしましょう｡

03:40.080 --> 03:49.050
そして活性化関数が適用され､ 出力が得られます｡ 今度はその出力をグラフにプロットしてみましょう｡

03:49.050 --> 03:51.480
そこで､ 私たちの出力yハットです｡ 

03:51.510 --> 04:01.200
さて､ 学習するために必要なことは､ 出力値と､ ニューラルネットワークに正しく学習させたい実際の値とを比較することです｡

04:01.290 --> 04:04.320
そして､ それが価値観のYです｡ 

04:04.620 --> 04:07.710
それで､ ここにプロットしてみると､ 少し違いがあることがわかると思います｡ 

04:08.100 --> 04:16.890
ここで､ コスト関数と呼ばれる関数を計算します｡ これは､ 実際の値と出力値との差の2乗の半分として計算されます｡

04:16.920 --> 04:20.430
さて､ コスト関数を考えるには､ いろいろな方法があります｡ 

04:20.430 --> 04:23.040
コスト関数にはさまざまなものがあります｡ 

04:23.250 --> 04:30.480
これはおそらく最もよく使われるクラス関数で､ なぜ特にこの関数を使うかというと､ この関数があるからです｡

04:30.480 --> 04:34.200
この先の勾配降下の話で分かると思います｡ 

04:34.200 --> 04:37.650
しかし､ 今はこれがコスト関数であることに同意することにしよう｡ 

04:37.650 --> 04:44.040
そして､ 基本的にコスト関数が教えてくれるのは､ 予測にどの程度の誤差があるかということです｡ 

04:44.040 --> 04:51.480
そして､ コスト関数が低いほどYハットがYに近くなるので､ コスト関数を最小化することが目的です｡

04:52.290 --> 04:54.360
だから､ それに同意する限り､ 話を進めましょう｡ 

04:54.360 --> 04:58.320
つまり､ 基本的にここから先は､ コスト関数になります｡ 

04:58.320 --> 05:08.760
そしてここから先は､ 一度比較した情報をニューラルネットワークにフィードバックすることになります｡

05:08.760 --> 05:09.630
そうそう､ そうなんです｡ 

05:09.630 --> 05:15.480
ニューラルネットワークに情報が戻され､ それが重みになり､ 重みが更新されるのです｡

05:15.480 --> 05:20.820
基本的に､ この非常にシンプルなニューラルネットワークで制御できるのは重みw1､

05:20.820 --> 05:26.700
w2､ wmまでのすべてで､ 目標はコスト関数を最小化することです｡

05:26.700 --> 05:29.280
だから､ 私たちにできることは､ 重さを更新することだけなんです｡ 

05:29.280 --> 05:37.800
そのため､ ウェイトを更新し､ 少し調整します｡ 具体的にどのように調整するかは､ 今後の課題ですが､ 今のところ､ ウェイトがあることに合意しています｡

05:37.970 --> 05:40.010
重さ､ そして続ける｡ 

05:40.010 --> 05:53.930
しかし､ このデータのスクリーンショットは､ この実験全体を通して､ 今やっていることはすべて､ たった1つの行を扱っているということを明確にするためのものなのです｡

05:53.930 --> 06:01.970
つまり､ 1行のデータセットで､ 例えば「どのくらい勉強したか」を扱っているわけです｡

06:01.970 --> 06:08.150
私たちが予測する変数は､ 試験でどんな結果が出るか､ というものです｡ 

06:08.150 --> 06:12.530
そして､ 従属変数である独立変数は､ 何時間勉強したのか？

06:12.530 --> 06:16.700
学期半ばの小テストで､ 何時間寝て､ 何点取ったか？

06:16.700 --> 06:18.860
そこで学期の半ばに小テストがありました｡ 

06:18.860 --> 06:19.820
何パーセントで行ったのですか？

06:19.820 --> 06:24.590
それらの変数をもとに､ 試験で何点取れるかを予測するわけです｡ 

06:24.590 --> 06:27.950
そして受験では､ 93％というのが実測値です｡ 

06:27.950 --> 06:38.900
というわけで､ この3つの値をもう一度ニューラルネットワークに送り込み､ その結果をYと比較するのが2回目です｡

06:38.900 --> 06:40.220
では､ その仕組みを見てみましょう｡ 

06:40.490 --> 06:42.920
これらの値をニューラルネットワークに投入する｡ 

06:43.670 --> 06:46.610
すべてが調整され､ ウェイトも調整される｡ 

06:46.610 --> 06:50.090
ですから､ ご覧のように､ これもまた､ 値を送り込むことになります｡ 

06:50.090 --> 06:53.090
ここでもポイントは､ このように同じ価値観で食べさせていることです｡ 

06:53.090 --> 06:54.410
だから､ 1列しかないんです｡ 

06:54.410 --> 06:56.330
私たちは､ 1列でトレーニングするようにしています｡ 

06:56.330 --> 06:59.390
なぜなら､ これはごく簡単な基本的な例に過ぎないからです｡ 

06:59.390 --> 07:01.520
あとは､ 列が増えたらどうなるか｡ 

07:01.520 --> 07:06.080
このように､ コスト関数を調整するために､ これらの行をフィードします｡ 

07:06.080 --> 07:10.430
ご覧のように､ またその線上にすべてが起こるのです｡ 

07:10.430 --> 07:17.500
このように､ 重みを微調整したためにホワイトハットが変化し､ ハイヘッドが変化し､ コスト関数が変化していることがおわかりいただけると思います｡

07:17.540 --> 07:18.290
もう一度､ 見てみましょう｡ 

07:18.290 --> 07:22.670
そのため､ ホワイトハットが変化し､ コスト関数が変化している中で､ それらを投入しています｡ 

07:22.670 --> 07:26.960
私たちは､ 情報をウェイトにフィードバックして､ ウェイトを再び調整するのです｡ 

07:26.960 --> 07:32.300
毎回同じ値を投入して､ すべてが調整されてウェイトに戻り､

07:32.300 --> 07:36.590
もう1回投入して､ もう1回投入する｡

07:36.590 --> 07:41.300
そこで､ ウェイトを調整し､ 情報を投入して完成です｡ 

07:41.300 --> 07:45.770
そこで今度は､ yハットはyイコール関数ゼロになる｡ 

07:45.770 --> 07:48.350
通常､ コスト関数がゼロになることはありません｡ 

07:48.350 --> 07:50.120
しかし､ これは非常にシンプルな例です｡ 

07:50.630 --> 08:01.220
というのも､ 今回は1つの行をニューラルネットワークに取り込むだけだからです｡

08:01.670 --> 08:06.920
そして､ 重みは､ 活性化関数の適用方法によって､ 値が乗算されるようになる｡ 

08:06.920 --> 08:09.740
yと比較して､ yのハットを得る｡ 

08:10.130 --> 08:12.230
そして､ コスト関数がどのように変化したかを確認します｡ 

08:12.230 --> 08:17.900
その情報をニューラルネットワークにフィードバックして､ 重みを再び調整し､

08:17.900 --> 08:21.230
また同じ行で同じプロセスを繰り返します｡

08:21.410 --> 08:23.180
そのコスト関数を最小化しようとしているのです｡ 

08:23.180 --> 08:26.750
だから今までは､ その1列だけを扱っていたんです｡ 

08:26.780 --> 08:29.360
複数行の場合はどうなるのか見てみましょう｡ 

08:29.360 --> 08:31.220
では､ その全データをご紹介しましょう｡ 

08:31.220 --> 08:39.140
何時間寝たとか､ これは同じ試験を受けても別の生徒なんですが､ 8列あります｡

08:39.140 --> 08:44.000
他に何時間勉強したか､ 試験前に何時間寝たか､ 小テストで何が出たか､

08:44.000 --> 08:47.210
テストの最終結果はどうだったか｡

08:47.210 --> 08:51.830
そして､ この左側にあるように､ 私はこの認識を8つ持っているのです｡ 

08:51.830 --> 08:54.680
実は､ これらはすべて同じパーセプトロンなのです｡ 

08:54.680 --> 08:55.940
だから､ これも理解することが大切です｡ 

08:55.940 --> 09:04.220
ただ､ 概念的に理解できるように､ 8倍にしただけのことです｡ 

09:04.220 --> 09:06.680
しかし､ ここで重要なのは､ 同じニューラルネットワークであることです｡ 

09:06.680 --> 09:10.310
これを1つの同じニューラルネットワークに投入していくのです｡ 

09:10.310 --> 09:10.940
では､ 行ってみましょう｡ 

09:10.940 --> 09:11.570
さっそく始めてみましょう｡ 

09:11.570 --> 09:26.240
アランが1エポックと言ったように､ 1エポックとは､ データセット全体を通して､ これらの行すべてに対してニューラルネットワークを学習させることです｡

09:26.240 --> 09:26.780
では､ 行ってみましょう｡ 

09:26.780 --> 09:27.350
さっそく始めてみましょう｡ 

09:27.350 --> 09:31.400
そこで､ 最初の行と､ 最初の行のためのYハットがあります｡ 

09:32.390 --> 09:33.590
2列目もあるんですよ｡ 

09:33.620 --> 09:35.150
2列目にはホワイトハットがあります｡ 

09:35.150 --> 09:39.260
つまり､ 毎回同じニューラルネットワークに投入されているわけです｡ 

09:39.260 --> 09:44.000
このような状況を視覚的に確認できるように､ 何度かコピーしてみたところです｡ 

09:44.890 --> 09:47.670
そしてまた､ それが繰り返されるのです｡ 

09:47.680 --> 09:48.850
それが3列目です｡ 

09:48.850 --> 09:49.990
4列目

09:50.470 --> 09:52.960
4列目には私たちの白い帽子がある､ というように｡ 

09:52.960 --> 09:56.530
基本的には､ その後､ 残りの4行も同じ値が得られます｡ 

09:56.530 --> 10:02.620
つまり､ ニューラルネットワークに行を入力するたびに､ 値が得られるわけです｡ 

10:03.550 --> 10:06.880
そして､ 実際の値と比較するのです｡ 

10:06.880 --> 10:08.470
つまり､ 実際の値なんですね｡ 

10:08.470 --> 10:11.230
そのため､ 1行ごとに実際の値が表示されます｡ 

10:11.350 --> 10:18.220
そして今､ ホワイトハットとyの間のこれらの差のすべてに基づいて､ コスト関数を計算することができます｡

10:18.220 --> 10:27.280
これは､ ホワイトハットとyの間のこれらの二乗差のすべての合計であり､ そのすべてが半分になるのです｡

10:27.940 --> 10:29.740
そして､ これがコスト関数です｡ 

10:30.070 --> 10:36.880
コスト関数が完成したら､ 今度は重みを更新して､ aw1､ w2､

10:36.880 --> 10:39.430
w3を更新します｡

10:39.430 --> 10:47.260
ここで重要なのは､ これらのパーセプトロン､ ニューラルネットワークはすべて､ 実は一つのニューラルネットワークであるということです｡

10:47.260 --> 10:48.250
だから､ 8人もいないんです｡ 

10:48.250 --> 10:49.240
1つだけあります｡ 

10:49.360 --> 10:54.430
そして､ 重みを更新するときは､ その1つのニューラルネットワークの重みを更新することになるのです｡ 

10:54.430 --> 10:57.640
だから､ 基本的に重さは全部の列で同じになるんです｡ 

10:57.640 --> 11:00.430
だから､ すべての行にそれぞれの重みがあるかというと､ そうではありません｡ 

11:00.430 --> 11:02.650
これで､ すべての行が重みを共有することになります｡ 

11:02.650 --> 11:11.860
そこで､ 差の二乗の和であるコスト関数に着目し､ 重みを更新したわけです｡

11:11.860 --> 11:15.190
そして今､ ここから先は一つの反復に過ぎなかったのです｡ 

11:15.190 --> 11:18.940
次に､ この全体をもう一度実行します｡ 

11:18.940 --> 11:26.290
すべての行をニューラルネットワークに送り込み､ コスト関数を求め､ このプロセスをもう一度繰り返すのです｡

11:26.290 --> 11:33.520
以前､ 1つの行だけで､ 何度も何度も同じことを繰り返したのと同じです｡

11:33.520 --> 11:37.510
しかし､ これからは8列､ 800列､ 8000列とやっていくことになります｡ 

11:37.510 --> 11:43.510
データセットに何行あっても､ この処理をしてから､ コスト関数を計算するのです｡ 

11:44.020 --> 11:54.280
そして､ ここでの目標は､ コスト関数を最小化することであり､ コスト関数の最小値を見つけたらすぐに､ それが最終的なニューラルネットワークとなるのです｡

11:54.280 --> 12:10.720
つまり､ 重みが調整され､ 学習対象のデータセットに最適な重みが見つかったので､ テスト段階または応用段階に進む準備ができたということです｡

12:11.320 --> 12:14.620
そして､ この一連のプロセスをバックプロパゲーションと呼びます｡ 

12:14.710 --> 12:20.380
そこで､ コスト関数について､ いくつか追加で読んでおくとよいでしょう｡ 

12:20.380 --> 12:24.790
そして､ 今､ 1つの話をしましたが､ いろいろなものがあります｡ 

12:24.790 --> 12:28.420
クロスバリデーションに良い記事があります｡ 

12:28.660 --> 12:32.830
ニューラルネットワークのアプリケーションと並行して使われるコスト関数のリストと呼ばれるものです｡ 

12:32.830 --> 12:41.950
そのため､ URLはありますが､ その検索語や検索フレーズをそのままGoogleで検索すると､ こちらが最初に出てくることがわかります｡

12:41.950 --> 12:48.340
この本には､ さまざまなコスト関数に関する良い例やアプリケーション､ ユースケースが紹介されています｡ 

12:48.340 --> 12:51.520
そこで､ コスト関数について詳しく知りたい方は､ こちらの記事をご覧ください｡ 

12:51.700 --> 12:54.310
というわけで､ 本日のチュートリアルをお楽しみください｡ 

12:54.310 --> 12:55.930
次回､ お会いできるのを楽しみにしています｡ 

12:55.930 --> 12:58.150
それまでは､ ディープラーニングを楽しんでください｡ 
