微积分|预备知识|动手学深度学习

213 阅读2分钟

1. 绘制函数y=f(x)=x31xy = f(x) = x^3 - \frac{1}{x}和其在x=1x = 1处切线的图像。

x = np.arange(0, 3, 0.1)

def g(x):
    return x ** 3 - 1 / x

plot(x, [g(x), 4 * x - 4], 'x', 'g(x)', legend=['g(x)', 'Tangent line (x=1)'])

image.png

2. 求函数f(x)=3x12+5ex2f(\mathbf{x}) = 3x_1^2 + 5e^{x_2}的梯度。

f(x)=[6x1,5ex2]\nabla f(x) = [6x_1, 5e^{x_2}]

3. 函数f(x)=x2f(\mathbf{x}) = \|\mathbf{x}\|_2的梯度是什么?

函数 f(x)=x2f(\mathbf{x}) = \|\mathbf{x}\|_2 表示的是向量 x\mathbf{x}L2L_2 范数,也就是向量的欧几里得距离或者长度,数学上定义为:

f(x)=x12+x22++xn2f(\mathbf{x}) = \sqrt{x_1^2 + x_2^2 + \dots + x_n^2}

其中,x=[x1,x2,,xn]\mathbf{x} = [x_1, x_2, \dots, x_n]^\top 是一个 nn 维实数向量。

为了找到这个函数的梯度,我们需要对每个分量 xix_i 求偏导数。由于这是一个标量函数对向量 x\mathbf{x} 的求导,我们得到的梯度是一个向量,其每个分量是函数对向量中每个元素的偏导数。

f(x)f(\mathbf{x}) 关于 xix_i 的偏导数是:

xif(x)=xix12+x22++xn2\frac{\partial}{\partial x_i} f(\mathbf{x}) = \frac{\partial}{\partial x_i} \sqrt{x_1^2 + x_2^2 + \dots + x_n^2}

利用链式法则,我们得到:

xif(x)=12x12+x22++xn22xi=xix12+x22++xn2\frac{\partial}{\partial x_i} f(\mathbf{x}) = \frac{1}{2\sqrt{x_1^2 + x_2^2 + \dots + x_n^2}} \cdot 2x_i = \frac{x_i}{\sqrt{x_1^2 + x_2^2 + \dots + x_n^2}}

因此,函数 f(x)=x2f(\mathbf{x}) = \|\mathbf{x}\|_2 的梯度 f(x)\nabla f(\mathbf{x}) 是:

f(x)=[fx1,fx2,,fxn]=[x1x12+x22++xn2,x2x12+x22++xn2,,xnx12+x22++xn2]\nabla f(\mathbf{x}) = \left[ \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \dots, \frac{\partial f}{\partial x_n} \right] = \left[ \frac{x_1}{\sqrt{x_1^2 + x_2^2 + \dots + x_n^2}}, \frac{x_2}{\sqrt{x_1^2 + x_2^2 + \dots + x_n^2}}, \dots, \frac{x_n}{\sqrt{x_1^2 + x_2^2 + \dots + x_n^2}} \right]

或者更简洁地表示为:

f(x)=xx2\nabla f(\mathbf{x}) = \frac{\mathbf{x}}{\|\mathbf{x}\|_2}

注意,如果 x\mathbf{x} 是零向量,那么 x2=0\|\mathbf{x}\|_2 = 0,梯度未定义,因为分母为零。在实际应用中,通常需要避免对零向量求此梯度,或者在优化算法中特别处理这种情况。

4. 尝试写出函数u=f(x,y,z)u = f(x, y, z),其中x=x(a,b)x = x(a, b)y=y(a,b)y = y(a, b)z=z(a,b)z = z(a, b)的链式法则。

给定函数 u=f(x,y,z)u = f(x, y, z),其中 x=x(a,b)x = x(a, b)y=y(a,b)y = y(a, b)z=z(a,b)z = z(a, b),我们想要找到 uu 关于变量 aabb 的偏导数。这可以通过链式法则来完成,链式法则是求复合函数导数的一种方法。

首先,我们分别求 uu 关于中间变量 xxyyzz 的偏导数:

ux=fx\frac{\partial u}{\partial x} = \frac{\partial f}{\partial x} uy=fy\frac{\partial u}{\partial y} = \frac{\partial f}{\partial y} uz=fz\frac{\partial u}{\partial z} = \frac{\partial f}{\partial z}

接下来,我们使用链式法则求 uu 关于 aabb 的偏导数。链式法则表明,一个函数关于另一个函数的导数,等于该函数的导数乘以另一个函数的导数。

aa 的偏导数:

ua=uxxa+uyya+uzza\frac{\partial u}{\partial a} = \frac{\partial u}{\partial x} \cdot \frac{\partial x}{\partial a} + \frac{\partial u}{\partial y} \cdot \frac{\partial y}{\partial a} + \frac{\partial u}{\partial z} \cdot \frac{\partial z}{\partial a}

同理,对 bb 的偏导数:

ub=uxxb+uyyb+uzzb\frac{\partial u}{\partial b} = \frac{\partial u}{\partial x} \cdot \frac{\partial x}{\partial b} + \frac{\partial u}{\partial y} \cdot \frac{\partial y}{\partial b} + \frac{\partial u}{\partial z} \cdot \frac{\partial z}{\partial b}

因此,uu 关于 aabb 的偏导数通过链式法则可以表示为:

ua=fxxa+fyya+fzza\frac{\partial u}{\partial a} = \frac{\partial f}{\partial x} \cdot \frac{\partial x}{\partial a} + \frac{\partial f}{\partial y} \cdot \frac{\partial y}{\partial a} + \frac{\partial f}{\partial z} \cdot \frac{\partial z}{\partial a}

ub=fxxb+fyyb+fzzb\frac{\partial u}{\partial b} = \frac{\partial f}{\partial x} \cdot \frac{\partial x}{\partial b} + \frac{\partial f}{\partial y} \cdot \frac{\partial y}{\partial b} + \frac{\partial f}{\partial z} \cdot \frac{\partial z}{\partial b}

这些表达式说明了如何通过链式法则求得 uu 关于原始变量 aabb 的偏导数,其中包含了对中间变量 xxyyzz 的偏导数以及这些中间变量自身对 aabb 的偏导数。