Help us understand the problem. What is going on with this article?

ディープラーニング辞書

More than 1 year has passed since last update.

概要

ディープラーニングに関する言葉をよく忘れるので、自分用に辞書のようなものを作成しました。

基礎・構成要素

ノード / ニューロン / ユニット

値が渡されたら、処理をして次に渡す機能をもつ部品。

レイヤー / 層

同じ階層のノードをまとめたもの。

重み / パラメータ

伝播されたデータに対してかける係数。

バイアス

前のレイヤーから伝播された値とは別に存在する、各ユニットへのインプットデータ。

学習率 / 学習係数

1回の重み更新(学習)で、どのくらい更新するかの度合い。

局所解 / 局所的最適解

近傍では最適な解と判断される点。広域で見たときに決して最適解とはなるわけではない。

Screenshot 2018-03-13 12.14.01.png

鞍点

あるパラメータの勾配は上がるが、別の勾配は下がる点。

Screenshot 2018-03-13 12.17.54.png

順伝播法 / フォワードプロパゲーション

入力層から、インプットデータを順々に伝播させてネットワークを通して出力層まで演算結果を出力する方法。

誤差逆伝播法 / バックプロパゲーション

合成関数の微分連鎖律によって、損失関数の偏微分結果と各ユニットに対するインプットデータを利用し、出力層から入力層に向かって微分結果を逆伝播させることで、各パラメータの勾配を求める方法。

Qiita 誤差逆伝播法のノート:誤差逆伝播法のまとめ

バッチ正規化 (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に近づくように、学習が進む。インプットにあきらかな不要なものがある場合に有効。

Screenshot 2018-03-13 12.38.52.png

L2正則化

正則化項 $\lambda R(\mathbf{w})$ を損失関数に加える。

R(\mathbf{w})=\sum_{i=1}w_i^2

$w_i$それぞれが小さくなるように、学習が進む。汎用性を高めたいときに利用。

Screenshot 2018-03-13 12.38.40.png

ドロップアウト

いくつかのノードをランダムに不活性化させて学習することで、過学習を防ぐテクニック。

活性関数(activation function)

恒等関数(liner / identity)

入力をそのまま出力する。
回帰の出力層で使われる。

f(x)=x

liner.png

ステップ関数(step)

最適化のための勾配に基づくアプローチが出来ないため、今はほとんど使われない。

f(x) =\left\{
\begin{array}{ll}
1 \quad (x \geq 0) \\
0 \quad (x \lt 0) 
\end{array}
\right.

step.png

シグモイド関数 / ロジスティック関数(sigmoid / logistic sigmoid )

0~1を滑らかにとる関数で、微分が容易。
ただし、勾配消失があり、スパース性はなし。

f(x) = \frac{1}{1+e^{-x}}

sigmoid.png

ReLU(ランプ関数)

0以上の場合に恒等関数となる。
最も良く利用されている活性関数。
スパース性があり、入力が0以上で微分が常に1になるため計算スピードも速い。

f(x) =\left\{
\begin{array}{ll}
x  \quad  (x \geq 0) \\
0  \quad (x \lt 0) 
\end{array}
\right.

relu.png

Thanh(ハイパボリックタンジェント)

Sigmoidを下に引き伸ばした感じ。
同じく、勾配消失があり、スパース性はなし。

f(x) = \frac{2}{1+e^{-2x}}-1

htan.png

ソフトプラス(softpuls)

ReLUを滑らかにした形。
初期化においてロバストになるはたらきがある。

f(x) = \ln(1+e^x)

softplus.png

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.

elu.png
$\alpha=0.7$

ソフトマックス(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

データを複数個セット(ミニバッチ)でランダムに取り出して、重みを更新する方法。

Screenshot 2018-03-13 13.37.08.png

エポック(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} 

Screenshot 2018-03-13 14.39.06.png

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}\\

Screenshot 2018-03-13 14.39.11.png

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}

イメージ

opt2.gif

opt1.gif

Images credit: Alec Radford.

レイヤー・結合の種類

全結合層 / Dense / Full connected layer/ Affine layer

隣接するすべてのユニットを結合する方法。

畳み込み層 / Convolution layer

フィルターと呼ばれる正方データを対象データ上をスライドさせて、重なる部分のデータとフィルターの積和を計算する。

プーリング層 / Pooling layer

データを圧縮する。

Max pooling

対象領域の最大値を残して集約する手法

Average pooling

対象領域の平均で集約する手法

アップサンプリング(UpSampling) / アンプーリング

Poolingの逆で、元のデータから引き伸ばす。

Skip / Residual

複数前の情報を使って、複数層スキップして結合する方法。ResNetで使われる。

ResNet.png

Dilated Convolution / Atrous Convolution / Convolution with holes

畳み込みの積和計算を、間をあけて計算して出力する。

代表的な手法

CNN

隠れ層に畳み込み層とプーリング層をもつもの。

フィルタ (filter) / カーネル (kernel) / 特徴検出器 (feature detector)

畳み込みを行うスライド窓のこと。

ストライド (strides)

フィルタをいくつ移動させるか。フィルタの適用する位置間隔。

zero padding

周りを0で埋めて、端のデータの特徴もちゃんと捉えられるようにする。また、出力サイズを調整することも可能。

特徴マップ / feature map

畳み込み層の出力データのこと。

チャンネル

ここ↓ の次元。グレースケールはチャンネル1。RGBカラーはチャンネル3。

Screenshot 2018-03-13 14.47.12.png

転移学習(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と連携できる。

ランキング

Screenshot 2018-03-13 14.52.46.png

環境

CUDA

NVIDIA社が出しているGPUを使うための統合開発環境。

Colaboratory

Googleドライブにて環境構築なしでJupyter notebookにてGPUを利用できるサービス。
時間制限はあるが、無料でGPUを利用できる。

おわり

辞書というにはまだ貧弱なので、これから更新していきたいです。
誤りがありましたら、ご指摘いただけたら嬉しいです。

参考

Visualising Activation Functions in Neural Networks

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした