Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ゼロから作るDeep learning 4章前半

68 views

Published on

2016/12/15勉強会資料

Published in: Data & Analytics
  • Be the first to comment

  • Be the first to like this

ゼロから作るDeep learning 4章前半

  1. 1. ゼロから作るDeep Learning 4章 ニューラルネットワークの学習 2016. 12. 15 Ikuo Kataoka
  2. 2. 目次 • 4.1 データから学習する • 4.2 損失関数 • 4.3 数値微分 • 4.4 勾配 • 4.5 学習アルゴリズムの実装 • 4.6 まとめ
  3. 3. 4.1 データから学習する ニューラルネットワークの学習とは? → 訓練データから最適な重みパラメータを自動で獲得すること 1 x1 x2 a y h( ) b w1 w2 y = h(b + w1x1 + w2x2) (※3章まではこれらは予め決めていた。つまり学習済) w1, w2, bを自動で探し出す
  4. 4. データ駆動 例えば、手書き数字を認識する場合 5 人の考えたアルゴリズム 人の考えた特徴量 (SIFT、HOGなど) 機械学習 (SVM、KNNなど) ニューラルネットワーク (ディープラーニング) 5 5 5 問題に応じて人が設計 特徴量も含めすべて機械が学習
  5. 5. ※参考:人工知能アルゴリズムあれこれ 教師データあり 分類器 決定木 判別分析 サポート・ベクタ・マシン(SVM) ニューラル・ネットワーク ディープラーニング 最近傍分類器(k近傍法) アンサンブル分類器 回帰分析 ベイズ線形回帰分析 ロジスティック回帰 回帰木 教師データなし クラスタ分析 最短距離法 最長距離法 群平均法 ウォード法 混合分析モデル 次元圧縮 ファジーC平均法 k平均法 スペクトラル・クラスタリング 主成分分析 PCA 因子分析 非負値行列因子分解 逐次特徴選択 共起分析 協調フィルタリング Aprioriアルゴリズム (インターフェース2017年1月号より)
  6. 6. 訓練データとテストデータ NN訓練データ (教師データ) NNテストデータ 学習 評価 汎化能力の獲得 まだ見ぬデータに対する能力 過学習の防止 あるデータセットにだけ過度に対応した状態 NN実際のデータ 実践 ハイパーパラメータの変更、関数の変更、 ネットワーク構成の変更、などなど
  7. 7. 4.2 損失関数 損失関数(Loss function) → ニューラルネットワークの学習のための指標 1 x1 x2 a y h( ) b w1 w2 tE これを最小にするように パラメータを調整する 𝐸 = 1 2 𝑘 ( 𝑦 𝑘 − 𝑡 𝑘)2 2乗和誤差 交差エントロピー誤差 𝐸 = − 𝑘 𝑡 𝑘 𝑙𝑜𝑔𝑦 𝑘
  8. 8. 2乗和誤差と交差エントロピー誤差 k 0 1 2 3 4 5 6 7 8 9 𝒚 𝒌 0.1 0.05 0.6 0.0 0.05 0.1 0.0 0.1 0.0 0.0 𝒕 𝒌 0 0 1 0 0 0 0 0 0 0 𝐸 = 1 2 𝑘 ( 𝑦 𝑘 − 𝑡 𝑘)2 2乗和誤差 交差エントロピー誤差 𝐸 = − 𝑘 𝑡 𝑘 𝑙𝑜𝑔𝑦 𝑘 (4.1) (4.2) ⇐ソフトマックス関数の出力 (合計=1) ⇐one-hot表現の教師データ (1が正解) (𝑦 𝑘 − 𝑡 𝑘)2 0.01 0.0025 0.16 0 0.0025 0.01 0 0.01 0.0 0.0 𝑡 𝑘 𝑙𝑜𝑔𝑦 𝑘 0 0 -0.511 0 0 0 0 0 0 0 ⇒2乗和誤差 E=0.0975 ⇒交差エントロピー誤差 E=0.511 k 0 1 2 3 4 5 6 7 8 9 𝒚 𝒌 0.1 0.05 0.1 0.0 0.05 0.1 0.0 0.6 0.0 0.0 𝒕 𝒌 0 0 1 0 0 0 0 0 0 0 (𝑦 𝑘 − 𝑡 𝑘)2 0.01 0.0025 0.81 0 0.0025 0.01 0 0.36 0.0 0.0 𝑡 𝑘 𝑙𝑜𝑔𝑦 𝑘 0 0 -2.303 0 0 0 0 0 0 0 ⇒2乗和誤差 E=0.5975 ⇒交差エントロピー誤差 E=2.303 いい感じの状態 良くない状態 ⇑交差エントロピー誤差はtが1のところのみ評価 def mean_squared_eror(y, t): return 0.5 * np.sum((y-t)**2) def cross_entropy_eror(y, t): delta = 1e-7 return -np.sum(t * np.log(y + delta))
  9. 9. ミニバッチ学習 ミニバッチ学習とは 訓練データ全体の中から一部のデータを無作為に選び出して、 それを使って学習すること (例: MNISTの場合、60,000枚の訓練データから100枚ランダムに選んで学習) → 【疑問】 なぜ全部使わずこんなことするの? import sys, os sys.path.append(os.pardir) import numpy as np from dataset.mnist import load_mnist (x_train, t_train), (x_test, t_test) = load_mnist(normalize=True, one_hot_label=True) print(x_train.shape) # (60000, 784) print(t_train.shape) # (60000, 10) train_size = x_train.shape[0] batch_size = 10 batch_mask = np.random.choice(train_size, batch_size) # ランダムに抽出された要素のインデックスの配列となる x_batch = x_train[batch_mask] t_batch = t_train[batch_mask]
  10. 10. 4.3 数値微分 • ニューラルネットワークの学習は、損失関数の値が小さくなるようにパラメータ を調整すること。 • そのために損失関数のパラメータによる微分(勾配)を計算し、それを頼りにパラ メータを増減させる。 • 微分値がマイナスなら、パラメータを増加させれば損失関数の値は減少し、微分 値がプラスなら、パラメータを減少させれば損失関数の値は減少する 微分値プラス 微分値マイナス パラメータを減少させ れば関数値は減少する パラメータを増加させ れば関数値は減少する 損失関数
  11. 11. 微分 微分の式 𝑑𝑓(𝑥) 𝑑𝑥 = lim ℎ→0 𝑓 𝑥 + ℎ − 𝑓(𝑥) ℎ 前方差分 x x+h 真の接線 近似による接線 x x+hx-h 真の接線 近似による接線 def numerical_diff(f, x): h = 10e-50 return (f(x+h) – f(x)) / h def numerical_diff(f, x): h = 1e-4 return (f(x+h) – f(x-h)) / (2+h) 中心差分 hの値は 10e-50とすると精度の問題で0と扱われるため不都合。 10−4が適当とされている
  12. 12. 偏微分 • 変数が2つ以上ある場合の関数の微分のこと。 • 一つの変数に着目してそれ以外の変数を固定化した微分 • 関数を𝑓 𝑥0, 𝑥1・・・ とすると、各変数の偏微分は、 𝜕𝑓 𝜕𝑥0 、 𝜕𝑓 𝜕𝑥1 、・・・と書く 𝑓 𝑥0, 𝑥1 = 𝑥0 2 + 𝑥1 2 例 𝑓 𝑥0, 𝑥1 を曲面と考えると曲面上の点(a,b)における𝑓 𝑥0, 𝑥1 の𝑥0の偏微分は、 𝜕𝑓 𝜕𝑥0 = 𝑑𝑓(𝑥0,𝑏) 𝑑𝑥0 = lim Δ𝑥0→0 𝑓 𝑥0+Δ𝑥0,𝑏 −𝑓(𝑥0,𝑏) Δ𝑥0 (bは定数値) で、これは点(a,b)における𝑥0方向の傾きを表す。また、𝑥1の偏微分は、 𝜕𝑓 𝜕𝑥1 = 𝑑𝑓(𝑎,𝑥1) 𝑑𝑥1 = lim Δ𝑥1→0 𝑓 𝑎,𝑥1+Δ𝑥1 −𝑓(𝑎,𝑥1) Δ𝑥1 (aは定数値) で、これは点(a,b)における𝑥1方向の傾きを表す。
  13. 13. なぜ損失関数を設定するのか? 認識精度を指標にして、これを高くするようにパラメータ 調整するのではダメなのか? • ほとんどの場所で微分が0となりパラメータの調整ができない • パラメータを更新しても認識精度はあまり変化しないし、認識精度は離散的(不 連続)な値なので変化するときにいきなり変化してしまう ※活性化関数にステップ関数ではなくシグモイド関数を使う方がよいのも同様の理由 (ステップ関数はほとんどの場所で微分値0となるため) 【疑問】 認識精度ってテストデータで出てくる ものでは?

×