同じフィルターを、画像全体で使い回す
レッスン2の図で、窓を9か所に動かしたとき、フィルターの9個の数は一度も変わりませんでした。1枚のフィルターを、画像のどの位置でも使い回しています。これを 重みの共有 と呼びます。
普通のニューラルネットワークとの違い
第6章の普通のニューラルネットワークでは、隠れ層のニューロン1つが、入力の64マス すべて と線でつながり、線1本ごとに別々の重みを持っていました。「左上のマスに掛ける重み」と「右下のマスに掛ける重み」は、まったく別の数です。
畳み込みでは、1枚のフィルターが見るのは、窓の中の9マスだけです。そして、窓がどこにあっても、同じ9個の重みを使います。
なぜ、使い回してよいのか
レッスン1で、「縦の線は、画像の左上にあっても右下にあっても、同じ縦の線」だと説明しました。縦線を見つけるフィルターは、どこで使っても縦線を見つけられます。位置ごとに別の重みで覚え直す必要がないので、1枚のフィルターを使い回せるのです。
重みの共有がもたらす、2つのよいこと
- 重みが少なくて済む: 1枚のフィルターの重みは9個だけです。画像が大きくなっても、この数は変わりません
- ある位置で覚えた模様を、別の位置でも見つけられる: 学習データで左上にあった模様を覚えれば、テストの画像で右下にあっても、同じフィルターが反応します
次のスライドで、重みの数を実際に数えて、普通のニューラルネットワークと比べます。
重みの数を数えて比べる
手書き数字(8×8の画像、0〜9の10クラス)を見分ける2つのモデルの、重みとバイアスの数を数えます。数え方は、第6章と同じです。
第6章の普通のニューラルネットワーク(隠れ層32個)
- 入力64個 → 隠れ層32個: 重み 64×32=2048 個、バイアス32個
- 隠れ層32個 → 出力10個: 重み 32×10=320 個、バイアス10個
合計は 2048+32+320+10=2410 個です。
CNN(3×3のフィルター16枚)
CNNの計算は、次の順番です。
- 畳み込み層: 3×3のフィルター16枚。フィルター1枚に重み9個とバイアス1個(第6章のニューロンと同じく、内積の後に足す数)
- ReLU・プーリング: 重みはない。8×8 → 畳み込みで6×6 → プーリングで3×3が16枚、つまり 9×16=144 個の数になる(前のレッスンの演習)
- 最後の層: 144個の数を1列に並べて、第6章と同じ「全部の線がつながった層」で、10クラスの点数を計算する
- 畳み込み層: 重み 9×16=144 個、バイアス16個
- 最後の層: 重み 144×10=1440 個、バイアス10個
合計は 144+16+1440+10=1610 個です。
比べると
CNNの正解率に幅があるのは、学習を始める前の重み(乱数)の種を8通りに変えて、それぞれ学習させた結果だからです。重みの数が3分の2でも、ほぼ同じくらいの正解率になりました。
注目してほしいのは、画像を見る層の重み です。普通のニューラルネットワークの最初の層は2,080個(重み2,048個とバイアス32個)、CNNの畳み込み層は160個です。CNNの重みの大部分は、最後の層にあります。
画像が大きくなると、差はもっと広がる
1000×1000マスの画像を考えます。普通のニューラルネットワークの最初の層(隠れ層32個)は、重みだけで 1000000×32=3200万個になります。CNNの畳み込み層は、画像がどれだけ大きくなっても、3×3のフィルター16枚なら重み144個とバイアス16個のままです。重みの共有のおかげです。
重みが少ないことの意味と、振り返り
機械学習での意味
重みが少ないと、次のようなよいことがあります。
- 計算とメモリが少なくて済む: スマートフォンのような小さな機械でも動かしやすくなります
- 過学習しにくい: 第5章で学んだように、調整できる数が多すぎるモデルは、訓練データを丸暗記してしまい、新しいデータで正解率が下がることがあります。重みの共有は、「どの位置でも同じ模様を探す」という画像に合った決まりを、最初からモデルに組み込んでいます。そのため、少ない重みでも画像の特徴をつかみやすくなります
よくある誤解
- 「CNNは、どんな場合でも普通のニューラルネットワークより正解率が高い」: 前のスライドのとおり、8×8の小さな画像では、正解率はほぼ同じでした。CNNの強みがはっきり出るのは、大きな画像や、模様の位置がばらばらなデータです。また、実験では、フィルターを8枚(重み810個)に減らすと、乱数の種によっては学習がうまく進まず、正解率が0.8台にとどまることもありました。少なければよいわけではありません
- 「重みの共有とは、フィルターどうしで重みを同じにすること」: 共有しているのは、1枚のフィルターの重みを、画像の すべての位置で 使い回すことです。16枚のフィルターは、それぞれ別の重みを持ち、別の模様を探します
- 「CNNの重みは、全部フィルターにある」: 手書き数字のCNNでは、重みの大部分(1,610個のうち1,450個)は最後の層にありました
振り返り
- 重みの共有: 1枚のフィルターを、画像のすべての位置で使い回す
- 畳み込み層の重みの数は「フィルターの大きさ × 枚数 + 枚数(バイアス)」で、画像の大きさに関係しない
- 手書き数字では、CNN(1,610個)は普通のニューラルネットワーク(2,410個)より少ない重みで、ほぼ同じ正解率になる
次のレッスンでは、最後の層が出す10個の点数を「確率」に変えるソフトマックス関数と、CNNの学習の仕組みを学びます。