Gradient prosty w partiach vs stochastyczny gradient prosty
Gradient prosty to algorytm optymalizacji często stosowany w uczeniu maszynowym do minimalizacji funkcji kosztu poprzez iteracyjne zbliżanie się do minimalnej wartości. Istnieją różne warianty gradientu prostego, najczęściej używane to gradient prosty w partiach i stochastyczny gradient prosty (SGD).
Gradient prosty w partiach
- Definicja: W metodzie gradientu prostego w partiach do obliczenia gradientu funkcji kosztu wykorzystywany jest cały zbiór danych. Parametry są aktualizowane po przetworzeniu wszystkich instancji danych.
- Zalety:
- Funkcja kosztu jest gładka i wypukła, co prowadzi do stabilnej zbieżności.
- Efektywne wykorzystanie operacji wektoryzowanych w bibliotekach obliczeniowych.
- Wady:
- Wymaga całościowego załadowania zbioru danych do pamięci, co może być kosztowne obliczeniowo i wolne dla bardzo dużych zbiorów danych.
- Zbieżność może być wolna ze względu na konieczność obliczenia gradientów dla całego zbioru danych przed każdą aktualizacją.
Stochastyczny gradient prosty
- Definicja: W stochastycznym gradiencie prostym parametry są aktualizowane dla każdego przykładu treningowego, jeden po drugim, a nie z wykorzystaniem całego zbioru danych.
- Zalety:
- Szybsza zbieżność, szczególnie w przypadku dużych zbiorów danych, ponieważ aktualizacje są częstsze.
- Możliwość ucieczki z lokalnych minimów dzięki hałaśliwym aktualizacjom.
- Wady:
- Funkcja kosztu jest bardziej hałaśliwa, co może prowadzić do mniej stabilnej zbieżności.
- Aktualizacje parametrów mogą być mniej dokładne z powodu losowości próbkowania jednego punktu danych na raz.
Przykłady kodu
Poniżej znajduje się prosty przykład obu metod z użyciem Pythona i NumPy:
import numpy as np # Dane przykładowe X = np.array([[1, 2], [3, 4], [5, 6]]) y = np.array([3, 7, 11]) # Parametry theta = np.zeros(2) learning_rate = 0.01 # Gradient prosty w partiach for _ in range(100): gradient = X.T.dot(X.dot(theta) - y) / len(y) theta -= learning_rate * gradient print("Theta Batch GD:", theta) # Stochastyczny gradient prosty theta = np.zeros(2) for _ in range(100): for i in range(len(y)): xi = X[i:i+1] yi = y[i:i+1] gradient = xi.T.dot(xi.dot(theta) - yi) theta -= learning_rate * gradient print("Theta SGD:", theta)
W tym przykładzie można zobaczyć, jak gradient prosty w partiach używa całego zbioru danych przy każdej aktualizacji, podczas gdy stochastyczny gradient prosty aktualizuje parametry przy każdym pojedynczym punkcie danych. Wybór między tymi metodami często zależy od wielkości zbioru danych i zasobów obliczeniowych.