CNTK - pomiar wydajności

W tym rozdziale wyjaśniono, jak mierzyć wydajność modelu w CNKT.

Strategia walidacji wydajności modelu

Po zbudowaniu modelu ML trenowaliśmy go przy użyciu zestawu próbek danych. Dzięki temu szkoleniu nasz model ML uczy się i wyprowadza kilka ogólnych zasad. Wydajność modelu ML ma znaczenie, gdy wprowadzamy do modelu nowe próbki, tj. Inne próbki niż dostarczone w czasie treningu. W takim przypadku model zachowuje się inaczej. Gorzej może być w zrobieniu dobrych prognoz na podstawie tych nowych próbek.

Ale model musi działać dobrze również dla nowych próbek, ponieważ w środowisku produkcyjnym otrzymamy inne dane wejściowe niż dane przykładowe, które wykorzystaliśmy do celów szkoleniowych. Z tego powodu powinniśmy zweryfikować model ML, używając zestawu próbek innych niż próbki, których używaliśmy do celów szkoleniowych. Tutaj omówimy dwie różne techniki tworzenia zbioru danych do walidacji NN.

Zbiór danych wstrzymanych

Jest to jedna z najłatwiejszych metod tworzenia zestawu danych do walidacji NN. Jak sama nazwa wskazuje, w tej metodzie będziemy wstrzymywać jeden zestaw próbek przed uczeniem (powiedzmy 20%) i używać go do testowania wydajności naszego modelu ML. Poniższy diagram przedstawia stosunek między próbkami szkoleniowymi i walidacyjnymi -

Model zbioru danych typu Hold-out zapewnia, że ​​mamy wystarczająco dużo danych, aby wytrenować nasz model ML, a jednocześnie będziemy mieć rozsądną liczbę próbek, aby uzyskać dobry pomiar wydajności modelu.

Aby uwzględnić je w zestawie uczącym i zbiorze testowym, dobrą praktyką jest wybranie losowych próbek z głównego zbioru danych. Zapewnia równomierne rozłożenie między treningiem a zestawem testowym.

Poniżej znajduje się przykład, w którym tworzymy własny zbiór danych wstrzymanych przy użyciu train_test_split funkcja z scikit-learn biblioteka.

Przykład

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# Here above test_size = 0.2 represents that we provided 20% of the data as test data.
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
classifier_knn = KNeighborsClassifier(n_neighbors=3)
classifier_knn.fit(X_train, y_train)
y_pred = classifier_knn.predict(X_test)
# Providing sample data and the model will make prediction out of that data
sample = [[5, 5, 3, 2], [2, 4, 3, 5]]
preds = classifier_knn.predict(sample)
pred_species = [iris.target_names[p] for p in preds] print("Predictions:", pred_species)

Wynik

Predictions: ['versicolor', 'virginica']

Korzystając z CNTK, musimy losowo zmieniać kolejność naszego zestawu danych za każdym razem, gdy trenujemy nasz model, ponieważ -

  • Na algorytmy głębokiego uczenia się duży wpływ mają generatory liczb losowych.

  • Kolejność, w jakiej dostarczamy próbki do NN podczas treningu, ma duży wpływ na jego wydajność.

Główną wadą stosowania techniki wstrzymywania zbioru danych jest to, że jest niewiarygodna, ponieważ czasami uzyskujemy bardzo dobre wyniki, ale czasami otrzymujemy złe wyniki.

K-krotna weryfikacja krzyżowa

Aby nasz model ML był bardziej niezawodny, istnieje technika zwana walidacją krzyżową K-fold. W naturze technika walidacji krzyżowej K-krotnej jest taka sama jak poprzednia technika, ale powtarza ją kilka razy - zwykle około 5 do 10 razy. Poniższy diagram przedstawia jego koncepcję -

Praca z walidacją krzyżową K-fold

Działanie walidacji krzyżowej K-fold można zrozumieć za pomocą następujących kroków:

Step 1- Podobnie jak w przypadku techniki Hand-out dataset, w technice walidacji krzyżowej K-fold, najpierw musimy podzielić zbiór danych na zbiór uczący i testowy. Idealnie, stosunek ten wynosi 80-20, czyli 80% zbioru uczącego i 20% zbioru testowego.

Step 2 - Następnie musimy wytrenować nasz model za pomocą zestawu uczącego.

Step 3−Na koniec będziemy używać zestawu testowego do pomiaru wydajności naszego modelu. Jedyną różnicą między techniką zbioru danych Hold-out a techniką walidacji k-cross jest to, że powyższy proces jest powtarzany zwykle od 5 do 10 razy, a na koniec obliczana jest średnia ze wszystkich wskaźników wydajności. Ta średnia byłaby ostatecznymi wskaźnikami wydajności.

Zobaczmy przykład z małym zestawem danych -

Przykład

from numpy import array
from sklearn.model_selection import KFold
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
kfold = KFold(5, True, 1)
for train, test in kfold.split(data):
   print('train: %s, test: %s' % (data[train],(data[test]))

Wynik

train: [0.1 0.2 0.4 0.5 0.6 0.7 0.8 0.9], test: [0.3 1. ]
train: [0.1 0.2 0.3 0.4 0.6 0.8 0.9 1. ], test: [0.5 0.7]
train: [0.2 0.3 0.5 0.6 0.7 0.8 0.9 1. ], test: [0.1 0.4]
train: [0.1 0.3 0.4 0.5 0.6 0.7 0.9 1. ], test: [0.2 0.8]
train: [0.1 0.2 0.3 0.4 0.5 0.7 0.8 1. ], test: [0.6 0.9]

Jak widać, dzięki zastosowaniu bardziej realistycznego scenariusza szkolenia i testów, technika walidacji krzyżowej k-krotnej daje nam znacznie bardziej stabilny pomiar wydajności, ale z drugiej strony, walidacja modeli uczenia głębokiego zajmuje dużo czasu.

CNTK nie obsługuje walidacji k-cross, dlatego musimy napisać własny skrypt, aby to zrobić.

Wykrywanie niedopasowania i nadmiernego dopasowania

Niezależnie od tego, czy używamy zestawu danych Hand-out, czy techniki k-fold cross-validation, odkryjemy, że dane wyjściowe dla metryk będą różne dla zestawu danych używanego do uczenia i zestawu danych używanego do walidacji.

Wykrywanie nadmiernego dopasowania

Zjawisko zwane overfittingiem to sytuacja, w której nasz model ML wyjątkowo dobrze modeluje dane treningowe, ale nie działa dobrze na danych testowych, tj. Nie był w stanie przewidzieć danych testowych.

Dzieje się tak, gdy model ML uczy się określonego wzorca i szumu z danych uczących w takim stopniu, że ma to negatywny wpływ na zdolność tego modelu do generalizacji z danych uczących do nowych, tj. Niewidocznych danych. Tutaj szum jest nieistotną informacją lub przypadkowością w zbiorze danych.

Oto dwa sposoby, za pomocą których możemy wykryć, czy nasz model jest przepasowany lub nie -

  • Model overfit będzie działał dobrze na tych samych próbkach, których używaliśmy do treningu, ale będzie działał bardzo źle na nowych próbkach, tj. Próbkach innych niż treningowe.

  • Model jest nadmiernie dopasowany podczas walidacji, jeśli metryka w zestawie testowym jest niższa niż ta sama metryka, której używamy w naszym zbiorze uczącym.

Wykrywanie niedopasowania

Inną sytuacją, która może wystąpić w naszym ML, jest niedopasowanie. Jest to sytuacja, w której nasz model ML nie modelował dobrze danych szkoleniowych i nie przewiduje przydatnych wyników. Kiedy zaczniemy trenować pierwszą epokę, nasz model będzie niedopasowany, ale będzie mniej dopasowany w miarę postępów w treningu.

Jednym ze sposobów wykrycia, czy nasz model jest niedopasowany, czy nie, jest przyjrzenie się metrykom zestawu uczącego i zestawu testowego. Nasz model będzie niedopasowany, jeśli metryka na zbiorze testowym jest wyższa niż metryka na zbiorze uczącym.