深層学習day1,2【ラビット・チャレンジ(E資格)】
深層学習day1
Section1:入力層〜中間層
要 点
入力層はニューラルネットワークに何かしらの入力を受け取る層である。また、入力に対して、ある「重み」を混ぜ合わせて変換した結果が入力される層を中間層という。入力と重みはそれぞれ行列で表現することができ、それらの内積を取ることで中間層への入力を計算することが出来る。また、上記の内積計算に「バイアス」という値を加えることも出来る。ニューラルネットワークでは、この「重み」と「バイアス」を学習によって調整していくことになる。
入力層〜中間層は下記のように表現できる。
実装演習結果/サマリーと考察
Section1の講義ではいくつかの練習問題が示されたため、それらの内容について記述することで「サマリーと考察」としたい。
1題目は動物の種類を分類するニューラルネットワークにおいて、何が入力になり得るかという問題である。講義における解答例では「体長」、「体重」、「ひげの本数」などが挙げられていた。解答例以外では、例えば「足の本数」、「手足と胴体の長さの比」などがあるのではと考える。
講義での解答例を下記に示す。
また、入力と重みの内積を計算し、バイアスを加算するPythonコードを示す課題については下記のコードのうち、「#総入力」部分が該当する。
続いて中間層の出力を示すコードの該当箇所は下記のとおりである(#1層、#2層の思想出力部分が該当する。#2層、#3層の総入力は中間層への入力部分になる。)。
関連記事レポート
本講義では動物の部位を入力値とする例を用いて説明されていたが、深層学習では様々な入力値が考えられる。例えば、MNIST等による手書き文字(数字)の識別では、手書きの数字の画像を用いて各ピクセルを入力として学習させている等、学習させたい対象により、様々な入力値が考えられる。
参考HP
Section2:活性化関数
要 点
活性化関数はニューラルネットワークの中間層、出力層で用いられる関数であり、各層の線形な入力(入力と重みの積とバイアス)に対し非線形な出力を行い、ニューラルネットワークの表現幅を広げるものである。活性化関数には下記のものが挙げられる。
【中間層用の活性化関数】
◯ ReLU関数
◯ シグモイド(ロジスティック)関数
◯ ステップ関数
【ステップ関数】
ステップ関数はしきい値を超えたら発火する関数であり出力は1か0のみ。
パーセプトロンで利用された関数であり、線形分離可能なものしか学習できず、現在はあまり使われていない。
ステップ関数の数式とイメージは下記の通り。
【シグモイド関数(ロジスティック関数)】
0〜11の間を緩やかに変化する関数で、ステップ関数とは異なり、信号の強弱を伝えられることから、ニューラルネットワーク普及のきっかけとなった。一方、大きな値では出力の変化が微小なため、そのような場合、勾配消失問題が起きる。
シグモイド関数の数式とイメージは下記の通り。
【ReLU関数】
現在、最も使われている活性化関数である。シグモイド関数で起きる勾配消失問題の回避とスパース化によりニューラルネットワークの性能向上に寄与している。
※勾配消失問題、スパース化については「確率的勾配降下法」の項目で記述
ReLU関数の数式とイメージは下記の通り。
【出力層用の活性化関数】
◯ ソフトマックス関数
◯ 恒等写像
◯ シグモイド関数(ロジスティック関数)
(中間層用の活性化関数と同じ。)
出力層の活性化関数の一覧は下図の通りである。また、回帰問題での誤差関数は二乗誤差、分類問題(二値分類、他クラス分類)では交差エントロピーを用いて計算する。
各誤差関数は下記の通り。
【ソフトマックス関数】
例えば、多値分類を行うアルゴリズムで、出力が確率的に何に分類されるかという問題に使われる。(例えば画像が猫である確率が0.6、犬である確率が0.3、ネズミである確率が0.1であるといった出力が考えられる。)
【恒等写像】
回帰問題で活性化関数として使われる。入力値をそのまま出力するため、計算的な意味はないが、コーディングする際には、何を出力層としているかを明示的に表現するためかと思われる。
【シグモイド関数(ロジスティック関数)】
(中間層と同じであるため略)
実装演習結果/サマリーと考察
活性化関数が用いられている該当箇所のコードを見つける課題があった。
ReLU関数については下記の箇所に当たる。ReLU関数自体は別ファイルからインポートしているため、そちらの該当箇所について他の活性化関数も含めて記載しておく。(複数ヶ所あるが、下記のように表現される。u1を入力としてz1を出力する。)
また、活性化関数は下記のように定義される。
# 中間層の活性化関数
# シグモイド関数(ロジスティック関数)
def sigmoid(x):
return 1/(1 + np.exp(-x))
# ReLU関数
def relu(x):
return np.maximum(0, x)
# ステップ関数(閾値0)
def step_function(x):
return np.where( x > 0, 1, 0)
# 出力層の活性化関数
# ソフトマックス関数
def softmax(x):
if x.ndim == 2:
x = x.T
x = x - np.max(x, axis=0)
y = np.exp(x) / np.sum(np.exp(x), axis=0)
return y.T
# シグモイド関数(ロジスティック関数)は中間層と同じ
# 恒等関数は入力をそのまま出力にしているだけ
考察結果
取り扱う問題によって活性化関数を使い分ける必要があることがよくわかった。また、勾配消失問題等、活性化関数の選択により生じる諸問題については該当する講座で改めて理解を深めていきたい。
関連記事レポート
活性化関数には講義で触れた前述の関数以外にも様々なものが考案されており、例えば下記のようなものがある。
◯ tanh関数
微分の最大値が1であることから、シグモイド関数の課題である誤差逆伝搬法の入力層側で学習が進みづらくなる点が改善される。また、出力が−1〜1であることから中央値が0であることからシグモイド関数よりも収束しやすい。
一方、入力の値が大きい場合に勾配消失が起きる課題は解決されない。
◯ lLeaky ReLU関数
Leaky ReLU関数は、ReLU関数に負の入力値が与えられた場合の勾配消失を防ぐため、x<0の範囲で小さな傾きを持たせた関数だが、あまり効果は無いようである。
本関連記事レポートは下記のHPを参考にした。
Section3:出力層
要 点
【出力層の役割】
例えば、画像の動物が何であるかという多値分類の問題で、動物が何であるかを確率で表す等、解答に適した形で出力する役割(動物が猫である確率は0.6、犬である確率は0.4である等)
【誤差関数】
実際にニューラルネットワークに学習を行わせるために必要な関数である。ニューラルネットワークの出力(動物の分類問題の確率など)と正解(訓練データ:正解の動物)と比較し、その誤差を2乗誤差で計算するものである。講義内で紹介された犬、猫、ねずみの分類問題のイメージ図を下に示す。
(1)は出力と訓練データを比較し誤差を考えるイメージ
(2)は誤差を計算するイメージ
実装演習結果/サマリーと考察
本講義内での課題をもって考察とする。
【誤差関数を計算する際、引き算ではなく2乗する理由】
引き算だけでは、各ラベルでの誤差で正負両方の値が出てしまい、、全体の誤差を正しく表現できない(例えば+1と−1という誤差があった場合、合わせると誤差が無い(0)のように表現されてします。)そのため、2乗してそれらのラベルの誤差が全て正の値になるようにしている。
【1/2を掛ける意味】
1/2自体に特に意味はない。ただ、誤差関数を微分した場合、係数が1になり、計算しやすいという利点があるため、1/2を掛けている。実際にニューラルネットワークに学習させるときに、誤差関数の微分が用いられる。
【実装演習結果】
誤差関数はコーディング上は次のように表現される。ここでyは訓練データ、dは出力結果の値を表している。
loss = functions.mean_squared_error(d, y)
また、本来分類問題では誤差関数にクロスエントロピー誤差を用いるため、
loss = ceoss_entropy_error(d, y)
と表現され使われるが、本講義で詳細な説明はないため割愛する。
考察結果
誤差関数はニューラルネットワークで推論を行った結果と正解データとの比較結果をもとに適切に学習を行わせる上で重要な要素である。ニューラルネットワークでの学習は誤差関数での評価(計算された結果)をもとに適切な重みやバイアスを更新していくためである。誤差関数をもとにどのように、どの程度、重みやバイアスを更新していくかについては、後述の各種勾配降下法によって行われる。
誤差関数には、本講義で取り上げられたもの以外に平均二乗対数誤差(Mean Squared Logarithmic Error)や平均絶対誤差(Mean Absolute Error)などがある。
平均二乗対数誤差は適用したモデルにおいて、予測が実値を上回りやすくなるという傾向があることから、来客人数を予測するようなモデルに用いて、来客数を控え目に予想する際などに用いられる。
また、平均絶対誤差は下記の式で与えられ、外れ値に強いという特徴がある。
参考HP
関連記事レポート
中間層の場合には活性化関数は様々な種類が確認できたが、出力層については講義で紹介された関数以外に顕著なものは見つからなかった(回帰の場合は恒等関数、二値問題ではシグモイド関数、多値分類ではソフトマックス関数を用いれば特に問題ないように感じた。)。
中間層と同じであるが、下記HPを参考に本関連記事レポートを作成した。
Section4:勾配降下法
要 点
勾配降下法は誤差E(w)を最小化するパラメータwを発見することであり、学習を通して誤差を最小化するニューラルネットワークを作成する基本となる手法である。
【出力層の活性化関数】
出力層と中間層の活性化関数の違いは、活性化関数の記事内容と一部重複するが、中間層では、しきい値の前後で信号の強弱を調整する役割であり、•出力層は信号の大きさ(比率)はそのままに変換して出力するものであり、分類問題の場合は出力は0〜1の範囲に限定し総和を1とするソフトマックス関数などが用いられる。こうした理由から、出力層と中間層で利用される活性化関数が異なっている。
【勾配降下法に類する手法】
勾配効果法には3つある。勾配効果法、確率的勾配降下法、ミニバッチ勾配降下法である。勾配降下法はニューラルネットワークの目的である学習を通じて誤差(誤差関数)を最小化するための方法である。
◯ 勾配降下法
◯ 確率的勾配降下法
◯ ミニバッチ勾配降下法
勾配降下法の学習率の決定、収束性向上には以下のアルゴリズムがよく利用されている(細部はDay2のレポートで記載)。
◯ Momentum
◯ AdaGrad
◯ Adadelta
◯ Adam
【確率的勾配降下法のメリット】
勾配降下法では全サンプルの平均誤差を用いて学習するのに対して、確率的勾配降下法ではランダムに抽出したサンプルを用いて学習させることなどから大きく下記の3点のメリットがある。
◯ データが冗⻑な場合の計算コストの軽減
◯ 望まない局所極小解に収束するリスクの軽減
◯ オンライン学習ができる。
学習データが入ってくる度に都度パラメータを更新し、学習を進めていく方法
【ミニバッチ勾配降下法のメリット】
ミニバッチ勾配降下法はランダムで分割したデータの集合(ミニバッチ)に属するサンプルの平均誤差をもとに計算しており、データの中からランダムにサンプルをとり誤差を計算する確率的勾配降下法と似ているが異なる方法である。
このように分割することにより、確率的勾配降下法のメリットを損なわず、PUを利用したスレッド並列化やGPUを利用したSIMD並列化など計算機の計算資源を有効利用することが出来る。
実装演習結果/サマリーと考察
勾配降下法のコードを回答する課題があった。前提として勾配降下法は下図の左側にある通り学習結果wに対し、学習率ηに誤差関数の微分(∇E)を掛けた値を引くことで学習するコンセプトである。ηの値が大きすぎると、誤差関数は最小値にたどり着かず、発散してしまう。逆にηの値が小さすぎると収束するまでに時間がかかったり、大域的な最適解ではなく、極小値で収束してしまうなどの問題がある。(ηの選び方などは以降の講座で触れられる。)
上図の右側の∇Eの計算(誤差勾配の計算)には、数値積分(※)を用いて計算する方法があるが、各パラメータをそれぞれ計算するために、順伝搬の計算を繰り返す必要が有り計算負荷が大きい。その解決のため、後述する逆誤差伝搬法が用いられる。
また、勾配降下法を改良するアルゴリズムとして下記のようなものが考案されている(細部は以降の後述する。)。
◯ Momentum
◯ AdaGrad
◯ Adadelta
◯ Adam
勾配降下法の計算をもとに誤差関数が採用になるように重みwとバイアスbを更新して次の学習の周(エポック)に反映する。
考察結果
勾配降下法はニューラルネットワークの重みを最適な値(誤差が小さくなる値)を計算する方法である。基本的な勾配降下法を改良する手法は複数存在するが、どれが最良というものではなく、対象とする問題に応じて適切な手法を実装するのが、計算量の削減や精度の向上に有効と考えられる。
関連記事レポート
勾配降下法の各手法のメリット、デメリットについて纏められたサイトがあったので紹介する形でレポートとしたい。
例えば、最急降下法のメリットが、①解への到達が早いことが多い、②結果が安定する。デメリットが①メモリの使用量が多い、②局所解にハマりやすい、など各種法について比較する表形式で纏められており、ひと目で理解しやすく参考になるサイトである。
Section5:誤差逆伝播法
要 点
誤差逆伝搬法は、算出した誤差(∇E)を出力層側から順に微分し、、前の層、前の層へと伝搬させる方法であり、最小限の計算で各パラメータでの微分値を解析的に計算手法である。数値積分を用いないため、計算負荷を下げることができる。
誤差(∇E)を誤差逆伝搬法を用いて解析的に計算するイメージである。前の層になるほど、関数の微分が連鎖率(チェインルール)に基づき合成されていることがわかる。
実装演習結果/サマリーと考察
本講義内の確認テストの演習結果を記述する。
【確認テスト】
誤差逆伝搬法では不要な再帰的処理を避けることができる。すでに行った計算結果を保持しているソースコードを抽出せよ。
【回答】
下図でハッチングしている delta2 = functions.d_mean_squared_error(d, y)で計算されたdelta2が、delta1 = np.dot(delta2, W2.T) * functions.d_sigmoid(z1)の計算に含まれており、再帰的処理を避けるため計算結果が保持されている。
考察結果
誤差逆伝搬法を用いることで、無駄な再帰的な計算を避け、最小限の計算で各パラメータでの微分値を解析的に計算することができ、深層学習における重みの更新量を計算することが可能である。
関連記事レポート
誤差逆伝搬法で用いる計算グラフはE資格の計算問題でもよく出題されるようである。その計算例については、下記の参考書の「5章 誤差逆伝搬法」でも具体的な計算例が取り上げられており参考になった。本講座で理論的な部分をおさたうえで、様々な例題を解くことで理解を深めることができると思う。
深層学習day2
Section1:勾配消失問題
要 点
勾配消失問題とは、誤差逆伝搬法が改装に進んでいくに連れて、勾配がどんどん緩やかになってしまうため、勾配降下法による更新では下位層のパラメータがほとんど変わらず、訓練(学習)が最適値に就職しなくなってしまう問題である。
勾配消失の解決方法として以下のアプローチがある。
【活性化関数の選択】
勾配消失問題の回避方法として、活性化関数にReLU関数を用いることが有効
【重みの初期値設定】
重みの初期値設定として、①重みの要素を前の層のノード数の平方根で除算した値を重みの初期値として設定(Xavierの初期値設定、対象とする活性化関数はReLU関数、シグモイド関数、双曲線正接関数)、②重みの要素を前の層のノード数の平方根で除した値に対して√2をかけ合わせた値とする。以上の2点が有効とされる。
【バッチ正規化】
バッチ正規化とはミニバッチ単位で、入力値のデータの偏りを抑制する手法活性化関数に値を渡す前後に、バッチ正規化の処理を孕んだ層を加える手法である。
実装演習結果/サマリーと考察
ここでは、勾配消失問題に対してバッチ正規化を行い学習させた実習成果を記載する。まずは、準備として複数の層を持つニューラルネットワークを作成する。
続いてシグモイド関数を用いて学習させた例を示す。この場合、学習させても正解率は上がらず学習が失敗した例となっている(学習過程は省略するが、正解率が11%程度でそれ以上は上がっていない)。
次にXavierの初期値設定、対象とする活性化関数をシグモイド関数とした場合の例である。この場合は正常に学習が行われ、高い正解率が実現できている。
考察結果
大量の画像データ等を学習させる際、ミニバッチ化することによりコンピュータ(TPU、GPU、CPU)が一度に処理(学習)する量が少なくなり、必要な計算リソース等を小さくする降下が期待できる。この際、Xavierの初期値設定、対象とする活性化関数(ReLU関数、シグモイド関数、双曲線正接関数)を適切に設定することで高い正解率を実現することができる。
Section2:学習律最適化手法
要 点
学習率の決め方とは初期の学習率設定方法の指針・初期の学習率を大きく設定し、徐々に学習率を小さくしていく・パラメータ毎に学習率を可変させる学習率最適化手法を利用して学習率を最適化させる。
【Momentum】
Momentumは、①局所的最適解にはならず、大域的最適解となる。②谷間についてから最も低い位置(最適値)にいくまでの時間が早い、というメリットがある。
【AdaGrad】
AdaGradは勾配の緩やかな斜面に対して、最適値に近づけるメリット有する一方、 学習率が徐々に小さくなるので、鞍点問題を引き起こす事があるというデメリット(課題)がある。
【RMSProp】
RMSPropには、①局所的最適解にはならず、大域的最適解となる。②ハイパーパラメータの調整が必要な場合が少ない、という2つのメリットがある。
【Adam】
Adamは、モメンタムの過去の勾配の指数関数的減衰平均、RMSPropの過去の勾配の2乗の指数関数的減衰平均上記をそれぞれ孕んだ最適化アルゴリズムである。AdamはMomentum、RMSProp両方のメリットを有している。
実装演習結果/サマリーと考察
単純な確率的勾配降下法(SGD)で学習させた場合とMomentumで改良した場合の実装結果を下記に示す。単純なSDGの場合、バッチ正規化なしだと約11%程度、バッチ正規化ありで約72%の学習結果(正解率)であった。一方、Momentumを用いた場合は約93%の高い正解率を実現することが出来た。
考察結果
学習率最適化手法には様々な手法があるが、どれが最善ということはなく、学習させる対象によって最適な方式を模索することが重要と考えられる。
関連記事レポート
下記の参考書の「6章 学習に関するテクニック」では、本講義で説明のあった学習率最適化手法等について、そえぞれの特徴(どのように最適化されていくか)について図示するとともに、上手く収束しない場合の例示がなされており、それぞれのメリット、デメリットについて理解を深めることができた。
Section3:過学習
要 点
過学習とは、テスト誤差と訓練誤差とで学習曲線が乖離することである。
過学習は重みが大きい値をとることで発生することがある。学習させていくと重みにばらつきが生じる。重みが大きい値は学習において重要な値であるが、重みが大きいと過学習が起きてしまう。その解決策として、誤差に対して正則化を加算することで重みを抑制する方法がある。つまり、過学習が起こりそうな重みの大きさ以下で重みをコントロールするとともに、適度に重みの大きさのばらつきを出すことが必要である。
過学習の回避方法として正則化手法がある。正則化手法とはネットワークの自由度(層数、ノード数、パラメータの値等)を制約する手法である。この正則化手法は過学習を防止する上で有用である。正則化手法にはL1、L2正則化、ドロップアウトがある。
【L1、L2正則化】
正則化にはL1ノルムとL2ノルムがある。下の式のように誤差関数に正則化項(p=1のときL1正則化、p=2のときL2正則化)を足すことで過学習の防止を図る。
さらに、L1正則化、L2正則化のイメージを下に示す。右がL1正則化、左がL2正則化のイメージである。L1正則化の場合は最終的にいくつかの重みは0になる、L2正則化の場合は0にはならないが、いくつかの重みが小さい値になる等の特徴がある。
【ドロップアウト】
過学習の回避方法としてドロップアウトもある。ドロップアウトはランダムにノードを削除して学習させることで過学習を防止する手法である。さらにドロップアウトはランダムにノードを削除していることから様々な異なるモデルで学習させていると解釈できることから、モデルの精度向上にも効果がある。
実装演習結果/サマリーと考察/考察結果
過学習が起きると、訓練データを用いた正解率が高くなり、一見優れたモデルが構築できたように思えるが、評価データや実際に推論を行わせるための実データでの正解率が低くなってしまう。つまり、訓練データのみに最適化され汎用性がないモデルとなってします。これらの抑制には本講座で説明された正則化、ドロップアウト等の手法により過学習の回避を図ることが重要である。
ここでは実装演習として、あえて学習データを少なくして学習させ、過学習を起こさせた例を紹介する。
次にドロップアウトにより過学習を回避した例について紹介する。この際、上記のか学習の例と同じく学習データを削除した状態で試行した。ドロップアウトレシオ(ドロップアウトを含める割合)を0.01〜0.1の間で様々に変化させてみたが、それぞれ77%程度の正解率に収束した。
また、ドロップアウトレシオを0.2に設定した場合の例を下記に示す。レシオ(比率)を上げすぎると正解率が大きく下がる失敗例である。
関連記事レポート
過学習を防止する方法としては、「機械学習」の講義で説明のあった「K分割交差検証」を有効な手段として挙げられる。ラビットチャレンジの「機械学習」での説明のほか、下記HP等でもイメージを用いた解説がなされており理解を深める上で有用と考えた。
Section4:畳み込みニューラルネットワークの概念
要 点
畳み込みニューラルネットワークは画像認識等で用いられるディープラーニングの手法である。その一連の流れは入力層(入力画像)から出力層(出力画像)まで下記のような流れで処理がなされる。
代表的な画像識別のアルゴリズムであるLeNetの処理の流れは下記のようになっている。32☓32の画像を入力として畳み込み層とプーリング層で処理され、出力(画像認識、画像は何であるか)がなされる。
畳み込み層では画像(ここでは入力値)に対し、フィルターで何らかの演算を行い出力値とし、バイアスを加算、さらに活性化関数で演算した結果を出力値とする。
畳み込みネットワークのイメージは下記の通り。画像を入力値としたニューラルネットワーク構造であり、確率を出力とするイメージである(本レポートの最初にある犬と猫とネズミを判別する考え方と同じである。)。
畳み込み層でのフィルターでの演算、バイアスを加算する計算例を下記に示す(畳み込み層では、画像の場合、縦、横、チャンネルの3次元のデータをそのまま学習し、次に伝えることができる。)
畳み込み層の演算では、入力データの周囲にパディングと呼ばれる固定のデータを埋め込む場合がある(出力データのサイズを調整するために埋め込む場合がある)。
また、フィルターを適用する位置の間隔をストライドと呼ぶ。
全結合層のデメリットとして、例えば画像の場合、縦、横、チャンネルの3次元データだが、1次元のデータとして処理されてしまい、RGBの各チャンネル間の関連性が、学習に反映されないということが挙げられる。
プーリング層での演算について、フィルタとの演算結果(対象領域)のMaz値または平均値を出力値として扱う。
実装演習結果/サマリーと考察/考察結果
CNNを実装した例について下記に示す。畳み込み演算は下記のコードのうち”simple convolution network class”の中(# レイヤの生成 とコメントがある部分)で行われている。この際、畳み込み演算を高速化させるために"im2col"で2つの入力画像(4☓4)を4☓9の行列に変換する処理を行っている。
Section5:最新のCNN
要 点
最新のCNNの例としてAlexNetが挙げられる。ALexNetでは過学習を防ぐ施策・サイズ4096の全結合層の出力にドロップアウトを使用するという特徴がある。5層の畳み込み層及びプーリング層、3層の全結合層から構成され、ImageNetと呼ばれるデータセットを解くための畳み込みニューラルネットワーク(CNN)である。
サマリーと考察/考察結果
AlexNetは、画像認識のために、初めてCNN(畳み込みニューラルネットワーク)を取り入れたモデルである。画像認識には様々な手法が考案されているがAlexNetは比較的シンプルな構造である一方、画像認識の精度を大きく向上させたモデルと考えられる。
関連記事レポート
先の章で述べた代表的な画像識別のアルゴリズムであるLeNetとAlexNetとの違いについて纏めておきたい。
LeNetとAlexNetは両方とも畳み込み層とプーリング層を重ね、最後に全結合層を経由しており出力を行うものであり、この構造に大きな違いはない。しかし、AlexNetは以下の点がLeNetと異なっている。
◯ 活性化関数にReLU関数を用いている。
◯ LRU(Locl Response Normalization)という局所的正規化を行う層を用いている。
◯ ドロップアウトを使用している。
また、AlexNetは2012年に大きな成果を上げたが、その後はさらに高精度な手法(2014年のGoogLeNet、2015年のResNetなど)が考案されている。これらについては次回のレポートで記載していきたい。
【参考文献】下記文献の「8章 ディープラーニング」