WEBVTT

00:00.530 --> 00:03.020
こんにちは､ ディープラーニングの講座にようこそ｡ 

00:03.020 --> 00:07.910
前回のチュートリアルで､ 畳み込みニューラルネットワークがどのようなものかを知りましたが､

00:07.910 --> 00:10.820
今日はステップ1の畳み込みに飛び込みます｡

00:10.820 --> 00:14.780
これが畳み込み関数ですね｡ 

00:14.780 --> 00:20.720
私たちは数学を避け､ 直感的に理解することを心がけていますが､ この公式はとてもシンプルなので､

00:20.720 --> 00:23.090
紹介せずにはいられませんでした｡

00:23.090 --> 00:32.630
畳み込みは基本的に2つの関数の複合積分であり､ 一方の関数が他方の関数をどのように修正するか､ あるいは他方の関数の形状をどのように修正するかを示すものである｡

00:32.630 --> 00:42.350
そして､ 信号処理や電気工学､ 信号処理が必要な職業に就いている人なら､ 必ずと言っていいほどコンボリューション関数に出会ったことがあるのではないでしょうか｡

00:42.350 --> 00:44.030
今､ かなり人気がありますね｡ 

00:44.030 --> 00:49.400
もう一度､ 数学を軽くするか､ 分けて考えるか｡ 

00:49.400 --> 00:55.850
また､ 畳み込みニューラルネットワークの背後にある数学に触れたい方は､ 中国の南京大学の教授であるJanson

00:55.850 --> 01:05.630
Wuの「Introduction to Convolutional Neural Networks」を追加で読むとよいでしょう｡

01:05.630 --> 01:17.330
この論文は文字通り数日前､ 5､ 6日前に発表されたもので､ 特に初心者の方､ 畳み込みニューラルネットワークを知ろうとする方に向けられています｡

01:17.330 --> 01:20.090
だから､ そこにある数学はアクセスしやすいものでなければならない｡ 

01:20.090 --> 01:33.260
実際にジョンソン・ウー教授にメールしてみたところ､ そうですね､ 複雑なものを初めて見る人にもわかるように落とし込むことが全体の目標だとおっしゃっていました｡

01:33.260 --> 01:38.900
また､ ホームページで資料が公開されているとのこと｡ 

01:38.900 --> 01:46.310
URLの最後の2つの部分を削除して､ その部分にスラッシュWJ Xのようにアクセスすると､ そこが彼のホームページで､

01:46.310 --> 01:51.440
さらに追加のチュートリアルや論文として発表されていない資料が見つかりますが､

01:51.440 --> 01:57.860
彼はそれらをチュートリアルに使っているので､ 役に立つかもしれません｡

01:57.860 --> 02:03.650
畳み込みニューラルネットワークの背後にある数学に触れ､ その分野の基礎を固めたい方は､

02:03.650 --> 02:08.180
このあたりをご覧ください｡

02:08.300 --> 02:12.440
でも､ これから移動して､ コンボリューションの話をするんだ｡ 

02:12.440 --> 02:15.980
では､ 直感的に畳み込みとは何だろうか｡ 

02:16.340 --> 02:18.890
左側には､ 先ほど説明したように入力画像があります｡ 

02:18.890 --> 02:22.670
そんな感じで､ 画像は1と0だけで､ シンプルに見ていくことにします｡ 

02:22.670 --> 02:24.770
そして､ そこにスマイリーフェイスがあるのがお分かりいただけると思います｡ 

02:24.770 --> 02:26.300
続いて､ 特徴検出器です｡ 

02:26.300 --> 02:28.400
つまり､ 特徴検出器は3×3の行列である｡ 

02:28.670 --> 02:30.050
3×3でなければならないのでしょうか？

02:30.050 --> 02:31.040
いいえ､ そんなことはありません｡ 

02:31.760 --> 02:40.640
アレックス・ネットは7×7で､ 他の有名なものは5×5のフィーチャーディテクターを使っているようです｡

02:41.480 --> 02:49.310
異なる場合もありますが､ 通常は3×3であることがわかり､ 3×3にする理由があります｡

02:49.310 --> 02:53.900
そこで､ 3×3の特徴検出器を持つという慣習にこだわります｡ 

02:54.470 --> 03:04.040
また､ 特徴検出器は､ 特徴検出器と呼ばれることもあります｡

03:04.040 --> 03:09.290
あるいは､ カーネルと呼ばれることもあれば､ フィルターと呼ばれることもあるでしょう｡ 

03:09.290 --> 03:14.240
そこで､ この講座では､ フィルタと特徴検出器のどちらかを使い分けることにします｡ 

03:14.360 --> 03:26.480
ただ､ そういう名前がついていることと､ 畳み込み演算は､ 前やここの式で見たように､ 丸に×印で示されることだけは覚えておいてください｡

03:26.510 --> 03:34.820
何が起こるかは直感的なレベルで､ すべて､ あるいは数学ではなく､ 背景で実際に起こっていることで考えるだけです｡

03:34.820 --> 03:40.520
この特徴検出器やフィルターを､ 左の写真のように画像に貼り付けます｡ 

03:40.520 --> 03:48.170
例えば､ この場合､ 左上隅をカバーすると､ 左上隅には9ピクセルがあるわけです｡

03:48.170 --> 03:54.050
そして､ 基本的には各値に各値を掛けていく｡ 

03:54.050 --> 03:54.920
だから､ それぞれの価値観｡ 

03:54.920 --> 04:02.540
つまり､ 左上の値で上のゼロ､ それから基本的にポジション番号1､ ポジション番号1で1､ 数字で1ポジション､

04:02.540 --> 04:08.600
ゼロでゼロ1､ ゼロ2で102､ といった具合になります｡

04:08.600 --> 04:14.390
つまり､ これらの行列を要素ごとに掛け合わせ､ その結果を足し合わせるだけです｡ 

04:14.390 --> 04:16.610
この場合､ 何も一致しないわけです｡ 

04:16.610 --> 04:19.760
つまり､ 常にゼロバイゼロのゼロバイワンのどちらかなんです｡ 

04:19.760 --> 04:21.050
だから結果はゼロ｡ 

04:21.620 --> 04:26.480
ここでは､ そのうちのひとつ､ 左のものがマッチングしたことがわかります｡ 

04:26.480 --> 04:28.060
そのため､ ここに1枚を用意しました｡ 

04:28.070 --> 04:30.680
何もマッチングしない､ 何もマッチングしない､ 何もマッチングしない｡ 

04:30.680 --> 04:32.060
そして､ 次の行に進みます｡ 

04:32.060 --> 04:38.510
このフィルター全体を動かすステップをストライドと呼びます｡ 

04:38.510 --> 04:40.460
そこで､ ここでは1ピクセルのストライドを確保しています｡ 

04:40.460 --> 04:45.650
右下はストライドとマッチングしていますが､ 真ん中の下はここでマッチング､

04:45.650 --> 04:50.800
右上は1マッチング､ そして何もマッチングしていない状態です｡

04:50.840 --> 04:51.980
ストライドは1本｡ 

04:52.070 --> 04:57.290
ストライドを変えてもいいし､ 1本にしても2本にしても､ 3本にしてもいい｡ 

04:57.290 --> 04:59.510
が好きなら何でもいい｡ 

04:59.920 --> 05:02.670
結局､ うまくいくのはたいてい2なんです｡ 

05:02.670 --> 05:04.260
だから､ みんなそこにこだわっているんですね｡ 

05:04.260 --> 05:08.940
そして､ このチュートリアルの最後に､ ストライドが何であるかについて説明します｡ 

05:09.420 --> 05:11.700
だから､ ここで私たちはマッチングしているのです｡ 

05:11.700 --> 05:12.570
だから､ ここをひたすら進むんです｡ 

05:12.570 --> 05:17.640
2つがマッチしているから2があるのがわかる､ などなど｡ 

05:17.640 --> 05:18.180
そして､ そこに行く｡ 

05:18.180 --> 05:19.530
もうひとつ､ マッチングしたものがあるんです｡ 

05:21.330 --> 05:22.500
これでよしとしよう｡ 

05:23.560 --> 05:24.570
そして､ 完成したのです｡ 

05:24.580 --> 05:26.300
それがどうした？

05:26.320 --> 05:27.660
私たちは何を作ってきたのか？

05:27.670 --> 05:28.270
そうですね｡ 

05:28.630 --> 05:31.240
ここで重要なことが2つあります｡ 

05:31.870 --> 05:34.900
右の画像はフィーチャーマップと呼ばれるものです｡ 

05:35.170 --> 05:36.610
また､ いくつかの用語があります｡ 

05:36.610 --> 05:40.190
また､ 時に制御された機能と呼ぶこともできます｡ 

05:40.750 --> 05:46.930
だから､ 何かにコンボリューション演算オペレータを適用したとき､ それはコンボリューションになるのではなく､ インボルブになるのです｡

05:46.930 --> 05:53.530
そうそう､ 時々､ 好きだ､ と間違った言い方で自分でも思うことがありますが､ 正しい言い方です｡ 

05:53.530 --> 05:57.820
関与しているのは､ ある種古い機能というか､ アクティベーションマップとも言えますね｡ 

05:57.820 --> 06:02.650
でも､ この講座ではフィーチャーマップと呼ぶことにしているので､ どれでもいいんです｡ 

06:03.280 --> 06:06.250
そして､ 私たちはここで何をしたのか？

06:06.250 --> 06:09.820
さて､ ご覧の通り､ 画像のサイズを小さくしました｡ 

06:09.820 --> 06:10.540
それが1番です｡ 

06:10.540 --> 06:17.110
そして､ 入力画像と特徴量検出と歩幅について､ これが重要なことを言いたかったんですね｡

06:17.290 --> 06:23.110
ストライドが1だと少し縮小して見えますが､ ストライドが1､ 2だともっと縮小して見えます｡

06:23.110 --> 06:30.880
そのため､ 特徴マップはさらに小さくなります｡ この畳み込みステップ全体の特徴検出器の非常に重要な機能は､

06:30.880 --> 06:42.040
画像を小さくすることです｡

06:42.040 --> 06:43.600
なりますし｡ 

06:45.990 --> 06:51.780
このように､ 7×7の画像を想像すると､ 彼はまさに里親のような存在でしょう｡ 

06:51.780 --> 06:55.080
でも､ ちゃんとした写真があったらと想像してみてください｡ 

06:55.590 --> 06:59.220
あるいは､ 256×256ピクセルの画像のようなものです｡ 

06:59.220 --> 07:06.720
256の2乗とか､ 300×300ピクセルのような膨大なピクセル数です｡ 

07:06.720 --> 07:09.810
だから､ GB256と混同しないように｡ 

07:09.810 --> 07:14.550
サイズとピクセル数で300×300の画像があるとします｡ 

07:14.550 --> 07:18.690
そうすると､ 300の2乗の画素数があるわけですから､ ものすごい数です｡ 

07:18.900 --> 07:27.480
そのため､ 特徴検出器は画像サイズを小さくすることになるので､ ストライドが2であることが実は有利なのです｡

07:27.480 --> 07:34.350
しかし､ そうなると､ 特徴量検出器を適用する際に､ 情報を失っているのか､ それとも､ 情報を失っていないのか､ という問題が出てきます｡

07:34.350 --> 07:40.470
もちろん､ 結果として得られる行列の値が少なくなるため､ 失う情報もある｡ 

07:40.470 --> 07:47.910
しかし同時に､ 特徴検出器の目的は､ ある特徴､ つまり画像のある部分を一体として検出することです｡

07:48.420 --> 07:52.920
それで､ 例えば､ 特徴検出器にあるパターンが付いているように考えると､ そのパターンが一致したときに､

07:52.920 --> 07:57.870
フィーチャーマップの中で一番大きな数字になるわけです｡

07:57.870 --> 08:05.100
実は､ 今簡略化した例では､ フィーチャーが一致したときが最も高い数字になる｡ 

08:05.100 --> 08:05.490
その通りです｡ 

08:05.490 --> 08:09.330
そして､ その4番がフィーチャーマップにあるのがおわかりいただけると思います｡ 

08:09.330 --> 08:10.470
まさにその通りです｡ 

08:10.470 --> 08:19.020
だから､ こっちを見れば､ まさにこの機能検出器があるわけで､ その中で4つだけ完璧にマッチしているわけですから｡

08:19.020 --> 08:21.240
だから､ こっちのこの部分が見えると思います｡ 

08:21.240 --> 08:27.300
そこで､ このセクションの一番最初に説明したように､ ここで機能が検出されました｡ 

08:28.160 --> 08:33.020
その機能こそが､ 私たちのものの見方であり､ 認識の仕方なのです｡ 

08:33.020 --> 08:40.190
私たちは､ 画像や実生活で目にするものを､ いわば1画素単位で見ているわけではありません｡ 

08:40.190 --> 08:41.750
一枚一枚見ているわけではありません｡ 

08:41.750 --> 08:50.150
鼻､ 帽子､ 羽､ 目の下やチーターの目の下にある小さな黒いマークでチーターとヒョウを見分けたり､

08:50.150 --> 08:57.320
電車の形を見分けたりするのです｡

08:57.320 --> 09:00.620
新幹線と普通の電車のように､ 区別することはありません｡ 

09:00.620 --> 09:02.510
だから､ すべてを見るわけではありません｡ 

09:02.510 --> 09:08.030
私たちは特徴に注目し､ それを保全するためにフィーチャーマップを活用しています｡ 

09:08.030 --> 09:15.410
実際､ 不要なものをすべて取り除くことができるのです｡ 人間であっても､

09:15.410 --> 09:22.550
1秒間にギガバイト､ いやテラバイト級の情報が目に入るわけですが､

09:22.550 --> 09:35.330
それでも処理できるのは､ 不要なものを取り除いているからなのです｡

09:35.330 --> 09:36.920
重要な機能だけに絞る｡ 

09:36.980 --> 09:42.050
フィーチャーは私たちにとって重要なものであり､ まさにフィーチャーマップはその役割を担っているのです｡ 

09:42.050 --> 09:49.430
さて､ 次に入力画像と特徴マップを作成します｡ 

09:49.430 --> 09:52.490
では､ フロントはというと､ 先ほど作成したものです｡ 

09:52.490 --> 10:00.500
でも､ それならどうして､ たくさんあるのに､ 複数のフィーチャーマップを作るのかというと､ 異なるフィルターを使うからですよね｡

10:00.500 --> 10:03.770
これもまた､ 多くの情報を保存するための方法です｡ 

10:03.770 --> 10:10.550
つまり､ 1つの特徴マップだけでなく､ 特定の特徴を探し､ そして基本的にはネットワークが学習を通して､

10:10.550 --> 10:14.570
これはこのセクションの最後で説明しますが､ 学習を通して､

10:14.570 --> 10:22.490
どの特徴が特定のタイプや特定のカテゴリにとって重要かを決定し､ それを探すのです｡

10:22.490 --> 10:27.710
そのため､ さまざまなフィルターが用意されています｡ フィルターについてはこれから説明しますが､ 基本的にはこれらのフィルターを適用することになります｡

10:27.710 --> 10:32.480
そこで､ このフィーチャーマップを得るために､ 先ほどのようなフィルタを適用したのです｡ 

10:32.480 --> 10:36.200
しかし､ このフィーチャーマップを得るために､ 別のフィルターを適用する､

10:36.200 --> 10:37.460
といった具合に｡

10:38.150 --> 10:43.370
そして､ 基本的にはこのようなフィーチャーマップを作成するだけです｡ 

10:43.370 --> 10:49.520
だから､ 個人的にはフィルターよりも特徴検出器という言葉の方がしっくりくるんです｡ 

10:49.520 --> 10:55.010
ここで､ 特徴検出器と呼ばれるフィルターがあることを思い出してください｡ 

10:55.010 --> 10:59.330
まあ､ 実際には､ 特徴量検出器という言葉の方が適していると思いますが｡ 

10:59.330 --> 11:03.110
その理由は､ そういう目的だからです｡ 

11:03.110 --> 11:03.320
そうですね｡ 

11:03.320 --> 11:06.440
私たちは､ 自分のイメージをフィルターにかけるだけではいけないと思っています｡ 

11:06.440 --> 11:10.130
しかし､ それは全体が同じでも､ 用語の問題で同じなのです｡ 

11:10.130 --> 11:11.930
しかし､ 基本的には特徴を検出したいのです｡ 

11:11.930 --> 11:12.200
わかりました｡ 

11:12.200 --> 11:19.610
このレイヤーの中で､ 私たちはこの特徴マップを獲得するつもりです｡ この特徴マップの中で､ ある特徴が画像のどこにあるか､

11:19.610 --> 11:25.280
他のある特徴がどこにあるか､ ある特定の特徴がどこにあるか､ 私たちは検出しました｡

11:25.310 --> 11:30.890
この特徴マップでは､ ある他の特徴が画像上のどの位置にあるかを検出しています｡ 

11:31.190 --> 11:33.320
だから､ そういうことだったんです｡ 

11:33.320 --> 11:34.550
そして､ いくつかの例を見てみましょう｡ 

11:34.550 --> 11:44.360
これはIngeborgのドキュメントですが､ ペイントのような無料のツールで､ 画像を調整したり､

11:44.360 --> 11:49.460
画像に手を加えたりするのに使うことができます｡

11:49.460 --> 11:59.720
しかし､ 基本的に彼らのドキュメントには貴重な例があり､ ここではタージマハルの写真があり､ どのフィルターを適用するかを選択することができます｡

11:59.720 --> 12:06.080
このプログラムをダウンロードして､ そこに写真をアップロードすると､ 実際にコンボリューション・マトリクスを起動して､

12:06.080 --> 12:15.140
フィルターを適用することができます｡ これらのこと､ コンボリューション・マトリクスは､ 実際に画像処理やデザインなどに応用されていることがわかります｡

12:15.140 --> 12:16.700
では､ どんなものが出てくるのか､ 見てみましょう｡ 

12:16.700 --> 12:23.540
このフィルターを真ん中の5つ､ マイナス1､ マイナス1､ マイナス1､ マイナス1と適用すると､ 画像がシャープになるのがわかると思います｡

12:23.540 --> 12:28.820
そうそう､ だからこれは､ 考えてみればとても直感的なことなんです｡ 

12:28.820 --> 12:36.350
つまり､ 5がフィルターや特徴検出器の中央にあるメインピクセルで､ マイナス1､

12:36.350 --> 12:44.960
マイナス1､ マイナス1は､ 直感的な意味で､ その周りのピクセルを減らすような感じです｡

12:46.100 --> 12:46.850
そして､ ぼかす｡ 

12:46.880 --> 12:54.500
つまり､ 基本的には､ 中央の1つのピクセルの周りのすべてのピクセルに等しい重要性を与えることになります｡

12:54.500 --> 12:58.940
そのため､ それらを組み合わせて､ 手元がぼやけるのです｡ 

12:58.940 --> 13:03.770
ここで､ マイナス1と1､ そしてゼロになるのがわかりますよね？

13:03.770 --> 13:11.210
そこで､ 真ん中のメインのピクセルを削除して､ このピクセルだけをマイナス1にしておくと､

13:11.210 --> 13:12.740
エッジが出ます｡

13:12.740 --> 13:14.960
そして､ これはちょっと仕組みがわかりにくいんです｡ 

13:15.900 --> 13:19.070
直感的に考えるだけでは､ たぶん難しいような｡ 

13:19.460 --> 13:20.800
エッジディテクトライト

13:20.810 --> 13:23.510
だから､ こっちの方が意味があるんだろうね｡ 

13:23.510 --> 13:32.450
真ん中をとって､ 真ん中を減らして､ 真ん中の画素の強さがたぶん好きなんでしょうね｡ 

13:32.450 --> 13:41.510
そして､ そういうものを探して､ 周りのものの力を高めていくんです｡

13:42.020 --> 13:43.310
そこにあるものがあるわけですね｡ 

13:44.420 --> 13:44.810
そうですね｡ 

13:44.810 --> 13:50.630
それで､ エッジ検出ができるようになり､ そこで得たものを見て､ 別のものをボスにすることができるのです｡

13:50.630 --> 13:58.070
つまり､ ここで重要なのは､ 非対称であることで､ 画像も非対称になるのがわかると思います｡ 

13:58.070 --> 14:07.100
だから､ 「ここがマイナスで､ ここがプラス」というように､ 自分に向かって突出しているような感じがするんですね｡

14:07.100 --> 14:12.320
繰り返しになりますが､ これは非常に専門的な話になってしまいますが､ 少なくとも直感的に理解することはできますので､

14:12.320 --> 14:14.090
もう一度ざっと見てみましょう｡

14:14.090 --> 14:20.690
シャープ､ ぼかし､ エッジ強調､ エッジ検出､ エンボスなどがあります｡ 

14:20.690 --> 14:31.640
このように､ これらは同じ画像の素晴らしい例ですが､ 特徴マップを取得しているので､ 異なる特徴検出器を用いて同じ画像の異なる特徴マップを取得しています｡

14:31.640 --> 14:39.770
そのため､ この画像にはたくさんのバージョンがあり､ それぞれで特定のものを検出しようとしました｡ これらの用語は､

14:39.770 --> 14:46.640
ボスのように､ おそらく畳み込みニューラルネットワークの観点からは適用できないことを除いて､

14:46.640 --> 14:49.910
私たちには適用できません｡

14:49.910 --> 14:51.530
でも､ エッジ検出､ 大事ですよね｡ 

14:51.530 --> 14:56.360
エッジを検出し､ エッジを強調したいのですが､ おそらくぼかしシャープにはならないでしょう｡ 

14:56.360 --> 15:02.390
ですから､ 私たちのようなタイプの仕事には､ エッジが最も重要なのでしょう｡ 

15:02.390 --> 15:08.930
また､ コンピュータのように理解するという点では､ 何が重要で何が重要でないかを､ 神経回路網が自ら判断してくれるでしょう｡

15:08.930 --> 15:12.800
そしてそれは､ おそらく人間の目には認識できないでしょう｡ 

15:12.830 --> 15:17.060
その特徴の意味を理解することはできませんが コンピューターが決定します

15:17.060 --> 15:24.410
これがニューラルネットワークの美点です 多くの異なるものを処理でき 直感も働かず 理解することができます

15:24.410 --> 15:30.620
なぜどの特徴が重要なのかを理解するのか その説明がなくてもです 名前があるかないか

15:30.620 --> 15:39.230
それは人工ニューラルネットワークには無関係の問題です｡

15:39.800 --> 15:50.660
そして､ 私のお気に入りは､ Geoffrey Hintonの写真をこのフィルターに通した画像です｡

15:50.810 --> 15:51.110
わかりました｡ 

15:51.110 --> 15:52.970
ということで､ 今日のチュートリアルは終わりです｡ 

15:52.970 --> 15:55.220
畳み込みについて楽しく学んでいただけたでしょうか？

15:55.220 --> 16:02.270
コンボリューションの主な目的は､

16:02.270 --> 16:08.000
特徴検出器を使って画像内の特徴を見つけ､

16:08.000 --> 16:19.130
それを特徴マップに入れることです｡

16:19.130 --> 16:25.040
同時に､ ニューラルネットワークがある画像やクラスを認識するために検出し使用する特徴は､

16:25.040 --> 16:32.930
ほとんどの場合､ 人間にとって何の意味も持ちませんが､ それでも機能することを理解することが重要です｡

16:32.930 --> 16:34.280
そして､ それがコンボリューション（畳み込み）です｡ 

16:34.280 --> 16:36.140
そして､ 赤道直下でお会いできるのを楽しみにしています｡ 

16:36.140 --> 16:38.090
それまでは､ ディープラーニングを楽しんでください｡ 
