初心者向けの深局孊習手曞き数字の認識

ディヌプラヌニングテクノロゞヌをすばやく理解できるように蚭蚈されたシリヌズの最初の蚘事を玹介したす。 MNIST手曞き数字の分類ずCIFAR-10小さな画像の10クラスぞの分類飛行機、車、鳥、猫、鹿、犬、カ゚ルの適切なパフォヌマンスを埗るために、基本原則から重芁な機胜に移行したす、銬、船、トラック。





機械孊習技術の集䞭的な開発により、モデルのプロトタむプを迅速に蚭蚈および構築できるだけでなく、孊習アルゎリズムのテストに䜿甚されるデヌタセット䞊蚘のものなどに無制限にアクセスできるいく぀かの非垞に䟿利なフレヌムワヌクが登堎したした。 ここで䜿甚する開発環境はKerasず呌ばれたす。 最も䟿利で盎感的であるこずがわかりたしたが、同時に、必芁に応じおモデルを倉曎するのに十分な衚珟力を備えおいたす。


このレッスンの終わりに、倚局パヌセプトロンMLPず呌ばれる単玔な深局孊習モデルがどのように機胜するかを理解し、Meristでかなりの粟床を埗るためにKerasでそれを構築する方法も孊びたす。 次のレッスンでは、画像を分類する際のより耇雑な問題を解決する方法CIFAR-10などに぀いお説明したす。


人工ニュヌロン


「深局孊習」ずいう甚語はより広い意味で理解できたすが、ほずんどの堎合、 人工ニュヌラルネットワヌクの分野で䜿甚されたす 。 これらの構造の考え方は生物孊から借甚されおいたす。ニュヌラルネットワヌクは、環境から知芚される画像の脳ニュヌロンによる凊理ず、意思決定ぞのこれらのニュヌロンの関䞎を暡倣したす。 単䞀の人工ニュヌロンの動䜜原理は、本質的に非垞に単玔です。 入力ベクトルのすべおの芁玠の加重和を蚈算したす \むンラむン\ vec {_x_} 重みベクトルを䜿甚 \むンラむン\ vec {_w_} 同様に、バむアスの远加コンポヌネント {_w__0} 、その埌、掻性化関数 σを結果に適甚できたす。



最も人気のあるアクティベヌション機胜の䞭で




圓初1950幎代から、パヌセプトロンモデルは完党に線圢でした。぀たり、アむデンティティのみが掻性化関数ずしお機胜しおいたした。 しかし、䞻芁なタスクは本質的に非線圢であるこずが倚く、それが他のアクティベヌション関数の出珟に぀ながるこずがすぐに明らかになりたした。 シグモむド関数名前は特性S字グラフに由来 は 、 zがれロに近い堎合のバむナリ解に察するニュヌロンの初期「䞍確実性」をモデリングし、 zが任意の方向に倉䜍する堎合の高速飜和ず組み合わせたす。 ここに瀺す2぀の関数は非垞に䌌おいたすが、双曲線正接の出力倀は区間[-1、1]に属し、ロゞスティック関数の範囲は[0、1]ですしたがっお、ロゞスティック関数は確率を衚珟するのにより䟿利です。


近幎、深局孊習で準線圢関数ずそのバリ゚ヌションが広く普及しおいたす-モデルを非線圢にする簡単な方法ずしお登堎したした「倀が負の堎合、れロになりたす」が、最終的には歎史的に人気のあるシグモむド関数よりも成功したした。たた、生䜓ニュヌロンが電気的むンパルスを䌝達する方法ずの敎合性も向䞊しおいたす。 このため、このレッスンの䞀環ずしお、半線圢関数ReLUに焊点を圓おたす。


各ニュヌロンは、その重みベクトルによっお䞀意に決定されたす \むンラむン\ vec {_w_} 、および孊習アルゎリズムの䞻な目的は、予枬誀差を最小化するために、既知の入力デヌタず出力デヌタのペアのトレヌニングサンプルに基づいおニュヌロンに重みのセットを割り圓おるこずです。 このようなアルゎリズムの兞型的な䟋は募配降䞋法で、特定の損倱関数に察しお E\ vec {w} この関数の最倧の枛少の方向に重みベクトルを倉曎したす。



\ vec {w} \ leftarrow \ vec {w}-\ eta {\ partial E\ vec {w}\ over \ partial \ vec {w}}


ここで、 ηは孊習率ず呌ばれる正のパラメヌタヌです。


損倱関数は、パラメヌタヌの珟圚の倀で意思決定を行う際にニュヌロンがどれほど䞍正確であるかずいう考え方を反映しおいたす。 ほずんどのタスクに適した損倱関数の最も簡単な遞択は、 二次関数です。 特定のトレヌニングサンプル \ vec {x}、y これは、 yのタヌゲット倀ず特定の入力のニュヌロンの実際の出力倀ずの差の2乗ずしお定矩されたす \ vec {x} 


E\ vec {w}=y-\ sigmaw_0 + \ sum_ {i = 1} ^ {n} w_ix_i^ 2


ネットワヌクには、より詳现な募配降䞋アルゎリズムを考慮した倚数のトレヌニングコヌスがありたす。 私たちのケヌスでは、フレヌムワヌクがすべおの最適化を凊理するため、今埌はあたり泚目したせん。


ニュヌラルネットワヌクおよびディヌプラヌニングの抂芁


ニュヌロンの抂念を導入したので、あるニュヌロンの出力を別のニュヌロンの入力に接続するこずが可胜になり、 ニュヌラルネットワヌクの基瀎を築きたす 。 䞀般に、ニュヌロンが局を圢成し、1぀の局のニュヌロンが前の局の出力を凊理する盎接䌝播ニュヌラルネットワヌクに焊点を圓おたす。 最も匷力なこのようなアヌキテクチャ 倚局パヌセプトロン 、MLPでは、1぀の局のすべおの出力デヌタが次の図のように次の局のすべおのニュヌロンに接続されたす。



出力ニュヌロンの重みを倉曎するには、特定の損倱関数を䜿甚した䞊蚘の募配降䞋法を盎接䜿甚できたす。他のニュヌロンの堎合、これらの損倱を反察方向に耇雑な関数の埮分芏則を䜿甚しお䌝播する必芁があり、 逆䌝播アルゎリズムを開始したす 。 募配降䞋法ず同様に、すべおの蚈算はフレヌムワヌクによっお実行されるため、アルゎリズムの数孊的正圓化には泚意を払いたせん。


普遍近䌌定理によるず、シグモむドニュヌロンの1぀の隠れ局を持぀十分に広い倚局パヌセプトロンであるTsybenkoは、䞎えられた間隔で実倉数の連続関数を近䌌できたす。 この定理の蚌明は実甚的ではなく、そのような構造に察する効果的なトレヌニングアルゎリズムを提䟛したせん。 答えは深局孊習を提䟛したす。 幅の代わりに深さを増やしたす。 定矩では、耇数の隠れ局を持぀ニュヌラルネットワヌクはすべおディヌプず芋なされたす。


深さの移動により、ニュヌラルネットワヌクの入力に生の入力を提䟛するこずもできたす。これたで、単䞀局ネットワヌクには、特殊な機胜を䜿甚しお入力から抜出された重芁な機胜が提䟛されおいたした。 これは、 コンピュヌタヌビゞョン 、 音声認識、 自然蚀語凊理などのさたざたなクラスのタスクが異なるアプロヌチを必芁ずし、これらの分野間の科孊的協力を劚げるこずを意味しおいたした。 しかし、ネットワヌクに耇数の隠れ局が含たれおいる堎合、入力デヌタを最もよく説明する䞻芁な機胜を識別する方法を孊習する機胜を獲埗するため、゚ンドツヌ゚ンド孊習の䜿甚を芋぀けるこずができたす入力ず出力の間の埓来のプログラム可胜な凊理なしたた、䞻芁な属性を取埗するための関数を導出する必芁がなくなったため、 幅広いタスクの同じネットワヌク。 畳み蟌みニュヌラルネットワヌクを怜蚎するずきに、講矩の第2郚で䞊蚘のグラフィック確認を行いたす。


Deep MLPをMNISTに適甚する


ここで、可胜な限り単玔なディヌプニュヌラルネットワヌク2぀の隠れ局を持぀MLPを実装し、MNISTデヌタセットから手曞き数字を認識するタスクに適甚したす。


次のむンポヌトのみが必芁です。


from keras.datasets import mnist # subroutines for fetching the MNIST dataset from keras.models import Model # basic class for specifying and training a neural network from keras.layers import Input, Dense # the two types of neural network layer we will be using from keras.utils import np_utils # utilities for one-hot encoding of ground truth values 

次に、モデルのいく぀かのパラメヌタヌを定矩したす。 これらのパラメヌタヌは、トレヌニングの開始前に掗緎されるこずが想定されるため、しばしばハむパヌパラメヌタヌず呌ばれたす。 このマニュアルでは、事前に遞択された倀を䜿甚したすが、埌続のレッスンでそれらの改良のプロセスにさらに泚意を払いたす。


特に、以䞋を定矩したす。
batch_size-募配降䞋アルゎリズムの1回の反埩で同時に凊理されるトレヌニングサンプルの数。
num_epochs-トレヌニングセット党䜓のトレヌニングアルゎリズムの反埩回数。
hidden_​​size -2぀の非衚瀺MLPレむダヌのそれぞれのニュヌロンの数。


 batch_size = 128 # in each iteration, we consider 128 training examples at once num_epochs = 20 # we iterate twenty times over the entire training set hidden_size = 512 # there will be 512 neurons in both hidden layers 

それでは、MNISTをダりンロヌドしお、いく぀かの前凊理を行いたす。 Kerasを䜿甚するず、これは非垞に簡単に実行されたす。リモヌトサヌバヌからNumPyラむブラリの配列にデヌタを盎接読み蟌むだけです。


デヌタを準備するには、最初に画像を1次元配列の圢匏で提瀺し各ピクセルを個別の入力フィヌチャず芋なすため、各ピクセルの匷床倀を255で陀算しお、新しい倀が区間[0、1]に収たるようにしたす。 これは、デヌタを正芏化する非垞に簡単な方法です;以降のレッスンで他の方法に぀いお説明したす。


分類問題ぞの良いアプロヌチは確率的分類です。この分類では、各クラスに1぀の出力ニュヌロンがあり、入力芁玠がこのクラスに属する確率を䞎えたす。 これは、トレヌニング出力を盎接゚ンコヌディングに倉換する必芁があるこずを意味したす。たずえば、目的の出力クラスが3で、合蚈5぀のクラスがあり0〜4の番号が付けられおいる、適切な盎接゚ンコヌディングは[0、0、0、1、0]です。 Kerasがこの機胜をすべお提䟛しおくれたこずを繰り返したす。


 num_train = 60000 # there are 60000 training examples in MNIST num_test = 10000 # there are 10000 test examples in MNIST height, width, depth = 28, 28, 1 # MNIST images are 28x28 and greyscale num_classes = 10 # there are 10 classes (1 per digit) (X_train, y_train), (X_test, y_test) = mnist.load_data() # fetch MNIST data X_train = X_train.reshape(num_train, height * width) # Flatten data to 1D X_test = X_test.reshape(num_test, height * width) # Flatten data to 1D X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train /= 255 # Normalise data to [0, 1] range X_test /= 255 # Normalise data to [0, 1] range Y_train = np_utils.to_categorical(y_train, num_classes) # One-hot encode the labels Y_test = np_utils.to_categorical(y_test, num_classes) # One-hot encode the labels 

そしお今、私たちのモデルを定矩する時が来たした これを行うには、3぀の密なレむダヌのスタックを䜿甚したす。これは、完党に接続されたMLPに察応し、1぀のレむダヌのすべおの出力が埌続のレむダヌのすべおの入力に接続されたす。 最初の2぀の局のニュヌロンにはReLUを、最埌の局にはsoftmaxを䜿甚したす。 この掻性化関数は、実数倀を持぀ベクトルを確率ベクトルに倉換するように蚭蚈されおおり、 j番目のニュヌロンに察しお次のように定矩されおいたす。



\ sigma\ vec {z}_ j = {expz_j\ over \ sum_iexpz_i}


他のフレヌムワヌクTansorFlowなどず区別するKerasの泚目すべき機胜は、レむダヌサむズの自動蚈算です。 入力レむダヌの次元を指定するだけで、Kerasは他のすべおのレむダヌを自動的に初期化したす。 すべおのレむダヌが定矩されたら、次のように入力デヌタず出力デヌタを蚭定するだけです。


 inp = Input(shape=(height * width,)) # Our input is a 1D vector of size 784 hidden_1 = Dense(hidden_size, activation='relu')(inp) # First hidden ReLU layer hidden_2 = Dense(hidden_size, activation='relu')(hidden_1) # Second hidden ReLU layer out = Dense(num_classes, activation='softmax')(hidden_2) # Output softmax layer model = Model(input=inp, output=out) # To define a model, just specify its input and output layers 

ここで、損倱関数、最適化アルゎリズム、および収集するメトリックを決定する必芁がありたす。


確率的分類を扱うずきは、損倱関数ずしお、䞊で定矩した二乗誀差ではなく、クロス゚ントロピヌを䜿甚するのが最善です。 特定の出力確率ベクトルの堎合 \ vec {y} 実際のベクトルず比范 \ vec \ hat {y} 、損倱 k番目のクラスは次のように定矩されたす。



\ mathcal {L}\ vec {y}、\ vec \ hat {y}=-\ sum_ {i = 1} ^ k \ hat {y} _i \ log {y_i}


䞻にこの関数はクラスの正しい定矩に察するモデルの信頌性を最倧化するように蚭蚈されおおり、他のクラスに入るサンプルの確率の分垃を気にしないため、損倱は確率的なタスクでは枛少したすたずえば、出力局のロゞスティック/゜フトマックス関数を䜿甚 二次誀差関数は、残りのクラスに陥る確率ができるだけれロに近くなるようにする傟向がありたす。


䜿甚される最適化アルゎリズムは、䜕らかの圢の募配降䞋アルゎリズムに䌌おいたす。違いは、 トレヌニングレヌト ηが遞択される方法のみです。 これらのアプロヌチの優れた抂芁をここで玹介したす。次に、通垞は良奜なパフォヌマンスを瀺すAdamオプティマむザヌを䜿甚したす。


クラスはバランスが取れおいるため各クラスに属する手曞き数字の数は同じです、 粟床は適切なメトリック正しいクラスに割り圓おられた入力デヌタの割合になりたす。


 model.compile(loss='categorical_crossentropy', # using the cross-entropy loss function optimizer='adam', # using the Adam optimiser metrics=['accuracy']) # reporting the accuracy 

最埌に、トレヌニングアルゎリズムを実行したす。 デヌタのサブセットを取り陀いお、アルゎリズムがただデヌタを正しく認識しおいるこずを確認するこずをお勧めしたす。このデヌタは怜蚌セットずも呌ばれたす。 ここでは、この目的のためにデヌタの10を分離したす。


Kerasのもう1぀の優れた機胜は、粒床です。アルゎリズムのすべおのステップの詳现なログを衚瀺したす。


 model.fit(X_train, Y_train, # Train the model using the training set... batch_size=batch_size, nb_epoch=num_epochs, verbose=1, validation_split=0.1) # ...holding out 10% of the data for validation model.evaluate(X_test, Y_test, verbose=1) # Evaluate the trained model on the test set! 

 Train on 54000 samples, validate on 6000 samples Epoch 1/20 54000/54000 [==============================] - 9s - loss: 0.2295 - acc: 0.9325 - val_loss: 0.1093 - val_acc: 0.9680 Epoch 2/20 54000/54000 [==============================] - 9s - loss: 0.0819 - acc: 0.9746 - val_loss: 0.0922 - val_acc: 0.9708 Epoch 3/20 54000/54000 [==============================] - 11s - loss: 0.0523 - acc: 0.9835 - val_loss: 0.0788 - val_acc: 0.9772 Epoch 4/20 54000/54000 [==============================] - 12s - loss: 0.0371 - acc: 0.9885 - val_loss: 0.0680 - val_acc: 0.9808 Epoch 5/20 54000/54000 [==============================] - 12s - loss: 0.0274 - acc: 0.9909 - val_loss: 0.0772 - val_acc: 0.9787 Epoch 6/20 54000/54000 [==============================] - 12s - loss: 0.0218 - acc: 0.9931 - val_loss: 0.0718 - val_acc: 0.9808 Epoch 7/20 54000/54000 [==============================] - 12s - loss: 0.0204 - acc: 0.9933 - val_loss: 0.0891 - val_acc: 0.9778 Epoch 8/20 54000/54000 [==============================] - 13s - loss: 0.0189 - acc: 0.9936 - val_loss: 0.0829 - val_acc: 0.9795 Epoch 9/20 54000/54000 [==============================] - 14s - loss: 0.0137 - acc: 0.9950 - val_loss: 0.0835 - val_acc: 0.9797 Epoch 10/20 54000/54000 [==============================] - 13s - loss: 0.0108 - acc: 0.9969 - val_loss: 0.0836 - val_acc: 0.9820 Epoch 11/20 54000/54000 [==============================] - 13s - loss: 0.0123 - acc: 0.9960 - val_loss: 0.0866 - val_acc: 0.9798 Epoch 12/20 54000/54000 [==============================] - 13s - loss: 0.0162 - acc: 0.9951 - val_loss: 0.0780 - val_acc: 0.9838 Epoch 13/20 54000/54000 [==============================] - 12s - loss: 0.0093 - acc: 0.9968 - val_loss: 0.1019 - val_acc: 0.9813 Epoch 14/20 54000/54000 [==============================] - 12s - loss: 0.0075 - acc: 0.9976 - val_loss: 0.0923 - val_acc: 0.9818 Epoch 15/20 54000/54000 [==============================] - 12s - loss: 0.0118 - acc: 0.9965 - val_loss: 0.1176 - val_acc: 0.9772 Epoch 16/20 54000/54000 [==============================] - 12s - loss: 0.0119 - acc: 0.9961 - val_loss: 0.0838 - val_acc: 0.9803 Epoch 17/20 54000/54000 [==============================] - 12s - loss: 0.0073 - acc: 0.9976 - val_loss: 0.0808 - val_acc: 0.9837 Epoch 18/20 54000/54000 [==============================] - 13s - loss: 0.0082 - acc: 0.9974 - val_loss: 0.0926 - val_acc: 0.9822 Epoch 19/20 54000/54000 [==============================] - 12s - loss: 0.0070 - acc: 0.9979 - val_loss: 0.0808 - val_acc: 0.9835 Epoch 20/20 54000/54000 [==============================] - 11s - loss: 0.0039 - acc: 0.9987 - val_loss: 0.1010 - val_acc: 0.9822 10000/10000 [==============================] - 1s [0.099321320021623111, 0.9819] 

ご芧のように、このモデルはテストデヌタセットで玄98.2の粟床を達成したす。これは、 ここで説明する超珟代的なアプロヌチによっおはるかに優れおいるずいう事実にもかかわらず、このような単玔なモデルにずっお非垞に䟡倀がありたす 。


このモデルをもう䞀床実隓するこずをお勧めしたす。さたざたなハむパヌパラメヌタヌ、最適化アルゎリズム、アクティベヌション関数を詊しお、隠れ局を远加するなど。 最終的には、99を超える粟床を達成できるはずです。


おわりに


この投皿では、ディヌプラヌニングの基本抂念を怜蚌し、Kerasフレヌムワヌクを䜿甚しお単玔な2局のディヌプMLPを正垞に実装し、MNISTデヌタセットに適甚したした。これらすべおを30行未満のコヌドで実行したした。


次回は、MLPを倧容量画像CIFAR-10などに適甚する際に発生する問題のいく぀かを解決する畳み蟌みニュヌラルネットワヌクCNNを芋おいきたす。

Source: https://habr.com/ru/post/J314242/


All Articles