「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
モデル †
- 脳機能に見られるいくつかの特性に類似した数理的モデル(確率モデルの一種)
- シナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、
学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデル全般。
- 実際に生物の神経系のシミュレーションであるか否かについては
議論があるため人工ニューラルネットワークなどと呼ばれることもある。
学習 †
ニューラルネットワークは、 †
- 機械学習の、
- 学習フェーズでは、信号は逆方向に伝播する。
- 推論フェーズでは、信号は順方向に伝播する。
- パーセプトロンでは、活性化関数にStep関数(段階関数)を使用していたが、
ニューラルネットワークでは、これ以外の活性化関数(Sigmoid関数、ReLU関数)を使用する。
- 線形の座標変換(アフィン変換)をしたモノに対して
目盛の振り直しを行い新しい非線形の座標系を作る。
「重み」によって「新しい非線形の座標系」が変わる。
「重み」のパラメタの決定 †
- 「重み」のパラメタ(w1, w2, θ(-b))の決定は人手によって行われる。
という問題を、データから自動で「重み」のパラメタを学習することで解決する。
- ニューラルネットワークとは微分可能な変換が幾つも連なってできた一つの大きな合成関数で、この微分は逆伝播の連鎖律で計算できる。
- 従って、ネットワーク構造が複雑であっても、合成関数を構成する個々の変換が微分可能であれば、
勾配法によって目的関数(損失関数)を最適化することで(収束するかどうかは別にして)求めることが出来る。
構造 †
第0層(入力層 †
そのままの値を出力(出力に重みを掛けられる。
第1層(中間層(隠れ層 †
- 入出力変換後、重みを掛けて多分岐。
- 以下のような関数を使用できる。
第2層(出力層 †
誤差の計算と重みの更新 †
出力と教師信号の誤差の計算をし、
2→1→0層と層の重みを更新していく(誤差逆伝播法)
数学的に †
関数 †
関数はニューラルネットワーク全体で1つの関数、個々の合成関数。
- (x) → (z) → (w) → (p)
- ◯ → ◯ の「→」の部分が関数と重み(重みは入力に掛ける値)
(x) ─ f1(x1, x2, x3, ...) → (z) ─ f2(z1, z2, z3, ...) → (w) ─ f3(w1, w2, w3, ...) → (p)
特徴 †
- 深くする(p=fn(...f3(f2(f1(x)))...)と
少ないパラメタで複雑(≒ 高次)な関数を作れる。
計算 †
入力層~中間層の †
上記を行列計算に出来る。
- オンライン
(t1,t2,t3,t4) = (x1,x2,x3,x4)┌w11,w12,w13,w14┐ + (b1,b2,b3,b4)
│w21,w22,w23,w24│
│w31,w32,w33,w34│
│w41,w42,w43,w44│
│w51,w52,w53,w54│
└w61,w62,w63,w64┘
(z1,z2,z3,z4) = Φ((t1,t2,t3,t4))
- バッチ(サイズ3
┌t11,t12,t13,t14┐ ┌x11,x12,x13,x14┐┌w11,w12,w13,w14┐ ┌b1,b2,b3,b4┐
│t21,t22,t23,t24│ = │x21,x22,x23,x24││w21,w22,w23,w24│ + │b1,b2,b3,b4│
└t31,t32,t33,t34┘ └x31,x32,x33,x34┘│w31,w32,w33,w34│ └b1,b2,b3,b4┘
│w41,w42,w43,w44│
│w51,w52,w53,w54│
└w61,w62,w63,w64┘
┌z11,z12,z13,z14┐ ┌t11,t12,t13,t14┐
│z21,z22,z23,z24│ = Φ(│t21,t22,t23,t24│)
└z31,z32,z33,z34┘ └t31,t32,t33,t34┘
出力層と誤差計算 †
- バッチ
┌p11,p12┐ ┌f11,f12┐
softmax(│p21,p22│) = │f21,f22│
└p31,p32┘ └f31,f32┘
- バッチ
┌f11,f12┐ ┌l11,l12┐
cross_entropy_error(│f21,f22│) = │l21,l22│
└f31,f32┘ └l31,l32┘
活性化関数 †
- 各層の出力する前に、出力結果をどの程度活性(発火)させるかを決める関数。
- ニューラルネットワークでは、非線形な関数を使用する必要がある。
- 線形関数を用いてはならないのは、多層化の意味が無くなるため。
- 例 : 線形な h(x) = cx を多層化しても h(h(h(x))) = cccx となり1層で表現可能。
共通点 †
- 微分可能な非線形な関数
- 0 <= 出力信号 <= 1 に収める。
- 入力信号が重要な時に1(に近い)、重要でない時0(に近い)値を返す。
相違点 †
- Step関数:0, 1の信号
- 単純パーセプトロンの活性化関数はStep関数。
- ある閾値を超えたら「1」、それ以外は「0」を返す関数。
Step関数 †
実装 †
なんとなくAPI仕様を知らないと難しい感じ(グラフ参照)。
グラフ †
-5.0 ~ 5.0までの0.1刻みのプロットをStep関数にかけてグラフ化する。
"""This is a test program."""
import numpy as np
import matplotlib.pylab as plt
def step_function(x_1):
"""This is a test program."""
# 上記のいずれかの実装を選択。
X = np.arange(-5.0, 5.0, 0.1)
Y = step_function(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1) # 図で描画するy軸の範囲を指定
plt.show()
Sigmoid関数 †
1
h(x) = ────────
1 + exp(-x)
- exp(-x)とは、eの-x乗を意味する。
- eはネイピア数(2.7182)の実数を表す。
実装 †
ポイントは、Pythonのブロードキャストによって配列も計算できる点。
"""This is a test program."""
import numpy as np
def sigmoid(x_1):
"""This is a test program."""
return 1 / (1 + np.exp(-x_1))
グラフ †
-5.0 ~ 5.0までの0.1刻みのプロットをSigmoid関数にかけてグラフ化する。
"""This is a test program."""
import numpy as np
import matplotlib.pylab as plt
def sigmoid(x_1):
"""This is a test program."""
return 1 / (1 + np.exp(-x_1))
X = np.arange(-5.0, 5.0, 0.1)
Y = sigmoid(X)
plt.plot(X, Y)
plt.ylim(-0.1, 1.1)
plt.show()
tanh関数 †
- tanh(Hyperbolic tangent function)関数、双曲線正接関数
- あらゆる入力値を-1.0~1.0の範囲の数値に変換して出力する関数である。
で、勾配消失問題を引き起こし難く、学習をより高速化させる。
実装 †
...
グラフ †
...
ReLU関数 †
- ReLU(Rectified Linear Unit)関数、正規化線形関数
主流 †
- ...は勾配消失問題を緩和できる。
・微分結果が 0 or 1 なので、
・ただし、0(の時は)では学習が上手くいかない。
実装 †
"""This is a test program."""
import numpy as np
def relu(x_1):
"""This is a test program."""
return np.maximum(0, x)
グラフ †
-5.0 ~ 5.0までの0.1刻みのプロットをReLU関数にかけてグラフ化する。
"""This is a test program."""
import numpy as np
import matplotlib.pylab as plt
def relu(x_1):
"""This is a test program."""
return np.maximum(0, x_1)
X = np.arange(-5.0, 5.0, 0.1)
Y = relu(X)
plt.plot(X, Y)
plt.ylim(-0.1, 5.1)
plt.show()
ReLU派生系 †
Leaky ReLU関数 †
- x < 0においてわずかな傾きをもっている。
- このため微分値が0になることはなくなり、
ReLUよりも勾配消失問題を引き起こし難い。
Parametric ReLU †
LeakyReLU のく 0 部分の直線の傾きを「学習によって最適化」
Randomized ReLU †
LeakyReLU のく 0 部分の直線の傾きを「ランダムに試す」
Maxout関数 †
- ReLUをさらに一般化した関数
- Dropoutと組み合わせることで高い精度が得られる。
出力層の活性化関数 †
推論と学習 †
ニューラルネットワークの問題点 †
概要 †
- 従来手法よりも過学習を起こし易い。
- データサンプルは、パラメータの10倍あると良い。
- 少ないデータ量でもできるだけ性能を落とさずに済むような工夫が新たに必要。
解決 †
学習率の調整が難しい †
概要 †
学習率とは、
- 一回の学習でどれだけ学習るか?
=どれだけパラメタ更新するか?で、
- 学習率が従来の機械学習の手法よりも大きく影響する。
- 小さ過ぎると
- 収束後は安定するものの、
- 収束までに時間がかかり過ぎる。
- 大き過ぎると
- 素早く学習官僚するものの、
- 発散(≒ 極小値周辺を行ったり来たり)する。
- 著しく大きい場合、学習するほど誤差が増える。
解決 †
- 一般的に、10^-1(0.1)~10^-6(0.000001)の間で調整。
- もしくは、学習率が自動調整されるような工夫がある。
勾配消失問題が起こる †
誤差逆伝播法の計算において入力層に近い手前の層まで学習が行き渡らなくなる現象
理由 †
- 誤差逆伝播法では奥にある出力層から、手前にある入力層へ順番に伝わる。
- 勾配の値は層を遡るほど1未満の値のかけ算する回数が増え小さくなる。
- このため、
- 手前の層ほど学習の際に用いる勾配の値が小さくなり、
- 手前の層ほど十分なパラメタの更新ができなくなる。
解決 †
により(事前学習とファイン・チューニングを用いず、)全体の学習ができるようになった。
ニューラルネットワークの色々 †
順伝播型ニューラルネットワーク(FNN) †
(Feedforward Neural Network: FNN)
ディープニューラルネットワーク(DNN) †
(Deep Neural Network: DNN)
DNNの説明は本項で行われています。
- ニューラルネットワーク内の層が多層(ディープ)化されている仕組み
- DNNを用いた近似は、非線形関数である活性化関数を何層にも
組み合わせることで多種・多様な強い表現力を獲得することが可能
- 線形の座標変換(アフィン変換)をしたモノに対して目盛の振り直しを行い、新しい非線形の座標系を作る。
"重み"によって"新しい非線形の座標系"を変えることで、現象を高次元の関数で近似することが出来る。
長短期記憶ニューラルネットワーク(LSTM) †
(Long short-term memory: LSTM)
特徴 †
- 長期的特徴と短期的特徴を学習することができる。欠点は計算量が多いこと。
- 長期依存が学習できない原因は勾配消失問題があり、
(遠くの層ほど勾配の大きさが小さくなってしまい、学習が進み難い)
過去10ステップ程しか記憶できなかったRNNに
過去1000ステップ以上の記憶を保持できる機能が追加されている。
- 勾配消失・爆発の問題
長期記憶を実現するCEC(記憶セル)
- 重み衝突(入力重み衝突、出力重み衝突)
3つのゲートを追加(Attention機構に近い)。
- 入力重み衝突:入力ゲート
- 出力重み衝突:出力ゲート
- 上記以外に、忘却ゲート
- 追加のニューロン
- ゲートをコントロールするニューロン
- セルへの入力を求めるニューロン
- 追加のニューロンへもCEC(記憶セル)の値を入力
LSTMでできること †
≒ RNNでできること
拡張形式、GRU †
- GRU(gated recurrent unit)
- ゲート付き回帰型ユニット
- LSTMの簡略版(ゲートの数が更新ゲートとリセットゲートの2つ)
- 更新ゲート:過去の情報をどれだけ取り込むかを決定する。
- リセットゲート:過去の情報をどれだけ捨てるかを決定する。
自己符号化器(AE:オートエンコーダ) †
特徴 †
- 教師あり、なし
- 入力データと一致するデータを出力することを目的とする教師なし学習
- データとしては教師なしだが(、学習としては)、入力データを用いた教師あり学習。
- 隠れ層の次元を小さくして情報量を小さくした特徴表現を獲得する。
(入力の情報を圧縮される。→ 学習の結果、重みとして要約される。)
- 入力したデータをエンコーダーで潜在変数に圧縮(次元削減・特徴抽出)し、
- 潜在変数からデコーダで復元(再び戻して出力)する。
- エンコーダーもデコーダもニューラルネットワーク
- 入出力が一致するように各エッジの重みを調整
出力と入力に対して誤差を算出し、その差が
小さくなるように誤差逆伝播法を用い重みを学習する。
- 種類
様々な種類があるもよう。
- 変分AE(VAE : Variational auto-encoder)
- スタック型AE
- スパースAE
- ディープAE
- デノイジングAE
- , etc.
AEでできること †
様々な用途で利用されている。
AEの歴史 †
元々、(入出力兼務の)可視層と隠れ層の2層のネットワークだが、
- 展開すれば、3層のニューラルネットワークと ≒ のものだった。
- AEのポイントは、可視層より隠れ層の次元(数)を少なくしてある(情報の圧縮)。
- このAEを積み重ね、ディープAE、正確には、積層AEを作成(ジェフリー・ヒントン)。
層の積み重ねは、事前学習とファイン・チューニングによって達成される。
- はじめに事前学習を行い層を積み重ねていく。
- 最上部に層を足し、教師あり学習にする(?)
- 最後の仕上げにファイン・チューニング(全体で再学習)する。
※ AEは、勾配消失問題を事前学習とファイン・チューニングに
よって解決しニューラルネットワーク発展の礎となった。
制限ボルツマン・マシン(RBM) †
特徴 †
- Restricted Boltzmann Machine
- ボルツマン・マシンは変数の組合せが
どのような頻度で出現するかを確率分布で表現する。
- 深層信念ネットワーク(2006, ジェフリー・ヒントン)
- AEに「制限付きボルツマンマシン」と言う手法を用いる。
- 積層AEと同様に事前学習を用いた手法
RBMでできること †
3D DNN †
アプローチ †
- 2Dベースのアプローチを結集する2D based approach
- 点群NNを適応するPoint cloud based approach
- PointNet?
- PointNet?++
- VoteNet?
- 画像から得た結果と点群NNをフュージョンするアプローチ
- 点群NNで点群を前処理(エンコード)した後に
2Dベースのアプローチを適応するPointCloud?+2Dアプローチ
- 順不同なデータ構造
- 非自明な隣接関係(畳み込み
- 回転・並進の取り扱いが難しい
3D DNNでできること †
深層生成ネットワーク(DGN) †
特徴 †
- 生成タスクとは
- 訓練データの分布を推論し、同じ分布のデータを生成する。
- 潜在的空間を学習することによって、様々な表現を取ることができる。
- 画像生成では変分オートエンコーダ(VAE)を使う。
AEを活用、学習データが何らかの分布に基づいて生成されていると仮定
- エンコーダ:入力を潜在空間上の特徴量で表す
- デコーダ:潜在空間から元の次元に戻す
- 潜在空間:何かしらの分布を仮定した潜在空間を学習
DGNでできること †
敵対的生成ネットワーク(GAN) †
(Generative Adversarial Network: GAN)
特徴 †
本物の画像と見分けのつかない画像を出力する。
- 教師なし学習で使用される人工知能アルゴリズムの一種
- ゼロサムゲームフレームワークで互いに競合する
2つのニューラルネットワークのシステムによって実装される。
- Generator:生成側は識別側を欺こうと学習
・Generatorは入力にノイズを受け取る。
・本物の画像データは受け取らない。
・学習が進むにつれどんどん精度の高い画像を生成できるようになる。
・最終的に学習が十分に完了すると、Generatorのみで画像を生成できる。
- Discriminator:識別側はより正確に識別しようと学習
・Discriminatorは本物の画像データとGeneratorの生成した画像データを受け取る。
・入力が本物の画像データである確率を出力する。
・学習が終わると不要になる。
- 2つのネットワークの競合関係は、損失関数を共有させることで表現される。
- Generatorはロス関数の値を小さくすることを目的に学習させる。
- Discriminatorはロス関数の値を大きくすることを目的に学習させる。
GANでできること †
- データの特徴を抽出して学習し、実在しないデータを生成できる(生成モデル)。
深層Qネットワーク(DQN) †
(Deep Q-Network: DQN)
特徴 †
- 深層強化学習のアルゴリズム
- 強化学習の構造中に深層学習ニューラルネットワークを埋め込む。
- 連続値の行動とそれに伴う高い報酬(Q)が得られるように学習する。
DQNでできること †
深層強化学習の事例を参照。
参考 †
Wikipedia †
YouTube? †
, etc. †
Blog †
Neural networks and deep learning †
mizu-mi blog †