前回(
詳しくはコチラ
)は、Encoder 側の Multi-Head Self-Attention
$$
\operatorname{MultiHead}_{\mathrm{enc}}(Z)
$$
を定義した。
これは、入力表現列 $Z\in\mathbb{R}^{n\times d_{\mathrm{model}}}$ の各位置の表現を、自分自身を含む入力列全体の文脈に応じて更新する sub-layer である。
しかし、原論文の Encoder layer は、Multi-Head Self-Attention sub-layer だけで構成されるわけではない(※1)。
原論文の Encoder layer は、次の $2$ つの sub-layer からなる。
-さらに、原論文では、それぞれの sub-layer のまわりに residual connection を置き、
その後に layer normalization を行う。
すなわち、sub-layer の入力を $x\in\mathbb{R}^{n\times d_{\mathrm{model}}}$ とし、sub-layer 自体が定める写像を $\operatorname{Sublayer}(x)\in\mathbb{R}^{n\times d_{\mathrm{model}}}$ と書くと、
各 sub-layer の出力は、基本形として
$$
\operatorname{LayerNorm}(x+\operatorname{Sublayer}(x))
$$
の形で与えられる(※2)。
したがって、Encoder layer 全体を定義するためには、次に
$$
\operatorname{FFN},\quad
\text{residual connection},\quad
\operatorname{LayerNorm},\quad
\operatorname{AddNorm}
$$
を定義する必要がある。
※1. これを聞いて『(タイトルに反して)必要なのは Attention だけじゃないやんけ('Д')』
と思った方のために言っておくと、
$$
\begin{align}
&\quad \text{Attention Is All You Need}\\
&\text{(必要なのは Attention だけである)}
\end{align}
$$
は Transformer が attention sub-layer だけで構成されるという意味で言っているわけではない。
原論文における主張は、従来の系列変換モデルでよく用いられていた再帰構造や畳み込み構造を使わず、
『attention mechanism を中心として系列変換モデルを構成できるよ(´・ω・`)om』
という意味である。
$ $
※2. ただし、原論文の training 時には、sub-layer の出力に dropout を適用してから
residual connection と layer normalization を行う。
本稿では、まず dropout を省略した基本形を扱うことにする。
Feed-Forward Network は一般的な用語であり、
入力から出力へ一方向に情報が流れるニューラルネットワークを広く指す。
$ $
一方、Transformer 原論文における Position-wise Feed-Forward Network は、
各位置の表現ベクトルに対して同じ Feed-Forward Network を独立に適用する sub-layer である。
$ $
したがって、本稿で単に
$$
\operatorname{FFN}
$$
と書く場合には、特に断らない限り、
Transformer の各層で用いられる Position-wise Feed-Forward Network を指すことにする。
本稿では、Feed-Forward Network の基本となる Neural Network の数学的な構成から始めよう。
その後、大規模言語モデルの数学的原理④にて Neural Network の学習を記述するために、
損失関数、勾配降下法、Backpropagation を定義する。
$ $
次に、深いネットワークを学習しやすくするための residual connection と、
表現を正規化して学習を安定させるための Layer Normalization を定義する。
さらに、これらを組み合わせた Add & Norm を定義する。
$ $
最後に、Transformer で用いられる Position-wise Feed-Forward Network を定義し、
Encoder layer と Encoder stack を構成する。という流れで進めていく。
Transformer Architecture (出典:Vaswani et al., "Attention Is All You Need," 2017)
AI の研究者ではないため(一応データサイエンティストではあるけど...)、
厳密な用語や実装上の詳細については原論文
Attention Is All You Need
を参照されたい。
$ $
$$
\begin{align}
&\text{Deep learning allows computational models that are composed of multiple processing layers}\\
&\text{to learn representations of data with multiple levels of abstraction.}\\
\end{align}
$$
$$
\begin{align}
&\text{(深層学習は、複数の処理層からなる計算モデルが、データの表現を複数の抽象度で学習できるようにする方法である。)}
\end{align}
$$
$$
\text{LeCun, Bengio, Hinton, Deep learning, Nature, 2015}
$$
$ $
Neural Network は、
重み、バイアス、活性化関数などをもつ計算単位を組み合わせて作られるモデル全般を指す広い用語である。
一方、Feed-Forward Network は、入力から出力へ向かって計算が一方向に進む Neural Network である。
典型的には、入力を
$$
\mathbf{h}^{(0)}:=\mathbf{x}
$$
とおき、各層の写像 $f_1,\ldots,f_L$ によって
$$
\mathbf{h}^{(\ell)}:=f_\ell(\mathbf{h}^{(\ell-1)})
\quad
(\ell=1,\ldots,L)
$$
と順に計算する。
このとき、全体の写像は
$$
F
=
f_L\circ f_{L-1}\circ\cdots\circ f_1
$$
で表される。
$ $
このように、入力から出力へ向かって層を順に合成して得られる Neural Network を Feed-Forward Network という。
したがって、Feed-Forward Network は Neural Network の一種である。
$ $
ただし、すべての Neural Network が Feed-Forward Network であるわけではない。
例えば、Recurrent Neural Network(RNN) のように、過去の状態や出力を次の計算に戻す構造をもつ Neural Network もある。
$d_{\mathrm{in}}\in\mathbb{N}_{>0}$ とする。
ニューラルネットワークの入力として扱う行ベクトル
$$
\mathbf{x}\in\mathbb{R}^{1\times d_{\mathrm{in}}}
$$
を入力ベクトルという。ここで、$d_{\mathrm{in}}$ を入力次元という。
本稿では、Transformer の表記とそろえるため、ベクトルを行ベクトルとして扱う。
したがって、重み行列は右から掛ける。
自然言語処理では、文字列やトークンそのものを直接 $\mathbb{R}^{1\times d_{\mathrm{in}}}$ の元と見るのではなく、
埋め込みなどによって数値ベクトルに変換したものを入力ベクトルとして扱う。
$ $
Transformer では、各位置の表現ベクトルを行に並べた行列
$$
X\in\mathbb{R}^{n\times d_{\mathrm{model}}}
$$
を入力表現として扱う(
詳しくはコチラ
)。
このとき、各 $i\in\{1,\ldots,n\}$ に対して、第 $i$ 行
$$
\mathbf{x}_i:=X_{i,:}\in\mathbb{R}^{1\times d_{\mathrm{model}}}
$$
は第 $i$ 位置の入力ベクトルと見なせる。
$d_{\mathrm{in}},d_{\mathrm{out}}\in\mathbb{N}_{>0}$ とする。
入力ベクトルを
$$
\mathbf{x}\in\mathbb{R}^{1\times d_{\mathrm{in}}}
$$
とする。
学習過程で更新の対象となるものを学習パラメータという。
ニューラルネットワークにおいては、重み行列 $W$ とバイアス行ベクトル $\mathbf{b}$ は学習パラメータである。
$ $
無論、学習パラメータは、重み行列やバイアス行ベクトルに限られない。
例えば、Transformer における Query 変換行列、Key 変換行列、Value 変換行列
$$
W^Q,\quad W^K,\quad W^V
$$
や、出力変換行列
$$
W^O
$$
も学習パラメータである。
また、Layer Normalization におけるスケールパラメータとシフトパラメータも、学習パラメータとして扱われる。
重み行列 $W$ は、入力ベクトルの各成分をどのように組み合わせて出力側の各成分を作るかを定める。
バイアス行ベクトル $\mathbf{b}$ は、その出力に加えられる平行移動の成分を定める。
$ $
したがって、重み行列 $W$ とバイアス行ベクトル $\mathbf{b}$ を用いると、写像
$$
\mathbf{x}\mapsto \mathbf{x}W+\mathbf{b}
$$
が定まる。これは、ニューラルネットワークの層を定義する基本的な部品である。
$d_{\mathrm{in}},d_{\mathrm{out}}\in\mathbb{N}_{>0}$ とする。
重み行列
$$
W\in\mathbb{R}^{d_{\mathrm{in}}\times d_{\mathrm{out}}}
$$
とバイアス行ベクトル
$$
\mathbf{b}\in\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
を固定する。
写像
$$
A_{W,\mathbf{b}}:\mathbb{R}^{1\times d_{\mathrm{in}}}\to\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
を、各 $\mathbf{x}\in\mathbb{R}^{1\times d_{\mathrm{in}}}$ に対して
$$
A_{W,\mathbf{b}}(\mathbf{x})
:=
\mathbf{x}W+\mathbf{b}
$$
で定める。
この写像 $A_{W,\mathbf{b}}$ を、重み行列 $W$ とバイアス行ベクトル $\mathbf{b}$ によるアフィン写像という。
ここでは、
$$
\mathbf{x}\in\mathbb{R}^{1\times d_{\mathrm{in}}},\quad
W\in\mathbb{R}^{d_{\mathrm{in}}\times d_{\mathrm{out}}},\quad
\mathbf{b}\in\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
である。
まず、$\mathbf{x}$ は $1$ 行 $d_{\mathrm{in}}$ 列の行ベクトルであり、$W$ は $d_{\mathrm{in}}$ 行 $d_{\mathrm{out}}$ 列の行列である。
したがって、$\mathbf{x}$ の列数と $W$ の行数がどちらも $d_{\mathrm{in}}$ で一致するので、行列積
$$
\mathbf{x}W
$$
は定義される。
また、行列積の型は
$$
(1\times d_{\mathrm{in}})(d_{\mathrm{in}}\times d_{\mathrm{out}})
=
1\times d_{\mathrm{out}}
$$
であるから、
$$
\mathbf{x}W\in\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
である。
さらに、
$$
\mathbf{b}\in\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
であるため、$\mathbf{x}W$ と $\mathbf{b}$ は同じ型の行ベクトルである。
したがって、成分ごとの和
$$
\mathbf{x}W+\mathbf{b}
$$
が定義され、
$$
\mathbf{x}W+\mathbf{b}\in\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
である。
$d_{\mathrm{in}},d_{\mathrm{out}}\in\mathbb{N}_{>0}$ とする。
また、
$$
W\in\mathbb{R}^{d_{\mathrm{in}}\times d_{\mathrm{out}}},\quad
\mathbf{b}\in\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
とする。
-以上より、バイアス $\mathbf{b}$ がない場合、写像
$$
\mathbf{x}\mapsto \mathbf{x}W
$$
は線形写像である。
一方、バイアス $\mathbf{b}$ が $\mathbf{0}$ でない場合、写像
$$
\mathbf{x}\mapsto \mathbf{x}W+\mathbf{b}
$$
は線形写像ではなく、アフィン写像である。
$m\in\mathbb{N}_{>0}$ とする。
活性化関数を用いる主な理由は、ニューラルネットワークに非線形性を導入するためである。
もし各層で用いる活性化関数が線形写像であるなら、各層はアフィン写像のままである。
さらに、線形な活性化関数だけでなく、アフィンな活性化関数だけを用いる場合にも、
各層はアフィン写像のままである。
$ $
また、アフィン写像の合成は再びアフィン写像である。
したがって、複数の層を重ねても、全体としては $1$ つのアフィン写像で表される。
このため、層をいくら深くしても、入力から出力への写像としては、
$1$ つのアフィン写像で表せる範囲を超えない。
$ $
特に、入力も出力も $1$ 次元の場合には、そのグラフは直線になる。
より一般に、入力が $\mathbb{R}^{1\times d}$ の元であり、
出力が $\mathbb{R}$ の元である場合、全体の写像がアフィン写像なら、そのグラフは $\mathbb{R}^{d+1}$ 内の超平面である。
$ $
このため、ニューラルネットワークでは、
$\mathbf{u}\in\mathbb{R}^{1\times m}$ に対して、非線形な活性化関数 $\sigma$ を用いて
$$
\mathbf{u}
\mapsto
\sigma^{[m]}(\mathbf{u})
$$
という操作を行うことにより、非線形な表現を獲得する。
特に、隠れ層では通常、ReLU などの非線形な活性化関数を用いる。
$ $
ただし、恒等関数のような線形関数も、出力層などでは活性化関数として扱われることがある。
したがって、非線形性を導入することは活性化関数を用いる主な目的であるが、活性化関数の定義そのものには含めない。
スカラー値に対する活性化関数には多くの種類がある。
以下では、代表的なものを列挙する(基本的かつ重要な関数は赤字にした)。
ベクトル値に対する活性化関数には多くの種類がある。
以下では、代表的なものを列挙する(基本的かつ重要な関数は赤字にした)。
上のうち、Sigmoid、$\tanh$、ReLU、Leaky ReLU、Softplus、ELU、GELU、SiLU、Mish などは、
実数から実数への関数
$$
\sigma:\mathbb{R}\to\mathbb{R}
$$
として定義できる。
このような関数は、任意の $m\in\mathbb{N}_{>0}$ に対して、成分ごとの拡張
$$
\sigma^{[m]}:\mathbb{R}^{1\times m}\to\mathbb{R}^{1\times m}
$$
を定める。
一方、Softmax、LogSoftmax、GLU、Maxout などは、単純に同じ関数を各成分へ独立に適用する写像ではない。
したがって、本稿で「成分ごとに適用する活性化関数」という場合には、主に
$$
\sigma:\mathbb{R}\to\mathbb{R}
$$
として定義できる活性化関数を指す。
以下に記す Sigmoid 関数と深層学習の歴史は重要なので、知っておくと良い('Д')。
-以上をまとめると、Sigmoid 関数は、微分可能で確率的解釈もしやすい活性化関数として、
古典的なニューラルネットワークで重要な役割を果たした。
$ $
しかし、深いネットワークでは飽和による勾配消失が問題になりやすいため、
現在の隠れ層では ReLU やその変種が用いられることが多い。
$ $
一方で、Sigmoid 関数が不要になったわけではない。
現在でも、$2$ 値分類の出力層や、ゲート構造をもつニューラルネットワークでは、Sigmoid 関数が用いられることがある。
Sigmoid 関数は、各 $t\in\mathbb{R}$ に対して
$$
\operatorname{sigmoid}(t)
=
\frac{1}{1+\exp(-t)}
$$
で定義される。
一方、$m\in\mathbb{N}_{>0}$ に対して、Softmax 関数は
$$
\operatorname{softmax}:\mathbb{R}^{1\times m}\to\mathbb{R}^{1\times m}
$$
であり、各
$$
\mathbf{z}=(z_1,\ldots,z_m)\in\mathbb{R}^{1\times m}
$$
に対して
$$
\operatorname{softmax}(\mathbf{z})_j
:=
\frac{\exp(z_j)}{\sum_{k=1}^{m}\exp(z_k)}
$$
で定義される。
Softmax 関数は、複数の実数値スコアを、和が $1$ である正のベクトルへ変換する関数である。
そのため、多クラス分類の出力層や、attention weight の計算で用いられる。
$ $
Sigmoid 関数と Softmax 関数は別々の関数であるが、$2$ クラスの場合には密接な関係がある。
-このように、$2$ クラス分類では、出力を $1$ 個のスコア $t$ として
$$
\operatorname{sigmoid}(t)
$$
を用いる書き方と、出力を $2$ 個のスコア $(a,b)$ として
$$
\operatorname{softmax}(a,b)
$$
を用いる書き方は、数学的に対応している。
$ $
ただし、Softmax は出力成分全体を正規化して、成分の和が $1$ になるようにする関数である。
一方、Sigmoid は各実数を独立に $0$ と $1$ の間へ写す関数である。
$ $
したがって、多クラス分類で「ちょうど $1$ つのクラスが正しい」と仮定する場合には Softmax が自然である。
一方、複数のラベルが同時に正しくなり得る多ラベル分類では、各ラベルごとに Sigmoid 関数を適用することがある。
$d_{\mathrm{in}}\in\mathbb{N}_{>0}$ とする。
重み列ベクトル
$$
\mathbf{w}\in\mathbb{R}^{d_{\mathrm{in}}\times 1}
$$
とバイアス
$$
b\in\mathbb{R}
$$
と活性化関数
$$
\sigma:\mathbb{R}\to\mathbb{R}
$$
を固定する。
写像
$$
\nu:\mathbb{R}^{1\times d_{\mathrm{in}}}\to\mathbb{R}
$$
を、各 $\mathbf{x}\in\mathbb{R}^{1\times d_{\mathrm{in}}}$ に対して
$$
\nu(\mathbf{x})
:=
\sigma(\mathbf{x}\mathbf{w}+b)
$$
で定める。ただし、$\mathbf{x}\mathbf{w}\in\mathbb{R}^{1\times 1}$ は、その唯一の成分によって実数と同一視する。
この写像 $\nu$ を、$1$ つのニューロンまたはユニットという。
定義より、ニューロンは入力ベクトル
$$
\mathbf{x}\in\mathbb{R}^{1\times d_{\mathrm{in}}}
$$
に対して、重み列ベクトル
$$
\mathbf{w}\in\mathbb{R}^{d_{\mathrm{in}}\times 1}
$$
との積を取り、バイアス
$$
b\in\mathbb{R}
$$
を加えた後、活性化関数
$$
\sigma:\mathbb{R}\to\mathbb{R}
$$
を適用する写像である。
$ $
入力ベクトルと重み列ベクトルを成分表示して、
$$
\mathbf{x}
=
(x_1,\ldots,x_{d_{\mathrm{in}}})
\in\mathbb{R}^{1\times d_{\mathrm{in}}}
$$
$$
\mathbf{w}
=
\begin{pmatrix}
w_1\\
\vdots\\
w_{d_{\mathrm{in}}}
\end{pmatrix}
\in\mathbb{R}^{d_{\mathrm{in}}\times 1}
$$
と書く。
このとき、
$$
\mathbf{x}\mathbf{w}
=
(x_1,\ldots,x_{d_{\mathrm{in}}})
\begin{pmatrix}
w_1\\
\vdots\\
w_{d_{\mathrm{in}}}
\end{pmatrix}
=
\sum_{j=1}^{d_{\mathrm{in}}}x_jw_j
$$
である。
したがって、ニューロンの出力は
$$
\nu(\mathbf{x})
=
\sigma
\left(
\sum_{j=1}^{d_{\mathrm{in}}}x_jw_j+b
\right)
$$
である。
つまり、ニューロンは、入力の各成分 $x_j$ に対応する重み $w_j$ を掛け、
それらを足し合わせ、バイアス $b$ を加えた値に活性化関数 $\sigma$ を適用する。
例えば、
$$
d_{\mathrm{in}}=3
$$
とし、入力ベクトルを
$$
\mathbf{x}=(2,-1,3)\in\mathbb{R}^{1\times 3}
$$
とする。
また、重み列ベクトルとバイアスを
$$
\mathbf{w}
=
\begin{pmatrix}
1\\
2\\
-1
\end{pmatrix}
\in\mathbb{R}^{3\times 1},
\quad
b=4
$$
とする。
活性化関数として ReLU
$$
\operatorname{ReLU}(t)=\max\{0,t\}
$$
を用いる。
このとき、まずアフィン写像部分は
$$
\begin{align}
\mathbf{x}\mathbf{w}+b
&=
(2,-1,3)
\begin{pmatrix}
1\\
2\\
-1
\end{pmatrix}
+4
\\
&=
2\cdot 1+(-1)\cdot 2+3\cdot(-1)+4
\\
&=
2-2-3+4
\\
&=
1
\end{align}
$$
である。
したがって、ニューロンの出力は
$$
\begin{align}
\nu(\mathbf{x})
&=
\operatorname{ReLU}(\mathbf{x}\mathbf{w}+b)
\\
&=
\operatorname{ReLU}(1)
\\
&=
1
\end{align}
$$
である。
この例では、入力ベクトル $\mathbf{x}$ に対して、重み付き和とバイアスを計算した値が $1$ であり、
それに ReLU を適用しても $1$ のままである。
複数のニューロンを横に並べると、出力は行ベクトルになる。
$m\in\mathbb{N}_{>0}$ とし、各 $k\in\{1,\ldots,m\}$ に対して、第 $k$ ニューロンの重み列ベクトルを
$$
\mathbf{w}_k\in\mathbb{R}^{d_{\mathrm{in}}\times 1}
$$
とし、バイアスを
$$
b_k\in\mathbb{R}
$$
とする。
これらを列として並べて
$$
W:=
\begin{pmatrix}
\mathbf{w}_1 & \cdots & \mathbf{w}_m
\end{pmatrix}
\in\mathbb{R}^{d_{\mathrm{in}}\times m}
$$
と定め、また
$$
\mathbf{b}:=(b_1,\ldots,b_m)\in\mathbb{R}^{1\times m}
$$
と定める。
このとき、複数のニューロンをまとめた写像は
$$
\mathbf{x}
\mapsto
\sigma^{[m]}(\mathbf{x}W+\mathbf{b})
$$
という形で書ける。
ここで、$\sigma^{[m]}$ は、スカラー値に対する活性化関数 $\sigma$ を行ベクトルの各成分に適用する写像である。
$d_{\mathrm{in}},d_{\mathrm{out}}\in\mathbb{N}_{>0}$ とする。
重み行列
$$
W\in\mathbb{R}^{d_{\mathrm{in}}\times d_{\mathrm{out}}}
$$
とバイアス行ベクトル
$$
\mathbf{b}\in\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
と活性化関数
$$
\sigma:\mathbb{R}\to\mathbb{R}
$$
を固定する。
また、$\sigma$ の成分ごとの拡張
$$
\sigma^{[d_{\mathrm{out}}]}:\mathbb{R}^{1\times d_{\mathrm{out}}}\to\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
を考える。
写像
$$
L_{W,\mathbf{b},\sigma}:
\mathbb{R}^{1\times d_{\mathrm{in}}}
\to
\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
を、各 $\mathbf{x}\in\mathbb{R}^{1\times d_{\mathrm{in}}}$ に対して
$$
L_{W,\mathbf{b},\sigma}(\mathbf{x})
:=
\sigma^{[d_{\mathrm{out}}]}(\mathbf{x}W+\mathbf{b})
$$
で定める。
この写像 $L_{W,\mathbf{b},\sigma}$ を、重み行列 $W$、バイアス行ベクトル $\mathbf{b}$、活性化関数 $\sigma$ による全結合層という。
出力層などでは、活性化関数を明示的に入れず、
$$
L_{W,\mathbf{b}}(\mathbf{x})=\mathbf{x}W+\mathbf{b}
$$
とすることもある。
この場合は、恒等関数
$$
\operatorname{id}_{\mathbb{R}}(t):=t
$$
を活性化関数として用いていると見なせる。
全結合層は、複数のニューロンを横に並べたものと見なせる。
入力ベクトルを
$$
\mathbf{x}
=
(x_1,\ldots,x_{d_{\mathrm{in}}})
\in\mathbb{R}^{1\times d_{\mathrm{in}}}
$$
とする。
また、重み行列を成分表示して
$$
W
=
(w_{i,j})
\in
\mathbb{R}^{d_{\mathrm{in}}\times d_{\mathrm{out}}}
$$
とし、バイアス行ベクトルを
$$
\mathbf{b}
=
(b_1,\ldots,b_{d_{\mathrm{out}}})
\in
\mathbb{R}^{1\times d_{\mathrm{out}}}
$$
とする。
このとき、まずアフィン写像部分
$$
\mathbf{x}W+\mathbf{b}
$$
を計算する。
$\mathbf{x}W$ の第 $j$ 成分は、各 $j\in\{1,\ldots,d_{\mathrm{out}}\}$ に対して
$$
(\mathbf{x}W)_j
=
\sum_{i=1}^{d_{\mathrm{in}}}x_iw_{i,j}
$$
である。
したがって、
$$
(\mathbf{x}W+\mathbf{b})_j
=
\sum_{i=1}^{d_{\mathrm{in}}}x_iw_{i,j}+b_j
$$
である。
よって、全結合層の出力
$$
L_{W,\mathbf{b},\sigma}(\mathbf{x})
=
\sigma^{[d_{\mathrm{out}}]}(\mathbf{x}W+\mathbf{b})
$$
の第 $j$ 成分は
$$
\left(L_{W,\mathbf{b},\sigma}(\mathbf{x})\right)_j
=
\sigma
\left(
\sum_{i=1}^{d_{\mathrm{in}}}x_iw_{i,j}+b_j
\right)
$$
である。
つまり、第 $j$ 出力成分は、入力成分
$$
x_1,\ldots,x_{d_{\mathrm{in}}}
$$
を重み
$$
w_{1,j},\ldots,w_{d_{\mathrm{in}},j}
$$
によって重み付き和し、バイアス $b_j$ を加え、その値に活性化関数 $\sigma$ を適用したものである。
この意味で、全結合層では、各出力ユニットがすべての入力成分と結合している。
$L\in\mathbb{N}_{>0}$ とする。$d_0,d_1,\ldots,d_L\in\mathbb{N}_{>0}$ とする。
各 $\ell\in\{1,\ldots,L\}$ に対して、重み行列とバイアス行ベクトルを
$$
W_\ell\in\mathbb{R}^{d_{\ell-1}\times d_\ell},
\quad
\mathbf{b}_\ell\in\mathbb{R}^{1\times d_\ell}
$$
とする。
また、各 $\ell\in\{1,\ldots,L\}$ に対して、活性化関数を
$$
\sigma_\ell:\mathbb{R}\to\mathbb{R}
$$
とし、その成分ごとの拡張を
$$
\sigma_\ell^{[d_\ell]}:\mathbb{R}^{1\times d_\ell}\to\mathbb{R}^{1\times d_\ell}
$$
とする。
Feed-Forward Network では、計算が
$$
\mathbf{h}^{(0)}
\to
\mathbf{h}^{(1)}
\to
\cdots
\to
\mathbf{h}^{(L)}
$$
のように入力側から出力側へ一方向に進む。
この意味で feed-forward という。
上の定義では、各層の活性化関数
$$
\sigma_\ell:\mathbb{R}\to\mathbb{R}
$$
は、あらかじめ固定された関数であると考えている。
この場合、学習によって更新される対象は、各層の重み行列
$$
W_\ell\in\mathbb{R}^{d_{\ell-1}\times d_\ell}
$$
とバイアス行ベクトル
$$
\mathbf{b}_\ell\in\mathbb{R}^{1\times d_\ell}
$$
である。
したがって、この場合には、学習パラメータ族を
$$
\theta:=((W_\ell,\mathbf{b}_\ell))_{\ell=1}^{L}
$$
と書いてよい。
$ $
ただし、活性化関数そのものが学習によって更新されるパラメータを含む場合には、
そのパラメータも学習パラメータ族に含める必要がある。
$ $
例えば、第 $\ell$ 層の活性化関数として Parametric ReLU
$$
\sigma_{\alpha_\ell}(t)
:=
\begin{cases}
\alpha_\ell t & (t<0)\\
t & (t\ge 0)
\end{cases}
$$
を用い、$\alpha_\ell$ も学習によって更新する場合には、$\alpha_\ell$ も学習パラメータである。
このとき、学習パラメータ族は、例えば
$$
\theta:=((W_\ell,\mathbf{b}_\ell,\alpha_\ell))_{\ell=1}^{L}
$$
のように書く。
つまり、$\theta$ は単に重み行列とバイアス行ベクトルだけを表す記号ではなく、
そのモデルにおいて学習によって更新されるすべてのパラメータをまとめた記号である。
$ $
本稿では、特に断らない限り、活性化関数は固定されているものとし、
$$
\theta:=((W_\ell,\mathbf{b}_\ell))_{\ell=1}^{L}
$$
と書くことにする。
例えば、
$$
L=2,\quad d_0=2,\quad d_1=3,\quad d_2=1
$$
とする。
このとき、入力は $2$ 次元の行ベクトルであり、第 $1$ 層の出力は $3$ 次元の行ベクトル、第 $2$ 層の出力は $1$ 次元の行ベクトルである。
入力を
$$
\mathbf{x}=(1,2)\in\mathbb{R}^{1\times 2}
$$
とする。
また、第 $1$ 層の重み行列とバイアス行ベクトルを
$$
W_1
=
\begin{pmatrix}
1 & 0 & -1\\
2 & 1 & 1
\end{pmatrix}
\in\mathbb{R}^{2\times 3}
$$
$$
\mathbf{b}_1=(0,1,-2)\in\mathbb{R}^{1\times 3}
$$
とする。
第 $2$ 層の重み行列とバイアス行ベクトルを
$$
W_2
=
\begin{pmatrix}
1\\
-1\\
2
\end{pmatrix}
\in\mathbb{R}^{3\times 1}
$$
$$
\mathbf{b}_2=(1)\in\mathbb{R}^{1\times 1}
$$
とする。
活性化関数として、第 $1$ 層では ReLU
$$
\sigma_1(t):=\operatorname{ReLU}(t)=\max\{0,t\}
$$
を用い、第 $2$ 層では恒等関数
$$
\sigma_2(t):=t
$$
を用いる。
$ $
-このように、Feed-Forward Network では、第 $1$ 層で得られた出力
$$
\mathbf{h}^{(1)}
$$
が第 $2$ 層の入力として用いられる。
つまり、計算は
$$
\mathbf{h}^{(0)}
\to
\mathbf{h}^{(1)}
\to
\mathbf{h}^{(2)}
$$
のように、入力側から出力側へ一方向に進む。
$L\in\mathbb{N}_{>0}$ とする。$d_0,d_1,\ldots,d_L\in\mathbb{N}_{>0}$ とする。
本稿では、入力
$$
\mathbb{R}^{1\times d_0}
$$
そのものは層として数えず、各 $\ell\in\{1,\ldots,L\}$ に対して、写像
$$
L_\ell:\mathbb{R}^{1\times d_{\ell-1}}\to\mathbb{R}^{1\times d_\ell}
$$
を層とする。
Feed-Forward Network
$$
f_\theta:\mathbb{R}^{1\times d_0}\to\mathbb{R}^{1\times d_L}
$$
が
$$
f_\theta
=
L_L\circ L_{L-1}\circ\cdots\circ L_1
$$
で表されているとする。
回帰問題では、出力層をアフィン写像のままにすることがある。
すなわち、出力層を
$$
L_L(\mathbf{h})
=
\mathbf{h}W_L+\mathbf{b}_L
$$
の形にすることがある。
$ $
分類問題では、出力層から得られる実数値ベクトルを logits として扱い、
その後に softmax 関数などを適用して、各クラスに対応する確率ベクトルを得ることがある。
$ $
ただし、文脈によっては、この softmax 関数まで含めて出力層と呼ぶこともある。
$L\in\mathbb{N}_{>0}$ とする。$d_0,d_1,\ldots,d_L\in\mathbb{N}_{>0}$ とする。
各 $\ell\in\{1,\ldots,L\}$ に対して、
$$
W_\ell\in\mathbb{R}^{d_{\ell-1}\times d_\ell},
\quad
\mathbf{b}_\ell\in\mathbb{R}^{1\times d_\ell}
$$
とする。
また、各 $\ell\in\{1,\ldots,L\}$ に対して、活性化関数 $\sigma_\ell:\mathbb{R}\to\mathbb{R}$ がアフィン関数であり、ある $c_\ell,r_\ell\in\mathbb{R}$ によって
$$
\sigma_\ell(t)=c_\ell t+r_\ell
\quad
(t\in\mathbb{R})
$$
と書けるとする。
入力を
$$
\mathbf{h}^{(0)}:=\mathbf{x}\in\mathbb{R}^{1\times d_0}
$$
とし、各 $\ell\in\{1,\ldots,L\}$ に対して
$$
\mathbf{a}^{(\ell)}
:=
\mathbf{h}^{(\ell-1)}W_\ell+\mathbf{b}_\ell
\in\mathbb{R}^{1\times d_\ell}
$$
$$
\mathbf{h}^{(\ell)}
:=
\sigma_\ell^{[d_\ell]}(\mathbf{a}^{(\ell)})
\in\mathbb{R}^{1\times d_\ell}
$$
と定める。
このとき、ある
$$
W_*\in\mathbb{R}^{d_0\times d_L},
\quad
\mathbf{b}_*\in\mathbb{R}^{1\times d_L}
$$
が存在して、任意の $\mathbf{x}\in\mathbb{R}^{1\times d_0}$ に対して
$$
\mathbf{h}^{(L)}
=
\mathbf{x}W_*+\mathbf{b}_*
$$
が成り立つ。
すなわち、この多層ネットワーク全体はアフィン写像である。
各 $\ell\in\{1,\ldots,L\}$ に対して、
$$
\sigma_\ell(t)=c_\ell t+r_\ell
\quad
(t\in\mathbb{R})
$$
である。
したがって、任意の $\mathbf{u}=(u_1,\ldots,u_{d_\ell})\in\mathbb{R}^{1\times d_\ell}$ に対して、
$$
\begin{align}
\sigma_\ell^{[d_\ell]}(\mathbf{u})
&=
(\sigma_\ell(u_1),\ldots,\sigma_\ell(u_{d_\ell}))\\
&=
(c_\ell u_1+r_\ell,\ldots,c_\ell u_{d_\ell}+r_\ell)\\
&=
c_\ell\mathbf{u}+r_\ell\mathbf{1}_{1\times d_\ell}
\end{align}
$$
が成り立つ。ただし、
$$
\mathbf{1}_{1\times d_\ell}:=(1,\ldots,1)\in\mathbb{R}^{1\times d_\ell}
$$
とする。
この命題より、アフィン活性化関数だけを用いる多層ネットワークは、全体として $1$ つのアフィン写像で表される。
特に、線形活性化関数はアフィン活性化関数の特別な場合であるから、
線形活性化関数だけを用いる多層ネットワークも、全体として $1$ つのアフィン写像で表される。
したがって、層をいくら深くしても、入力から出力への写像としては $1$ つのアフィン写像で表せる範囲を超えない。
$ $
そのため、隠れ層に非線形な活性化関数を用いることは、ニューラルネットワークの表現力を高めるうえで重要である。
関連する結果として、普遍近似定理などで調べると良い(/・ω・)/
関数 $\sigma:\mathbb{R}\to\mathbb{R}$ を、各 $t\in\mathbb{R}$ に対して
$$
\sigma(t):=\frac{1}{1+\exp(-t)}
$$
で定める。
このとき、$\sigma$ は $\mathbb{R}$ 上で微分可能であり、任意の $t\in\mathbb{R}$ に対して
$$
\sigma'(t)
=
\sigma(t)(1-\sigma(t))
$$
が成り立つ。
指数関数 $\exp$ は $\mathbb{R}$ 上で微分可能である。
また、任意の $t\in\mathbb{R}$ に対して
$$
\exp(-t)>0
$$
であるから、
$$
1+\exp(-t)>0
$$
である。
したがって、関数
$$
\sigma(t)=\frac{1}{1+\exp(-t)}
$$
は $\mathbb{R}$ 上で微分可能である。
$ $
任意に $t\in\mathbb{R}$ をとる。
まず、合成関数の微分より、
$$
\begin{align}
\sigma'(t)
&=
\frac{d}{dt}
\left(
1+\exp(-t)
\right)^{-1}
\\
&=
-
\left(
1+\exp(-t)
\right)^{-2}
\cdot
\frac{d}{dt}
\left(
1+\exp(-t)
\right)
\\
&=
-
\left(
1+\exp(-t)
\right)^{-2}
\cdot
\left(
-\exp(-t)
\right)
\\
&=
\frac{\exp(-t)}
{\left(1+\exp(-t)\right)^2}
\end{align}
$$
である。
一方、$\sigma(t)$ の定義より、
$$
\sigma(t)
=
\frac{1}{1+\exp(-t)}
$$
である。また、
$$
\begin{align}
1-\sigma(t)
&=
1-\frac{1}{1+\exp(-t)}
\\
&=
\frac{1+\exp(-t)-1}{1+\exp(-t)}
\\
&=
\frac{\exp(-t)}{1+\exp(-t)}
\end{align}
$$
である。
したがって、
$$
\begin{align}
\sigma(t)(1-\sigma(t))
&=
\frac{1}{1+\exp(-t)}
\cdot
\frac{\exp(-t)}{1+\exp(-t)}
\\
&=
\frac{\exp(-t)}
{\left(1+\exp(-t)\right)^2}
\end{align}
$$
である。
以上より、
$$
\sigma'(t)
=
\frac{\exp(-t)}
{\left(1+\exp(-t)\right)^2}
=
\sigma(t)(1-\sigma(t))
$$
である。
$t\in\mathbb{R}$ は任意であったから、任意の $t\in\mathbb{R}$ に対して
$$
\sigma'(t)
=
\sigma(t)(1-\sigma(t))
$$
が成り立つ。
$$ \Box$$