【ラビットチャレンジ】 深層学習:その2 Day2まとめ

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

講義全体の流れ

テーマは CNN

  1. 入力層に値を入力
  2. 重み、バイアス、活性化関数で計算しながら値が伝わる
  3. 出力層から値が伝わる
  4. 出力層から出た値と正解値から、誤差関数を使って誤差を求める
  5. 誤差を小さくするために重みやバイアスを更新する
  6. 1〜5の操作を繰り返すことにより、出力値を正解値に近づけていく

誤差逆伝播法の復習

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

確認テスト

連鎖律の原理を使い、dz/dxを求めよ。

f:id:n_morioka:20190624002037p:plain

Section1 勾配消失問題について

勾配消失問題

勾配がなくなることにより、誤差逆伝搬で値が更新されなくなる

シグモイド関数:大きな値では出力の変化が微小なため、勾配消失問題を引き起こす事 があった。

確認テスト

シグモイド関数を微分した時、入力値が0の時に最大値をとる。その値 として正しいものを選択肢から選べ。

f(u)’ = (1 -1 sigmoid(u)) * sigmoid(u) sigmoid(0) = 0.5のため、 微分値の最大は 0.25 となる

勾配消失のビジョン

解決法

  • 活性化関数の選択
  • 重みの初期値設定
  • バッチ正規化

活性化関数:ReLU関数

今最も使われている活性化関数 勾配消失問題の回避とスパース化に貢献することで良い成果をもたらし ている。

def relu(u):
  return np.maximum(0,x)

重みの初期値設定- Xavier

初期値を設定する際の活性化関数

  • ReLU関数
  • シグモイド(ロジスティック)関数
  • 双曲線正接関数

初期値の設定方法

→ 重みの要素を、前の層のノード数の平方根で除算した値

重みの初期値設定- He

初期値を設定する際の活性化関数

  • ReLU関数

初期値の設定方法 → 重みの要素を、前の層のノード数の平方根で除算した値に対し√2をかけ合わせた値

確認テスト

重みの初期値に0を設定すると、どのような問題が 発生するか。簡潔に説明せよ。

→ すべての値が同じ値で伝わるためパラメータのチューニングが行われなくなる

バッチ正規化

  • バッチ正規化とは?
    • ミニバッチ単位で、入力値のデータの偏りを抑制する手法
  • バッチ正規化の使い所とは?
    • 活性化関数に値を渡す前後に、バッチ正規化の処理を孕んだ層を加える

確認テスト

一般的に考えられるバッチ正規化の効果を2点挙げよ。

1. 計算の高速化
2. 勾配消失が起きづらくなる

バッチ正則化の数学的記述

※ 数式から意味を読み取ってほしい ※ 適切に実装出来るようになってほしい

Jupyter

2_2_1_vanishing_gradient → sigmoid - gaussでは勾配消失問題が出ている → ReLUでは起きていない → 初期値を工夫しても起きづらくなっている(Xavier, He)

※ 結果のグラフ化、見える化が大事。感覚をつかみやすい

ReLU / Xavier

f:id:n_morioka:20190624002326p:plain

Sigmoid / He

f:id:n_morioka:20190624002348p:plain

データについて

  • 例)顔画像がほしい
    • どうやって集めるか?
    • サービスに結びつける。API提供など
  • 国内と海外の事情について
    • 国内は法整備がルーズじゃないか?
      • 今のうちに色々やっておくほうが良さそう
    • 国内のクライアントさんが持っているデータが少ない

Section2 学習率最適化手法について

深層学習の目的:誤差を最小化するパラメータを発見すること → 勾配降下法を利用してパラメータを最適化

    学習率の復習
    学習率の値が大きい場合
    ・最適値にいつまでもたどり着かず発散してしまう。
    
    学習率の値が小さい場合 
    ・発散することはないが、小さすぎると収束するまでに時間がかかっ てしまう。
    ・大域局所最適値に収束しづらくなる

初期の学習率設定方法

  • 初期の学習率を大きく設定し、徐々に学習率を小さくしていく
  • パラメータ毎に学習率を可変させる

モメンタム

学習率最適化手法の一つ

モメンタム 勾配降下法
誤差をパラメータで微分したもの と学習率の積を減算した後、現在 の重みに前回の重みを減算した値 と慣性の積を加算する 誤差をパラメータで微分したも のと学習率の積を減算する

モメンタムのメリット

  • 局所的最適解にはならず、大域的最適解となる
  • 谷間についてから最も低い位置(最適値)にいくまでの時間が早い

確認テスト

モメンタム・AdaGrad・RMSPropの特徴を それぞれ簡潔に説明せよ

モメンタム:最も低い位置(最適値)にいくまでの時間が早い AdaGram:最適値に近づきやすい RMSProp:パラメータの調整が少ない

学習率最適化手法 を利用して学習率を最適化

AdaGram

学習率最適化手法の一つ

AdaGrad 勾配降下法
誤差をパラメータで微分したもの

再定義した学習率の積を減算する
誤差をパラメータで微分したも
のと学習率の積を減算する

AdaGramのメリット・デメリット

  • 勾配の緩やかな斜面に対して、最適値に近づける
  • 学習率が徐々に小さくなるので、鞍点問題を引き起こす事があった

※ 鞍点:鞍点(あんてん、saddle point)は、多変数実関数の変域の中で、ある方向で見れば極大値だが別の方向で見れば極小値となる点である。 鞍部点、峠点とも言う。微分可能な関数については極値を取らない停留点とも言う。

RMSProp

学習率最適化手法の一つ

RMSProp 勾配降下法
誤差をパラメータで微分したもの

再定義した学習率の積を減算する
誤差をパラメータで微分したも
のと学習率の積を減算する

RMSPropのメリット

・局所的最適解にはならず、大域的最適解となる。 ・ハイパーパラメータの調整が必要な場合が少ない

Adam

学習率最適化手法の一つ → ちゃんと見るのは時間がかかる…

  • Adamとは?
    • モメンタムの、過去の勾配の指数関数的減衰平均
    • RMSPropの、過去の勾配の2乗の指数関数的減衰平均 上記をそれぞれ孕んだ最適化アルゴリズムである。
  • Adamのメリットとは?
    • モメンタムおよびRMSPropのメリットを孕んだアルゴリズムである

Jupiter演習

f:id:n_morioka:20190624002614p:plain

  • モメンタム

※ パラメータとしては0.5〜0.9くらいしか設定されているのを見たことがない

    # 慣性
    momentum = 0.9

f:id:n_morioka:20190624002652p:plain

  • MomentumをもとにAdaGradを作ってみよう
    # 変更しよう  
    if i == 0:
      h[key] = np.full_like(network.params[key], 1e-4)        
    else:
      h[key] += np.square(grad[key])        
    h[key] = momentum * h[key] - learning_rate * grad[key]
    network.params[key] -= learning_rate * grad[key] / (np.sqrt(h[key]))

f:id:n_morioka:20190624002747p:plain

  • RSMProp

f:id:n_morioka:20190624002814p:plain

  • Adam(実装例)

f:id:n_morioka:20190624002834p:plain

シンギュラリティ

  • 体内チップの話
  • 日本の全能学会
  • AIには欲が無い
  • 最先端の論文を見て、シンギュラリティに近づいているか?などを考えると良いモチベーションになる

Section3 過学習について

テスト誤差と訓練誤差とで学習曲線が乖離すること → 特定の訓練サンプルに対して、特化して学習する

原因

  • パラメータの数が多い
  • パラメータの値が適切でない
  • ノードが多い

ネットワークの自由度(層数、ノード 数、パラメータの値etc...)が高い → NNにおける課題

正則化

ネットワークの自由度(層数、ノード数、パラメータの値etc...)を制約すること → 正則化手法を利用して過学習を抑制する

正則化手法について

確認テスト

リッジ回帰の特徴として正しいものはどれか?

→ ハイパーパラメータに大きな値を設定すると、すべての重みが限りなく0に近づく

※ 線形回帰となる ※ 誤差関数に正則化項を与える

Weight decay(荷重減衰)

過学習の原因:重みが大きい値をとることで、過学習が発生することがある

過学習の解決策:誤差に対して、正則化項を加算することで、重みを抑制する

L1、 L2正則化

f:id:n_morioka:20190624003011p:plain

確認テスト

L1正則化を表しているグラフは どちらか

L1はLasso推定 → スパース推定される

L2は計算は多くなるが、最適化としては良い結果を出している

例題チャレンジ

※ L2パラメータ正則化 L2ノルムは、 ||param||^2 であり、その勾配(微分値)が誤差の勾配に加えられる。

→  2 * paramであるが、係数2は正則化の係数に吸収されても変わらないので param になる
→ (4) が答え

※ L1パラメータ正則化 L1ノルムは、|param|なのでその勾配が誤差の勾配に加えられる → sign(param) となる → (3)が答え

※ データ集合の拡張

→ (3) が答え

ドロップアウト

過学習の課題 → ノードの数が多いというのがある

ドロップアウトとは? → ランダムにノードを削除して学習させること → メリットとしてデータ量を変化させずに、異なるモデルを学習させていると解釈できる

※ TensorFlowでの実装などはブラックボックス… → ただし、層ごとにノードの閾値を設けたりしている? 効果は高い

ソースコード演習

overfitting

f:id:n_morioka:20190624003107p:plain

Weight decay(L2)
weight_decay_lambda = 0.1

f:id:n_morioka:20190624003130p:plain

Weight decay(L2)
weight_decay_lambda = 0.4

f:id:n_morioka:20190624003151p:plain

weight_decay_lambda が小さい → 過学習が抑制されない weight_decay_lambdaが大きい → 過学習はされないが精度が出ない

Weight decay(L1)

f:id:n_morioka:20190624003214p:plain

Jupyter演習(Dropout)

※ クラスをよく利用する。再利用性が高い またライブラリも利用します(Chainerなど)

Dropout

f:id:n_morioka:20190624003237p:plain

Dropout(ratio=0.4)

f:id:n_morioka:20190624003301p:plain

Dropout(ratio=0.02)

f:id:n_morioka:20190624003320p:plain

Dropout(Adam, ratio=0.15)

f:id:n_morioka:20190624003339p:plain

Dropout + L1

f:id:n_morioka:20190624003359p:plain

自分で課題設定

検索について → 日本語で検索はあまりやらない → 翻訳家の質によるため… 英語だとそこは問題にならない

論文について → 論文発表やそれぞれの論文の関連など、時系列を意識したほうが良い → 論文、参考文献、関連書籍をインプットしていくときに

課題設定、目的を自分でちゃんと言語化出来るようにしたい → 他人に説明出来るくらいには

畳み込みニューラルネットワークについて

画像の分野でソリューションを提供している → 音声や時系列データにも応用は可能

LeNet : CNNの出処

畳み込み層

畳み込み層では、 画像の場合、縦、横、チャンネルの3次元 のデータをそのまま学習し、次に伝えるこ とができる。

結論:3次元の空間情報も学習できるような 層が畳み込み層である。

※ 全結合NNでは空間情報は明確には保持しない

畳み込みの概念

  • フィルターをかける
  • バイアスを足し合わせる

→ 出力画像が出せる

パディング

入力画像と出力画像を合致させるために入力画像に固定データで枠をつけるイメージ

ストライド

いわゆるずらす幅

チャンネル

CNNのミソ

全結合層のデメリット 画像の場合、縦、横、チャンネルの3次元データだが、 1次元のデータとして処理される。 → RGBの各チャンネル間の関連性が、 学習に反映されないということ。

Jupyter演習

im2col → 多次元データを2次元化する メリットは、行列計算に落とし込むことで多くのライブラリを活用できる

col2im → 2次元データを多次元化する ただし、元の形に戻すためにはshapeが必要

# im2colの処理確認
input_data = np.random.rand(2, 1, 4, 4)*100//1 # number, channel, height, widthを表す
print('========== input_data ===========\n', input_data)
print('==============================')
filter_h = 3
filter_w = 3
stride = 1
pad = 0
col = im2col(input_data, filter_h=filter_h, filter_w=filter_w, stride=stride, pad=pad)
print('============= col ==============\n', col)
print('==============================')
# col2imの処理確認
output_data = col2im(col, input_shape=input_data.shape, filter_h=filter_h, filter_w=filter_w, stride=stride, pad=pad)
print('============= output_data ==============\n', output_data)

プーリング層

maxプーリングとavgプーリングがある → それぞれ領域での最大値を選択したり平均を選択したりする

確認テスト

サイズ6×6の入力画像を、サイズ2×2のフィルタで 畳み込んだ時の出力画像のサイズを答えよ。 なおストライドとパディングは1とする。

→ 7×7

※ (H+2P - FH) / S + 1 = (6 + 2×1 - 2) / 1 + 1 = 7

Jupyter演習

Simple Convolution Network

f:id:n_morioka:20190624003641p:plain

シラバス

書籍「Deep Learning

認定プログラムはシラバスの項目を網羅&実装に不足部分を追加

※ 試験前にこのまとめは良く読んで復習しておく

応用数学

・講義の内容を理解していればシラバスの範囲(筆記試験)は問題ありません。 ・誤差逆伝播法で用いる偏微分などはシラバスには含まれませんが追加。

機械学習

・特別な技術ではなく一般的な話のまとめ。

NN

・Day1の講義で扱った最も基本的 な内容です。基本だけに重要。予習資料 を手打ち、手計算で繰り返しましょう。

正則化

・講義では正則化の流れを最もスタンダードな手法を用いて演習しました。 ・講義で扱っていない内容は演習問題のキーワードやシラバスから自身での まとめ学習をしてください。(9Action 検索力向上で後述)

※ CNNが最重要

Section5 最新のCNN

AlexNet

AlexNetとは2012年に開かれた画像認識コンペティション 2位に大差をつけて優勝したモデルである。 AlexNetの登場で、ディープラーニングが大きく注目を集 めた。

  • モデルの構造
    • 5層の畳み込み層およびプーリング層な ど、それに続く3層の全結合層から構成 される。
  • 過学習を防ぐ施策
    • サイズ4096の全結合層の出力にドロップアウトを使用してい る

検索力の向上

英語で検索しよう

自分で課題を設定しよう

  • 訴求
  • 課題(よくある)
    • 手元にデータが無い

クローラーを作ってみる」という課題が設定できる!!