1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MLP(多層パーセプトロン)を線形代数から理解する ― 線形変換・活性化関数・誤差逆伝播

1
Last updated at Posted at 2026-07-13

この記事は、書籍『Kaggleではじめる大規模言語モデル入門』の輪読会で学んだテーマを、自分の言葉で整理・深掘りしたものです。

はじめに

多層パーセプトロン(Multi-Layer Perceptron, MLP)は、深層学習で使われるほぼすべてのモデルの土台になっている構造です。
RNNもTransformerも、内部には必ずMLPと同じ「線形変換+活性化関数」の組み合わせが埋め込まれています。
にもかかわらず、MLP自体の説明は「重みを掛けて活性化関数を通す」という一文で済まされがちで、線形代数的に何が起きているかが曖昧なまま次に進んでしまうことも少なくありません。

本記事では、線形変換・活性化関数・誤差逆伝播という基本要素を線形代数の言葉で丁寧に追い直したうえで、隠れ層の活性化関数はなぜどの層も同じ関数にそろえるのかという問いを後半で深掘りします。
対象は、数学の素養はあるが深層学習を専門にしていないエンジニアを想定しています。

線形変換 ― 全結合層が行っている操作

全結合層(Fully Connected Layer)とは、ある層のすべてのノードが次の層のすべてのノードと結びついている層のことです。
結びつき1本ごとに重みという調整可能な数値があり、入力ベクトルの全要素を使って出力ベクトルの各成分を計算します。
これを数式で書くと、入力を $x \in \mathbb{R}^{n}$、重み行列を $W \in \mathbb{R}^{n \times m}$、バイアスを $b \in \mathbb{R}^{m}$ として、

y = xW + b \in \mathbb{R}^{m}, \qquad
y_j = \sum_{i=1}^{n} x_i W_{ij} + b_j \quad (j = 1, \dots, m)

という アフィン変換 になります。
$W$ の第 $j$ 列は「出力 $y_j$ を作るために入力の各成分をどんな比率で混ぜ合わせるか」を表す係数の並びで、これに定数 $b_j$ を足すことで原点からのずれ(オフセット)を調整します。
学習によって動かせるパラメータは $W$ の $n \times m$ 個と $b$ の $m$ 個であり、この総数がそのままモデルのパラメータ数になります。

具体例で確認します。
3つのセンサー値 $x = (x_1, x_2, x_3)$ を、2つの指標 $y_1, y_2$ に変換する場面を考えます。

W = \begin{pmatrix} 0.5 & -1.0 \\ 1.2 & 0.3 \\ -0.4 & 0.8 \end{pmatrix}, \qquad
b = \begin{pmatrix} 0.1 \\ -0.2 \end{pmatrix}

このとき、

y_1 = 0.5x_1 + 1.2x_2 - 0.4x_3 + 0.1, \qquad
y_2 = -1.0x_1 + 0.3x_2 + 0.8x_3 - 0.2

となります。
記号が並ぶと複雑に見えますが、やっていることは「入力の重み付き和を並べているだけ」です。

ここで、なぜわざわざこのアフィン変換の形にするのか、という疑問が生じます。
理由を整理すると主に3つあります。
第一に、行列積は計算機上で高速かつ並列に計算でき、しかも微分可能なので勾配降下法に乗せやすいという実務上の利点があります。
第二に、$W, b$ は学習によって調整できる「座標変換」であり、入力を都合のよい座標系に置き直す役割を果たします。
第三に、線形変換だけを何層重ねても、合成すればまた1つの線形変換に潰れてしまいます。

x W_1 W_2 = x (W_1 W_2)

この最後の性質が重要で、線形変換だけをいくら重ねても、表現できる関数のクラスは1回の線形変換と変わりません。
空間を曲げて複雑なパターンを表現するには、線形変換の間に非線形性を挟む必要があります。

なぜ非線形な活性化関数が必要か

「線形変換をいくら重ねても表現力が変わらない」という前節の主張を、具体例で確認します。
代表例が排他的論理和(XOR)です。
2入力のXORは、入力平面上で正例と負例がどう並べても1本の直線では分けられない配置になります。
線形変換は「空間を平らなまま混ぜ直す」操作なので、この配置をいくら重ねても解消できません。

そこで各層の線形変換の直後に非線形関数を挟み、ベクトルの各成分に個別に適用します。
これが活性化関数で、データを少しずつ変形しながら「直線(超平面)で分離できる形」に作り替えていく役割を担います。
代表的な活性化関数は次の3つです。

\mathrm{ReLU}(z) = \max(0, z), \qquad
\sigma(z) = \frac{1}{1 + e^{-z}} \in (0, 1), \qquad
\tanh(z) = \frac{e^{z} - e^{-z}}{e^{z} + e^{-z}} \in (-1, 1)

ReLUは負の値を0に切り落とすだけの単純な関数で、正の領域では傾きが常に1です。
計算コストが低く、後述する勾配消失も起こしにくいため、現在の隠れ層で最も広く使われています。
シグモイド $\sigma$ は任意の実数をなめらかに $(0, 1)$ へ押し込む関数で、出力を確率として解釈したいときに使われます。
$\tanh$ も同じくS字型の関数ですが、出力範囲は $(-1, 1)$ です。
なお、隠れ層の活性化関数は通常すべての層で同じものを使います。
層ごとに変えない理由は、後半の深掘りセクションで扱います。

02-01_xor_separability.png

左図の通り、XORの4点はどのような1本の直線でも分離できません。
しかし隠れ層で $h_1 = \mathrm{ReLU}(x_1 - x_2)$、$h_2 = \mathrm{ReLU}(x_2 - x_1)$ という2つの特徴に変換すると、右図のように $(0,0)$ と $(1,1)$ が同じ点に写り、1本の直線で分離できる配置に変わります。

MLPの具体例 ― 入力層・中間層・出力層

ここまでの部品を使って、中間層が2つのMLPを最初から最後まで追ってみます。
層番号を $\ell$、第 $\ell$ 層の活性化前の値を $z^{(\ell)}$、活性化後の値を $h^{(\ell)}$ とし、入力をそのまま $h^{(0)} = x$ とおきます。

入力層は、$p$ 次元の特徴量 $x$ を $d_0$ 次元の内部状態ベクトルに変換します。
例えば $p = 4$ 次元の特徴量を $d_0 = 8$ 次元に広げる場合、

h^{(0)} = \phi\!\left(x W^{(0)} + b^{(0)}\right), \qquad
W^{(0)} \in \mathbb{R}^{4 \times 8},\ \ b^{(0)} \in \mathbb{R}^{8}

となります。
続く中間層でも同じ操作を繰り返すだけです。
$d_0 = 8$ 次元の $h^{(0)}$ を $d_1 = 5$ 次元の $h^{(1)}$ に変換し、さらに次の中間層で $d_2 = 5$ 次元の $h^{(2)}$ を作るなら、

h^{(1)} = \phi\!\left(h^{(0)} W^{(1)} + b^{(1)}\right), \qquad
h^{(2)} = \phi\!\left(h^{(1)} W^{(2)} + b^{(2)}\right)

各層で使う重み行列 $W^{(1)}, W^{(2)}$ とバイアス $b^{(1)}, b^{(2)}$ はそれぞれ独立したパラメータです。
入力層と中間層でやっていることは名前が違うだけで、数式としてはまったく同じ「線形変換+活性化関数」の繰り返しに過ぎません。
ここではいずれの層でも同じ活性化関数 $\phi$ を使っている点に注意してください。
隠れ層の活性化関数を層ごとに変えない理由は、後半の深掘りセクションで扱います。

最後に出力層では、タスクに応じた活性化関数 $g$ を選びます。
活性化関数を適用する直前の値はロジット(logit)と呼ばれ、まだ確率などに変換されていない生のスコアです。

タスク 出力次元 出力層の活性化関数 $g$
回帰 1 恒等写像
二値分類 1 シグモイド
多クラス分類 クラス数 ソフトマックス

ソフトマックスは複数のロジットを、合計が1になる割合、つまり各クラスに属する確率とみなせる値に変換する関数です。

02-01_mlp_structure.png

ここまでの例を図にすると、4次元の入力が 8・5・5 次元の中間層を順に通り、多クラス分類(3クラス)の出力に至るネットワークになります。
図中の隣り合う層のノードを結ぶ線の1本1本が、重み行列 $W^{(\ell)}$ の1つの成分に対応します。

MLPが基本形である理由 ― 表現力と汎用性

MLPが深層学習の基本形として扱われるのは、その汎用性とシンプルさによるものです。

表現力の観点では、中間層を重ねるほど、また各層の内部状態ベクトルの次元を増やすほど、表現できるパターンは複雑になっていきます。
理論的には、中間層が1つしかないMLPであっても、その層の次元を十分に大きく取れば任意の連続関数をいくらでも近い精度で近似できることが証明されています。
これは普遍性定理(万能近似定理)と呼ばれる結果で、MLPという構造そのものが原理的に高い表現力を持つことを保証しています。

汎用性の観点では、MLPは入力がベクトルの形にさえなっていれば、画像・音声・テキストなど分野を問わず適用できます。
自然言語処理においても、文書中の単語の出現頻度やTF-IDFのような重み付けをベクトルの各成分に持たせることで、分類や回帰のタスクに広く応用されてきました。
この「入力さえベクトル化できれば使える」という性質が、MLPを様々なモデルの共通部品として組み込みやすくしている理由です。

誤差逆伝播法 ― 誤差を逆向きに伝えて重みを更新する

MLPの学習は、入力から出力まで計算して得た予測値と正解との誤差(損失)を、少しずつ小さくしていく作業です。
この誤差をどの重みがどれだけ悪化させているかを求め、各重みを更新する手法が誤差逆伝播法(バックプロパゲーション)です。

学習の流れは次の3ステップで進みます。

  1. 入力から出力まで順に計算し(順伝播)、正解との誤差を測る
  2. その誤差を出力層から中間層、入力層へと逆向きにたどる
  3. たどる過程で得られる情報をもとに、各層の重み行列とバイアスを誤差が小さくなる方向へ更新する

これを大量のデータに対して繰り返すことで、多層のネットワークでも効率的に学習を進められます。
誤差逆伝播法自体は1970年代から知られていましたが、1986年にRumelhartらによって再び広く使われるようになり、MLPが実用的な学習モデルとして定着する契機になりました。
この「誤差を逆向きにたどる」ステップの内部で何が起きているかは、次の深掘りセクションで詳しく扱います。

誤差逆伝播法の導出(連鎖律・なぜ逆向きに計算するのか)は長くなるため、別記事にまとめました。

深掘り:隠れ層の活性化関数はなぜすべての層で同じなのか

先に述べたとおり、隠れ層の活性化関数はどの層も同じものを使うのが標準です。
ここでは、なぜ層ごとに変えないのかという問いを掘り下げます。

隠れ層の活性化関数は、なぜすべての層で同じものを使うのか。
数学的にそうする必要があるのか、それとも変えるメリットがないだけなのか。
入力層に近い側と出力層に近い側で変えた方がよい場合はないのか。

さらに考えを進めると、次のような疑問も出てきます。

初期化は分布からランダムに取るだけならコストは低いのではないか。
最近の大きなモデルでは、場所によって活性化関数を変えているのではないか。

この2つは、同じ疑問の裏表になっています。
結論を先に述べると、層ごとに活性化関数を変えること自体は数学的に禁止されているわけではありません。
問題になるのは「モデルが定義できるか」ではなく「学習時に値と勾配の大きさが層を通っても保たれるか」という点です。
以下、順を追って確認します。

層ごとに変えても数式の上では定義できる

第 $\ell$ 層の活性化関数を $\phi_\ell$ と書き、層ごとに異なる関数を割り当てられるようにしておきます。

h^{(0)} = x, \qquad
z^{(\ell)} = h^{(\ell-1)} W^{(\ell)} + b^{(\ell)}, \qquad
h^{(\ell)} = \phi_\ell\!\left(z^{(\ell)}\right)

$\phi_1, \phi_2, \dots$ をすべて別の関数にしても、この式自体は問題なく成立します。
各 $\phi_\ell$ が微分可能であれば(ReLUのように微分できない点が有限個だけの関数も実装上は扱えます)、誤差逆伝播も同様に定義できます。
つまり「層ごとに活性化関数を変えるとモデルが壊れる」ということはありません。

勾配計算の実体 ― 連鎖律による感度の掛け算

学習とは、損失 $\mathcal{L}$ を小さくする方向に重みを動かすことです。
そのためには各重みについて勾配 $\partial \mathcal{L} / \partial w$、つまり「その重みをわずかに動かしたとき損失がどれだけ変わるか」という感度が必要になります。

ここで厄介なのは、入力に近い層の重みが損失に影響を与えるまでには、後続のすべての層を経由しなければならないことです。

w^{(\ell)} \to z^{(\ell)} \xrightarrow{\ \phi_\ell\ } h^{(\ell)} \to z^{(\ell+1)} \xrightarrow{\ \phi_{\ell+1}\ } \cdots \to \mathcal{L}

このような「何段も経由した影響」を求めるために使うのが連鎖律です。
連鎖律とは、合成関数の微分は各段の微分の積になる、という規則です。
したがって、ある重みが損失に与える影響は、その重みから損失までの経路上にある各段の「伝わりやすさ」をすべて掛け合わせれば求まります。

活性化関数の導関数が各層で1回ずつ掛かる

経路の1段を具体的に見ると、各層は必ず「線形変換 → 活性化関数」の順に処理を行います。
連鎖律ではこの2つそれぞれの微分が掛かるため、線形変換を通る分は重み行列(の転置)が、活性化関数を通る分はその導関数 $\phi_\ell'$ が掛かります。

損失を $\mathcal{L}$、$\delta^{(\ell)} = \partial \mathcal{L} / \partial z^{(\ell)}$ を第 $\ell$ 層の誤差信号とすると、逆伝播の式は次のようになります。

\delta^{(\ell)} = \delta^{(\ell+1)} \left(W^{(\ell+1)}\right)^{\top} D_\ell, \qquad
D_\ell = \mathrm{diag}\!\left(\phi_\ell'(z^{(\ell)})\right)

$D_\ell$ は、各成分の導関数の値 $\phi_\ell'(z^{(\ell)})$ を対角成分に並べ、それ以外を0にした対角行列です。
出力側から入ってきた誤差信号 $\delta^{(\ell+1)}$ に、重み行列の転置と、この $D_\ell$ が掛かって $\delta^{(\ell)}$ が求まります。
ここで重要なのは、どんな活性化関数を選んでも、1つの層を逆向きにたどるたびに必ずその層の導関数が1回掛かる、という点です。
これは設計上の都合ではなく、勾配が連鎖律で定義される以上そうなる、という数学的な必然です。
だからこそ、活性化関数の導関数がどのような値を取るかが、勾配が入力側まで届くかどうかを直接左右します。

勾配消失の具体例 ― シグモイドの導関数

シグモイドを例に、導関数の値が小さいとき何が起きるかを見ます。

\sigma(z) = \frac{1}{1 + e^{-z}}, \qquad
\sigma'(z) = \sigma(z)\bigl(1 - \sigma(z)\bigr)

$\sigma'(z)$ は $\sigma(z) = 0.5$ のとき最大値 $0.25$ を取り、$|z|$ が大きくなるほど $0$ に近づきます。
つまりシグモイドの導関数は、どんな入力に対しても $0.25$ を超えることがありません。

この「1未満の値」が層の数だけ掛け算されると何が起きるか、簡単な数値で確認します。
仮に各層の導関数と重みの積の平均が $0.6$ 程度だったとすると、10層で $0.6^{10} \approx 0.006$、20層では $0.6^{20} \approx 0.00004$ まで縮小します。
掛け算は足し算と違い、1未満の値を繰り返し掛けると急激に小さくなるため、層が深くなるほど入力側に届く勾配は指数関数的に0へ近づきます。
これが勾配消失で、逆に各層の積が1を超え続ける場合は勾配爆発が起こります。

つまり本質は、各層で「重みの大きさ×活性化関数の導関数」という倍率が1付近に保たれるかどうかであり、この倍率を以下では $a$ と呼びます。

「層ごとに変えれば防げるのでは」という発想への回答

ここまでの説明を踏まえると、自然にこう考えたくなります。
「勾配が消えやすい層には導関数の大きい活性化関数を、そうでない層には別の関数を割り当てて、各層の倍率 $a$ を1に合わせ込めば、むしろ積極的に消失を防げるのではないか」という発想です。
これは筋の通った疑問ですが、答えるためには2つの異なる軸を分けて考える必要があります。

1つ目は「役割の軸」です。
出力する値の種類や数学的な役目が層によって異なる場所では、実際に活性化関数を使い分けます(具体例は後述します)。
2つ目は「スケールの軸」、つまり値や勾配の大きさを保存するための軸です。
勾配消失は、各層の倍率 $a$ を1付近に保てるかという問題であり、これは特定の層だけでなく全層で満たしたい性質です。
したがって、消失を防ぐ鍵は「活性化関数を層ごとに変えること」ではなく、「全層で $a \approx 1$ を保つこと」にあります。

実際に勾配消失を解決したもの

深いフィードフォワード網における勾配消失の解決に効いたのは、主に次の3つの工夫です。
いずれも「層ごとに関数を変える」方向ではなく、「全層に同じ良い条件を課す」方向で $a \approx 1$ を実現しています。

  • より良い活性化関数を全層一律に採用する ― ReLUは正の領域で導関数が常に1であるため、シグモイドや $\tanh$ を隠れ層まるごとReLU系へ置き換えることで、掛け算による縮小を大きく抑えられます
  • 活性化関数に合わせた初期化を行う ― ReLUにはHe初期化、$\tanh$ にはXavier初期化のように、関数の性質に合わせて重みの初期分散を選び、$a$ を1付近にそろえます(詳細は次の項で確認します)
  • 正規化や残差接続を導入する ― BatchNorm・LayerNormは各層の出力の平均と分散をそろえ直し、残差接続は層の入力を出力にそのまま足し戻すことで、層を通っても値と勾配の大きさが極端に変わらないようにします

歴史的にも、シグモイドや $\tanh$ からReLU系への置き換えは層ごとに個別に行われたのではなく、隠れ層全体に対して一律に適用されました。
つまり、勾配消失という問題への実際の答えは「層ごとの使い分け」ではなく「全層一律の改善」だったことになります。

順伝播側でも同じ問題が起きる ― 分散の保存

倍率 $a$ を1付近に保つ必要があるのは、逆伝播の勾配だけではありません。
前向きに流れる値の大きさ、つまり分散についても同じ問題が起こります。

各重みの平均を0とし、分散は入力幅で割った次の値に設定します($n_\ell$ は第 $\ell$ 層への入力幅)。

\mathrm{Var}\!\left(W^{(\ell)}_{ji}\right) = \frac{\sigma_w^2}{n_\ell}

第 $\ell$ 層の活性化前の値は $n_\ell$ 個の項の和であり、各項が近似的に独立だとみなすと、和の分散は各項の分散の $n_\ell$ 倍になります。

\mathrm{Var}\!\left(z_i^{(\ell)}\right)
\approx n_\ell \cdot \frac{\sigma_w^2}{n_\ell} \cdot \mathbb{E}\!\left[\left(h_j^{(\ell-1)}\right)^2\right]
= \sigma_w^2\, \mathbb{E}\!\left[\phi_{\ell-1}\!\left(z_j^{(\ell-1)}\right)^2\right]

重みの分散をあらかじめ $1/n_\ell$ で割っておくのは、この計算で $n_\ell$ が約分され、入力幅が何本であっても出力の分散が一定に保たれるようにするための工夫です。
そして前層の活性化関数 $\phi_{\ell-1}$ の形が、次の層に渡る値の分散をどれだけ変えるかを決めます。
分散が層を通るたびに増減し続ければ、深い層では値が大きくなりすぎるか、ほぼ0に潰れてしまい、どちらも安定した学習を妨げます。

初期化条件は活性化関数の形に依存する

具体例としてHe初期化を確認します。
ReLUは負の値を0にするため、入力 $z$ が平均0の左右対称な分布であれば、負側のおよそ半分が0に潰れ、二乗平均はもとの半分になります。

\mathbb{E}\!\left[\mathrm{ReLU}(z)^2\right] = \frac{1}{2}\mathbb{E}\!\left[z^2\right]

前層の分散が1に保たれていると仮定すると、層を通っても分散を保つ条件は

\sigma_w^2 \cdot \frac{1}{2} \approx 1
\ \Longrightarrow\
\sigma_w^2 \approx 2
\ \Longrightarrow\
\mathrm{Var}\!\left(W^{(\ell)}_{ji}\right) = \frac{\sigma_w^2}{n_\ell} \approx \frac{2}{n_\ell}

となります。
この「2」は、ReLUによって二乗平均が半分に減る効果を、重み側の分散を2倍にして打ち消すためのものです。
一方、$\tanh$ のように減り方が異なる関数向けには、入力幅と出力幅の両方を使うXavier初期化 $\mathrm{Var}(W) \approx 2 / (n_\ell + m_\ell)$ が使われます。
両者は同じ目的($a \approx 1$ の維持)を持ちながら、活性化関数の形が違うために異なる式になっている、という関係です。

より一般化すると、順伝播の値の大きさを $q_\ell = \mathbb{E}[(z_i^{(\ell)})^2]$、逆伝播の勾配の大きさを $r_\ell = \mathbb{E}[(\delta_i^{(\ell)})^2]$ とおいたとき、両者は次のような漸化式で層をまたいで伝わります。

q_{\ell+1} \approx \sigma_{w,\ell+1}^2\, \mathbb{E}_{u \sim \mathcal{N}(0,\, q_\ell)}\!\left[\phi_\ell(u)^2\right], \qquad
r_\ell \approx \sigma_{w,\ell+1}^2\, \mathbb{E}_{u \sim \mathcal{N}(0,\, q_\ell)}\!\left[\phi_\ell'(u)^2\right] r_{\ell+1}

$q$ は入力側から出力側へ、$r$ は出力側から入力側へ伝わる点に注意してください。
両方を1付近に保つ条件は、係数 $\sigma_{w,\ell}^2$ と活性化関数 $\phi_\ell$ の形($\phi_\ell^2$ と $\phi_\ell'^2$ の期待値)で決まります。
全層で同じ $\phi$ を使えば、この条件はただ1本を全層で使い回せます。
一方、層ごとに活性化関数を変えると、各層で $\sigma_{w,\ell}^2$ や正規化の条件を個別に設計し直す必要が生じ、消失防止という意味での追加の利得はほとんどないまま、層数分だけ設計の手間が膨らみます。

ここで増える手間の実体は、乱数をサンプリングする計算コストではありません。
正規分布からのサンプリング自体は、どの分散値を使っても計算コストはほとんど変わらないためです。
これが、先ほどの「初期化のコストは低いのではないか」という疑問への回答になります。
実際に増えるのは、活性化関数ごとに異なる分散条件(Xavierは $\tanh$ ・シグモイド向け、Heは ReLU向け)を層の数だけ個別に導出し、実装と数値が条件どおりになっているか検証する設計・解析上の複雑さです。
しかもこの複雑さに見合うだけの精度向上は期待できません。
普遍性定理が示すとおり、表現力を高めたいのであれば活性化関数を層ごとに変えるより、次元や層数を増やす方が素直に効くためです。

役割の軸とスケールの軸を区別する

最後に、「役割の軸」の具体例を確認します。
数学的な役割が異なる場所では、活性化関数の使い分けは実際に広く行われています。

場所 使い分けの内容
MLPの出力層 回帰は恒等写像、二値分類はシグモイド、多クラス分類はソフトマックスと、タスクに応じて変える
LSTMの内部 0〜1の係数を作るゲートにはシグモイド、状態の候補値を作る部分には $\tanh$ を併用する

これらはすべて「役割が異なるから使い分けている」例であり、「同じ役割を持つ隠れ層を深さ方向でバラバラの関数にする」こととは別の話です。
後者は前述のとおり勾配消失の対策にはならず、初期化・正規化の設計コストだけを増やすため、標準的な実装では行われません。

もう一つ混同しやすいのが、Transformerのフィードフォワード層で採用される活性化関数の変遷です。
原論文のTransformerではReLUが使われ、BERT・GPT系ではGELUに、LLaMA等の近年のLLMではSwiGLUに置き換わってきました。
これは「同じ層の中で場所ごとに関数を切り替える」話でも「役割が異なるから使い分ける」話でもなく、モデル全体で一律に採用する活性化関数の選択を、より良い候補が見つかるたびに更新していくという話です。
層ごとにバラバラにする発想はもちろん、役割ごとの使い分けとも軸が異なる点に注意してください。
先ほどの「最近の大きなモデルでは場所によって活性化関数を変えているのでは」という疑問は、この一律の置き換えに対応すると考えられます。

以上をまとめると、隠れ層の活性化関数をすべて同じにする理由は、次の3点に整理できます。

  1. 層ごとに活性化関数を変えること自体は数式の上で可能であり、数学的な必然として禁止されているわけではない
  2. 勾配消失・爆発への対策は、むしろ全層に同じ良い活性化関数と、それに合わせた初期化・正規化を一様に課すことで実現されており、活性化関数の層別化はその解決策ではない
  3. 全層でそろえておけば初期化・正規化の設計条件を1本に共通化できるが、層ごとに変えると層数分の条件を個別に設計し直す必要が生じる

したがって、「隠れ層の活性化関数はなぜ同じなのか」という問いへの正確な答えは、「学習できるかどうかの必然」ではなく、「安定して学習できる条件に影響するから」ということになります。

まとめ

MLPは、線形変換(アフィン変換)と活性化関数を交互に繰り返す、深層学習の中で最も基本的な構造です。
線形変換だけでは表現力が線形分離の範囲にとどまるため、非線形な活性化関数を挟むことで、複雑なパターンを学習できる空間へとデータを作り替えていきます。
中間層の数と各層の次元を増やすほど表現力は向上し、理論上は中間層が1つでも十分な次元さえあれば任意の連続関数を近似できます。

学習は誤差逆伝播法によって進みますが、この逆伝播の各段では必ず活性化関数の導関数が1回ずつ掛かります。
このため、隠れ層の活性化関数を層ごとに変えること自体は数学的には可能でも、勾配消失・爆発を防ぐ観点では意味を持たず、むしろ全層で同じ活性化関数と、それに合わせた初期化・正規化を一様に適用することが実際の解決策になっています。
出力層やLSTMのゲートのように、役割そのものが異なる場所で活性化関数を使い分けるのは、これとは別の理由に基づく設計判断です。

参考

Kaggleではじめる大規模言語モデル入門

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?