More Related Content
Similar to ディープラーニング基礎.pptx
Similar to ディープラーニング基礎.pptx (20)
ディープラーニング基礎.pptx
- 38. CNN
• Convolutional Neural Network
畳み込みニューラルネットワーク。
画像認識、音声認識、自然言語処理では必ずといっていいほ
ど使われている。
従来のネットワークに加え、以下層を使っているのが特徴。
Convolution層(畳み込み層)
Pooling層(プーリング層)
- 55. 活性化関数の使い分け
• 画像データはReluと相性が良い
画像データにはそもそもマイナスの値がない(0~255)
なので、画像処理してマイナスのデータになったものは「ノイズ」だ
から切り捨てる・・というのは理にかなっている
• マイナスのデータがはいっているデータはsigmoid
何かの測定値(気温とか)はマイナスのデータが入っていることがあ
る。その場合、マイナスを切り落とすと無茶苦茶になってしまうので
sigmoidを使う
• sigmoidには大きな範囲の数値データをかけてはいけない
大きな数字は1か0になってしまう。こうなると元のデータの特徴は消
え失せ、ほとんどが同じデータのように加工されてしまう
そのため、極力0~1.0の範囲に収まるように正規化されたデータを入
力とする必要がある
Editor's Notes
- 今回は入社してちょうど一年の良い区切りなので、自分のDeepLearningの基礎を再度固めるのと、
コグニティブ以外の皆さんにもディープラーニングの仕組みをざっくりと理解してほしいと思ったので、
今回はこのテーマで進めさせていただきます。
- ディープラーニングの土台となっているパーセプトロンから、ニューラルネットワークの学習の仕組み、
CNNというネットワークの説明、最近のディープラーニングを少し紹介するという流れでやっていきます。
- まずはディープラーニングを理解する上で必須となるパーセプトロンから説明してきます。
パーセプトロンは、人間の神経細胞を模したもので、ある入力があって、それに対して必ず0か1が出力されるというものです。
図の〇はノードやニューロンと呼ばれています。
xは入力、yは出力、wは重みといって入力信号の重要度を表すもの、bはバイアスといってニューロンの発火のしやすさを調整する閾値です。
入力信号に対してそれぞれ固有の重みが乗算して加算して、バイアスを加算し、その総和が0を超えたときにだけ1が出力されます。(ニューロンが発火すると表現されます)
このように、入力の値があってそれに対して0か1を出力する仕組みを使って、様々な数式処理や人間の脳の仕組みをシミュレーションしようという目的でパーセプトロンが作られました。
- ではパーセプトロンを使って簡単な問題を考えていきましょう。
今から論理回路をパーセプトロンで実装していきます。
論理回路は、x1とx2の入力を受け取り、0か1を返すものです。
AND, OR, NAND, XORの4つを実装していきます。
- ANDゲートをpythonで実装すると、このようになります。
x1, x2を引数として受け取り、重みをかけて、バイアスを足して総和を計算し、最後に0以下であれば0を、それ以外であれば1を出力します。
例えば0, 0が入ってきたら、重みの総和が0になり、バイアスを足すので-0.7となり、0以下なので0を返します。
1, 0が入ってきたら、重みの総和は0.5で、バイアス足して-0.2になり、0以下なので0を返します。
0, 1も同じです。
1, 1が入ってきたら、重みの総和は1で、バイアスを足すと0.3になり、これは0より大きいので1を返します。
このようにパーセプトロンでAND回路を実装できました。
ここで重要なポイントとしては、重みとバイアスの値を、先ほどの真理値表を満たすように私たちが決めていることです。
この組み合わせは無限にあります。例えばbは-0.9でも-0.8でもANDゲートの条件を満たします。
- ORゲートですが、ANDゲートと変えたのはバイアスだけで、-0.7から-0.2にしています。
- つまり重みとバイアスを調整することで出力値を変えることができるということです。
- では次にXORゲートをみていきます。
実はXORゲートはパーセプトロンでは表現することができません。
ANDは1,1のときだけ1になってあとは0になるので、このように一本の線で区切ることができます。
対してXORは、入力同士が異なった値の場合に1になり、同じ場合は0になるので、図としてはこのようになり、
これはどう頑張っても1本の線で分けることができません。
XORゲートを分類するためには、この図のように非線形で表現する必要があります。
しかし単層のパーセプトロンは線形表現しかできないので、XORゲートを実装できません。
どうしましょうか?
- まずはpythonで実装してみましょう。
このように、AND, OR, NANDを組み合わせることで、XORを実装することができます。
中身の詳細は基本情報でやっていると思うので省きます。
- 実装した結果をパーセプトロンの図で表すと、このようになります。
先ほどと違うのは、入力層と出力層の間に中間層と呼ばれる層が1つ増えていることです。
このように層を複数重ねたパーセプトロンを多層パーセプトロンと呼びます。
単層のパーセプトロンでは実現できなかったことでも、層を重ねることでより柔軟な表現(非線形の表現)が可能であるということになります。
- ここまでまとめます。
パーセプトロンは1つの分類器といえます。
例えばAND分類器は、0,0のときは0、1,1のときは1と分類する。
そのようにいい感じに分類するために、パーセプトロンでは、重みとバイアスをパラメータとして設定し、人の手で調節する。
また、単層のパーセプトロンでは線形表現しかできないのに対し、多層にすることで非線形を表現できるようになります。
- 続いてニューラルネットワークについて説明します。
パーセプトロンの課題として、重みやバイアスというパラメータを人の手で設定する必要がありました。
ニューラルネットワークはその課題の解決のために開発され、重みとバイアスを自動で学習できるのがニューラルネットワークの特徴となります。
また、パーセプトロンとニューラルネットワークの違いとして、活性化関数にステップ関数以外の関数を利用しているというのがあります。
これからその点について説明していきます。
- 活性化関数とはどのようなものであるか説明をしていきます。
活性化関数は入力信号との総和を出力信号に変換する関数のことで、
先ほどのANDゲートの例でいうと、この部分のように、総和が0以下だったら0を、それ以外であれば1を出力する部分のことをいいます。
- これを図で表すと、
3つの入力があり、まずはこの総和をaとして求めます。
そしてそれを0か1になるように調整を行い、yを出力する関数h()を考えます。
このように総和した結果を変換する関数を、活性化関数と呼びます。
- 活性化関数はいくつか種類があります。
まずは論理回路の実装で使われていたステップ関数があります。
横軸が入力信号、縦軸が出力信号とすると、入力信号が0以下だと0を、0より大きければ1を出力するような関数です。
しかしこのステップ関数を使っていると、ニューラルネットワークの精度が中々上がらないという問題がありました。
- そこで、ステップ関数に代わってシグモイド関数が開発されました。
xが0のところで0.5を通って、xが大きくなると1に近づき、xが小さくなると0に近づくようなS字カーブを描く関数です。
このような関数を使うと、ニューラルネットワークの精度が上がることが分かりました。
- さらに、最近のディープラーニングでは、シグモイド関数に代わってReLU関数が使われています。
xが0より小さければ0で、0より大きければxの値をそのまま出力するという関数です。
- 次にソフトマックス関数ですが、これは多クラス分類を行う場合、出力層、つまりニューラルネットワークの最後の層の活性化関数として利用されます。
数式が色々と書いてありますが、要はニューラルネットワークの出力を確率に変換するための関数となります。
例えば3クラス分類で考えると、ニューラルネットワークの出力層のニューロンは3つになりますが、
ニューラルネットワークで計算した結果が0.3, 2,9, 4.0だった場合、
最後にソフトマックス関数をかけるとこのように確率に変換されます。
これは、3%の確率で1つ目のクラス、24%の確率で2つ目のクラス、73%の確率で3つ目のクラスであると推論したことを意味します。
確率なので0から1の実数となり、合計は1となります。また、大小関係は変わりません。
- ここからはニューラルネットワークの学習について話していきますが、
MNISTと呼ばれる手書き数字画像の分類を題材にして話したほうが分かりやすいので、まずこれの説明をしていきます。
MNISTは画像処理で最も有名なデータセットで、基礎の勉強や実験用のデータとしてよく使われています。
データセットは0から9までの数字画像から構成され、訓練画像が60000枚、テスト画像が10000枚用意されており、それらを使って学習と推論をしていきます。
画像データは28×28のグレー画像で、各ピクセルは0から255までの値をとります。
- まずニューラルネットワークの学習の目的ですが、誤差を最小化するパラメータ、つまり最適な重みとバイアスを訓練データから自動で取得することが目的となります。
学習の手順をざっくり書くとこのようになります。
まず、訓練データをニューラルネットワークに読み込ませて、推論させます。この画像は5だ、この画像は3だ、というように。
次に、推論した結果と、正解データを比べて、その誤差を損失関数というもので求めます。例えば本当は3なのに5と判定していたら誤差は大きくなります。
そして、損失関数のパラメータについて微分した値(勾配と呼ばれます)を求めて、その値でパラメータを更新します。
要は本当は3のものと3だと認識させるために、パラメータを調整します。
この手順を何度か繰り返し、ニューラルネットワークの学習が行われます。
- 図で表すとこのようになります。
入力画像に対して重みやバイアスをかけて、入力されたデータが何であるかを推定します。
この例だと、1は0%、2は5%、3は2%、4は0%、5は75%、6~9は0%だと推定しています。
正解データは5が100%というようになっています。
推定した結果と正解データを比べて、誤差を算出し、その誤差が最も小さくなるように重みとバイアスを更新する。
この更新作業のことを、学習すると呼んでいます。
ここでこの誤差をどのように算出するか、というところで、損失関数を利用します。
それから、求めた誤差から重みをどのように更新するかというところもこれから説明していきます。
- まずは損失関数について説明していきます。
損失関数は簡単にいうと、ニューラルネットワークの性能がどれくらい悪いかを示していて、この値が小さいほど性能が良いという指標になります。
損失関数は様々なものがありますが、ここではもっとも有名な2種類だけ紹介します。
まずは2乗和誤差と呼ばれるものです。
数式で表すとこのようになり、ニューラルネットワークの出力と、正解データの各要素の差の2乗を計算し、その総和を求め、2で割ることを表しています。
例で計算してみます。
- まず二乗和誤差の定義をしてあります。
2が正解という前提で、
1つ目の例では、推論した結果2の確率が0.6で最も高い場合です。
誤差は、0.0975になります。
2つ目の例では、7の確率が0.6と最も高い場合です。
誤差は、0.5975となり、推論結果が誤っていた場合は誤差の数値が大きくなることが分かります。
つまり1つ目の例の方が、出力結果が正解データにより適合していることが分かります。
- 次は交差エントロピー誤差について説明します。
数式で表すとこのようになり、ニューラルネットワークの出力に対して対数計算して正解データと掛けて、その総和に-1をかけることを表しています。
先ほど見たように、tは正解ラベルとなるインデックスだけが1で、それ以外は0になっているので、
実質的には、正解ラベルが1に対応するニューラルネットワークの出力の自然対数を計算するだけになります。
さっきの図の例だと、正解ラベルが1である5の推論結果なので、log0.75を計算することになります。
右の図は対数のグラフになりますが、正解であるクラスの確率が小さいほど誤差が大きくなることが分かるので、意外と直感的でわかりやすい関数です。
- こちらも実装例を見ていきます。
まず交差エントロピー誤差の定義がしてあります。
正解データと出力データは先ほどと同じです。
最も高い確率が正解データと同じほうが、誤差が小さくなっていることが分かります。
- 次に、重みの更新の仕組みについてみていきます。
重みの更新は、勾配降下法と呼ばれる手法で行われます。
この方法は、パラメータに関する損失関数の微分値を算出することで、損失関数が最小となるパラメータを求めることができます。
求めた勾配の方向に進むことで、・・・
- この図では、重みwを変化させた際の損失関数Lの値を示しています。
横軸が重みw、縦軸が損失関数Lです。
実際のニューラルネットワークの損失関数はもっと次元数が多くて複雑な形をしているのですが、ここでは説明のために二次関数で表しています。
ニューラルネットワークの学習では、損失関数Lを最小化したいわけなので、目指すべきwの値としては、この矢印の点になります。
では、この損失関数が最小値になるようなwはどのようにして求めればいいのでしょうか。
- 例として、重みの初期値が4であったとします。
すると、w=4のときの接線の傾きが微分することで求まります。
要は、wをほんの少しだけ増やしたときに、損失関数Lの値がどれだけ増減するのかが分かります。
この増減する値(つまり傾き)のことを勾配と呼びます。
ここでは仮に、勾配が5であったとします。
- 勾配とは、wをほんの少しだけ増加させた際に、Lが増加する方向を意味しています。
今はLを小さくしたいので、この勾配の逆方向へwを変化すれば良いことになります。
これがニューラルネットワークのパラメータを目的関数の勾配を用いて更新していく際の基本的な考え方になります。
つまり、wを少しだけ増やしたときに、損失関数の値は5増えるので、逆にwを減らせば損失関数の値は減るはずだということです。
- 実際にwを更新するときには、勾配をそのまま反映するのではなく、
更新量の幅を調整するために学習率イータと呼ばれるものを乗じます。
数式で表すとこのようになります。
例として学習率を0.5として、wを更新してみると、
元々wが4で、学習率×勾配を引くと、wは1.5となりました。
wを1.5に更新すると、損失関数の値としては少なくなっていることが分かります。(y軸が下のほうに下がったので)
これで損失関数Lの値を減らすことに成功しました。
- 再度この点において勾配を求めると-2だったとします。
さらにwを更新すると、今度は2.5になります。
このように、徐々にLが最小値をとるときのwの値に近づいていることが分かります。
このようにして、勾配を更新量としてパラメータを変化させていくことで、損失関数Lを最小にする重みに徐々に近づけていくことができます。
- ここまでで、ディープラーニングの基本的なことは説明できたので、
ここで実際にMNISTの分類を実装していきます。
まずネットワークの説明です。
入力層ですが、MNIST画像は28*28ピクセルの画像なので、これを1次元に変換したものを入力とするので、784個のニューロンになります。
隠れ層は2つあり、1つ目が256個のニューロン、2つ目が100個のニューロンとしてます。
このニューロンの数は私がなんとなく決めています。
出力層は、今回は0~9の分類をする10クラス分類なので、10個のニューロンとなります。活性化関数はソフトマックス関数を使っています。
- 図で表すとこんな感じです。
入力層は784個のニューロンで、隠れ層1は256個、隠れ層2は100個で、活性化関数にreluを使っています。
出力層は10個のニューロンで、活性化関数はsoftmaxを使っています。
この1つ1つのニューロンが、それぞれ1である確率、2である確率というようになっています。
- 最後はCNNについて説明します。
先ほど実装したニューラルネットワークでは、全結合層を使っていました。
全結合層は、隣接する層のニューロンがすべて連結されているような層です。
実は全結合層にはデータの形状が無視されてしまうという問題点があります。
画像は通常、縦、横、チャネル方向の3次元の形状ですが、全結合層に入力するときには、3次元のデータを1次元に変換する必要がありました。
先ほどの実装例でも、28×28の画像を、1行に並べた784個のデータを入力としていました。
本来画像は空間情報が重要で、近いピクセルは関係性が強かったり、離れた画素同士は関係が薄かったりと、3次元の形状の中にパターンを持っていて、
できれば形状を維持したまま処理したい。
このような問題を解決するためにCNNがあります。
- CNNは畳み込みニューラルネットワークと呼ばれています。
画像認識、音声、自然言語では必ずと言っていいほど使われています。
CNNは従来のネットワークに加え、畳み込み層とプーリング層を使っているのが特徴です。
この層を使っているニューラルネットワークをCNNと呼ばれています。
- 実際のCNNのイメージはこんな感じです。
今まで使っていたAFFINE(全結合層)も結局は使うのですが、その前の層に畳み込み層やプーリング層を入れるイメージになります。
- ではこの2つの層はなにかということで、まずは畳み込み層から説明します。
畳み込み層では、畳み込み演算を行います。画像処理ではフィルター演算と呼ばれているものです。
まず、入力データの画像(MNISTは28*28だが簡単のため4*4)が入ってくると、それに対してフィルターをかけます。
計算方法としては、まず左上から順に、重なったところに対して掛け算して、総和します。
例えば、・・
最後にバイアスを足して、画像を出力します。
このフィルターは1枚とは限らず、50枚のフィルターがあれば50枚の画像が出力されます。
- では畳み込み演算は何のためにやっているのかというと、
入力画像から特徴を抽出した画像(特徴マップ)を出力することが目的となっています。
そのために、フィルターと呼ばれる特徴抽出器を通して、画像のどこに特徴が存在するかを探しています。
ニューラルネットワークの学習では、このフィルターがいかに特徴を抽出できる特徴抽出器にするために、フィルターのパラメータを学習しています。
今までのニューラルネットワークの例でいう重みやバイアスに値するのがこのフィルターとなります。
- プーリング層でやっていることは簡単で、縦、横方向の空間を小さくする演算をしています。
この例だと、左上の領域で一番大きいのは8なので、8を出力します。
これはMaxプーリングと呼ばれるものですが、Averageプーリングなど他にも種類があります。
- ではプーリング層は何の役割があるのかということですが、
微妙な位置のズレの情報を削ぎ落すのが目的となっています。
例えばこの画像のように、同じカテゴリとして識別したい画像でも微妙に位置がずれている場合に、ニューラルネットワークは同じカテゴリだと認識してくれない可能性があります。
入力画像が少しズレていても、プーリングすることで同じ結果を返してくれます。
入力データの位置のズレをプーリングが吸収してくれるとも言えます。
また、特徴としては学習するパラメータが存在しません。
ただ単に、対象領域から最大値をとるだけの処理をしています。
- 最後にディープラーニングですが、より層を深くしたディープなニューラルネットワークをディープラーニングと呼んでいます。
有名なディープラーニングのネットワークを少しだけ紹介します。
これはVGG16という2014年の画像コンペで高い精度を出した、画像認識のネットワークでは有名なもので、全部16層にもなります。
- 次にGoogLeNetと呼ばれるネットワークです。
このネットワークの特徴としては、縦方向にも幅を持っていて、
インセプション構造というのですが、入力に対してサイズの異なるフィルターを複数適用して、その結果を結合するということをやっています。
- ResNetはスキップ構造を取り入れているのが特徴です。
入力データに対して畳み込み層を通したものと、通さなかったものを合算して後の層に渡していくという構造です。
こうすることで、層を深くしすぎて勾配が小さくなる問題を解決することが期待できるようです。
- ディープラーニングの基礎を学んできました。
ディープラーニングは進化の激しい分野で、最新の技術を効率よく理解するためにも、
ディープラーニングの仕組みをしっかり身に着けた上で、今後も精進したいと思います。
- 勾配を求める方法として、先ほどまでは数値微分により勾配を求めてきました。
しかし数値微分により勾配を求める方法には1つ欠点があり、
微分計算に時間がかかるため、層が増えたときに学習が中々終わらないという問題があります。
そこで、誤差逆伝播法という手法が提案されています。
これは連鎖律という仕組みを使って、微分計算をせずに各重みの勾配を効率よく算出することができます。
今回は詳細は省きますが、ディープラーニングのライブラリでは誤差逆伝播法が基本的に使われているので、
興味がある人は調べてみてください。