No gradients provided for any variable в SGD

Я занимаюсь изучением машинного обучения и столкнулся с проблемой при написании алгоритма для полиноминальной регрессии

Используя код ниже я получал ошибку отсутствия градиентов

w = tf.Variable([0.] * num_coeffs, name='weights')
opt = tf.keras.optimizers.SGD(learning_rate=_learning_rate)

def model(x, w):
    terms = []
    for i in range(num_coeffs):
        terms.append(w[i].numpy() * tf.math.pow(x, i))
    return tf.add_n(terms)

for (x,y) in zip(trX, trY): #trX, trY - массивы numpy с данными для обучения, исходные данные и ожидаемые на выходе данные 
    cost = lambda: (y - model(x,w))**2 #квадрат ошибки
    
    opt.minimize(cost, w)

После чего я заменил вызов метода model в лямбде на прямой расчет с использованием минимизируемой переменной:

cost = lambda: tf.add_n([(y - (w[i].numpy() * tf.math.pow(x, i)))**2 for i in range(len(w.numpy()))])

но и это не помогло.

При этом, изменяя значения в массиве w вручную, я вижу, что ошибка изменяется: Вызов функции с изменениями данных в Jupyter

То есть, если я верно понимаю, зависимость ошибки от переменной w все же есть, но SGD ее не видит Пробовал изменить начальные веса с нулевых на случайные, но это также не помогло

Заранее благодарю за помощь!


Ответы (1 шт):

Автор решения: rivelij

Решение проблемы оказалось до боли простым:

terms.append(w[i].numpy() * tf.math.pow(x, i))

Заменил на

terms.append(w[i] * tf.math.pow(x, i))

Таким образом собственно переменная, а не результат вызова ее метода, влияет на значение потерь

→ Ссылка