tensorflow - 使用 TensorFlow hessian 进行二阶偏导测试
问题描述
二阶偏导数检验是判断临界点是最小值、最大值还是鞍点的简单方法。我目前正在考虑在 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 误差在哪里。
梯度和粗麻布计算都很好。梯度的维度等于原始输入的维度。粗麻布的维度明显不同。
问题:这是一个好主意,甚至可以方便地计算通过应用于给定权重集生成的粗麻布的特征值吗?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].
我应该以某种方式重塑粗麻布并继续,还是我完全走错了路?
解决方案
经过一番摆弄,我发现,给定n*m
输入变量的矩阵,TensorFlowtf.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
没有很好的记录。然而,一旦你把维度放在一起,一切都是有道理的!
推荐阅读
- highcharts - 高库存。防止空白增加新的系列
- maven - 如何为 OpenDayLight Karaf 添加新功能?
- java - 更新旧的 Nutch 插件以能够在 Nutch 2.3.1 中使用 Xpath 解析
- powershell - 导入 CSV 太慢
- php - 从数组属性中获取数据
- sql - 在 SQL Server 中按 concat 分组
- javascript - 用于更漂亮数据的表单输入掩码
- ios - 使用 RxSwift 定期调用 API
- authentication - Mysql Workbench - 使用标准密码创建用户
- deployment - 将solidity智能合约部署到rinkeby测试网络的问题