らんだむな記憶

blogというものを体験してみようか!的なー

畳み込み (3)

ここまでは畳み込みのついてストライドを考えずにきたが、仮にストライド $n$ の場合を考えると、離散的なものを無理矢理連続量として考えるので、あまり正確ではないが

$$
\begin{align*}
g(x) = (C_{n} f)(x) = \int_{|y-nx| \leq r} \!\!\!\!\!\!\!\!\!\!\!\! k(nx - y) f(y) dy
\end{align*}
$$

のような動きになる。ここで $2r+1$ はカーネルサイズのつもりである。一方、唐突に転置畳み込みを考えるとして、同じカーネル、同じストライド ($n$) で考えると、恐らく気持ち的には

$$
\begin{align*}
h(x) = \frac{1}{n} \int_{|x - y| \leq r} \!\!\!\!\!\!\!\!\! k(x - y) f\left(\frac{y}{n}\right) dy
\tag{1}
\end{align*}
$$

のようになっていると思われる。とは言え実際の実装ではゼロ埋めをして引き伸ばすので、連続的な引き伸ばしを想定した上記はあまり正しく表現はできていない・・・。まぁ、それはそれとして、(1) 式を以下で確認してみよう。

目的のために唐突だが演算子 $C_n$ の共役演算子 $C_n^*$ を考えたい。上記は綺麗に忘れて同じ記号を使いまわして、上記とは異なる関数 $f$, $g$ をとることにする。また、$\tilde{k}(x) = k(-x)$ とする。algebraic dual を考えて、

$$
\begin{align*}
\braket{C_n f, g} &= \int \left(\int_{|y-nx| \leq r} \!\!\!\!\!\!\!\!\!\!\!\! k(nx - y) f(y) dy \right) g(x) dx \\
&= \int \left(\int_{|nx - y| \leq r} \!\!\!\!\!\!\!\!\!\!\!\! k(nx - y) g(x) dx \right) f(y) dy \\
&= \int f(y) \left(\int_{|x - y| \leq r} \!\!\!\!\!\!\!\!\! \tilde{k}(y - x) g\left(\frac{x}{n}\right) \frac{dx}{n} \right) dy = \braket{f, C_n^* g}
\end{align*}
$$

を得る。ここで変数を置き直すと、

$$
\begin{align*}
(C_n^* f)(x) = \int_{|x - y| \leq r} \!\!\!\!\!\!\!\!\! \tilde{k}(x - y) f\left(\frac{y}{n}\right) \frac{dy}{n}
\tag{2}
\end{align*}
$$

となる。特にカーネルが対称な場合は $\tilde{k} = k$ であるので、

$$
\begin{align*}
(C_n^* f)(x) = \int_{|x - y| \leq r} \!\!\!\!\!\!\!\!\! k(x - y) f\left(\frac{y}{n}\right) \frac{dy}{n}
\end{align*}
$$

となる。これはまさに (1) 式である。

つまり画像処理で考えると、カーネルサイズが 3 ($r=1$) でストライドが $n=2$ だとすると、積分範囲が $|y -x| \leq 1$ つまり、$x$ に対して $y = x$ のピクセルと $y = x \pm 1$ のピクセルの値をとってくることになる。これは入力画像 $f$ に対しては $f\left(\frac{x}{2}\right)$ と $f\left(\frac{x \pm 1}{2}\right)$ となるので、ストライド分だけ引き伸ばされた画像の上に畳み込むようなイメージになる。信号強度についてもストライドの分だけ弱まった出力になる。実際、引き伸ばしの際に典型的にはゼロ埋めするので、畳み込みの後の値を 0 に寄ることになる。Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition [Book] の p.493 の Figure 14-27 を見てもそういう雰囲気に見える絵が載っているのでそういう感じのことであると思われる。

また、(2) 式より、$f$ の台(画像サイズ)が $|x| \leq R$ 程度とすると、$C_n^* f$ の第は $|x| \leq nR$ くらいまで広がっているので、ストライドの値を 1 より大きくとることでアップサンプリングの作用が得られることになる。

ということで、気持ち的には共役畳み込みとか双対畳み込みなのだが、実空間の行列演算で同種の計算では共役行列が転置行列になっているので・・・まぁ「転置畳み込み」と呼んでも問題はないだろう・・・。

GitHub - vdumoulin/conv_arithmetic: A technical report on convolution arithmetic in the context of deep learning のアニメーションとか参考になりそう。なお、一般に直交演算ではないので、流石に「逆畳み込み」という呼び方のほうは受け入れ難い。