鰤切手

旧初めての理系編入。編入から無職まであなたのお供をします。

【スポンサーリンク】

DeepLearningの学習方法について学ぶ E資格対策

今日はDeepLearningにおいてどのように学習させるか学びます。

 

お品書き

 

 

DeepLearningにおける学習とは

じゃあDeepLearningで学習させるにはどうしたらいいんだってお話です。 

 

f:id:Tsuquba:20201027204601p:plain

 

 

人間のように「はい、じゃあ勉強して」と本を渡すわけにはいきません。

DeepLearningにおける「学習」は正解データの値yと予測値の差を小さくする作業を指します。

つまりプログラムに入力のデータと正解のデータの2つを渡す必要があります。

例えば株価の予測を行いたいとき、yは株価、xはほかの企業の株価、天気の温度、景気のパラメータなどが挙げられます。

 

f:id:Tsuquba:20201022152156p:plain

 

 

学習で変えられるのは重みWだけです。

 

 

誤差の算出方法の一例:CrossEntropy

では正解の値と予測の値がどれくらい離れているか見る際にどのような計算式が使われるのでしょうか。

 

一番有名のがCrossEntropyという式です。式は

 

E=-ylog(t)-(1-y)log(1-t)

 

です。Eは誤差、yは予測値、tは正解の値です。この式を使うメリットとしては

 

・間違っていたらEをかなり大きく、正解に近いととても小さくなる
・計算が簡単
情報工学で使われる関数と相性がいい

 

があげられます。なので多くのDeepLearningでこの式が使われております。

 

 

重みwの更新方法

次に重みwの更新方法です。 

 

勾配降下法

 

f:id:Tsuquba:20201028150617j:plain

画像引用:

機械学習の要「誤差逆伝播学習法」を解説・実装してみる! – 株式会社ライトコード

 

上図のようにE(誤差)が最小となる場所に勾配を見ながら下げていく方法です。
ただこれらは

 

・たまに局所最適解(ほかに良い解がある)に陥いる
・たまに山を乗り越えてしまう
・wは大量(10万から1億)ぐらいあり、一個ずつ求めていると途方もない時間がかかる

 

と欠点を抱えています。

これらの問題を解決したのがSGDです。

 

確率的勾配降下法(SGD

勾配降下法と違うのが学習データを一部ずつ使い、誤差を計算します。

学習データを一部ずつとるので誤差関数、つまり上図のグラフの形が変わります、結果局所最適解に陥らずに山を越えやすくなります。

 

 

データの入れ方

では学習データを読み込ませるにはどうしたらいいのでしょうか。 

DeepLearningで用いられるのはミニバッチという手法です。


ミニバッチとはランダムにいくつかのグループに学習データを分け、並列に学習する方法。
それぞれの学習データのグループから損失の平均を計算し、それをもとに学習します。
グループごとに損失関数が若干異なるので局所解にハマりにくく、良い解にたどり着きやすくなります。

また並列計算ができるので計算を行うGPUとの相性が良いです。

 

 

学習時の注意

次に学習するにあたっての注意点を紹介。

 

過学習

 Deep Learningの代表的な問題点と言ってもいいぐらい有名なもの、過学習です。

過学習とは学習用データに適合しすぎて、テストデータ(実際に運用するとき)に適合できなくなってしまう問題です。

過学習が起きる理由としまして

 

1.モデルの自由度が高い(ニューロンの数が多い、特徴量(入力xのカテゴリ )が多い
2.データ数が少ない
3.ノイズ、外れ値が多い

 

の3つが挙げられます。

次に過学習への対策を紹介します。

 

対策1:モデルにノイズ追加

学習をあえて邪魔をしてより強いモデルを作る手法です。

入力に関係ない値を混ぜます。

例えるならトレーニングの時重りをつけて、試合の時に重りを外すスポーツ選手。

 

対策2:Dropput

 ↑の一例、学習時にランダムにニューラルネットワークの一部の重みを一時的に無効化する手法。

 

対策3:L1,L2正則化

損失関数に正則化項を入れて対応します。こうすると、余計なパラメータを減らすように重みの調整が行われます。

 

 E=E_0+\lambda E_w(w)

 

で、正則化にも

L1正則化(Lasso)
L2正則化(Ridge)

がありE(w)が異なります。

 

L_1:E_w(w)=\sum_{k=1}^{n} |w_k|
L_2:E_w(w)=\sum_{k=1}^{n} |w_k|^2

 

L1では重みwがスパース、つまり0になったりします。L2 の場合、0.00001のように小さな値が残りやすいです。

なのでL1では特徴量の削減、計算メモリ少なくなるメリットがあります。

 

対策4:Early Stopping

  正則化が十分でない場合、テストデータに対する誤差が増えてしまう場合があります。
そこで学習が進んでテスト誤差が増える前に学習を止めてしまう手法をEarly Stoppingと言います。

 

 

学習不足

次に考えられるのが学習データが少なすぎて起こる問題、学習不足です。ここでは学習データをどうやって増やすかという点に着目して対策します。

 

対策1:Deep Augmentation

学習データを水増しする手法。画像データなら

 

・左右反転
・上下反転
・回転
・前後左右への移動
・拡大縮小
・色の変換

が挙げられます。

 

対策2:半教師あり学習

教師データをもとに教師なしデータ(yの値が分からないもの)を分類してから学習する方法です。
大量に教師ありデータを得るのは難しいけど、ないものなら入手できるから自分たちでデータ作っちゃおうという発想。

 

 

学習前処理

次によい解にたどり着くための前処理を紹介します。

 

正規化

データを前もって扱いやすい形に変換します。
例えば特徴の値を-1~1に収めたり、後述する白色化だったり様々な手法があります。

 

標準化

データの値をx,平均をμ、標準偏差をσとすると

[tex:Z=xμσ]

とデータの平均を0、標準偏差は1の標準正規分布にします。

 

無相関化

特徴量に相関がないようデータを回転させる前処理。
データがy=axのグラフで近似できているものをy=0の式で近似できるよう変換するイメージです。

 

白色化

無相関化+標準化。データの収束が早くなります。

 

Batch Normalization

Batch Normalizationは各バッチごとに白色化をかけ、各層ごとに平均0,分散1にする正規化を施します。

層を重ねると正規化や白色化の効果が薄れる場合があり、これを共変量シフトといいます。Batch Normalizationではこの共変量シフトを解消しています。

この派生形でLayer Normalization(chで正規化)、Instance Normalization(ch独立で画像で正規化)があります。

 

教師あり事前学習

Batch Normalizationが登場したのでほぼ使わなくなった手法。Dropoutの層バージョン。

層1,層2,層3があるとします。
まず層1を学習させた後、層1の学習を止めた状態で層2と一緒に学習します。
その後層1,2の学習を止めたまま層3を追加し、最後にすべての層を一度に学習させる手法です。

使われていませんが、事前に簡単な問題を学習させ、その後本当にやりたい問題を学習すると性能が良くなるというテクニックは現在も使われています。

 

 

様々な学習方法

学習の手法はさまざまありますが、ここでは有名な学習方法を紹介します。

 

 

マルチタスク学習

 いくつかの問題を1つのネットワークで同時に解く手法。
自動運転だったら、どこに何があるかという問題とそれがどのくらいのスピードで動いているかを同時に1つのNNで解くイメージです。
性能向上が期待できます。

 

 

アンサンブル学習

モデルを複数用意してくっつける手法です。

 

バギング

 弱いモデルを複数用意し、多数決を取る手法
多様なNNを用意するのがポイント。

 

ブースティング

学習機を用意し、その学習機が間違えた問題に対する学習機を用意し、その学習機を・・・

と直列に学習機をつなげる手法、時間はかかりますが汎化性能が上がります。

 

 

以上となります。