サイト構成 | 連絡先,業績など | コンピュータ実習 | データの扱い | コンピュータ設定 | 教材(公開) | サポートページ |
「ディープラーニング」を使うときに必要な知識を、全てこのページにまとめます)。 (金子研究室学生諸君へ: 情報提供お願い)。
いまは、項目を a-z, あーん順に並べています.  
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 とは、 ミニバッチ学習を行うとき、ミニバッチごとに正規化を行うこと.この結果として、バイアスはなくなる.
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 らの方法 (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 は、 2クラスの 交差エントロピーを、 訓練 (training)での,損失関数として使うこと. logloss ともいう.  
Keras の categorical_crossentropy は、 多クラスの 交差エントロピーを、 訓練 (training)での,損失関数として使うこと. マルチクラス logloss ともいう. ラベルがバイナリ配列であり、その形状が (n_sample, nb_classes) であること. 2クラスの交差エントロピーを使いたいときは、binary_crossentropy を用いる。  
Keras で Early Stopping を行うとき、次のようにコールバックを書く.
from kernel.callbacks import EarlyStopping cb = EarlyStopping(monitor='var_loss', patience = 10)
訓練データ X_train と y_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])
次のプログラムの中の kernel_initializer の部分. 標準偏差を 0.01 になるように重みを設定している.
m.add(Dense(units=100, input_dim=len(768[0])), kernel.iniializer.TruncatedNormal(stddev=0.01))
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 でのモデル 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_test と y_test のペア
全部で75行
入力の次元数は「4」なので、入力として一度に受け取るデータが4個(それを1行分)。
「こういう出力が欲しいのだ!」というデータ。 全部で75行
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 (Leaky rectified linear unit) は,次の関数である.
f(x) = x (x>=0), alpha * x (x<0)
必ずしも、ReLU、LReLU のどちらかが優れているとうことはない.
Keras で LReLU を使うときは、次のように書く.
m.add(LeakyReLU(alpha=0.01)
参考文献: http://www.cs.toronto.edu/~fritz/absps/momentum.pdf  
ベクトルは,要素の並び.各要素の添字は 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 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 配列のコンストラクタの例を示す.
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 (rectified linear unit) は,次の関数である.
f(x) = x (x>=0), 0 (x<0)
必ずしも、ReLU、LReLU のどちらかが優れているとうことはない.  
ベクトルは,要素の並び.各要素の添字は 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 の配列のコンストラクタの例を示す.
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) は,f(x) = 1 / (1 + exp(-x))  
次元数 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) などがある.
http://machinelearning.wustl.edu/mlpapers/paper_files/icml2010_NairH10.pdf
http://ai.stanford.edu/~amaas/papers/relu_hybrid_icml2013_final.pdf
訓練(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) は,
参考文献: Non-linear Convolution Filters for CNN-based Learning, arxiv: https://arxiv.org/abs/1708.07038
参考文献: A new kind of pooling layer for faster and sharper convergence, https://github.com/singlasahil14/sortpool2d
の組み合わせで構成される層構造のニューラルネットワークのこと.
例えば、次のような 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) とは,ニューラルネットワークの入力である数値ベクトルについて, 次のことを行う処理のこと.