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次関数でないものは全て、非線形です。
ニューラルネットワーク
脳のニューロンのように、ある刺激に対して反応するアルゴリズム。
人の脳はニューロンがネットワーク上に繋がっており、ニューロン間で情報をやりとりしています。やりとりしている電気信号がある閾値を超えると発火します。
ニューラルネットワークはこの仕組みを模したものです。入力データを受け取り、受け取ったデータは重みを変えて(入力元が違うのでそのままでは使えない)計算をします。計算結果が閾値を超えたら発火します。図の場合、計算式は以下の通り。
w1jx1 + w2jx2 + w3jx3 = yj
ベクトルの内積を求めていることになりますね。
ニューラルネットワークは上の図をたくさん組み合わせたもので、下の図のようになります。いい感じのWとφが見つかれば、y = f(x)が学習できるはず。。。です。
コスト関数
最適なパラメータを見つけるために、実際の値とモデルで計算した値の誤差を求めます。この誤差のことを「コスト関数」といい、コスト関数を小さくすることでモデルの精度を上げて行きます。ニューラルネットワークの場合、コスト関数を小さくするためにはwの値を調整していきます。
ニューラルネットワークは右の図のようにコスト関数が非凸型なので、最小値を求めるのが難しいのです。確率的勾配降下法を使って最小値を求めていきます。
ロジスティック回帰でのコスト関数は以下の通り。
シグモイド関数を使った時のニューラルネットワークのコスト関数は以下。
出力ニューロン数分合計するというところが異なります。
ロジスティック回帰を並べたようなイメージです。
活性化関数
ニューロンを発火させる関数のことを活性化関数と言います。かつてはsigmoid関数を使うことが多かったのですが、現在はReLUを使うのが主流です。ReLUはRectified Linear Unit(正規化線形関数)の略で、ランプ関数とも呼ばれます。
g = max(0, z) → 0以下なら0,それ以外はそのまま
で、グラフにすると以下のようになります。
以下のようなメリットがあります。
- 勾配が消えない(x>0の場合、xの値によってyの値が変わる)
- 計算コストが低い
- 性能が良い
それに対して、sigmoidは以下のような形状です。
勾配が消えてしまうので、隠れユニットとしては良くありません。sigmoidを長く使っていたために、ニューラルネットワークは発展しなかったとも言われています。
- 0付近でも入力に敏感なため、最適化が難しい
- |x|が大きいと勾配が消える(値が変わらない)
ReLUには他にも種類があります。
Leaky ReLUは負側にも傾斜をつけることによって、勾配が消えないようにしています。がLeRUを使うとL1正則化の効果が得られるというメリットもあります。
万能近似定理
実務では出てこないけど、考え方としては大事なもの。
非線形の隠れユニットを使っていれば、3層のネットワークで表現できるというものです。(学習できるわけではない)
Forwardモード微分
ある入力を変化させた時、どのように出力が変化していくのか見る方法
a=1,b=2の時の例
Fowardモード微分は全てのルートを辿るので、とても大変。
入力の次元>出力の次元であることに注目したのがReverseモード微分
Reverseモード微分
ある出力を変化させた時、各点がどのように作用しているかをみる方法
出力の数だけ見ていけば良い。ディープニューラルネットワークではよく使う。
a=1,b=2の時の例
誤差逆伝播法
Reverseモード微分を使って勾配を計算する方法で、入力層から出力層まで内積を求めて出力を得るものです。以下のフローで計算します。