TensorFlow:计算Hessian矩阵(和高阶导数)

斯特凡诺

我希望能够为损失函数计算高阶导数。至少我希望能够计算Hessian矩阵。目前,我正在计算与Hessian的数值近似值,但这更加昂贵,并且据我所知,更重要的是,如果矩阵是病态的(条件数非常大),则是不准确的。

Theano通过符号循环实现此功能,请参见此处,但Tensorflow似乎尚不支持符号控制流,请参见此处在TF github页面上也提出了类似的问题,请参见此处,但是一段时间以来似乎没人在关注这个问题。

是否有人知道TensorFlow中(符号化地)计算高阶导数的最新发展或方法?

拉贾尔希·米特拉(Rajarshee Mitra)

好了,您可以轻松地计算出粗麻布矩阵!

假设您有两个变量:

x = tf.Variable(np.random.random_sample(), dtype=tf.float32)
y = tf.Variable(np.random.random_sample(), dtype=tf.float32)

以及使用以下两个变量定义的函数:

f = tf.pow(x, cons(2)) + cons(2) * x * y + cons(3) * tf.pow(y, cons(2)) + cons(4) * x + cons(5) * y + cons(6)

在哪里:

def cons(x):
    return tf.constant(x, dtype=tf.float32)

所以用代数术语来说,这个函数是

在此处输入图片说明

现在,我们定义一种计算粗麻布的方法:

def compute_hessian(fn, vars):
    mat = []
    for v1 in vars:
        temp = []
        for v2 in vars:
            # computing derivative twice, first w.r.t v2 and then w.r.t v1
            temp.append(tf.gradients(tf.gradients(f, v2)[0], v1)[0])
        temp = [cons(0) if t == None else t for t in temp] # tensorflow returns None when there is no gradient, so we replace None with 0
        temp = tf.pack(temp)
        mat.append(temp)
    mat = tf.pack(mat)
    return mat

并调用:

# arg1: our defined function, arg2: list of tf variables associated with the function
hessian = compute_hessian(f, [x, y])

现在我们获取一个tensorflow会话,初始化变量,然后运行hessian

sess = tf.Session()
sess.run(tf.initialize_all_variables())
print sess.run(hessian)

注意:由于我们使用的函数本质上是二次函数(并且我们进行了两次微分),所以返回的粗麻布将具有恒定值,而与变量无关。

输出为:

[[ 2.  2.]
[ 2.  6.]]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Tensorflow:针对高阶张量计算Hessian矩阵(仅对角线部分)

来自分类Dev

如何计算Tensorflow中的所有二阶导数(仅是Hessian矩阵的对角线)?

来自分类Dev

高阶导数

来自分类Dev

高阶函数-接收lambda函数以进行导数计算

来自分类Dev

jax中的高阶多元导数

来自分类Dev

使用Sympy的矩阵导数

来自分类Dev

导数矩阵的python迭代

来自分类Dev

使用syms和diff在MATLAB中计算混合导数

来自分类Dev

如何在pytorch中为网络中的所有参数计算hessian矩阵?

来自分类Dev

填充大矩阵和计算

来自分类Dev

矩阵列的累积和与计算

来自分类Dev

计算图像的y导数

来自分类Dev

计算函数的偏导数

来自分类Dev

计算图像的y导数

来自分类Dev

计算列表中值的导数

来自分类Dev

通过 SciPy 计算导数

来自分类Dev

查找函数的符号Hessian矩阵

来自分类Dev

如何使用TensorFlow计算矩阵运算?

来自分类Dev

矩阵导数未得到评估

来自分类Dev

矩阵导数未得到评估

来自分类Dev

如何获得图像的一阶和二阶导数矩阵

来自分类Dev

以下语法的左导数和右导数

来自分类Dev

难以理解tf.custom_gradient()的高阶导数

来自分类Dev

计算python中的点的导数

来自分类Dev

使用PyTorch计算函数的导数

来自分类Dev

用awk计算利率/“导数”

来自分类Dev

Opencv:从R和T计算基本矩阵

来自分类Dev

使用循环和条件进行矩阵计算

来自分类Dev

矩阵计算和避免被零除