【ラビットチャレンジ】深層学習:Day1 まとめ

ラビットチャレンジ 深層学習:その1

講師紹介

  • Noberaの人

Day1

  • NN

9 ROOP

  • 基礎を反復

9 STORY

  • 多角的に全体像を把握

フレームワークや牽引企業も紹介

9 ACTION

  • 終了課題
  • 制作課題

人に教える。言語化するは重要なこと

ニューラルネット全体像

  • エンジニアが一番注目すべきは中間層

※ 例は動物を分類する 入力層の中で、何が重要なのかを頭で理解できるかどうかがポイント

確認テスト

  • Q: ディープラーニングは結局何をやろうとしているか? 2行以内で述べよ
    • A: ある入力に対応する出力を学習し、未知の入力に対して適切な出力を提供する処理を提供する

答えの:例:誤差を最小化するパラメータを発見すること

値の最適化の最終目的:3 重み,4 バイアス

全体像:パラメータなど

W: 重み b: バイアス

↑ 2つ合わせて wで表す

f:id:n_morioka:20190624000529p:plain

ニューラルネットワーク(NN)で出来ること

  • 回帰
    • 結果予想
    • ランキング
  • 分類
    • 猫写真の判別
    • 手書き文字認識
    • 花の種類分類

※ 最終課題はアイリスデータの分類

実用例

  • 自動売買(トレード)
  • チャットボット
  • 翻訳
  • 音声解釈
  • 囲碁、将棋AI

※ 音声データは実用化するために集める量が現実的ではない 既存ライブラリはAPIで提供されているものを利用するのが良い

Section 1 入力層から中間層

  • 入力
  • 重み
  • バイアス
  • 総入力
  • 出力
  • 活性化関数

確認テスト1

動物分類の実例を入れよ

確認テスト2

u = x1w1 + x2w2 + x3w3…. + b の数式をPythonで書け

u1 = np.dot(x, W1) + b1

確認テスト3

1-1のファイルから 中間層の出力を定義しているソースを抜き出せ

    # 中間層出力
    z = functions.relu(u)
    print_vec("中間層出力", z)

Jupyter演習

入力 [01,0.2] バイアス 0.5

活性化関数 : relu

numpy使い方

np.zeros(2) → zero初期化

np.ones(2) → 1で初期化

np.random.rand(2) → ランダム値(0〜1)

np.random.randint(5, size=(2)) → ランダム値(任意の整数: ここでは5)

Section2 活性化関数導入

活性化関数

ニューラルネットワークにおいて、次の層への出力の大きさを決める 非線形 の関数 入力値の値によって、次の層への信号の on/off や強弱を定める働きを持つ

確認テスト(線形/非線形)

f:id:n_morioka:20190624001020p:plain

中間層用の活性化関数

  • ReLU関数
  • シグモイド(ロジスティック)関数
  • ステップ関数

※ステップ関数は微分すると0になるので、使われない 人間の脳を目指すみたいな話だったのにステップ関数は機械的になる ↓ ※シグモイドは使われるが、課題も多い 大きな値では出力の変化が微小なため、勾配消失問題を引き起こすことがあった ↓ ※ReLUは今もっとも使われている活性化関数 勾配消失問題の回避とスパース化に貢献することで良い成果をもたらしている

全結合NN - 単相複数ノード

活性化関数の効果で一部の出力は弱く、一部は強く伝搬される

確認テスト

中間層出力zを求める箇所はソースコード中のどこか? z = functions.sigmoid(u)

functionsはなにか? functions.pyというファイルに定義されている関数群のモジュール

Section3 出力層

人間が分かる形の出力にしたい → そのため出力層の処理もかなり重要

※ ねずみの確率100%みたいな出力は疑ってかかったほうが良い

誤差関数

誤差関数はどこで使う? 出力データと訓練データとの差を見るときに使う

確認テスト

  1. なぜ2乗しているのか?

    → マイナス値を出さないため

  2. なぜ 1/2 しているのか?

    微分したときに計算しやすいため

出力層用の活性化関数

  • ソフトマックス関数
  • 恒等写像
  • シグモイド(ロジスティック)関数

※ 中間層と何が違うのか? 【値の強弱】 中間層:しきい値の前後で信号の強弱を調整 出力層:信号の大きさ(比率)はそのままに変換 【確率出力】 分類問題の場合、出力層の出力は 0 ~ 1 の範囲に限定し、総和を1とす る必要がある

出力層の種類 - 組み合わせ

※この組み合わせは重要

回帰 二値分類 多クラス分類
活性化関数 恒等写像 シグモイド関数 ソフトマックス関数
誤差関数 二乗誤差 交差エントロピー 交差エントロピー

数式とコード

シグモイド関数

    def sigmoid(x):
      return 1/(1 + np.exp(-x))

ソフトマックス関数(確認テスト込)

    def softmax(x): ①
      if x.ndim == 2:
        x = x.T
        x = x - np.max(x, axis=0)
        y = np.exp(x) /np.sum(np.exp(x), axis=0) 
        return y.T
      x = x - np.max(x) # オーバーフロー対策 
      return np.exp(x) ② / np.sum(np.exp(x)) ③

二乗誤差

    def mean_squared_error(d, y):
      return np.mean(np.square(d - y)) / 2

交差エントロピー(確認テスト込)

    def cross_entropy_error(d, y):  ①
      if y.ndim == 1:
        d = d.reshape(1, d.size)
        y = y.reshape(1, y.size)
        # 教師データがone-hot-vectorの場合、正解ラベルのインデックスに変換
        if d.size == y.size:
          d = d.argmax(axis=1) 
          batch_size = y.shape[0]
      return -np.sum(np.log(y[np.arange(batch_size), d] + 1e-7)) / batch_size ②

Section4 勾配降下法

深層学習の目的

学習を通して誤差を最小にするネットワークを作成すること → 誤差E(w)を最小化するパラメータwを発見すること

確認テスト

勾配降下法の該当するソースコードを探せ

    grad = backward(x, d, z1, y)
    for key in ('W1', 'W2', 'b1', 'b2'):
        network[key]  -= learning_rate * grad[key]

※学習率の値によって学習の効率が大きく異なる → 学習率が大きすぎた場合、最小値にいつまでもたどり着かず発散してしまう → 学習率が小さい場合発散することはないが、小さすぎると収束するまでに時間がかかってしまう

※大域的局所解

勾配降下法のアルゴリズム

  • Momentum
  • AdaGrad
  • Adadelta
  • Adam

確率的勾配降下法(SGD)

確率的勾配降下法 勾配降下法
ランダムに抽出したサンプルの誤差 全サンプルの平均誤差
  • メリット
    • データが冗長な場合の計算コストの軽減
    • 望まない局所極小解に収束するリスクの軽減
    • オンライン学習が出来る

確認問題

オンライン学習とはなにか?

    オンライン学習とは学習データが入ってくるたびにその都度、新たに入ってきたデータのみを使って学習を行うもの。学習を行う際に1からモデルを作り直すのではなく、そのデータによる学習で今あるモデルのパラメータを随時更新していく

ミニバッチ勾配降下法

ミニバッチ勾配降下法 確率的勾配降下法
ランダムに分割したデータの集合(ミニバッチ)Dtに属するサンプルの平均誤差 ランダムに抽出したサンプルの誤差

確率的勾配降下法のメリットを損なわず、計算機の計算資源を有効利用出来る → CPUを利用したスレッド並列化やGPUを利用したSIMD並列化

確認テスト

ミニバッチ勾配降下法のEtが何を意味するのか図示

f:id:n_morioka:20190624001521p:plain

誤差勾配の計算

【数値微分】 プログラムで微小な数値を生成し擬似的に微分を計算する一般的な手法 → 各パラメータそれぞれについて計算するために負荷が大きい → 誤差逆伝搬法を利用する

ディープラーニング開発環境

※価格との兼ね合い

Section5 誤差逆伝搬

誤差逆伝搬法

算出された誤差を、出力層側から順に微分し、前の層前の層へと伝播。 最小限の計算で各パラメータでの微分値を解析的に計算する手法

計算結果(=誤差)から微分を逆算することで、不要な再帰的計算を避けて微分を 算出できる

Jupyterで解説

※ functions.d_reluやfunctions.d_sigmoidの切り替えでの収束確認など

確認テスト

2つの空欄に該当するソースコードを探せ

f:id:n_morioka:20190624001625p:plain

delta2 = functions.d_mean_squared_error(d, y)

f:id:n_morioka:20190624001655p:plain

grad['W2'] = np.dot(z1.T, delta2)

実践に繋がるアウトプット

終了課題

※ 課題によって利用しているアルゴリズムが適切か?など見たい

    修了課題について確認(5分)
    Q1. 課題の目的とは? どのような工夫ができそうか 
    Q2. 課題を分類タスクで解く場合の意味は何か 
    Q3. irisデータとは何か2行で述べよ

論文解説

早めに結果の図を見てしまって概要を掴むのも手 考察については細かく読まなくても良いかもしれない

実装をうまくやるための参照として使っている。1ツールとしている どうやって自分の課題に使えるかとして昇華すべし