深層学習　前編

深層学習（前編 1）
Section1：入力層～中間層

１．	入力層から中間層への計算法
Ul(中間層) = np.dot(x（入力）.W1（重み）) + b1(バイアス)

２．	出力層
出力層の見せ方によって、クライアントが納得するかが変わる
	わかりやすい形に編集するために、中間層からの出力を最後に変換する
	

３．	中間層
信号の強弱を重みによって変換
u（中間層の入力） = np.dot(x,W) + b
z（中間層の出力） = functions.relu(u)

４．	誤差関数とは
出力と正解地の差を表したもの
	通常は二乗誤差関数	
	誤差をerrorと呼ぶ
5.	Grad
勾配のこと
Gradientの略

Section2: 活性化関数（出力が学習結果のアウトプットにふさわしい形になるように調整する関数のこと）

1．シグモイド関数
一つの出力が０～１の間を緩やかに変化する関数
閾値を超えたら、１それ以外は０というシンプルな伝搬しかできなかったステップ関数と違い、信号の細かい強弱を伝えられるようになった
出力層で利用されるときは、二項分類に使われる（他分類はソフトマックス関数）
def sigmoid(x): return 1/(1 + np.exp(-x))
eのネイピア関数とは、(ex)′=ex(ex)′=ex（微分しても変わらない）、
logexを微分すると1/xという特徴を持つ。


2.	局所解に陥る理由
学習率が小さすぎる、しかし大きくしすぎると収束しない

3.	Relu関数
シグモイドで起こる勾配消失を解決する。
スパース化に貢献
閾値にいたるまでゼロの値だが、閾値を超えれば伝わる値に強弱がつく
閾値よりプラスである限り、勾配はゼロにならない。	

演習（シグモイドとReLUの出力結果の比較）

ReLu 中間出力大
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/07b0d1bb-bf96-c067-06bd-7e46b739759a.png)

Sigmoid 中間出力少
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/ed59ee12-e2fb-0f5c-7265-df354a4d03a6.png)




4.	スパース化とは
スパースであるとは、値のほとんどが0であるということ。
例えば、ベクトルa,bの内積を計算する際に、aのほとんどの要素の値が0であるとする。
0になにをかけても0ですから、aの値が0でない次元についてのみ、abの値を計算して足し合わせればよいわけです。このように、内積を計算する際に、どちらかのベクトルがスパースであれば計算が高速化可能。
0という値をメモリ上に律儀に保存しておく必要もありませんから、同時に省メモリ化も実現。
スパース化とは、元のベクトルや行列の性質を残しつつ、値のほとんどを0にしてしまうことです。ニューラルネットのスパース化といった場合には、通常はネットワークのパラメーターのほとんどを0にする事を指す。

Section3: 出力層

1.	ソフトマックス関数
一つだけでなく全出力を合計したものが0~1になるように調整したもの。
出力層で使用される
多分類向け（二分類はシグモイド関数）




補足：誤差関数の種類

1.	二乗誤差
誤差を更新するために判定結果と、実際の値の誤差を二乗して1/2する手法
2.	交差エントロピー
尤度関数に対数をとり、負の値をとったものが交差エントロピー関数
つまり交差エントロピー関数の最小化は尤度関数の最大化
尤度関数はその値が正しい可能性を表す
エントロピーは平均情報量のこと
Logで情報量を表現する
最後にシグモイド関数などを用いることで、正解値１か0に近づけることができる。そのことで、正解の分布と予測の分布の差異を算出し、その誤差を小さくする手法
One-hot-vectorかどうかが重要
教師データと学習結果が大きく乖離しているとき、交差エントロピーを使ったほうが学習スピードが速いため使われる


Section4: 勾配降下法

1.	勾配降下法
全サンプルの平均誤差を算出
その誤差をできる限りゼロにするために、入力側から重みを更新していく（時間がかかる）
2.	確率的勾配降下法
ランダムで選んだサンプルの誤差を算出
データが冗長な場合の計算コストの軽減 
望まない局所極小解に収束するリスクの軽減
オンライン学習ができる
3.	ミニバッチ勾配降下法
ランダムに分割したデータの集合（ミニバッチ）に属するサンプルの平均誤差

Section5: 誤差逆伝播法

1.	誤差逆伝播法
算出された誤差を出力層側から順に微分し、前の層へ順位に伝播
不要な再帰的計算を避けて効率的に計算する
ソフトマックス関数と交差エントロピーによる学習がおすすめ

演習（ランダムの範囲大小の比較）

ランダム範囲少
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/7bccb4da-b568-9e64-3c80-9d73d79f01aa.png)

ランダム範囲大
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/ae40f931-d1aa-5ad3-7ba2-d0103a9a3f99.png)


二日目

Section1: 勾配消失問題

１．勾配消失問題
誤差逆伝搬が下位層にすすんでいくにつれて、勾配が緩やかになること
初期値、最初の層はたいてい間違いが多いので更新する必要があるのに、更新が後の層でしか起こらないというのは、正しい判断をくだせなくなる。
	シグモイド関数の特徴（微分をしたとき、入力値が０の際に最大値をとる。
入力値０のとき、シグモイドは0.５になり、微分をすると0.25になる。）により、
最大でも0.25しか伝搬されず、それが繰り替えされて勾配がなくなる（学習すべき誤差がなくなる）ことが原因

2.	活性化関数の選択
	RELU関数を選択すれば、シグモイドのような微分の値ではなく、
	閾値を超えたものについては、そのまま伝搬されるので勾配消失が起きづらい。

3.	初期値の選択
・Xavier　重みの要素を、前の層のノード数の平方根で除算した値
・He　   重みの要素を、前の層のノード数の平方根で除算した値に対し
それぞれ√２ をかけ合わせた値
・0       すべての値が同じ値で伝わるため、
パラメータのチューニングが行われなくなる


演習（活性化関数と初期値の結果比較）

ReLU He　学習速い　ブレもない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/73848468-b6f1-a68b-2733-053f3a3f9fc0.png)

Sigmoid Xavier　学習遅め　ブレも大きい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/038d7c8f-6f45-c32f-49f1-874fe0842bdc.png)

Sigmoid He　学習遅め
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/656ae9c3-0aef-5515-32ae-cccc5168cdc2.png)

ReLU Xavier
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/c62f4e97-f1d9-29e2-30ca-f3ad63432cb0.png)


4.	バッチ正規化とは
ミニバッチ単位で入力値のデータの偏りを抑制（その都度正規化）する。
重みを計算後、活性化関数に値を渡す前後のタイミングでバッチ正規化の処理を行う層をフィルターとして入れる。
効果は①計算の高速化（データのばらつきが小さくなるので、計算がコンパクトで済む）、②勾配消失が起きづらいというものがある。
	正規化とは、データ全体を学習に適切な形に変換する処理のことｃ
例として標準化（特徴量を標準正規分布に従うようにする）、０～１の間に特徴量を変換するといったものがある。
バッチ正規化を行うためには、バッチの数だけデータを引き抜くという方法がよい

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

目的；学習率が小さすぎると、最適解までいくのに時間がかかる
　　　しかし学習率が大きすぎると、いつまでも収束しない状態になる。
　　　学習率を自動的に適切にできないか、という試行錯誤のこと。

１．	モメンタム
誤差をパラメータで微分したものと学習率の積を減算した後、現在の重みに前回の重みを減算した値と慣性の積を加算し学習率をだす方法
これにより局所的最適解にならず、大域的最適解にする。
過去の勾配の指数関数的減衰の平均をとる
0.9くらいが標準

２．	adaGrad
誤差をパラメータで微分したものと、再定義した学習率の積を減算することで
学習率を出す
勾配が緩やかになったタイミングで学習率を小さくする。
デメリットとして勾配が緩やかになったとき学習率が小さくなるので、
鞍点問題（大きい次元では最適解が、逆に最悪解になること）を起こす。
パラメータの更新ごとに学習率を調整するアルゴリズム

３．	RMSProp
誤差をパラメータで微分したものと再定義した学習率の積を減算し学習率を更新
局所的最適解にならないよう、大域的最適解にする
ハイパーパラメータ（機械学習で更新されない固定のパラメータ）の調整が必要な箇所が少ない
過去の勾配の事情の指数関数的減数平均（学習が進むにつれ、急速に学習率を低下させる。）


４．	Adam
モメンタム（過去の勾配の指数関数的減衰平均）とRMSProp（過去の勾配の事情の指数関数的減衰平均）の特長を含む
勾配の指数移動平均をとる

演習（RMSpropとAdamについて）

RMSprop
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/3e60367f-cfca-d12e-d6f0-33763c59b826.png)

Adam　学習遅い
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/708a7494-b233-004f-1322-9c8eb46ecad7.png)

Adam バッチ正規化　学習がはやくなった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/a2695004-e7ec-40ca-0750-1346c68c1d03.png)



Section3:　過学習について

１．	正則化とは
ネットワークの自由度を制約する（つまり過学習を抑制する）ために設定する。
正則化の方法は重みを低減する（ある大きさに重みが達したときに、制限を加える）ことで実現
方法は誤差関数にノルムを加える
Weight decayと呼ぶ

２．	過学習の原因
重みが大きい値をとるため。
学習させていくと、重みにばらつきが発生する。
重みが大きい値は、過学習を引き起こしている可能性が高い。

３．	L1,L2正則化の方法
誤差関数にpノルムを加える。
Pが１のときは、普通の意味の長さを表し、L1正則化と呼ぶ。
Pが2のときは、各成分の「絶対値」の和を表し、L2正則化と呼ぶ。
最小二乗法に正則化項を加えたもの、という点ではラッソとリッジは同じ

5.	L1正則化とは
パラメータの絶対値の総和
特定の値をゼロにすることもある（基本的には汎用性を強める）
　　微分不可であり、数値的（厳密ではない）
　　ラッソ

6.	L2正則化
パラメータの二乗の総和
特定の値をゼロにすることはないが、限りなくゼロに近づけることはある（Lassoほど汎用性を強めない）
微分可能であり、解析的（厳密的）
　　リッジ

４．	リッジ回帰とは
正則化の方法。ハイパーパラメータを大きな値に設定することで、重みを限りなく0に近づける

５．	ドロップアウト
過学習が起こる理由の一つに、ノードの数が多いというのがある。
ランダムにノードを削除する
閾値を超えたらノードを削除、というようにする
異なるモデルを学習させる効果と同じ状態を作る

演習（正則化）

過学習発生
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/f7b45275-cae5-3b31-959a-a83b072554a4.png)

L1正則化で過学習抑制
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/b31f666e-749a-f839-3c4e-1f8c889faa4a.png)

抑制度合いを大きくすると、正解率が低くなる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/d26a7fc2-bd3e-8760-6252-47294e011733.png)

ドロップアウトも同様
ドロップアウトを増やすと汎用性は上がるが学習できない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/de01fcbc-36b7-3b44-5454-94ba43344e14.png)

Section 4：CNN

１．CNNとは
	畳み込みニューラルネットワークを含むニューラルネットワーク
	画像認識の分野で使われる。
	入力値→畳み込み層→プーリング層→全結合層→出力値


R-CNN
Regional CNN

関心領域の切り出しを行うところが単純なCNNとは違う。
切り出しを行う際には領域の切り出しを回帰問題と考えることができ、その切り出しのための情報もニューロンの中に含まれる。

FCN
完全畳込みネットワーク
入力画像の画素数だけ出力が必要になる。すなわち各層がそれぞれどのカテゴリーに属するのかを出力する必要がある。


２．畳み込み層
	畳み込み層がないと、データの縦横チャネルの情報がごっそり落ちてしまう
畳み込み層があることで、三次元のチャンネル（縦、横、チャンネルの情報を含んだデータのこと）をそのまま学習し、伝達可能になる。
（つまり各チャンネルの関連性を学習に反映できる⇔普通のニューラルネットは独立してとらえる。）
空間情報も学習できるような層である。
入力値→フィルター（全結合でいう重み）→出力値＋バイアス
→活性化関数→出力値

３．プーリング層とは
	CNNにおいて、フィルタの対象領域の平均値、または最大値を取得する層
	画像をすべて把握する必要がなくなる。（計算の削減）
	画像サイズを決められたルールに従って小さくすること（計算量の削減のため）
例えば特徴アップの最大値を抽出したり（maxプーリング）、平均値を抽出したり（avgプーリング）をする

５．	フィルタとは
カーネルとも呼ばれる
フィルタのようなもので、画像から重みを積算して特徴を抽出する操作のこと


３．パディングとは
フィルターを通すと出力画像と同じサイズにならないとき、入力画像の抜けている部分を平均や０などの固定値を入れることで、出力画像を同じするための工夫。

６．	ストライドとは
配列の何個から何個までを一列とみなすかという定義

７．	チャネルとは
画像データの入力のこと
チャネル数が増える＝入力の画像データが増える

7.	Im2colとは
イメージ ブロックを列行列に再配置（二次元）すること
行列計算に落とし込むことで、多くのライブラリを活用できる

8.	column to imageとは
二次元配列化したものを画像に復元する
二次元にして復元しても、完全に同じなるわけではない（整合性はとれなくなる）

9.	CNNに入れたときの出力画像のサイズを出す公式
OH(高さ) = (入力高さ+2×パディングのサイズ-フィルタの高さ)/ストライド+1
OW(広さ)=上と同じ

Section 5

１．Alex netとは

５層の畳み込み層およびプーリング層、それに続く３層の全結合層から構成される。
全結合層の出力にドロップアウトを使用。
AlexNetとは
層を深くするだけでは計算量が大きくなってしまうので、小さなサイズの畳み込みフィルターを差し込んで、計算量を削減するというもの。
5層の畳み込み層と3つの全結合層からなる全8層のNeural Network
Rectified Linear Unit(ReLU)関数f(x)=max(0, x)f(x)=max(0, x)を採用
全結合の前にドロップアウトをいれる。
AlexNetは6000万個のパラメータを持つため過学習を避けるための工夫
ニューロンの重みを強制的に0にする（dropoutと呼ぶ）ことで過学習を抑制し、よりロバストがモデルができることが経験的に知られている
一部分が見切れていても人間は認識できることから学習画像を認識結果が変わらない程度に加工しデータを増やすことをdata augmentationと呼ぶ
領域の出力の最大値を取るMax pooling

weight_init_std=1 learning_rate, hidden_layer_size=16
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/99bc1749-b30a-8ff5-8f89-328c9629585b.png)

結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453340/4cf34ba9-5e1c-9db0-c6d0-8eb7770cb354.png)



その他

画像のデータを切り取る方法
image[top:bottom, left:right, :]


オーバーフローとは
計算結果が大きい数になり、値を表示できなくなった状態のこと