使用TensorFlow hessians进行第二次偏导数检验

时间:2018-05-02 13:39:21

标签: tensorflow derivative gradients hessian-matrix

Second partial derivative test是判断临界点是最小值,最大值还是鞍座的简单方法。我目前正在研究为张量流中的简单神经网络实现这种测试的想法。以下权重集用于建模具有2个输入的XOR神经网络,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)
}

现在可以按如下方式获得渐变和hessians:

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错误。

渐变和hessians计算得很好。梯度的维数等于原始输入的维数。 hessians的维度明显不同。

问题:这是一个好主意,甚至可以方便地计算应用于给定的tf.hessian生成的hessians的特征值一套重量?特征值是否能够代表我认为它们代表的东西 - 也就是说,如果整体上都存在正值和负值,那么我们可以得出结论,该点是马鞍点?

到目前为止,我尝试了以下开箱即用的方法来计算每个赫西亚人的特征值:

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工作,但是第3个工作人员爆炸,抱怨Dimensions must be equal, but are 2 and 1 for 'SelfAdjointEigV2_2' (op: 'SelfAdjointEigV2') with input shapes: [2,1,2,1].我应该以某种方式重塑粗麻布并继续,或者我完全走错了轨道?

1 个答案:

答案 0 :(得分:2)

经过一番摆弄后,我发现,给定n*m输入变量矩阵,TensorFlow的tf.hessians产生[n,m,n,m]张量,可以重新形成方形[n*m, n*m] Hessian矩阵如下:

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

此外,人们可以计算得到的方形粗麻布的特征值:

eigenvals = tf.self_adjoint_eigvals(sq_hess)

这可能是微不足道的,但我花了一些时间来解决这个问题。我认为tf.hessians的行为没有很好的记录。但是,一旦你把维度放在一起,一切都有意义!