ステータス:ドラフト(2026-10-13)、一部実測。 例はノートPCのCPU(Python 3.9、numpy 2.0)で直接実行した値です。コードはこのフォルダの
code/01_conv.pyにあり、数秒で完了します。論文の数値は原文を開いて条件とともに転載しました。 作成ルール:実測データが基本であり、測定できなかったものは「未実測」と表示します。
目次
- 1. なぜ画像には特別な構造が必要なのか
- 2. 畳み込み:小さな窓を動かして掛け合わせて足す
- 3. フィルターは手動で決めない:損失、逆伝播、勾配降下
- 4. プーリングと受容野:1つのセルが見る範囲
- 5. LeNet-5(1998):畳み込み+プーリング+逆伝播の原型
- 6. AlexNet(2012):同じ考え方、異なる規模
- 7. 限界
- 8. 我々のプロジェクトとのつながり
- 参考文献
1. なぜ画像には特別な構造が必要なのか
スマホの写真1枚は数百万個の数値(ピクセル)です。これを通常のニューラルネットワーク、すなわち 全結合層(すべての入力がすべての出力と結合された層)に入れると、結合数が爆発します。32×32のモノクロ画像を28×28サイズの特微マップ6枚に変換する1つの層だけでもそのようになります。
| 方式 | 学習する数値(重み) |
|---|---|
| 全結合層 | 4,821,600個 |
| 5×5畳み込みフィルター6個 | 156個 |
(直接計算、 code/01_conv.py [5]. 畳み込みはフィルター6個 × (25 + バイアス1)。)
3万倍の差が出る理由は、画像にある2つの性質のためです。
- 近いピクセル同士の関係が深い(局所性)。 ボールの輪郭を認識するのに反対側の端のピクセルは必要ありません。
- 同じ模様はどこにあっても同じ模様である(平行移動に対する同等性)。 画面の左側のボールと右側のボールは同じ方法で見つければよいのです。
畳み込みは、この2つの仮定を構造に組み込んだ演算です。小さな窓だけを見て(局所性)、同じフィルターを画像全体で使い回します(重みの共有)。この「仮定を構造に組み込むこと」を 帰納バイアスと呼びますが、第7回でVision Transformerがまさにこれを捨てたことでどのような代償を払うのかを確認することになります。
2. 畳み込み:小さな窓を動かして掛け合わせて足す
計算は単純です。3×3のフィルター(数値9個)を画像の3×3の窓に重ねて同じ位置同士を掛け合わせ、すべて足し合わせると出力の1つのセルが求められます。窓を1つずつ動かしながら繰り返すと出力マップが完成します。
# code/01_conv.py 에서
def conv2d(x, k):
kh, kw = k.shape
out = np.empty((x.shape[0] - kh + 1, x.shape[1] - kw + 1))
for i in range(out.shape[0]):
for j in range(out.shape[1]):
out[i, j] = np.sum(x[i:i + kh, j:j + kw] * k)
return out
左半分が0(暗い)、右半分が1(明るい)の6×6の画像に垂直エッジフィルター(ソベルフィルター)を適用するとこうなります(実測)。
필터 출력(4×4)
[-1 0 1] [0 4 4 0]
[-2 0 2] [0 4 4 0]
[-1 0 1] [0 4 4 0]
[0 4 4 0]
明るさが変わる境界だけで4、残りは0です。フィルターは「このような模様がここにあるか」という質問であり、出力マップはその質問に対する答えを画像全体に展開したものです。実際のネットワークでは1つの層にこのようなフィルターを数十〜数百個配置し、それぞれのフィルターが異なる模様(水平エッジ、対角線、色の塊など)を探します。
ちなみに、ディープラーニングのフレームワークが「畳み込み」と呼ぶものは、数学の教科書の畳み込みとは異なり、フィルターを反転させない 相互相関です。フィルターはどうせ学習によって決定されるため、反転させるかどうかによる違いはありません。
3. フィルターは手動で決めない:損失、逆伝播、勾配降下
かつてのコンピュータービジョンでは、上記のソベルフィルターのように人間がフィルターを設計していました。CNNの本質は フィルターの数値をデータから学習するということです。学習の方法は3つのステップです。
- 損失関数:現在のフィルターで生成した出力が正解とどれほど異なるかを一つの数値で測定します。ここでは平均二乗誤差(MSE)です。
- 逆伝播:フィルターの9個の数値それぞれをわずかに変更した場合に損失がどれほど変化するか(勾配)を計算します。畳み込みの場合、「出力誤差」と「入力」を再度畳み込むことでフィルターの勾配が得られます。
- 勾配降下:勾配とは反対の方向にフィルターを少し動かします。
k ← k − 학습률 × 기울기.
# code/01_conv.py 에서 — 필터 k 의 기울기
for x, y in zip(X, Y):
err = conv2d(x, k) - y # 출력 오차
for a in range(3):
for b in range(3):
g[a, b] += np.mean(2 * err * x[a:a + err.shape[0], b:b + err.shape[1]])
k -= lr * g
やってみる:ランダムフィルターがソベルフィルターになるまで
ランダムな画像32枚をソベルフィルターに通して「正解出力」を作成し、正解フィルターは教えずにランダムなフィルター(平均0、標準偏差0.1)から出発して学習率0.1で勾配降下を行いました(実測、ノートPCのCPUで約6秒)。
| ステップ | 損失(MSE) |
|---|---|
| 0 | 1.064 |
| 10 | 0.730 |
| 50 | 0.193 |
| 100 | 0.037 |
| 200 | 0.0013 |
| 500 | 0.000000 |
500ステップ後に学習されたフィルターは [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]] であり、正解との最大誤差は0.0005でした。人間が「垂直エッジを探せ」と言わなかったにもかかわらず、データがそのようなフィルターを要求したため、フィルターがその形状になったのです。実際のCNNの最初の層のフィルターを画像として可視化すると、エッジや色の模様の形状が現れるのも同じ理由です。
逆伝播で求めた勾配が正しいかどうかは、 数値微分(1つの数値をほんの少しだけ変更して損失の変化を直接測定する方法)と比較して確認しました。最大相対誤差は6.4×10⁻¹¹で一致していました。自作の学習コードを信頼する前に常に試してみる価値のあるテストです。
4. プーリングと受容野:1つのセルが見る範囲
畳み込みの1層の出力の1つのセルは、入力を3×3しか見ません。ボール全体や選手の腕を認識するためには、より広範囲を見る必要があります。方法は2つあります。
- 層を重ねる。 3×3の上に3×3を重ねると、上の層の1マスは下の層の3×3、すなわち入力の5×5を見ます。
- 小さくする(プーリング・ストライド)。 2×2マスを1つにまとめると(最大値または平均)、同じフィルターが2倍広い範囲を見ます。
出力の1マスが入力から影響を受ける範囲を 受容野と呼びます。層ごとに r ← r + (커널 − 1) × j, j ← j × 보폭 で計算します(j は累積ストライド)。LeNet-5とAlexNetの構成で計算するとこうなります(直接計算、 code/01_conv.py [4]).
| ネットワーク | 層を通過する受容野(px) | 最後 |
|---|---|---|
| LeNet-5 | 5 → 6 → 14 → 16 → 32 | 入力32×32全体 |
| AlexNet | 11 → 19 → 51 → 67 → 99 → 131 → 163 → 195 | 入力224×224の大半 |
プーリングには代償があります。解像度を下げると、 正確な位置を失います。分類(「この絵に猫がいるか」)には問題ありませんが、ボールの座標をピクセル単位で知る必要がある仕事には致命的です。第3部(U-Net・HRNet)まさにこの問題を扱います。
5. LeNet-5(1998): 畳み込み + プーリング + 逆伝播の原型
LeCunらの1998年の論文は、手書き数字(MNIST)を読み取るLeNet-5を紹介しました。入力は32×32のモノクロです。データの数字は大きくても20×20で28×28マスの真ん中に置かれていますが、入力をそれより意図的に大きく取りました(上記の受容野計算で最後の層が入力32×32全体を見るという点と噛み合います)。
- 構造: 畳み込み(C1)→ サブサンプリング(S2)→ 畳み込み(C3)→ サブサンプリング(S4)→ 畳み込み(C5)→ 全結合 → 出力。入力を除いて7層です。
- サイズ: 結合は340,908個ですが、 学習する数値は約6万個です。重み共有のおかげです。
- 結果(論文): MNISTテストセットの誤り率 0.95%。学習データ6万枚に幾何学的変形(移動・拡大・歪み・傾き)で作った54万枚を加えると、 0.8% に下がりました。
この論文が示したのは、「特徴を人が設計せず、畳み込み構造と逆伝播によって最初から最後まで学習できる」ということです。しかし、1998年の計算力とデータでは、手書きのように小さく綺麗な絵を越えるのは困難でした。
6. AlexNet(2012): 同じ発想、異なる規模
14年後、Krizhevsky・Sutskever・HintonのAlexNetがImageNetコンペティション(ILSVRC、1000クラス、学習画像約120万枚)で大差をつけて勝利しました。構造の発想はLeNetと同じです。変わったのは規模といくつかの学習手法です。
| 項目 | AlexNet(論文) |
|---|---|
| サイズ | パラメータ6,000万個、ニューロン65万個、畳み込み5層 + 全結合3層 |
| 入力 | 224×224×3 |
| 学習 | 当時デスクトップGPU(メモリ3GB)2枚にネットワークを分けて載せ、5〜6日、120万枚を約90回 |
| ILSVRC-2012テスト top-5 誤り率 | 15.3%(CNN 7個のアンサンブル)対 2位 26.2%。1モデルは検証セット18.2% |
| ILSVRC-2010テスト | top-1 37.5%、top-5 17.0%(テスト時の切り抜き10個の平均) |
「top-5 誤り率」とは、モデルが選んだ上位5つの答えの中に正解が含まれていない割合です。15.3%がアンサンブルの数値である点は、よく見落とされる条件です。
何が違いを生んだのか、論文が直接測定したものを見ると「なぜこのように設計したのか」が見えてきます。
- ReLU. 活性化関数をtanhの代わりに
max(0, x)に変えると、4層CNNがCIFAR-10で学習誤り率25%に到達する速度が 6倍 速くなりました(論文の図1)。tanhは値が大きいと勾配が0に近づきますが、ReLUは正の側の勾配が常に1です。大きなネットワークを限られた時間で学習するには、この違いが決定餌でした。 - データ拡張。 256×256の画像から224×224をランダムに切り抜き、左右反転して学習データを事実上2048倍に増やしました。色を主成分方向に揺らす拡張は、top-1誤り率を1%以上減らしました。拡張がなければ、6,000万のパラメータがデータを丸暗記してしまうと論文では説明しています。
- ドロップアウト。 学習中、全結合層のニューロンを確率0.5でオフにします。ニューロン同士が依存し合うのを防ぎ、過学習を減らします。代わりに収束にかかる反復がおよそ2倍になりました。
- オーバーラッププーリング(ウィンドウ3、ストライド2)はtop-1/top-5誤り率を0.4%/0.3%、 局所的応答正規化は1.4%/1.2%減らしました。局所的応答正規化は、その後のバッチ正規化(第2部)に押されてほとんど使われません。
- GPU. 畳み込みは同じ計算を数え切れないほど繰り返すため、GPUの並列演算と相性が良いです。メモリが足りず、ネットワークを2つのGPUに半分ずつ分けて載せたこともこの論文の有名な点です。
まとめると、AlexNetの教訓は「1つの新しいアイデア」ではなく、 大容量データ + 高速計算 + 大きなネットワークを学習可能にする手法の組み合わせです。その後の10年のビジョンモデルのほとんどはこの公式の上に成り立っています。
7. 限界
- 位置を失う。 プーリングを繰り返すと分類には良いですが、精密な位置がぼやけます(第3部)。
- 深く積み重ねにくい。 AlexNetは8層でした。さらに深く積み重ねるとかえって学習が進まない問題があり、これを解決したのがResNetです(第2部)。
- 大量のラベルが必要となる。 ImageNetのように、人間がラベル付けした画像が数十万〜数百万枚必要でした。ラベルなしで学ぶ方法は、自己教師あり学習を扱う姉妹編で解説しています。
- サイズや回転には弱い。 畳み込みは位置の移動には強いものの、物体が大きくなったり回転したりすることは構造上保証されません。そのため、データ拡張によって学習させます。
8. 我々のプロジェクトとのつながり
TT Scoreのボール検出モデル(WASB・BlurBall)は2026年においても 畳み込みニューラルネットワークです。その理由は、この記事の内容そのものです。
- ボールは小さく(モデルの入力で直径3pxほど)、激しくブレます。そのようなパターンを見つけるには、「小さなウィンドウ + 重み共有」という帰納バイアスがよく適合します。
- パラメータ数約150万個の小さなネットワークで十分であり、1つのフレームを10.5msで処理します(サーバーGPU実測値)。リアルタイム判定においては、この速度が精度と同じくらい重要です。
詳細な構造と実測値については「TT Scoreモデル解剖編2:ボール検出」にあります。次の記事は、深いネットワークの学習を可能にした残差接続とバッチ正規化です。
TTの一言。 フィルターに「縦の境界線を探して」と指示した覚えはないのに、500ステップでソーベルフィルターになりました。データが求める形へと、フィルターが自ら変化するのです。
参考文献
- LeCun, Y., Bottou, L., Bengio, Y., Haffner, P. (1998). Gradient-Based Learning Applied to Document Recognition. Proceedings of the IEEE, 86(11), 2278–2324. https://doi.org/10.1109/5.726791
- Krizhevsky, A., Sutskever, I., Hinton, G. E. (2012). ImageNet Classification with Deep Convolutional Neural Networks. NeurIPS 2012. https://papers.nips.cc/paper_files/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html
- サンプルコードと出力:このフォルダーの
code/01_conv.py,code/01_conv.out.txt