Ich muss stochastischen Gradientenabstieg mit Python-Numpy-Bibliothek implementieren. Zu diesem Zweck habe ich die folgenden Funktionsdefinitionen gegeben:Stochastische Gradientenabstieg-Implementierung mit Python's numpy
def compute_stoch_gradient(y, tx, w):
"""Compute a stochastic gradient for batch data."""
def stochastic_gradient_descent(
y, tx, initial_w, batch_size, max_epochs, gamma):
"""Stochastic gradient descent algorithm."""
ich auch die folgenden Hilfefunktion gegeben habe:
def batch_iter(y, tx, batch_size, num_batches=1, shuffle=True):
"""
Generate a minibatch iterator for a dataset.
Takes as input two iterables (here the output desired values 'y' and the input data 'tx')
Outputs an iterator which gives mini-batches of `batch_size` matching elements from `y` and `tx`.
Data can be randomly shuffled to avoid ordering in the original data messing with the randomness of the minibatches.
Example of use :
for minibatch_y, minibatch_tx in batch_iter(y, tx, 32):
<DO-SOMETHING>
"""
data_size = len(y)
if shuffle:
shuffle_indices = np.random.permutation(np.arange(data_size))
shuffled_y = y[shuffle_indices]
shuffled_tx = tx[shuffle_indices]
else:
shuffled_y = y
shuffled_tx = tx
for batch_num in range(num_batches):
start_index = batch_num * batch_size
end_index = min((batch_num + 1) * batch_size, data_size)
if start_index != end_index:
yield shuffled_y[start_index:end_index], shuffled_tx[start_index:end_index]
I implementiert die folgenden zwei Funktionen:
def compute_stoch_gradient(y, tx, w):
"""Compute a stochastic gradient for batch data."""
e = y - tx.dot(w)
return (-1/y.shape[0])*tx.transpose().dot(e)
def stochastic_gradient_descent(y, tx, initial_w, batch_size, max_epochs, gamma):
"""Stochastic gradient descent algorithm."""
ws = [initial_w]
losses = []
w = initial_w
for n_iter in range(max_epochs):
for minibatch_y,minibatch_x in batch_iter(y,tx,batch_size):
w = ws[n_iter] - gamma * compute_stoch_gradient(minibatch_y,minibatch_x,ws[n_iter])
ws.append(np.copy(w))
loss = y - tx.dot(w)
losses.append(loss)
return losses, ws
Ich bin mir nicht sicher, ob die Iteration im Bereich (max_epochs) oder in einem größeren Bereich durchgeführt werden soll. Ich sage das, weil ich gelesen habe, dass eine Epoche "jedes Mal, wenn wir den gesamten Datensatz durchlaufen" ist. Ich denke also, eine Epoche besteht aus mehr als einer Iteration ...
Für die zweite Frage beziehen: lesen, * * Batch **, ** Mini-Batch ** und ** Epochen ** in Bezug auf SGD. – sascha
Sie rufen 'batch_iter' in Ihrer inneren Schleife auf, die bei jedem Aufruf ein neues Generatorobjekt instanziiert. Stattdessen möchten Sie einen einzelnen Generator außerhalb der Schleife instantiieren und dann darauf iterieren, z. 'für minibatch_y, minibatch_x in batch_iter (...)'. –