深層学習１

#深層学習ｄａｙ１

##プロローグ
###識別モデル・生成モデル
機械学習・深層学習モデルのそれぞれで識別・生成を行う手法が存在する。

識別モデル…データを目的のクラスに分類する
　　　　　　テータからクラス
　　　　　　p(Ck|x)→条件「あるデータがｘが与えられた」という条件のもとでクラスCkである確率
　　　　　　具体的なモデル→決定木、ロジスティック回帰、サポートベクタマシン、ニューラルネットワーク
　　　　　　特徴→高次元から低次元、必要な学習データ：少
　　　　　　応用例→画像認識

生成モデル…特定のクラスのデータを生成する
　　　　　　クラスからデータ
　　　　　　p(x|Ck)→条件「あるクラスｘに属する」という条件のもとでデータCkの分布
　　　　　　具体的なモデル→隠れマルコフモデル、ベイジアンネットワーク、ＶＡＥ、ＧＡＮ
　　　　　　特徴→低次元から高次元、必要な学習データ：多
　　　　　　応用例→画像の趙解像度、テキスト生成

###識別器の開発アプローチ
識別器の開発には３つのアプローチが存在する。生成も識別に応用できる。
生成モデル…モデル化の対象→各クラスの生起確立、データのクラス条件付密度
　　　　　　特徴→データを人工的に生成できる、確率的な識別
　　　　　　学習コスト→大
識別モデル…モデル化の対象→データがクラスに属する確率
　　　　　　特徴→確率的な識別
　　　　　　学習コスト→中
識別関数…モデル化の対象→データの属するクラスのみ
　　　　　特徴→学習量が少ない、決定的な識別
　　　　　学習コスト→小

###識別器における生成モデルと識別モデル
データの分布は分類結果より複雑なことがある。生成モデルはこれを推定する。
データのクラス条件付密度は分類結果より複雑→生成モデルはこの分布を推定する。計算量が多い。
単に分類結果を得るのであれば、直接データがクラスに属する確率を求める→分類モデルのアプローチ

###識別器における識別モデルと識別関数
識別モデルは識別結果の確率が得られる。識別関数では識別結果のみ。

###識別モデルによる識別
１．推論：入力データを基に事後確率を求める
２．決定：事後確率を基に識別結果を得る。
→間違いの程度を測ることが出来る。
→推論結果の取扱を決められる（棄却など）

###識別関数による識別
入力データから識別結果を一気に得る。
→間違いの程度を測ることができない

###ニューラルネットワークでできること
回帰…結果予想（売上予想、株価予想）
　　　ランキング（競馬順位予想、人気順位予想）
分類…猫写真の判別、手書き文字認識、花の種類分類

ニューラルネットワーク：回帰
連続する実数値を取る関数の近似→回帰分析（線形回帰、回帰木、ランダムフォレスト、ニューラルネットワーク）

ニューラルネットワーク：分類
性別や動物の種類など離散的な結果を予想するための分類→分類分析（ベイズ分類、ランダムフォレスト、ニューラルネットワーク）

深層学習の実用例
自動売買、チャットボット、翻訳、音声解釈、囲碁・将棋ＡＩ

##入力層～中間層
ｕ＝Ｗｘ＋ｂ
ｚ＝ｆ（ｕ）
ｕ、ｚを求める式が赤線部分
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/c0d6e82a-69b5-c589-759a-49b9fefb305c.png)
##活性化関数
ニューラルネットワークにおいて、次の層への出力の大きさを決める非線形の関数。
入力値の値によって、次の層への信号のＯＮ／ＯＦＦや強弱を定める働きをもつ。

中間層の活性化関数
ＲｅＬＵ関数、シグモイド関数、ステップ関数

出力層の活性化関数
ソフトマックス関数、恒等写像、シグモイド関数

##出力層
出力層の誤差関数について

誤差関数を２乗する理由
引き算を行うだけでは、各ラベルの誤差で正負両方の値が発生し、全体の誤差を正しく表すのに都合が悪い。２乗してそれぞれのらべるで誤差を正の値になるようにする。

１／２する理由
実際にネットワークを学習するときに行う誤差逆伝搬の計算で、誤差関数の微分を用いるが、その際の計算式を簡単にするため。本質的な意味は無い。
本来ならば分類問題の場合、誤差関数にクロスエントロピー誤差を用いるが、説明の便宜上、誤差関数に平均２乗誤差を用いているため次のようなコードになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/301058df-1058-57b0-714f-9bbe5746fb66.png)
出力層の活性化関数
出力層と中間層の違い
【値の強弱】
・中間層：閾値の前後で信号の強弱を調整
・出力層：信号の大きさはそのまま変換

【確率出力】
・分類問題の場合、出力層の出力は０～１の範囲に限定し、総和を１とする必要がある。

出力層と中間層で利用される活性化関数が異なる

出力層の活性化関数について
恒等写像…回帰に使われる。誤差関数は２乗誤差。
シグモイド関数…二値分類に使われる。誤差関数は交差エントロピー。
ソフトマックス関数…多クラス分類に使われる。誤差関数は交差エントロピー。

数式とコード

シグモイド関数
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):
  retrun 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)
  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

##勾配降下法
深層学習の目的
学習を通して誤差を最小にするネットワークを作成すること
→誤差E(w)を最小化するパラメータwを発見すること
→勾配降下法を利用してパラメータを最適化

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

勾配降下法の学習率の決定、収束性向上のアルゴリズムに以下のものがある
・Ｍｏｍｅｎｔｕｍ
・ＡｄａＧｒａｄ
・Ａｄａｄｅｌｔａ
・Ａｄａｍ…最も使われる

エポック…誤差関数の値をより小さくする方向に重みＷ及びバイアスｂを更新する１サイクル
勾配降下法…全サンプルの平均誤差
確率的勾配降下法…ランダムに抽出したサンプルの誤差
ミニバッチ勾配降下法…ランダムに分割したデータの集合（ミニバッチ）に属するサンプルの平均誤差

確率的勾配降下法のメリット
・データが冗長な場合の計算コストの軽減
・望まない局所極小解に収束するリスクの軽減
・オンライン学習ができる

バッチ学習…学習に使うすべてのデータを予めすべて用意しておき、すべてのデータを用いて学習する
オンライン学習…モデルに都度、都度データを与え、少しずつ学習していく。最初にすべてのデータを準備する必要が無い。

ミニバッチ勾配降下法のメリット
・確率的勾配降下法のメリットを損なわず、計算機の計算資源を有効利用できる
→ＣＰＵを利用したスレッド並列化やＧＰＵを利用したＳＩＭＤ並列化

##誤差逆伝播法
誤差勾配の計算（数値微分）
プログラムで微少な数値を生成し擬似的に微分を計算する一般的な手法

数値微分のデメリット
・各パラメータｗそれぞれについて誤差を計算するために、順伝播の計算を繰り返し行う必要があり負荷が大きい→誤差逆伝播法を利用する


誤差逆伝搬の計算
計算結果（誤差）から微分を逆算することで、不要な再帰計算を避けて微分を算出できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/b2d26f22-c5e4-4ffd-e9fb-bf0eca8a277b.png)

##モノローグ
ディープラーニングの開発環境
■ローカル
・ＣＰＵ
・ＧＰＵ
■クラウド
・ＡＷＳ
・ＧＣＰ

過学習
巨大なニューラルネットワークで発生
訓練誤差は少なくなるが、テスト誤差が大きくなる
過学習を防ぐ仕組みにドロップアウトがある

データ集合の拡張
学習データが不足するときに人工的にデータを作り水増しをする手法
分類タスクに効果が高い
密度推定のためのデータは水増しできない
画像でのデータ拡張手法は様々なものが存在…オフセット、ノイズ、ドロップアウト、ＪＰＥＧ圧縮、ぼかし、色温度、ジグソー、拡大・縮小、回転、剪断、クロップ、９０度回転
データ拡張の結果、データセット内で混同するデータが発生しないよう注意
中間層へのノイズ注入で様々な抽象化レベルでのデータ拡張が可能
データ拡張の効果とモデル性能かの見極めが重要
・データ拡張の効果と性能評価
データ拡張を行うとしばしば劇的に汎化性能が向上する
ランダムなデータ拡張を行うときは学習データが毎度異なるため再現性に注意
・データ拡張とモデルの捉え方
・一般的に適用可能なデータ拡張はモデルの一部として捉える
・特定の作業に対してのみ適用可能なデータ拡張は入力データの事前加工として捉える。

特徴量の転移
入力層に近い側では、データの基本的な特徴が抽出される。
プリトレーニング：教師なし学習で特徴量抽出器を作る。学習済み重みを作る。
ファインチューニング：ベースモデル重み（学習済み重み）を再学習
転移学習：ベースモデルの重み（学習済み重み）を固定
特徴量抽出：学習コスト高、大量なデータが必要
タスク固有処理：学習コスト低、少量なデータで済む

#深層学習ｄａｙ２

##勾配消失問題
誤差逆伝播法が下位層に進んでいくに連れて、勾配がどんどん緩やかになっていく。そのため、勾配降下法による、更新では下位層のパラメータはほとんど変わらず、訓練は最適値に収束しなくなる
シグモイド関数では、大きな値では出力の変化が微小なため、勾配消失問題を引き起こすことがある。理由は、微分した(1-sigomoid(x))･sigmoid(x)の最大値が０．２５なので、かけ合わせていくと０に近づく。

勾配消失の解決法
・活性化関数の選択
・重みの初期値設定
・バッチ正規化

ReLU関数
今、最も使われている活性化関数
勾配消失問題の回避とスパース化に貢献することで良い成果をもたらしている
０より大きい範囲では、微分結果が１なので、いくらかけ合わせても１のまま減らない
０未満の範囲では、微分結果が０になるので、その重みは使われなくなる

Xavierの初期値の設定方法
標準正規分布に属する乱数である重みの要素を、前の層のノード数の平方根で除算した値

標準正規分布に属する値で初期化すると、０か１に偏るため、勾配消失が発生する
Xavierの初期化を行うと、各レイヤーを通った後の値はどれもある程度のばらつきを持ちつつ、０や１に偏ることもない。活性化関数の表現力を保ったまま、勾配消失への対策がとれている。
Xavierの初期化は、シグモイド関数のようにS字カーブの活性化関数で効果を発揮する

Heの初期値を設定する活性化関数：ReLu関数
初期値の設定方法
重みの要素を、前の層のノード数の平方根で除算した値に対し、ルート２をかけ合わせた値
標準正規分布に属する値の場合、０に偏る
He初期化を行うとある程度表現力を保った状態となる

重みの初期値に０を設定すると、正しい学習が行えない→すべての重みの値が均一に更新されるため多数の重みをもつ意味がなくなる


バッチ正規化とは
ミニバッチ単位で、入力値のデータの偏りを抑制する手法

バッチ正規化の使いどころとは？
活性化関数に値を渡す前後に、バッチ正規化の処理を含んだ層を加える

機材の違いによるミニバッチサイズ
GPU:１～６４
TPU:１～２５６

バッチ正規化のメリット
学習が安定化し、学習がスピードアップする
過学習を抑える

シグモイド関数では、勾配消失問題のため学習が失敗する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/4c7a5e3c-5a74-4397-2ce8-8229c8c23a8a.png)

ReLu関数の場合。ある点までは、学習が全く進んでいないが、急激に学習が進む。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/85028141-ba16-b22d-533e-da232ed958c2.png)

シグモイド関数Xavierの場合。学習が順調に進む。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/4d091bca-c6a6-664b-d215-e4acc45870bf.png)
Relu－He初期化の場合。かなり高速に学習が進んだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/e5a76401-14a8-05cd-791e-14b4049165ac.png)
バッチ正規化のコード
batch_sizeに分割して正規化している
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/f0040186-8b2c-6da6-65f2-cd0ea9d6be6a.png)

学習が順調に進んでいる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/8d7752cf-b4ef-f844-33b3-d33043b8a5ea.png)
##学習率最適化手法
初期の学習率設定方法の指針
・初期の学習率を大きく設定し、徐々に学習率を小さくしていく
・パラメータごとに学習率を可変させる
→学習率最適化手法を利用して学習率を最適化

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

モメンタムのメリット
・局所的最適解にはならず、大域的最適解になる。
・谷間についてから最も低い位置（最適値）にいくまでの時間が早い

モメンタムのコード
self.v[key]=self.momentum*self[key]-self.learning_rage*grad[key]
                   慣性μ　　　　　　　　　　学習率ε　　微分した値
params[key]+=self[key]

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

AdaGradのメリット
・勾配の緩やかな斜面に対して、最適値に近づける

課題
学習率が徐々に小さくなるので、鞍点問題を引き起こすことがある。

コード
self.h[key]=np.zeros_like(val)
何かしらの値でｈを初期化
self.h[key]+=grad[key]*grad[key]
　　　　　　計算した勾配の２乗を保持
params[key]-=self.learning_rate*grad[key]/(np.sqrt(self.h[key])+1e-7)
　　　　　　　　現在の重みを適応させた学習率で更新

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

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

コード
self.h[key]*=sef.decay_rate
self.h[key]+=(1-self.decay_rate)*grad[key]*grad[key]
params[key]-=self.learning_rate*grad[key](np.sqrt(self.h[key])+1e-7)

Adam
・モメンタムの過去の勾配の指数関数的減衰平均
・RMSPropの、過去の勾配の２乗の指数関数的減衰平均
上記それぞれを含んだ最適化アルゴリズム

Adamのメリット
モメンタムおよびRMSPropのメリットを含んだアルゴリズム

SGDの例、学習はうまくいってない
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/9b132457-ff03-389b-1f74-27f7e166c236.png)

Momemtumの例、やはり学習はうまくいってない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/333be935-7499-3d41-0ac8-e22d4abd4ca2.png)
 
AdaGradの例、やはりうまくいってない
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/dbfa41c9-e989-21ae-380e-8d01d1b439c7.png)

RMSpropの例、学習はうまくいっている
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/c62b8398-e967-3704-2b22-8784411d059f.png)

Adamの例、学習はうまくいっている。RMSpropよりも若干テストケースの値がよくなっている。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/74a31056-d413-d659-91a0-ef1738ed8459.png)

##過学習
テスト誤差と訓練誤差の学習曲線がかい離すること

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

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

Weight decay（過重減衰）
過学習の原因
重みが大きい値をとることで、過学習が発生する
→学習させていくと、重みにばらつきが発生する
　重みが大きい値とは、学習において重要な値であり、
　重みが大きいと過学習が起こる

過学習の解決策
誤差に対して、正則化項を加算することで、重みを抑制
→過学習が起こりそうな重みの大きさ以下で重みをコントロールし、かつ重みの大きさにばらつきを出す必要がある。


L1,L2正則化
誤差関数にｐノルム（距離）を加える
p=1の場合、L1正則化→Lasso回帰
マンハッタン距離
p=2の場合、L2正則化→Ridge回帰
ユークリッド距離

コード
weigth_decay+=weight_decay_lambda
np.sum(np.abs(network.params['W'+str(idxx)]))
loss=network.loss(x_batch,d_batch)+weight_decay

ドロップアウト
ランダムにノードを削除して学習させること

メリットとして
データ量を変化させずに、異なるモデルを学習させていると解釈できる

2_5_overfittingの実行結果について
過学習、トレーニングセットについて正解率が１００％
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/b98b7d35-ef57-42f7-6f73-5b700b8dfead.png)

L2正則化、正解率が１００％じゃなくなる

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/feef2907-a642-ecde-7e54-20e127ce8d07.png)


L1正則化、正解率が１００％じゃなくなる。学習が不安定

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/2c177631-5e33-543c-fd09-0828179e89ec.png)


ドロップアウト、学習が未完了と考えられるが、順調に上がっている。上の３つに比べると遅くなっている。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/4bb99046-3ade-687a-da89-89234b8cc863.png)

ドロップアウト＋L1正則化　スムーズに上がっている
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/c1a222f4-020a-0939-6ea5-0293bc6131d8.png)

##畳み込みニューラルネットワークの概念
畳み込みニューラルネットワーク（ＣＮＮ）では次元間でつながりのあるデータを扱える

　　　　　　　　　　　　　１次元　　　　　　　　　　　　　　　　　　　　　２次元　　　　　　　　　　３次元
単一チャンネル　　音声（強度）　　　　　　　　　　　　　　　フーリエ変換した音声（強度）　　ＣＴスキャン画像（強度）
複数チャンネル　　アニメのスケルトン（腕の値、膝の値、…）　カラー画像（Ｒ，Ｇ，Ｂ）　　　　動画（Ｒ，Ｇ，Ｂ）
次元的なつながりがあれば、なんでも学習できる

ＬｅｓＮｅｔ
---------------------次元のつながりを保つ-----------------　　---人間がほしい結果-----
入力　　　　　Ｃ１　　　　Ｓ２　　　　Ｃ３　　　　　Ｓ４　　　Ｃ５　　　Ｆ６　　　出力
(32,32)      (28,28,6)  (14,14,6)   (10,10,16)    (5,5,16)    (120,)    (84,)     (10,)
1024          4704        1176         1600         400         120      84        10

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

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

全結合層
人間のほしい情報を得る

畳込層の演算概念
入力画像にフィルター（全結合層の重みに相当）の値をかけ合わせて足しバイアスを加え、出力画像を得る
入力画像にフィルターを適応すると出力画像が入力画像に比べて小さくなる。
出力画像が小さくならないように入力画像を縦横に広げることをバディングトいう。
パティングには、全部０で埋める、一番近い数字で埋めるなどの方法がある。
フィルターをいくつずつ、ずらすかをストライドという。
チャンネルはフィルターの数のこと。

全結合層（普通のニューラルネットワーク）のデメリット
画像の場合、縦、横、チャンネルの３次元データだが、１次元のデータとして処理される。
→ＲＧＢの各チャンネル間の関連性が学習に反映されない。

畳込層の実装
高速処理するための仕組み
 
im2col
４×４入力　３×３のフィルタ
３マスずつ読み込まれてデータを横に並べることで、ドット積で求められる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/e76fea0e-d49e-f8ea-a4a8-01dd5a942c0e.png)


プーリング層の演算概念
畳込演算のように、重みをかけるのでなく、対象領域の平均(Avg Pooling)または最(Max Pooling)大をとる。

出力画像の大きさを求める公式
高さ＝（画像の高さ＋２×パディング高－フィルター高）／ストライド＋１
幅＝（画像の幅＋２×パディング幅－フィルター幅）／ストライド＋１

プーリング層の実装
17行目　計算を速くするため列を並べ替える
19行目　元の形に並べ替える
22行目　最大値を求める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/bf655db8-2f21-6a5f-33dc-f7fd4bd76c07.png)

 
##最新のCNN
AlexNet
モデルの構造
5層の畳込層およびプーリング層、それに続く3層の全結合層から構成される。

畳込層から全結合層の作り方
Flattenというやり方は、横にすべて並べる
Global MaxPooling 1層の中の最大値を並べる
Global AvgPooling 1層の中の平均値を並べる
後ろ２者は、情報量を減らす割には非常に良い結果が得られる

過学習を防ぐ施策
サイズ４０９６の全結合層の出力にドロップアウトを使用している

[３ヶ月で現場で潰しが効くディープラーニング講座](http://study-ai.com/jdla/)
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/921781/ed06438c-368f-3293-6aa5-f35443068bed.png)](http://study-ai.com/jdla/)