-- Views
April 16, 26
スライド概要
東北大学で2023年に開講していた「パターン認識論」のスライドです
本スライドでは、MNIST手書き数字データセットを対象に、データを学習用・検証用・評価用に分割するclosed実験とopen実験、さらに交差検証の手順を説明しています。ミニバッチを用いた確率的勾配降下法(SGD)の概要と、バッチサイズが学習速度と収束に与える影響を示し、バッチ正則化やレイヤー正則化による勾配消失対策を紹介します。また、学習率調整が難しい問題に対してAdaGrad、RMSProp、AdaDelta、Adamといった適応的最適化手法の数式と特徴を比較し、実験結果のグラフで性能差を示しています。過学習防止のためのDropout手法と、微分計算を自動化するautomatic differentiation(双数)についても説明しています。
I'll be writing programs, papers, and ramblings.
パターン認識論 第12回 伊藤 彰則 1
MNIST手書き数字データセット ◦ NIST(米国標準技術研究所)の手書き数字データを もとに整備されたデータベース ◦ 28×28ピクセルのグレースケール画像 ◦ 画像認識技術のテスト用タスクとして広く使われて いる Wikipediaより引用 2
前回のデータ ◦ 28×28ピクセルを一列に並べて784次元ベ クトルとして扱う 識別器へ 3
認識実験について ◦ データDを使った認識実験を行う場合 ◦ DでモデルMを学習し、MでDを評価する (closed 実験) ◦ Mが複雑である(パラメータが多い)ほど高性能になりう る ◦ 全サンプルを使ったNearest Neighborモデルなら常に認識率100% ◦ 汎化能力が測れない ◦ Dを学習用データD1と評価用データD2に分ける (open実験) ◦ D1でMを学習してD2に対する性能を測る ◦ D1とD2のデータの分布に注意が必要 ◦ 汎化能力を測ることができる ◦ D2に対する性能でハイパーパラメータを決めると、ハイ パーパラメータ選択に関してclosed実験と同じ問題が起き る 4
認識実験について ◦ Dを学習用データD1、検証用データD2、評価用 データD3に分ける (open実験) ◦ D1でMを学習し、D2に対する性能でハイパーパラメータを 決める ◦ 最終的な性能をD3に対して測る ◦ ハイパーパラメータに対してopenな実験になる ◦ Dが小さいときには学習データが少なくなりがち ◦ 交差検証 (cross validation) ◦ 学習・検証・評価データへの分割方法を変えて複 数回実験を行い、その平均を最終結果とする 5
例 (MNIST) • 784-n-n-10のDNN • 活性化関数ReLU、softmax出力、クロスエントロピーロス 1.0 accuracy 0.9 type train_acc 0.8 valid_acc 0.7 0.6 30 100 300 size 6
交差検証 (cross validation) データ1 データ2 データ3 データ4 データ5 学習 学習 学習 検証 評価 学習 学習 検証 評価 学習 学習 検証 評価 学習 学習 検証 評価 学習 学習 学習 評価 学習 学習 学習 検証 7
ミニバッチ学習 ◦いつ重みを更新するか? ◦1サンプルごと ◦ 元のBPの式に従って係数を更新 ◦全サンプルの平均 ◦ 係数更新量を全サンプルで平均して すべての学習サンプルに対して1回だけ 係数を更新 8
Stochastic Gradient Descent (SGD) ◦ まず最急降下法(バッチ学習) ◦ パラメータ𝒘を調整して、全サンプル𝒙 = 𝑥1 , … , 𝑥𝑁 に対する損失𝐿(𝒙, 𝒘)を最小化する 𝜌 ◦ 𝒘 ← 𝒘 − 𝜌∇𝐿 𝒙, 𝒘 = 𝒘 − σ𝑖 ∇𝐿(𝑥𝑖 , 𝒘) ◦ ミニバッチによるSGD 𝑁 𝜌 ◦ 𝒘 ← 𝒘 − 𝜌∇𝐿 𝒙, 𝒘 = 𝒘 − σ𝑖∈𝐼 ∇𝐿 𝑥𝑖 , 𝒘 𝑛 ◦ Iはミニバッチのサンプル(サイズn) ◦ ランダムに選ぶのが望ましい ◦ これを繰り返して学習データ全体で学習 ◦ これを必要回数(エポック数)だけ繰り返す 9
ミニバッチ学習 ◦ミニバッチ ◦ 少ないサンプルごとに更新量を平均して 係数を更新 1サンプルごと ミニバッチ バッチ(全サンプル) 10
ミニバッチ学習 学習手順 ◦ 全データがNbatchサンプルずつK個のミニバッチに分かれてい るとする(Nbatch×K=全サンプル数) For epoch=1 to Nepoch do For k=1 to K do k番目のミニバッチを使ってロス(誤差)を計算 誤差逆伝播によってネットワークの係数を更新 End for End for 全ミニバッチでのロスの値の平均値を各エポッ クでの平均ロスとして表示することが多い 11
ミニバッチ学習の利点 ◦数十サンプル程度をまとめて更新 ◦1サンプルごと更新よりも高速 ◦全サンプル更新よりも局所最適解 に陥りにくい 12
例 (MNIST) Minibatch=1 損失(上)の収束は遅い 精度(下)は頭打ち 93.2% 13
例 (MNIST) Minibatch=5 93.8% 14
例 (MNIST) Minibatch=20 良い収束、速度も速い 93.6% 15
バッチ正則化 (Batch normalization) ◦ 活性化関数の項で説明したとおり、sigmoid など微分すると平らになる活性化関数を使う と、勾配消失が発生する ◦ 対処法 ◦ 勾配消失が起きにくい活性化関数を使う(ReLUな ど) ◦ 入力値が-1~1付近からずれていかないように正規 化する ミニバッチごとに入力の各次元を 平均0分散1に正規化する→バッチ正則化 16
バッチ正則化 (Batch normalization) BN layer 𝐾 1 (𝑑) 𝜇 ← 𝑥𝑘 𝐾 𝑘=1 𝐾 1 2 𝑑 𝑑 𝜎 ← 𝑥𝑘 − 𝜇 𝑑 𝐾 𝑘=1 (𝑑) ミニバッチ 𝒙1 , … , 𝒙𝐾 𝒙𝒌 = 1 𝐷 (𝑥𝑘 , … , 𝑥𝑘 ) 𝑑 𝑥𝑘 ← 2 (𝑑) 𝑥𝑘 − 𝜇 (𝑑) 𝜎 (𝑑) 𝒚1 , … , 𝒚𝐾 (𝑑) 𝑦𝑘 ← 𝛾 (𝑑) 𝑥𝑘 + 𝛽 (𝑑) 𝛾, 𝛽は学習によって決まるパラメータ 17
レイヤー正規化 (Layer Normalization) ◦バッチ正則化は、RNN(次回説 明)など時間依存性のあるモデル に使えない ◦1つのレイヤー内で、ユニットの 出力を平均0分散1に正規化する →レイヤー正規化 18
レイヤー正規化 (Layer normalization) LN layer 入力 𝒙𝒌 = 1 𝐷 (𝑥𝑘 , … , 𝑥𝑘 ) 𝐷 1 (𝑑) 𝜇← 𝑥𝑘 𝐷 𝑑=1 𝜎2 ← 𝐷 2 1 𝑑 𝑥𝑘 − 𝜇 𝐷 𝑑=1 𝒚1 , … , 𝒚𝐾 (𝑑) (𝑑) 𝑦𝑘 ← 𝑥𝑘 − 𝜇 𝜎 19
学習係数の問題 ◦重みの学習 (𝑙) (𝑙) (𝑙) (𝑙−1) 𝑤𝑖𝑗 ← 𝑤𝑖𝑗 − 𝜌𝜀𝑗 𝑔𝑖 ◦更新は学習係数の影響 を強く受ける 第𝑙層 第𝑙 − 1層 (𝑙) 𝑤𝑖𝑗 i (𝑙−1) 出力𝑔𝑖 j (𝑙) 誤差𝜖𝑗 MNISTの学習曲線例 20
学習アルゴリズムの改良 ◦通常 ◦ 𝒘(𝑡) ← 𝒘(𝑡 − 1) − 𝜌𝜖 𝑡 𝒈(𝑡) ◦問題点 ◦ 学習係数ρを決めるのが難しい ◦ 学習の進み具合によって学習係数を変えたい ◦ 最初は大きく動かし、収束してきたら微調整 ◦ 学習回数によってρを変化させることも可能だが、できれ ば学習の状況によって自動的にρが変わるようにしたい 21
学習アルゴリズムの改良 ◦AdaGrad ◦𝑟 𝑡 ← 𝑟 𝑡 − 1 + 𝜖 𝑡 𝒈 𝑡 2 𝜌 ◦ 𝒘(𝑡) ← 𝒘(𝑡 − 1) − 𝜖 𝑡 𝒈(𝑡) 𝑟+𝑒 ◦ 学習が進むと r が増加→学習係数が減少 ◦RMSProp ◦ 𝑟 𝑡 ← 𝛾𝑟 𝑡 − 1 + (1 − 𝛾) 𝜖 𝑡 𝒈 𝑡 2 𝜌 ◦ 𝒘(𝑡) ← 𝒘(𝑡 − 1) − 𝜖 𝑡 𝒈(𝑡) 𝑟+𝑒 ◦ AdaGradより減少が緩やか(rの更新をγで按分して いるため) 22
学習アルゴリズムの改良 ◦AdaDelta ◦ 𝑟 𝑡 ← 𝛾𝑟 𝑡 − 1 + (1 − 𝛾) 𝜖 𝑡 𝒈 𝑡 ◦𝒗 ← 2 𝑠(𝑡)+𝑒 𝜖 𝑡 𝒈(𝑡) 𝑟(𝑡)+𝑒 ◦ 𝒘 𝑡 ← 𝒘 𝑡 − 1 − 𝜌𝒗 ◦ 𝑠 𝑡 ← 𝛾𝑠 𝑡 − 1 + 1 − 𝛾 𝒗 2 ◦ RMSPropに対して、学習係数を減らさないための 要素 s を加えた 23
学習アルゴリズムの改良 ◦Adam ◦ 𝒗 𝑡 ← 𝛽𝒗 𝑡 − 1 + (1 − 𝛽)𝜖 𝑡 𝒈(𝑡) ◦ 𝑟 𝑡 ← 𝛾𝑟 𝑡 − 1 + (1 − 𝛾) 𝜖 𝑡 𝒈 𝑡 2 ◦𝒘 𝑡 ← 𝒘 𝑡 − 1 − 𝜌 𝑟(𝑡) +𝑒 1−𝛾𝑡 𝒗(𝑡) 1−𝛽 𝑡 ◦ 学習係数を減らしていく要素 r と、学習係数を保 存する要素vを独立に制御する 24
学習アルゴリズム比較 0.20 タスク:MNIST 手書き数字認識 0.15 Error 0.10 ◦学習係数0.01 100 sgd adagrad adadelta adam rmsprop accuracy 0.05 90 0.00 80 0 10 20 30 40 50 70 adadelta adagrad adam rmsprop sgd Epoch method 25
Dropout学習 ◦過学習を防ぐテクニック ◦学習を行う係数をランダムに決める ◦アンサンブル学習に似ている 26
Dropoutの例 ◦ MNIST手書き数字認識 ◦ 784→128→128→64→10 ◦ 活性化関数ReLU、出力層softmax ◦ 各層にdropout 2.2 valid_loss train_loss 2.2 2.0 1.8 1.6 factor(dropout) 2.0 1.8 factor(dropout) 0 0 0.25 0.25 0.5 0.5 0.75 0.75 1.6 2.5 5.0 epoch 7.5 10.0 2.5 5.0 7.5 10.0 epoch 27
複雑なネットワークの微分 係数を求める 複雑なネットワークだと微係数を求めるのが 難しくなる + (2) 𝜀𝑗 gi(2) = f (hi(2) ) hi(2) + (2) × (2) = (𝑔𝑗 − 𝑏𝑗 )𝑓’(ℎ𝑗 ) 𝐾−1 (1) 𝐾 𝑓 hi(2) (1) 1 𝑔1 , … , 𝑔𝐾 =𝜎 (1) 𝑔𝑖 𝑖=1 1 𝑓 𝑔1 , … , 𝑔𝐾 (1) = 𝜎 𝑔𝑖 (1) 𝑔𝐾 𝑖=1 28
自動微分 関数を計算する際に微分係数も一緒に計算す る→自動微分(automatic differentiation) ◦ 微分のチェーンルール ◦ 𝑦 = 𝑓 𝑔 𝑥 = 𝑓(𝑤) 𝜕𝑦 𝜕𝑦 𝜕𝑤 ◦ = 𝜕𝑥 𝜕𝑤 𝜕𝑥 ◦ 二重数(dual number)を使う方法 ◦ 実数ではない数𝜖を仮定:𝜖 ≠ 0, 𝜖 2 = 0 ◦ 二重数 𝑧 = 𝑎 + 𝑏𝜖 ただし𝑎, 𝑏は実数(または複素 数) 29
二重数による自動微分 二重数の性質 ◦ 𝑎 + 𝑏𝜖 + 𝑐 + 𝑑𝜖 = 𝑎 + 𝑐 + 𝑏 + 𝑑 𝜖 ◦ 𝑎 + 𝑏𝜖 𝑐 + 𝑑𝜖 = 𝑎𝑐 + 𝑏𝑐 + 𝑎𝑑 𝜖 𝑎+𝑏𝜖 𝑎 𝑏𝑐−𝑎𝑑 ◦ = + 2 𝜖 𝑐+𝑑𝜖 𝑐 𝑐 関数𝑓(𝑎 + 𝜖)を𝑎の周りでテイラー展開する ◦𝑓 𝑎+𝜖 =𝑓 𝑎 + 𝜖𝑓 ′ 𝑎 𝜖 2 ′′ + 𝑓 𝑎 2 +⋯ = 𝑓 𝑎 + 𝜖𝑓′(𝑎) ◦ 𝑓 𝑔 𝑎+𝜖 = 𝑓 𝑔 𝑎 + 𝜖𝑔′(𝑎) = 𝑓 𝑔 𝑎 + 𝜖𝑔′ 𝑎 𝑓′(𝑔 𝑎 ) 二重数で関数計算をするとεの係数が微分係数になる 30
二重数で計算する すべての四則演算と関数計算を(実数の代わ りに複素数を使うように)二重数で行えば、 どんな計算をしても常に微係数が計算される sin(𝑎 + 𝑏𝜖) = sin 𝑎 + 𝑏𝜖 cos 𝑎 cos 𝑎 + 𝑏𝜖 = cos 𝑎 − 𝑏𝜖 sin 𝑎 𝑏𝜖 tan 𝑎 + 𝑏𝜖 = tan 𝑎 + cos 2 𝑎 𝑎 + 𝑏𝜖 𝑘 = 𝑎𝑘 + 𝜖𝑘𝑎𝑘−1 𝑏 exp 𝑎 + 𝑏𝜖 = exp 𝑎 + 𝜖𝑏 exp 𝑎 𝑏𝜖 log 𝑎 + 𝑏𝜖 = log 𝑎 + 𝑎 31
二重数による自動微分 𝑎, 𝑎′ + 𝑏, 𝑏′ = 𝑎 + 𝑏, 𝑎′ + 𝑏′ a b F(a,b,c) F(a,b,c) 𝑎, 𝑎′ × 𝑏, 𝑏′ = 𝑎𝑏, 𝑎′ 𝑏 + 𝑎𝑏′ 𝑎, 𝑎′ 𝑎 𝑎′ 𝑏 − 𝑎𝑏′ = , 𝑏, 𝑏′ 𝑏 𝑏2 c 𝑎, 𝑎′ 𝑘 = 𝑎𝑘 , 𝑘𝑎 𝑘−1 𝑎′ <a,a’> <b,b’> <c,c’> F(a,b,c) <F,F’> sin 𝑎, 𝑎′ = sin 𝑎, 𝑎′ cos 𝑎 exp 𝑎, 𝑎′ = exp 𝑎, 𝑎′ exp 𝑎 𝑎′ log 𝑎, 𝑎′ = log 𝑎, 𝑎 32
演習 ◦ MNISTの認識を行い、BatchNormの有無、 学習アルゴリズムの違いなどで性能がどう変 化するかを調べよ。 ◦ 学習アルゴリズムは2種類以上を試すこと ◦ 学習・検証セットに分けるか、交差検証をおこな うこと ◦ Wekaを使う人は、スクリーンショットを貼るだけ でなく、結果を集計して示すこと 33