これらの応用分野では、畳み込みは信号や画素をより望ましい値に変換するフィルタとしてしばしば行われる。
ハイスペックコンピューティングでは、畳み込みパターンはしばしばステンシル計算と呼ばれます。畳み込みには、通常、各データ要素に対して多数の算術演算が含まれます。各出力データ要素は、他の要素とは独立して計算できます。これは、並列コンピューティングにとって望ましい特性です。一方で、入力データの共有レベルは出力データ要素間でかなり高く、境界条件はやや課題があります。これにより、畳み込みは洗練されたタイル化方法と入力データのステージング方法の重要なユースケースとなります。
畳み込みは、各出力データ要素が入力要素の近傍の集合の重み付き和であるような配列演算です。重み付き和計算で使用される重みは、畳み込みカーネルとして一般的に呼ばれる入力マスク配列によって定義されます。これらのマスク配列を畳み込みマスクと呼ぶ。同じ畳み込みマスクが配列のすべての要素に通常使用されます。
以下は、5要素の畳み込みマスク配列Mが7要素の入力配列Nに適用される1次元データの畳み込み例を示しています。
画像処理とコンピュータビジョンでは、入力データは通常、x-y空間のピクセルを持つ2次元配列です。したがって、画像畳み込みは2D畳み込みです。マスクは正方形の配列である必要はありません。
1.1次元畳み込みから2次元畳み込みへ
1次元畳み込みをご存知ですか。
- 入力: 1次元配列(例:
[x0, x1, x2, ...]) - カーネル: 小さな1次元配列(例:
[w0, w1, w2]) - 演算:カーネルをスライドさせ、重み付き和を取る。
画像の場合、入力は2次元(高さ×幅)です。
- ピクセルの行列、形状は
H × W - カーネル: 小さな行列、例:
3 × 3または5 × 5 - カーネルを画像の各
3 × 3パッチの上に置き、要素ごとの乗算を行い、合計を取ることで1つの出力ピクセルを得る。
これはあなたがすでに知っているのと同じアイデアですが:
- 配列 → 2次元配列(行列)。
- 隣接する「要素」→ 2次元における隣接画素。
2.複数のチャンネル(例:RGB)
実画像は単なる2次元ではなく、多くの場合チャンネルを持っています:
- 形状:
H × W × C(例:R、G、Bの場合、C = 3)。 - さらに、カーネルも深さ ( C ) を持つ:
- 形状:
kH × kW × C
- 形状:
畳み込みステップ:
- 1つの位置では、小さな立方体
kH × kW × Cを取ります。 - カーネル
kH × kW × Cと要素ごとの乗算を行う。 - すべての値を合計する → 1つの数値(その位置における1出力チャンネルの値)。
概念的に言えば:空間とチャンネル上的の3D畳み込み、しかし依然として「隣接要素の加重和」である。
3.フィルター(カーネル)と特徴マップ
CNNでは、1つのカーネルだけを使うのではなく、多数のカーネルを使用します。
F個の異なるカーネルを使用すると仮定します。- 各カーネルの形状は
kH × kW × C_inです。 - 各カーネルは、特徴マップと呼ばれる1つの出力チャンネルを生成します。
したがって、入力形状が次の場合:
H × W × C_in
Fカーネルを使用すると、出力形状は次のようになります:
H_out × W_out × F
各々の F 個の出力チャネルは、異なる種類のパターンを捉えている。
- 1つのカーネルはエッジを検出することを学習し、別のカーネルは角を検出し、さらに別のカーネルはテクスチャを検出する。
考える: 「CNN層とは、入力に対して多数の異なる畳み込み(フィルタ)を適用すること。」
4.ストライドとパディング
配列に関する2つの詳細:
- ストライド: カーネルが各ステップで移動する距離。
- ストライド1:1ピクセルずつ移動 → 高密度出力。
- ステップ2: 1ピクセルおきにスキップ → 出力サイズが小さくなる。
- パディング: 画像の周囲にゼロを追加する。
- パディングなしでは、出力は小さくなります。
- パディングを使用すると、同じ高さ/幅を維持できます。
数学的には、これは依然としてスライディングウィンドウと内積に過ぎませんが、制御できるのは:
- あなたが滑る(歩幅)距離。
- ボーダー情報(パディング)が失われるかどうか。
5.非線形性:活性化関数の追加
これまで全て線形的だった:重み付き和。CNN層は非線形性を追加します:
- 畳み込み後、要素ごとに活性化関数を適用する (例:
ReLU(x) = max(0, x)).
したがって、単一の 畳み込み層 とは:
- 畳み込み(線形重み付き和)。
- 活性化(非線形)。
この組み合わせにより、CNNは複雑な非線形マッピングを学習できる。
6.層を積み重ねる → 深層特徴の階層構造
CNN全体は、単に多くの層から成るものです。
- 畳み込み → 活性化(→ 場合によってはプーリング)。
直感:
- 初期層: 単純な形状(エッジや斑点)を検出する。
- 中間層: それらをテクスチャや形状に組み合わせる。
- 後続のレイヤー: 形状を組み合わせ、オブジェクトの一部や物体として統合する。
これらはすべて、あなたが理解している同じプリミティブから構築されています: 「地域近傍を取り、重み付き和を計算する。」
7.完全に接続された(密な)層への接続
全結合層も重み付き和です:
- 1次元ベクトル。
- 出力ユニット = (重み × 入力)の合計 + バイアス。
違い:
- 密層:すべての出力ユニットは、すべての入力要素を使用します。
- 畳み込み層:各出力ユニットは局所的な近傍領域のみを使用し(スパース接続)、位置間で重みを共有する。
したがって、CNNを以下のように見ることができます:
- 畳み込み演算を賢く使って:
- 局所性(近傍の画素ほど重要度が高い)。
- 重み共有(すべての位置で同じカーネルを使用)。
- 完全画像における密な層よりも少ないパラメータ数。
結論:単純な操作から強力なネットワークへ
"At each position, take neighbors and compute a weighted sum with a kernel,"
すると、CNNの根底にある核心的な考えにすでに立っていることになります。
CNNは、その単純な構成要素を用いて:
- 1次元配列から2次元/3次元テンソルへと拡張する。
- 多くの異なるカーネルを並列に適用して、リッチな特徴マップを生成します。
- 純粋な線形性から逃れるために非線形性を加える。
- そのような層を多数積み重ね、各段階がより抽象的な構造「見る」ようにする。
CNNの魔法は、新しい種類の数学にあるのではなく、多くの小さな局所的な畳み込み演算を組み合わせ、強力な視覚表現を学習できる深層アーキテクチャを実現することにあります。