G検定の学習として、今回はディープラーニングのいろんな手法を勉強していきます。
ここが難しいので、キモになりそうな予感です。
ディープラーニング概要はこちら。
活性化関数
ニューラルネットワークの活性化関数として、シグモイド関数がありましたがそれ以外のものもあります。
tanh関数
ディープニューラルネットワークは、層が深くなればなるほど誤差を逆伝搬する際に学習ができにくくなってしまうという勾配消失問題が課題でした。最大の要因が、シグモイド関数の微分の最大値です。
ここでのポイントは、
出力層ではシグモイド関数またはソフトマックス関数を用いなければoutputを確率で表現することができないので、これらの関数を変えることはできないですが、
隠れ層では任意の実数を非線形に変換する事ができる関数であれば、特にどんな関数であろうと問題はないということです。
活性化関数が微分できないと誤差逆伝播法を使えないので、効率的に重みを求めるには任意の実数で微分できなくてはなりませんが、それ以外の制約は特に無いからです。
隠れ層の活性化関数を工夫するというアイディアで良い結果が得られていたのが、tanh(ハイパボリックタンジェント)関数です。
これは、シグモイド関数を線形変換したもので、tanh関数は-1〜1の範囲をとります。(シグモイド関数は、0〜1の範囲を取る)
シグモイド関数の微分の最大値が0.25であったのに対して、tanh関数の微分の最大値は1なので、勾配消失がしにくくなるのです。
そのため、
一般的なディープニューラルネットワークの隠れ層の活性化関数にシグモイド関数が使われている場合には、すべてtanh関数に置き換えたほうがいいということになります。
ReLU関数
tanh関数に代わり、現在最もよく使われているのが ReLU(Rectified Linear Unit)関数です。
シグモイド関数やtanh関数とは全く違う形になりますが y=max(0, x)とシンプルなグラフになっています。
このReLU関数を微分するとxが0より大きい限り、微分値は常に最大値である1が得られることになります。
ここから、tanh関数のようにピーク値のみが1のときと比較すると、誤差逆伝播法の際に勾配が小さくなりにくい(勾配消失しにくい)ことがわかります。
注意として、x =< 0 の場合は微分値も0になるので、ここだと学習がうまくいかない場合もあります。
ReLU関数は、既存の活性化関数と比べて劇的に精度向上に貢献したため、派生形も出てきました。
それが、Leaky ReLU関数です。
Leaky ReLU関数は、 x < 0 において、わずかな傾きを持っているということがReLU関数との違いです。
つまり、微分値が0になることがなくなるので、ReLU関数よりも勾配消失しにくくできる = 精度が出やすい活性化関数として期待されましたが、実際は、、、
精度がいいときもあれば悪いときもあるという結果になっておりどちらがいい悪いというのは無いようです。
また、
Leaky ReLUの x < 0 部分の直線の傾きを学習に最適化しようとする、Parametric ReLUや、複数の傾きをランダムに試すようなRandomized ReLUなどがあります。
どれがいい悪いはやっぱり無いようです。
勾配降下法(ディープラーニングの学習の方法)
改めて、ニューラルネットワークを始めとした、機械学習の手法がめざしているのは、
モデルの予測値と、実際の値との誤差をなくすこと
です。
これをどう実現していくか。。。
数学的に見ると、誤差を誤差関数として定義してこれを最小化する問題として捉えられますね。
これは、すなわち、関数の最小化問題です。
関数の最小化といえば、微分ですので、
ニューラルネットワークにおけるモデルのパラメータ(= 各層における重み)をうまく調整して誤差関数を最小化したい。
そこで、それぞれの層の重みで誤差関数を微分した値がゼロになるような重みを求めればいいということになります。
※ただし、調整すべき重みは複数ありますので微分は微分でも偏微分になります。
数学の多変数微分積分学における偏微分(へんびぶん、partial derivative)は、多変数関数に対して一つの変数のみに関する(それ以外の変数は定数として固定する(英語版))微分である(全微分では全ての変数を動かしたままにするのと対照的である)。偏微分はベクトル解析や微分幾何学などで用いられる。
Wikipedia
て言われてもようわからん、、、ですのでヨビノリYouTubeで気軽に理解!
でも、微分値がゼロになるような重みを解析的にどう求めるのかが問題です。
ニューラルネットワークで解くような問題は次元が多次元なので最適なパラメータが簡単に求まらないことが多いからです。
なので、アプローチを変えて「解析的に」ではなくアルゴリズムを使って最適解を探索するようにしていきました。この手法を「勾配降下法」といいます。
勾配降下法とは
勾配降下法とは、
勾配に沿って降りていくことで解を探索する手法
です。
勾配と言っているのは、微分値のことで、 y = x^2 の場合のグラフの微分は接線の傾きになっているので勾配があるイメージが付きやすいです。
勾配(接線の傾き)を坂道とすると、その坂道に沿って降りていけばいずれ平らな道に行き着くはずです。そこは、「傾きゼロ = 微分値がゼロ」の点なので目的の点が得られることになりますね。
この記事がめっちゃ分かりやすい。
勾配降下法を式に表した時、目的のxが得られるまで繰り返し計算し勾配に沿って降りていき、解を探索していきます。
式の中にあるkは、これまでに何回繰り返し計算を行ったかを示すもので、イテレーションといいます。
(Iteration:反復、繰り返し)
αは、学習率のハイパーパラメータで勾配に沿って一度にどれだけ降りていくかを決めるものです。
勾配降下法の問題
勾配降下法には問題もあり、それは、適切な最適解が得られないことがある点です。
2次元の場合
このグラフの関数を見ると、どう見ても最適解(傾きゼロ = 微分値がゼロ)は赤い塗りの★部分(大域最適解)になりますが、右上にある緑のハート部分から探索をしていった場合は、まず出会う最適解(傾きゼロ = 微分値がゼロ)は赤い枠線の☆(局所最適解)になります。
大域最適解と局所最適解を判別できるのであればいいのですが、勾配降下法ではこの判別ができないのです。。。
工夫をしない勾配降下法では、「見せかけの最適解(局所最適解)」なのかどうかを見分けることができません。
では、どういった工夫が考えられるのか、、、
これは、学習率の値を大きく設定することが考えられます。
学習率(α)は勾配に沿って一度にどれだけ降りていくかを決めるものですので、赤い枠線の☆とその左にある山を超えられるくらいに学習率を大きくすれば大域最適解にたどり着けるというアプローチです。
1歩あたりの距離を大きくするイメージ
ただ、これ難しいのが、学習率(α)を大きくすると、大域最適解を通り越して探索を続けてしまう事があるので、
適切なタイミングで学習率の値を小さくしていく必要があります。
3次元以上の場合
次元が増えると、もっと厄介になってきます。
鞍点という点に行き着くと、ある次元から見れば極小、別の次元から見ると極大という状況になってしまいます。
こうなってしまうと、抜け出すのが困難になり八方塞がりになります。(プラトー)
鞍点:最適化対象の関数が鞍のような形になっている部分。
ALBERT Official Blog
鞍点はどの方向に対しても平坦に近くなっており、そのため勾配がゼロに近くなり学習が進まなくります。
鞍点などの停留点に到達して学習が停滞している様はプラトーと呼ばれています。
ディープラーニングだとパラメータの次元も大きいので、この鞍点が発生する可能性がとても高いです。
この状態から抜け出すために、どの方向に沿って勾配を進んでいるときに学習率(α)を大きくするか/小さくするかを考える必要があります。
え・・・
これ、めっちゃ大変そう・・・
ディープラーニングの前から、この鞍点問題への解決策は研究されており、
1990年代に提唱されたモーメンタムという手法は慣性の考え方を適用したもので、最適化の進行方向に学習を加速させることで、学習の停滞を防ぐというものでした。
モーメンタム(Momentum)は、損失関数上での今までの動きを考慮することでSGDの振動を抑える と言う考えで導入されました。
Qiita(【2020決定版】スーパーわかりやすい最適化アルゴリズム -損失関数からAdamとニュートン法-)
ここから、ディープラーニングが出てきたときにもモーメンタムよりさらに効率的な方法がいくつも考えられました。
- Adagrad
- Adadelta
- RMSprop
- Adam
今は、Adamがたくさん使われているようです。
詳細はこの2つのリンクを読もう!!
ディープラーニングで精度を高めるテクニック
ディープラーニングでは複数の手法を組み合わせることで精度を上げることになるため、そのテクニックを知っておくことが大事です。
ドロップアウト(アンサンブル学習)
ディープラーニングを行う上で、避けては通れない、機械学習の問題として、オーバーフィッティングがあります。
オーバーフィッティングは、訓練データに対してモデルを合わせ込みすぎることで新しいデータに対する汎用性能が失われてしまうことです。(過学習)
つまり、訓練データに過敏に反応してしまうため、工夫をしないとオーバーフィッティングしてしまいます。
そこで、
学習の際にランダムにニューロンを「ドロップアウト」(除外)させることが考えられました。
もともとのネットワークから、学習の繰り返し(エポック)毎にニューロンを除外することで毎回形の異なるネットワークで学習を行います。
このように、ドロップアウトはアンサンブル学習を行っているのです。
アンサンブル学習は、ランダムフォレストのように、複数のモデルで学習させること!
early stopping
ドロップアウトはオーバーフィッティングを回避するためには効果的ですが、
誤差関数が、予測値と正解値の誤差で、訓練データを用いて最小化するアプローチしかとれないので、
どうしても訓練データにオーバーフィッティングしてしまいます。。
そこで、early stoppingという手法を利用します。
これは、学習を早めに打ち切るというものです。
学習が進むにつれて、テストデータに対する誤差関数の値は右肩上がりになってしまうため、その上がりはじめをオーバーフィッティング開始とみなしその時点で学習をストップすることでそこが最適解が得られたという風に考えるシンプルなやり方です。
最大のメリットは、
最大のメリットは、シンプルなためどんなモデルにも適用できることです。
ジェフリー・ヒントンは、early stoppingを “Beautiful FREE LUNCH”と言っており、これは、
ノーフリーランチ定理という、あらゆる問題で性能のいい汎用最適化戦略は理論上不可能であるというものです。
学習の始めを最適化する方法
今までの活性化関数やAdamなどの学習率を調整する方法やドロップアウト、early stoppingなどはいずれも学習の途中をどう最適化していくのかを考えたものですが、
学習の始めを最適化する方法を考えてみます。
正則化
事前にデータのスケールを調整するとパラメータに偏りがなくなり効率的に学習が行えそうです。
データ全体を調整する処理を、正則化と言います。
特徴量を0〜1の範囲に変換することで様々な特徴量のスケールを合わせて使うことができます。
(特に画像処理の場合は、画素値が255で決まっているので正則化を行うことが多い)
標準化
各特徴量の平均を0、分散を1にすること、各特徴量を標準正規分布に従うように変換するのが、標準化です。
各特徴量の分散をそろえることで、それぞれの特徴量の動きに対する感度を平等に見る事ができるのでとても有益です。
白色化
各特徴量を無相関化した上で標準化するという手法です。
ただし、これは計算コストが高いため通常は標準化を使います。
重みの初期値を工夫する
inputされたデータが隠れ層を順番に伝播していくニューラルネットワークにおいて、活性化関数(シグモイド関数やReLU関数など)がかかってくると正規化や標準化したデータでも勾配消失問題が起こりやすくなったりするので、
層の数が増えてもデータの分布が偏らないような工夫をしなくてはなりません。
そこで、重みの初期値を工夫するという手法が取られました。
乱数にネットワークの大きさに合わせた適当な係数を掛けることで、データの分布が崩れにくい最小値が考えられました。
シグモイド関数に対しては、Xavierの初期値、ReLU関数にたいしてはHeの初期値が良いとされています。
バッチ正規化
各層に伝わってきたデータを、その階層でまた正規化する事ができれば直接的に正規化をしていけます。
これが、バッチ正規化(Batch Normalization)です。各層において活性化関数を掛ける前に伝播してきたデータを正規化するという処理を加えます。
これは、オーバーフィッティングをしにくくなるというメリットもあります。
CNN:畳み込みニューラルネットワーク
画像処理分野で用いられるニューラルネットワークのCNNです。
画像データは、縦横の2次元データで、厳密には色情報を含めた3次元データになるところが通常のデータとの違いです。
通常のニューラルネットワークで画像データを扱う場合は、縦横のデータを分解して横1列の情報にするということを行いますが、これをするとかなりの情報が失われてしまうので、2次元のままinputとして扱えるほうがいいわけです。
こういった中での解決策が、CNN(Convolutional Neural Network、畳み込みニューラルネットワーク)です。
CNNは、画像をそのまま2次元で入力に用いることができるモデルです。
CNNの最初(基本)
初期のCNNモデルは、1982年です。そもそものアプローチとしては、人間が持つ資格屋の神経細胞の2つの働きを模してみようというものです。
以下の2つです。
- 単純型細胞(S細胞)・・・
画像の濃淡パターン(特徴)を検出 - 複雑型細胞(C細胞)・・・
物体の位置が変動しても同一の物体であるとみなす
この2つの働きを最初に組み込んだモデルは、ディープラーニングの父、福島邦彦さんによって考えられた、ネオコグニトロンでした!
S細胞層とC細胞層が組合触った多層構造になっています。
そして、1998年に、ヤン・ルカンによって、LeNetというモデルが考えられました。
LeNetでは、畳み込み層とブーリング層(サブサンプリング層)の2種類の層を交互に複数組み合わせた構造をしています。
ネオコグニトロンとLeNetは、構造上の違いはなく、対応させることができます。
ネオコグニトロン | LeNet |
---|---|
S細胞層 | 畳み込み層 |
C細胞層 | プーリング層 |
add-if silent学習法 (微分(勾配計算)を用いない) | 誤差逆伝播法 |
畳み込み(Convolution)
畳み込みは、カーネルと呼ばれるフィルタを用いて画像から特徴を抽出する操作のことを言います。
※カーネル(フィルタ)は画像よりかなり小さいサイズのものが使われます。
画像とカーネル(フィルタ)があったとすると、このカーネル(フィルタ)を画像の左上から順番に重ね合わせていき、画像とフィルタの値をかけ合わせていったものの総和の値を求めていくという処理になります。
そして、
畳み込みにより新しく2次元のデータが得られますが、それを特徴マップといいます。
ということになるので、
CNNでは、それぞれのカーネル(フィルタ)をどういった値にすればいいのかを学習して行くということになります。
カーネル(フィルタ)の各値がニューラルネットワークで言う重みになっています。
畳み込みは、人間が普通にできている移動不変性の獲得に貢献します。
画像でいうと1ピクセルのズレに関して、人間は同じ画像と認識できますが、ニューラルネットワークだと1ピクセルずれただけで全く違うものとして扱われてしまいます。
畳み込みを使うことでこのような
「位置のズレ」に強いモデルが作れます。
プーリング
プーリングは、
決めれられた演算を行うだけのもので、パラメータの追加はありません。
ダウンサンプリングともサブサンプリングとも言われますが、
画像サイズを決められたルールにしたがって小さくするのがプーリングです。
maxプーリング
maxプーリングは、画像(特徴マップ)の最大値を抽出していくことで、新しくダウンサンプリングした画像を得ることができます。
avgプーリング
avgプーリングは、画像(特徴マップ)の平均値を抽出していくことで、新しくダウンサンプリングした画像を得ることができます。
全結合層
畳み込み層やプーリング層を複数組み合わせることで深いネットワークができますが、出力は画像の形のままです。
最終的に、ある画像をinputすると猫や犬などと識別ができないといけないので、どこかのタイミングで出力の形を1次元にしなくてはなりません。
そのため、CNNでは、畳み込み・プーリングを繰り返したあとに全結合層という層に接続します。(ニューラルネットワークの隠れ層・出力層のようなもの)
そこで、データを1次元の形にします。
最後に1次元にする理由として、事前に畳み込み層・プーリング層で画像から良い特徴を抽出してくれている段階のため、高い精度で予測ができるようになるためです。
ところが、
現在は全結合層を利用せずに、1つの特徴マップに1つのクラスを対応させることで分類を行う、Global Abarage Poolingという処理を行うことがほとんどです。
データ拡張
世の中に存在する一般の物体を認識するためには、以下のような課題があります。
これを解消するには、すべての可能性を網羅するだけのデータを用意すればいいのですが、それは非現実的です。
そこで、手元にあるデータから、擬似的に別のデータを生成してしまうというアプローチが取られました。
これを、データ拡張(Data Augmentation)といい、データの水増しともいわれています。
手元にあるデータそれぞれに対して、ランダムにいくつかの処理を施して新しいデータを作ってしまいます。
具体的には、
- 上下左右にずらす
- 上下左右に反転
- 拡大・縮小
- 回転
- 歪める
- 一部切り取る
- コントラストを変える
などをしていろいろなパターンを用意します。
CNNの発展
2012年には、AlexNetというILSVRC(ImageNet Large Scale Visual Recognition Challenge)で圧倒的精度を見せつけたモデルが登場しました。
これは、
畳み込み層 → プーリング層 → 畳み込み層 → プーリング層 → 畳み込み層 → 畳み込み層 → 畳み込み層 → プーリング層 → 全結合層(3層)
という構造です。
AlexNet以降は、より深いネットワークのモデルが登場してきます。
VGGやGoogLeNetは、ILSVRCの記録をどんどん塗り替えていくことになります。
VGG
畳み込み層と全結合層を連結しシンプルに層を増やしたネットワーク構造で,使い勝手がよく,その後の研究でもこの構造をベースにした研究が良く見られます.層数については「16 weight layers」 等のいくつかのバリエーションがあります
VGG
GoogLeNet
GoogLeNet は、深さが 22 層の事前学習済みの畳み込みニューラル ネットワークです。
GoogLeNet
単純に層を深くしていくだけでは、計算が増えていってしまうので、小さなサイズ(1 x 1 や 3 x 3など)の畳み込みフィルターを差し込んで次元(計算量)削減をするという工夫をします。
GoogLeNetでは、Inceptionモジュールというブロックを構成することで並列計算を行いやすくもしています。
ここでまた問題が・・・
層がどんどん増えていって、超深層になってくるともう性能が落ちてきて誤差が逆伝播しにくくなり、学習がうまくいかないということが顕在化してきました。
その解決策として、
Skip connectionという「層を飛び越えた結合」を加えるということでした。
このSkip connectionが導入されたネットワークを、ResNetといいます。
これにより、以下がメリットになります。
転移学習
VGGやGoogLeNetやResNetはImageNetで学習済みのモデルが公開されており、誰でも利用できるようになっています。
これらを使って自分でチューニング(ファインチューニング)するだけで、かなりの精度が期待できます。
このように、学習済みのネットワークを利用して新しいタスクの識別に活用することを、転移学習といいます。(事前学習ではない)
RNN:リカレントニューラルネットワーク
時系列データ処理で用いられるニューラルネットワークであるRNNについてです。
時間軸に対してなにかパターンを持っている。これをニューラルネットワークで予測しようとするときには、データは時間軸に沿って入力を行うべきで、ネットワークには時間情報を反映できるような仕組みが必要です。
そこで、リカレントニューラルネットワーク(Recurrent Neural Network, RNN)が考えられました。
RNNは、時系列データをそのまま入力できるようにし、データから時間依存性を学習するモデルです。
また、自然言語処理(翻訳)でもよく使われます。
RNNの基本
問題は「どう表現するか?」です。
データに隠された状態ということで、隠れ層を使えば良さそうで、
過去の隠れた状態を反映するための隠れ層を作るようにしたものが、RNNです。
RNNの大きな特徴の一つは「ある時点の入力が、それ以降の出力に影響を及ぼす」ということである。言い換えれば、「過去の情報を基に予測できる」ということである。
第6回 RNN(Recurrent Neural Network)の概要を理解しよう(TensorFlow編)
RNNでは、入力層から隠れ層にネットワークの重みを伝って情報が伝播するのがニューラルネットワークと同じですが、それに加えて過去の隠れ層から現在の隠れそうに対しても繋がり(重み)があります。
これまでに与えられた過去の情報が現在の新しく来た情報に対してどれくらい重みを持っているのかを学習することになります。
逆伝播する誤差も、過去にさかのぼって反映することが必要なので、BackPropagation Through-Time(BPTT)と呼ばれています。(実際は勾配降下法で式を求めていく)
LSTM
RNNの問題もいくつかあり、1つ目は、勾配消失問題です。
誤差を逆伝播する際に、過去にさかのぼるにつれて勾配が消えていってしまうのです。
2つ目は、入力重み衝突と出力重み衝突です。
「今の時点では関係ないが、将来の時点では関係がある」というinputがあった場合、重みは大きくすべきですが、すぐに関係ないので小さくする必要もあります。
これは、矛盾を抱えてしまうので、衝突が起こっているという事になってしまいます。入力、出力双方に関係する問題です。
この解消は、
LSTM(Long Short Term Memory)を使います。
LSTMは、時系列データを扱う上で、デファクトスタンダードのものです!
通常のニューラルネットワークでは、勾配消失問題を解消するために活性化関数を工夫していましたが、LSTMでは隠れ層の構造を変えてしまうということで問題を解消します。
LSTMブロックという機構を導入することで、時系列情報をうまくネットワーク内に保持することができるようにしています。
LSTMにおける隠れ層では、LSTMブロックがたくさん並ぶような形になります。
このLSTMは、以下の2つの機構から成り立っています。
セルは、CEC(Constant Error Carousel)とも言われて、誤差を内部にとどめて勾配消失を防ぐためのものです。
ゲートは、入力ゲート、出力ゲート、忘却ゲートの3つから成り、入力ゲートと出力ゲートはそれぞれ入力重み衝突、出力重み衝突のためのゲート機構です。
忘却ゲートは、誤差が過剰にセルに停留するのを防ぐためにリセットの役割をするゲート機構です。
LSTMは、今や時系列データのデファクトスタンダードですが、セル、ゲートの最適化を行う関係で、計算量が多くなります。
そこで、LSTMを簡略化した、GRU(Gated Recurrent Unit)が代わりに使われることもあります。
GRUのブロック機構では、リセットゲートと更新ゲートがLSTMでいう入力ゲート、出力ゲート、忘却ゲートの代わりになります。
ゲート付き回帰型ユニット(ゲートつきかいきがたユニット、英: Gated recurrent unit、略称: GRU)は、回帰型ニューラルネットワーク(RNN)におけるゲート機構である。
2014年にKyunghyun Cho(조 경현)らによって発表された[1]。GRUは忘却ゲートを持つ長・短期記憶(long short-term memory、LSTM)に似ているが[2]、出力ゲートを欠くためLSTMよりもパラメータが少ない[3]。
多声音楽モデリングおよび音声シグナルモデリングの特定の課題におけるGRUの性能は、LSTMの性能と類似していることが明らかにされている。GRUは特定のより小さなデータセットではもっと良い性能を示すことが明らかにされている[4]。
しかしながら、Gail Weiss、Yoav Goldberg、およびEran Yahavによって示されているように、LSTMは無制限の計数を容易に実行できるがGRUはできないため、LSTMはGRUよりも「厳密に強力」である[5]。これが、LSTMによって学習可能な単純な言語の学習をGRUが失敗する理由である[5]。
同様に、Google BrainのDenny Britz、Anna Goldie、Minh-Thang Luong、およびQuoc Leによって示されているように、LSTMセルは「ニューラル機械翻訳のためのアーキテクチャ変法の初の大規模分析」においてGRUセルを一貫して上回った[6]。
Wikipedia(ゲート付き回帰型ユニット)
RNNの発展形
扱う時系列データの種類で、LSTMやGRUを応用させたモデルが使われることもあります。
Bidirectional RNN
時間情報の途中が欠けており、それが何かを予測したい場合には、過去と未来の両方の情報を使って予測したほうがいいと言えますが、
通常のLSTMは過去→未来の1方向の学習のため、LSTMを2つ組み合わせることで未来→過去も学習できるようにしようというのがBidirectional RNN(BiRNN)です。
RNN Encoder-Decoder
LSTMやGRU、BiRNNは入力が時系列になり、出力は1点というモデルでしたが、
入力も時系列で、出力も時系列という予測もしたいことがある場合(sequence-to-sequence)にどうするか。
これはRNN Encoder-Decoderという手法で行います。
2つのLSTMを組み合わせて、入力と出力も時系列として対応させるというものです。
入力データの処理が、エンコーダー(Encoder)で、出力データの処理が、デコーダー(Decoder)となります。
Attention
時間の重みをネットワークに組み込んだのが、Attentionです。
過去の時点のそれぞれの重みを学習することで、時間の重みを考慮したモデルを実現します。
深層強化学習
強化学習
強化学習は、行動を学習する仕組みのことです。
ある環境下で、目的とする報酬(スコア)を最大化するためにどういう行動を取ればいいのかを学習するものです。
教師あり学習と間違うことがあるけど、
強化学習は、一連の行動系列の結果としての報酬を最大化するように学習するという点が違います。
ロボットの歩行制御で例えると分かりやすいのですが、
教師あり学習の場合は、関節の角度や動かす速度などのinputとoutputのデータを逐一用意して上げる必要がありますが、
強化学習だと「歩けた距離」を報酬として与えることで機会が報酬を最大化するために考えて行動するというものになります。
ただ、残念ながら、強化学習は万能ではないのです。
強化学習の難しさは、状態をいかに表現できるか、その状態に基づいて以下に現実的な範囲で行動に結びつけるかにあります。
深層強化学習
このような問題が、ディープラーニングの登場で解消されようとしています。
強化学習 × ディープラーニング = 深層強化学習
2013年にDeepMind社がCNNを組み合わせた強化学習でブロック崩しを人間よりも良い記録にしたことで有名になりました。
これは、Q学習(Q Learninig)という強化学習の方法にディープラーニングを組み合わせているので、
DQN(Deep Q-Learning)と言われており、
Double DQN, Dueling Network, Categorical DQN, Rainbowなどの様々なモデルが研究されるようになりました。
そして、2015年にはあのAlphaGoが登場することになります。
深層生成モデル
今までは識別モデルでしたが、ここからは生成モデル(データの生成を考える)についてです。
認識・識別タスク以外に、生成タスクにもディープラーニングは応用されており、特に画像データの生成や時系列データの生成で研究が 活発です。
生成とは以下のものです
- データを元に、新しく別の何かを生成したい(識別モデルの延長)
- データそのものを生成したい
前者のタイプは、音声生成においてブレークスルーを起こしたWaveNetもこれがベースになっています。
後者のタイプは、元データの分布を推測し、元データと同じようなデータを生成するサンプリングを目的としたモデル、生成モデルを考えます。
ここにディープラーニングを取り入れると、深層生成モデルになります。
画像生成燃せる
画像分野では、
変分オートエンコーダー(Variational AutoEncoder, VAE)や、
敵対的生成ネットワーク(Generative Adversarial Network, GAN)
が有名です。
変分オートエンコーダー(Variational AutoEncoder, VAE)
VAEは、オートエンコーダーを活用し、入力を固定された表現に圧縮!ではなく、統計分布に変換します。
平均と分散を表現するように学習するということです。
エンコーダーが統計分布に変換し、そこからランダムにサンプリングした点をデコーダーによって復元することで、新しいデータを生成できるということです。
敵対的生成ネットワーク(Generative Adversarial Network, GAN)
GANの方は、2種類のネットワークで構成されています。
- ジェネレーター(Generator):
入力として洗剤空間のランダムベクトルを受け取り、画像を生成して出力 - ディスクリミネーター(Discriminator):
入力として画像を受け取り、その画像が本物(ジェネレーターによって生成されたもの)か、偽物かを予測して出力
大事なのは、
ジェネレーターはディスクリミネーターが間違えるような偽物画像を作るように学習をしていき、ディスクリミネーターは偽物をきちんと見抜けるように学習をしていくということです。
GANはこの2種類のネットワークを闘わせることで、最終的には本物と見分けのつかないような偽物(新しい画像サンプル)を作り出すことを実現します。
ジェネレーターは絵画の贋作や偽物を作る人で、
ディスクリミネーターはそれを見抜く人、
この両者はイタチごっこしている
というイメージです。
それぞれのネットワークにCNNを用いたモデルが、高度な画像生成を可能にしていますがこれをDCGAN(Deep Convolutional GAN)といいます。