見出し画像

G検定試験忘備録④(ディープラーニングとニューラルネットワークの概要)

初めまして、みずぺーといいます。
このnoteを機に初めて私を知った方のために、箇条書きで自己紹介を記述します。

  • 年齢:28歳

  • 出身:長崎

  • 大学:中堅国立大学

  • 専門:河川、河川計画、河道計画、河川環境

  • 転職回数:1回(建設(2年9か月)→IT系年収100万up(現職3か月))

  • IT系の資格:R5.4基本情報技術者試験合格💮

今日はG検定に向けた語彙を忘れぬうちにアウトプットしておく。

ディープラーニングとニューラルネットワークを今日はインプットします。

ディープラーニングとニューラルネットワーク

単純パーセプトロン

隠れ層がないモデル。線形分類しか扱うことができない

多層パーセプトロン

隠れ層を導入することによって非線形分類も扱うことが可能になった。

ディープラーニング

ディープラーニング=隠れ層が多数のニューラルネットワーク

ニューラルネットワークは誤差を逆伝搬させることによって分類を行っていたが、誤差が消失する問題が挙げられた。

事前学習によるアプローチ

  • ディープニューラルネットワークは一気に学習

  • 事前学習は逐次入力層から隠れ層へ向けて学習

事前学習の分類の例(積層オートエンコーダ)

事前学習の一つの例である積層オートエンコーダにおける分類では出力層(ロジスティック回帰層)に

  • 2値分類:sigmoid関数(ある値に対して全体の割合を計算)

  • 多値分類:softmax関数(それぞれの値に対して全体の割合を計算)

を適用しラベル分類を可能にする。

ファインチューニング

隠れ層から出力層の仕上げ段階

積層オートエンコーダ=事前学習+ファインチューニング

活性化関数

出力を確率で表現するために必要な関数。

sigmoid関数

2値分類に用いられる。[0,1]の範囲の1つの値に変換する。

sofrmax関数

それぞれの値に対して全体の割合を計算。多値分類に適用できる。

tanh関数

tanh関数では微分の最大値が1になるように調整を行っている。
sigmoid関数の強化版。だが勾配消失問題の根本的な解決には至ってない。

ReLU関数

tanh関数よりも勾配消失問題に対処できるのがReLU関数

tanh関数はピーク時だけ最大値が1を取っていた。
ReLU関数はxが0以上であれば常に1

出力層:回帰問題では恒等関数が、分類問題ではソフトマックス関数が使用
隠れ層:シグモイド関数やReLU関数が使用

学習率の最適化

勾配降下法

機械学習が目指しているところは「モデルの予測値と、実際の値との誤差をなくすこと」でそれを数学的にどう表現するのか。

数学的には誤差関数を定義し、これを最小化する問題として定義=関数の最小化問題

具体的にはそれぞれの層の重みで誤差関数を微分した値がゼロになるような重みを求めればよい

この時にアルゴリズムを用いて最適解を探索するというアプローチのことを勾配降下法という

勾配降下法の問題

x(更新後) = x(更新前)ー(学習率)✖︎(x(更新前)における勾配)

見せかけの最適解=局所最適解
本当の最適解=大域最適解

それを避けるために、学習率を大きくする

勾配降下法の例①:確率的勾配降下法(SGD)

オンライン学習(ひとつづつ逐次的に用いて学習する手法)もしくはミニバッチ学習(いくつかのデータのまとまりを逐次的に用いて学習する手法)を適用したもの

SGDでパラメータは学習率をかけてパラメータから引くことで更新する。

SGDの工夫点

  • モーメンタム:パラメータの更新に慣性的な性質を持たせ、勾配の方向に減速・加速したり、摩擦抵抗によって減速したりしていくようにパラメータを更新していく

  • RMSProp:

勾配降下法の最適化手法

SGD

手動で学習率を決めて全てのパラメータに対して同じ値を用いる

SGDではダメだったからモーメンタムを導入する手法の開発

SGDに慣性的な性質を持たせたもの

モーメンタムの改良の歴史

AdaGrad(手動から自動へ)→RMSProp(学習ステップの改善)→Adam(RMS改良したもので2014年発表)→AMSGrad(2乗勾配を利用した学習率のバランス)→AdaBound(学習の小ささを考慮(Adamに対応))→AMSBound(学習の小ささを考慮(AMSGradに対応))

AdaGrad

勾配降下法においてパラメータ毎の学習率を勾配を用いて自動で更新する

RMSProp

AdaGradの学習ステップが進んでいくとすぐに学習が更新されなくなってしまう問題を解決したもの

Adam

RMSPropのいくつかの問題点をさらに改良したもので2014年発表

AdamやRMSPropの自動更新では学習率は重要でない勾配を大きく、重要な勾配を小さく評価

AMSGrad

Adamの学習率が大きくなりすぎることがある問題を解決した手法

AdaBound

Adamの学習率が大きくなりすぎることや小さくなりすぎるを解決した手法

AMSBound

AMSGradに対してAdaBoundと同じ手法を適応させた手法

ハイパーパラメータチューニング

3つのサーチ方法が考えられる。

グリッドサーチ

最適な学習率などのハイパーパラメータの最適な組み合わせを全通り選択肢して探索するものを使用したりする。

ランダムサーチ

ハイパーパラメータの組み合わせをランダムに選択する探索方法。

ベイズ最適化

結果が良かったハイパーパラメータの組み合わせに似た組み合わせをランダムに探索

しかし3次元以上では鞍点が発生する。

鞍点とはある次元から見れば極小ではあるが、別次元から見ると極大になっているところの点。

そのためディープラーニングでは
どの方向に沿って勾配が進んでいるときに学習率を大きく(あるいは小さく)すべきかを考える必要がある

鞍点問題への対処

Adagrad、Adadelta、RMSprop、Adam、AdaBound、AMSBound等の手法がによってどの方向に学習を加速させればいいのかがわかる

さらなるテクニック

二重降下現象

モデルのパラメータ数や学習のエポック数が増えるごとに学習結果のエラーが二度降下する現象

原因はまだわかっていないという。

二重降下現象(エポック数を固定)

ドロップアウト

活性化関数や学習率を利用することで勾配消失問題や鞍点問題を回避しやすくなったが、最大の問題は過学習

ニューロンを毎回ランダムに除外することにより毎回異なるネットワークで学習を行わせる

つまりドロップアウトはアンサンブル学習を行っている

早期終了(early stopping)

テストデータの誤差関数が上がり始めたところで学習を打ち切る。
これは簡単に言っているが、タイミングを見出すには少しコツが必要になる。

この手法をニューラルネットワークに適応するいい点としてはどんな形状のネットワーク学習においても容易に適応できる

early stopping

バッチ正規化

各層において活性化関数を変える前に伝搬してきたデータを正規化する処理

※正規化とはデータに含まれる各特徴量の値を全て[0,1]範囲に収まるようにする処理のこと
最小値最大値が決まっている場合には正規化を利用する

正規化して伝わってきたものをさらに正規化して入力とする。

毎回の層で正規化を繰り返す。

バッチ正規化の処理

標準化

標準化は任意の分布を平均0、分散1に変形する操作

標準化したデータ=(元のデーター平均)/ 分散

一般的に標準化を用いる場合は、最大値及び最小値が決まっていない場合や外れ値が存在する場合に利用

データの白色化

データを無相関化してから標準化を行う。
例えば天候に関するデータ(雲の量、気温、紫外線量)などが集まったとすれば、明らかにデータの各成分は何らかの関係性を持っている。

新しい指標1=A×雲の量+B×気温
新しい指標2=C×雲の量+D×紫外線量

これらの指標は何らかの来場者数に関係があるかもしれない指標になる可能性もある。

このようなデータの相関があった場合

相関関係

無相関化を行い

無相関化

データの標準化を行う

0~1の範囲に抑える

このようなことを用いた事例として画像の前処理がある。

元画像(引用:https://sakataharumi.hatenablog.jp/entry/2016/10/18/20161018020000/)
白色化(引用:https://sakataharumi.hatenablog.jp/entry/2016/10/18/20161018020000/)

何がいいかって、局所的な特徴を際立てせることができること。

画像で局所的な特徴をもとに学習を行う場合には適用可能であると思われる。

重みの初期化

活性化関数を通した後の値に適度なばらつきを持たせたいということが目的。ばらつきを持たせないと、ある勾配消失問題が発生してしまう可能性がある。

各層で使用している活性化関数がシグモイド関数やtanh関数の場合はノードの初期値としてXavierの初期値

ReLU関数を活性化函数として用いた場合Heの初期値を用いるのが良い

制限付きボルツマンマシン

二層のニューラルネットワークであり、深層信念ネットワークと呼ばれる

ハードウェア

CUDA(Compute Unified Device Architecture)

NVIDIA社が開発したGPUプログラム開発環境。
CUDAを使用することでC言語のようなプログラムを記述してGPUの複数の演算器を利用した高速な並列演算処理を行うことが可能となる。

GPGPU(General Purpose computing on GPU)

GPUの高い並列計算処理力を本来の用途である画像処理以外のタスクに応用すること。またはその技術

TPU(Tensor Processing Unit)

Google社が開発したディープラーニングの学習・推論に最適化されており、タスクによってGPUの数十倍のパフォーマンスを引き出すことが可能なサービス

この記事が気に入ったらサポートをしてみませんか?