跳到主要内容

微积分快速回顾

微积分与深度学习的关系

微积分在深度学习中起着重要作用,它是深度学习背后数学原理的基石之一。深度学习涉及许多复杂的数学概念和运算,而微积分提供了处理这些概念和运算的工具和框架。以下是微积分与深度学习之间的一些关系:

  1. 梯度下降和优化: 深度学习中的优化算法(如梯度下降)使用了微积分的概念。梯度下降通过计算损失函数关于模型参数的梯度(导数),然后沿着梯度的反方向更新参数,从而优化模型。微积分中的导数和偏导数是梯度计算的基础。

  2. 反向传播算法: 反向传播是训练神经网络的关键技术,它通过链式法则计算梯度。这个过程依赖于微积分中的链式法则,它允许我们有效地计算复合函数的导数。

  3. 函数逼近: 深度学习模型通常是复杂的非线性函数逼近器。微积分的概念,如导数和曲线的切线,帮助我们理解和建模这些复杂的函数关系。

  4. 激活函数: 在神经网络中,激活函数引入非线性性。微积分中的导数帮助我们理解激活函数的变化率和对损失函数的影响。

  5. 积分和期望: 在某些情况下,深度学习涉及对函数的积分或期望值的计算。这涉及到微积分的积分概念。

  6. 微分方程: 深度学习也在求解微分方程和时间序列建模中发挥作用。微积分提供了解决这些问题的数学工具。

总之,微积分为深度学习提供了数学基础,使得我们能够理解、开发和优化复杂的神经网络模型。虽然不是必须要精通微积分才能进行深度学习,但对微积分的理解可以帮助深入理解深度学习的背后原理和技术。

积分是什么?

积分是数学中的一个基本概念,它表示对一个函数的某种性质在一个给定区间内的累积或总和。积分的主要目的是测量曲线下的面积,描述变化率,求解方程等。

具体来说,积分可以有不同的含义和用途,主要分为以下两种常见类型:

  1. 不定积分:不定积分通常用于找到一个函数的原函数,也称为不定积分的结果。原函数是指一个函数的导数,因此不定积分可以看作是导数的逆运算。不定积分的结果通常包含一个常数项,因为导数无法确定原函数的常数部分。

    例如,如果我们有一个函数 f(x)f(x),它的不定积分表示为 f(x)dx\int f(x) dx,则结果是一个函数 F(x)F(x),其中 F(x)=f(x)F'(x) = f(x),即 F(x)F(x)f(x)f(x) 的一个原函数。

  2. 定积分:定积分用于计算一个函数在一个特定区间内的累积效应或总和,通常表示为 abf(x)dx\int_a^b f(x) dx,其中 aabb 是积分的上下限。定积分的结果是一个数值,表示在区间 [a,b][a, b] 内的面积或其他性质。

    例如,如果我们有一个函数 f(x)f(x),我们可以使用定积分来计算该函数在区间 [a,b][a, b] 内的面积,这个面积表示为 abf(x)dx\int_a^b f(x) dx

积分在数学中有广泛的应用,包括解决微积分问题、计算曲线下的面积、描述物理过程中的累积效应、计算概率分布下的期望值等。它是数学和科学领域中不可或缺的工具之一。

\int\sum 的区别

\int\sum 是两个在数学中表示累积或总和的符号,但它们用于不同类型的数量和不同背景的数学概念,因此具有一些关键区别:

  1. 用途

    • \int 表示积分,用于测量曲线下的面积、计算变化率、求解方程等连续性的操作。积分通常用于处理连续函数或曲线。
    • \sum 表示求和,用于对离散集合中的元素进行累积操作。求和通常用于处理离散数据、序列、级数等。
  2. 数学对象

    • \int 通常与连续函数相关,用于对函数在一个区间内的积分,结果是一个数值或函数。
    • \sum 通常与离散序列或集合相关,用于对序列或集合中的元素进行累积求和,结果是一个数值。

总之,\int\sum 分别用于处理不同类型的数量和数学概念,\int 用于连续性的操作和函数,而 \sum 用于离散性的操作和集合或序列。它们在数学中具有不同的应用和含义。

求不定积分

求不定积分是找到一个函数的原函数(也称为不定积分的结果)。原函数是指一个函数的导数,因此不定积分可以看作是导数的逆运算。下面举例说明如何求不定积分以及不定积分与导数之间的关系。

考虑函数 f(x)=2xf(x) = 2x,我们想求它的不定积分 f(x)dx\int f(x) dx

步骤 1:写出不定积分的表达式。不定积分的一般形式为 f(x)dx\int f(x) dx,其中 f(x)f(x) 是被积函数,xx 是积分变量。

2xdx\int 2x dx

步骤 2:计算不定积分。要计算这个不定积分,我们可以使用幂的不定积分公式。对于 xnx^n 形式的函数,不定积分的结果是 1n+1xn+1\frac{1}{n+1} x^{n+1},其中 nn 不等于 -1。

在我们的例子中,n=1n = 1,所以:

2xdx=212x2+C\int 2x dx = 2 \cdot \frac{1}{2} x^{2} + C

步骤 3:添加常数项。不定积分结果中通常包含一个常数项 CC,因为导数无法确定原函数的常数部分。

212x2+C=x2+C2 \cdot \frac{1}{2} x^{2} + C = x^{2} + C

所以,不定积分 2xdx\int 2x dx 的结果是 x2+Cx^2 + C,其中 CC 是常数。

关于不定积分和导数的关系:

  • 不定积分是导数的逆运算。如果 F(x)F(x) 是函数 f(x)f(x) 的一个原函数(即 F(x)=f(x)F'(x) = f(x)),那么 f(x)dx=F(x)+C\int f(x) dx = F(x) + C,其中 CC 是常数。这意味着如果我们对 F(x)F(x) 求导,将会得到 f(x)f(x)

  • 在上面的例子中,我们求得不定积分 2xdx=x2+C\int 2x dx = x^2 + C,如果我们对 x2+Cx^2 + C 求导,将会得到 2x2x,即原来的函数 f(x)=2xf(x) = 2x

  • 常数 CC 是积分常数,因为不定积分结果包含无法确定的常数项。不同的原函数可能会有不同的常数项,但它们的导数是相同的。

不定积分在微积分中用于解决各种问题,包括计算曲线下的面积、求解微分方程、估计累积效应等。

导数和微分

导数和微分都是微积分中重要的概念,用于研究函数的变化率和斜率。虽然它们经常一起出现,但它们在某些情况下有不同的含义。

备注

快速理解版:

很多数学概念不好理解,原因有很多,其中很重要的一个是它们的汉语表达,和我们的直觉经验相差太远。

那么,如果我们把这些概念和自己的日常经验和形象直觉构建起来了一种联系,它们就好理解一些了。

从现在开始,忘了导数、微分和偏导数这三个概念。

首先引入第一个概念:变化率。

小强第一天吃1个包子,第二天吃 2 个,第三天吃 3 个,第四天吃 4 个。

那么 x 为时间,y 为包子,则构成 x=1,2,3,4x={1,2,3,4}y=1,2,3,4y={1,2,3,4}

变化率就是包子变化的量(增量),比上时间变化的量,就是包子减包子再除以时间减时间,在这个例子里,变化率一直为1。

所以变化率就很好理解了,在这个例子里就是单位时间内的包子变化量。扩大开来,就是纵轴的变化量比上横轴的变化量。

它的函数是 y=x,那么,y=2x 呢?同理可发现变化率为2。

再引入第二个概念:最微小变化量。

假设你在游戏中操作一个英雄,他开始的战斗力为100点,你在游戏中获得了一个宝藏,打开之后,每秒钟力量增加1点,那么随着时间流逝,战斗力必将无限增加。

那么,每1秒钟增加1点,或者10秒中增加10点,都是变化量。

那么,每0.000……1秒增加了多少呢?增加了0.000……1点战斗力,这个微小的不能再微小的增加,就是最微小变化量。

再引入第三个概念:相对变化率。

假如,在这个游戏中,英雄在打开宝藏之后,又喝了战斗之水,战斗之水的变化规律是指数级变化,y=x²,喝x滴水,战斗力增长x²。

那么,这个时候,战斗力随着宝藏和战斗力共同增长,而变化,也随着宝藏赋予和战斗之水赋予,呈现出两个变化的和。

在这个情况下,如果我们假设“战斗之水”为不变参数(常数),而只把宝藏当作变化量,求宝藏带来的变化率,这个结果相对变化率。(以上是为了通俗说明,事实上举例中存在不严谨的地方。)

综上,下面我们进行改名工作——

  • 把变化率换成导数
  • 把最微小变化量换成微分
  • 把相对变化率换成偏导数

导数是什么?

导数(Derivative): 导数是描述函数在某一点的变化率的概念。对于一个函数 f(x)f(x),在某一点 x0x_0 处的导数 f(x0)f'(x_0) 表示函数在该点的切线斜率,即函数曲线在该点的局部变化速率。数学上,导数可以通过极限来定义:

f(x0)=limh0f(x0+h)f(x0)hf'(x_0) = \lim_{h \to 0} \frac{f(x_0 + h) - f(x_0)}{h}

这个定义表示当我们在点 x0x_0 处偏移一个微小量 hh 时,函数 f(x)f(x) 在该点的变化量与 hh 的比值。随着 hh 趋近于零,这个比值逼近了函数在 x0x_0 处的切线斜率,即导数。

让我们通过一个具体的例子来理解导数。考虑函数 f(x)=x2f(x) = x^2,我们要计算它在 x0=2x_0 = 2 处的导数。

首先,我们计算导数的极限表达式:

f(2)=limh0f(2+h)f(2)hf'(2) = \lim_{h \to 0} \frac{f(2 + h) - f(2)}{h}

代入函数 f(x)=x2f(x) = x^2,我们有:

f(2)=limh0(2+h)222hf'(2) = \lim_{h \to 0} \frac{(2 + h)^2 - 2^2}{h}

展开并化简:

f(2)=limh04+4h+h24h=limh04h+h2hf'(2) = \lim_{h \to 0} \frac{4 + 4h + h^2 - 4}{h} = \lim_{h \to 0} \frac{4h + h^2}{h}

可以取消分子和分母中的 hh

f(2)=limh0(4+h)f'(2) = \lim_{h \to 0} (4 + h)

hh 趋近于零时,上述极限趋近于 44。因此,函数 f(x)=x2f(x) = x^2x0=2x_0 = 2 处的导数为 f(2)=4f'(2) = 4

这意味着在 x=2x = 2 处,函数 f(x)=x2f(x) = x^2 的切线斜率为 44,即函数在该点的变化速率。

微分是什么?

微分(Differentiation): 微分是一种操作,用于计算函数的导数。

微分是微积分中的一个概念,用于描述函数在某一点的变化率。数学符号表示一个函数 f(x)f(x) 在点 x0x_0 处的微分为 f(x0)f'(x_0),也可以写成 dydxx=x0\frac{dy}{dx}\Big|_{x=x_0}。这表示当自变量 xx 在点 x0x_0 处发生微小变化时,函数 yy 在该点处的变化率。

微分的计算方法取决于函数的具体形式。通常,我们使用极限的概念来计算微分。具体步骤如下:

  1. 考虑函数 f(x)f(x)
  2. 选择一个点 x0x_0,我们想要计算在该点的微分。
  3. 引入一个小的增量 hh,表示 xx 的微小变化。这样,x0+hx_0 + h 就是一个紧邻 x0x_0 的点。
  4. 计算函数在 x0x_0 处和 x0+hx_0 + h 处的函数值:f(x0)f(x_0)f(x0+h)f(x_0 + h)
  5. 计算增量比率:f(x0+h)f(x0)h\frac{f(x_0 + h) - f(x_0)}{h}
  6. hh 趋近于 0 时,这个增量比率逼近了函数在 x0x_0 处的切线斜率,即微分 f(x0)f'(x_0)

举个简单的例子,考虑函数 f(x)=x2f(x) = x^2,我们想要计算它在点 x=2x = 2 处的微分。

  1. 函数:f(x)=x2f(x) = x^2
  2. 点:x0=2x_0 = 2
  3. 增量:hh
  4. 函数值:f(x0)=f(2)=22=4f(x_0) = f(2) = 2^2 = 4f(x0+h)=f(2+h)=(2+h)2f(x_0 + h) = f(2 + h) = (2 + h)^2
  5. 增量比率:f(2+h)f(2)h=(2+h)24h\frac{f(2 + h) - f(2)}{h} = \frac{(2 + h)^2 - 4}{h}
  6. hh 趋近于 0 时,计算极限:
limh0(2+h)24h=limh0(4+4h+h24)=limh0(4h+h2)=4\lim_{h \to 0} \frac{(2 + h)^2 - 4}{h} = \lim_{h \to 0} (4 + 4h + h^2 - 4) = \lim_{h \to 0} (4h + h^2) = 4

所以,函数 f(x)=x2f(x) = x^2 在点 x=2x = 2 处的微分为 4,表示当 xx 在接近 2 的地方微小变化时,函数值 yy(即 x2x^2)会以约为 4 倍的速率变化。

以下是一些常用函数求微分的例子,包括一阶和高阶导数:

  1. 多项式函数

    • f(x)=x3f(x) = x^3,则 ddx[x3]=3x2\frac{d}{dx} [x^3] = 3x^2
    • f(x)=2x4+5x23f(x) = 2x^4 + 5x^2 - 3,则 ddx[2x4+5x23]=8x3+10x\frac{d}{dx} [2x^4 + 5x^2 - 3] = 8x^3 + 10x
  2. 指数函数

    • f(x)=exf(x) = e^x,则 ddx[ex]=ex\frac{d}{dx} [e^x] = e^x
    • f(x)=2e2xf(x) = 2e^{2x},则 ddx[2e2x]=4e2x\frac{d}{dx} [2e^{2x}] = 4e^{2x}
  3. 对数函数

    • f(x)=ln(x)f(x) = \ln(x),则 ddx[ln(x)]=1x\frac{d}{dx} [\ln(x)] = \frac{1}{x}
    • f(x)=3ln(2x)f(x) = 3\ln(2x),则 ddx[3ln(2x)]=3x\frac{d}{dx} [3\ln(2x)] = \frac{3}{x}
  4. 三角函数

    • f(x)=sin(x)f(x) = \sin(x),则 ddx[sin(x)]=cos(x)\frac{d}{dx} [\sin(x)] = \cos(x)
    • f(x)=2cos(3x)f(x) = 2\cos(3x),则 ddx[2cos(3x)]=6sin(3x)\frac{d}{dx} [2\cos(3x)] = -6\sin(3x)
  5. 幂函数

    • f(x)=x0.5f(x) = x^{0.5},则 ddx[x0.5]=12x\frac{d}{dx} [x^{0.5}] = \frac{1}{2\sqrt{x}}
    • f(x)=3x2f(x) = 3x^{-2},则 ddx[3x2]=6x3\frac{d}{dx} [3x^{-2}] = -6x^{-3}

这里给出的是一阶导数的示例。

可微是什么意思?

"可微"是微积分中的一个重要概念,指的是函数在某一点上具有导数,也就是函数在该点附近能够通过一条切线来近似描述。

一个函数 f(x)f(x) 在某点 x0x_0 处可微的意思是,存在一个常数 aa,使得当 xxx0x_0 附近变化时,函数值 f(x)f(x) 的变化可以近似地表示为:

f(x)f(x0)+a(xx0).f(x) \approx f(x_0) + a(x - x_0).

其中,f(x0)f(x_0) 是函数在点 x0x_0 处的值,xx0x - x_0xx 相对于 x0x_0 的偏移量。常数 aa 就是该点处的导数,也就是切线的斜率。

换句话说,一个可微函数在某一点附近的行为可以用一条切线来近似描述。这个概念在微积分中非常重要,因为它涉及到函数的变化率以及函数在特定点的局部性质。函数在每一个可微点都有一个对应的导数,可以用来描述函数在该点的斜率和变化速率。

有一些函数在某些点上不可微,这些点通常包括以下情况:

  1. 不连续点:在不连续点,函数的导数通常不存在。例如,绝对值函数 x|x|x=0x = 0 处不可微,因为它在该点不连续。

  2. 角点和尖点:函数在角点(如绝对值函数的尖点)或者尖点(如锐角转折点)处也可能不可微。这是因为在这些点上函数的变化过于剧烈,没有一个单一的切线能够合理地近似函数的行为。

  3. 间断点:函数在某些间断点上可能不可微。一个间断点是一个点,函数在该点的左右极限不相等。在间断点上,函数的变化也可能太大以至于没有明确的切线。

  4. 奇点:在奇点,函数的导数可能不存在或趋近于无穷大。例如,函数 f(x)=1xf(x) = \frac{1}{x}x=0x = 0 处不可微,因为它在该点取无穷大。

  5. 多项式函数的某些阶数上:尽管多项式函数一般来说是可微的,但在某些阶数上它们可能不可微。例如,整数次幂小于零的阶数,如 x1x^{-1},在 x=0x = 0 处不可微。

总之,不可微函数通常与函数在某些点的特定行为相关,其中函数的变化过于剧烈、不连续或者在某些方面没有平滑的特性。在这些点上,导数无法通过单一的切线来描述函数的变化率。

微分和导数的关系是什么?

微分和导数是紧密相关的概念,它们在微积分中都涉及函数的变化率,但从不同的角度来看待。

导数是微分的特殊情况,可以将导数看作是微分在某一点的具体值。更具体地说,函数 f(x)f(x) 在点 x0x_0 处的导数 f(x0)f'(x_0) 可以被理解为函数在点 x0x_0 处的微分。导数描述了函数在每一点的变化率,而微分描述的是函数在某一点的变化率。

换句话说,导数是函数变化率的函数,它告诉我们在整个定义域上的每一点处函数的变化率。而微分是指函数在特定点处的变化率,它可以看作是导数在某一点的极限情况。因此,导数和微分之间的关系可以总结如下:

  • 导数是函数在每一点处的微分值。
  • 微分是导数在某一点的极限情况,即微小变化趋近于零时的导数值。

这两个概念密切相关,共同构成了微积分的基础。通过理解导数和微分的关系,我们可以更好地理解函数的变化以及曲线的性质。

微分和导数的示意图:

import torch

# 定义函数 f(x) = x^2
def f(x):
return x**2

# 在 x = 3 处计算导数
x0 = torch.tensor(3.0, requires_grad=True)
y = f(x0)
y.backward() # 计算导数
derivative = x0.grad.item() # 获取导数值

# 在 x = 3 处计算微分
differential = f(x0).item()

print("Function value at x =", x0.item(), ":", differential)
print("Derivative at x =", x0.item(), ":", derivative)
Function value at x = 3.0 : 9.0
Derivative at x = 3.0 : 6.0

导数的几个等价符号

当处理函数的导数时,常常需要运用以下法则来进行计算。这些法则可以用数学符号表示如下:

  1. 常数相乘法则: 如果 f(x)f(x) 是一个函数,而 cc 是一个常数,则导数 ddx[cf(x)]\frac{d}{dx} [c \cdot f(x)] 可以表示为 cddx[f(x)]c \cdot \frac{d}{dx} [f(x)]

    例子: 设 f(x)=3x2f(x) = 3x^2,其中 c=2c = 2。则根据常数相乘法则,导数为:

ddx[23x2]=2ddx[3x2]=26x=12x.\frac{d}{dx} [2 \cdot 3x^2] = 2 \cdot \frac{d}{dx} [3x^2] = 2 \cdot 6x = 12x.
  1. 加法法则: 如果 f(x)f(x)g(x)g(x) 都是函数,则导数 ddx[f(x)+g(x)]\frac{d}{dx} [f(x) + g(x)] 可以表示为 ddx[f(x)]+ddx[g(x)]\frac{d}{dx} [f(x)] + \frac{d}{dx} [g(x)]

    例子: 设 f(x)=x2f(x) = x^2g(x)=3xg(x) = 3x。根据加法法则,导数为:

ddx[x2+3x]=ddx[x2]+ddx[3x]=2x+3.\frac{d}{dx} [x^2 + 3x] = \frac{d}{dx} [x^2] + \frac{d}{dx} [3x] = 2x + 3.
  1. 乘法法则: 如果 f(x)f(x)g(x)g(x) 都是函数,则导数 ddx[f(x)g(x)]\frac{d}{dx} [f(x) \cdot g(x)] 可以表示为 f(x)ddx[g(x)]+g(x)ddx[f(x)]f(x) \cdot \frac{d}{dx} [g(x)] + g(x) \cdot \frac{d}{dx} [f(x)]

    例子: 设 f(x)=xf(x) = xg(x)=x2g(x) = x^2。根据乘法法则,导数为:

    ddx[xx2]=xddx[x2]+x2ddx[x]=x2x+x21=3x2.\frac{d}{dx} [x \cdot x^2] = x \cdot \frac{d}{dx} [x^2] + x^2 \cdot \frac{d}{dx} [x] = x \cdot 2x + x^2 \cdot 1 = 3x^2.
  2. 除法法则: 如果 f(x)f(x)g(x)g(x) 都是函数,且 g(x)g(x) 不为零,则导数 ddx[f(x)g(x)]\frac{d}{dx} \left[\frac{f(x)}{g(x)}\right] 可以表示为 g(x)ddx[f(x)]f(x)ddx[g(x)](g(x))2\frac{g(x) \cdot \frac{d}{dx}[f(x)] - f(x) \cdot \frac{d}{dx}[g(x)]}{(g(x))^2}

    例子: 设 f(x)=1f(x) = 1g(x)=xg(x) = x。根据除法法则,导数为:

ddx[1x]=xddx[1]1ddx[x]x2=01x2=1x2.\frac{d}{dx} \left[\frac{1}{x}\right] = \frac{x \cdot \frac{d}{dx}[1] - 1 \cdot \frac{d}{dx}[x]}{x^2} = \frac{0 - 1}{x^2} = -\frac{1}{x^2}.

这些法则是求导过程中常用的工具,可以帮助简化函数的导数计算。

偏导数

偏导数是多元函数的导数概念的推广,用于描述函数在多个变量中的变化率。当一个函数依赖于多个变量时,每个变量的变化都可能影响函数的值。偏导数衡量了在其他变量保持不变的情况下,函数相对于某个特定变量的变化率。

形式上,如果有一个函数 f(x1,x2,,xn)f(x_1, x_2, \ldots, x_n),那么对于其中的第 ii 个变量 xix_i,它的偏导数记作 fxi\frac{\partial f}{\partial x_i},表示在其他变量保持不变的情况下,函数 ff 相对于变量 xix_i 的变化率。

以下是一些例子来说明偏导数的概念:

  1. 二元函数的偏导数: 考虑函数 f(x,y)=x2+2xy+y2f(x, y) = x^2 + 2xy + y^2。其分别对 xxyy 的偏导数分别为: fx=2x+2y\frac{\partial f}{\partial x} = 2x + 2y,表示在保持 yy 不变的情况下,函数相对于 xx 的变化率。 fy=2x+2y\frac{\partial f}{\partial y} = 2x + 2y,表示在保持 xx 不变的情况下,函数相对于 yy 的变化率。

  2. 三元函数的偏导数: 考虑函数 g(x,y,z)=x2+y2+z2g(x, y, z) = x^2 + y^2 + z^2。其分别对 xxyyzz 的偏导数分别为: gx=2x\frac{\partial g}{\partial x} = 2x,表示在保持 yyzz 不变的情况下,函数相对于 xx 的变化率。 gy=2y\frac{\partial g}{\partial y} = 2y,表示在保持 xxzz 不变的情况下,函数相对于 yy 的变化率。 gz=2z\frac{\partial g}{\partial z} = 2z,表示在保持 xxyy 不变的情况下,函数相对于 zz 的变化率。

当涉及到计算偏导数时,以下是一些常见的例子,展示了如何根据不同的函数类型计算偏导数:

  1. 一元多次函数:考虑函数 f(x)=x3+2x25x+7f(x) = x^3 + 2x^2 - 5x + 7。我们可以分别计算关于 xx 的偏导数:

    • dfdx=3x2+4x5\frac{df}{dx} = 3x^2 + 4x - 5
  2. 多元函数:考虑函数 g(x,y)=x2+3xy+y2g(x, y) = x^2 + 3xy + y^2。计算关于 xxyy 的偏导数:

    • gx=2x+3y\frac{\partial g}{\partial x} = 2x + 3y
    • gy=3x+2y\frac{\partial g}{\partial y} = 3x + 2y
  3. 指数函数:考虑函数 h(x)=e2xh(x) = e^{2x}。计算关于 xx 的偏导数:

    • dhdx=2e2x\frac{dh}{dx} = 2e^{2x}
  4. 三角函数:考虑函数 k(x)=sin(3x)k(x) = \sin(3x). 计算关于 xx 的偏导数:

    • dkdx=3cos(3x)\frac{dk}{dx} = 3\cos(3x)
  5. 复合函数:考虑函数 p(u,v)=u3+v2p(u, v) = u^3 + v^2,其中 u=2x+1u = 2x + 1v=3y2v = 3y - 2。计算关于 xxyy 的偏导数:

    • 使用链式法则,px=puux=3u22=6(2x+1)2\frac{\partial p}{\partial x} = \frac{\partial p}{\partial u} \cdot \frac{\partial u}{\partial x} = 3u^2 \cdot 2 = 6(2x + 1)^2
    • 同理,py=pvvy=2v3=6(3y2)\frac{\partial p}{\partial y} = \frac{\partial p}{\partial v} \cdot \frac{\partial v}{\partial y} = 2v \cdot 3 = 6(3y - 2)
  6. 向量范数的平方:考虑函数 q(x)=x2q(\mathbf{x}) = \|\mathbf{x}\|^2,其中 x=[x1,x2,,xn]\mathbf{x} = [x_1, x_2, \ldots, x_n]. 计算关于向量 x\mathbf{x} 的偏导数:

    • 使用向量的分量表示,qxi=2xi\frac{\partial q}{\partial x_i} = 2x_i,然后将分量导数合并为向量导数,xq=2x\nabla_{\mathbf{x}} q = 2\mathbf{x}

这些例子涵盖了不同类型的函数和计算方法,从一元函数到多元函数、复合函数和特殊函数。对于更复杂的函数,可能需要应用多个规则(如链式法则、乘积法则等)以及代数运算来计算偏导数。

当计算函数的偏导数时,逐步进行推导可以帮助理解每一步的计算过程。以下是两个例子,分别介绍计算关于 xx 的偏导数的详细步骤:

例子 1:多元函数的偏导数计算 考虑函数 f(x,y)=x2+3xy+y2f(x, y) = x^2 + 3xy + y^2,我们要计算关于 xx 的偏导数 fx\frac{\partial f}{\partial x} 和关于 yy 的偏导数 fy\frac{\partial f}{\partial y}

  1. 计算 fx\frac{\partial f}{\partial x}

    • f(x,y)f(x, y) 中的 xx 视为自变量,其它变量视为常数。
    • 对于每一项 x2x^2, 3xy3xy, 和 y2y^2,分别计算它们关于 xx 的导数:
      • x(x2)=2x\frac{\partial}{\partial x}(x^2) = 2x
      • x(3xy)=3y\frac{\partial}{\partial x}(3xy) = 3y
      • x(y2)=0\frac{\partial}{\partial x}(y^2) = 0(因为 yy 视为常数)。
    • 把这些导数相加,得到 fx=2x+3y\frac{\partial f}{\partial x} = 2x + 3y
  2. 计算 fy\frac{\partial f}{\partial y}

    • 类似地,将 f(x,y)f(x, y) 中的 yy 视为自变量,其它变量视为常数。
    • 对于每一项 x2x^2, 3xy3xy, 和 y2y^2,分别计算它们关于 yy 的导数:
      • y(x2)=0\frac{\partial}{\partial y}(x^2) = 0(因为 xx 视为常数),
      • y(3xy)=3x\frac{\partial}{\partial y}(3xy) = 3x
      • y(y2)=2y\frac{\partial}{\partial y}(y^2) = 2y
    • 把这些导数相加,得到 fy=3x+2y\frac{\partial f}{\partial y} = 3x + 2y

例子 2:复合函数的偏导数计算 考虑函数 g(x)=e2x2g(x) = e^{2x^2},我们要计算关于 xx 的导数 dgdx\frac{dg}{dx}

  1. g(x)g(x) 视为复合函数,u=2x2u = 2x^2 是内部函数。
  2. 计算 uu 关于 xx 的导数 dudx\frac{du}{dx}
    • 使用链式法则,dudx=ddx(2x2)=4x\frac{du}{dx} = \frac{d}{dx}(2x^2) = 4x
  3. 计算 g(u)g(u) 关于 uu 的导数 dgdu\frac{dg}{du}
    • g(u)=eug(u) = e^u,所以 dgdu=eu\frac{dg}{du} = e^u
  4. 使用链式法则,计算 dgdx\frac{dg}{dx}
    • dgdx=dgdududx=e2x24x=4xe2x2\frac{dg}{dx} = \frac{dg}{du} \cdot \frac{du}{dx} = e^{2x^2} \cdot 4x = 4xe^{2x^2}

在这两个例子中,我们分别计算了关于 xx 的偏导数,涵盖了多元函数和复合函数的情况。对于每个步骤,我们使用了基本的微分规则,如多项式、指数和链式法则。

梯度是什么?

梯度是一个向量,它在多元函数中表示函数变化最快的方向和速率。对于一个具有多个变量的函数,梯度指向函数在某一点上变化最快的方向,并且梯度的长度表示了这个变化的速率。梯度在微积分、优化问题和机器学习中都有重要应用。

对于一个具有多个变量的函数,梯度指向函数在某一点上变化最快的方向,并且梯度的长度表示了这个变化的速率。梯度在微积分、优化问题和机器学习中都有重要应用。

提示

你可以想象在群山之中,某个山的半山腰有只小兔子打算使用梯度下降的思路去往这片群山最深的山谷里找水喝。

我们用变化率来描述下山时各个方向的山路有多陡峭,往下的的路越陡峭变化率越大。山路险远,小兔子下山的过程中每个方向山路的陡峭程度都不一样:

  • 东边是万丈深渊,往东边的变化率就一百颗星;
  • 南边是下缓坡,往南方向的变化率小一些,三颗星;
  • 西边是另一座山头要往上爬的,那么往西的变化率是负的十颗星;
  • 北边是一个平地,变化率几乎为零,一颗星。

虽然东南西北各个方向都有变化率,但梯度下降的思想就是通过梯度最快的收敛,而梯度就是这几个方向中变化率最大的方向和值(为什么最大后面会说明),注意梯度同时描述了两个值,方向和大小,是个向量。放在这里,梯度就是东边和一百颗星。

然后梯度下降的思想就指导着我们的小兔子向东走,于是它轻轻一跃,移动了大约一万丈,没什么比直接跳下去更快能喝到水的了

梯度下降过程就是小兔子找水喝的过程。

机器学习领域,我们有一个步长(记为 γ\gamma ,发音 gamma 通常取值在 0 - 1 之间)是人为设定的值,它与梯度(记为 \nabla ,发音 grad)相乘,就可以描述小兔子每蹦跶一下该往某个方向跳以及一下跳了多远了。

上边的说明可以用来感性的感受一下梯度是啥,和梯度下降是想要干嘛。

形式上,考虑一个多元函数 f(x1,x2,,xn)f(x_1, x_2, \ldots, x_n),其梯度表示为 f\nabla ff\vec{\nabla} f,其中:

f=fx1i+fx2j++fxnk,\nabla f = \frac{\partial f}{\partial x_1} \vec{i} + \frac{\partial f}{\partial x_2} \vec{j} + \ldots + \frac{\partial f}{\partial x_n} \vec{k},

其中 i\vec{i}j\vec{j}k\vec{k} 是坐标轴上的单位向量。

梯度的各个分量是函数在每个相应变量方向上的偏导数。因此,梯度的方向是变化最快的方向,而梯度的大小表示了在该方向上的变化率。

举个例子,考虑函数 f(x,y)=x2+2y2f(x, y) = x^2 + 2y^2。其梯度为:

f=fxi+fyj=2xi+4yj.\nabla f = \frac{\partial f}{\partial x} \vec{i} + \frac{\partial f}{\partial y} \vec{j} = 2x \vec{i} + 4y \vec{j}.

在点 (1,2)(1, 2) 处,梯度为 2i+8j2\vec{i} + 8\vec{j}。这意味着在这一点,函数变化最快的方向是 2i+8j2\vec{i} + 8\vec{j},且变化率最快。

举个简单的例子,考虑一个二维平面上的函数 f(x,y)=x2+y2f(x, y) = x^2 + y^2,表示平面上各点到原点的距离的平方之和。这个函数代表了一个类似于山谷的形状,其最低点位于原点。

在这个例子中,我们可以计算函数 f(x,y)f(x, y) 在点 (1,1)(1, 1) 处的梯度。梯度是一个向量,其分量为函数在相应变量方向上的偏导数。计算得到:

f(1,1)=fx(1,1)i+fy(1,1)j=2i+2j.\nabla f(1, 1) = \frac{\partial f}{\partial x}(1, 1) \vec{i} + \frac{\partial f}{\partial y}(1, 1) \vec{j} = 2 \vec{i} + 2 \vec{j}.

这意味着在点 (1,1)(1, 1),函数变化最快的方向是 2i+2j2 \vec{i} + 2 \vec{j},而变化率为 2 倍。

以图形来看,你可以想象站在函数图像上的点 (1,1)(1, 1),然后面向梯度的方向 2i+2j2 \vec{i} + 2 \vec{j}。这个方向指向原点,表示从点 (1,1)(1, 1) 出发,移向原点的路径是函数值下降最快的路径。

假设 x 为 n 维向量,在微分多元函数时经常使用以下规则:

  • 对于所有 ARm×xA \in \mathbb{R}^{m \times x} 都有 x(Ax)=AT\nabla_x (Ax) = A^T
  • 对于所有 ARx×mA \in \mathbb{R}^{x \times m} 都有 x(xTA)=A\nabla_x (x^TA) = A
  • 对于所有 ARn×nA \in \mathbb{R}^{n \times n} 都有 x(xTAx)=(A+AT)x\nabla_x (x^TAx) = (A + A^T)x
  • 对于所有 x(xTx)=xx2=2x\nabla_x (x^Tx) = \nabla_x \|x\|^2 = 2x

这些表达式涉及矩阵和向量的微分。逐个解释每个表达式的含义:

  1. x(Ax)=AT\nabla_x (Ax) = A^T

    • 这个表达式表示对于一个矩阵 AA 乘以向量 xx,它的梯度是 AA 的转置 ATA^T
    • 这个规则反映了矩阵乘法的导数性质。
  2. x(xTA)=A\nabla_x (x^TA) = A

    • 这个表达式表示对于一个矩阵 AA 乘以向量 xx 的转置,它的梯度是矩阵 AA
    • 这个规则是矩阵向量乘法的导数性质。
  3. x(xTAx)=(A+AT)x\nabla_x (x^TAx) = (A + A^T)x

    • 这个表达式表示对于一个矩阵 AA 与向量 xx 的点积 xTAxx^TAx,它的梯度是 (A+AT)x(A + A^T)x
    • 这个规则展示了二次型函数关于向量的梯度计算,其中 ATA^T 是矩阵 AA 的转置。
  4. x(xTx)=xx2=2x\nabla_x (x^Tx) = \nabla_x \|x\|^2 = 2x

    • 这个表达式表示对于向量 xx 的内积 xTxx^Tx 和向量的范数平方 x2\|x\|^2,它们关于向量 xx 的梯度都等于 2x2x
    • 这个规则说明了向量的内积和范数平方的梯度计算。

总之,这些表达式是微积分中关于矩阵和向量的微分规则的具体应用。它们有助于在多变量计算中求解复杂函数的导数。

提示

范数平方是指向量的范数(或长度)的平方。在数学和线性代数中,向量的范数是一个表示向量大小的概念。对于 nn 维向量 x=[x1,x2,,xn]x = [x_1, x_2, \ldots, x_n],它的范数 x\|x\| 定义为:

x=x12+x22++xn2.\|x\| = \sqrt{x_1^2 + x_2^2 + \ldots + x_n^2}.

而范数平方则是将范数的平方,即各个分量平方和的平方根,取平方,即:

x2=x12+x22++xn2.\|x\|^2 = x_1^2 + x_2^2 + \ldots + x_n^2.

范数平方的概念在某些情况下更加方便,因为它避免了开平方运算,可能在某些计算中减少复杂性。范数平方的概念用于计算向量函数的导数,这是因为其在计算上更加方便。

这些规则是微分多元函数时经常使用的基本规则。通过这些规则,你可以计算复杂的多元函数的偏导数。需要注意的是,当涉及到更高阶的偏导数、偏导数的交换次序等情况时,可能会涉及到更多的规则和性质。

总之,梯度是函数变化最快的方向和速率的表示,它在多个领域中都有着重要的应用。

梯度和导数有什么区别?

梯度(Gradient)和导数(Derivative)都涉及到函数的变化率,但它们在数学上和应用上有一些区别。以下是它们的区别:

导数:

  • 导数是一个函数关于其自变量的变化率。对于一个一元函数 f(x)f(x),它的导数表示了在特定点上函数值变化的速率。
  • 导数通常用于描述函数在一个点上的切线斜率。如果函数是一元函数,导数是一个标量;如果函数是多元函数,导数是一个梯度向量。
  • 导数可以理解为函数在无穷小变化下的响应。
  • 对于一元函数 f(x)f(x),导数表示为 f(x)f'(x)dfdx\frac{df}{dx}
提示

在多元函数的情况下,导数可以视为梯度向量。对于一个多元函数 f(x)f(\mathbf{x}),其中 x\mathbf{x} 是一个包含多个自变量的向量,它的导数就是梯度向量。每个分量表示函数关于相应自变量的偏导数,这个向量描述了函数在每个方向上的变化率。

当在多元函数的上下文中谈论导数时,通常会使用术语“梯度”,尤其是当涉及优化问题和机器学习时。在这些情况下,梯度向量告诉我们在哪个方向上函数变化最快,可以用于指导参数的更新,以便在优化过程中找到函数的极值。

因此,在张量计算中,"梯度" 通常指的是偏导数的概念,尤其是在深度学习中的优化问题中。当你计算一个张量相对于其他张量或变量的偏导数时,结果被称为梯度。这种偏导数的计算是通过自动微分(Automatic Differentiation)系统来实现的。

在机器学习中,我们经常要优化一个损失函数,使其最小化或最大化。这涉及到计算损失函数相对于模型参数(通常是权重和偏置)的梯度,以便用梯度下降等优化算法更新参数。在这个上下文中,梯度实际上就是对应于损失函数的偏导数,用来指导参数的更新方向。

总之,在张量计算和机器学习中,"梯度" 通常用来表示偏导数,它对于优化问题和模型训练非常关键。

梯度:

  • 梯度是多元函数的变化率。对于一个多元函数 f(x)f(\mathbf{x}),它的梯度是一个向量,表示在某一点上函数值变化最快的方向。
  • 梯度包含了所有偏导数,每个分量表示了函数相对于一个自变量的变化率。
  • 梯度可以理解为函数在某点上的变化率,相对于所有输入变量的综合影响。
  • 对于多元函数 f(x)f(\mathbf{x}),梯度表示为 f(x)\nabla f(\mathbf{x}),其中 \nabla 表示梯度算子。

总结:

  • 导数用于描述函数关于一个变量的变化率,通常是一个标量值。
  • 梯度用于描述函数关于多个变量的变化率,是一个包含多个偏导数的向量。

尽管两者的数学定义不同,但在很多情况下,梯度和导数都可以在某种程度上指向函数的变化率。在优化问题和机器学习中,梯度是一个重要的概念,用于指导参数更新,以便优化模型。

回顾:范数是什么?

在线性代数中,范数是用来衡量向量大小(长度)的一种数学概念。范数通常满足一些基本性质,例如非负性、齐次性和三角不等式。不同的范数有不同的定义方式,但它们都旨在提供一个量化向量大小的方法。

对于一个 nn 维向量 x=[x1,x2,,xn]\mathbf{x} = [x_1, x_2, \ldots, x_n],它的范数通常表示为 x\|\mathbf{x}\|,定义为:

x=x12+x22++xn2.\|\mathbf{x}\| = \sqrt{x_1^2 + x_2^2 + \ldots + x_n^2}.

这被称为欧几里德范数或者 L2L^2 范数。它实际上就是向量的长度,通过将向量的各个分量的平方和开平方得到。除了欧几里德范数,还有其他常见的范数,比如:

  • L1L^1 范数x1=x1+x2++xn\|\mathbf{x}\|_1 = |x_1| + |x_2| + \ldots + |x_n|,表示为向量各个分量的绝对值之和。

  • LL^\infty 范数x=max(x1,x2,,xn)\|\mathbf{x}\|_\infty = \max(|x_1|, |x_2|, \ldots, |x_n|),表示为向量各个分量的绝对值的最大值。

这些范数具有不同的性质和应用,它们在数学、工程、物理等领域中都有广泛的用途。范数可以用来度量向量之间的距离、定义优化问题的约束、表示向量的稀疏性等。

链式法则

链式法则是微积分中一个重要的规则,用于计算复合函数的导数。复合函数是由一个函数嵌套在另一个函数内部形成的,链式法则允许我们找到这样的复合函数的导数。

设有两个函数 f(u)f(u)u(x)u(x),它们都是可微分的。那么复合函数 y(x)=f(u(x))y(x) = f(u(x)) 的导数可以用链式法则表示为:

dydx=dydududx.\frac{dy}{dx} = \frac{dy}{du} \cdot \frac{du}{dx}.

其中:

  • dydx\frac{dy}{dx} 表示复合函数 y(x)y(x) 关于自变量 xx 的导数。
  • dydu\frac{dy}{du} 表示函数 f(u)f(u) 关于变量 uu 的导数。
  • dudx\frac{du}{dx} 表示函数 u(x)u(x) 关于变量 xx 的导数。

链式法则的直观解释是,当我们微小地改变自变量 xx 时,函数 uuff 分别对应地会有微小的变化 dududydy,导致整个复合函数 y(x)y(x) 发生微小的变化 dydy。链式法则告诉我们,这个总体的微小变化可以由两个部分的变化乘积来表示。

在多元函数的情况下,链式法则也可以推广。假设有函数 f(u1,u2,,un)f(u_1, u_2, \ldots, u_n) 和向量函数 u(x1,x2,,xm)=[u1(x1,x2,,xm),u2(x1,x2,,xm),,un(x1,x2,,xm)]\mathbf{u}(x_1, x_2, \ldots, x_m) = [u_1(x_1, x_2, \ldots, x_m), u_2(x_1, x_2, \ldots, x_m), \ldots, u_n(x_1, x_2, \ldots, x_m)]。那么复合函数 y(x)=f(u(x))\mathbf{y}(\mathbf{x}) = f(\mathbf{u}(\mathbf{x})) 的导数可以用类似的链式法则表示。

链式法则在各种领域都有广泛的应用,包括物理、工程、经济学等,特别是在描述多个变量之间的复杂相互关系时。

实例:向量求导

如何对 y=2xTxy = 2x^Tx 关于列向量 x 求导?

首先,让我们明确一下符号的含义:xx 是一个列向量,xTx^Txx 的转置,2xT2x^T 表示将每个分量都乘以2。

函数 y=2xTxy = 2x^Tx 表示列向量 xx 与其自身的内积(点积),然后乘以2。我们可以对这个函数关于列向量 xx 求导,使用矩阵微分法则。

矩阵微分法则在这里可以看作链式法则的推广。

首先,计算 yy 关于 xx 各个分量的偏导数。对于一个 nn 维列向量 xx,我们有:

y=2xTx=2(x12+x22++xn2).y = 2x^Tx = 2(x_1^2 + x_2^2 + \ldots + x_n^2).

现在对 yy 关于 xx 的第 ii 个分量求偏导数,即 yxi\frac{\partial y}{\partial x_i}。按照链式法则:

yxi=y(x12+x22++xn2)(x12+x22++xn2)xi.\frac{\partial y}{\partial x_i} = \frac{\partial y}{\partial (x_1^2 + x_2^2 + \ldots + x_n^2)} \cdot \frac{\partial (x_1^2 + x_2^2 + \ldots + x_n^2)}{\partial x_i}.

第一个偏导数是常数倍数,即 y(x12+x22++xn2)=2\frac{\partial y}{\partial (x_1^2 + x_2^2 + \ldots + x_n^2)} = 2

第二个偏导数是分量 xix_i 的导数,即 (x12+x22++xn2)xi=2xi\frac{\partial (x_1^2 + x_2^2 + \ldots + x_n^2)}{\partial x_i} = 2x_i

将这两个部分相乘,得到 yxi=22xi=4xi\frac{\partial y}{\partial x_i} = 2 \cdot 2x_i = 4x_i

所以,对于列向量 xx 的每个分量,导数为 4xi4x_i。将这些导数组合起来,就得到关于列向量 xx 的导数向量:

x(2xTx)=[4x1,4x2,,4xn].\nabla_x (2x^Tx) = [4x_1, 4x_2, \ldots, 4x_n].

也可以写成更紧凑的形式:

x(2xTx)=4x.\nabla_x (2x^Tx) = 4x.

使用 PyTorch 自动求导

在 PyTorch 中,grad 是一个属性,用于跟踪张量(Tensor)的梯度(导数)。梯度表示了一个函数关于变量的变化率,对于深度学习中的优化问题,梯度可以告诉我们如何调整变量以最小化或最大化目标函数。PyTorch 使用自动微分(Automatic Differentiation)技术来计算张量的梯度,并将这些梯度存储在 grad 属性中。

在 PyTorch 中,要使用自动微分,需要将张量设置为可求导的(requires_grad=True),然后执行相应的计算操作。当你执行这些操作时,PyTorch 将会构建计算图,记录下所有的计算步骤,以便之后计算梯度。计算梯度时,你可以调用张量的 backward() 方法,然后梯度将会累积在每个相关的张量的 grad 属性中。

以下是一个简单的示例,演示了如何在 PyTorch 中使用 grad 属性来计算张量的梯度:

import torch

# 创建一个可求导的张量
x = torch.tensor([2.0], requires_grad=True)

# 定义一个函数 y = x^2
y = x**2

# 计算 y 对 x 的梯度
y.backward()

# 打印 x 的梯度
print(x.grad) # 输出为 [4.0]

在这个示例中,我们创建了一个张量 x,并计算了函数 y=x2y = x^2 的值。然后,通过调用 y.backward(),PyTorch 计算了关于 x 的梯度,并将梯度值存储在 x 的 grad 属性中。在这种情况下,函数 y=x2y = x^2 的导数是 2x,在 x=2 时梯度的值是 4.0。

下面的例子,如何对 y=2xTxy = 2x^Tx 关于列向量 x 求导?

这里使用 PyTorch 自动求导来计算导数。

首先创建一个变量 X 作为列向量

import torch

x = torch.arange(4.0)
x
tensor([0., 1., 2., 3.])

在我们计算 yy 关于 xx 的梯度之前,需要一个地方来存储梯度。 重要的是,我们不会在每次对一个参数求导时都分配新的内存。 因为我们经常会成千上万次地更新相同的参数,每次都分配新的内存可能很快就会将内存耗尽。 注意,一个标量函数关于向量 xx 的梯度是向量,并且与 xx 具有相同的形状。

x.requires_grad_(True)  # 等价于 x = torch.arange(4.0,requires_grad=True)
x.grad # 默认值是 None

现在计算 yy 的点积,然后打印出来。

y = 2 * torch.dot(x, x)
y
tensor(28., grad_fn=<MulBackward0>)

x 是一个长度为 4 的向量,计算 x 和 x 的点积,得到了我们赋值给 y 的标量输出。 接下来,通过调用 反向传播函数 来自动计算 y 关于 x 每个分量的梯度,并打印这些梯度。

y.backward()
x.grad
tensor([ 0.,  4.,  8., 12.])

函数 y=2xTxy = 2x^Tx 关于 x 的梯度应为 4x4x,让我们验证下

x.grad == 4 * x
tensor([True, True, True, True])

References