ありまっくすのへっぽこ日記

アラフォーでへっぽこエンジニアをしております。へっぽこなりに頑張っています。

DeepLeaning講座(第1回)を受けてきたよ

先々週の話。

DeepLeaning講座を受けてきました。以前に受けていた機械学習講座のアドバンス版。

前回受けた機械学習の講座の続きという位置付け。これから全8回がっつりディープラーニングに浸ってきます。

この講座はJDLAのカリキュラムに準拠しているとのこと。個人的には先生が実務で使われているものをもっと知りたいなー。と思っていました。

深層学習ってそもそも何?

DeepLeaningは人間様の力を借りずに機械がデータの特徴を抽出して学習を行うことです。MITが発刊している『Deep Learning Book』には以下の様に記載されています。

Deep learning is a particular kind of machine learning that achieves great power and flexibility by learning to represent the world as a nested hierarchy of concepts, with each concept defined in relation to simpler concepts, and more abstract representations computed in terms of less abstract ones. 

線形性と非線形

線形性とは以下の図式が成り立つもの。(非線形性は、線形でないもの)

  • f (x+y) = f(x) + f(y)
  • f(cx) = cf(x)

以下の図のようなものが線形、1次関数ですね。線形は解くのが簡単というメリットがあります。1次関数でないものは全て、非線形です。

f:id:ari_max:20180422163454p:plain

ニューラルネットワーク

脳のニューロンのように、ある刺激に対して反応するアルゴリズム

人の脳はニューロンがネットワーク上に繋がっており、ニューロン間で情報をやりとりしています。やりとりしている電気信号がある閾値を超えると発火します。

f:id:ari_max:20180421193602p:plain

ニューラルネットワークはこの仕組みを模したものです。入力データを受け取り、受け取ったデータは重みを変えて(入力元が違うのでそのままでは使えない)計算をします。計算結果が閾値を超えたら発火します。図の場合、計算式は以下の通り。

w1jx1 + w2jx2  + w3jx3 = yj 

ベクトルの内積を求めていることになりますね。

f:id:ari_max:20180422150754p:plain

ニューラルネットワークは上の図をたくさん組み合わせたもので、下の図のようになります。いい感じのWとφが見つかれば、y = f(x)が学習できるはず。。。です。

 

コスト関数

最適なパラメータを見つけるために、実際の値とモデルで計算した値の誤差を求めます。この誤差のことを「コスト関数」といい、コスト関数を小さくすることでモデルの精度を上げて行きます。ニューラルネットワークの場合、コスト関数を小さくするためにはwの値を調整していきます。

ニューラルネットワークは右の図のようにコスト関数が非凸型なので、最小値を求めるのが難しいのです。確率的勾配降下法を使って最小値を求めていきます。

f:id:ari_max:20180422172731p:plain

凸型関数(左)と非凸型関数(右)


ロジスティック回帰でのコスト関数は以下の通り。

f:id:ari_max:20180422172936p:plain

シグモイド関数を使った時のニューラルネットワークのコスト関数は以下。

出力ニューロン数分合計するというところが異なります。

ロジスティック回帰を並べたようなイメージです。

f:id:ari_max:20180422172949p:plain

 

活性化関数

ニューロンを発火させる関数のことを活性化関数と言います。かつてはsigmoid関数を使うことが多かったのですが、現在はReLUを使うのが主流です。ReLUはRectified Linear Unit(正規化線形関数)の略で、ランプ関数とも呼ばれます。

g = max(0, z) → 0以下なら0,それ以外はそのまま

で、グラフにすると以下のようになります。

 

f:id:ari_max:20180422174055p:plain

以下のようなメリットがあります。

  • 勾配が消えない(x>0の場合、xの値によってyの値が変わる)
  • 計算コストが低い
  • 性能が良い

それに対して、sigmoidは以下のような形状です。

勾配が消えてしまうので、隠れユニットとしては良くありません。sigmoidを長く使っていたために、ニューラルネットワークは発展しなかったとも言われています。

  • 0付近でも入力に敏感なため、最適化が難しい
  • |x|が大きいと勾配が消える(値が変わらない)

f:id:ari_max:20180422232834p:plain

ReLUには他にも種類があります。

f:id:ari_max:20180422232738p:plain

 Leaky ReLUは負側にも傾斜をつけることによって、勾配が消えないようにしています。がLeRUを使うとL1正則化の効果が得られるというメリットもあります。

 

万能近似定理

実務では出てこないけど、考え方としては大事なもの。

非線形の隠れユニットを使っていれば、3層のネットワークで表現できるというものです。(学習できるわけではない)

 

Forwardモード微分

ある入力を変化させた時、どのように出力が変化していくのか見る方法

a=1,b=2の時の例

 

f:id:ari_max:20180422235211p:plain

 

Fowardモード微分は全てのルートを辿るので、とても大変。

入力の次元>出力の次元であることに注目したのがReverseモード微分

 

Reverseモード微分

ある出力を変化させた時、各点がどのように作用しているかをみる方法

出力の数だけ見ていけば良い。ディープニューラルネットワークではよく使う。

a=1,b=2の時の例

f:id:ari_max:20180422235124p:plain

 

誤差逆伝播法 

 Reverseモード微分を使って勾配を計算する方法で、入力層から出力層まで内積を求めて出力を得るものです。以下のフローで計算します。

  1.  入力層から出力層まで内積を求めて出力を得る
  2.  損失関数の各出力に関する微分δを求める
  3.  δを逆伝播させていき、重みに関する全勾配を求める
  4. パラメータを更新