Coursera Deep Learning専門講座の受講メモ (コース1 - Neural Networks and Deep Learning - Week 3)
この記事のまとめ:
- CourseraのDeep Learning専門講座のコース1: Neural Networks and Deep LearningのWeek 3の受講メモとして、要点とよくわからなかったところを補完のために調べたことなどを備忘録としてまとめています。
Week 3の概要
コース1のNeural Networks and Deep Learningコースは次のような4週構成になっており、Week 3は多層ニューラルネットワークに入っていきますが、Week 2が理解できていれば大差ありません。
- Week 1:Deep Learningの前提的な話
- Week 2:ロジスティック回帰、使用する数式表現、Pythonの使い方
- Week 3:隠れ層の少ないニューラルネットワーク、活性化関数、ランダム初期化
- Week 4:隠れ層が多いニューラルネットワーク(=ディープラーニング)
隠れ層の少ないニューラルネットワーク
Week 2では入力層 (Input Layer)と出力層 (Output Layer)だけで構成されたニューラルネットワークを扱っていましたが、Week 3では間に1層の隠れ層 (Hidden Layer)があるニューラルネットワークを扱います。図で表すと次のおりです。
学習方法の流れはWeek 2で行ったものとほとんど同じです。Week 2の内容が理解できていれば、理解はたやすいです。
順伝搬 (Forward Propagation)
入力層から隠れ層への順伝搬は次の通りです。
そして、隠れ層から出力層への順伝搬は次のとおりです。
なお、 は活性化関数を表しています。1層目では 関数を使い、2層目ではシグモイド関数を使用しています。その他の活性化関数として、どのようなものがあるかは最後に説明します。
損失関数
損失関数は、次の通り、基本的にはWeek 2と同じです。これはニューラルネットワークとして隠れ層が増えただけで、二項分類問題を解いているため、基本的な考え方は変わりません。
コスト関数
コスト関数も、次の通り、基本的には同じです。
逆伝搬
Week 2に比べて隠れ層が増えた分だけパラメーターが増えるため、逆伝搬で算出しなければならないパラメーターが増えます。
2層目
まずは2層目の重み行列 、バイアス を求めていきます。
下記のようにパラメーターの更新を行っていきます。
次にそれぞれの微分項を求めていきますが、行列の微分はわかりにくいので、わかりやすさのために損失関数の微分行列の中身から見ていきます。
これを基に、各要素の微分を求めていきます。まずは、連鎖律を用いると下記のように表すことができます。
各偏微分を解いていきます。
これらを連鎖律に従って掛け合わせていきます。
この結果から、損失関数の微分を表す行列に戻ると、次のように表すことができます。
ここで、コスト関数の微分に戻ります。コスト関数はすべての訓練データに対する損失関数の平均ですので次のようになります。
また、 についてはベクトル化ができますのでベクトル化すると次のように表すことができます。
これで一通り2層目の逆伝搬の計算が終わりました。
1層目
次に1層目の重み行列 とバイアス についても同じように解いていきます。
それぞれのパラメーターの更新は下記の通りです。
上式の微分項を解いていきます。まず簡単化のために、2層目の時と同様に損失関数の行列の中身を見ていきます。
各要素の微分を求めていきます。連鎖律を用いると下記のように表すことができます。
と は、すでに求めましたので残りを求めていきます。
これですべての要素が求まりましたので、かけ合わせていきます。
この結果から、損失関数の微分を表す行列に戻ると、次のように表すことができます。
なお、"" は要素ごとの積、またはアダマール積 (Element-wise multiplication/ Hadamard multiplication)であり、"" は要素ごとの累乗、またはアダマールパワー (Element-wise power/ Hadamard power)を表しています。
ここでコスト関数の微分に戻ります。コスト関数はすべての訓練データに対する損失関数の平均ですので1層目では次のようになります。
また、2層目と同様に についてはベクトル化ができますのでベクトル化すると次のように表すことができます。
若干の表記は異なりますが、これでWeek 3の内容と同じ中身になっているはずです。
活性化関数 (Activate Function)
前回のロジスティック回帰においては活性化関数は出力層のみ必要となりましたが、多層ニューラルネットワークにおいては、各層で活性化関数を通過します。
活性化関数として代表的な関数を次節で説明します。基本的にどれがいいというのはあまりなく、アプリケーションによって最適なものをテストしたほうがよいようです。
また、活性化関数は必ず非線形関数を用います。線形関数を用いた場合、隠れ層が計算で解けるため、隠れ層がないニューラルネットワークと等価になってしまいます。
なお、Week 3では隠れ層の活性化関数として、tanh関数を出力層の活性化関数として、シグモイド関数 (Sigmoid Function)を使用します。
シグモイド関数
シグモイド関数はロジスティクス回帰の出力層に用いられます。ロジスティクス回帰のように二項分類問題を扱う場合は、 であるからして、 であることが直感的に望ましいです。逆に言うとそれ以外でシグモイド関数を使うことはほぼありません。
双曲線 (tanh) 関数
双曲線関数は隠れ層などに使います。シグモイド関数を の範囲にシフトしたバージョンといえます。
ReLU (Rectified Linear Unit)関数
シグモイド関数や双曲線関数は、 が大きい場合には の値が変わらず、学習が遅いという欠点がありました。そのため、最近ではReLU関数がよく使われます。また、計算が簡単で処理が早いというのも特徴です。
Leaky ReLU関数
が負数の場合にも学習をさせたい場合に、ReLUに代わってLeaky ReLU関数が使われることがあります。
は、のような数値を入れるケースが多いようです。
今回は以上です。 最後まで読んでいただき、ありがとうございます。
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
コメント
コメントを投稿