これらの応用分野では、畳み込みはシグナルやピクセルをより望ましい値に変換するフィルタとして実行されることがよくあります。
ハイパフォーマンスコンピューティングでは、畳み込みパターンはスタンシル計算と呼ばれることがよくあります。畳み込みには、通常、各データ要素に対して大量の算術演算が含まれます。各出力データ要素は、他の要素から独立して計算できます。これは、並列コンピューティングにとって望ましい特性です。一方で、入力データの共有レベルは出力データ要素間でかなり高く、境界条件も多少挑戦的です。これにより、畳み込みは、洗練されたタイル化方法や入力データのステージング方法の重要なユースケースとなります。
畳み込みは、各出力データ要素が隣接する入力要素のコレクションの加重和である配列操作です。加重和計算で使用される重みは、入力マスク配列によって定義され、一般に畳み込みカーネルと呼ばれます。これらのマスク配列を畳み込みマスクと呼びます。通常、配列のすべての要素に対して同じ畳み込みマスクが使用されます
以下は、5 要素の畳み込みマスク配列 M が 7 要素の入力配列 N に適用された 1 次元データの畳み込み例です。
画像処理とコンピュータビジョンでは、入力データは通常、x-y 空間のピクセルを持つ 2 次元配列です。画像の畳み込みは、したがって 2 次元畳み込みです。マスクは正方形の配列である必要はありません。
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(例:C = 3for R、G、B)。 - すると、 カーネル も深さを持つ
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. ストライドとパディング
配列関連の詳細:
- ストライド: カーネルを各ステップでどれだけ移動するかを決定します.
- ストライド1: 1ピクセルずつ移動 → 密な出力.
- ストライド2: それぞれのピクセルを飛ばす → 小さい出力.
- パディング: 画像の周囲にゼロを追加します.
- パディングなしでは、出力が小さくなります.
- パディングありでは、同じ高さ/幅を維持できます.
数学的には、スライディングウィンドウとドット積だけですが、以下を制御できます:
- スライドする距離 (ストライド).
- ボーダー情報を失うかどうか (パディング).
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次元テンソルへ拡張します.
- 多種多様なカーネルを並列に適用して豊富な特徴マップを生成する.
- 非線形性を追加して純粋な線形性から脱却する.
- 多くの such レイヤーを積み重ねて各段階でより抽象的な構造を「見る」ようにする.
CNN の魔力は新しい種類の数学ではなく、多くの小さな局所的な畳み込み演算を深いアーキテクチャに組み合わせて強力な視覚的な表現を学習することである.