Использование гессиана TensorFlow для второго теста частной производной - PullRequest
0 голосов
/ 02 мая 2018

Второй тест частной производной - это простой способ определить, является ли критическая точка минимумом, максимумом или седлом. В настоящее время я занимаюсь идеей реализации такого теста для простой нейронной сети в тензорном потоке. Следующий набор весов используется для моделирования нейронной сети XOR с 2 входами, 1 скрытым слоем с 2 скрытыми единицами и 1 единицей вывода:

weights = {
    'h1': tf.Variable(np.empty([2, 2]), name="h1", dtype=tf.float64),
    'b1': tf.Variable(np.empty([2]), name="b1", dtype=tf.float64),
    'h2': tf.Variable(np.empty([2, 1]), name="h2", dtype=tf.float64),
    'b2': tf.Variable(np.empty([1]), name="b2", dtype=tf.float64)
}

Теперь и градиенты, и гессианы могут быть получены следующим образом:

gradients = tf.gradients(mse_op, [weights['h1'], weights['b1'], weights['h2'], weights['b2']])
hessians = tf.hessians(mse_op, [weights['h1'], weights['b1'], weights['h2'], weights['b2']])

Где mse_op - ошибка MSE сети.

И градиенты, и гессианы вычисляются просто отлично. Размерность градиентов равна размерности исходных входных данных. Размерность гессианов, очевидно, отличается.

Вопрос : хорошая ли это идея, и возможно ли вообще вычислить собственных значений гессиан, сгенерированных tf.hessian, примененных к данному набору весов? Будут ли собственные значения отражать то, что, я думаю, они представляют, то есть смогу ли я сказать, что если в целом присутствуют как положительные, так и отрицательные значения, то мы можем заключить, что точка является точкой седла ?

До сих пор я пробовал следующий готовый подход для вычисления собственных значений каждого из гессиан:

eigenvals1 = tf.self_adjoint_eigvals(hessians[0])
eigenvals2 = tf.self_adjoint_eigvals(hessians[1])
eigenvals3 = tf.self_adjoint_eigvals(hessians[2])
eigenvals4 = tf.self_adjoint_eigvals(hessians[3])

1,2 и 4 работают, но третий взрывает, жалуясь на то, что Dimensions must be equal, but are 2 and 1 for 'SelfAdjointEigV2_2' (op: 'SelfAdjointEigV2') with input shapes: [2,1,2,1]. Должен ли я просто как-то изменить форму гессиана и продолжить, или я совершенно не на том пути?

1 Ответ

0 голосов
/ 03 мая 2018

После некоторой путаницы я выяснил, что, учитывая n*m матрицу входных переменных, TensorFlow's tf.hessians производит [n,m,n,m] тензор, который может быть преобразован в квадратную [n*m, n*m] матрицу Гессе следующим образом:

sq_hess = tf.reshape(hessians[0], [tf.size(weights['h1']), tf.size(weights['h1'])])

Далее можно вычислить собственные значения результирующего квадратного гессиана:

eigenvals = tf.self_adjoint_eigvals(sq_hess)

Это может быть тривиально, но мне потребовалось некоторое время, чтобы обдумать это. Я считаю, что поведение tf.hessians не очень хорошо задокументировано. Однако, как только вы соберете размерности, все будет иметь смысл!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...