設定
ここでは 4 変数の affine coupling layer でのヤコビアンの計算を示す.
ϕ=ϕ1ϕ2ϕ3ϕ4∈R4
が変換によって
φ=φ1φ2φ3φ4∈R4
として得られたとする:
φeφo=exp(s(ϕo))⊙ϕe+t(ϕo),=ϕo
ここで s, t は ϕo を入力として受け付ける写像 R2→R2 である. ϕe, φe, ϕo, φo などは添え字が偶数か奇数かで分類したものとする:
ϕo=[ϕ1ϕ3]ϕe=[ϕ2ϕ4],φo=[φ1φ3],,φe=[φ2φ4].
この時ヤコビアン ∂φi/∂ϕj の絶対値が計算したい. 変換を真面目に式で成分でかくと
φ1φ2φ3φ4=ϕ1,=exp(s(ϕo)1)ϕ2+t(ϕo)1,=ϕ3,=exp(s(ϕo)2)ϕ4+t(ϕo)2
のようになる. s(ϕo)i は s(ϕo)∈R2 の i 番目の成分である t(ϕo)i についても同様. 偏微分の計算を真面目にすると次のようになる:
∂ϕ1∂φ1=1,∂ϕ1∂φ2=⋆,∂ϕ1∂φ3=0,∂ϕ1∂φ4=⋆, ∂ϕ2∂φ1=0, ∂ϕ2∂φ2=exp(s(ϕo)1), ∂ϕ2∂φ3=0, ∂ϕ2∂φ4=0, ∂ϕ3∂φ1=0, ∂ϕ3∂φ2=⋆, ∂ϕ3∂φ3=1, ∂ϕ3∂φ4=⋆, ∂ϕ4∂φ1=0, ∂ϕ4∂φ2=0, ∂ϕ4∂φ3=0, ∂ϕ4∂φ4=exp(s(ϕo)2),
ここで ⋆ と書いた部分は後の計算で明示的に計算する必要のない項なので表記をサボっている.
∂ϕ∂φ=det1⋆0⋆0exp(s(ϕo)1)000⋆1⋆000exp(s(ϕo)2)
さて,行列式は対象となる行列の行どうしの置換, 列どうしの置換では符号を除いて同じだった. 今回欲しい情報は det の絶対値だ!!! 入れ替えし放題である.
2, 3 列目を置換した後, 2, 3 行目を置換すると次のように変形できる:
1⋆0⋆0exp(s(ϕo)1)000⋆1⋆000exp(s(ϕo)2)→1⋆0⋆0⋆100exp(s(ϕo)1)0⋆000exp(s(ϕo)2)→10⋆⋆01⋆000exp(s(ϕo)1)⋆000exp(s(ϕo)2)
このようにして det を計算とする行列を下三角行列に変換できた. つまり対角成分のみを計算すれば良い. これによって ∣det∙∣ を計算すると
i∏exp(s(ϕo)i)
を計算すれば良い. つまり exp(s(ϕo)) をプログラムで記述してその成分の積を計算すれば良い. NumPy ユーザーであれば np.prod
, np.exp
などの部品を使えば容易に記述できる. もちろん Julia でも可能である.
Discussion