ブログ

行列式と置換④:置換(permutation)の符号と偶置換・奇置換

線形代数の枠組みで$n$次正方行列の行列式(determinant)を取り扱うにあたっては置換(permutation)という概念を抑えておく必要があります。当記事では置換(permutation)の符号や符号に関連する転倒数・偶置換・奇置換について取りまとめを行いました。
作成にあたっては「チャート式シリーズ 大学教養 線形代数」の第$4$章「行列式」を主に参考にしました。

・数学まとめ
https://www.hello-statisticians.com/math_basic

置換の符号

置換の転倒数

$n$個の数字$1, \cdots , n$の置換$\sigma$について、「$i < j, \, i, j \in \{ 1, \cdots , n \}$」かつ「$\sigma(i) > \sigma(j)$」が成立する$(i,j)$の組の個数を置換$\sigma$の転倒数という。

$n$変数の差積と置換の符号

$n$変数$x_{1}, x_{2}, \cdots , x_{n}$の差積$D(x_{1}, x_{2}, \cdots , x_{n})$を下記のように定義する。
$$
\large
\begin{align}
D(x_{1}, x_{2}, \cdots , x_{n}) &= (x_1-x_n) \times \cdots \times (x_1-x_3) \times (x_1-x_2) \\
& \times (x_2-x_n) \times \cdots \times (x_2-x_3) \\
& \times \cdots \\
& \times (x_{n-2}-x_n) \times (x_{n-2}-x_{n-1}) \\
& \times (x_{n-1}-x_n)
\end{align}
$$

ここで$n$個の数字$1, \cdots , n$の置換$\sigma$について、$\sigma$の符号$\mathrm{sgn}{(\sigma)}$を下記のように定義する。
$$
\large
\begin{align}
\mathrm{sgn}{(\sigma)} = \frac{D(x_{\sigma(1)}, x_{\sigma(2)} , \cdots , x_{\sigma(n)})}{D(x_{1}, x_{2}, \cdots , x_{n})}
\end{align}
$$

上記を置換$\sigma$の符号という。$\mathrm{sgn}{(\sigma)}$は置換$\sigma$の転倒数が偶数であるとき$\mathrm{sgn}{(\sigma)}=1$、転倒数が奇数であるとき$\mathrm{sgn}{(\sigma)}=-1$となることも合わせて抑えておくと良い。

偶置換・奇置換

転倒数が偶数・符号が$1$である置換を偶置換、転倒数が奇数・符号が$-1$である置換を奇置換という。

例題の確認

以下、「チャート式シリーズ 大学教養 線形代数」の例題の確認を行う。

基本例題$056$

・$[1]$
$$
\large
\begin{align}
A = \left[ \begin{array}{cccc} 1 & 2 & 3 & 4 \\ 2 & 4 & 3 & 1 \end{array} \right]
\end{align}
$$

$1) \,$ $i=1, \sigma(i)=2$に対し、$i < j, \sigma(i) > \sigma(j)$となるのは$j=4$のみである。

$2) \,$ $i=2, \sigma(i)=4$に対し、$i < j, \sigma(i) > \sigma(j)$となるのは$j=3, 4$である。

$3) \,$ $i=3, \sigma(i)=3$に対し、$i < j, \sigma(i) > \sigma(j)$となるのは$j=4$のみである。

上記より転倒数は$1+2+1=4$であるので、符号は$\mathrm{sgn}(\sigma)=1$である。

・$[2]$
$$
\large
\begin{align}
\sigma = \left[ \begin{array}{ccccc} 1 & 2 & 3 & 4 & 5 \\ 2 & 3 & 5 & 1 & 4 \end{array} \right]
\end{align}
$$

$1) \,$ $i=1, \sigma(i)=2$に対し、$i < j, \sigma(i) > \sigma(j)$となるのは$j=4$のみである。

$2) \,$ $i=2, \sigma(i)=3$に対し、$i < j, \sigma(i) > \sigma(j)$となるのは$j=4$のみである。

$3) \,$ $i=3, \sigma(i)=5$に対し、$i < j, \sigma(i) > \sigma(j)$となるのは$j=4, 5$である。

$4) \,$ $i=4, \sigma(i)=1$に対し、$i < j, \sigma(i) > \sigma(j)$となる$j$は存在しない。

上記より転倒数は$1+1+2+0=4$であるので、符号は$\mathrm{sgn}(\sigma)=1$である。

行列式と置換③:置換(permutation)の指数法則・単位置換・逆置換

線形代数の枠組みで$n$次正方行列の行列式(determinant)を取り扱うにあたっては置換(permutation)という概念を抑えておく必要があります。当記事では置換(permutation)の指数法則や単位置換、逆置換について取りまとめを行いました。
作成にあたっては「チャート式シリーズ 大学教養 線形代数」の第$4$章「行列式」を主に参考にしました。

・数学まとめ
https://www.hello-statisticians.com/math_basic

置換の指数法則・単位置換・逆置換

置換の指数法則

任意の置換$\sigma$と任意の整数$k, l$について下記が成立する。
$$
\large
\begin{align}
\sigma^{k+l} = \sigma^{k} \sigma^{l}
\end{align}
$$

単位置換

文字$i \in \{ 1, 2, \cdots , n \}$を$i$自身に写す置換を$e$とおくと、$e$は下記のように表される。
$$
\large
\begin{align}
e = \left[ \begin{array}{cccc} 1 & 2 & \cdots & n \\ 1 & 2 & \cdots & n \end{array} \right]
\end{align}
$$

この置換$e$を単位置換という。また、任意の置換$\sigma$について$\sigma^{0}=e$が成立すると定義する。

逆置換

任意の置換$\sigma$について$\sigma \tau = \tau \sigma = e$が成立する置換$\tau$が存在する。この置換$\tau$のことを$\sigma$の逆置換という。

具体的には$12 \cdots n$が$\sigma(1) \sigma(2) \cdots \sigma(n)$のように変換されるとき、$\tau(\sigma(1))=1, \, \tau(\sigma(2))=2, \, \cdots , \, \tau(\sigma(n))=n$が成立するように$\tau$を定めれば良い。

上記のような$\sigma$の逆行列$\tau$は$\tau = \sigma^{-1}$のように表すことができ、指数法則より$\sigma \tau = \sigma^{1} \sigma^{-1} = \sigma^{1-1} = \sigma^{0} = e$のように表すこともできる。

例題の確認

以下、「チャート式シリーズ 大学教養 線形代数」の例題の確認を行う。

基本例題$054$

基本例題$055$

$\tau \sigma (\sigma^{-1} \tau^{-1})$は下記のように式変形することができる。
$$
\large
\begin{align}
\tau \sigma (\sigma^{-1} \tau^{-1}) &= \tau \sigma^{1-1} \tau^{-1} \\
&= \tau \tau^{-1} \\
&= e
\end{align}
$$

同様に$(\sigma^{-1} \tau^{-1}) \tau \sigma$は下記のように式変形できる。
$$
\large
\begin{align}
(\sigma^{-1} \tau^{-1}) \tau \sigma &= \sigma^{-1} \tau^{-1+1} \sigma \\
&= \sigma^{-1} \sigma \\
&= e
\end{align}
$$

上記より$(\tau \sigma) (\sigma^{-1} \tau^{-1}) = (\sigma^{-1} \tau^{-1}) (\tau \sigma)$が成立するので逆置換の定義より、$(\tau \sigma)^{-1} = \sigma^{-1} \tau^{-1}$が成立する。

TransformerにおけるSoftmax関数の計算量とLinear Transformer

Transformerは汎用的に用いることのできる強力なDeepLearningである一方、入力系列のトークンが多くなると計算量も増大します。当記事ではTransformerの各Attention処理でのSoftmax計算の軽減にあたっての研究である、Linear Transformer論文について取りまとめました。
作成にあたってはLinear Transformer論文や、「A Survey of Transformers」の内容を参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提の確認

Transformerの仕組みの概要

Dot Product Attentionに主に基づくTransformerの仕組みについては既知である前提で当記事はまとめました。下記などに解説コンテンツを作成しましたので、合わせて参照ください。

・直感的に理解するTransformer(統計の森作成)

Transformerの式表現

TransformerのDot Product Attentionは下記のような式で定義されます1
$$
\large
\begin{align}
\mathrm{Attention}(Q, K, V) &= \mathrm{Softmax} \left( \frac{Q K^{\mathrm{T}}}{\sqrt{d}} \right) V \quad (1) \\
Q, K, V & \in \mathbb{R}^{n \times d}
\end{align}
$$

Linear Transformer

Linear Transformerの概要

Linear Transformerの概要は下図を確認すると理解しやすいです。

A Survey of Transformers Fig$. \, 7$:通常のTransformerとLinear Transformerの処理フローとそれぞれの計算量

上図の左側が一般的なTransformerの計算フロー、右側がLinear Transformerにおける計算フローに対応します。左側のTransformerでは$Q, K \in \mathbb{R}^{n \times d}$について$Q K^{\mathrm{T}} \in \mathbb{R}^{n \times n}$の行毎(row-wise)にソフトマックス関数を適用する際に、計算量が入力するトークン数$n$の二乗になります。図では$T=n$であり、計算量が$\mathcal{O}(T^{2})$で表現されています。オリジナルのTransformerでは$n \simeq d$を前提としている一方で、Linear TransformerではReformerなどと同様に$n >> d$の場合を仮定することに注意しておくと良いです。

Linear Transformerの論文ではこのようなソフトマックス関数の計算時の計算量を軽減するにあたって、ソフトマックス関数の$\exp$の代わりにfeature mapの$\phi$が導入されます。$\exp$を用いないことで行列の積の順序を変えることが可能になることに注意しておくと良いです。

Transformerの式の改変

$(1)$式の出力の$i$行目を縦ベクトルの$z_{i}$とおくと、$Q \in \mathbb{R}^{n \times d}$の$i$行目の$q_{i}$に対応する$z_{i}$は下記のように表すことが可能です。
$$
\large
\begin{align}
z_{i}^{\mathrm{T}} = \mathrm{Attention}(q_{i}^{\mathrm{T}}, K, V) = \mathrm{Softmax} \left( \frac{q_{i}^{\mathrm{T}} K^{\mathrm{T}}}{\sqrt{d}} \right) V \quad (2)
\end{align}
$$

ここで$K, V \in \mathbb{R}^{n \times d}$の$j$行目を$k_{j}, v_{j} \in \mathbb{R}^{d}$のように表すとき、$(2)$式は下記のように表すこともできます。
$$
\large
\begin{align}
z_{i} &= \left[ \mathrm{softmax}{\left( q_{i}^{\mathrm{T}} K^{\mathrm{T}} \right)} V \right]^{\mathrm{T}} \\
&= \sum_{k=1}^{n} \left[ \frac{\mathrm{sim}(q_{i}, k_{k})}{\sum_{j=1}^{n} \mathrm{sim}(q_{i}, k_{j})} v_{j} \right] \quad (3) \\
\mathrm{sim}(q, k) &= \exp{ \left( \frac{q^{\mathrm{T}} k}{\sqrt{d}} \right) }
\end{align}
$$

上記の$q_{i}, k_{j}, v_{j}$は$Q, K, V$の$i$行目や$j$行目を抜き出して縦ベクトルで表されたものに対応します2。出力の$z_{i}$も同様に縦ベクトルであることにご注意ください。よって、たとえば$q_{i}, k_{j}$の内積は$q_{i}^{\mathrm{T}} k_{j}$のように表されます。

Linear Transformerの数式

$(3)$式の$\mathrm{sim}(q_{i}, k_{k})$を下記のように$\phi(x)$を用いて表す場合を仮定します。
$$
\large
\begin{align}
\mathrm{sim}(q_{i}, k_{k}) = \phi(q_{i})^{\mathrm{T}} \phi(k_{k}) \quad (4)
\end{align}
$$

$(4)$式に基づいて$(3)$式は下記のように改変することができます。
$$
\large
\begin{align}
z_{i} &= \sum_{k=1}^{n} \left[ \frac{\mathrm{sim}(q_{i}, k_{k})}{\sum_{j=1}^{n} \mathrm{sim}(q_{i}, k_{j})} v_{k} \right] \quad (3) \\
&= \sum_{k=1}^{n} \left[ \frac{\phi(q_{i})^{\mathrm{T}} \phi(k_{k})}{\sum_{j=1}^{n} \phi(q_{i})^{\mathrm{T}} \phi(k_{j})} v_{k} \right] \\
&= \left[ \frac{\phi(q_{i})^{\mathrm{T}} \sum_{k=1}^{n} \phi(k_{k}) v_{k}^{\mathrm{T}}}{\phi(q_{i})^{\mathrm{T}} \sum_{j=1}^{n} \phi(k_{j})} \right]^{\mathrm{T}} \quad (5)
\end{align}
$$

$(5)$式は下記のような行列の積の形式で表すこともできます。
$$
\large
\begin{align}
\left( \phi(Q) \phi(K)^{\mathrm{T}} \right) V = \phi(Q) \left( \phi(K)^{\mathrm{T}} V \right) \quad (6)
\end{align}
$$

$(5)$式や$(6)$式の右辺の計算の計算量は$\mathcal{O}(N)$であり、「Linear Transformerの概要」の図に対応します。

また、Linear Transformerでは$\phi(x)$を下記のように定義します。
$$
\large
\begin{align}
\phi(x) = \mathrm{elu}(x) + 1
\end{align}
$$

上記の$\mathrm{elu}$関数については次項の「exponential linear unit」で詳しく確認を行います。

exponential linear unit

exponential linear unitの略であるelu関数$\mathrm{elu}(x)$は下記のような式で定義されます。
$$
\large
\mathrm{elu}(x) =
\begin{cases}
x & \mathrm{if} \, x > 0 \\
\alpha(\exp{(x)}-1) & \mathrm{if} \, x \leq 0
\end{cases}
$$

また、$\mathrm{elu}(x)$関数の$x$についての微分は下記のように表されます。
$$
\large
\frac{d}{dx} \mathrm{elu}(x) =
\begin{cases}
1 & \mathrm{if} \, x > 0 \\
\alpha \exp{(x)} = \mathrm{elu}(x) + \alpha & \mathrm{if} \, x \leq 0
\end{cases}
$$

ELUはReLUのような活性化関数に用いるにあたって考案されており、下記のようなグラフでも表すことができます。

ELU論文 Figure$\, 1$:ELUのパラメータは$\alpha=1$

NumPyを用いた計算による実験

以下$(6)$式に基づいて、$Q, K, V \in \mathbb{R}^{N \times D}$の場合のDot Product Attentionの計算時間を$N$の値を変えて計測を行います。

$N=10{,}000, D=500$

$N=10{,}000, D=500$のとき、$Q(K^{\mathrm{T}}V)$の計算時間は下記のようになります。

import numpy as np
import time

import numpy as np
import time

N = 10000
D = 500

Q = np.ones([N, D])
K = np.ones([N, D])
V = np.ones([N, D])

start = time.time()
V_1 = np.dot(Q, np.dot(K.T, V))
end = time.time()

time_diff = end - start
print("{:.3f}".format(time_diff))

・実行結果

0.209

同様に$(QK^{\mathrm{T}})V$の計算時間は下記のようになります。

start = time.time()
V_1 = np.dot(Q, np.dot(K.T, V))
end = time.time()

time_diff = end - start
print("{:.3f}".format(time_diff))

・実行結果

3.270

$N=20{,}000, D=500$

$N=20{,}000, D=500$のとき、$Q(K^{\mathrm{T}}V)$の計算時間は下記のようになります。

N = 20000
D = 500

Q = np.ones([N, D])
K = np.ones([N, D])
V = np.ones([N, D])

start = time.time()
V_1 = np.dot(Q, np.dot(K.T, V))
end = time.time()

time_diff = end - start
print("{:.3f}".format(time_diff))

・実行結果

0.389

同様に$(QK^{\mathrm{T}})V$の計算時間は下記のようになります。

start = time.time()
V_1 = np.dot(Q, np.dot(K.T, V))
end = time.time()

time_diff = end - start
print("{:.3f}".format(time_diff))

・実行結果

12.354

$N=10{,}000$、$N=20{,}000$の結果より、$N$が大きくなるにつれて$Q(K^{\mathrm{T}}V)$の計算量が$\mathcal{O}(N)$、$(QK^{\mathrm{T}})V$の計算量が$\mathcal{O}(N^2)$であることが概ね確認できます3

参考

・Linear Transformer論文
・A Survey of Transformers
・ELU(Exponential Linear Unit)論文

  1. ここではTransformerに入力するトークン数を$n$、トークンの特徴量ベクトルの次元を$d$で表しました。「Linear Transformerの概要」で用いた図の$T$は$n$と一致することにご注意ください。 ↩︎
  2. 行列の$i$行目や$j$行目を縦ベクトルで表すというのはミスリードになりやすいかもしれませんが、Linear Transformerの論文の表記に合わせました。 ↩︎
  3. 計測自体はかなり雑なので、値はそれほど参考にしないようにご注意ください。ここでは$Q(K^{\mathrm{T}}V)$の順に計算すると速いことの確認を主な目的に計測を行いました。 ↩︎

Depthwise Separable ConvolutionとMobileNets

DeepLearningの軽量化・高速化にあたって、畳み込み処理の分解などが行われることが多いです。当記事ではMobileNetsにおける点単位畳み込み(Pointwise Convolution)やチャネル別畳み込み(Channelwise Convolution)について取りまとめを行いました。当記事の作成にあたっては、MobileNets論文や「深層学習 第$2$版」の第$5$章「畳み込みニューラルネットワーク」の内容などを参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提の確認

畳み込み演算の概要

畳み込み演算の数式

入力のチャネル数が$C$、フィルタの枚数$C_{out}$枚のとき畳み込みによって出力の$u_{ijk}$成分は下記のように計算されます。
$$
\large
\begin{align}
u_{ijk} = \sum_{c=1}^{C} \sum_{p=0}^{W_f-1} \sum_{q=0}^{H_f-1} x_{i+p,j+q,c} h_{pqck} + b_{k}
\end{align}
$$

詳しくは下記で取り扱いました。

MobileNetsの構成

Depthwise Separable Convolution概要

MobileNetsではDepthwise Separable Convolutionという畳み込みに基づいて構成されます。Depthwise Separable Convolutionは通常の$3 \times 3$の畳み込みを「空間方向」と「チャネル方向」に分解した処理であり、Depthwise Separable Convolutionを用いることでパラメータの軽量化や計算の高速化が可能になります。

MobileNets論文 Figure$\, 2$

畳み込みの分解にあたっては上図などを元に理解すると良いです。$(a)$で表されたオーソドックスな$3 \times 3$の畳み込みを、チャネル毎に(channelwise/depthwise)畳み込みを行うのが$(b)$、位置毎に(pointwise)$1 \times 1$の畳み込みを行うのが$(c)$と解釈すれば良いです。$1 \times 1$は「VGGNet」や「ResNetのボトルネック構造」でも採用されていますが、MobileNetsではチャネル毎の畳み込みとセットで用いられている点が特徴的です。

MobileNets論文 Figure$\, 3$

また、バッチ正規化(BN)や活性化関数(ReLU)も含めた処理の流れは上図のように表されます。左がオーソドックスな畳み込み、右がDepthwise Separable Convolutionにそれぞれ対応します。

Depthwise Separable Convolutionの数式

・チャネル別畳み込み(channelwise/depthwise convolution)
位置$(i,j)$のチャネル$c$におけるチャネル別畳み込みは下記のような数式で定義されます。
$$
\large
\begin{align}
u_{ijc} = \sum_{p=0}^{W_f-1} \sum_{q=0}^{H_f-1} z_{i+p,j+q,c}^{(l-1)} h_{pqc} + b_{c}
\end{align}
$$

上記のような式に基づいて、畳み込みの出力$u_{ijc}$が計算されます。$z$は中間層と$h$はフィルタ、$b$はバイアス項がそれぞれ対応します。

・位置別畳み込み(pointwise convolution)
位置$(i,j)$における位置別畳み込みは下記のような数式で定義されます。
$$
\large
\begin{align}
u_{ijc}’ = \sum_{c=1}^{C} u_{ijc} h_{c} + b_{c}
\end{align}
$$

計算コスト

フィルタのサイズが$W_{f} \times H_{f}$、入力のチャネルが$C$、出力のチャネルが$C_{out}$のとき、位置$(i,j)$における畳み込みの計算量について以下では確認を行います1

・オーソドックスな畳み込みの積算の回数
$$
\large
\begin{align}
W_{f} \times H_{f} \times C \times C_{out}
\end{align}
$$

・Depthwise Separable Convolutionの積算の回数
$$
\large
\begin{align}
W_{f} \times H_{f} \times C + C \times C_{out}
\end{align}
$$

・(Depthwise Separable Convolutionの積算の回数)/(オーソドックスな畳み込みの積算の回数)
$$
\large
\begin{align}
\frac{W_{f} \times H_{f} \times C + C \times C_{out}}{W_{f} \times H_{f} \times C \times C_{out}} = \frac{1}{C_{out}} + \frac{1}{W_{f} H_{f}} \quad (1)
\end{align}
$$

$W_{f} = H_{f} = 3, \, C_{out}=128$のとき、$(1)$式は下記のように計算できます。
$$
\large
\begin{align}
\frac{1}{C_{out}} + \frac{1}{W_{f} H_{f}} &= \frac{1}{128} + \frac{1}{9} \\
&= 0.1189 \cdots
\end{align}
$$

MobileNetsの全体構成

MobileNets論文では下記のような$28$層構造でニューラルネットが構成されます。

MobileNets論文 Table$\, 1$

上記より、Conv層が$27$層、FC層が$1$層あることが確認できます2。基本的にはチャネル別畳み込みと位置別畳み込みが交互に行われると理解して良いと思います。

参考

・MobileNets論文

  1. MobileNets論文ではFeature Mapのサイズも定義されるが、「深層学習 第$2$版」の$5.8節の解説にあるように点$(i,j)$のみを元に計算は可能である。当記事ではシンプルさを重視するにあたって、「深層学習 第$2$版」に基づいて取りまとめました。 ↩︎
  2. Avg PoolSoftmaxはカウントしないかつ、$5 \times$の行で$10$層プラスすることで$28$層になることが確認できます。 ↩︎

サブピクセル畳み込みを用いたアップサンプリング(upsampling)処理の表現

畳み込み演算を用いて画像のセグメンテーションや生成を行う際に何らかの計算に基づいてアップサンプリング(upsampling)処理が行われます。当記事ではアップサンプリングの際に用いられるdeconvolutionを畳み込み演算を用いて表す一連の流れについて取りまとめを行いました。
当記事の作成にあたっては、「Is the deconvolution layer the same as a convolutional layer?」や「深層学習 第$2$版」の$5.9$節「アップサンプリングと畳み込み」の内容などを参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

転置畳み込み

1Dの畳み込み

ストライド$2$の$1$次元畳み込みの計算は下図のように表すことができる。

Shi et al., $2016$ Figure$\, 2$

上図からサイズ$8$の$\mathbf{x}$にストライド$2$の畳み込みを行うことでサイズ$5$の$\mathbf{y}$が出力されたと読み取れる。$\mathbf{x}$のグレー部分はパディングを表す。

転置畳み込み

前項の「$1D$の畳み込み」における畳み込みの入力と出力を入れ替えると下図のような計算が得られる。

Shi et al., $2016$ Figure$\, 3 \, (a)$

このような処理を転置畳み込み(transposed convolution)という。転置畳み込みは「逆関数」と同様なイメージで解釈すると良い。上図では$\mathbf{x}$のサイズが$5$、$\mathbf{y}$のサイズが$8$であり、「$1D$の畳み込み」の図と逆になったことも合わせて抑えておくと良い。

畳み込みを用いたアップサンプリング

サブピクセル畳み込み

前節の「転置畳み込み」の処理に対し、下図のようにサブピクセル(sub-pixel)を導入することができる。

Shi et al., $2016$ Figure$\, 3 \, (b)$

このような処理をサブピクセル畳み込み(sub-pixel convolution)という。$\mathbf{x}$の白のピクセルの間のグレーのピクセルがサブピクセル畳み込みで追加される「サブピクセル」を表す。

サブピクセル畳み込みはアップサンプリング(upsampling)を畳み込み演算によって表した演算であると解釈することもできる。以下、「$2$Dのサブピクセル畳み込み」が「畳み込み演算で表したアップサンプリング処理」と解釈できることについて確認を行う。

2Dのサブピクセル畳み込み

Shi et al., $2016$ Figure$\, 5$

上図のように$2D$の入力に対し、サブピクセル畳み込み(sub-pixel convolution)を行う場合を仮定する。図の$*$は畳み込み演算を表す演算子であり、$*$の「左が入力」、「右が畳み込みに用いるフィルタ」にそれぞれ対応する。グレーで表されたサブピクセルには$0$が入ると仮定する。

一般的な畳み込み演算の原理に基づいてこのサブピクセル畳み込み(sub-pixel convolution)を行うことで下図のような結果が得られる。

Shi et al., $2016$ Figure$\, 6$

紫の出力が得られるフィルタの位置からフィルタを$1$つ右にずらすと青、$1$つ下にずらすと緑、$1$つ右+$1$つ下にずらすと赤が白のピクセル位置に重なることが確認できるので、出力はこの対応に基づいて理解すると良い。サブピクセル畳み込みを用いたこの演算は下図の演算の結果と対応する。

Shi et al., $2016$ Figure$\, 7$

Figure$\, 7$のような処理を用いることでアップサンプリングを行うことができる一方で、Figure$\, 6$を用いれば同様の演算を畳み込みを用いて実現することができる。

このようにアップサンプリングも畳み込み演算で表せることは抑えておくと良い。

ソフトマックス関数への温度スケーリング(temperature scaling)の導入

DeepLearningに関連する計算にあたってソフトマックス関数(softmax function)はよく出てくる一方で、出力値が過剰になる場合もあり得ます。当記事ではこのような際に値の調整に用いられる温度スケーリング(temperature scaling)の概要と使用例について取りまとめました。
当記事の作成にあたっては、「深層学習 第$2$版」の$7.2$節「注意機構」や$8.3$節「不確かさの予測」の内容などを参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

温度スケーリングの概要

ソフトマックス関数

$\mathbf{u} = (u_1, \cdots , u_K)$が与えられたとき、ソフトマックス関数$\mathrm{Softmax}(u_k)$は下記のように定義できる。
$$
\large
\begin{align}
\mathrm{Softmax}(u_k) = \frac{\exp{(u_k)}}{\displaystyle \sum_{j=1}^{K} \exp{(u_j)}}
\end{align}
$$

上記の定義より、ソフトマックス関数について下記の式が成立する。
$$
\large
\begin{align}
\mathrm{Softmax}(u_k) & \geq 0 \\
\sum_{j=1}^{K} \mathrm{Softmax}(u_j) &= 1
\end{align}
$$

温度スケーリングによるソフトマックス関数の出力の調整

ソフトマックス関数は$\exp$を用いることで入力値の差を際立たせた出力を行う。たとえば$\mathbf{u} = (5, 6, 7)$が入力の場合、下記の出力が得られる。

import numpy as np

u = np.array([5., 6., 7.])

p_1 = u/np.sum(u)
p_2 = np.exp(u)/np.sum(np.exp(u))

print(p_1)
print(p_2)

・実行結果

[ 0.27777778  0.33333333  0.38888889]
[ 0.09003057  0.24472847  0.66524096]

計算結果を確認すると、通常の確率化の結果が[ 0.27777778 0.33333333 0.38888889]であるのに対しソフトマックス関数の結果が[ 0.09003057 0.24472847 0.66524096]であり、「緩やかなmax関数」のように解釈することができる。

このようなソフトマックス関数の性質がより必要な時もあればある程度緩和が望ましい場合もあり、このような場合に温度スケーリング(temperature scaling)が用いられる。パラメータ$T$を元に温度スケーリングを施したソフトマックス関数は下記のように定義される。
$$
\large
\begin{align}
\mathrm{Softmax}(u_k) = \frac{\exp{(u_k/T)}}{\displaystyle \sum_{j=1}^{K} \exp{(u_j/T)}} \quad (1)
\end{align}
$$

$T=1$の場合に通常のソフトマックス関数に一致するので$(1)$式はソフトマックス関数の拡張であると理解することもできる。入力値$\mathbf{u} = (5, 6, 7)$に対し$T=0.3, 1, 10$の場合を計算するとそれぞれ下記が得られる。

import numpy as np

u = np.array([5., 6., 7.])
T = np.array([0.3, 1., 10.])

p = np.zeros([T.shape[0], a.shape[0]])
for i in range(T.shape[0]):
    p[i,:] = np.exp(u/T[i])/np.sum(np.exp(u/T[i]))

print("T: {:.1f}, p: {}".format(T[0], p[0,:]))
print("T: {:.1f}, p: {}".format(T[1], p[1,:]))
print("T: {:.1f}, p: {}".format(T[2], p[2,:]))

・実行結果

T: 0.3, p: [ 0.00122729  0.03440292  0.96436979]
T: 1.0, p: [ 0.09003057  0.24472847  0.66524096]
T: 10.0, p: [ 0.30060961  0.33222499  0.3671654 ]

上記より、$T<1$を設定するとより極端な結果が、$T>1$を設定するとより一様分布に近い結果が得られることが確認できる。このようにソフトマックス関数に温度スケーリングを導入することで出力の値を調整することができる。

温度スケーリングの使用例

Transformer

温度スケーリングの導入

TransformerのDot Product Attentionでは下記のような計算を行う。
$$
\large
\begin{align}
\mathrm{Attention}(Q, K, V) &= \mathrm{Softmax} \left( \frac{Q K^{\mathrm{T}}}{\sqrt{d}} \right) V
\end{align}
$$

$\sqrt{d}$は温度スケーリング$T$と対応させて理解することができる。ここで上記の$d$はトークン毎の次元数に対応するので、「トークン毎の次元が大きい場合は出力を一様な値に調整する」と大まかに解釈することができる。

$\sqrt{d}$を用いる理由の考察

トークン$i$とトークン$j$に対応する中間層のベクトル$\mathbf{v}_{i} \in \mathbb{R}^{d}, \, \mathbf{v}_{j} \in \mathbb{R}^{d}$を下記のように定義する。
$$
\large
\begin{align}
\mathbf{v}_{i} &= \left( \begin{array}{c} v_{i1} \\ \vdots \\ v_{id} \end{array} \right) \\
\mathbf{v}_{j} &= \left( \begin{array}{c} v_{j1} \\ \vdots \\ v_{jd} \end{array} \right)
\end{align}
$$

このとき、$\mathbf{v}_{i}$と$\mathbf{v}_{j}$の内積$\mathbf{v}_{i} \cdot \mathbf{v}_{j}$は下記のように計算できる。
$$
\large
\begin{align}
\mathbf{v}_{i} \cdot \mathbf{v}_{j} &= \left( \begin{array}{c} v_{i1} \\ \vdots \\ v_{id} \end{array} \right) \cdot \left( \begin{array}{c} v_{j1} \\ \vdots \\ v_{jd} \end{array} \right) \\
&= v_{i1} v_{j1} + \cdots + v_{id} v_{jd} \\
&= x_{1} + \cdots + x_{d} = \sum_{k=1}^{d} x_{k}
\end{align}
$$

上記では式の簡略化にあたって、$x_{k} = v_{ik} v_{jk}$を導入した。ここで$x_{k} \sim \mathcal{N}(0, \sigma^{2}), \, \mathrm{i.i.d.}$を仮定すると、$\displaystyle S = \sum_{k=1}^{d} x_{k}$について正規分布の再生性に基づいて下記が成立する1
$$
\large
\begin{align}
S \sim \mathcal{N}(0, d \sigma^{2})
\end{align}
$$

よって、$S$の標準偏差は$x_{k}$の標準偏差の$\sqrt{d}$倍になる。この結果から、「Transformerにおける温度スケーリングは計算される内積の標準偏差をトークンの次元$d$に依らず一定に保つ目的で導入された」と大まかに解釈できる。

期待校正誤差に基づくソフトマックス出力の校正

DeepLearningの確信度

入力$\mathbf{x}$に対しDeepLearningのソフトマックス演算後の出力を$p(\mathcal{C}_{k}|\mathbf{x})$とおく。この$p(\mathcal{C}_{k}|\mathbf{x})$を「DeepLearningの推論における確信度(confidence)」というが、入力$\mathbf{x}$が得られた際の事後確率と解釈することもできる。

DeepLearningではこの確信度(confidence)は正答率(accuracy)に対し過剰になる場合が多いので注意が必要である。このような場合に用いられる「確信度と正答率が概ね一致するかを確認する指標」の$1$つに期待校正誤差(ECE; Expected Calibration Error)という尺度がある。

以下、期待校正誤差の定義について確認を行う。まず、$N$個のテストサンプルを$M$分割した確信度の範囲$[0,1]$の各区間に分類を行うとき、$M$分割した区間は下記のように表される。
$$
\large
\begin{align}
m = 1 &: \left[ 0, \frac{1}{M} \right] \\
m = 2 &: \left[ \frac{1}{M}, \frac{2}{M} \right] \\
m = 3 &: \left[ \frac{2}{M}, \frac{3}{M} \right] \\
& \vdots \\
m = M-1 &: \left[ \frac{M-2}{M}, \frac{M-1}{M} \right] \\
m = M &: \left[ \frac{M-1}{M}, 1 \right]
\end{align}
$$

このとき$[0,1]$を$M$分割した中の$m$番目のビンに含まれるサンプル集合を$B_{m}$、$B_{m}$に含まれるサンプルの確信度を$\mathrm{conf}(B_{m})$とおくと、$\mathrm{conf}(B_{m})$は大まかに下記の式で近似することが可能である。
$$
\large
\begin{align}
\mathrm{conf}(B_{m}) \simeq \frac{m \, – \, 1/2}{M}
\end{align}
$$

たとえば、$M=10$のとき$m=1, \cdots , 10$について$\mathrm{conf}(B_{m})$の近似値は下記のように計算できる。

$m$$\mathrm{conf}(B_{m})$の近似値
$m=1$$\displaystyle \frac{1 \, – \, 1/2}{10} = 0.05$
$m=2$$\displaystyle \frac{2 \, – \, 1/2}{10} = 0.15$
$m=3$$\displaystyle \frac{3 \, – \, 1/2}{10} = 0.25$
$\vdots$$\vdots$
$m=9$$\displaystyle \frac{9 \, – \, 1/2}{10} = 0.85$
$m=10$$\displaystyle \frac{10 \, – \, 1/2}{10} = 0.95$

$\mathrm{conf}(B_{m})$の値は上記のように近似することが可能だが、各テストサンプルの確信度の平均を計算しても良い。ここでは「深層学習 第$2$版」の内容に基づいて近似式を詳しく確認した。

期待校正誤差の定義

「DeepLearningの確信度」で定義したビン$m$に含まれるサンプル集合$B_{m}$の正答率を$\mathrm{acc}(B_{m})$、確信度を$\mathrm{conf}(B_{m})$のようにおく。このとき期待校正誤差$\mathrm{ECE}$は下記のように定義される。
$$
\large
\begin{align}
\mathrm{ECE} = \sum_{m=1}^{M} \frac{|B_{m}|}{N} \left| \mathrm{acc}(B_{m}) \, – \, \mathrm{conf}(B_{m}) \right| \quad (2)
\end{align}
$$

上記の$|B_{m}|$はビン$m$に含まれるテストサンプルの数、$N$は全テストサンプルの数にそれぞれ対応する。

温度スケーリングを用いたソフトマックス出力の調整

バリデーション2データ上で$(2)$式を計算し、$\mathrm{ECE}$の値が最小になるように下記の$T$を調整し、学習を行うことで正答率に対し確信度が過剰になることを防ぐことができる。
$$
\large
\begin{align}
\mathrm{Softmax}(u_k) = \frac{\exp{(u_k/T)}}{\displaystyle \sum_{j=1}^{K} \exp{(u_j/T)}}
\end{align}
$$

  1. 確率分布からのサンプリングを取り扱う際には「確率変数」か「観測値」かを区別して取り扱うことが多いが、ここでは内容の簡易化にあたって厳密な議論は省略した。また、確率分布には正規分布を仮定したが、再生性が成立するならば他の分布を仮定しても同様な議論が成立する。 ↩︎
  2. 学習時に「学習に用いないサンプルの正答率の計算」に用いるサンプルをバリデーション(validation)データ、学習後に「正答率の計算」に用いるサンプルをテストデータという。双方が同じ場合もあるが、バリデーションとある場合は使い分けることが多い。 ↩︎

DeepLearningを用いた順序回帰(ordinal regression)

順序尺度を目的変数に持つ順序回帰(ordinal regression)は「単なる分類」や「連続値の回帰」と同様な取り扱いをするかどうかを注意して検討する必要があります。当記事ではDeepLearningを用いた順序回帰の取り扱いについて取りまとめを行いました。
当記事の作成にあたっては、「深層学習 第$2$版」の第$2$章「ネットワークの基本構造」の内容などを参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

順序回帰の問題設定と学習の方針

順序回帰の問題設定

口コミサイトやAmazonの$5$段階評価のように、順序が決まったカテゴリを持つ目的変数$y_1, \cdots , y_n$を下記のように定義する。
$$
\large
\begin{align}
y_1, \cdots , y_n & \in \{ C_1, C_2, C_3, C_4, C_5 \} \\
C_1 < C_2 &< C_3 < C_4 < C_5
\end{align}
$$

上記のカテゴリ$C_1$〜$C_5$はそれぞれ$5$段階評価の$1$〜$5$に対応するとここでは解釈する。ここで通常のカテゴリ分類ではこのように$C_1$〜$C_5$が得られた際に$C_3$が正解であれば$C_3$のみが正解、その他は不正解である一方で、上記のような場合、$C_2, C_4$は「正解に近い」と見なせる。

このように目的変数が順序が決まったクラスで表されるとき、「正解/不正解」以外に「正解に近い」というのも取り扱う必要が生じる。

DeepLearningを用いた順序回帰

前項の「順序回帰の問題設定」で確認したように、順序回帰では「多クラス分類」と「通常の回帰」の中間のような取り扱いが必要になる。よって、DeepLearningを順序回帰に用いるにあたっては出力層や損失関数の設計を柔軟に取り扱う必要が生じる。詳しくは次節で取り扱った。

DeepLearningの構成法

DeepLearningを順序回帰に用いるにあたっては、大まかに$2$パターンの構成法が存在する。以下、それぞれについて取りまとめた。

2値分類に基づく構成

DeepLearningを順序回帰に用いるにあたっての方法の$1$つ目が、「クラス数$K$に対し、$K-1$個の$2$値分類に帰着させる方法」である。文章で表すと処理の実体以上に難しいので、まず$3$クラス分類を元に具体的に確認を行う。
$$
\large
\begin{align}
[1, 0]
\end{align}
$$

たとえば$3-1=2$個の$2$値分類が上記のように得られた場合、「正解クラスが$1$より大きく、$2$以下であるので、カテゴリ$2$が対応する」という規則を定義する。このとき$[0, 0]$が得られた場合は「正解クラスが$1$以下」なのでカテゴリ$1$、$[1, 1]$が得られた場合は「正解クラスが$2$より大きい」のでカテゴリ$3$が対応する。同様な規則を用いることで$K$クラス分類問題を$K-1$個の$2$値分類を元に表すことが可能である。

上記のような規則を用いることで「$K$クラス分類を$K-1$個の$2$値分類に帰着させる」ことは基本的には可能である一方で、$[1, 1, 0, 0, 0]$のように$1$から$0$に変わるのは最大$1$回でなければならないという制約があることには注意が必要である。DeepLearningの学習時はアノテーション作成時に$[1, 1, 0, 0, 0]$が自動的に対応する一方で、学習済みのDeepLearningを元に予測を行う際は$[1, 0, 1, 0, 0]$のような結果が出力される場合がある。

$[1, 0, 1, 0, 0]$のような場合を取り扱うにあたっては、予測時は「$1$の数$+1$をカテゴリとする」ことで対処可能である。たとえば$[1, 0, 1, 0, 0]$の場合は$2+1=3$のように計算できる。

一方DeepLearningの学習時はたとえばカテゴリ$3$に対応する$[1, 1, 0, 0, 0]$が出力されるように、各出力層をロジスティック回帰に対応させてクロスエントロピーの最小化によってオーソドックスな学習を行えばよい。

ソフトラベルの使用

DeepLearningを順序回帰に用いるにあたっての方法の$2$つ目が、「$K$クラス分類問題に対しソフトラベル用いる方法」である。一般的な$K$クラス分類問題では目的変数の正解フラグに$1-$of$-K$符号(ハードラベル)を用いるが、確率化と同様な処理を行なったソフトラベルを用いる。
$$
\large
\begin{align}
d_{k} = \frac{\exp{(-|\bar{k}-k|)}}{\sum_{i=1}^{K} \exp{(-|\bar{k}-i|)}}
\end{align}
$$

$\bar{k}$が正解であるとき、ソフトラベル$\mathbf{d}$の$k$成分の$d_k$はたとえば上記のように定義される。$1-$of$-K$表現では$[0, 0, 1, 0, 0]$のように表される場合、$\mathbf{d}$は下記のように計算できる。

import numpy as np

k_t = 3.
idx = np.arange(1,6,1)
d = np.zeros(5)

for k in range(5):
    d[k] = np.exp(-np.abs(k_t-idx[k])) / np.sum(np.exp(-np.abs(k_t-idx)))

print("d: {}".format(d))
print("sum of d: {}".format(np.sum(d)))

・実行結果

d: [ 0.06745081  0.1833503   0.49839779  0.1833503   0.06745081]
sum of d: 1.0

上記のように計算された$\mathbf{d}$を用いてDeepLearningの学習を行うことで順序回帰の学習を行うことができる。推論時にはスコアが最大の$k$がクラスに対応する。

【CNN】DeepLearningで用いられる正規化 〜バッチ正規化、グループ正規化〜

バッチ正規化(batch normalization)のような正規化処理はMLP(Multi Layer Perceptron)に限らず広く用いられます。当記事ではCNN(Convolutional Neural Network)の学習にあたって用いられるバッチ正規化やグループ正規化などについて取りまとめました。
当記事の作成にあたっては、Group Normalization論文や「深層学習 第$2$版」の$5.5$節「畳み込み層の出力の正規化」の内容などを参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

MLPにおける正規化

下記で詳しく取り扱った。

CNNにおける正規化

Group Normalizationの論文とCNNにおける正規化の体系化

CNN(Convolutional Neural Network)における正規化を把握するにあたってはグループ正規化(Group Normalization)論文の図を元に確認すると良い。

Group Normalization論文 Figure$\, 2$

上図に基づいてCNNにおける「バッチ正規化(Batch Normalization)」、「レイヤー正規化(Layer Normalization)」、「インスタンス正規化(Instance Normalization)」、「グループ正規化(Group Normalization)」をそれぞれ理解することが可能である。

図の$C$は畳み込みにおけるチャネル数、$N$は同時に処理するバッチに含まれるサンプル数にそれぞれ対応する。また、$H,W$は画像の高さ$H$と幅$W$を$2$次元から$1$次元に変換したものであると理解すると良い1

以下、「バッチ正規化」、「レイヤー正規化」、「インスタンス正規化」、「グループ正規化」のそれぞれの詳細について確認を行う。

バッチ正規化

バッチ正規化(Batch Normalization)はチャネル毎に「バッチに含まれる全てのサンプルの全ての位置の値の平均・分散を計算」し、正規化処理を行う手法である。チャネル毎に平均$\mu_{c}$を計算することを下記のような式で表すこともできる。
$$
\large
\begin{align}
\mu_{c} = \frac{1}{NWH} \sum_{i,j,n} u_{ijc}^{(n)} \quad (1)
\end{align}
$$

$(1)$式における$u_{ijc}^{(n)}$は$n$番目のサンプルの$c$番目のチャネルにおける位置$(i,j)$の値に対応する。また、$\displaystyle \sum_{i,j,n}$は下記のように置き換えて理解すれば良い。
$$
\large
\begin{align}
\sum_{i,j,n} \longrightarrow \sum_{n=1}^{N} \sum_{i=1}^{W} \sum_{j=1}^{H}
\end{align}
$$

レイヤー正規化

レイヤー正規化(Layer Normalization)はバッチに含まれるサンプル毎に「全てのチャネルの全ての位置の値の平均・分散を計算」し、正規化処理を行う手法である。チャネル毎に平均$\mu_{n}$を計算することを下記のような式で表すこともできる。
$$
\large
\begin{align}
\mu_{c} = \frac{1}{CWH} \sum_{i,j,c} u_{ijc}^{(n)} \quad (2)
\end{align}
$$

$(2)$式の$\displaystyle \sum_{i,j,c}$は下記のように置き換えて理解すれば良い。
$$
\large
\begin{align}
\sum_{i,j,n} \longrightarrow \sum_{c=1}^{C} \sum_{i=1}^{W} \sum_{j=1}^{H}
\end{align}
$$

グループ正規化

グループ正規化(Group Normalization)はレイヤー正規化をチャネル方向にいくつかグループを作成し、正規化を行う手法である。チャネル群の$k$番目のグループのチャネルのインデックスの集合を$\mathcal{S}_{k}$とおくと、サンプル$n$、グループ$k$の平均$\mu_{k}^{(n)}$は下記のように計算できる。
$$
\large
\begin{align}
\mu_{c} = \frac{1}{|\mathcal{S}_{k}|WH} \sum_{c \in \mathcal{S}_{k}} \sum_{i,j} u_{ijc}^{(n)} \quad (3)
\end{align}
$$

上記の$|\mathcal{S}_{k}|$は$\mathcal{S}_{k}$に含まれるチャネルのインデックスの数に対応する。$(3)$式の$\displaystyle \sum_{i,j}$は下記のように置き換えて理解すれば良い。
$$
\large
\begin{align}
\sum_{i,j} \longrightarrow \sum_{i=1}^{W} \sum_{j=1}^{H}
\end{align}
$$

参考

・Group Normalization論文
・バッチ正規化(Batch Normalization)論文

  1. CNNの入力は$(N, C, W, H)$のような$4$次元で表されるが、行列の積に基づく演算の場合は$2$次元、図で表す場合は$3$次元表記が基本となるので、ここで取り扱ったような行列の変換はよく行われることは抑えておくと良い。 ↩︎

DeepLearningの正則化 〜L2正則化、ドロップアウト(dropout)〜

DeepLearningなどの機械学習では学習時に用いたサンプルへの過学習(overfitting)が課題になります。当記事ではDeepLearningで過学習を防ぐにあたって導入される正則化(regularization)の手法であるドロップアウトなどについて取りまとめました。
当記事の作成にあたっては、Dropout論文や「深層学習 第$2$版」の第$3$章「確率的勾配降下法」の内容などを参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提の確認

過学習

学習に用いたサンプル以外のサンプルに対し正しく予測が行えることを汎化(generalization)という。関連して訓練データに対する誤差を訓練誤差(training error)、サンプルの母集団に対する誤差の期待値を汎化誤差(generalization error)という。

一方でサンプルの母集団は具体的に得られないので汎化誤差を直接計算することができない。この対応にあたっては学習に用いる訓練データ以外のテスト用データを用意し訓練誤差と同様に誤差を計算することが多い。テストデータを用いて計算される誤差をテスト誤差(test error)という。

汎化誤差を近似し得るテスト誤差の値が訓練誤差の値と大きく乖離することを過剰適合(overfitting)や過学習(overlearning)という。DeepLearningの学習にあたっては過学習が起こらないようにテスト誤差の値をチェックすることが重要になる。

正則化

DeepLearningのようにパラメータが多い際に過学習は生じやすい。この対応にあたっては「学習時にパラメータに一定の制約を課す」ことが多い。このような「パラメータに制約を課すこと」を「正則化(regularization)」という。

正則化の手法は様々であるが、重回帰やロジスティック回帰のような一般化線形モデル(GLM; Generalized Linear Model)の学習の際にはL$2$正則化、CNNの学習ではドロップアウト(dropout)が用いられることが多い。

L2 正則化

パラメータ$\mathbf{w}$によって予測される結果の$n$番目のサンプルの誤差関数(error function)を$E_{n}(\mathbf{w})$、ミニバッチ$\mathcal{D}_{t}$全体の誤差関数を$E_{t}(\mathbf{w})$とおくとき、L$2$正則化に基づいて$E_{t}(\mathbf{w})$は下記のように表される。
$$
\large
\begin{align}
E_{t}(\mathbf{w}) = \sum_{n \in \mathcal{D}_{t}} E_{n}(\mathbf{w}) + \frac{\lambda}{2} ||\mathbf{w}||^{2}
\end{align}
$$

上記の式は第$2$項を追加することにより、パラメータが大きくならないように勾配が生じると解釈すれば良い。$\lambda$は正則化をどのくらい行うかを表すハイパーパラメータである。$\lambda$の値の直感的な解釈にあたって$f(x,y)=(x-1)^{2}+(y-1)^{2}$の正則化を元に以下、確認を行う。
$$
\large
\begin{align}
f(x, y) &= (x-1)^{2}+(y-1)^{2} \\
g(x, y) &= f(x, y) + \frac{\lambda}{2} (x^{2} + y^{2})
\end{align}
$$

上記の例では$f(x, y)$の偏微分が下記のように計算できる。
$$
\large
\begin{align}
\frac{\partial f(x, y)}{\partial x} &= 2(x-1) \\
\frac{\partial f(x, y)}{\partial y} &= 2(y-1)
\end{align}
$$

上記より$(x,y)=(1,1)$で$f(x,y)$は最小値を持つ1。同様に$g(x,y)$の偏微分は下記のように計算できる。
$$
\large
\begin{align}
\frac{\partial g(x, y)}{\partial x} &= 2(x-1) + \lambda x = (2+\lambda)x \, – \, 2 \\
\frac{\partial g(x, y)}{\partial y} &= 2(y-1) + \lambda y = (2+\lambda)x \, – \, 2
\end{align}
$$

上記より$\displaystyle (x,y) = \left( \frac{2}{2 + \lambda}, \frac{2}{2 + \lambda} \right)$で$g(x,y)$は最小値を持つ。

ここで$\lambda = 0, 2$や$\lambda \to \infty$のとき、$\displaystyle (x,y) = \left( \frac{2}{2 + \lambda}, \frac{2}{2 + \lambda} \right)$はそれぞれ下記のように計算できる。
・$\lambda = 0$
$$
\large
\begin{align}
(x,y) &= \left( \frac{2}{2 + \lambda}, \frac{2}{2 + \lambda} \right) \\
&= \left( \frac{2}{2 + 0}, \frac{2}{2 + 0} \right) = (1,1)
\end{align}
$$

・$\lambda = 2$
$$
\large
\begin{align}
(x,y) &= \left( \frac{2}{2 + \lambda}, \frac{2}{2 + \lambda} \right) \\
&= \left( \frac{2}{2 + 2}, \frac{2}{2 + 2} \right) = \left( \frac{1}{2}, \frac{1}{2} \right)
\end{align}
$$

・$\lambda \to \infty$
$$
\large
\begin{align}
(x,y) &= \left( \frac{2}{2 + \lambda}, \frac{2}{2 + \lambda} \right) \\
& \to (0,0)
\end{align}
$$

よって$\lambda = 0$のとき、$g(x,y)$の最小点は$f(x,y)$の最小点に一致し、$\lambda \to \infty$に近づくにつれて徐々に$(0,0)$に近づいていくことが確認できる。このようにL$2$正則化を行うことで、パラメータの大きさに制約を設定することができる。

L$2$正則化(L$2$ regularization)は主に重回帰やGLMの学習にあたって用いられる手法であるが、DeepLearningはGLMの延長と解釈することもできるので、DeepLearningにL$2$正則化を用いること自体はそれほど不自然ではないので合わせて抑えておく必要がある。

DeepLearningの正則化

ドロップアウト

ドロップアウト(dropout)はニューラルネットワークの学習時に中間層の変数をランダムに選別して削除する方法であり、正則化の$1$つに分類される。

Dropout論文 Figure$\, 1$

MLP(Multi Layer Perceptron)の学習におけるDropoutを図示すると上図の右のようになる。ドロップアウトの処理は、ランダムフォレストのようなアンサンブル学習と同様に解釈すると良い。

また、学習時の変数の採用確率が$p$のレイヤーでは、推論時に「出力を$p$倍する」か「パラメータを$p$倍する」操作が必要であることも注意しておく必要がある。たとえば$p=0.5$のレイヤーでは推論時の層の出力を$0.5$倍する必要がある。

陰的正則化

確率的勾配降下法(SGD; Stochastic Gradient Descent method)では「全てのサンプルを同時に学習させる」ではなく、「サンプルをランダムに選び学習させる」ということが行われる。

この際に目的関数が変化することで正則化のような効果が得られると解釈が可能である。このように「サンプルをランダムに選び学習させる」ことによって得られる「正則化効果」を「陰的正則化」という。学習の早期終了も陰的正則化の$1$つであると見なすことができる。

  1. 元の式が平方完成であることに着目すると$(x,y)=(1,1)$が最下点であることが自明であるが、ここでは$g(x,y)$の最小値問題も同じ手法で解くにあたって偏微分の傾きが$0$になる点を取得した。 ↩︎

【MLP】DeepLearningで用いられる正規化 〜バッチ正規化、レイヤー正規化〜

DeepLearningの学習にあたっては多層の計算処理を行うので、パラメータの値によっては計算結果が外れ値と同様に歪な分布になる場合があります。当記事ではこのような現象の解決にあたって導入されることが多いバッチ正規化やレイヤー正規化などの正規化(normalization)について取りまとめを作成しました。
当記事の作成にあたっては、「深層学習 第$2$版」の$3.6$節「層出力の正規化」の内容などを参考にしました。

・用語/公式解説
https://www.hello-statisticians.com/explain-terms

前提の確認

正規化

サンプル集合$\mathcal{D} = \{ (\mathbf{x}_{1}, \mathbf{y}_{1}), \, \cdots \, (\mathbf{x}_{N}, \mathbf{y}_{N}) \}$が得られたとき、サンプル$\mathbf{x}_{n}$の$i$成分を$x_{n,i}$のように定義する。このとき$x_{n,i}$の正規化は下記のような式で表される。
$$
\large
\begin{align}
x_{n,i} & \longleftarrow \frac{x_{n,i} \, – \, \bar{x}_{i}}{\sqrt{\sigma_{i}^{2} + \varepsilon}} \\
\bar{x}_{i} &= \frac{1}{N} \sum_{n=1}^{N} x_{n, i} \\
\sigma_{i} &= \sqrt{\frac{1}{N} \sum_{n=1}^{N}(x_{n,i}-\bar{x}_{i})^{2}}
\end{align}
$$

上記の$\varepsilon$は$\sigma_{i}=0$のときも計算が行われるように$\varepsilon=10^{-5}$のような小さな数を設定する。任意の$n$について$x_{n,i}=\bar{x}_{i}$が成立する際に$\sigma_{i}=0$が成立することも合わせて抑えておくと良い。

DeepLearningにおける正規化

バッチ正規化

サンプル集合$\mathcal{D} = \{ (\mathbf{x}_{1}, \mathbf{y}_{1}), \, \cdots \, (\mathbf{x}_{N}, \mathbf{y}_{N}) \}$の$\mathbf{x}_{n}$の中間層$\mathbf{u}_{n} \in \mathbb{R}^{D}$を下記のように定義する。
$$
\large
\begin{align}
\hat{u}_{n} = \left( \begin{array}{ccc} u_{n1} & \cdots & u_{nD} \end{array} \right) \quad (1)
\end{align}
$$

このときバッチ正規化(batch normalization)の演算は下記のような式で定義される。
$$
\large
\begin{align}
\hat{u}_{nj} &= \gamma_{j} \frac{u_{nj} \, – \, \mu_{j}}{\sqrt{\sigma_{i}^{2} + \varepsilon}} + \beta_{j} \\
\mu_{j} &= \frac{1}{N} \sum_{n=1}^{N} u_{nj} \\
\sigma_{j} &= \sqrt{\frac{1}{N} \sum_{n=1}^{N}(u_{nj}-\mu_{j})^{2}}
\end{align}
$$

上記のようにバッチ正規化では$n$番目のサンプルの中間層$\hat{u}_{nj}$を全ての中間層の位置$j$の値に基づいて正規化を行うことで得る。バッチ正規化はある程度の数のバッチサイズがある前提の計算であるので、バッチが少ない場合やサンプル$1$つの推論を行う際はそのままの処理を用いることができない。特に推論を行う際はサンプル$1$つの計算を行う場合が多いので、学習時に計算を行った$\mu_{j}$や$\sigma_{j}$の値の移動平均を用いるなどで代用することが多い。また、$\beta_{j}, \gamma_{j}$は初期値を$\beta_{j}=0, \gamma_{j}=1$に設定した上でMLPのアフィン変換のパラメータと同様に学習を行います。

レイヤー正規化

前項「バッチ正規化」の$(1)$のようにサンプル集合を定義するとき、レイヤー正規化(layer normalization)の演算は下記のような式で定義される。
$$
\large
\begin{align}
\hat{u}_{nj} &= \gamma_{j} \frac{u_{nj} \, – \, \mu}{\sqrt{\sigma^{2} + \varepsilon}} + \beta_{j} \\
\mu &= \frac{1}{ND} \sum_{n=1}^{N} \sum_{j=1}^{D} u_{nj} \\
\sigma &= \sqrt{\frac{1}{ND} \sum_{n=1}^{N} \sum_{j=1}^{D} (u_{nj}-\mu)^{2}}
\end{align}
$$