0

ソフトマックス関数と数値微分

155
0
$$$$

はじめに

本記事は Mathlog Advent Calendar 2021 12/13 の記事です.12/13の記事は道用基底さんalmost everywhereとルベーグ積分 1 でした.
ソフトマックス関数に興味を持ち、美しいと思った数値微分(差分)を書きます。

ソフトマックス関数の定義

ソフトマックス関数$S_i(x)$を次式の実$n$変数関数とします。
$1 \leq i \leq n$
$$S_i(x_1,x_2, \cdots x_{n-1},x_n):=\frac{e^{x_i}}{\sum_{k=1}^{n} e^{x_{k}}}$$

ソフトマックス関数が満たす性質

$$0< S_i(x)<1$$
$$\sum_{i=1}^n S_i(x)=1$$
$$S_i(x_1+C,x_2+C, \cdots x_{n-1}+C,x_n+C)=S_i(x_1,x_2, \cdots x_{n-1},x_n)$$
$$ \frac{dS_i}{dx_j} =\delta_{i,j}S_i-S_iS_j$$
$$\frac{d\ log(S_i)}{dx_j} =\delta_{i,j}-S_j$$
$\delta_{i,j}$はクロネッカーのデルタ

$$u(x_1,x_2, \cdots x_{n-1},x_n):=\sum_{k=1}^{n} e^{x_{k}}$$
$$\frac{d\ log(u(x))}{dx_i}=S_i(x)$$

増分の定義

増分$ \triangle_j $$ \bigtriangledown_j$を以下のように、$n$変数関数$f(x)$に作用する作用素とします。

$$ \triangle_jf(x):=f(x_1,x_2, \cdots x_j+h\cdots x_{n-1},x_n)$$
$$ \bigtriangledown_jf(x):=f(x_1,x_2, \cdots x_j-h\cdots x_{n-1},x_n)$$
この作用素は四則演算を保ちます。

通常の数値微分の例

 

前進差分

$$\frac{\triangle_jf(x)-f(x)}{h}$$

中心差分

$$\frac{\triangle_jf(x)-\bigtriangledown_jf(x)}{2h}$$

両方とも$ \lim_{h \to 0} $で微分に一致します。
参照記事 数値微分における3つの差分とその誤差について

"よい"ソフトマックス関数専用の数値微分

以下では"よい"ソフトマックス関数専用の数値微分を提案します。

"よい"専用数値微分とは

今回はソフトマックス関数の性質を用いて、刻み幅$h$によらず、
$1$階偏微分と一致するような数値微分であり、
また前進差分か中心差分を刻み幅$h$で変形した数値微分を"よい"とします。

次の論文のように、差分と微分の誤差を平均作用素で埋めるではなく。
差分(数値微分)を変えることを考えました。
微分方程式の “理想的” 差分化

以下よく用いる式変形

$$\triangle_ju(x)=u(x)+e^{x_j+h}-e^{x_j}$$
$$\bigtriangledown_ju(x)=u(x)+e^{x_j-h}-e^{x_j}$$
$$\triangle_jS_i(x)=\frac{e^{x_i+\delta_{i,j}h}}{\triangle_j u(x)}$$
$$\bigtriangledown_jS_i(x)=\frac{e^{x_i-\delta_{i,j}h}}{\bigtriangledown_j u(x)}$$

前進差分の変形

$$\frac{\triangle_jS_i(x)-S_i(x)}{e^h-1}\frac{\triangle_ju(x)}{u(x)}=\frac{dS_i}{dx_j} =\delta_{i,j}S_i-S_iS_j$$

前進差分との違い

前進差分との乗法的違いに
$$\frac{h}{e^h-1}$$

$$\frac{\triangle_ju(x)}{u(x)}$$
があります。2つ目を変形すると、次が成り立ちます。
$$\frac{\triangle_ju(x)}{u(x)}=1+(e^h-1)S_j\\ \frac{\triangle_ju(x)}{u(x)}=\frac{e^{x_k+\delta_{j,k}h}}{e^{x_k+\delta_{j,k}h}}\frac{\triangle_ju(x)}{u(x)}=\frac{e^{\delta_{j,k}h}S_k(x)}{\triangle_jS_k(x)}$$

中心差分の変形

$$\frac{\triangle_jS_i(x)-\bigtriangledown_jS_i(x)}{{e^h-e^{-h}}}\frac{\triangle_ju(x)\bigtriangledown_ju(x)}{u(x)^2}=\frac{dS_i}{dx_j} =\delta_{i,j}S_i-S_iS_j$$

中心差分との違い

中心差分との乗法的違いに
$$\frac{2h}{e^h-e^{-h}}=\frac{h}{sinh(h)}=\frac{h}{2cosh(\frac{h}{2})sinh(\frac{h}{2})}$$

$$\frac{\triangle_ju(x)\bigtriangledown_ju(x)}{u(x)^2}$$
があります。2つ目を変形すると、次が成り立ちます。
$$\frac{\triangle_ju(x)\bigtriangledown_ju(x)}{u(x)^2}=(1+(e^h-1)S_j)(1+(e^{-h}-1)S_j)=cosh(\frac{h}{2})^2-(2S_j(x)-1)^2sinh(\frac{h}{2})^2\\ $$
$cosh$$sinh$ 双曲線関数

$$ \frac{\triangle_ju(x)\bigtriangledown_ju(x)}{u(x)^2}=\frac{e^{x_k+\delta_{j,k}h}}{e^{x_k+\delta_{j,k}h}}\frac{\triangle_ju(x)}{u(x)}\frac{e^{x_k-\delta_{j,k}h}}{e^{x_k-\delta_{j,k}h}}\frac{\bigtriangledown_ju(x)}{u(x)}=\frac{S_k(x)^2}{\triangle_jS_k(x)\bigtriangledown_jS_k(x)}$$

余談

exp和のlog微分

$$\frac{d\ log(u(x))}{dx_i}=\frac{du(x)}{dx_i}\frac{1}{u(x)}=S_i(x)$$
を差分でかくと、
$$\frac{\triangle_iu(x)-u(x)}{e^h-1}\frac{1}{u(x)}=S_i(x)$$

$$\frac{\triangle_iu(x)-\bigtriangledown_iu(x)}{e^h-e^{-h}}\frac{1}{u(x)}=S_i(x)$$

ソフトマックス関数の逆数の数値微分

$$\frac{d \frac{1}{S_i(x)}}{dx_j}=-\frac{d S_i(x)}{dx_j}\frac{1}{S_i(x)^2}$$
$$\frac{\triangle_j \frac{1}{S_i(x)}-\frac{1}{S_i(x)}}{e^h-1}e^{\delta_{i,j}h}=-\frac{d S_i(x)}{dx_j}\frac{1}{S_i(x)^2} $$
$$\frac{\triangle_j \frac{1}{S_i(x)}-\bigtriangledown_j \frac{1}{S_i(x)}}{e^h-e^{-h}}=-\frac{d S_i(x)}{dx_j}\frac{1}{S_i(x)^2} $$
前進差分や中心差分との違いが$x$に依存しない。

明日の Mathlog Advent Calendar 2021 12/13 は quawaiの記事です、お楽しみに!

投稿日:20211214
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。

投稿者

kzaukzau
kzaukzau
22
3499

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中