Градиент тензорного потока и оценка гессиана
Я нахожу проблему в оценке градиента тензорного потока r1.2 и функции Гессиана. В частности, я считаю само собой разумеющимся, что оценка градиента проводится численно в точке значений определенных переменных, исследуя реакцию функции-заполнителя.
Однако сейчас я пытаюсь оценить функцию гессиана (то есть градиенты) до и после обучения модели, и я всегда получаю одинаковые результаты (вероятно, в соответствии с заполнителями-заполнителями).
Я использую следующую функцию,
def eval_Consts(sess):
a_v_fin, a_s_fin, a_C_fin, a_a_fin, a_p_fin, loss_fin = sess.run([a_v, a_s, a_C, a_a, a_p, loss], {A:A_train, Z:Z_train, y:BE_train}) #assignes values to parking variables
print a_v_fin, loss_fin
hess = tf.hessians( loss , [a_v, a_s, a_C, a_a, a_p] )
grad = tf.gradients(loss, a_v)
dGra0= tf.gradients(grad[0], a_v)
print '\n', sess.run(a_v, feed_dict={A:A_train, Z:Z_train,
y:BE_train })
print '\n', sess.run(hess, feed_dict={A:A_train, Z:Z_train,
y:BE_train })
print '\n', sess.run(dGra0, feed_dict={A:A_train, Z:Z_train,
y:BE_train })
оценить результаты и рассчитать градиенты один раз до и один раз после тренировки. Обратите внимание, что вычисление и печать a_v и потерь выполняется внутри функции.
На выходе a_v = 20.20000076 и функция потерь, потеря = 1.92866e+09 до тренировки. А после тренировки a_v = 16,8217 и проигрыш = 148206,0.
Однако вторая производная по отношению к a_v, оцененная, как указано выше, дает в обоих случаях одно и то же: 1.52536784e+08.
Более того, результат печати гессиана следующий:
[array([[ 1.52536784e+08]], dtype=float32), array([[ 4804347.]], dtype=float32), array([[ 4.80967168e+09]], dtype=float32), array([[ 226923.421875]], dtype=float32), array([[ 41.58702087]], dtype=float32)]
Другими словами, вовсе не гессиан (который является матрицей всех возможных вторых производных, включая перекрестные производные), а только диагональная часть гессианской матрицы.
Это почему?