深層学習

特殊な畳み込み

標準の畳み込みを空間範囲・出力解像度・サンプリング位置・チャネル重みの観点で変形する手法を整理します。

  • B|標準
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

特殊な畳み込みは、カーネルの形をそのまま増やすのではなく、見る範囲、出力の密度、サンプル位置、チャネルごとの強さを変える系統です。膨張畳み込み、転置畳み込み、変形可能畳み込み、SE block は名前が似ても変更点が異なります。

同じ虫眼鏡でも、離れた点を見る、像を大きく投影する、見る場所を動かす、色ごとの明るさを調整する、という改造は別物です。まず「空間のどこを変えたか」と「チャネルを変えたか」を分けます。

なぜ必要か

通常の小さなカーネルは局所性を保ちますが、広い文脈を取り込むには層を重ねるか、解像度を下げる必要があります。膨張畳み込みはカーネル点の間隔を空け、パラメータ数を増やさず受容野を広げます。一方、ダウンサンプリング後の特徴を画素密度へ戻す場面では、転置畳み込みが空間サイズを拡大します。

変形可能畳み込みは、固定された格子では物体の形や位置の変化を拾いにくい問題を狙います。畳み込みのサンプリング位置にオフセットを加え、そのオフセットを対象タスクから追加の教師なしで学習します。SE block は空間位置ではなくチャネル間の依存関係をモデル化し、チャネル応答を適応的に再較正します。

受容野を広げること、特徴マップを拡大すること、見る位置を変えることは別の操作です。サイズが大きくなっただけで膨張畳み込み、あるいは転置畳み込みと決めないでください。

仕組み

入力特徴を xx、カーネル重みを ww、基準位置を pp、カーネル内の相対位置を kk とします。膨張率 dd の膨張畳み込みは、参照位置を p+dkp+d k としてサンプルします。したがって、dd はパラメータ数ではなく点の間隔に効きます。

変形可能畳み込みでは、位置ごとのオフセット Δpk\Delta p_k を加え、サンプル位置を p+k+Δpkp+k+\Delta p_k とします。

y(p)=∑kw(k) x(p+k+Δpk)y(p)=\sum_{k} w(k)\,x\bigl(p+k+\Delta p_k\bigr)

y(p)y(p) は出力、w(k)w(k) は相対位置 kk の重み、Δpk\Delta p_k は学習されるオフセットです。位置が整数格子上にないときは補間が必要になります。転置畳み込みはこの式の単純な「逆演算」ではなく、学習可能なカーネルで空間方向へ展開する演算です。

SE block は特徴を空間方向に集約してチャネル記述を作り、その記述からチャネル重みを求めて元の特徴を再重み付けします。空間のサンプル位置を動かす変形可能畳み込みとは、作用する軸が違います。

変える対象手法直接の効果
点の間隔膨張畳み込み受容野を広げる
出力の空間配置転置畳み込み解像度を上げる
サンプル位置変形可能畳み込み入力形状に合わせて見る場所を変える
チャネルの強さSE blockチャネル応答を再重み付けする

試験でどう問われるか

問われ方正解に寄る条件引っかけ
膨張率の効果点の間隔を広げ、重み数を増やさず受容野を広げるカーネルの重み数も増える
転置畳み込みの説明学習可能な演算で空間サイズを拡大する「逆畳み込み」として厳密な逆演算とみなす
変形可能畳み込みオフセットを学習し、サンプリング位置を変えるカーネル重みだけを動的に変える
SE blockチャネル間依存を使って応答を再較正する空間上の座標を変形する

実装で確かめる

次の例では、同じ3点の重みを使い、膨張率だけを変えた参照位置を確認します。重みを増やさず参照範囲が変わる点が実装上の要所です。

import numpy as np
x = np.arange(9).reshape(3, 3)
w = np.array([1., 2., 1.])
p = 1
for d in (1, 2):
    pos = p + d * np.array([-1, 0, 1])
    valid = pos[(0 <= pos) & (pos < x.shape[1])]
    print(d, valid.tolist(), w[:len(valid)].size)

取り違えやすいもの

用語切り分け
膨張畳み込みサンプリング格子は固定で、点の間隔を広げる
転置畳み込み入力特徴を空間方向へ拡大する。逆畳み込みという名前だけで逆演算と判断しない
変形可能畳み込みオフセットを学習して、固定格子そのものをずらす
SE block畳み込みの位置ではなく、チャネル応答を再重み付けする
通常のアップサンプリング補間規則で拡大する。学習可能な畳み込み演算とは区別する

想起チェック

膨張率を上げると何が変わるか

カーネル点の間隔が広がり、重み数を増やさず受容野が広がります。

転置畳み込みを逆畳み込みと呼ぶときの注意点は

空間サイズを拡大する学習可能な演算ですが、通常の畳み込みを元に戻す厳密な逆演算ではありません。

変形可能畳み込みとSE blockの変更対象は何か

前者はサンプリング位置、後者はチャネルごとの応答の強さです。

出典