Гессенская матрица TensorFlow не обновляется после тренировки - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь получить гессенскую матрицу, используя функцию tf.hessians. Принимая во внимание, что значение потерь и переменные обновляются после каждого сеанса обучения, значения матрицы Гессена остаются постоянными. Более того, они не зависят от начальных значений переменных, которые можно установить вручную. На самом деле мой вопрос похож на этот , на который еще не получено ответов. Вот код, который я использовал для тестирования:

import tensorflow as tf

# Model parameters
W = tf.Variable([.3], dtype=tf.float32)
b = tf.Variable([-.3], dtype=tf.float32)

# Model input and output
x = tf.placeholder(tf.float32)
linear_model = W*x + b
y = tf.placeholder(tf.float32)

# loss
loss = tf.reduce_sum(tf.square(linear_model - y)) # sum of the squares

# optimizer
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

# training data
x_train = [1, 2, 3, 4]
y_train = [0, -1, -2, -3]

hess = tf.hessians(loss, [W, b])

# training loop
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init) # reset values to wrong
for i in range(10):
    sess.run(train, {x: x_train, y: y_train})
    cur_hess, curr_W, curr_b, curr_loss = sess.run([hess, W, b, loss], {x: x_train, y: y_train})
    print("W: %s b: %s loss: %s"%(curr_W, curr_b, curr_loss))
    print('cur_hess', cur_hess)

И ниже результат печати:

W: [-0.21999997] b: [-0.456] loss: 4.0181446
cur_hess [array([[60.]], dtype=float32), array([[8.]], dtype=float32)]
W: [-0.39679998] b: [-0.49552] loss: 1.8198745
cur_hess [array([[60.]], dtype=float32), array([[8.]], dtype=float32)]
W: [-0.459616] b: [-0.4965184] loss: 1.5448234
cur_hess [array([[60.]], dtype=float32), array([[8.]], dtype=float32)]
W: [-0.48454273] b: [-0.48487374] loss: 1.4825068
cur_hess [array([[60.]], dtype=float32), array([[8.]], dtype=float32)]
W: [-0.49684232] b: [-0.4691753] loss: 1.444397
cur_hess [array([[60.]], dtype=float32), array([[8.]], dtype=float32)]
W: [-0.5049019] b: [-0.45227283] loss: 1.409699
cur_hess [array([[60.]], dtype=float32), array([[8.]], dtype=float32)]
W: [-0.5115062] b: [-0.43511063] loss: 1.3761029
cur_hess [array([[60.]], dtype=float32), array([[8.]], dtype=float32)]
W: [-0.51758033] b: [-0.41800055] loss: 1.3433373
cur_hess [array([[60.]], dtype=float32), array([[8.]], dtype=float32)]
W: [-0.523432] b: [-0.40104443] loss: 1.3113549
cur_hess [array([[60.]], dtype=float32), array([[8.]], dtype=float32)]
W: [-0.52916396] b: [-0.38427448] loss: 1.2801344
cur_hess [array([[60.]], dtype=float32), array([[8.]], dtype=float32)]

Итак, cur_hess не обновляется, и, кстати, он содержит только 2 элемента вместо 4. Как это исправить? Также я попытался применить tf.gradients дважды, как предложено здесь , но значения не обновляются, как в случае с tf.hessians. В то же время tf.gradients правильно рассчитывает первые производные, и они меняются после каждого цикла обучения. Спасибо.

1 Ответ

0 голосов
/ 04 июля 2018

В этом случае нормально иметь постоянный гессиан, потому что,

loss = Σ [(Wx + b - y)^2]

Это уравнение является квадратичным, а двойная производная квадратичного является постоянной.

∂2(loss)/∂W2 = Σ 2x^2 = 2 * (1 + 4 + 9 + 16) = 60 ;(x = [1,2,3,4])

∂2(loss)/∂b2 = Σ 2 = 2 + 2 + 2 + 2 = 8 ;(4 samples with constant derivative)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...