Exponential Shaping Functions

Exponential Shaping Functions - Golan Levin and Collaborators ノート。区間 \({[0, 1]}\) を定義域とする指数関数型の整形関数が紹介されている。

Exponential Ease-In and Ease-Out

\[y = x^{a}.\]

いちばん一般的な指数関数だ。ここで定数 \(a \gt 0\) とする。\(0 \lt a \lt 1\) の整形曲線を ease-out, \(1 \lt a\) のそれを ease-in と呼ぶ。

この関数整形機能の実装では、制御引数 \(a\) により、設計者は関数を ease-out 形式から ease-in 形式へと変化させることができる。

実装の急所:

  • 引数リストは (float x, float a) とする。

  • いつものように入力 a の検証なり fail-safe 処理が要る。

  • 実装例では a を拡縮して曲線を強調する工夫がなされている(が、初めは真似しないほうが無難)。

Double-Exponential Seat

\[\begin{split}y = \begin{cases} \dfrac{(2x)^a}{2}, & 0 \lt a \lt 0.5,\\ 1 - \dfrac{(2(1 - x))^a}{2}, & 0.5 \le a \lt 1. \end{cases}\end{split}\]
  • 指数関数を二つ結合してシート状の関数を作る。

  • 三次関数よりもきれいな導関数を持ち、より連続的な制御を行うことができる。

  • CPU サイクルは高く付く。

  • 制御引数 \(a\) の推奨範囲は \({(0, 1)}\) だ。

  • これらの式は、後述の二重指数 sigmoid とよく似ている。

実装の急所:前項と同じ。

感想:コードにおける指数が数式と異なる。\(1 - a\) になっている。

Double-Exponential Sigmoid

\[\begin{split}y = \begin{cases} \dfrac{(2x)^{1/a}}{2}, & 0 \lt a \lt 0.5,\\ 1 - \dfrac{(2(1 - x))^{1/a}}{2}, & 0.5 \le a \lt 1. \end{cases}\end{split}\]
  • 本質的には前項の数式と同じ。同じようにニ倍にして反転させる方法を用いる。

  • 制御引数 \(a\)\((0, 1)\) の間で連続的に変化させることができるという利点があり、コントラストを調整する関数としてたいへん有用だ。

  • 多項式 sigmoid よりも計算コストが高く付く。

  • 二重指数シグモイドは \(a \approx 0.426\) のとき、Raised Inverted Cosine を 1 パーセント以内で近似する。

実装の急所:前項と同じ。

感想:コードにおける指数が数式と異なる。\(1 - a\) になっている。

The Logistic Sigmoid

いわゆる logistic 曲線は、有機物の成長やその他多くの自然現象をよく表していると多くの科学者が信じているエレガントな sigmoid 関数だ。

\[y = \cfrac{\cfrac{1}{1 + \mathrm{e}^{-2a(x - 1/2)}} - \cfrac{1}{1 + \mathrm{e}^{a}}} {\cfrac{1}{1 + \mathrm{e}^{-a}} - \cfrac{1}{1 + \mathrm{e}^{a}}}.\]
  • ソフトウェア工学では、ニューラルネットワークの信号応答関数の重み付けにしばしば用いられる。

  • 引数 \(a\) は成長率と考えられる。曲線の立ち上がり部分の傾きを調整する。 \({a = 0}\) の場合、この logistic 関数は恒等関数に縮退する。

  • ひじょうに自然な変化率。

  • 指数関数を多用するので計算コストが高く付く。

実装の急所

  • 引数 \(a\) に関する注意点はいつもどおり。

  • 分母と分子の第二項は共通なので、一度しか計算しないこと。