#python-3.x #syntax #pass-by-reference #gradient-descent
Вопрос:
Я написал короткую функцию SGD и пытаюсь отслеживать, как SGD обновляет w
вектор на каждом шаге. Мысленно я представляю, как этот код изменяет w
, а затем вставляет копию нового значения w
в список ws
, который я использую для отслеживания всех промежуточных значений w
. Тем не менее, я понимаю, что Python использует «имена», что означает это переход по ссылке, здесь и так все значения в списке ws
в конечном итоге то же, потому что … как я понимаю … я, по сути, передав указатель на тот же объект каждый раз, когда я добавить в список, так что все элементы в конечном итоге совпадает ws[max_iter-1
. Во-первых, я не уверен, как решить эту проблему чисто, но в более широком смысле я чувствую, что это «интуитивная» операция, которая должна иметь некоторую готовую поддержку Python-как другие люди делают такого рода вещи?
def sgd(X, y, J, dJ, w0, step_size_fn, max_iter):
w = w0 # init
print(w)
fs, ws = [], [] # intermediate values of losses and weights
d, n = np.shape(X)
for i in range(max_iter):
rn = np.random.randint(0, n)
# gradient descent using dJ at some random data point
rdp = np.array(X[:, rn:rn 1])
rl = np.array(y[:, rn:rn 1])
# add current weights and losses therein
ws.append(w)
fs.append(J(rdp, rl, w))
w -= step_size_fn(i)*dJ(rdp, rl, w)
return (w, fs, ws)