複素ニューラルネットワークの黎明期

今回は黎明期の複素ニューラルネットワーク、特に MLP などに適用される活性化関数が中心です。実は私の研究分野は連想記憶に偏っているため、複素ニューラルネットワーク全般の歴史は詳しくありません。複素ニューラルネットワーク[第2版](廣瀬明 著,サイエンス社) の方が詳しいでしょう。連想記憶については別に記事を書きます。歴史については知らなくても、現在主流となっているモデルを知っていれば研究には差し支えありません。

複素数値化の試み

実数で構成されていたニューラルネットワークを複素数で構成しようとした動機は分かりません。当時の研究者それぞれに考えがあったのでしょう。位相情報をニュールラネットワークで表現したいという応用上の理由は1つの目的だったようですが、単に理論を拡張してみたという研究者もいたでしょう。何を複素数値化すれば良いかというと、結合荷重と活性化関数です。ニューラルネットワークは多数のニューロンが結合したもので、各ニューロンが他ニューロンからの情報を入力和として受け取って、活性化関数で変換して出力します。結合荷重は単純に複素数にするだけですが、活性化関数の複素数値化はかなり難航しました。実数の場合は \( f(x)=\tanh(x) \) が良く使われます。これは階段関数

\( f(x) = \left\{ \begin{array}{ll} 1 & (x \geq 0) \\ -1 & (x < 0) \end{array}\right. \)

を連続関数で近似しています。さて、これをどのように複素数値化したらよいでしょうか。有界性、正則性(微分可能性)、位相情報の保存などが求められるでしょう。しかし、有界かつ正則な関数は定数に限るというリューヴィルの定理により、有界性と正則性の共存は早々に断念せざるを得ませんでした。何人かの研究者により幾つもの活性化関数が提案されました。正則な活性化関数を提案した研究者もいたようですが、最終的には正則性を捨てた活性化関数が生き残りました。大きく分けて2種類の活性化関数が使われています。複素ニューラルネットワーク[第2版](廣瀬明 著,サイエンス社) では、実部-虚部型 と 振幅-位相型 と呼んでいます。研究者によって呼び方は様々です。私は実部-虚部型をスプリット型と呼んでいますので、以下スプリット型と呼びましょう。また、振幅-位相型は簡単に位相型と呼びましょう。

スプリット型

スプリット型は同時期に複数の研究者が独立に提案したようです。1つの論文の中では1つの活性化関数だけが定義されて、位相型と区別する必要がなく、単に複素活性化関数(complex-valued activation function)などと呼ばれているかもしれません。\( f(x) \) を実数の活性化関数とします。\( f(x) = \tanh(x) \) がしばしば採用されます。複素数 \(z=x+iy\) に対して、スプリット型活性化関数は \( g(z) = f(x) + if(y) \) と実部と虚部に独立に実数の活性化関数を適用するだけです。\( \mathrm{arg} \, g(z) = \mathrm{arg}\, z \) は成り立たず、位相情報は完全には保存されません。実部と虚部の符号は保存されますので、複素平面上で象限は保存されます。

スプリット型は2つのニューロンの組み合わせと見ることもできます。実ニューロンから複素ニューロンに変更することは、ニューロン数を倍にして制限すれば実現出来ます。結合荷重を \( w = u+iv \) とすると、\( wz = (ux-vy) + i (vx+uy) \) となります。実部、虚部から実部への結合荷重をそれぞれ \( u,-v \)、虚部への結合荷重をそれぞれ \(v,u\) と考えれば、実部、虚部を独立したニューロンとして結合を制限したものになります。それでは、結合荷重に制限のないニューロン数2倍のニューラルネットワークにした方が良いと考えるかもしれませんが、必ずしもそうではなく、この制限が有効に働くこともあるようです。複素数の積は平面上の相似変換を表しますが、この性質が複素ニューラルネットワークには予め組み込まれているのです。この性質が有効な問題の場合には、複素ニューラルネットワークを採用することが有効です。

位相型

複素数を \(z=re^{i\theta}\) と極座標で表現します。\( r \geq 0\) で定義される関数 \( \varphi(r) \) を \( \varphi(0)=0 \) かつ単調増加な関数とします。\( \varphi(r) = \tanh( r ) \) が一例です。このとき、位相型の活性化関数は \( g(z) = \varphi(r) e^{i\theta} \) と表されます。\( \mathrm{arg}\,g(z) = \mathrm{arg}\,z \) が成り立ち、位相情報が保存されます。私は位相型と呼ぶのが簡明で良いと思いますが、位相型は \( g(z) = \frac{z}{|z|} \) であると査読者から修正を求められたこともあります。スプリット型よりも位相型の方が複素数値化らしいと感じますが、実用性となるとまた別の問題でしょう。