【问题标题】:Using TensorFlow hessians for second partial derivative test使用 TensorFlow hessian 进行二阶偏导测试
【发布时间】:2018-05-02 13:39:20
【问题描述】:

Second partial derivative test 是一种判断临界点是最小值、最大值还是鞍点的简单方法。我目前正在考虑在 tensorflow 中为简单的神经网络实现这样的测试。以下权重集用于对具有 2 个输入、1 个隐藏层、2 个隐藏单元和 1 个输出单元的 XOR 神经网络进行建模:

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

梯度和粗麻布计算都很好。梯度的维度等于原始输入的维度。 hessian 的维度明显不同。

问题:这是一个好主意吗,甚至可以方便地计算 tf.hessian 生成的 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]. 我应该以某种方式重塑粗麻布并继续,还是我完全走错了路?

【问题讨论】:

    标签: tensorflow derivative gradient hessian-matrix


    【解决方案1】:

    经过一番折腾,我发现,给定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'])])
    

    此外,可以计算得到的正方形 hessian 的特征值:

    eigenvals = tf.self_adjoint_eigvals(sq_hess)
    

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

    【讨论】:

    • tf.hessians() 将提供两个矩阵,分别对应上下块对角矩阵。你如何计算完整的 Hessian 的两个非对角块矩阵?在heref 中查看第 6 页。
    猜你喜欢
    • 1970-01-01
    • 2016-11-07
    • 2021-04-17
    • 2016-05-25
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    相关资源
    最近更新 更多