概要
ディープラーニングに関する言葉をよく忘れるので、自分用に辞書のようなものを作成しました。
基礎・構成要素
ノード / ニューロン / ユニット
値が渡されたら、処理をして次に渡す機能をもつ部品。
レイヤー / 層
同じ階層のノードをまとめたもの。
重み / パラメータ
伝播されたデータに対してかける係数。
バイアス
前のレイヤーから伝播された値とは別に存在する、各ユニットへのインプットデータ。
学習率 / 学習係数
1回の重み更新(学習)で、どのくらい更新するかの度合い。
局所解 / 局所的最適解
近傍では最適な解と判断される点。広域で見たときに決して最適解とはなるわけではない。
鞍点
あるパラメータの勾配は上がるが、別の勾配は下がる点。
順伝播法 / フォワードプロパゲーション
入力層から、インプットデータを順々に伝播させてネットワークを通して出力層まで演算結果を出力する方法。
誤差逆伝播法 / バックプロパゲーション
合成関数の微分連鎖律によって、損失関数の偏微分結果と各ユニットに対するインプットデータを利用し、出力層から入力層に向かって微分結果を逆伝播させることで、各パラメータの勾配を求める方法。
バッチ正規化 (Batch Normalization)
各レイヤーのインプットを分散が一定になるように変換すること。
勾配消失・爆発を防いだり、過学習を防ぐ効果がある。
各インプットを以下のように変換。
\hat{x^{(k)}} = \frac{x^{(k)}-E[x^{(k)}]}{\sqrt{Var[x^{(k)}] + \varepsilon}}
(hatが変な位置になる...)
早期終了 / 早期打ち切り (Early Stopping)
過学習をしないように、途中で学習を打ち切ること。
学習用・テスト用データとは別に過学習の検証用データを持っておき、学習毎に学習用データと検証用データの評価誤差を監視。誤差が広がってしまったら学習をストップする。
正則化
過学習を抑えるためのテクニック。
L1正則化
正則化項 $\lambda R(\mathbf{w})$ を損失関数に加える。
R(\mathbf{w})=\sum_{i=1}|w_i|
特定のパラメータが0に近づくように、学習が進む。インプットにあきらかな不要なものがある場合に有効。
L2正則化
正則化項 $\lambda R(\mathbf{w})$ を損失関数に加える。
R(\mathbf{w})=\sum_{i=1}w_i^2
$w_i$それぞれが小さくなるように、学習が進む。汎用性を高めたいときに利用。
ドロップアウト
いくつかのノードをランダムに不活性化させて学習することで、過学習を防ぐテクニック。
活性関数(activation function)
恒等関数(liner / identity)
入力をそのまま出力する。
回帰の出力層で使われる。
f(x)=x
ステップ関数(step)
最適化のための勾配に基づくアプローチが出来ないため、今はほとんど使われない。
f(x) =\left\{
\begin{array}{ll}
1 \quad (x \geq 0) \\
0 \quad (x \lt 0)
\end{array}
\right.
シグモイド関数 / ロジスティック関数(sigmoid / logistic sigmoid )
0~1を滑らかにとる関数で、微分が容易。
ただし、勾配消失があり、スパース性はなし。
f(x) = \frac{1}{1+e^{-x}}
ReLU(ランプ関数)
0以上の場合に恒等関数となる。
最も良く利用されている活性関数。
スパース性があり、入力が0以上で微分が常に1になるため計算スピードも速い。
f(x) =\left\{
\begin{array}{ll}
x \quad (x \geq 0) \\
0 \quad (x \lt 0)
\end{array}
\right.
Thanh(ハイパボリックタンジェント)
Sigmoidを下に引き伸ばした感じ。
同じく、勾配消失があり、スパース性はなし。
f(x) = \frac{2}{1+e^{-2x}}-1
ソフトプラス(softpuls)
ReLUを滑らかにした形。
初期化においてロバストになるはたらきがある。
f(x) = \ln(1+e^x)
elu
ReLUの派生で、出力の平均を0に近くする。
f(x) =\left\{
\begin{array}{ll}
x \quad (x \geq 0) \\
\alpha(e^x-1) \quad (x \lt 0)
\end{array}
\right.
ソフトマックス(softmax)
出力層で使う活性関数で、基本的に分類で使われる。
他のものと違い、同一レイヤーすべての値を使用して算出され、同一レイヤーの出力合算が1になる。
f(x_i) = \frac{exp(x_i)}{\sum_{k} exp(x_k)}
勾配消失(vanishing gradient)・勾配爆発
バックプロパゲーションにて、微分結果を逆伝播していくうちに0に収束してしまい、上位レイヤーで勾配が消失してしまうことを、勾配消失。逆を勾配爆発という。
重みの更新が適切にされずに学習がうまくいかなくなる。
損失関数 loss / 誤差関数 error / コスト関数 cost / 目的関数 objective
名前の違い Qiita : 目的関数、コスト関数、誤差関数、損失関数いろいろあるけど、なにが違うのかを検討
二乗誤差(MSE : mean squared error)
回帰で利用される。正規分布を仮定した際の最尤推定。
L(x) = \frac{(t-y(x))^2}{2}
クロスエントロピー誤差
分類で使用される損失関数。
正解$t$の確率分布から得られるエンコード方法で予測の確率分布をエンコードしたときの差を表す。そのため、出力がsoftmax関数などで正規化する必要がある。
L(x) = -\sum_{k}t_k\log y_k(x)
ヒンジ損失
SVMで使われる損失関数。
同じく出力がsoftmaxなどで正規化されている必要がある。
L(x) = \sum_{k}max(0, 1-t_k y_k(x))
ε-許容損失
SVMの回帰で使われる損失関数
L(x) = max(0, |1-t y(x)| - \varepsilon)
勾配降下法
最急降下法(バッチ勾配降下法 / バッチ学習)
全データの誤差の合計を使って勾配を計算し、重みを更新する方法。データ量が多いと大変。
二乗誤差の誤差合計
L(w)=\frac{1}{2}\sum_{n=1}^{N}( t_n -y(x_n;w) )^2
クロスエントロピー誤差の誤差合計
L(w) = -\sum_{n=1}^N \sum_{k=1}^K t_{nk}\log y_k(x_n;w)
確率的勾配降下法(SGD)
データ1つずつランダムに取り出して1つのデータの誤差を使って、勾配を計算して重みを更新する方法。最急降下法より、局所解に陥りにくい。
$\eta$は学習率で0.01とか。
\mathbf{w}^{t + 1} \gets \mathbf{w}^{t} - \eta \frac{\partial L(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}
ミニバッチ勾配降下法 / Mini-Batch SGD
データを複数個セット(ミニバッチ)でランダムに取り出して、重みを更新する方法。
エポック(epoch)
学習回数の数え方で、学習データを使った回数。パラメータを何回更新したとしても、学習データを使い切って1エポックとカウントする。
イテレーション数
重みを更新する回数。学習の回数。
最適化
良く学習が進むように重みの更新の仕方を工夫
モメンタム法(慣性)
前回の更新と同じ方向なら加速させて、逆なら減速させるように調整したもの。$\alpha$は減衰率で0.9とか。
\mathbf{v}^{t + 1} = \alpha \mathbf{v}^{t} - \eta \frac{\partial L(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}} \\
\mathbf{w}^{t + 1} = \mathbf{w}^{t} -\mathbf{v}^{t + 1}
NAG(Nesterov accelerated gradient)
モメンタム法の変形版で、勾配計算でも前回の更新差を考慮に入れることで、向きが変わったときに、一歩前で減速できる。
\mathbf{v}^{t + 1} = \alpha (\mathbf{v}^{t}) - \eta \frac{\partial L(\mathbf{w}^{t}+ \alpha (\mathbf{v}^{t}))}{\partial \mathbf{w}^{t}}
\\
\mathbf{w}^{t + 1} = \mathbf{w}^{t} -\mathbf{v}^{t + 1}\\
AdaGrad
個々のパラメータに対して個別の学習率で更新できる。そして、学習率を恣意的に決めずに自動で調整してくれる方法。ただし、学習が進むと、$h_t$は累積増加していき、学習率が減少してパラメータがちょっとしか更新されなくなる。
$\varepsilon$は$10^{-8}$、$h_0$は$0$、$\alpha$は$0.001$など。
h_t = h_{t-1} + \frac{\partial L(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}^2 \\
\\
\mathbf{w}^{t + 1} = \mathbf{w}^{t} - \frac{\alpha}{ \sqrt{h_t}+\varepsilon} \frac{\partial L(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}
RMSprop
AdaGradeを改良したもの。過去の勾配の影響で$h_t$が大きくなる問題を、抑え目になるように調整したもの。
$\gamma$は$0.9$など。
h_t = \gamma h_{t-1} + (1-\gamma) \frac{\partial L(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}^2 \\
\\
\mathbf{w}^{t + 1} = \mathbf{w}^{t} - \frac{\alpha}{ \sqrt{h_t}+\varepsilon} \frac{\partial L(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}
AdaDelta
RMSpropをさらに改良したもの。初期学習パラメータ$\alpha$を取り除いた。
$\gamma = 0.95$, $\varepsilon = 10^{-6}$ぐらい。
h_t = \gamma h_{t-1} + (1-\gamma) \frac{\partial L(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}^2\\
\\
v_t = \frac{\sqrt{s_t + \varepsilon}}{\sqrt{h_t + \varepsilon}}\frac{\partial L(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}\\
\\
s_{t+1} = \gamma s_t + (s- \gamma)v_t^2\\
\\
\mathbf{w}^{t + 1} = \mathbf{w}^{t} - v_t
Adam
モメンタム法とRMSpropを組み合わせた方法。$m_t$は積率で推定した平均、$v_t$は分散。学習のはじめのほうでの初期値($m_0=0$, $v_0=0$)の影響を抑えるため、$\hat{m}, \hat{v}$としている。
m_{t+1} = \gamma_1 m_t + (1- \gamma_1) \frac{\partial L(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}} \\
v_{t+1} = \gamma_2 m_t + (1- \gamma_2 ) \frac{\partial L(\mathbf{w}^{t})}{\partial \mathbf{w}^{t}}^2 \\
\hat{m} = \frac{m_{t+1}}{1- \gamma_1^t}\\
\hat{v} = \frac{v_{t+1}}{1- \gamma_2^t}\\
\\
\mathbf{w}^{t + 1} = \mathbf{w}^{t} - \alpha \frac{\hat{m}}{\sqrt{\hat{v}} + \varepsilon}
イメージ
Images credit: Alec Radford.
レイヤー・結合の種類
全結合層 / Dense / Full connected layer/ Affine layer
隣接するすべてのユニットを結合する方法。
畳み込み層 / Convolution layer
フィルターと呼ばれる正方データを対象データ上をスライドさせて、重なる部分のデータとフィルターの積和を計算する。
プーリング層 / Pooling layer
データを圧縮する。
Max pooling
対象領域の最大値を残して集約する手法
Average pooling
対象領域の平均で集約する手法
アップサンプリング(UpSampling) / アンプーリング
Poolingの逆で、元のデータから引き伸ばす。
Skip / Residual
複数前の情報を使って、複数層スキップして結合する方法。ResNetで使われる。
Dilated Convolution / Atrous Convolution / Convolution with holes
畳み込みの積和計算を、間をあけて計算して出力する。
代表的な手法
CNN
隠れ層に畳み込み層とプーリング層をもつもの。
フィルタ (filter) / カーネル (kernel) / 特徴検出器 (feature detector)
畳み込みを行うスライド窓のこと。
ストライド (strides)
フィルタをいくつ移動させるか。フィルタの適用する位置間隔。
zero padding
周りを0で埋めて、端のデータの特徴もちゃんと捉えられるようにする。また、出力サイズを調整することも可能。
特徴マップ / feature map
畳み込み層の出力データのこと。
チャンネル
ここ↓ の次元。グレースケールはチャンネル1。RGBカラーはチャンネル3。
転移学習(transfer learning) / 再学習(Fine-tuning)
一度、学習した重み(学習済みモデル:Pre-trained Model)を利用して、再度学習をおこなうこと。
RNN / リカレントニューラルネットワ / 再帰型ニューラルネット/ 回帰型ニューラルネット
時系列データ、前後のデータに意味のあるデータに対して、その特徴を学習できるもの。
中間層に出力を自らの入力とする帰還路をもつ。
ただし、長期的な特徴を学習することは困難。
LSTM
時系列データにおいて、RNNより長期のデータの特徴を学習できるディープラーニング。
RNNの中間層をLSTM-Blockと呼ばれる、状態を記憶するメモリセルと、記憶を制御する忘却ゲートをもったものに置き換えられたもの。
VAE(Variational Autoencoder)
データの潜在変数 $z$ を確率分布とした、生成モデル。
入力データをニューラルネットで潜在変数に変換し(Encode)、潜在変数からまたニューラルネットで入力データと同じ空間に変換(Decode)して新たなデータを生成する。
GAN(Generative Adversarial Network) / 敵対的生成ネットワーク
データを生成するニューラルネット(generator)と、データが本物データかgeneratorによって生成されたデータかを識別するニューラルネット(discriminator)を使った、生成モデル。
R-CNN
物体検知の代表的な手法。Selective Searchで物体候補を探し、CNNによって対象部分の特徴mapを生成して分類する。
YOLO
物体検知において、End-to-Endで学習可能な方法。はじめにグリッドにデータを分割しておき、そのセルごとに分類とボックスの位置・縦横の回帰を行う。
フレームワーク
Tensorflow
ディープラーニングの実装において、世界でもっとも利用されているテンソル計算用のフレームワーク。
Googleが開発。計算グラフを記載して走らせる、Define and Run。
ソースコードを変更しなくてもGPUを利用できる。
Keras
Tensorflowのラッパーで(Theano/CNTKもバックエンドに使える)、実装が非常に容易なので初心者におススメ。
レイヤーを重ねるだけでネットワークを構築でき、非常に直感的。
Tensorflowに続き、人気No2。
Chainer
日本の企業Preferred Networksが開発した国産フレームワーク。動的に計算グラフが構築できるDefine by Runで、計算グラフが記載しやすい。Pythonで記載されている。
Pytorch
最近人気が出てきているフレームワーク。ChainerのForkで、facebookが中心に開発。
研究者の利用が多く、非常に高速でコードの記載も難しくない。
Caffe / Caffe2
古くからあるフレームワーク。非常に高速だが、記載するコードが長くなる。
Theano
Python用ディープラーニングの元祖フレームワーク。しかし、開発が終了するそうです。
CNTK
Microsoftが開発しているがオープンソース。当初C++しか使えなかったが、現在はPythonも使えるようになっている。複数台でのGPU処理が得意。
Deeplearning4j
JVM上で動くディープラーニングのフレームワークでJavaやScala用。HadoopやSparkと連携できる。
ランキング
環境
CUDA
NVIDIA社が出しているGPUを使うための統合開発環境。
Colaboratory
Googleドライブにて環境構築なしでJupyter notebookにてGPUを利用できるサービス。
時間制限はあるが、無料でGPUを利用できる。
おわり
辞書というにはまだ貧弱なので、これから更新していきたいです。
誤りがありましたら、ご指摘いただけたら嬉しいです。