Przygotowanie Danych i Modele API w Keras
Zanim sprawdzimy wpływ hiperparametrów na naukę, musimy przygotować środowisko treningowe z dostarczonego notatnika. Pobieramy bazę MNIST (obrazy ręcznie pisanych cyfr od 0 do 9), zmieniamy ich kształt z kwadratów 28x28 pikseli na jeden płaski wymiar `(784,)` i normalizujemy, zabezpieczając system.
Definicja Samej Architektury z wykorzystaniem dziedziczenia KLAS
W skrypcie wykorzystano klasyczną modę na Subclassing API modułów Keras, gdzie na stałe implementujemy inżynieryjną bazę keras.Model.
def __init__(self, n_features, n_ukryta1=64, n_ukryta2=32, n_classes=10):
super(MLPmodel, self).__init__()
super() rozgłaszamy wewnętrzne mechanizmy integracyjne TensorFlow odpowiedzialne wręcz za cuda automatycznego wyliczania strat bez naszego autorskiego trudu wstecznego modelowania. Zostawiamy u siebie tylko szyny.
self.wyjscie = layers.Dense(n_classes, activation='softmax')
softmax. Softmax obdziela wszystkie 10 neuronów ułamkiem procentów (odpowiada to pewności do odgadnięcia cyfry od 0 do 9).
x = self.warstwa1(x)
return self.wyjscie(x)
Współczynnik Uczenia
(Learning Rate - LR)
Nawet najlepsza architektura wymodelowana wyżej nie zdoła się optymalnie wyuczyć, jeśli jej "poprawki grawitacyjne" błądzące w pętlach trenowania będą niszcząco nakierowywane. Learning Rate (LR) zarządza fizyczną skalą wprowadzanych zmian po absolutnie każdym popełnionym błędzie.
model.compile(optimizer=keras.optimizers.Adam(learning_rate=lr),
loss=keras.losses.SparseCategoricalCrossentropy())
model.fit(x_train, y_train, epochs=20, batch_size=64)
SparseCategoricalCrossentropy, która zlicza odchylenia masowych klasyfikacji (gdzie prawda obiektywna jest ułamkiem 0 albo 1).
Przy zbyt małym LR piłeczka powolutku schodzi na dół, nigdy nie docierając przez limity czasu. Przy zbyt wysokim odbija się chaotycznie po burtach aż wyskoczy poza błąd na gigantyczne pomyłki z nieskońśzoności.
Rozmiar paczki danych
(Batch Size)
Na stabilność decyzyjną szkolenia oraz pamięć komputera (VRAM) wpływa to, jak szeroką grupę obrazków wpuszczamy do oceny jednocześnie przed jakąkolwiek modyfikacyjną poprawką - robimy ujęcia zbiorowe i wrzucamy z nich uśredniony wniosek po wierszach strat optymalizacyjnej Gradient Descent. To właśnie ustalone jest w ujęciu Batch.
history = model.fit(epochs=20, batch_size=bs)
batch_size opóźniamy częstotliwość podsumowań, z których czerpie aktualizator w procesach `Backward` (korekcji logiki). Poniżej użyliśmy na testy zarówno bardzo drżącą małą dawkę szesnastu prób do rzędów 1024 dających wygładzone (ale stępione percepcyjnie) spłaszczanie linii wykresów.
Interaktywna wariancja gęstości - Batch Size
Rozmiar 16: Trening maszynowy jest "głośny" i wysoce chaotyczny! Wykres stochastycznie skacze z gigantycznymi schodami, ponieważ poprawka nakładana jest na logikę na podstawie niepewnej opinii od garstki zaledwie szesnastu przykładów. Daje to jednak zjawisko pomocnego "szumu" ułatwiającego wyrwanie się z pułapek optymalizacji matematycznej.
Wybór Optymalizatora
(Algorytmu kroczącego)
Nawet przy najlepszym tempie możemy wspomóc obiekty dodatkami wyciągającymi z algorytmów analitycznych (heurystycznych). Optymalizatory dyktują strategię w jaką system przetwarza zebrane informacje strat.
Architektura Warstw i Ryzyko Przeuczenia
(Niesławny Overfitting)
Oprócz suwaków o krokach, mylnie stających na topologii, decydujemy też o samej wulgarnej, nieczystej strukturze liczby synaps powiązań sieciowych. Model posiadający raptem garstkę węzłów ukrytych potrafi odcyfrować tylko wielce banalne i trywialne kształty oraz zgrubne obramowawcze kontury dla wielomianów danych. Wspaniały geometryczny rozrost liczbowy skrzywdzić rykoszetem też może algorytm wbijając go w tzw. memoratyzację znienawidzonej szarej sfery, czyli patologicznego nauczenia się ślepych rzędów pamięci.
Dense potrafią ekstraktować skomplikowane i zintegrowane zagięcia wektorowe z pikseli. Jeśli jednak twój zestaw szkoleniowy ma marne tysiąc probówek (np. odciski łap psów), a ty nadałeś sztuczny węzeł inteligencji połączony fizycznie z 15 milionów neuronów - z dużą pasją maszyna pożre materiały całe, idealnie odkopując i zachowując wszystko, jednak... to zapamięci w logice po krawędzi blatu, tak jak ślepy prymus który zakuł matematykę ze skryptu wykutego dla jedynego zestawu i płacze na faktycznym teście nie potrafiąc zaadaptować procedur i ogólnego wzorca na nieznany, trochę szerszy przypadek w epoce u użytkowników po wdrożeniu do API produkcyjnego. To nazywamy złem zwanym z wielką siłą Overfitting (Oraz na to dedykuje się parametryzacja zwana z odgórza Dropout ograniczająca i wybijająca maszynowy sen na sprawdzaniu walidatorowym - odłączna z flag validation_split obcych rzędów logów wykreślanych po stymulantach i klatkach badawczych).
Dopasuj hiperparametry w locie i wciśnij Rozpocznij Trening Sieci, aby obserwować na żywo logi konsolowe wyliczane obok symulacji jak to bywa w naturalnym notatniku Jupyter uruchamianego w Keras API!