トップページ -> データベース研究スタート -> ディープラーニング -> ディープラーニング知識体系
[サイトマップへ]  

ディープラーニングテキスト

「ディープラーニング」を使うときに必要な知識を、全てこのページにまとめます)。 (金子研究室学生諸君へ: 情報提供お願い)。

いまは、項目を a-z, あーん順に並べています。  

AdaDelata 法

M.Zeiler の AdaDelta 法は,学習率をダイナミックに変化させる技術

from keras.optimizers import Adadelta
optimier = Adadeota(rh=0.95)

M. Zeiler, Adadelta An adaptive learning rate method, 2012.

確率的勾配降下法 (SGD 法 をベースとしているが、 確率的勾配降下法が良いのか、Adadelta 法が良いのかは、一概には言えない.

その他 Adam 法なども知られる

Diederik Kingma and Jimmy Ba, Adam: A Method for Stochastic Optimization, 2014, http://arxiv.org/abs/1412.6980  

Batch Normaliation

Batch Normaliation とは、 ミニバッチ学習を行うとき、ミニバッチごとに正規化を行うこと.この結果として、バイアスはなくなる.

Keras で Batch Normalization を行うときは、次のように Dense と Activation の間に、「m.add(BatchNormalization)」を入れる。

from keras.layers.normalization import BatchNormalization
m.add(Dense(units=64, input_dim=len(X_train[0])))
m.add(BatchNormalization)
m.add(Activation('relu'))

ソフトマックス関数 (softmax)を活性化関数とするような層(レイヤ)では、BatchNormalization は行わないようです。

 

He の初期値

He らの方法 (2015年) では、前層のユニット数(ニューロン数)を n とするとき、 sqrt( 2 / n ) を標準偏差とする正規分布に初期化する. ただし、この方法は ReL U に特化した手法であるとされている. この方法を使うとき、層の入力は、正規化済みであること.

Kaiming He, Xiangyu hang, Shaoqing Ren and Jian Sun, Delving Deep into Rectifiers: Surpassing Human-Level, Performance on ImageNet Classification, pp. 1026^1-34.  

Keras の binary_crossentropy

Keras の binary_crossentropy は、 2クラスの 交差エントロピーを、 訓練 (training)での,損失関数として使うこと. logloss ともいう.  

Keras の categorical_crossentropy

Keras の categorical_crossentropy は、 多クラス交差エントロピーを、 訓練 (training)での,損失関数として使うこと. マルチクラス logloss ともいう. ラベルがバイナリ配列であり、その形状が (n_sample, nb_classes) であること. 2クラスの交差エントロピーを使いたいときは、binary_crossentropy を用いる。  

Early Stopping

Keras で Early Stopping を行うとき、次のようにコールバックを書く.

from kernel.callbacks import EarlyStopping
cb = EarlyStopping(monitor='var_loss', patience = 10)
 

Keras での訓練

訓練データ X_trainy_train (X_train は入力データの numpy 配列もしくは numpy 配列のリスト、y_train はクラス番号の numpy 配列)を用いて、 バッチサイズが 32,エポック数を 10 として訓練したいときには、次のコマンドを用いる.

m.fit(X_train, y_train, batch_size=32, epochs=10, validation_data=(X_test, y_test), callbacks=[cb])
 

Keras でのカーネルの初期化

次のプログラムの中の kernel_initializer の部分. 標準偏差を 0.01 になるように重みを設定している.

m.add(Dense(units=100, input_dim=len(768[0])), kernel.iniializer.TruncatedNormal(stddev=0.01))  
 

Keras でのバリデーション

Keras での訓練において,「validation_data」を付けることとで、バリデーションが行われる. このとき、バリデーションに使うデータ(X_test, y_test)をいろいろ変えながら、Kerasでの訓練を行い、結果(下のプログラムでは h)を見て、訓練の成否を判断する.

h = m.fit(X_train, y_train, batch_size=32, epochs=10, validation_data=(X_test, y_test), callbacks=[cb])
 

Keras でのモデルのコンパイル

Keras でのモデルのコンパイルは、 Keras での訓練 の過程を設定すること.

上のような場合、 Keras でのモデル m のコンパイルは,次の m.compile の行のように行う.

import sklearn.datasets
import sklearn.model_selection
import keras.utils
import numpy as np

iris = sklearn.datasets.load_iris()
X = iris.data
y = iris.target
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, train_size=0.5)
# 2次元の配列. 要素は float64, 最大値と最小値を用いて正規化
def normalizer(A):
    M = np.reshape(A, (len(A), -1))
    M = M.astype('float32')
    max = M.max(axis=0)
    min = M.min(axis=0)
    return (M - min)/(max - min)
X_train = normalizer(X_train)
X_test = normalizer(X_test)
# one-hot
y_train = keras.utils.to_categorical(y_train)
y_test = keras.utils.to_categorical(y_test)

import tensorflow as tf 
import keras
from keras.models import Sequential
m = Sequential()

from keras.layers import Dense, Activation
m.add(Dense(units=64, input_dim=len(X_train[0])))
m.add(Activation('relu'))
m.add(Dense(units=3))
m.add(Activation('softmax'))

m.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.SGD(lr=0.01, momentum=0.9, nesterov=True), metrics=['accuracy'])
m.fit(X_train, y_train, batch_size=32, epochs=10, validation_data=(X_test, y_test))

iris についての資料は iris.pdf [PDF ファイル]

上のプログラムの実行結果は下の図の通り。

上のプログラムで作成されるモデルは、次の通り。

訓練(学習)に追加に使うデータ: X_testy_test のペア

print(X_train)
print(y_train) 

訓練(学習)のあと、別のデータを使って「予測」をさせてみる

まず予測に使いたいデータの確認

print(X_test)

予測結果の確認

m.predict(X_test)
(参考)

もちろん、プログラム次第で、モデルはどのようにでも作ることができる。 入力の次元数が 784、ユニット(ニューロン)数 100, 100, 100の3層、クラス数 10、ドロップアウト 0.2 のとき、

m.add(Dense(units=100, input_dim=len(768[0])))
m.add(Activation('relu'))
m.add(Dropout('0.2'))
m.add(Dense(units=100))
m.add(Activation('relu'))
m.add(Dropout('0.2'))
m.add(Dense(units=100))
m.add(Activation('relu'))
m.add(Dropout('0.2'))
m.add(Dense(units=クラス数))
m.add(Activation('softmax'))
 

LReLU

LReLU (Leaky rectified linear unit) は,次の関数である.

f(x) = x (x>=0), alpha * x (x<0)

必ずしも、ReLU、LReLU のどちらかが優れているとうことはない.

Keras で LReLU を使うときは、次のように書く.

m.add(LeakyReLU(alpha=0.01)
 

Nesterov モメンタム

参考文献: http://www.cs.toronto.edu/~fritz/absps/momentum.pdf  

Python の numpy ベクトル

ベクトルは,要素の並び.各要素の添字は 0, 1, 2... のようになる. 下に,Python の numpy ベクトルのコンストラクタの例を示す.

import numpy as np
v = np.array([1, 2, 3])
print(v, v[0], v[1], v[2])

reshape の例は次の通り

X = X.reshape(len(X), 1)
 

one-hot エンコーディング

one-hot エンコーディング (one-hot encodinng は、クラス番号(カテゴリ番号)を,長さがクラス数(カテゴリ数)であるような数値ベクトルで、うち、1つだけが 1、残りが全て 0 になっているようなベクトルで表すこと. 1-of-k representation ともいう. クラス番号(カテゴリ番号)が 0, 1, 2, 3 の 4通りであるとき,one hot 表現では [1 0 0 0] [0 1 0 0] [0 0 1 0] [0 0 0 1] のように表す. Keras では,クラス番号(カテゴリ番号)を one hot 表現に変換するとき to_categorical 関数を用いる.

from keras.utils.np_utils import to_categorical
print( to_categorical(0, 4) )
print( to_categorical(1, 4) )
print( to_categorical(2, 4) )
print( to_categorical(3, 4) )
 

Python の numpy 配列

配列では,添え字が複数になる. 下に,Python の numpy 配列のコンストラクタの例を示す.

import numpy as np
M = np.array([[1, 2, 3], [4, 5, 6]])
print(M)
print(M[0,], M[1,])
print(M[1,0], M[1,1], M[1,2])
 

ReLU

ReLU (rectified linear unit) は,次の関数である.

f(x) = x (x>=0), 0 (x<0)

必ずしも、ReLU、LReLU のどちらかが優れているとうことはない.  

Tensorflow のベクトル

ベクトルは,要素の並び.各要素の添字は 0, 1, 2... のようになる. 下に,Tensorflow のベクトルのコンストラクタの例を示す.

import tensorflow as tf
v1 = tf.constant([1, 2, 3])
print(v1)

import numpy as np
np.array([1, 2, 3])
v2 = tf.constant( np.array([1, 2, 3]) )
print(v2)
 

Tensorflow の配列

配列では,添え字が複数になる. 下に,Tensorflow の配列のコンストラクタの例を示す.

import tensorflow as tf
M1 = tf.constant([[1, 2, 3], [4, 5, 6]])
print(M1)

import numpy as np
np.array([1, 2, 3])
M2 = tf.constant( np.array([[1, 2, 3], [4, 5, 6]]) )
print(M2)
 

エポック

訓練データを全て使い終わったら1エポックである. 確率的勾配効果法などでミニバッチ学習を行うとき、バッチサイズが100,訓練データ数が800であるとすると、 ミニバッチ学習を8回行うと1エポックである.80回行うと10エポックである.  

シグモイド関数 (sigmoid)

シグモイド関数 (sigmoid) は,f(x) = 1 / (1 + exp(-x))  

ソフトマックス関数 (softmax)

次元数 n のベクトル x に対するソフトマックス関数 (softmax) は,f(x[k]) = exp(x[k]) / (exp(x[1]) + exp(x[2]) + ... exp(x[n]))

ニューラルネットワークの,ある層(レイヤ)の出力が one-hot 表現の出力であるときに使用される.  

ステップ関数

ステップ関数は,f(x) = x (x < 0 のとき), 1 (x > = 0 のとき)  

ドロップアウト

訓練の途中で, ニューラルネットワークを構成するユニット(ニューロン)を無作為(ランダム)に除去すること. 過学習の防止に効果がある場合があるとされる.

参考文献: Improving neural networks by preventing co-adaptation of feature detectors, http://arxiv.org/abs/1207.0580  

ニューラルネットワーク

ニューラルネットワークは、人間の脳細胞を、信号が流れるネットワークと見立てたうえで、 個々の脳細胞を、 次の簡単な数理で組み立てるもの.

ニューラルネットワークでは「2+3」の答えは「5」である、「3+4」の答えは「7」であるというような訓練を多数繰り返すことによって、 コンピュータが、「2+4 の答えは、0 から 99 のうちいくつですか」という質問に答えることができるようになる. 画像の分析、音声の分析、コンピュータと人間の対話、翻訳などに広く用いられるようになってきた.、 コンピュータは、プログラムで動く.プログラムを人間が修正したり、調整しなくても、自動で賢くなるというのがニューラルネットワークの良さである. ニューラルネットワークは、自動の訓練により、改善されていく(一般のプログラムではそのようなことがない).

ニューラルネットワークの働きは、入力を与えると、答えが出てくるというものです. 質問が与えられたときに、多数の選択肢の中から 1つを選ぶことが得意です. 質問は、文章でも、画像でも、音声でも、それらの混合でも大丈夫です. 例えば、コンピュータに画像を見せて「男か女か」の答えを出す、年齢を「0から120の中から」答えるということができます. このとき、人間の介在は必要ありません。

ニューラルネットワークは 1980年d内に登場しました. ニューラルネットワークの技術革新として、 ドロップアウト法による過学習防止、ReLU法により、ニューラルネットワークの本質的課題であった勾配消失問題の解決、GPUプロセッサや EarlyStopping 法など、軽快動作の手法登場し、 「ディープラーニング」と呼ばれる、ニューラルネットワークが誕生しました. 用途によっては、プログラムを組み立てた場合よりも、高精度を示す場合があります。  

バイアス

バイアスは個々のユニット(ニューロン)が持つ値.ユニット(ニューロン)の発火のしやすさを表す値とされる.  

ミニバッチ学習

ミニバッチ学習は,訓練データの中から、「バッチ」あるいは「ミニバッチ」と呼ばれる少数を無作為に(ランダムに)選び出し,それを使って訓練を行うこと.  

モデル

この資料で「モデル」というときは,コンピュータの中に作られたニューラルネットワークのこと.  

ユニット(ニューロン)

ユニット(ニューロン)は, 複数の入力の総和に,バイアスを足したのち,当ユニット(ニューロン)に設定された活性化関数を適用して得られた値を出力する. ユニット(ニューロン)の入力と出力の間には 重みがある. ユニット(ニューロン)の出力には,重みが掛け合わされたのちに,次のユニット(ニューロン)の入力になる.

1つのユニット(ニューロン)は,複数の入力を取ることができる.出力は1つである.これら入力と出力は,次のいずれかの条件を満たす

層構造のニューラルワークでは, バイアスは,ユニット(ニューロン)ごとに違い, 活性化関数は,同じ層(レイヤ)のユニット(ニューロン)では同じものとするのが通例.  

ユニット(ニューロン)の発火

ユニット(ニューロン)の発火は、 所定のバイアスを超えたときに、1を出力すること.  

重み

ニューラルネットワークで,あるユニット(ニューロン)とユニット(ニューロン)が結合しているとき, 個々の結合には重みがある. 重みが大きいほど,当ユニット(ニューロン)の出力が強く,次のユニット(ニューロン)に渡される. 例えば、 あるユニット(ニューロン)が、別の2つのユニット(ニューロン)と結合していて、それら2つの出力を受け取るとき、 そのユニット(ニューロン)の入力は、w[1] * x[1] + w[2] * x[2] のよになる. w[1], w[2] は重み、 x[1], x[2] は2つのユニット(ニューロン)の出力である.  

重みの初期化

重みの初期化 (weights initialization)  

重みの方向ベクトル

重みが複数あるとき,それらは重みベクトルをなす. 重みが複数あり,それら重みをそれぞれ増やしたり減らしたりする量は,重みの方向ベクトルをなす.  

重みに関する損失関数の勾配

重みに関する損失関数の勾配は,損失関数の値を最も減らすような重みの方向ベクトルである.  

学習

「学習」は,「訓練」と同じ意味である.  

確率的勾配降下法

確率的勾配降下法 (SGD) は,次の方法で行う勾配降下法である.

 

活性化関数

活性化関数 (Activation) は,ReLU (rectified linear unit), LReLU (Leaky rectified linear unit), シグモイド関数 (sigmoid), ソフトマックス関数 (softmax) などがある.

 

訓練

訓練(training)は, ニューラルネットワークの重みとバイアスを修正することにより、より正しいが出てくるように調整すること、 あるいは最適な出力が得られるように重みとバイアスを修正すること.

訓練データのうち、入力を使い、 ニューラルネットワークを動かす. そして、正解の出力を使い、 損失関数の値ができるだけ小さくなるように、 最適化手法を用いて, ニューラルネットワークを構成するユニット(ニューロン)の重みとバイアスなど, ニューラルネットワークのパラメータをを最適化すること  

訓練データ

訓練データは、ニューラルネットワークの入力と、正解の出力.  

交差エントロピー

多クラスの交差エントロピーは、

のとき、次の通り.

-sigma_i( t[i] * log( y[i] ) )

2クラスの交差エントロピーは、

のとき、次の通り.

-sigma_i( t[i] * log( y[i] + (1 - t[i]) * (1 - log( y[i]) )  

最適化手法

最適化手法には、 確率的勾配降下法 などが知られる.

参考文献: An overview of gradient descent optimization algorithms, arxiv: https://arxiv.org/abs/1609.04747, http://sebastianruder.com/optimizing-gradient-descent/  

時系列

 

正規化

正規化は、「データの範囲を0から1の間に収める」ためのデータ変換操作. Python のプログラムは次の通り.

X_train = X_train / / X.train.max()

※ 平均 0、標準偏差1になるようにするためのデータ変換操作のことを「正規化」ということもある.  

正則化

参考文献: http://research.microsoft.com/en-us/um/people/jingdw/pubs/cvpr16-disturblabel.pdf  

全結合層

「Fully-connected Layer」のこと.「Dense Layer」や「Affine レイヤ」ともいう.  

層(レイヤ)

この資料で,「層(レイヤ)」というときは,次の2つの意味である.

ニューラルネットワークの1つの層(レイヤ)は, コンピュータの中に作るとき,全結合層 (fully-connected layer), 活性化関数層 (activation layer) いう複数の層(レイヤ)に分かれることが普通である. さらに Dropout のような,新しい層(レイヤ)が加わることもある.  

層(レイヤ)

 

層構造のニューラルネットワーク

この資料で, 「層構造のニューラルネットワーク」というときは, ニューラルネットワークが層構造をなしていて,さらに,ある層(レイヤ)ユニット(ニューロン)は, 次の層(レイヤ)のみにつながる(つながりでは,飛び越しや後戻りがない)という場合のことをいう. Keras では,「Sequential」という.

例えば、次のような 10層からなる層構造のニューラルネットワークを考えることができる.

 

損失関数

ニューラルネットワークの出力と正解との誤差を評価する尺度である関数のこと.誤差関数ともいう.  

多クラス

「多クラス」は、クラス数(カテゴリ数)が3以上であること.クラス数(カテゴリ数)が2の場合には「2クラス」という.  

畳み込みニューラルネットワーク

畳み込みニューラルネットワーク (Convolutional Neural Network) は,

の組み合わせで構成される層構造のニューラルネットワークのこと.

例えば、次のような 13層からなる層構造のニューラルネットワークを考えることができる.

AlexNet の場合

input 3@224x224
conv 11x11
  96@55x55
pooling
conv 5x5
  256@27x27
pooling
  16@5x5
conv 3x3
  384@13x13
conv 3x3
  384@13xx13
conv 3x3 
  256@13x13
affine
  4096
affine
  4096
  1000

参考文献: ch08/deep=cnvnet.py  

入力の次元数

ユニット(ニューロン)の入力が数のベクトルであるとき,そのベクトルの次元数を「入力の次元数」という.  

白色化

白色化 (whitening) とは,ニューラルネットワークの入力である数値ベクトルについて, 次のことを行う処理のこと.