TensorFlow 求导与梯度计算实战:从一阶到高阶及偏导
本文详细介绍 TensorFlow 中函数求导与梯度计算的具体实现方法。内容涵盖使用 eager execution 进行一阶导数计算、通过嵌套梯度函数求解高阶导数,以及利用 GradientTape 持久化特性处理多变量函数的二阶偏导数。通过完整代码示例,展示如何获取函数值及其各阶导数值,适用于机器学习模型训练中的自动微分场景。
TensorFlow 一阶导数计算
首先介绍如何计算函数的一阶导数。在启用 eager execution 模式后,可以定义一个复合函数 f(x) = sin²(x)。通过 tf.contrib.eager.gradients_function 获取该函数的梯度函数,并传入具体数值(如 0)即可计算出一阶导数值。代码中验证了 f(π/2) 的值为 1.0,并输出了在 x=0 处的梯度值。
import tensorflow as tf
tf.enable_eager_execution()
tfe=tf.contrib.eager
from math import pi
def f(x):
return tf.square(tf.sin(x))
assert f(pi/2).numpy()==1.0
sess=tf.Session()
grad_f=tfe.gradients_function(f)
print(grad_f(np.zeros(1))[0].numpy())
高阶导数的动态生成与可视化
接着演示高阶导数的计算方法。通过封装一个 grad 函数,利用 tfe.gradients_function 动态生成任意阶导数的计算逻辑。示例中定义了 f(x) = sin²(x),并绘制了原函数、一阶导数、二阶导数和三阶导数的图像。通过遍历 x 轴上的点,分别计算并绘制各阶导数曲线,直观展示高阶导数的变化趋势。
import numpy as np
def f(x):
return tf.square(tf.sin(x))
def grad(f):
return lambda x:tfe.gradients_function(f)(x)[0]
x=tf.lin_space(-2*pi,2*pi,100)
# print(grad(f)(x).numpy())
x=x.numpy()
import matplotlib.pyplot as plt
plt.plot(x,f(x).numpy(),label="f")
plt.plot(x,grad(f)(x).numpy(),label="first derivative")#一阶导
plt.plot(x,grad(grad(f))(x).numpy(),label="second derivative")#二阶导
plt.plot(x,grad(grad(grad(f)))(x).numpy(),label="third derivative")#三阶导
plt.legend()
plt.show()
def f(x,y):
output=1
for i in range(int(y)):
output=tf.multiply(output,x)
return output
def g(x,y):
return tfe.gradients_function(f)(x,y)[0]
print(f(3.0,2).numpy()) #f(x)=x^2
print(g(3.0,2).numpy()) #f'(x)=2*x
print(f(4.0,3).numpy())#f(x)=x^3
print(g(4.0,3).numpy())#f(x)=3x^2
基于 GradientTape 的偏导数计算
随后讲解如何计算函数的二阶偏导数。利用 tf.GradientTape 并设置 persistent=True 以允许重复使用梯度记录。在上下文管理器中,先计算 y 对 x 的梯度,再计算 z 对 y 的梯度,最后计算 z 对 x 的二阶梯度。代码展示了如何逐步获取中间变量和最终变量的梯度值,并遍历矩阵元素输出具体数值。
x=tf.ones((2,2))
with tf.GradientTape(persistent=True) as t:
t.watch(x)
y=tf.reduce_sum(x)
z=tf.multiply(y,y)
dz_dy=t.gradient(z,y)
print(dz_dy.numpy())
dz_dx=t.gradient(z,x)
print(dz_dx.numpy())
for i in [0, 1]:
for j in [0, 1]:
print(dz_dx[i][j].numpy() )
嵌套 GradientTape 实现二阶导数
最后展示嵌套 GradientTape 计算二阶导数的方法。通过创建两个嵌套的 GradientTape 上下文,内层 tape 用于计算一阶导数 dy/dx,外层 tape 用于计算一阶导数对 x 的梯度,即二阶导数 d²y/dx²。示例中计算 y = x³ 的一阶和二阶导数,并输出具体数值结果。
x=tf.constant(2.0)
with tf.GradientTape() as t:
with tf.GradientTape() as t2:
t2.watch(x)
y=x*x*x
dy_dx=t2.gradient(y,x)
d2y_dx2=t.gradient(dy_dx,x)
print(dy_dx.numpy())
print(d2y_dx2.numpy())
以上即为 TensorFlow 中求导和梯度计算的完整实例,涵盖了从基础一阶导数到高阶及偏导数的多种应用场景。希望这些示例能帮助读者更好地理解和应用自动微分功能,欢迎参考并在实际项目中尝试。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









