Skip to main content
Deep
Learning
4章:ニューラルネットワークの学習
ゼロから作る
今井研究室B4 里形 理興
/28
手書き数字の分類
• 1桁の手書き数字に対し、
0〜9のどの数字か見分けるプログラムを実装する
• どういうアルゴリズムが考えられるでしょうか
2
/28
①機械学習を使わないやり方
• 人によって書き方が全く異なる”5”からクセを見つけ出す
• きつい
3https://www.researchgate.net/figure/Digit-5-Two-first-rows-a-sample-of-8-images-out-of-n-100-taken-from-the-Mnist-data_fig2_268065933 (edited)ref:
/28
②特徴量+機械学習
• 画像から特徴量を抽出し、識別器(SVMなど)で分類
• 特徴量にもいろいろ
SIFT
SURF
HOG
…
• 問題に適した特徴量の選択/設計が必要
4ref: http://www.cs.cornell.edu/courses/CS4670/2012fa/projects/p5/index.html
/28
③ディープラーニング!
• ニューラルネットワークを用いて、特徴量を学習させる
• 問題に応じて特徴量を設計する必要がない
• 生データから目的の出力を得られる(end-to-end)
5ref: http://nnadl-ja.github.io/nnadl_site_ja/chap1.html
/28
訓練データとテストデータ
学習後のNNには汎化能力があってほしい
汎化能力がない = 過学習(overfitting)(過剰適応とも)
→データを訓練用と評価用に分ける
• 訓練データ:NNの訓練に用いるデータ
教師データとも
• テストデータ:訓練したモデルを評価するのに使うデータ
6
/28
損失関数(loss function) [1/4]
• ニューラルネットワークの性能を示す指標
• 性能の”悪さ”を表す
→不適合度、不一致度
• NNにとって、損失関数を最小にすることが目標
→NNが最小にしやすいように損失関数を設定(微分可能)
7
/28
損失関数(loss function) [2/4]
• 2乗和誤差(mean squared error)
• y はニューラルネットワークの出力、t は教師データ
k はデータの次元数
8
/28
損失関数(loss function) [3/4]
• 交差エントロピー誤差(cross entropy error)
• y はニューラルネットワークの出力、t は教師データ
k はデータの次元数
• 正解ラベルは1で、その他は0(one-hot表現)なので、
実質的には正解ラベルに対応する出力の自然対数を計算す
るだけ
9
/28
損失関数(loss function) [4/4]
• 交差エントロピー誤差(cross entropy error)
• Eは
yが0に近づくほど大きく、
yが1に近づくほど小さくなる
• yが0に近いとめっちゃ大きい
(うれしい)
10
/28
学習に使うデータ数
• バッチ学習:全ての訓練データを用いる
- 理想的だが、膨大なデータには向かない
• オンライン学習:訓練データから一つをランダムに選択
(確率的勾配降下法:Stochastic Gradient Descentとも)
- 高速だが、最小化の向きは汎用的でないかもしれない
• ミニバッチ学習:訓練データから一部をランダムに選択
(ミニバッチ確率的勾配降下法とも)
11
/28
数値微分(numerical differentiation)
• 微小区間の傾きで微分を求めるやつ
• 誤差を小さくするために中心差分というのをやる
12
/28
• 多変数関数に対し、ある一つの変数に着目して微分
• 例) の時
偏微分(partial derivative)
13
↓f(x_0, x_1)のグラフ
/28
• 全ての変数の偏微分をベクトルとしてまとめたもの
先の例だと:
勾配(gradient)
14
↓勾配にマイナスつけたやつのグラフ
/28
勾配降下法(gradient descent method)
• 勾配を用いて関数を最小にするパラメータを探す
• 上の式を何度も適用しパラメータを更新していく
• は学習率(learning rate)
パラメータの更新量を決める
15
/28
学習率について
• 学習率は大きすぎると発散し、
小さすぎると最小値にたどり着けない
→適切に設定することが重要な問題
16
/28
実装してみる
• 次節から書籍のコード例を見ていきます
• https://github.com/oreilly-japan/deep-learning-from-scratch
のch04ディレクトリ内にあるやつです
17
/28
実装してみる - 手順
18
ミニバッチ
選択
勾配算出
パラメータ
更新
データの読み込み
NNの構築
ハイパーパラメータ設定
/28
実装してみる - NN[1/4]
• two_layer_net.py
• まず重みの初期化
• 初期化について詳しくは6.2節
19
/28
実装してみる - NN[2/4]
• two_layer_net.py
• ネットワークを順伝播して推論を行う
20
/28
実装してみる - NN[3/4]
• two_layer_net.py
• 損失関数の計算と認識精度の計算
21
/28
実装してみる - NN[4/4]
• two_layer_net.py
• 重みパラメータに対する勾配を求める
• 今回は数値微分により求めているがすごく遅い
サンプルコードを動かす時はgradient()の方を使おう
22
/28
実装 - ミニバッチ学習[1/3]
• train_neuralnet.py
• 前準備
23
/28
実装 - ミニバッチ学習[2/3]
• train_neuralnet.py
• iters_num だけループを回す
24
ミニバッ
チ選択
勾配算出
パラメー
タ更新
/28
実装 - ミニバッチ学習[3/3]
• train_neuralnet.py
• 1エポックごとに認識精度を記録
• エポック(epoch):訓練データを全て使い切る反復回数
データ100個がミニバッチの時は100回=1エポック
25
=max(train_size / batch_size, 1)
/28
学習結果
• 損失関数のグラフ および
訓練データとテストデータの認識精度のグラフ
26
/28
ちなみに
• さっきの数値微分で実装すると学習に時間がかかる
• 5章で誤差逆伝播法を勉強して学習を加速させよう
27
/28
まとめ
• 訓練データとテストデータに分けて汎化能力を評価
• 損失関数はNNの性能の悪さを示す
• 訓練データの一部を取り出して学習するミニバッチ学習
• 勾配降下法で損失関数を最小化する
• 学習率の設定はとても大事
28