on
Post
- Get link
- X
- Other Apps
これまでに受講したコース1のNeural Networks and Deep Learningに続き、コース2ではImproving Deep Neural Networksと題して、主に次の内容を3週に渡って学びます。 この週はボリューム満点です。
このコースのWeek 3では、下記の4つについて学びます。
これまでに出てきたハイパーパラメーターを挙げると次ようなものがあります。 括弧内の数値は参考値です。
これらを調整する際、調整範囲を決めるとは思いますが、その範囲内を一定間隔で試さなず、ランダムに試して、ある程度領域が絞れて来たらその周辺を中心に粒度を細かくしていくとより良い調整になるでしょう。
また、学習率などパラメーターによっては対数スケールでランダムにする必要もありますので注意しましょう。
はゼロ割を防ぐためのパラメーターなのでほかの値に比べて限りなく小さい値を選択すればよいです。
Week 1で入力データセット に対する正規化は説明しましたが、今回はディープニューラルネットワークの各層において正規化を行います。 正規化の対象は活性化関数の入力 です。
手順としては、各層で次の2つの手順を行います。この手順はミニバッチ処理のときも同じです。
と は重み やバイアス と同様に学習を行うパラメーターであり、ハイパーパラメーターではありません。 や と同様に勾配降下法によって学習します。また、モメンタムやRMSprop、Adam最適化のような最適化も同様に行います。
ミニバッチ処理を行う場合は、 を全体の学習データセットサイズではなく、ミニバッチサイズとして扱えばよいです。
ミニバッチ処理の場合にテストデータセットでテストを行う際には、 学習時に各層における平均 と分散 をミニバッチ処理ごとに指数移動平均を使ってそれぞれ計算しておき、すべての学習データセット終了時の と を使えばよいです。
これまでは二項分類問題しか扱ってきませんでしたが、ここでは多クラス分類問題を扱います。ソフトマックス関数は多クラス分類を行う際に使う活性化関数です。
クラス分類数を としたとき、ソフトマックス関数は次のように表します。
多クラス分類においての損失関数も二項分類のときからわずかに変わります。
損失関数は次のように表します。
これを交差エントロピー (Cross Entropy) と呼びます。
なお、コスト関数は次の通りです。
この講座ではスクラッチでPythonやNumpyライブラリを使って実装します。これは深層学習の理解のために非常に良いことですが、これからは深層学習のフレームワークを使ってより簡単に実装することを覚えていきます。幸いなことに深層学習用のフレームワークはたくさんあります。
フレームワークを選択する際、重要な点として述べられていることは下記の通りです。
ここではWeek 3のPythonでのプログラミング課題で使われるTensorFlowの関数類について簡単に説明していきます。
※ただし、私自身調べながら書いているので間違いがあるかもしれません。
まずTensorFlowの構文を覚える前に、TensorFlowの概念について理解しておいた方がよいと思います。
TensorFlowは、Graph、Tensor、Operation、Sessionという概念が存在します。かなり独特な概念ですので、下記の記事は私的には参考になりました。
ここでは、Week 3で使用するニューラルネットワークのグラフを定義するために使用する構文をいくつか見てきます。なお、ニューラルネットワークのグラフの定義方法はプログラミング課題を見ればわかるため、説明は省略します。
まずはライブラリを読み込みます。もちろんライブラリのインストールをしなければなりませんがここでは省略します。
import tensorflow as tf
TensolFlowで使うすべての定数や変数はTensorFlowのクラスとして定義する必要があります。定数定義の方法は次の通りです。
C = tf.constant({値}, name='{変数名}')
なぜ変数名を定義しなければならないかは名前空間概念を理解する必要があります。 下記の通り記事によると次のように指摘されています。
Neural Networkも層があまり多くないMLP(Multi-Layer Perceptron)等では,名前管理は困りませんが,深いCNNや,RNNで見られる大きなモデルに対しては,重み共有もありますので,きちんとした変数スコープが必要となります.また,スケールアップを考えると(私自信はほとんど経験ありませんが)Multi-Device(GPU),クラスタといった分散環境にコードを適用させなければなりません.ここでも変数スコープが必要となります.
はじめのうちはあまり気にしなくてもよいかもしれませんが、上記のようなDeep Learningを行う予定があるのであれば理解しておいて損はないかと思います。
次に、変数定義は次のように行います。
tf.Variable({式や変数}, dtype={変数型}, name='{変数名}')
tf.Variable
はクラスであり、このオブジェクトを作る方法はもう一つあり、tf.get_variable
を使う方法です。tf.get_variable
は既存の変数を取得するか、新しい変数を作成することができます。また、tf.get_variable
ではイニシャライザーを使うこともでき、次の例ではXavier初期化や、ゼロ初期化を行っています。
W1 = tf.get_variable("W1", [25,12288], initializer = tf.contrib.layers.xavier_initializer(seed = 1))b1 = tf.get_variable("b1", [25,1], initializer = tf.zeros_initializer())
また、TensorFlowにはPlaceholderというものもあり、後からデータセット等を入力する際に使用するデータ領域の確保する際に使用します。
tf.placeholder(tf.{変数型}, {行列の場合のみ行列のサイズ}, {name = '{変数名}')
また、Placeholderを使う際、行列のサイズが決まっていない場合、None
を使用することができます。例えば、学習データセット数など場合によって変更があるようなものに対して、None
を使うことがあります。
四則演算の定義は次のように行います。
tf.add(a, b)tf.subtract(a, b)tf.multify(a, b) # 要素ごとの掛け算tf.divide(a, b) # 要素ごとの割り算
よく利用する行列演算は次の通りです。
tf.matmul(a, b) # 内積tf.transpose(a) # 転置
よく利用する活性化関数は次の通りです。
tf.nn.relu(a)tf.sigmoid(a)tf.nn.softmax(a)
シグモイド関数でのロジスティクス回帰の損失関数とソフトマックス関数での多クラス分類の損失関数は次のように定義ができます。なお、logits
とlabels
はそれぞれシグモイド関数、ソフトマックス関数に対するそれぞれの前段までのニューラルネットワークを経たデータセット (学習データセットそのものではない)と教師データセットです。また、入力する行列の形は、(学習データセット数 、分類クラス数 )ですので注意が必要です。
# Loss function of sigmoidtf.nn.sigmoid_cross_entropy_with_logits(logits = logits, labels = labels)# Loss function of softmaxtf.nn.softmax_cross_entropy_with_logits(logits = logits, labels = labels)
コスト関数の算出はすべての学習セットに渡って損失関数を平均化すればよいですが、平均化する関数としてtf.reduce_mean()
関数があります。これを使って、シグモイド関数、ソフトマックス関数のコスト関数を表すと次の通りになります。
# Cost function of sigmoidcost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits = logits, labels = labels))# Cost function of softmaxcost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels = labels))
最後に最適化手法を定義します。これまで学んできた、勾配降下法、モメンタム法、RMSprop、Adam法は次のように定義できます。
# Gradient descentoptimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(cost)# Momentumoptimizer = tf.train.MomentumOptimizer(learning_rate = learning_rate, momentum = beta).minimize(cost)# RMSpropoptimizer = tf.train.RMSPropOptimizer(learning_rate = learning_rate).minimize(cost)# Adamoptimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(cost)
なお、モメンタム法の実装は公式ドキュメントを見るとWeek 2で習ったものと若干異なるようです。
セッションという所以は、TensorFlowはクライアントとなるPythonプログラムからC++ランタイムを呼びだして実行しており、tf.Session
クラスがクライアントとなるPythonプログラムとC++ランタイムの間のコネクションを提供することからきています。このオブジェクトは、ローカルマシンだけでなく、リモートデバイスへのコネクションも提供できます。
グラフを実行する前に、tf.Variable
のオブジェクトを使う場合には初期化が必要です。オブジェクトの初期化は次の通りです。
init = tf.global_variables_initializer()sess = tf.sesson()sess.run(init)
引き続いて、グラフの実行は下記の通りで実行できます。feed_dict
の引数は、placeholder
で準備した変数に対して、入力を実行時に与えるものですので、下記の例ではニューラルネットワークの学習データセットと教師データセットを入力しています。
_ , minibatch_cost = sess.run([optimizer, cost], feed_dict={X: minibatch_X, Y: minibatch_Y})
Comments
Post a Comment