Coursera Deep Learning専門講座の受講メモ (コース2 - Improving Deep Neural Networks - Week 1)
訓練データ
この記事のまとめ:
- CourseraのDeep Learning専門講座のコース2: Improving Deep Neural NetworksのWeek 1の受講メモとして、要点とよくわからなかったところを補完のために調べたことをまとめています。
コース2:Improving Deep Neural Networksについて
これまでに受講したコース1のNeural Networks and Deep Learningに続き、コース2ではImproving Deep Neural Networksと題して、主に次の内容を3週に渡って学びます。
Week 1の概要
この講座のWeek 1では、Deep Neural Networkを行うときに、性能を向上させる方法や高速化させる手法について学びます。
データセットの使い方
まず基本的な話ですが、入力データセットにおいて、どの程度の割合でTraining/Dev/Testデータに分ければいいかという話から行います。
※Devデータに対応する一般的に使われる日本語が見当たらなかったため、ここでは訓練データをTrainingデータ、検証データをTestデータとあえて言います。
そもそもあまりDevデータについて、説明がありませんでしたが、Devデータはハイパーパラメーターの調整のために使うデータセットで、Testデータは最終的な結果の判断用と明確に分ける場合があります。
入力データセットのうち、従来は6割をTrainingデータ、4割をTestデータなどに利用しましょうと一般的に言われていますが、これはデータセットが1万個とかその程度の規模のときにその指標に当てはめてやるとよかったのですが、近年では100万個のデータセットなど非常に多くのデータセットがある場合には、この慣例に当てはめる必要はなく、Testデータの割合は1%程度とか、5%程度とかそういった数でも十分に性能を測るには十分です。
性能向上のレシピ
それでは、実際にDeep Neural Networkを実装したものの、性能があまりでない場合にどのような対策を行うべきかについて述べていきます。
学習用データセットとテスト用データセットでコスト関数を評価したときにどのような振る舞いになっているかを見てみます。
その際に、課題とそれらの対策案は次の通りです。
高バイアス(アンダーフィッティング) → 層を増やす
高分散(オーバーフィッティング) → データを増やす or 正則化 (Regularization)
正則化 (Regularization)
過学習 (オーバーフィッティング)は、隠れ層の数が多いときや、ニューロンの数が多いときなど自由度が高いときに起こりやすく、重みが大きな値を取ることで発生していることが多いです。
正則化は、大きな重みを取らないようにするための手法で、コスト関数 に重みの大きさを加えてやります。つまり、重みの値が大きくなるとコスト関数も大きくなってしまうため、重みを小さくするように働きます。重みの大きさとして、L1ノルムを使う場合や、L2ノルムを行う場合などありますが、ここではL2ノルムを使う、L2正則化について取り上げます。
L2正則化
L2正則化を行う場合のコスト関数 は正則化の項として、重み のフロベニウスノルム (Frobenius norm)を追加します。
また、重みの更新式は次のように表せます。
このように重みを小さくさせるように作用するため、「重み減衰」(Weight Decay)とも呼ばれます。
なお、フロベニウスノルムは、行列のL2ノルムのことをいい、ベクトル場合にはL2ノルムということに対して、行列の場合にはL2ノルムといわずにフロベニウスノルムといいます。数式では と表現します。
また、 はハイパーパラメーターで、一般的に0.01~0.00001程度の値を使うようです。
ドロップアウト (Inverted Dropout)
正則化と同じく、過学習時に使われる他の手法として、ドロップアウトがあります。
ドロップアウトは学習時に各層のニューロンの一部をランダムに使わないようにする手法です。これは正則化とよく似た効果をもたらします。
ランダムに一部のニューロンを使わないようにするため、学習の過程において特定のニューロンからの入力に頼らない作用をもたらし、別のニューロンからの入力の重みに分散させることになります。これがL2正則化と同じ作用をもたらす理由です。なお、入力を減らすことを意味しますので、ドロップしないニューロンからの入力はドロップ率でスケーリングして入力の大きさ自体は変えないようにします。
ドロップアウトを有効的に使う方法は、ニューロンの数が多い層でのドロップ率を高めることです。なぜならば、先に述べた通り自由度が高いことで過訓練が起こりやすいからです。
その他の正則化手法
データを増やす 例えば画像認識をする場合には、元の1枚の写真データを水平反転したり、回転させたり、ランダムな歪みを加えたりすることで訓練データを増やすことができます。
Early Stopping コスト関数と試行回数の関係を見た時に一定の試行回数まではコスト関数が下がるものの、それ以降過学習が起こりコスト関数が劣化する場合、コスト関数の最小値の試行回数で学習をやめることで過学習をさせないようにすることができます。
収束の高速化
正規化 (Normalization)
入力データセットが多次元の場合に、各次元の平均と分散を正規化することで、収束の高速化が見込めます。これは学習時のコスト関数の振動を防げるためです。
正規化は次のように、元の入力データセットの各次元の平均 と分散 で更新すればよいです。
初期化 (Initialization)
重み の初期値と最適な値がこれまで様々な研究が行われてきており、それらの研究に基づいた最適な値を入力することで収束の高速化が見込めます。
活性化関数としてReLU関数を使う場合
活性化関数としてtanh関数を使う場合(Xavier初期化という)
別バージョンのXavier初期化
今回は以上です。 最後まで読んでいただき、ありがとうございます。
CourseraのDeep Learning専門講座の他のコースの受講メモ
- コース1: Neural Networks and Deep Learning
- コース2: Improving Deep Neural networks
- コース3: Structuring Machine Learning Projects
- コース4: Convolutional Neural Network
- コース5: Sequence Models
コメント
コメントを投稿