深層学習前編 要点まとめ - s-manabe2/DeepLearningForEngeneerJUDACertificate GitHub Wiki
深層学習Day1
Section1:入力層〜中間層
- 入力層
- NNにデータを入力する部分。
- 数字を受け取るそれぞれの部分をノートという。
- 重みW
- 各々の入力値をどのくらい使うかを表わす
- 入力x、重みwもそれぞれ行列で表すことができる。
- バイアス
- 入力全体の値を底上げする場合(オフセットをつける)場合に用いる。
- 中間層
- 中間層への入力はいい感じに入力と重みを掛け合わせたもの
u = Wx + b
で表せる
Section2:活性化関数
-
重みとバイアスは線形だが、活性化関数に非線形な関数を持たすことにより、よりバラエティーのある表現ができるようになる。
-
中間層用の活性化関数
- ReLU:勾配消失問題が起きない。また、スパース可に貢献する。もっともよく使用されている。
- シグモイド関数:微分ができるので広くつかわれるようになった。ただし、勾配消失問題を起こす。
- ステップ関数:今は使われない。線形分離可能なものしか学習できない。
-
出力層用の活性化関数
- ソフトマックス関数
- 恒等写像
- シグモイド関数
Section3:出力層
-
誤差関数
- 出力層の出力と訓練データの差(誤差)を計算する
- 残差平方和 E(w)= 1/2 Σ(y-d)^2
- 本来は分類問題の場合は誤差関数にクロスエントロピー誤差を用いる。loss = cross_entropy_error(d,y)
-
出力層の活性化関数
- 値の強弱:信号の比率はそのままに変換 * 確率出力:分類問題の場合は、出力層の出力は0~1の範囲で総和が1となるような関数
-
出力層用の活性化関数
- ソフトマックス関数:多クラス分類に使用
- 恒等写像:回帰問題に使う。何もしない関数。
- シグモイド関数:二値分類に使う。
-
出力層用の誤差関数
- 二乗誤差:回帰問題
- 交差エントロピー:分類問題(二値・多クラス分類)
Section4:勾配降下法
- 深層学習の目的=誤差Eを最小にするパラメータwを探すこと。
- 勾配降下法を利用してパラメータを最適化する。
- ε:学習率
- 学習率が大きいと発散する
- 学習率が小さいと
- 失敗することは少ないが、収束するまでに時間がかかる。
- 極小解にたどり着いてしまう場合がある。
- いろいろなアルゴリズムがある * Momentum * AdaGrad * Adadelta * Adam ・・・これが一番利用されている
- エポック
- 誤差関数の値をより小さくする方向に重みW及びバイアスbを更新し、次の周(エポック)に反映
確率的勾配降下法(SGD)
- ランダムに抽出したサンプルの誤差
- メリット
- データが冗長な場合の計算コストの軽減
- 望まない局所極小解に収束するリスクが軽減
- オンライン学習ができる
ミニバッチ勾配降下法
- ミニバッチ勾配降下法
- ランダムに分割したデータの集合(ミニバッチ)にぞくするサンプルの平均誤差
- 一般的に使われている方法
- メリット
- 確率的勾配降下法のメリットを損なわず、計算資源を有効利用できる。⇒ スレッド並列化やGPUを利用した並列化計算(SIMD Single Instruction Multi Date)できる。
誤差勾配の計算
- 誤差勾配delta Eの計算方法:数値微分であるが、計算量が大きく負荷が大きい → 誤差逆伝播法を利用する。
Section5:誤差逆伝播法
- 誤差逆伝播法
- 算出されて誤差を出力側から順に微分し、前の層、前の層へと伝播する。最小限の計算で各パラメータでの微分値を解析的に計算する手法。
- 計算結果(=誤差)から微分を逆算することで、不要な再帰的計算を避けて微分を算出できる。
- 数値微分では計算量が多いという欠点を補う方法である。
深層学習Day2
Section1:勾配消失問題
活性化関数
- ReLU関数
- 勾配消失問題の回避とスパース化に貢献して良い成果をだしている。
- 今もっとも使われている活性化関数
初期値の設定方法
- Wの初期化に乱数を用いる。
- 重みは色々な個性を用いた方が学習が進む。いろんな見方ができる。
- Xavier(ザビエル): 初期化値 標準正規分布をもった乱数について、重みの要素を前の層のノード数の平方根で除算した値
- 標準正規分布で重みを正規化すると、各レイヤーの出力は0か1に偏る。シグモイド関数の微分をみればわかるように、0や1の時の微分値はほとんど0になる。そのため、誤差逆伝播によるパラメータの更新が行われなくなり、勾配消失が起こる。
- いい感じに重みの初期化をするのがXavier。S字カーブになっている活性化関数にはXavierがよい。
- ReLU関数の場合は、He(ヒィ)がよい。標準正規分布をもった乱数について、重みの要素を前の層のノード数の平方根で除算した値に対し ルート2を掛けた値。
バッチ正規化
- バッチ正規化とは:ミニバッチ単位で入力値のデータの偏りを抑制する方法
* スムーズに学習が進むので、学習時間が早まる。
- 過学習が抑えられる。
Section2:学習率最適化手法(optimizer)
学習率ε
- 学習率が大きすぎると、最適値にいつまでもたどり着かず発散する。
- 学習率が小さすぎると、収束するまでに時間がかかる。大域局所最適値に収束しづらくなる。
学習率最適化手法
モメンタム
- 誤差をパラメータで微分したものと学習率の積を減算したあと、現在の重みに前回の重みを減算したと慣性の積を加算する
- メリット:局所最適解にならず、大域的最適解になる。谷間についてからもっとも低い位置にたどり着くまでの時間が早い。
- 勾配降下法はジグザグに動くが、モメンタムは移動平均のように動作するので、なめらかに動く
AdaGrad
- 誤差をパラメータで微分したものと再定義した学習率の積を減算する。
- メリット:勾配の緩やかな斜面に対して、最適値に近づける * 課題:学習率が徐々に小さくなるので、鞍点問題を引き起こすことがあった。
RMSProp
- 誤差をパラメータで微分したものと再定義した学習率の積を減算する。
- AdaGadの進化系
- メリット:局所的最適解にならず、大域的最適解となる。ハイパーパラメータの調整が必要な場合が少ない。
Adam
- 一般的に一番よく使用されている。
- モメンタムの過去の勾配の指数関数的減衰平均、RMSPropの過去の勾配の2乗の指数関数的減衰平均、それぞれのメリットを備えたアルゴリズム。
- 鞍点を抜ける能力が高い。
Section3:過学習
正規化:ネットワークの自由度(層数、ノード数、パラメータの値etc..)を制約すること。正規化手法を利用して過学習を抑制する。 過学習の原因:重みが大きい値をとることで、過学習が発生することがある。 過学習の解決策:誤差に対して正則化項を加算することで重みを抑制する。→過学習がおこりそうな重みの大きさ以下で重みをコントロールし、かつ重みの大きさにバラつきを出す必要がある。
L1正規化
- ラッソ回帰
- p1ノルムマンハッタン距離
- スパース
- 角があるので、角の上にすいよせられる。ReLU関数で重みが0になり。スパース化に貢献。
L2正規化
- リッジ回帰
- p2ノルム:ユークリッド距離。
- スパースでない。
- 正則化項はすり鉢状
ドロップアウト
- 過学習の課題:ノードの数が多い
- ドロップアウトとは?
- ランダムにノードを削除して学習させること
- メリット:データ量を変化させずに異なるモデルを学習させてい
Section4:畳み込みニューラルネットワークの概念
畳み込み層
バイアス
- 畳み込み演算したあとにバイアス項の数値を出力画像に加える
パディング
- 畳み込み演算をすると出力画像が小さくなる。それをさけるためにフィルタを通す前に外縁にパディングを入れる。近傍の値をいれることが多い
ストライド
- 畳み込み演算の際のフィルタをずらす幅、ステップのこと。ストライド1なら1ピクセルずつずらして畳み込みを行う。
チャンネル
- フィルターの数をチャンネルという
プーリング層
- Max Pooling:フィルタ内の最大値を使う
- Avg. Pooling:フィルタ内の平均値を使う
Section5:最新のCNN
AlexNet
- 初期のCNN
- 5層の畳み込み層及びプーリング層など、それに続く3層の全結合層から構成される。
- Fratten:初期のCNNでよくつかわれていた。
- Global max poolingやGlobal avr poolingはFrattenよりも情報量はすくないがなぜか上手く機能する。
- 過学習を抑制するために、サイズ4096の全結合層の出力にドロップアウトを使用。