Fusic Tech Blog

Fusicエンジニアによる技術ブログ

【論文解説】Implicit Neural Representations with Periodic Activation Functions (SIREN)
2024/03/29

【論文解説】Implicit Neural Representations with Periodic Activation Functions (SIREN)

機械学習チームインターンのトシュコフです。本記事では、1年前に(2020年6月17日)にVincent Sitzmann らによって発表されたImplicit Neural Representations with Periodic Activation Functionsを解説します。

SIREN・画像の表現の比較

信号の連続表現のためのさまざまな活性化関数の比較。
出典:Implicit Neural Representations with Periodic Activation Functions

Sinusoidal representation networks (SIREN\textup{SIREN}s)は周期的なsinesine関数を利用して、フーリエ変換のような特徴が得られる、ニューラルネットワークです。これにより、SIREN\textup{SIREN}は連続信号を表現するのに表情に効率的で、自動的に導関数もフィッティングすることができます。

sinesineの活性化関数を使用してネットワークをトレーニングすることは、周期的な関数であるため困難であることがよく知られています。そこで、Vincent Sitzmannらは、層を伝搬する際の出力分布の一貫性が保証した初期化手法を提案しました。 これにより、sinesineの活性化関数を使用して深いモデルを学習出来るようになりました。

画像、動画、音声など自然信号を表現するネットワーク

一般的なネットワークと異なり、SIREN\textup{SIREN}入力は自然信号ではありません。ここでは、タイトルの通り出力を表す陰関数(ニューラル表現)を学習します。

SIREN・SIREN vs 畳み込みネット

SIREN\textup{SIREN}は位置エンコーディングから自然信号への射影です。入力が単純な(x,y)(x,y)座標や位置エンコーディングを含むものでも処理できます。sinesine関数を使用するため、出力は入力を自然信号に連続的に変換したものになります。

出力が連続的である事によって、SIREN\textup{SIREN}は、出力とその導関数に任意の制約を設定できます。例えば、実際の信号ではなく、導関数によって信号をフィッティングする場合、以下の式のようになります。

_xΦ(x)_xf(x)|\nabla\_x\Phi(x)-\nabla\_xf(x)|

詳細に関しては、勾配をロスとして使用した画像表現を参考にしてください。

活性化関数

SIREN\textup{SIREN}sinesineを利用しており、活性化関数は以下のようになります。

sin(ω_0Wx+b)sin(\omega\_0\cdot Wx+b)

ω_0\omega\_0は、正弦関数の周波数です。本記事の例と関連論文では、ω_0=30\omega\_0=30が使用されていました。この値は、アプリケーションによっては、変える必要があります。

一般的に、SIREN\textup{SIREN}は、出力に対応した一箇所を入力とし、例えば、画像の1つのピクセル位置を入力とします。その要素の位置によって、SIREN\textup{SIREN}がその位置の出力を予測します。

以下の例では、SIREN\textup{SIREN}に画像の\[100,120]\[100,120]にある画素の色、つまり、RGB値を予測します:

SIREN(\[100,120])=\[r,g,b]\textup{SIREN}(\[100,120]) = \[r, g, b]

画像の各画素に対して色を予測できれば、SIREN\textup{SIREN}がその画像の内部表現を獲得できています。

学習

sinesine関数の重要な特徴はsinesineの導関数がsinesine関数の位相がずれたものである事です。つまり、ネットワークの深さに関係なく、SIREN\textup{SIREN}の任意の次数の導関数が、同様にSIREN\textup{SIREN}になります。この利点により、任意の次数の導関数が使える上、勾配の消失や爆発問題を緩和することができます。

この特性により、ネットワークが学習されると、目的の出力信号だけでなく、その導関数にも適合します。 これにより、任意の導関数に任意の制約を設定することができます。M個の制約を考えると、以下のように損失の形で実装できます:

L=_Ω_m=1M1_Ω_m(x)C_m(a(x),Φ(x),Φ(x),...)dx\mathcal{L}=\int\_\Omega\sum\_{m=1}^M{1\_{\Omega\_m}(x) |\mathcal{C}\_m(a(x),\Phi(x),\nabla\Phi(x),...)| } dx

Ω_m\Omega\_mは制約が保持されるドメインで、1_Ω_m(x)=1,xΩ_m1\_{\Omega\_m}(x)=1, \forall x\in \Omega\_m1_Ω_m(x)=0,xΩ_m1\_{\Omega\_m}(x)=0, \forall x\notin \Omega\_mが成り立ちます。任意のC_m\mathcal{C}\_mは目的の出力とその導関数のミックスです。

このような制約は、3Dメッシュの表面を滑らかにするために使用されたり、実際の信号の代わりに勾配に従って自然信号の表現を学習できます。詳しくは適応例

微分を介して伝播する際に、sine関数の場合、失われる情報がほとんどないため、その微分のみを使用して、実際信号を推測できます。例えば、以下のロスを使えば、二次導関数(ラプラシアン)のみで、SIREN\textup{SIREN}が目標の出力に非常に近い信号を推測できます。定数+C+Cに関する情報は、無限の積分のために失われることに注意してください。

Llapl.=ΩΔΦ(x)Δf(x)dx\mathcal{L}*{lapl.}=\int*\Omega|\Delta\Phi(x)-\Delta f(x)|dx

出力とその導関数に制約を設定できる事がSIREN\textup{SIREN}の最も強力な特性だと思います。

特別な初期化

活性化関数であるReLU\textup{ReLU}GELU\textup{GELU}, Sigmoid\textup{Sigmoid}, tanhtanhとは対照的に、sinesineは周期関数で正と負の勾配の間隔が周期的です。これにより、ネットワークを深く伝播するときに不安定性が生じます。SIRENでは、以下のように重みを注意深く初期化すること、この問題を軽減しています:

第一層の初期化:

w_0U(1/n,1/n)w\_0\sim \textup{U}(-1/n, 1/n)

nnが入力チャンネル数です。

第二層以降の初期化:

w_iU(6/nω_0,6/nω_0)w\_i\sim \textup{U}(-\frac{\sqrt{6/n}}{\omega\_0}, \frac{\sqrt{6/n}}{\omega\_0})

一様分布を使う理由は、非線形性によりsine関数の前に正規分布の出力が得られ、sinesineを適用した後にarcsinearcsine分布の出力が得られるためです。 \[6/nω_0,6/nω_0]\[-\frac{\sqrt{6/n}}{\omega\_0}, \frac{\sqrt{6/n}}{\omega\_0}]の境界を使用すると、ネットワークの深さに関係なく、SIREN\textup{SIREN}の特性が確実に保持されます。

特性

sinesine関数からなるSIREN\textup{SIREN}は、フーリエの変換のような仕組みになります。各sinesineの周波数とシフトのパラメータだけを設定すれば、好きな自然信号を記述できます。

自然な連続信号とその導関数に対するSIREN\textup{SIREN}の適合性のおかげで、他の活性化関数と比較して、大幅に速く収束します。

SIREN・画像の表現の比較 SIREN・画像の表現のロス


SIRENによって学習された連続表現を利用すれば、任意の位置でピクセル値を生成できます。出力の解像度や境界に制約が全くないです。

以下の256×256256\times256画素の写真を考えます:

チェスの駒

以下の1024×10241024\times1024画素の画像を2枚生成します。元の画像のxx座標とyy座標が\[1,1]\[-1,1]の範囲にあると考えると、左の画像の範囲は\[0.5,0.5]\[-0.5,0.5]で、右の画像の範囲は\[2,2]\[-2,2]です:

補間 \[0.5,0.5]\[-0.5,0.5]外挿 \[2,2]\[-2,2]
チェスの駒・補間チェスの駒・外挿

補間は得意ですが、外挿はそこまで得意ではないようです。

任意の位置でピクセル値を生成できるため、元の入力の解像度を上げることができます。sinesineの滑らかな性質のおかげで、2つのピクセル間で、ノイズの少ない補間を生成出来ます。

連続表現を使用すると、信号の元の境界を超えて、写真に写っている境界の外にある位置にピクセルを生成できます。ただし、追加の制約なしのSIREN\textup{SIREN}を使うと、境界を超え、元の信号の外を予測する結果が良くないです。

応用例

SIREN\textup{SIREN}は、画像やビデオ、3Dオブジェクト、オーディオなど、任意の自然信号で使用できます。

SIREN\textup{SIREN}は、任意の位置エンコーディングを自然信号に変換するために使用されています。論文から3つの例を紹介します。ビデオやオーディオなど、その他の使用例についてはImplicit Neural Representations with Periodic Activation Functions (vsitzmann.github.io)

SIRENのもう一つの使用法については、ViTGANという名前の次回書く予定の記事で紹介します。

勾配を損失として使用した画像表現

実際の目標に基づいた損失:

L=_ΩΦ(x)f(x)dx\mathcal{L}=\int\_\Omega|\Phi(x)-f(x)|dx

の代わりに、勾配、つまり1次導関数を用いた損失:

Lgrad.=Ω_xΦ(x)_xf(x)dx\mathcal{L}*{grad.}=\int*\Omega|\nabla\_x\Phi(x)-\nabla\_xf(x)|dx

に基づいて学習できます。

または、ラプラシアン、つまり2次導関数の損失:

Llapl.=ΩΔΦ(x)Δf(x)dx\mathcal{L}*{lapl.}=\int*\Omega|\Delta\Phi(x)-\Delta f(x)|dx

に基づいて学習できます。

さまざまな解があるため、積分を計算すると、_xf(x)\nabla\_xf(x)で色の強度が失われます。Δf(x)\Delta f(x)を使用すると、より多くのローカル情報が失われます。SIREN\textup{SIREN}を使用すると、この弱点を乗り越えて、いい結果が得られます。

また、勾配を使った損失で学習した場合、画像の勾配の加重和にフィットすることで、複数の画像の組み合わせを推定できます。:

Poisson画像再構成

3D再構成

SIREN\textup{SIREN}のもう1つの興味深い応用技術は、点群に基づいて3Dオブジェクトの再構成です:

3D再構成


3Dオブジェクトを生成するために使用される損失関数は、表面外の点にペナルティを課し、空間勾配_xΦ|\nabla\_x\Phi|のノルムを11に制約します:

Lsdf=Ω_xΦ(x)1dx+_Ω_0Φ(x)+(1_xΦ(x),f(x))dx+_ΩΩ_0exp(αΦ(x))dx\mathcal{L}*{sdf} = \int*\Omega{||\nabla\_x\Phi(x)|-1|dx}+\int\_{\Omega\_0}|\Phi(x)|+(1-\langle \nabla\_x\Phi(x),\nabla f(x) \rangle)dx + \int\_{\Omega\setminus\Omega\_0}{\textup{exp}(-\alpha\cdot|\Phi(x)|)}dx

画像のピクセルの部分集合から画像の一般化へ

画像修復図


SIREN\textup{SIREN}を単独で使用すると、単一の出力のみを表すことができます。ただし、入力の潜在空間のベクトルをSIRENの重みにマッピングするハイパーネットワークとして、ReLU\textup{ReLU}を用いた畳み込みネットワーク(CNN)と組み合わせて、使用できます。

以下は、SIREN\textup{SIREN}と組み合わせて画像エンコーダーを使用した結果です。 エンコーダーは、入力画像、またはピクセルの部分集合を、画像から潜在空間表現に変換し、それがSIREN\textup{SIREN}の重みに変換されます。

画像修復結果

まとめ

SIREN\textup{SIREN}ネットワークは、位置エンコーディングを入力として受け取り、画像、ビデオ、サウンド、3Dオブジェクトなどを含む自然な連続信号を出力します。

sinesine波の組み合わせとして単一の入力を表すために単独で使用できます。または、ニューラルネットワークを学習して、目的の出力を再現するためにSIREN\textup{SIREN}の重みを推測することもできます。または、位置エンコーディングと何かのエンベディングの組み合わせを使用して、条件付き出力を直接生成するようなネットワークも学習できます。

私の意見では、SIREN\textup{SIREN}ReLU\textup{ReLU}や他の活性化関数の代替と見なされるべきではないと思います。代わりに、従来の活性化関数と組み合わせて使用すべきだと思います。

最適な結果を得るには、入力位置のエンコードのスケールやとω_0\omega\_0をアプリケーションに応じて合わせるする必要があると思います。

Teodor TOSHKOV

Teodor TOSHKOV

I am an intern at Fusic, a company in Fukuoka, Japan. From 2022, I will be joining the Machine Learning team. I develop mostly deep learning models, using PyTorch and Tensorflow.