🫑Python | C++漂移扩散方程和无风险套利公式算法微分

🏈指点迷津 | Brief

🎯要点

🎯漂移扩散方程计算微分 | 🎯期权无风险套利公式计算微分 | 🎯实现图结构算法微分 | 🎯实现简单正向和反向计算微分 | 🎯实现简单回归分类和生成对抗网络计算微分 | 🎯几何网格计算微分

🍇Python和C++计算微分正反向累积

算法微分在机器学习领域尤为重要。例如,它允许人们在神经网络中实现反向传播,而无需手动计算导数。

计算微分的基础是复合函数偏导数链式法则提供的微分分解。简单结构如:

y=f(g(h(x)))=f(g(h(w0)))=f(g(w1))=f(w2)=w3w0=xw1=h(w0)w2=g(w1)w3=f(w2)=y\begin{aligned} y & =f(g(h(x)))=f\left(g\left(h\left(w_0\right)\right)\right)=f\left(g\left(w_1\right)\right)=f\left(w_2\right)=w_3 \\ w_0 & =x \\ w_1 & =h\left(w_0\right) \\ w_2 & =g\left(w_1\right) \\ w_3 & =f\left(w_2\right)=y \end{aligned}

由链式法则得出:

yx=yw2w2w1w1x=f(w2)w2g(w1)w1h(w0)x\frac{\partial y}{\partial x}=\frac{\partial y}{\partial w_2} \frac{\partial w_2}{\partial w_1} \frac{\partial w_1}{\partial x}=\frac{\partial f\left(w_2\right)}{\partial w_2} \frac{\partial g\left(w_1\right)}{\partial w_1} \frac{\partial h\left(w_0\right)}{\partial x}

通常,存在两种不同的计算微分模式:正向累积和反向累积。

正向累积指定从内到外遍历链式法则(即首先计算 w1/x\partial w_1 / \partial x,然后计算 w2/w1\partial w_2 / \partial w_1,最后计算y/w2 \partial y / \partial w_2 ),而反向累积是从外到内的遍历(首先计算 y/w2\partial y / \partial w_2,然后计算 w2/w1\partial w_2 / \partial w_1,最后计算 w1/x​)\partial w_1 / \partial x​)。更简洁地说,

正向累积计算递归关系:wix=wiwi1wi1x\frac{\partial w_i}{\partial x}=\frac{\partial w_i}{\partial w_{i-1}} \frac{\partial w_{i-1}}{\partial x}w3=yw_3=y

反向累积计算递归关系:ywi=ywi+1wi+1wi\frac{\partial y}{\partial w_i}=\frac{\partial y}{\partial w_{i+1}} \frac{\partial w_{i+1}}{\partial w_i} w0=xw_0=x

正向累积在一次传递中计算函数和导数(但每个仅针对一个独立变量)。相关方法调用期望表达式 Z 相对于变量 V 导出。该方法返回一对已求值的函数及其导数。该方法递归遍历表达式树,直到到达变量。如果请求相对于此变量的导数,则其导数为 1,否则为 0。然后求偏函数以及偏导数。

伪代码:

Python实现正向累积:

C++实现正向累积:

反向累积需要两次传递:在正向传递中,首先评估函数并缓存部分结果。在反向传递中,计算偏导数并反向传播先前导出的值。相应的方法调用期望表达式 Z 被导出,并以父表达式的导出值为种子。对于顶部表达式 Z 相对于 Z 导出,这是 1。该方法递归遍历表达式树,直到到达变量并将当前种子值添加到导数表达式。

伪代码:

Python实现反向累积:

C++实现反向累积:

Last updated

Was this helpful?