IT is IT.

空想イノベーション

バッチ正規化で無理やりデータを変形させる

各層に伝わるデータの分布を、重みの初期値を工夫することで、勾配消失の起きにくいアプローチをとることがあるが、もっと直接的な方法も存在する。
バッチ正規化と呼ばれる手法で、各層に伝わってきたデータを、その層でまた正規化してしまう、という手法だ。
これは、各層において、活性化関数をかける前に伝搬してきたデータを正規化するもので、どのように調整すればいいかをネットワークが学習することになる。

スポンサーリンク
 

このバッチ正規化は、学習がうまくいきやすいということと、オーバーフィッティングしにくくなる、というメリットがある。

機械学習における学習”前”の工夫

正規化

入力データを学習する前に、各特徴量間のスケールを調整した方がよいケースがある。
例えば、経済指標を予測する場合、円とドルでは100倍もの差が生じている。
このようなケースでも、事前にスケールを調整し、パラメータの偏りをなくすことで、学習効率も上がる
この、データ全体を調整する処理を、正規化と呼ぶ。

正規化の手法で一番簡単とされているものが、各特徴量を0から1の範囲に変換する処理だ。
これは、各特徴量を、同じ特徴量の最大値で割ることで実現できる。
例えば画像などが、画素値の最大値である255で割ることで、正規化を行う。

標準化

各特徴量の平均を0、分散を1にし、各特徴量の標準正規分布に従うように変換することを標準化と呼ぶ。
機械学習では、入力のそれぞれの特徴量がどのように動いていくか、を見ることになるので、各特徴量の分散をそろえておくことで、それぞの特徴量の動きに対する感度を平等に見ることができるようになる。

スポンサーリンク
 

白色化

各特徴量を無相関化したうえで標準する手法を白色化と呼ぶ。
標準化よりも優れている側面がある一方で、非常に計算コストが高いため、一般的には標準化を用いることが多い。

重みの初期値を工夫する

重みの初期値自体はわからないため、勾配降下法に用いる初期値はランダムに設定せざるをえない。
この初期値はもともと、一様分布、あるいは正規分布に従う乱数が用いられているが、ディープニューラルネットワークではうまくいかないケースが多発した。

そこで、乱数にネットワークの大きさにあわせた適当な係数をかけることで、データの分布が崩れにくい初期値が考案された。
シグモイド関数では、Xavierの初期値が、ReLU関数ではHeの初期値がよいとされている。

ドロップアウトの弱点と克服法

f:id:itry:20190212223601j:plain
ドロップアウトは、オーバーフィッティングを回避するための手法として効果的な手法ではあったが、それでも弱点はある。

それは、訓練データに対しては非常に効果的に最適化されているものの、テストデータに対しては最適化しきれていないため、どうしてもオーバーフィッティングを防ぎきれていない、という状態になってしまう点だ。
これは訓練データを用いて、予測値と実際の値の誤差を最小化する、というアプローチをとっているためだ。

スポンサーリンク

 

そこで、early stoppingという手法が用いられている。
この手法は、テストデータに対する誤差関数の値が上昇を始めたところで学習を止めてしまう、という手法だ。
非常にシンプルな手法ではあるが、どのモデルでも適用できるという点で、非常に有効な手法であるとされている。

ドロップアウトによるオーバーフィッティング対策

訓練データに対して最適化されすぎてしまう、という機械学習における最大の敵ともいえる、オーバーフィッティング。
解決策として、正則化が挙げられることについて、以前記述したことがある。
itisit.hateblo.jp これ以外にも方法はあり、その一つとして、ドロップアウトという手法が挙げられる。

ドロップアウトとは、学習の際に、ランダムにニューロンを強制的に終了させるという手法である。
もともとのネットワークから、学習の繰り返しごとにニューロンを除外することで、毎回形の異なるネットワークで学習を行うことになる。 これは、複数の形の学習を行うことを意味し、形態としてはアンサンブル学習を行なっていることになる。

スポンサーリンク

 

学習するごとに、ランダムにドロップアウトするニューロンを選ぶことで、学習全体でみた場合にパラメータの値が調整される、という仕組みだ。

ニューラルネットワークの「学習」とは何を意味するのか

機械学習では、モデルの予測値と実際の値との誤差をなくすことを目的に、誤差関数を定義し、最小化を行う。
この時の関数の最小化とは、偏微分を表すが、偏微分を求める方法として、勾配降下法が用いられる。

勾配降下法は、勾配(微分値)に沿って降りていくことで解を探索する手法である。
微分は、接線の傾きを表すので、勾配を降りきった部分で傾きがゼロになる部分が、求めるべき点となる。

スポンサーリンク
 

勾配降下法を数式で表すと、以下のようになる。
x^{(k+1)}=x^{(k)}-af'(x^{(k)})
目的のxを求めるために、勾配を降りていき、解を得るために、この数式を繰り返し計算する。

数式上の「k」は、その時点で何回計算を繰り返したかを表す数値で、エポックと呼ばれている。
また、αは学習率と呼ばれ、勾配にそって一度にどれぐらい降りていくか、を表す数値である。
学習率の設定次第で、最適解が得られないこともあるので、この学習率の設定が非常に重要となる。

ニューラルネットワークでは、各パラメータ(重み)に対して勾配降下法を適用することで、最適解を得る。
つまり、ニューラルネットワークの学習とは、勾配降下法を用いて繰り返し計算を行うことを意味する。

ReLU関数の特徴

現在、tanh関数に変わってよく使われているのが、ReLU(Rectified Linear Unit)関数である。
f:id:itry:20190210153858p:plain
ReLU関数ではxが0より大きければ、微分値は常に最大値である1が得られることがわかる。
tanh関数では最大値が1、となるため、このことからも誤差逆伝播の際に勾配が消失しにくいことがわかる。
ReLU関数によって、ディープニューラルネットワーク全体の学習効率が向上したといえる。

ただし、xが0以下の場合は、微分値も0になるため、学習がうまくいかないケースもある、ということに注意しなくてはいけない。

スポンサーリンク
 

また、RuLU関数にはいくつか派生系関数が存在し、その中の一つに、Leaky ReLU関数がある。
Leaky ReLU関数の特徴は、ReLU関数に比べ、わずかな傾きを持っている、ということだ。
この傾きによって、xが0以下の場合においても、微分値が0になることがなくなる。
つまり、理論上は、ReLU関数よりも勾配消失が起きにくい、ということになる。
しかし、実際にはReLUの方が精度がよいケースもあり、どちらが優れているとも決め切ることができない。

さらに、Leaky ReLUの傾きを更に最適化しようとした、Parametric ReLU関数や、複数の傾きをランダムに試すRandmized ReLU関数などもあるが、いずれも、どれが最も優れているか、ということを一概に言うことができない。

シグモイド関数とtanh関数

ディープニューラルネットワークにおいて、隠れ層を増やすと、誤差逆伝播で勾配消失することがわかっている。
これは、活性化関数であるシグモイド関数の微分の最大値に問題があるためだ。

シグモイド関数の微分の最大値は0.25である。
これにより勾配消失が発生してしまう。
隠れ層における活性化関数を工夫、つまり、任意の実数を非線形に変換することはできる関数であれば、シグモイド関数以外のものを使ってもよく、さらに勾配消失の問題に対処できる、ということになる。
ここで、一つ重要なのが、誤差逆伝播を行ううえで、活性化関数が微分できる必要がある、ということだ。
それ以外の制約は特にない。

スポンサーリンク
 

様々な研究の結果、tanh(ハイパボリックタンジェント)関数が、よい結果が得られることがわかった。
f:id:itry:20190209224420p:plain
シグモイド関数での微分の最大値が0.25であったのに対し、tanh関数の微分の最大値は1である。
このことから、勾配が消失しにくいということがわかる。
しかし、シグモイド関数よりも高い精度が出やすい、というだけで、tanh関数もまた、微分の最大値が1であり、1より小さい数になるケースが大半であるため、深いネットワークでは、やはり勾配消失は防ぎきれない、ということになってしまう。