読者です 読者をやめる 読者になる 読者になる

ばぐばぐわーるど

Pythonなどなど

畳み込みのお話 ~なぜ、あんな式なのか~

唐突に畳み込みの話をします。

まずはこの式を見てもらいます。

(f*g)(t)= \int f(\tau)g(t-\tau)d\tau

すごく・・・意味不明です・・・

これはWikipedia畳み込み - Wikipediaの説明で一番最初に出てくる式です。

まあ、意味不明なのは置いといてそういう計算があるものだとしましょう。

次にWikipediaの畳み込みの記事のGIFアニメを見てください。

f:id:jum12:20140205211101g:plain

なんか四角いのが左から走ってきてます。
wikipediaの解説によると下が畳み込みの結果みたいです。

じーっと5分くらいみてるとなんとなくわかってきます。
畳み込みの結果がtの関数になってるので、下の三角形の横軸はtだなー
てことは上は\tau軸なんだなー
確かに重なった面積がその瞬間の畳み込みの値になってるんだなーって。

で、もっかい式を見てみます。

あれ? なんか変じゃね?

なんというかこのアニメーションを見る限り直感的にこういう式であってほしいんです。

(f*g)(t)= \int f(\tau)g(\tau-t)d\tau
これならg(\tau)がだんだん右に行くっていうのが分かる気がするけど、畳み込みの式をみたらg(t-\tau)になってます。

これってわざわざg(\tau)を左右反転させてるってことですよね。今は正方形だから関係ないけど、本当は反転してるってことですよね? 謎過ぎる。
というわけで、テーマはなんで畳み込みは反転させたやつを掛けるのかって話です。

総和の畳み込み

連続の畳み込みを考えても難しそうなので、まずは離散の畳み込みを考えてみます。
wikiによると、畳み込みってこんな定義です。
(f*g)(m)=\sum_{n=0}^{} f(n)g(m-n)
※勝手にn=0から始めることにしてます。

これは具体的に書くとこんな感じです。
m=0のとき
(f*g)(0)=f(0)g(0)
m=1のとき
(f*g)(1)=f(0)g(1)+f(1)g(0)
m=2のとき
(f*g)(2)=f(0)g(2)+f(1)g(1)+f(2)g(0)
m=3のとき
(f*g)(3)=f(0)g(3)+f(1)g(2)+f(2)g(1)+f(3)g(0)
m=4のとき
(f*g)(4)=f(0)g(4)+f(1)g(3)+f(2)g(2)+f(3)g(1)+f(4)g(0)
要するに足してmになるような2つの自然数の組を集めてきて、それをf,gに入れ、足してるってことですね。
どっかで見たことあるような計算です。
これとか\sum_{k=0}^{n} {}_n\mathrm{C}_k{p^k}{q^{n-k}}

インテグラルのほうの畳み込みも考えてみる

(f*g)(t)= \int f(\tau)g(t-\tau)d\tau
0.01より下は小さすぎるから無視できることにします。あと負の範囲は考えてません。
t=0のとき
(f*g)(0)=f(0)g(0)d\tau
t=0.1のとき
(f*g)(0.1)=f(0)g(0.1)d\tau+f(0.01)g(0.09)d\tau+f(0.02)g(0.98)d\tau+\dots+f(0.09)g(0.01)d\tau+f(0.1)g(0)d\tau
こんな感じのノリでしょう。


次にこんな感じの関数を考えてみます。線が見えてる部分以外は0と思ってくださいf:id:jum12:20140205222119g:plain
とっても図が見難くて申し訳ないのですが、言いたいことが伝わるでしょうか。上記の例から掛け合わされる部分は下図のような対応関係にあるはずです。
f:id:jum12:20140205223816g:plain
例えばf(0.02)のとき、f(0.02)g(0.08)d\tauを考えるのでg(0.08)が対応しています。
矢印で対応しているところを掛けて足すってことを繰り返しまくればt=0.1の畳み込みが求まるはずです。

もし、この矢印のねじれをとればもっと楽にこの図を書けそうなんですが、どうしたらいいでしょうか。
そうですね。右に0.1平行移動させて反転させれば良さそうです。
f:id:jum12:20140205225526g:plain
この図なら垂直に対応してくれてます。そのまんま掛けたf(\tau)g(0.1-\tau)積分すればt=0.1での畳み込みが求まります。
今はt=0.1でやりましたが、t=0.2のときは0.2右に動かして反転させればOKです。
あとはあらゆるtについて計算(tを増やす。すなわちg(-\tau)が右に動いていくたびに同じことする)するだけです。
つまり、これが反転させたやつを掛ける理由です。



最後に断っておきますが、この解釈で正しいかは保障しません。ただ、こんだけグダグダ考えれば、定義を忘れることはないかも