Produkcyjne systemy ML: monitorowanie potoków

Gratulacje! Wdrożono model jednorożca. Model powinien działać przez całą dobę 7 dni w tygodniu bez żadnych problemów. Aby mieć pewność, że tak jest, musisz monitorować potok uczenia maszynowego.

Tworzenie schematu danych do weryfikacji nieprzetworzonych danych

Aby monitorować dane, musisz je stale sprawdzać pod kątem oczekiwanych wartości statystycznych, tworząc reguły, które muszą spełniać. Ten zbiór reguł nazywa się schematem danych. Aby zdefiniować schemat danych, wykonaj te czynności:

  1. Poznaj zakres i dystrybucję swoich funkcji. W przypadku cech kategorialnych poznaj zbiór możliwych wartości.

  2. Zakoduj swoją wiedzę w schemacie danych. Oto przykłady reguł:

    • Upewnij się, że oceny przesyłane przez użytkowników zawsze mieszczą się w zakresie od 1 do 5.
    • Sprawdź, czy słowo the występuje najczęściej (w przypadku tekstu w języku angielskim).
    • Sprawdź, czy każda cecha kategorialna ma wartość z ustalonego zbioru możliwych wartości.
  3. Sprawdź, czy dane są zgodne ze schematem danych. Schemat powinien wykrywać błędy danych, takie jak:

    • Anomalie
    • Nieoczekiwane wartości zmiennych kategorialnych
    • Nieoczekiwane rozkłady danych

Pisanie testów jednostkowych w celu weryfikacji inżynierii funkcji

Chociaż nieprzetworzone dane mogą być zgodne ze schematem danych, model nie uczy się na podstawie nieprzetworzonych danych. Model jest trenowany na danych, które zostały przetworzone pod kątem cech. Na przykład model trenuje na znormalizowanych cechach numerycznych, a nie na surowych danych numerycznych. Dane po przekształceniu mogą się znacznie różnić od nieprzetworzonych danych wejściowych, dlatego musisz je sprawdzać oddzielnie.

Pisz testy jednostkowe na podstawie zrozumienia danych wygenerowanych przez funkcje. Możesz na przykład napisać testy jednostkowe, aby sprawdzić warunki takie jak:

  • Wszystkie cechy liczbowe są skalowane, np. w zakresie od 0 do 1.
  • Wektory zakodowane metodą 1 z n zawierają tylko jedną jedynkę i N-1 zer.
  • Rozkłady danych po transformacji są zgodne z oczekiwaniami. Jeśli na przykład normalizacja została przeprowadzona za pomocą wyników z, średnia wyników z powinna wynosić 0.
  • Wartości odstające są obsługiwane, np. przez skalowanie lub obcinanie.

Sprawdzanie danych w przypadku ważnych segmentów danych

Udany wynik całości może przesłaniać nieudany wynik podzbioru. Innymi słowy, model z doskonałymi ogólnymi wskaźnikami może nadal generować błędne prognozy w określonych sytuacjach. Na przykład:

Twój model jednorożca ogólnie działa dobrze, ale słabo radzi sobie z prognozowaniem na potrzeby Sahary.

Jeśli jesteś inżynierem, który zadowala się ogólnie wysoką wartością AUC, możesz nie zauważyć problemów z modelem na Saharze. Jeśli zależy Ci na tworzeniu dobrych prognoz dla każdego regionu, musisz śledzić skuteczność w każdym z nich. Podzbiory danych, takie jak ten odpowiadający pustyni Sahara, nazywane są wycinkami danych.

Określ interesujące Cię wycinki danych. Następnie porównaj dane modelu dla tych wycinków danych z danymi dla całego zbioru danych. Sprawdzanie, czy model działa dobrze we wszystkich segmentach danych, pomaga wyeliminować odchylenia. Więcej informacji znajdziesz w artykule Sprawiedliwość: ocena pod kątem odchyleń.

Korzystanie z danych z życia

Dane modelu niekoniecznie odzwierciedlają rzeczywisty wpływ modelu. Na przykład zmiana hiperparametru może zwiększyć wartość AUC modelu, ale jak wpłynęła na wrażenia użytkowników? Aby zmierzyć rzeczywisty wpływ, musisz zdefiniować osobne rodzaje danych. Możesz na przykład przeprowadzić ankietę wśród użytkowników modelu, aby potwierdzić, że rzeczywiście widzieli jednorożca, gdy model przewidział, że go zobaczą.

Sprawdzanie zniekształcenia między trenowaniem a zastosowaniem praktycznym

Zniekształcenie między trenowaniem a zastosowaniem praktycznym oznacza, że dane wejściowe podczas trenowania różnią się od danych wejściowych w trakcie zastosowania praktycznego. W tabeli poniżej opisano 2 ważne typy odchyleń:

Typ Definicja Przykład Rozwiązanie
Niezgodność schematu Dane wejściowe do trenowania i wyświetlania nie są zgodne z tym samym schematem. Format lub rozkład danych używanych do obsługi zmienia się, a model nadal jest trenowany na starych danych. Do weryfikacji danych treningowych i danych do obsługi używaj tego samego schematu. Sprawdź osobno statystyki, które nie są sprawdzane przez schemat, np. odsetek brakujących wartości.
Zniekształcenie cech Dane po przetworzeniu różnią się w przypadku trenowania i wdrażania. Kod inżynierii cech różni się w przypadku trenowania i stosowania praktycznego, co powoduje powstawanie różnych danych. Podobnie jak w przypadku odchylenia schematu, zastosuj te same reguły statystyczne do danych przygotowanych na potrzeby trenowania i obsługi. śledzić liczbę wykrytych cech z odchyleniami oraz odsetek przykładów z odchyleniami w przypadku każdej cechy;

Przyczyny zniekształceń między trenowaniem a zastosowaniem mogą być subtelne. Zawsze zastanawiaj się, jakie dane są dostępne dla modelu w momencie prognozowania. Podczas trenowania używaj tylko tych funkcji, które będą dostępne podczas wyświetlania reklam.

Ćwiczenie: sprawdź swoją wiedzę

Załóżmy, że masz sklep internetowy i chcesz przewidzieć, ile pieniędzy zarobisz danego dnia. Twoim celem w uczeniu maszynowym jest przewidywanie dziennych przychodów na podstawie liczby klientów jako cechy.

Jaki problem może wystąpić?
Kliknij tutaj, aby zobaczyć odpowiedź

Sprawdzanie wycieku etykiet

Wyciek etykiet oznacza, że etykiety danych podstawowych, które próbujesz przewidzieć, nieumyślnie trafiły do funkcji trenowania. Wyciek etykiet jest czasami bardzo trudny do wykrycia.

Ćwiczenie: sprawdź swoją wiedzę

Załóżmy, że tworzysz binarny model klasyfikacji, który ma przewidywać, czy nowy pacjent szpitala ma raka. Model korzysta z takich funkcji jak:

  • Wiek pacjenta
  • Płeć pacjenta
  • Wcześniejsze dolegliwości
  • Nazwa szpitala
  • Parametry życiowe
  • Wyniki testów
  • dziedziczność,

Etykieta wygląda tak:

  • Wartość logiczna: czy pacjent ma raka?

Dane są starannie dzielone na partycje, aby zbiór treningowy był dobrze odizolowany od zbioru walidacyjnego i testowego. Model działa bardzo dobrze w przypadku zbioru walidacyjnego i testowego, a wartości wskaźników są świetne. Niestety model bardzo słabo radzi sobie z nowymi pacjentami w rzeczywistości.

Dlaczego ten model, który świetnie radził sobie w zbiorze testowym, poniósł klęskę w rzeczywistości?
Kliknij tutaj, aby zobaczyć odpowiedź

Monitorowanie wieku modelu w całym potoku

Jeśli dane do wyświetlania zmieniają się z czasem, ale model nie jest regularnie ponownie trenowany, jakość modelu będzie się pogarszać. Śledź czas od ponownego wytrenowania modelu na nowych danych i ustaw próg wieku dla alertów. Oprócz monitorowania wieku modelu w momencie wyświetlania prognoz należy monitorować wiek modelu w całym potoku, aby wykrywać przestoje.

Sprawdzanie, czy wagi i dane wyjściowe modelu są stabilne numerycznie

Podczas trenowania modelu wagi i dane wyjściowe warstw nie powinny być wartościami NaN (nie są liczbami) ani Inf (nieskończoność). Napisz testy, aby sprawdzić, czy wagi i dane wyjściowe warstwy nie zawierają wartości NaN i Inf. Sprawdź też, czy ponad połowa danych wyjściowych warstwy nie jest zerowa.

Monitorowanie skuteczności modelu

Narzędzie do przewidywania pojawienia się jednorożca cieszy się większą popularnością, niż oczekiwano. Otrzymujesz wiele próśb o prognozy i jeszcze więcej danych treningowych. Wydaje Ci się, że to świetnie, dopóki nie zdasz sobie sprawy, że model zajmuje coraz więcej pamięci i wymaga coraz więcej czasu na trenowanie. Postanawiasz monitorować wydajność modelu, wykonując te czynności:

  • Śledź wydajność modelu według wersji kodu, modelu i danych. Takie śledzenie pozwala dokładnie określić przyczynę pogorszenia wydajności.
  • Sprawdź liczbę kroków trenowania na sekundę w przypadku nowej wersji modelu w porównaniu z poprzednią wersją i ustalonym progiem.
  • Wykrywaj wycieki pamięci, ustawiając próg wykorzystania pamięci.
  • Monitoruj czasy odpowiedzi interfejsu API i śledź ich wartości procentowe. Chociaż czas odpowiedzi interfejsu API może być poza Twoją kontrolą, powolne odpowiedzi mogą potencjalnie powodować słabe wyniki w rzeczywistych warunkach.
  • Monitoruj liczbę zapytań, na które odpowiadasz w ciągu sekundy.

Testowanie jakości aktywnego modelu na podstawie danych z serwera

Model został zweryfikowany. Ale co się stanie, jeśli po zarejestrowaniu danych weryfikacyjnych zmienią się scenariusze z życia codziennego, np. zachowanie jednorożca? Wtedy jakość modelu udostępnianego spadnie. Testowanie jakości w trakcie wyświetlania jest jednak trudne, ponieważ dane z rzeczywistego świata nie zawsze są oznaczone. Jeśli dane wyświetlania nie są oznaczone etykietami, rozważ przeprowadzenie tych testów:

  • Generowanie etykiet przy użyciu oceniających

  • Sprawdzaj modele, które wykazują istotne statystycznie odchylenia w prognozach. Zobacz Klasyfikacja: prognozowanie obciążenia.

  • Śledź rzeczywiste dane dotyczące modelu. Jeśli na przykład klasyfikujesz spam, porównaj swoje prognozy ze spamem zgłoszonym przez użytkowników.

  • Ogranicz potencjalne rozbieżności między danymi treningowymi a danymi używanymi do obsługi zapytań, udostępniając nową wersję modelu w przypadku części zapytań. W miarę weryfikowania nowego modelu wyświetlania stopniowo przełączaj wszystkie zapytania na nową wersję.

Pamiętaj, aby podczas korzystania z tych testów monitorować zarówno nagłe, jak i powolne pogorszenie jakości prognoz.

Randomizacja

Zadbaj o to, aby potok generowania danych był powtarzalny. Załóżmy, że chcesz dodać cechę, aby sprawdzić, jak wpłynie ona na jakość modelu. Aby eksperyment był wiarygodny, zbiory danych powinny być identyczne z wyjątkiem tej nowej funkcji. W tym celu upewnij się, że wszelkie losowe elementy w generowaniu danych mogą być deterministyczne:

  • Zainicjuj generatory liczb losowych. Inicjowanie zapewnia, że generator liczb losowych za każdym razem, gdy go uruchamiasz, zwraca te same wartości w tej samej kolejności, co pozwala odtworzyć zbiór danych.
  • Używaj niezmiennych kluczy skrótu. Szyfrowanie to powszechny sposób dzielenia lub próbkowania danych. Możesz zaszyfrować każdy przykład i użyć otrzymanej liczby całkowitej, aby zdecydować, w której grupie umieścić przykład. Dane wejściowe funkcji skrótu nie powinny się zmieniać przy każdym uruchomieniu programu do generowania danych. Nie używaj w haszu bieżącego czasu ani liczby losowej, jeśli na przykład chcesz odtwarzać hasze na żądanie.

Powyższe podejścia dotyczą zarówno próbkowania, jak i dzielenia danych.

Uwagi dotyczące szyfrowania

Wyobraź sobie, że zbierasz zapytania i używasz funkcji haszowania, aby uwzględniać lub wykluczać zapytania. Jeśli klucz skrótu używa tylko zapytania, w przypadku danych z wielu dni to zapytanie będzie zawsze uwzględniane lub zawsze wykluczane. Zawsze uwzględnianie lub wykluczanie zapytania jest niekorzystne, ponieważ:

  • Zbiór treningowy będzie zawierać mniej różnorodne zapytania.
  • Zbiory oceny będą sztucznie trudne, ponieważ nie będą się pokrywać z danymi treningowymi. W rzeczywistości w momencie wyświetlania w danych treningowych zobaczysz część ruchu na żywo, więc ocena powinna to odzwierciedlać.

Zamiast tego możesz zastosować funkcję skrótu do zapytania i daty zapytania, co spowoduje, że każdego dnia otrzymasz inny skrót.

Rysunek 7. Animowana wizualizacja pokazująca, jak haszowanie tylko zapytania powoduje, że dane trafiają codziennie do tego samego zasobnika, a haszowanie zapytania i czasu zapytania powoduje, że dane trafiają codziennie do różnych zasobników. Są to: Trenowanie, Ocena i Ignorowane.
Rysunek 7. Hashowanie zapytania a hashowanie zapytania i daty zapytania.