Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Deeplearning from almost scratch

HN410
May 05, 2022

Deeplearning from almost scratch

サークルで行った「1から始めるディープラーニング」のLT資料です.

HN410

May 05, 2022
Tweet

More Decks by HN410

Other Decks in Technology

Transcript

  1. 今日の目標 • ディープラーニングについての基礎的な理論を1から理解する. • 必須能力 … 高校3年までの数学 • 要望能力 …

    大学一年生程度の数学 (線形代数,微分積分学) • 性能を上げるための基礎的な工夫について理解する.
  2. パーセプトロン • 入力の数は基本的に可変,出力は一つ • 入力数を2とすると,出力は右の式で表せる • 入力に対して定数の重みをかけたものと定数 を総和 • 定数をほかの入力と同様に定数x0

    = 1に重み 𝑤0 をかけたものとすると, 𝑢 = σ𝑖 𝑤𝑖 𝑥𝑖 , 𝑜 = 𝑓(𝑢)と表せて楽. • この𝑢と𝑥の関係を,「 𝑢は𝑥の線形和」, 「𝑢は𝑥に対して線形」などという. • 活性化関数は非線形である必要がある(後述) 𝑐 𝑜 𝑥1 𝑥2 𝑤1 𝑤2 𝑢 = 𝑤1 𝑥1 + 𝑤2 𝑥2 + 𝑐 𝑜 = 𝑓(𝑢)
  3. 2層パーセプトロン • パーセプトロンを増やし,その出力を別のパーセプトロンに入れてみる 𝑥1 𝑥2 𝑥0 𝑢0 0 𝑢1 0

    𝑢0 1 𝑤00 0 𝑤10 0 𝑤01 0 𝑤11 0 𝑤02 0 𝑤12 0 𝑤00 1 𝑤01 1 𝑜0 0 = 𝑓0 𝑢0 0 , 𝑢0 0 = ෍ 𝑖 𝑤0𝑖 0 𝑥𝑖 𝑜1 0 = 𝑓0(𝑢1 0), 𝑢1 0 = σ𝑖 𝑤1𝑖 0 𝑥𝑖 𝑜 = 𝑓1 𝑢0 1 , 𝑢0 1 = ෍ 𝑖 𝑤0𝑖 1 𝑜𝑖 0 0層 (入力層) 1層 (隠れ層) 2層 (出力層)
  4. 2層パーセプトロン • 𝑜は出力 • 添え字で複数のものを区別 • (下添え字1 … 次の層のどこにつながるか) •

    重みのみ • 下添え字2 … 今の層のどこか • 上添え字 … 今何層目か • 𝑓についても微分の回数ではない • 例 • 𝑤01 1 … 1層目(0始まり)の0番パーセプトロンから次の1番パーセプトロンへの重み 𝑥1 𝑥2 𝑥0 𝑢0 0 𝑤00 0 𝑤01 0 𝑤02 0 𝑜0 0 = 𝑓0 𝑢0 0 , 𝑢0 0 = ෍ 𝑖 𝑤0𝑖 0 𝑥𝑖
  5. 2層パーセプトロン • 1層目以降の入力は前の出力𝑜 𝑥1 𝑥2 𝑥0 𝑢0 0 𝑢1 0

    𝑢0 1 𝑤00 0 𝑤10 0 𝑤01 0 𝑤11 0 𝑤02 0 𝑤12 0 𝑤00 1 𝑤01 1 𝑜0 0 = 𝑓0 𝑢0 0 , 𝑢0 0 = ෍ 𝑖 𝑤0𝑖 0 𝑥𝑖 𝑜1 0 = 𝑓0(𝑢1 0), 𝑢1 0 = σ𝑖 𝑤1𝑖 0 𝑥𝑖 𝑜 = 𝑓1 𝑢0 1 , 𝑢0 1 = ෍ 𝑖 𝑤0𝑖 1 𝑜𝑖 0 0層 (入力層) 1層 (隠れ層) 2層 (出力層)
  6. (補足)行列表示 𝑥1 𝑥2 𝑥0 𝑢0 𝑢1 𝑜 𝒐0 = 𝒇0

    𝑾0𝒙 𝑜 = 𝑓1 𝑾1𝒐0 0層 (入力層) 1層 (隠れ層) 2層 (出力層) 𝑾0 𝒙 𝑾1 • 行列は大文字,太字はベクトル
  7. 最適さの定式化(機械学習) • 出力𝑓(𝑥𝑖 )と正解𝑦(𝑥)の「距離」が近ければ近いほどよい • これを損失𝐿といい,損失を返す関数は損失関数と呼ぶ • 小さいほど良い • 入力の種類,用途によってさまざま

    • スカラ,ベクトル値によく使われるもの • L1 Loss σ𝑖 |𝑦(𝑥𝑖 ) − 𝑓(𝑥𝑖 )| • L2 Loss (最小二乗誤差, MSE) σ𝑖 𝑦(𝑥𝑖 ) − 𝑓 𝑥𝑖 2 • クロスエントロピー誤差 σ𝑖 𝑦(𝑥𝑖 ) log 𝑓 𝑥𝑖 ※σ𝑖 (1 − 𝑦 𝑥𝑖 ) log 1 − 𝑓 𝑥𝑖 を足すことも
  8. 変数が複数の時の微分 • 重みに対しても同じように考えたいが,損失関数は1変数関数ではない • →偏微分 • 2変数以上の関数で,一つの入力に対し,ほかの入力を変化させずに微分することを 偏微分という • 関数𝑓

    𝑥0 , 𝑥1 , … の𝑥0 による偏微分𝑓𝑥0 は,lim ℎ→0 𝑓 𝑥0+ℎ,𝑥1,… −𝑓(𝑥0,𝑥1,… ) ℎ • 基本普通に微分するだけ • ほかの変数についても同様 • 偏微分は𝑓𝑥0 , 𝑓𝑥0 (𝑥0 , 𝑥1 , … ) 𝜕𝑓 𝜕𝑥0 , 𝜕 𝜕𝑥0 𝑓 𝑥0 , 𝑥1 , … などのように表される • 𝜕 は「partial」「round d」などと呼ばれる • 微分積分学でやります (1A?)
  9. 連鎖律 • 損失関数の重み𝑤𝑖𝑗 𝑘 による偏微分を求めたい • 損失関数は入力と重みを入力とする合成関数 • →解析的に求められる •

    (復習) 一変数の合成関数の微分 • 𝑑 𝑑𝑥 𝑓 𝑔 𝑥 = 𝑔′ 𝑥 𝑓′ 𝑔 𝑥 • 𝑑 𝑑𝑥 𝑓 𝑔 ℎ(𝑥) = ℎ′(𝑥)𝑔′ ℎ(𝑥) 𝑓′(𝑔(ℎ(𝑥)))
  10. 連鎖律 • 𝑛入力関数𝑓(𝑠0 , … ), 𝑛個の𝑚入力関数𝑔𝑖 (𝑡0 , …

    )による,𝑚入力の合成関数ℎ 𝑡0 , … = 𝑓 𝑔0 (𝑡0 , … , … )の𝑡𝑗 による偏微分は, 𝜕𝑓 𝜕𝑡𝑗 = ෍ 𝑖 𝑚 𝜕𝑓 𝜕𝑠𝑖 𝜕𝑔𝑖 𝜕𝑡𝑗 • 𝑠𝑖 = 𝑔𝑖 (𝑡0 , … )なので,下のように表記することが多い 𝜕𝑓 𝜕𝑡𝑗 = ෍ 𝑖 𝑚 𝜕𝑓 𝜕𝑔𝑖 𝜕𝑔𝑖 𝜕𝑡𝑗 • 一変数の時のやつを,内側の関数全部にやって,それを総和
  11. 連鎖律による偏微分の計算(誤差逆伝播法) • 𝑥1 による損失の偏微分𝜕𝐿 𝜕𝑥 を求めてみる (重みに対しても同様にできる) 𝐿 𝑥1 𝑥2

    𝑥0 𝑢0 0 𝑢1 0 𝑢0 1 𝑤00 0 𝑤10 0 𝑤01 0 𝑤11 0 𝑤02 0 𝑤12 0 𝑤00 1 𝑤01 1 𝑜0 0 = 𝑓0 𝑢0 0 , 𝑢0 0 = ෍ 𝑖 𝑤0𝑖 0 𝑥𝑖 𝑜1 0 = 𝑓0(𝑢1 0), 𝑢1 0 = σ𝑖 𝑤1𝑖 0 𝑥𝑖 𝑜 = 𝑓1 𝑢0 1 , 𝑢0 1 = ෍ 𝑖 𝑤0𝑖 1 𝑜𝑖 0 𝐿 = 𝐿(𝑜, 𝑦)
  12. 連鎖律による偏微分の計算(誤差逆伝播法) • 𝜕𝐿 𝜕𝑥1 = 𝜕𝐿 𝜕𝑦 𝜕𝑦 𝜕𝑥1 +

    𝜕𝐿 𝜕𝑜 𝜕𝑜 𝜕𝑥1 = 𝜕𝐿 𝜕𝑜 𝜕𝑜 𝜕𝑥1 (正解ラベルは定数) • 𝜕𝑜 𝜕𝑥1 = 𝑑𝑜 𝑑𝑢0 1 𝜕𝑢0 1 𝜕𝑥1 = (𝑓1)′(𝑢0 1) 𝜕𝑢0 1 𝜕𝑥1 (𝑓は一変数関数) 𝐿 𝑢0 1 𝑜 = 𝑓1 𝑢0 1 𝐿 = 𝐿(𝑜, 𝑦)
  13. 連鎖律による偏微分の計算(誤差逆伝播法) • 𝜕𝑢0 1 𝜕𝑥1 = 𝜕𝑢0 1 𝜕𝑜0 0

    𝜕𝑜0 0 𝜕𝑥1 + 𝜕𝑢0 1 𝜕𝑜1 0 𝜕𝑜1 0 𝜕𝑥1 = 𝑤00 1 𝜕𝑜0 0 𝜕𝑥1 + 𝑤01 1 𝜕𝑜1 0 𝜕𝑥1 (𝑢0 1を,前の入力2つを受け取る2変数関数と考える) • 𝜕𝑜0 0 𝜕𝑥1 = 𝑑𝑜0 0 𝑑𝑢0 0 𝜕𝑢0 0 𝜕𝑥1 = (𝑓0)′(𝑢0 0) 𝜕𝑢0 0 𝜕𝑥1 • 𝜕𝑜1 0 𝜕𝑥1 = 𝑑𝑜1 0 𝑑𝑢1 0 𝜕𝑢1 0 𝜕𝑥1 = (𝑓0)′(𝑢1 0) 𝜕𝑢1 0 𝜕𝑥1 𝑢0 0 𝑢1 0 𝑢0 1 𝑤00 1 𝑤01 1 𝑢0 1 = ෍ 𝑖 𝑤0𝑖 1 𝑜𝑖 0 𝑜0 0 = 𝑓0 𝑢0 0 𝑜1 0 = 𝑓0 𝑢1 0
  14. 連鎖律による偏微分の計算(誤差逆伝播法) • 𝜕𝑢0 0 𝜕𝑥1 = 𝑤01 0 , 𝜕𝑢1

    0 𝜕𝑥1 = 𝑤11 0 • よって, 𝜕𝐿 𝜕𝑥1 = 𝜕𝐿 𝜕𝑜 (𝑓1)′(𝑢0 1) 𝑤00 1 (𝑓0)′(𝑢0 0)𝑤01 0 + 𝑤01 1 (𝑓0)′(𝑢1 0)𝑤11 0 • →損失を計算する際に途中結果を保存しておけば効率よく計算可能 • 後ろから伝播していくようなので,誤差逆伝播法と呼ぶ. 𝑥1 𝑢0 0 𝑤01 0 𝑢0 0 = ෍ 𝑖 𝑤0𝑖 0 𝑥𝑖 𝑢1 0 𝑤11 0 𝑢1 0 = ෍ 𝑖 𝑤1𝑖 0 𝑥𝑖
  15. (補足)行列,ベクトルによる誤差逆伝播法 • 𝜕𝐿 𝜕𝒙 = 𝜕𝐿 𝜕𝑜 (𝑓1)′(𝑢0 1)𝑾1(𝒇0)′ 𝒖0

    𝑾0 • 𝜕𝐿 𝜕𝑾0 = 𝒙 𝜕𝐿 𝜕𝑜 (𝑓1)′(𝑢0 1)𝑾1(𝒇0)′ 𝒖0 (慣用的記法.正確には 𝜕𝐿 𝜕 𝑾0 𝑖𝑗 で成分ごとに書く.) 𝑥1 𝑥2 𝑥0 𝑢0 0 𝑢1 0 𝑢0 1 𝒐0 = 𝒇0 𝑾0𝒙 𝑜 = 𝑓1 𝑾1𝒐0 𝑾0 𝑾1 𝒙 𝐿 𝐿 = 𝐿 𝑜, 𝑦(𝒙)
  16. 確率的勾配降下法(SGD) • データセット 𝑥 𝑖 の数が巨大な時は,毎回の更新時にすべての𝑥に対して最小化する のは無駄そう? • データセットの中から一部(バッチ)をとってきてそれに対して勾配を求めて重みを更新す る

    • これを確率的勾配降下法と呼ぶ • アルゴリズム (𝑚は一つのバッチに含まれるデータの数) • 重み初期値𝑊0 • 𝑊𝑖+1 = 𝑊𝑖 − 𝜂 ⋅ 1 𝑚 σ𝑗 𝑚 𝜕𝐿 𝜕𝑊 𝑇 • 以上をすべてのバッチに対して行う • 繰り返し • 局所最適解にはまるのを防ぐ効果も(後述)
  17. 収束が遅い • SGDは最適解にはまらずずっとウロチョロ動く • Pathological Curveにはまってしまう • Pathological Curve •

    鋭いくぼみを持つ形状. • 確率的勾配降下法は勾配が大きいほど動くため, この間をウロチョロ動いてしまう • 学習率をうまく制御すれば…? 実際の動き 理想の動き
  18. 様々な確率的最大化 • 一応SGD自体にもこれを防ぐ効果はある • Momentum SGD … 「勢い」を表す項の追加 • RMS

    Prop … 前に大きく変化したところは変化を抑える • Adam … momentum, RMSの合わせ技 • 現在ではよく使われる • 一般的にAdamが良い性能を示すことが多いが,実際にどのアルゴリズムを使う のがいいかはネットワークによって異なる. • 各アルゴリズムの可視化→https://imgur.com/a/Hqolp
  19. 勾配消失問題の解決 • 活性化関数としてReLU (上)を採用 • 入力が正なら微分は正の定数 (1) • 入力が負の時は微分は0 •

    あまりよくない…? • 最近ではLeaky ReLU (下)を採用することも増えた • 入力が負の時は微分は小さい正の定数 • 0.03などが良く使われる • Shortcutで微分を直接伝える (ResNetなど) • 一部の層に対してそれを通す入力と通さない入力を2つ取り入れる
  20. シグモイド関数についての注意 • Sigmoid君無能じゃん→× • Sigmoid関数の利点 • 出力が[0, 1]に制限される • クロスエントロピー誤差(C

    𝑥 = σ𝑖 −𝑦 log 𝑓 𝑥𝑖 − 1 − 𝑦 log(1 − 𝑓 𝑥𝑖 ))と相性がい い • シグモイド関数を𝜎 𝑥 = 1 1+𝑒−𝑥 ,損失を𝐿 𝑢 = 𝐶(𝜎(𝑥))とおく. • 𝜕𝐿 𝜕𝑢 = − 𝑦 𝜎 𝑢 + 1−𝑦 1−𝜎 𝑥 ⋅ 𝜎 𝑢 1 − 𝜎 𝑢 = −𝑦 + 𝜎(𝑢) ※𝜎′ 𝑥 = 𝜎(𝑥)(1 − 𝜎(𝑥)) • →不安定さの原因となる𝜎, 1/𝜎の積が消える • 出力が二値で十分なクラス分類などのネットワークの最後の層の活性化関数としてし ばしば使われる
  21. 過学習を防ぐ工夫 • データセットを3つに分ける • 訓練データ,検証データ,テストデータ • 訓練データ …モデルの訓練に使用 • 検証データ

    …モデルが未知データにも適用可能であるかを調べるために使う • 訓練中に何度もこのデータを使って評価する • テストデータ…すべての訓練が訓練が終わった後に1度だけ使い,最終的な評価を下すために使う • テストデータは2回以上使ってはいけない(厳密には) • テストデータに合うようなモデルを作ってしまえば… • 検証データは訓練に使えない…? • →交差検証
  22. 過学習を防ぐ工夫 • 正則化項の追加 • 過学習しているときは重みが異常に大きくなっていることが多い • 損失関数に重みの2乗和などを加える • Drop outの導入

    (ニューラルネット限定,後述) • 学習の早期中断 • より表現の乏しいモデル(線形回帰など)を使う • どうしてもとれるデータが少ないとき
  23. 様々な工夫(データ処理) • 正規化 • 入力データを一定のルールに従って加工し,利用しやすくすること • 例 各成分について平均0, 標準偏差1になるように前処理する •

    範囲が[0, 1]に収まるようにすることもある • 単位の違うデータなどを入力するときは特に効果的 • バッチノーマライゼーションも参照のこと(データ処理じゃないけど) • オーグメンテーション • 入力データの水増し • 例…画像入力の際に,回転した画像,ずらした画像,ノイズを入れた画像もデータに加える
  24. 様々な工夫(モデル全般) • Drop out • 訓練中に一部の重みをランダムに選び,無効化 • ネットワークの過学習を防ぐ • アンサンブル学習と似たような結果になるらしい

    • バッチノーマライゼーション • 訓練時に隠れ層の重みを成分ごとに正規化 • 学習の高速化,精度向上につながる
  25. 様々な工夫(画像) • 畳み込みネットワーク • 画像の局所性,移動普遍性を活用したネットワーク • GAN … 敵対的生成ネットワーク •

    フェイク画像を作る側とそれを見抜く側両方のモデルを作って同時に学習させる • 損失関数をつくるのが難しいときに有効 • 学習が不安定になりやすい
  26. 様々な工夫(一次元データ) • RNN(LSTM, GRU) • データをループさせることで以前の入力を記憶 • テキスト処理など • Transformer

    (Attention機構) • 入力のどこに注目すべきかを表す内部表現を作り,それとデータとの内積をとること で重要なデータを取り出す • テキスト処理など
  27. 実際にやってみる • プログラミング言語はPythonが主流 • ライブラリ • Keras + Tensorflow •

    Pytorch • JAX/Flax • … • Pytorchが今はおすすめ • Kerasはバージョン間でしばしば互換性がない • Pytorchもだけど,体感こっちのほうがひどい気がする • Pytorchで実装された既存のモデルが多い
  28. 参考文献,使用ライブラリ • 参考文献 • ゼロから作るDeep Learning • ニューラルネットワークと深層学習 • NRI

    ナレッジ・インサイト 用語解説 • 使用ライブラリ • Pyplot • Scikit-learn