深層学習

多層パーセプトロン

入力と出力の間に非線形の隠れ層を挟むことで、線形分離できない関数まで表現できるようにしたネットワーク構造。表現力の保証と学習できる保証は別物。

  • A|中核
  • 深層学習

数式の記号で止まったら 記号の読み方 (∂・⊙・転置・上付き添字を、読み方から)

ひとことで言うと

多層パーセプトロン(MLP)は、入力層と出力層の間に1つ以上の隠れ層を挟んだフィードフォワード型のネットワークです。各隠れ層は「アフィン変換+非線形の活性化関数」を1セットとして持ち、これを重ねることで単純パーセプトロンや線形モデルでは表現できない関数を扱えるようにします。

線形モデルは「ものさし1本で全部測る」道具です。1本のものさしでは測れない曲がった関係でも、途中で座標系そのものを作り変えれば、その新しい座標系の上ではまた1本のものさしで測れるようになります。隠れ層がやっているのは、この「測りやすい座標系への作り変え」です。

なぜ必要か

線形モデル(f(x)=x⊤w+bf(\mathbf{x}) = \mathbf{x}^\top\mathbf{w} + b)は入出力の関係が線形分離可能な場合しか正しく解けません。典型例が XOR です。入力 x1,x2∈{0,1}x_1, x_2 \in \{0,1\} に対し、出力は「どちらか一方だけが1のとき1」で、これは1本の直線で分けられません。

deeplearningbook はこれを実際に解いて見せています。XOR の4点を平均二乗誤差で線形回帰にかけると、正規方程式の解は w=0\mathbf{w}=\mathbf{0}、b=1/2b=1/2 になり、4点すべてで出力が0.5に潰れます。入力をどう線形変換しても、この問題を線形モデルは解けません。

解決策は、モデルに「別の特徴空間へ写す層」を1枚足すことです。隠れ層 h=f(1)(x)\mathbf{h} = f^{(1)}(\mathbf{x}) を挟み、出力層はその h\mathbf{h} に対して線形回帰をかける形にします。ただしここで f(1)f^{(1)} を線形にすると意味がありません。線形変換を2回合成しても線形変換のままだからです。

f(2)(f(1)(x))=(Wx)⊤w=x⊤(W⊤w)=x⊤w′f^{(2)}\left(f^{(1)}(\mathbf{x})\right) = \left(W\mathbf{x}\right)^\top\mathbf{w} = \mathbf{x}^\top\left(W^\top\mathbf{w}\right) = \mathbf{x}^\top\mathbf{w}'

WW は隠れ層のアフィン変換の重み、w\mathbf{w} は出力層の重みです。f(1)f^{(1)} を線形にすると、2層分の変換が1つの重み w′=W⊤w\mathbf{w}' = W^\top\mathbf{w} に潰れてしまい、結局ただの線形モデルと区別がつきません。隠れ層に非線形の活性化関数を挟むことだけが、この合成を線形に潰れさせない条件です(活性化関数そのものの選び方は個別ノートの守備範囲です)。

仕組み

順伝播

第 ll 層の入力を a(l−1)\mathbf{a}^{(l-1)}、重みを W(l)W^{(l)}、バイアスを b(l)\mathbf{b}^{(l)}、活性化関数を gg とすると、各層は次の2段階で計算されます。

z(l)=W(l)⊤a(l−1)+b(l),a(l)=g(z(l))\mathbf{z}^{(l)} = W^{(l)\top}\mathbf{a}^{(l-1)} + \mathbf{b}^{(l)}, \qquad \mathbf{a}^{(l)} = g\left(\mathbf{z}^{(l)}\right)

z(l)\mathbf{z}^{(l)} はアフィン変換した後の値(活性化前)、a(l)\mathbf{a}^{(l)} はそれに gg を通した後の値(活性化後)です。入力層は a(0)=x\mathbf{a}^{(0)} = \mathbf{x}、これを最終層まで繰り返し適用したものが順伝播です。

出力層は問題の種類で決まる

出力層だけは隠れ層と役割が違い、タスクの種類に合わせて活性化関数と損失関数をセットで選びます。ここを取り違えるのが実装でも試験でも一番多い事故です。

タスク出力層の活性化損失関数出力の意味
回帰恒等写像(活性化なし)二乗誤差実数値そのもの
二値分類シグモイド交差エントロピーP(y=1∣x)P(y=1\mid \mathbf{x})
多クラス分類ソフトマックス交差エントロピー各クラスの確率(合計1)

ソフトマックスは、線形層が出す未正規化の対数確率 zi=log⁡P~(y=i∣x)z_i = \log\tilde{P}(y=i\mid\mathbf{x}) を指数化して正規化したものです。

softmax(z)i=exp⁡(zi)∑jexp⁡(zj)\mathrm{softmax}(\mathbf{z})_i = \frac{\exp(z_i)}{\sum_j \exp(z_j)}

シグモイドはこの二値版(n=2n=2 の特殊ケース)にあたります。最尤推定(交差エントロピー)と組み合わせたときだけ、指数化した部分が対数で相殺され、シグモイド・ソフトマックスの飽和による勾配消失が緩和されるという関係になっています。ここに二乗誤差を組み合わせると、出力層でも飽和による勾配消失が起きます。

普遍近似定理が保証すること・しないこと

隠れ層を1層持つフィードフォワードネットワークは、任意の有界な連続関数を任意の精度で近似できる——これが普遍近似定理(Hornik et al., 1989; Cybenko, 1989)の主張です。試験・実装の両方で誤解されやすいのはここからで、この定理が保証するのは「そういうネットワークが存在すること」だけです。

保証しないもの:

  • 必要な隠れユニット数。最悪ケースでは指数的に大きくなり得ます
  • 学習アルゴリズムがその関数に到達できること。存在と可到達性は別問題です
  • 過学習しないこと。表現できることと、汎化することは別の話です

幅を増やすか、深さを増やすか

1層でも理論上は任意の関数を近似できますが、その1層に必要なユニット数は関数によっては非現実的に大きくなります。深さを増やすと、同じ表現力をより少ないユニット数で達成できる関数のクラスがあることが知られています(Montufar et al., 2014 の幾何的な説明が deeplearningbook で紹介されています)。「幅を増やす」と「深さを増やす」はどちらも表現力を上げる手段ですが、必要なパラメータ数のスケールが異なります。

試験でどう問われるか

問われ方正解に寄る条件引っかけ
普遍近似定理の主張範囲「十分な数の隠れユニットを持つネットワークが存在する」ことしか言っていない「学習すれば必ずその関数に到達できる」「必要なユニット数も分かる」は誤り
隠れ層を線形にした場合何層重ねても全体として線形関数のままになる「層を増やせば表現力が上がる」を無条件に適用してしまう
出力層の活性化と損失の対応回帰=恒等写像+二乗誤差/二値=シグモイド+交差エントロピー/多クラス=ソフトマックス+交差エントロピーシグモイド出力に二乗誤差を組み合わせて選んでしまう(飽和で学習が進まなくなる)
XOR が線形モデルで解けない理由4点を分ける直線が存在しないため、線形回帰の最適解は定数0.5に潰れる「学習率やイテレーション数が足りないだけ」という説明
深さと幅の関係同じ表現力でも深さを増やすとユニット数を削減できる関数クラスがある「幅さえ増やせば深さは不要」「深いほど常に効率的」という単純化

実装で確かめる

XOR を線形モデルは解けず、隠れ層を1枚挟んだネットワークは解けることを確認します。

import numpy as np
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=float)
y = np.array([[0], [1], [1], [0]], dtype=float)
rng = np.random.default_rng(1)
W1, b1 = rng.normal(size=(2, 4)), np.zeros(4)
W2, b2 = rng.normal(size=(4, 1)), np.zeros(1)
relu = lambda z: np.maximum(0, z)

for _ in range(3000):                      # 勾配降下法で愚直に学習
    z1 = X @ W1 + b1; h = relu(z1)
    pred = h @ W2 + b2
    g2 = 2 * (pred - y) / y.size
    gW2, gb2 = h.T @ g2, g2.sum(0)
    gz1 = (g2 @ W2.T) * (z1 > 0)
    gW1, gb1 = X.T @ gz1, gz1.sum(0)
    W2 -= 0.1 * gW2; b2 -= 0.1 * gb2
    W1 -= 0.1 * gW1; b1 -= 0.1 * gb1

print("予測:", pred.ravel())

実行すると 予測: [1.6e-15 1.0 1.0 9.5e-16] になり、目標の [0, 1, 1, 0] にほぼ一致します。隠れ層を抜いて同じ勾配降下法を線形モデルだけで回すと、deeplearningbook の解析解どおり [0.5, 0.5, 0.5, 0.5] に潰れて動きません。違いは学習の回し方ではなく、非線形の隠れ層があるかどうかだけです。

取り違えやすいもの

用語MLP との関係
単純パーセプトロン隠れ層を持たない1層のモデル。線形分離可能な問題しか解けない。MLP はこれに隠れ層と非線形活性化を足したもの
誤差逆伝播法MLP の勾配を求める手続き。MLP は「どういう構造か」、逆伝播は「その構造の勾配をどう計算するか」で担当が違う
CNN / RNN重みの共有構造や再帰構造を持つ特殊化。全結合層のみで構成される MLP はその基本形にあたる
活性化関数(sigmoid / ReLU 等)MLP の隠れ層に埋め込む部品。どれを選ぶかで学習の収束性は変わるが、MLP という構造自体は活性化関数の種類に依存しない
普遍近似定理MLP の表現力の上限を保証する定理。学習可能性や必要な幅までは保証しない

想起チェック

線形モデルが XOR を解けない理由を、deeplearningbook の解析解を使って説明すると

XOR の4点を平均二乗誤差で線形回帰すると、正規方程式の解は w=0\mathbf{w}=\mathbf{0}、b=1/2b=1/2 になり、4点すべてで出力が0.5に潰れます。4点を分ける直線が存在しないため、線形モデルの最適解は「何も分けない」形に収束します。

隠れ層を線形にすると何が起きるか

何層重ねても全体として1つの線形関数と等価になります。f(2)(f(1)(x))=x⊤Wwf^{(2)}(f^{(1)}(\mathbf{x})) = \mathbf{x}^\top W\mathbf{w} は x⊤w′\mathbf{x}^\top\mathbf{w}' の形に潰せるため、層を増やしても表現力は増えません。非線形の活性化関数が必須です。

普遍近似定理が保証しないことを2つ挙げると

(1)目的の精度に必要な隠れユニット数(最悪ケースで指数的に大きくなり得る)、(2)学習アルゴリズムがその関数に実際に到達できること。存在の保証と、学習で到達できることは別問題です。

二値分類の出力層に二乗誤差を組み合わせると何が問題か

シグモイドは出力が0か1に近づくと飽和し、二乗誤差の勾配もこの飽和に引きずられて小さくなります。正解・不正解のどちらでも学習が進みにくくなるため、二値分類では交差エントロピー(最尤推定)と組み合わせるのが基本です。

出典