オートエンコーダー

machine-learning

自己符号化器 (Autoencoder) の私的まとめ。

自己符号化器

エンコードした結果をデコードしたとき入力と一致するように重みを決める。一層ずつ学習した結果を積み重ねて深いネットワークを構成する。

エンコード

\textbf{y} = f_\textrm{act}(A \textbf{x} + \textbf{b})

ここで、$\textbf{x}$ は N 次元入力ベクトル、$\textbf{y}$ は M 次元出力ベクトル (エンコードした結果)。$A$ は M 行 N 列の実数行列、$\textbf{b}$ は M 次元実数ベクトルで、これらが最適化すべきパラメータ。ここで、$f_\textrm{act}$ は任意に設定してかまわないニューラルネットワークの活性化関数 (activation function)。

デコード

\textbf{z} = g_\textrm{lnk}(C \textbf{y} + \textbf{d})

ここで、$\textbf{y}$ は M 次元出力ベクトル、$\textbf{z}$ は N 次元復元ベクトル (デコードした結果)。$C$ は N 行 M 列の実数行列、$\textbf{d}$ は N 次元実数ベクトルで、これらが最適化すべきパラメータ。ただし利用時に必要ないので、これらのパラメータは最適化に使ったあとで捨てる。ここで、$g_\textrm{lnk}$ を一般化線形モデル的な意味で逆リンク関数 (Inverse Link Function) と呼ぶことにする。

$\textbf{z}$ が $\textbf{x}$ と一致するとき最大となるような目的関数 (objective function) を定義して、その最適化問題としてパラメータ $\Theta = {A, \textbf{b}, C, \textbf{d} }$ を求める。また、活性化関数とリンク関数は任意に設計してかまわないので、入力データに合わせて適切に設定する。

ベルヌーイ型

入力が二値データのときは、逆リンク関数としてシグモイド関数を使い、目的関数として負の交差エントロピー (negative cross entropy) を使う。本稿では、これをベルヌーイ型オートエンコーダ (Bernoulli autoencoder) という。

逆リンク関数

逆リンク関数 (Inverse Link Function)

z_{i} = \frac{1}{1 + e^{-g_{i}}}

ここで、$\textbf{g} = C \textbf{y} + \textbf{d}$ とおいた。

目的関数

最大化したい目的関数 (objective function)。

J(\textbf{x}, \textbf{z}) = \sum_{i=1}^{N} \left( x_{i} \ln z_{i} + (1 - x_{i}) \ln (1 - z_{i}) \right)

目的関数の勾配

\begin{aligned}
\frac{\partial E}{\partial d_{i}}
  &= \left( \frac{x_{i}}{z_{i}} \frac{\partial z_{i}}{\partial d_{i}} - \frac{1 - x_{i}}{1 - z_{i}} \frac{\partial z_{i}}{\partial d_{i}} \right) \\
  &= \left( \frac{x_{i}}{z_{i}} - \frac{1 - x_{i}}{1 - z_{i}} \right) \frac{\partial z_{i}}{\partial d_{i}} \\
  &= \left( \frac{x_{i}}{z_{i}} - \frac{1 - x_{i}}{1 - z_{i}} \right) z_{i} \left( 1 - z_{i} \right) \\
  &= \left( x_{i} ( 1 - z_{i} ) - (1 - x_{i}) z_{i} \right) \\
  &= \left( x_{i} - x_{i} z_{i} - z_{i} + x_{i} z_{i} \right) \\
  &= \left( x_{i} - z_{i} \right) \\
\frac{\partial E}{\partial \textbf{d}} &= \left( \textbf{x} - \textbf{z} \right) \\
\frac{\partial E}{\partial         C } &= \left( \textbf{x} - \textbf{z} \right) \textbf{y}^{\top} \\
\frac{\partial E}{\partial \textbf{b}} &= \left[ C^{\top} \left( \textbf{x} - \textbf{z} \right) \right] \odot \frac{\partial \textbf{y}}{\partial \textbf{f}} \\
\frac{\partial E}{\partial         A } &= \left\{ \left[ C^{\top} \left( \textbf{x} - \textbf{z} \right) \right] \odot \frac{\partial \textbf{y}}{\partial \textbf{f}} \right\} \textbf{x}^{\top}
\end{aligned}

ここで、$\odot$ はベクトルの各要素ごとの乗算を表している。また、$\frac{\partial \textbf{y}}{\partial \textbf{f}}$ は $\frac{\partial y_{j}}{\partial f_{j}}$ を M 個ならべたベクトルである。ただし、$\textbf{y} = f_\textrm{act}(\textbf{f})$ かつ $\textbf{f} = A \textbf{x} + \textbf{b}$ とおいた。また、$f_\textrm{act}(\cdot)$ は、ベクトルの各要素ごとに独立に作用する活性化関数であるとした。

$C$ として $A^{\top}$ を利用すると下式となる。

\begin{aligned}
\frac{\partial J}{\partial \textbf{d}} &= \left( \textbf{x} - \textbf{z} \right) \\
\frac{\partial J}{\partial \textbf{b}} &= \left[ A \left( \textbf{x} - \textbf{z} \right) \right] \odot \frac{\partial \textbf{y}}{\partial \textbf{f}} \\
\frac{\partial J}{\partial         A } &= \left\{ \left[ A \left( \textbf{x} - \textbf{z} \right) \right] \odot \frac{\partial \textbf{y}}{\partial \textbf{f}} \right\} \textbf{x}^{\top} - \textbf{y} \left( \textbf{x} - \textbf{z} \right)^{\top}
\end{aligned}

付録

入力 $x_{i}$ が固定だとすると、負の交差エントロピーの最大化は、ベルヌーイ分布間の KL-divergence を最小化していることと一致する。

\begin{aligned}
\Theta
  &= \textrm{argmin}_{\Theta} \sum_{i=1}^{N} D_{KL}\left(\mathcal{Bern}(x_{i}) \parallel \mathcal{Bern}(z_{i}) \right) \\
  &= \textrm{argmin}_{\Theta} \sum_{i=1}^{N} \left( x_{i} \ln \frac{x_{i}}{z_{i}} + (1 - x_{i}) \ln \frac{1 - x_{i}}{1 - z_{i}} \right) \\
  &= \textrm{argmin}_{\Theta} \sum_{i=1}^{N} \left( x_{i} \ln x_{i} - x_{i} \ln z_{i} + (1 - x_{i}) \ln (1 - x_{i}) - (1 - x_{i}) \ln (1 - z_{i}) \right) \\
  &= \textrm{argmin}_{\Theta} \sum_{i=1}^{N} \left( x_{i} \ln x_{i} + (1 - x_{i}) \ln (1 - x_{i}) \right) - \sum_{i=1}^{N} \left(x_{i} \ln z_{i} + (1 - x_{i}) \ln (1 - z_{i}) \right) \\
  &= \textrm{argmin}_{\Theta} -\sum_{i=1}^{N} \left(x_{i} \ln z_{i} + (1 - x_{i}) \ln (1 - z_{i}) \right) \\
  &= \textrm{argmax}_{\Theta} J(\textbf{x}, \textbf{z}; \Theta)
\end{aligned}

カテゴリ型

入力がカテゴリデータのときは、逆リンク関数としてソフトマックス関数を使う。本稿ではカテゴリ型オートエンコーダ (categorical autoencoder) という。

目的関数の勾配

式はベルヌーイ型と同じになる。逆リンク関数がソフトマックス関数になるだけ。

ガウス型

入力が実数データのときは、逆リンク関数として恒等関数を使い、目的関数として負の二乗誤差 (negative squared error) を使う。本稿では、ガウス型オートエンコーダ (Gaussian autoencoder) という。

逆リンク関数

z_{i} = g_{i}

ここで、$\textbf{g} = C \textbf{y} + \textbf{d}$ とおいた。

目的関数

最大化したい目的関数。

J(\textbf{x}, \textbf{z}) = -\frac{1}{2} \sum_{i=1}^{N} \left( x_{i} - z_{i} \right)^2

目的関数の勾配

式の形自体はベルヌーイ型と同じになる。逆リンク関数が恒等関数になるだけ。

付録

入力 $x_{i}$ が固定だとすると、負の二乗誤差の最大化は、等分散の正規分布間の KL-divergence を最小化していることと一致する。

\begin{aligned}
\Theta
  &= \textrm{argmin}_{\Theta} \sum_{i=1}^{N} D_{KL}\left(\mathcal{N}(x_{i}, \sigma) \parallel \mathcal{N}(z_{i}, \sigma) \right) \\
  &= \textrm{argmin}_{\Theta} \sum_{i=1}^{N} \frac{1}{2 \sigma^2} (x_{i} - z_{i})^2 \\
  &= \textrm{argmax}_{\Theta} J(\textbf{x}, \textbf{z}; \Theta)
\end{aligned}

最適化に関係ないので $\sigma$ は考えなくてよい。また、入力が白色化されていれば $\sigma = 1$ と考えてもよい。結果として得られた $z_{i}$ の分散が $x_{i}$ と等しくなるかは分からないが……

ポアソン型

入力が実数データのときは、逆リンク関数として指数関数を使い、目的関数として負の I-divergence を使う。本稿では、ポアソン型オートエンコーダ (Poisson autoencoder) という。

逆リンク関数

z_{i} = e^{g_{i}}

ここで、$\textbf{g} = C \textbf{y} + \textbf{d}$ とおいた。

目的関数

最大化したい目的関数。

J(\textbf{x}, \textbf{z}) = \sum_{i=1}^{N} \left( (x_{i} - z_{i}) - x_{i} \ln \frac{x_{i}}{z_{i}} \right)

目的関数の勾配

式の形自体はベルヌーイ型と同じになる。逆リンク関数が指数関数になるだけ。

付録

入力 $x_{i}$ が固定だとすると、負の I-divergence の最大化は、ポアソン分布間の KL-divergence を最小化していることと一致する。

\begin{aligned}
\Theta
  &= \textrm{argmin}_{\Theta} \sum_{i=1}^{N} D_{KL}\left(\mathcal{Pois}(x_{i}) \parallel \mathcal{Pois}(z_{i}) \right) \\
  &= \textrm{argmin}_{\Theta} \sum_{i=1}^{N} \left( x_{i} \ln \frac{x_{i}}{z_{i}} - (x_{i} - z_{i}) \right) \\
  &= \textrm{argmax}_{\Theta} J(\textbf{x}, \textbf{z}; \Theta)
\end{aligned}

まとめ

逆リンク間数と目的関数

  入力タイプ 逆リンク関数 $z_{i} = g_\textrm{lnk}(g_{i})$ 最大化したい目的関数 (KL 情報量) $J(x_{i}, z_{i})$
ベルヌーイ 2値 シグモイド関数 $\frac{1}{1 + e^{-g_{i}}}$ 負の交差エントロピー (ベルヌーイ分布) $x_{i} \ln z_{i} + (1 - x_{i}) \ln (1 - z_{i})$
カテゴリ 2値 ソフトマックス関数 $\frac{e^{g_{i}}}{\sum_{i=1}^{N} e^{g_{i}}}$ 負の交差エントロピー (カテゴリ分布) $x_{i} \ln z_{i} $
ガウス 実数 恒等関数 $g_{i}$ 負の二乗誤差 (ガウス分布) $-\frac{1}{2} (x_{i} - z_{i})^2$
ポアソン 非負 指数関数 $e^{g_{i}}$ 負の I ダイバージェンス (ポアソン分布) $(x_{i} - z_{i}) - x_{i} \ln \frac{x_{i}}{z_{i}}$

ちなみに、指数分布間の KL 情報量の最小化は板倉斉藤距離の最小化と等価となる。

KL 情報量

KL 情報量 (Kullback–Leibler divergence)

\begin{aligned}
D_{KL}(\mathcal{Bern}(p_{x}) \parallel \mathcal{Bern}(p_{z})) &= p_{x} \ln \frac{p_{x}}{p_{z}} + (1 - p_{x}) \ln \frac{1 - p_{x}}{1 - p_{z}} \\
D_{KL}(\mathcal{N}(\mu_{x}, \sigma_{x}) \parallel \mathcal{N}(\mu_{z}, \sigma_{z})) &= \ln \frac{\sigma_{z}}{\sigma_{x}} + \frac{1}{2} \frac{\sigma_{x}^2}{\sigma_{z}^2} + \frac{(\mu_{x} - \mu_{z})^2}{2 \sigma_{z}^2} - \frac{1}{2} \\
D_{KL}(\mathcal{Pois}(\lambda_{x}) \parallel \mathcal{Pois}(\lambda_{z})) &= \lambda_{z} \ln\frac{\lambda_{z}}{\lambda_{x}} + (\lambda_{x} - \lambda_{z}) \\
D_{KL}(\mathcal{Exp}(\lambda_{x}) \parallel \mathcal{Exp}(\lambda_{z})) &= \frac{\lambda_{z}}{\lambda_{x}} + \ln \frac{\lambda_{x}}{\lambda_{z}} - 1 \\
D_{KL}(\mathcal{Ga}(k_{x}, \theta_{x}) \parallel \mathcal{Ga}(k_{z}, \theta_{z})) &= (k_{x} - k_{z}) \psi(k_{x}) - \ln \frac{\Gamma(k_{x})}{\Gamma(k_{z})} - k_{z} \ln \frac{\theta_{x}}{\theta_{z}} + k_{x} \frac{\theta_{x} - \theta_{z}}{\theta_{z}}
\end{aligned}

ここで、$\psi$ はディガンマ関数 (digamma function) である。指数分布とガンマ分布の結果は、本稿で利用していない。

目的関数の勾配

ここで上げているすべての逆リンク関数 (と目的関数) で勾配は下式になる。

\begin{aligned}
\frac{\partial E}{\partial \textbf{d}} &= \left( \textbf{x} - \textbf{z} \right) \\
\frac{\partial E}{\partial         C } &= \left( \textbf{x} - \textbf{z} \right) \textbf{y}^{\top} \\
\frac{\partial E}{\partial \textbf{b}} &= \left[ C^{\top} \left( \textbf{x} - \textbf{z} \right) \right] \odot \frac{\partial \textbf{y}}{\partial \textbf{f}} \\
\frac{\partial E}{\partial         A } &= \left\{ \left[ C^{\top} \left( \textbf{x} - \textbf{z} \right) \right] \odot \frac{\partial \textbf{y}}{\partial \textbf{f}} \right\} \textbf{x}^{\top}
\end{aligned}

あるいは、$C = A^{\top}$ とするなら、

\begin{aligned}
\frac{\partial E}{\partial \textbf{d}} &= \left( \textbf{x} - \textbf{z} \right) \\
\frac{\partial E}{\partial \textbf{b}} &= \left[ A \left( \textbf{x} - \textbf{z} \right) \right] \odot \frac{\partial \textbf{y}}{\partial \textbf{f}} \\
\frac{\partial E}{\partial         A } &= \left\{ \left[ A \left( \textbf{x} - \textbf{z} \right) \right] \odot \frac{\partial \textbf{y}}{\partial \textbf{f}} \right\} \textbf{x}^{\top} - \textbf{y} \left( \textbf{x} - \textbf{z} \right)^{\top}
\end{aligned}

となる。ただし、$\frac{\partial \textbf{y}}{\partial \textbf{f}}$ は $\frac{\partial y_{j}}{\partial f_{j}}$ を M 個ならべたベクトルである。これをオンライン学習なりなんなりで最適化すればいい。

逆リンク関数以外は、勾配の式の形が同じなので、様々な種類の入力データにあわせて同時に使うこともできる。入力ベクトルの一部だけ二値だったり、カテゴリデータになっていたり、実数だったり、非負実数だったり。実装もすっきりできる。

活性化関数

活性化関数 (activation function) としては何でも使える。以下に、よく利用される関数を挙げる。

活性化関数 $y_{j} = f_\textrm{act}(f_{j})$ $\frac{\partial y_{j}}{\partial f_{j}}$
シグモイド関数 $\frac{1}{1 + e^{-f_{j}}}$ $y_{j} (1 - y_{j})$
双曲線正接関数 $\tanh f_{j}$ $1 - y_{j}^2$
ReLU 関数 $1_{f_{j} > 0} f_{j}$ $1_{f_{j} > 0}$
leaky ReLU 関数 $\left( 1_{f_{j} > 0} + \frac{1_{f_{j} \leq 0}}{100} \right) f_{j}$ $1_{f_{j} > 0} + \frac{1_{f_{j} \leq 0}}{100}$
softplus 関数 $\max \left( 0, f_{j} \right) + \ln \left( 1 + e^{-\textrm{abs}(f_{j})} \right)$ $\frac{1}{1 + e^{-f_{j}}}$

ここで $1_{b}$ は、$b$ が真のとき 1 となり、それ以外のとき 0 となる関数とした。また、ReLU は Rectified Linear Unit の略である。

ReLU を通ったあとの出力は、非負実数になるので、次の段に、逆リンク関数として指数関数、目的関数として負の I-divergence を使ったりすればいいのではないか。

チップス

デノイジング

デノイジングオートエンコーダ (denoising autoencoder) を構成するときは、従っていると仮定した確率分布からのサンプリングでノイズを加えるといいのではないか? ミニバッチ単位で期待値を求めて、それをパラメータとしてサンプリングした値を入力とすればいい気がする。

勾配

実装するとき、勾配が正しく計算できているかチェックできると有用である。

行列

行列 $A$ を引数にとるスカラー関数 $J(A)$ をテイラー展開すると、

J(A + \Delta) = J(A) + \textrm{tr}\left[ \frac{\partial J(A)}{\partial A}^{\top} \Delta \right] + O(\Delta^2) 

より

J(A + \Delta) - J(A) \simeq \textrm{tr} \left[ \frac{\partial J(A)}{\partial A}^{\top} \Delta \right]

となるので、$x = J(A + \Delta) - J(A)$ および $y = \textrm{tr} \left[ \frac{\partial J(A)}{\partial A}^{\top} \Delta \right]$ として、相対誤差 $\frac{x - y}{x}$ がある程度 (8 桁ぐらいは) 一致しているかで確認する。ここで、$\Delta$ は微小変化行列 (各要素に乱数で小さな値を設定した行列) である。

ベクトル

ベクトル $\textbf{b}$ を引数にとるスカラー関数 $J(\textbf{b})$ をテイラー展開すると、

J(\textbf{b} + \vec{\delta}) = J(\textbf{b}) + \frac{\partial J(\textbf{b})}{\partial \textbf{b}}^{\top} \vec{\delta} + O(\delta^2) 

より

J(\textbf{b} + \vec{\delta}) - J(\textbf{b}) = \frac{\partial J(\textbf{b})}{\partial \textbf{b}}^{\top} \vec{\delta} + O(\delta^2) 

となるので、$x = J(\textbf{b} + \vec{\delta}) - J(\textbf{b})$ および $y = \frac{\partial J(\textbf{b})}{\partial \textbf{b}}^{\top} \vec{\delta}$ として、行列のときと同様に相対誤差 $\frac{x - y}{x}$ が一致しているか確認する。ここで、$\vec{\delta}$ は微小変化ベクトル (各要素に乱数で小さな値を設定したベクトル) である。

これらを使って、目的関数 $J$ について、パラメータ $\Theta = {A, \textbf{b}, C, \textbf{d}}$ の勾配が正しく計算できているか確認する。

参考文献

  1. Denoising Autoencoders (dA)
  2. Stacked Denoising Autoencoders
  3. Christian Bauckhage, “Computing the Kullback-Leibler Divergence between two generalized gamma distributions.”