「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
モデル †
- 脳機能に見られるいくつかの特性に類似した数理的モデル(確率モデルの一種)
- シナプスの結合によりネットワークを形成した人工ニューロン(ノード)が、
学習によってシナプスの結合強度を変化させ、問題解決能力を持つようなモデル全般。
- 実際に生物の神経系のシミュレーションであるか否かについては
議論があるため人工ニューラルネットワークなどと呼ばれることもある。
学習 †
- 機械学習の、
・学習フェーズでは、信号は逆方向に伝播する。
・推論フェーズでは、信号は順方向に伝播する。
- 線形の座標変換(アフィン変換)をしたモノに対して
目盛の振り直しを行い新しい非線形の座標系を作る。
「重み」によって「新しい非線形の座標系」が変わる。
- 「重み」のパラメタ(w1, w2, θ(-b))の決定は人手によって行われる。
という問題を、データから自動で「重み」のパラメタを学習することで解決する。
- この「重み」は、ネットワーク構造が複雑であっても、微分可能な形で記述できていれば(何が?)、
勾配法によって目的関数(損失関数)を最適化することで(収束するかどうかは別にして)求めることが出来る。
構造 †
第0層(入力層 †
そのままの値を出力(出力に重みを掛けられる。
第1層(中間層(隠れ層 †
- 入出力変換後、重みを掛けて多分岐。
- 以下のような関数を使用できる。
- 任意の実数を非線形に変換出来る関数
- 誤差逆伝播法を用いるため微分できる関数
第2層(出力層 †
誤差の計算と重みの更新 †
出力と教師信号の誤差の計算をし、
2→1→0層と層の重みを更新していく(誤差逆伝播法)
ResNet? †
- ニューラルネットワークのモデルを深くすることを可能にした。
- ある層で求める最適な出力を学習するのではなく、層の入力を参照した残差関数を学習する。
数学的に †
関数 †
関数はニューラルネットワーク全体で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┘
活性化関数 †
- 各層の出力する前に、出力結果をどの程度活性(発火)させるかを決める関数。
- 共通点
- 非線形な関数
- 0 <= 出力信号 <= 1 に収める。
- 入力信号が重要な時に1に近い、重要でない時0に近い値を返す。
- ステップ関数:0, 1の信号
・単純パーセプトロンの活性化関数はステップ関数。
・ある閾値を超えたら「1」、それ以外は「0」を返す関数。
- ニューラルネットワークでは、非線形な関数を使用する必要がある。
- 線形関数を用いてはならないのは、多層化の意味が無くなるため。
- 例 : 線形な h(x) = cx を多層化しても h(h(h(x))) = cccx となり1層で表現可能。
ステップ関数 †
実装 †
なんとなくAPI仕様を知らないと難しい感じ。
グラフ †
-5.0 ~ 5.0までの0.1刻みのプロットをステップ関数にかけてグラフ化する。
"""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()
シグモイド関数 †
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刻みのプロットをシグモイド関数にかけてグラフ化する。
"""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以下なら0を出力する。
- 入力が0を超えていればそのまま出力する。
┌
│0 ( a <= 0 )
y = h(a) = <
│a ( a > 0 )
└
主流 †
- ...は勾配消失問題を緩和できる。
・微分結果が 0 or 1 なので、
・ただし、0(の時は)では学習が上手くいかない。
- Leaky ReLU関数
- x < 0においてわずかな傾きをもっている。
- 微分値が0になることはなくなり、ReLUよりも勾配消失しにくい。
- Parametric ReLU
...
- Randomized ReLU
...
実装 †
"""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()
推論と学習 †
ニューラルネットワークの問題点 †
概要 †
- 従来手法よりも過学習を起こし易い。
- データサンプルは、パラメータの10倍あると良い。
- 少ないデータ量でもできるだけ性能を落とさずに済むような工夫が新たに必要。
解決 †
- 早期終了(early stopping)
精度が頭打ちになった段階で学習を打ち切る。
- バッチ正規化(Batch Normalization)
- 特定の中間層の出力に正規化の処理を施す手法
- 畳み込み層の場合は、channel毎に各サンプルのピクセル値を正規化
- 内部共変量シフト(学習でパラメタの調整が分布の違いに対応する)を防ぐ。
- 学習時間を短縮できる
- 過学習が抑制される
- 初期値の影響が小さくなる
- 勾配消失問題を解消する方法の一つでもある。
- データ拡張(data augmentation)
データにノイズ(拡大・縮小、反転、回転、並進)を加えて拡張する。
- 処理と効果
- 実際に得られそうな拡張のみ行う(例えば上下固定なら回転はしない等)。
- これによりノイズに「頑健」(=統計用語で「決定的でない要因に鈍感」)になる。
- 確率的な適用
処理量を抑えるためミニバッチごとに確率的にかける。
- leakageの防止
・拡張元画像が同じ拡張画像をtrainデータとtestデータに混ぜないようにする。
・データ分割後にデータ拡張を行う順番で処理を行えばleakageしない。
学習率の調整が難しい †
概要 †
学習率とは、
- 一回の学習でどれだけ学習るか?
=どれだけパラメタ更新するか?で、
- 学習率が従来の機械学習の手法よりも大きく影響する。
- 小さ過ぎると
- 収束後は安定するものの、
- 収束までに時間がかかり過ぎる。
- 大き過ぎると
- 素早く収束するものの、
- 極小値周辺を行ったり来たり収束し難くなる。
- 著しく大きい場合、学習するほど誤差が増える。
解決 †
- 一般的に、10^-1(0.1)~10^-6(0.000001)の間で調整。
- もしくは、学習率が自動調整されるような工夫がある。
勾配消失問題が起こる †
誤差逆伝播法の計算において入力層に近い手前の層まで学習が行き渡らなくなる現象
理由 †
- ニューラルネットワークの学習(誤差逆伝播法)では
奥にある出力層から、手前にある入力層へ順番に伝わる。
- 勾配の値は層を遡るほど1未満の値のかけ算する回数が増え小さくなる。
- このため、
- 手前の層ほど学習の際に用いる勾配の値が小さくなり、
- 手前の層ほど十分なパラメタの更新ができなくなる。
解決 †
により(事前学習とファイン・チューニングを用いず、)全体の学習ができるようになった。
ニューラルネットワークの色々 †
ディープニューラルネットワーク(DNN) †
(Deep Neural Network: DNN)
- ニューラルネットワーク内の層が多層(ディープ)化されている仕組み
- DNNを用いた近似は、非線形関数である活性化関数を何層にも
組み合わせることで多種・多様な強い表現力を獲得することが可能
- 線形の座標変換(アフィン変換)をしたモノに対して目盛の振り直しを行い、新しい非線形の座標系を作る。
"重み"によって"新しい非線形の座標系"を変えることで、現象を高次元の関数で近似することが出来る。
再帰型ニューラルネットワーク(RNN) †
(Recurrent Neural Network: RNN)
特徴 †
- 再帰構造
- 入力層→隠れ層
- 隠れ層→隠れ層(再帰)
- 隠れ層→出力層
- 時間順序などを持ち、入力の長さが変わる(可変長)、系列データの入力を扱える。
- 過去の系列を記憶した上で将来の予測できる。
- 一時刻前の中間層の出力を自らの入力に戻す。
- 情報を一時的に記憶して振る舞いを動的に変化させる。
RNNでできること †
系列データ(順序関係に重要な意味のあるデータ) の解析
時系列データの変動 †
- 長期変動(トレンド)
- 通り長期に渡る全体的な上がり下がりの変動
- 毎日(週/月/年)の、より長い期間で同じ傾向が見れられる。
- 周期変動(季節性)
- 一定期間ごとに繰り返される周期的な上下変動
- 年単位や月単位、週単位の周期等が考えられる。
- 不規則変動(残差)
- 長期変動、周期変動を除去したあとに残った傾向
- ランダムに発生するであろうノイズ
教師データの作成 †
誤差計算の方法 †
BPTT法(Backpropagation Through Time: 通時的誤差逆伝播法)と呼ばれる。
- 時間方向に遡って通常のDNNと同様に誤差逆伝播法による学習ができる。
- サンプル毎ではなくタイムステップ毎に誤差を算出
- 二乗誤差関数(回帰)、クロスエントロピー誤差(分類)
長短期記憶ニューラルネットワーク(LSTM) †
(Long short-term memory: LSTM)
特徴 †
- 再帰構造を横展開して長期記憶を実現するキャリーを付ける。
- 3つのゲートとセルを内部に持つ。
- ゲート付きRNNの一つ
- 長期依存が学習できない原因は勾配消失問題があり、
(遠くの層ほど勾配の大きさが小さくなってしまい、学習が進み難い)
過去10ステップ程しか記憶できなかったRNNに
過去1000ステップ以上の記憶を保持できる機能が追加されている。
- GRU(gated recurrent unit)
- ゲート付き回帰型ユニット
- LSTMの簡略版(ゲートの数が2つ)
LSTMでできること †
≒ RNNでできること
畳み込みニューラルネットワーク(CNN) †
(Convolutional Neural Network: CNN)
特徴 †
- 一般的な順伝播型ニューラルネットワークとは異なる。
- 画像分類(一般物体認識)において、圧倒的な性能を発揮した。
- 視覚神経系を模した畳み込み処理で画像から特徴抽出することで性能が出た。
CNNでできること †
- 物体検出、領域検出
- R-CNN
- Fast R-CNN
- Faster R-CNN
- FCOS
- YOLO
- 特定物体検出
- Musk R-CNN
Faster R-CNNにセグメンテーションを加えインスタンス・セグメンテーションを実現
パート †
CNNは大きく分けて2つのパートに分けることができる。
- 識別パート
脳の神経系を模した全結合層と出力層(≒ DNN)
- 全結合層を繰り返すことで最終的な出力を得る
- 得られた特徴量を活性化関数、ソフトマックス関数を用いてアウトプット
畳み込み層 †
- 視神経系(視覚を司る神経系)を模して画像から特徴抽出する。
- 全結合層に入力する特徴を取り出すために自動化された前処理。
- 畳み込み処理
- 画像のフィルタ処理+活性化関数
- 特徴マップを生成(様々な特徴を取り出す)
- 細かい(局所的な)特徴の組み合わせから、
大まかな(大局的、複雑な)特徴を捉えられる。
- 手前の階層 → 波長の光に反応
- 奥の階層に進むにつれ → 線の向き、折れ線の角、直線の交差に反応
- 最奥の階層 → 特定の模様(≒ 特定のカテゴリ)に反応
- 位置ずれや形の歪みに対する頑健性
特徴同士の位置関係で見る(絶対座標ではなく、相対座標で見る)。
- ただし、理論的な裏付けは無い。
生体の神経系を見よう見まねで模倣してみたら上手くいっただけで、
CNNが高性能を実現している理由は厳密には分かっていない。
- 特徴マップ
画像から切り取った「画像の一部領域」と特定のパターンを検出する「カーネルの行列」の内積を計算。
- この場合、「画像の一部領域」と「カーネルの行列」のサイズは同じにする。
- 位置を探し少しずつずらしながら計算を繰り返し、コレに重みを加味してスカラにする。
- 「画像の一部領域」と「カーネルの行列」のパターンが似ている場合、スカラの値は大きくなる。
- 一部領域の中心部分と同じ位置に計算したスカラを置き元画像と同じサイズの特徴マップを作る。
※ 1つのカーネルにつき1つの特徴マップが生成される。
プーリング層 †
特徴マップから位置のズレに対して頑強な特徴抽出を行う。
- カーネルで抜いた特徴が特徴マップ中のどの部分に位置するか?
フィルタで特徴マップ領域の最大値を抜く(MaxPooling?)。
- 出力が縮小され処理の計算量が減る。
- 位置ずれや形の歪みに頑健になる。
- フィルタで特徴マップを縮小されるので、再びカーネルと内積を計算する。
- 特定のパターンのパターン(模様)で内積が最大になるようなカーネルとフィルタは分類器になる。
- カーネルとフィルタが重みパラメタとして機能し誤差逆伝播法によって、この分類器は学習できる。
3D DNN †
アプローチ †
- 2Dベースのアプローチを結集する2D based approach
- 点群NNを適応するPoint cloud based approach
- PointNet?
- PointNet?++
- VoteNet?
- 画像から得た結果と点群NNをフュージョンするアプローチ
- 点群NNで点群を前処理(エンコード)した後に
2Dベースのアプローチを適応するPointCloud?+2Dアプローチ
- 順不同なデータ構造
- 非自明な隣接関係(畳み込み
- 回転・並進の取り扱いが難しい
3D DNNでできること †
敵対的生成ネットワーク(GAN) †
(Generative Adversarial Network: GAN)
特徴 †
- 教師なし学習で使用される人工知能アルゴリズムの一種
- ゼロサムゲームフレームワークで互いに競合する
2つのニューラルネットワークのシステムによって実装される。
- 2つのネットワークを競わせながら学習させるアーキテクチャ
- 識別NNの識別エラーが50%になるように、生成NNが学習する。
- 2つのネットワークの競合関係は、損失関数を共有させることで表現される。
- Generatorはロス関数の値を小さくすることを目的に学習させる。
- Discriminatorはロス関数の値を大きくすることを目的に学習させる。
GANでできること †
- データの特徴を抽出して学習し、実在しないデータを生成できる(生成モデル)。
- 変分オートエンコーダやボルツマンマシンなど
以前からある生成モデルと比べてより鮮明な画像の生成が可能。
深層Qネットワーク(DQN) †
(Deep Q-Network: DQN)
特徴 †
- 深層強化学習のアルゴリズム
- 強化学習の構造中に深層学習ニューラルネットワークを埋め込む。
- 連続値の行動とそれに伴う高い報酬(Q)が得られるように学習する。
DQNでできること †
深層強化学習の事例を参照。
自己符号化器(AE:オートエンコーダ) †
特徴 †
- ニューラルネットワークの一種で
- 入力データと一致するデータを出力することを目的とする教師なし学習
- 隠れ層の次元を小さくして情報量を小さくした特徴表現を獲得する。
- 入力したデータをエンコーダーで潜在変数に圧縮(次元削減・特徴抽出)し、
- 潜在変数からデコーダで復元(再び戻して出力)する。
- エンコーダーもデコーダもニューラルネットワーク
- 入出力が一致するように各エッジの重みを調整
出力と入力に対して誤差を算出し、その差が
小さくなるように誤差逆伝播法を用い重みを学習する。
- 種類
様々な種類があるもよう。
- 変分AE
- スタック型AE
- スパースAE
- ディープAE
- デノイジングAE
- , etc.
AEでできること †
様々な用途で利用されている。
AEの歴史 †
元々、(入出力兼務の)可視層と隠れ層の2層のネットワークだが、
- 展開すれば、3層のニューラルネットワークと≒のものだった。
- ポイントは、可視層より隠れ層の次元(数)を少なくしてある(情報の圧縮)。
- このAEを積み重ね、ディープAE、正確には、積層AEを作成(ジェフリー・ヒントン)。
層の積み重ねは、事前学習とファイン・チューニングによって達成される。
- はじめに事前学習を行い層を積み重ねていく。
- 最上部に層を足し、教師あり学習にする(?)
- 最後の仕上げにファイン・チューニング(全体で再学習)する。
※ AEは、勾配消失問題を事前学習とファイン・チューニングに
よって解決しニューラルネットワーク発展の礎となった。
制限ボルツマン・マシン(RBM) †
特徴 †
- Restricted Boltzmann Machine
- ボルツマン・マシンは変数の組合せが
どのような頻度で出現するかを確率分布で表現する。
- 深層信念ネットワーク(2006, ジェフリー・ヒントン)
- AEに「制限付きボルツマンマシン」と言う手法を用いる。
- 積層AEと同様に事前学習を用いた手法
RBMでできること †
参考 †
Wikipedia †
YouTube? †
Neural networks and deep learning †