本文へスキップ
ひもとくAI

重みの共有と、重みの数

レッスン 5/7

同じフィルターを、画像全体で使い回す

レッスン2の図で、窓を9か所に動かしたとき、フィルターの9個の数は一度も変わりませんでした。1枚のフィルターを、画像のどの位置でも使い回しています。これを 重みの共有 と呼びます。

普通のニューラルネットワークとの違い

第6章の普通のニューラルネットワークでは、隠れ層のニューロン1つが、入力の64マス すべて と線でつながり、線1本ごとに別々の重みを持っていました。「左上のマスに掛ける重み」と「右下のマスに掛ける重み」は、まったく別の数です。

畳み込みでは、1枚のフィルターが見るのは、窓の中の9マスだけです。そして、窓がどこにあっても、同じ9個の重みを使います。

普通のニューラルネットワーク畳み込み
1つの計算が見る範囲画像の全部のマス窓の中の9マスだけ
位置ごとの重み位置ごとに別々どの位置でも同じ(共有)

なぜ、使い回してよいのか

レッスン1で、「縦の線は、画像の左上にあっても右下にあっても、同じ縦の線」だと説明しました。縦線を見つけるフィルターは、どこで使っても縦線を見つけられます。位置ごとに別の重みで覚え直す必要がないので、1枚のフィルターを使い回せるのです。

重みの共有がもたらす、2つのよいこと

  • 重みが少なくて済む: 1枚のフィルターの重みは9個だけです。画像が大きくなっても、この数は変わりません
  • ある位置で覚えた模様を、別の位置でも見つけられる: 学習データで左上にあった模様を覚えれば、テストの画像で右下にあっても、同じフィルターが反応します

次のスライドで、重みの数を実際に数えて、普通のニューラルネットワークと比べます。

重みの数を数えて比べる

手書き数字(8×8の画像、0〜9の10クラス)を見分ける2つのモデルの、重みとバイアスの数を数えます。数え方は、第6章と同じです。

第6章の普通のニューラルネットワーク(隠れ層32個)

  • 入力64個 → 隠れ層32個: 重み 64×32=204864 \times 32 = 2048 個、バイアス32個
  • 隠れ層32個 → 出力10個: 重み 32×10=32032 \times 10 = 320 個、バイアス10個

合計は 2048+32+320+10=24102048 + 32 + 320 + 10 = 2410 個です。

CNN(3×3のフィルター16枚)

CNNの計算は、次の順番です。

  1. 畳み込み層: 3×3のフィルター16枚。フィルター1枚に重み9個とバイアス1個(第6章のニューロンと同じく、内積の後に足す数)
  2. ReLU・プーリング: 重みはない。8×8 → 畳み込みで6×6 → プーリングで3×3が16枚、つまり 9×16=1449 \times 16 = 144 個の数になる(前のレッスンの演習)
  3. 最後の層: 144個の数を1列に並べて、第6章と同じ「全部の線がつながった層」で、10クラスの点数を計算する
  • 畳み込み層: 重み 9×16=1449 \times 16 = 144 個、バイアス16個
  • 最後の層: 重み 144×10=1440144 \times 10 = 1440 個、バイアス10個

合計は 144+16+1440+10=1610144 + 16 + 1440 + 10 = 1610 個です。

比べると

モデル重みとバイアスの数テストデータでの正解率
普通のニューラルネットワーク(隠れ層32個)2,4100.964
CNN(フィルター16枚)1,6100.936〜0.969

CNNの正解率に幅があるのは、学習を始める前の重み(乱数)の種を8通りに変えて、それぞれ学習させた結果だからです。重みの数が3分の2でも、ほぼ同じくらいの正解率になりました。

注目してほしいのは、画像を見る層の重み です。普通のニューラルネットワークの最初の層は2,080個(重み2,048個とバイアス32個)、CNNの畳み込み層は160個です。CNNの重みの大部分は、最後の層にあります。

画像が大きくなると、差はもっと広がる

1000×1000マスの画像を考えます。普通のニューラルネットワークの最初の層(隠れ層32個)は、重みだけで 1000000×32=32001000000 \times 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の学習の仕組みを学びます。

演習

演習を読み込んでいます…