于2025年9月17日的修改注
本文添加了偏导数与梯度部分(内容出自Mathematics for Machine Learning)。

偏导数与梯度

对于有nn个变量x1,x2,,xnx_{1},x_{2},\dots,x_{n}的函数ff,定义偏导数

fxi=limh0f(x1,,xi+h,,xn)f(x)h\begin{align} \frac{\partial f}{\partial x_{i}} = \lim_{ h \to 0 }\frac{f(x_{1},\dots,x_{i}+h,\dots,x_{n}) - f(\boldsymbol{x})}{h} \end{align}

将其组成一个行向量

xf=grad f=[fx1,fx2,,fxn]\begin{align} \triangledown_{\boldsymbol{x}} f = \text{grad} \ f = \left[ \frac{\partial f}{\partial x_{1}},\frac{\partial f}{\partial x_{2}},\dots,\frac{\partial f}{\partial x_{n}} \right] \end{align}

考虑两个变量 x1,x2x_1, x_2 的函数 f:R2Rf: \mathbb{R}^2 \rightarrow \mathbb{R}。此外,x1(t)x_1(t)x2(t)x_2(t) 本身就是 tt 的函数。为了计算 ff 相对于 tt 的梯度,我们需要对多元函数使用链式法则:

dfdt=[fx1fx2][x1(t)tx2(t)t]=fx1x1t+fx2x2t\begin{align} \frac{\mathrm{d}f}{\mathrm{d}t} = \begin{bmatrix} \frac{\partial f}{\partial x_1} & \frac{\partial f}{\partial x_2} \end{bmatrix} \begin{bmatrix} \frac{\partial x_1(t)}{\partial t} \\ \frac{\partial x_2(t)}{\partial t} \end{bmatrix} = \frac{\partial f}{\partial x_1} \frac{\partial x_1}{\partial t} + \frac{\partial f}{\partial x_2} \frac{\partial x_2}{\partial t} \end{align}

如果 f(x1,x2)f(x_1, x_2)x1x_1x2x_2 的函数,其中 x1(s,t)x_1(s, t)x2(s,t)x_2(s, t) 是两个变量 sstt 的函数,则用链式法则求得偏导数为:

fs=fx1x1s+fx2x2s\frac{\partial f}{\partial s} = \frac{\partial f}{\partial x_1} \frac{\partial x_1}{\partial s} + \frac{\partial f}{\partial x_2} \frac{\partial x_2}{\partial s}

ft=fx1x1t+fx2x2t\frac{\partial f}{\partial t} = \frac{\partial f}{\partial x_1} \frac{\partial x_1}{\partial t} + \frac{\partial f}{\partial x_2} \frac{\partial x_2}{\partial t}

梯度由矩阵相乘得到

dfd(s,t)=fxx(s,t)=[fx1fx2]fx[x1sx1tx2sx2t]x(s,t)\begin{aligned} \frac{df}{d(s,t)} = \frac{\partial f}{\partial \boldsymbol{x}} \frac{\partial \boldsymbol{x}}{\partial (s,t)} = \underbrace{ \left[ \frac{\partial f}{\partial x_1} \quad \frac{\partial f}{\partial x_2} \right]}_{\frac{\partial f}{\partial \boldsymbol{x}}} \underbrace{\begin{bmatrix} \frac{\partial x_1}{\partial s} & \frac{\partial x_1}{\partial t} \\ \frac{\partial x_2}{\partial s} & \frac{\partial x_2}{\partial t} \end{bmatrix}}_{\frac{\partial \boldsymbol{x}}{\partial (s,t)}} \end{aligned}

向量值函数的梯度

函数 f:RnRmf: \mathbb{R}^n \rightarrow \mathbb{R}^m 相对于 xRn\boldsymbol{x} \in \mathbb{R}^n 的梯度:

df(x)dx=[f(x)x1f(x)xn]=[f1(x)x1f1(x)xnfm(x)x1fm(x)xn]Rm×n.\begin{equation} \begin{aligned} \frac{\mathrm{d} \boldsymbol{f}(\boldsymbol{x})}{\mathrm{d} \boldsymbol{x}} &= \left[\begin{array}{ccc} \frac{\partial \boldsymbol{f}(\boldsymbol{x})}{\partial x_1} & \cdots & \frac{\partial \boldsymbol{f}(\boldsymbol{x})}{\partial x_n} \end{array}\right] \\ &= \left[\begin{array}{ccc} \frac{\partial f_1(\boldsymbol{x})}{\partial x_1} & \cdots & \frac{\partial f_1(\boldsymbol{x})}{\partial x_n} \\ \vdots & & \vdots \\ \frac{\partial f_m(\boldsymbol{x})}{\partial x_1} & \cdots & \frac{\partial f_m(\boldsymbol{x})}{\partial x_n} \end{array}\right] \in \mathbb{R}^{m \times n}. \end{aligned} \end{equation}

计算梯度的有用恒等式

在以下内容中,我们列出了一些在机器学习上下文中经常需要的梯度(Petersen and Pedersen, 2012)。这里,我们使用 tr()\text{tr}(\cdot) 表示迹,det()\det(\cdot) 表示行列式和 f(X)1f(\mathbf{X})^{-1} 表示 f(X)f(\mathbf{X}) 的逆,假设它存在。

Xf(X)=(f(X)X)Xtr(f(X))=tr(f(X)X)Xdet(f(X))=det(f(X))tr(f(X)1f(X)X)Xf(X)1=f(X)1f(X)Xf(X)1aX1bX=(X1)ab(X1)xax=aaxx=aaXbX=abxBxx=x(B+B)s(xAs)W(xAs)=2(xAs)WAfor symmetric W\begin{align} & \frac{\partial}{\partial \mathbf{X}} f(\mathbf{X})^\top = \left( \frac{\partial f(\mathbf{X})}{\partial \mathbf{X}} \right)^\top \\ & \frac{\partial}{\partial \mathbf{X}} \text{tr}(f(\mathbf{X})) = \text{tr} \left( \frac{\partial f(\mathbf{X})}{\partial \mathbf{X}} \right) \\ & \frac{\partial}{\partial \mathbf{X}} \det(f(\mathbf{X})) = \det(f(\mathbf{X})) \text{tr} \left( f(\mathbf{X})^{-1} \frac{\partial f(\mathbf{X})}{\partial \mathbf{X}} \right) \\ & \frac{\partial}{\partial \mathbf{X}} f(\mathbf{X})^{-1} = - f(\mathbf{X})^{-1} \frac{\partial f(\mathbf{X})}{\partial \mathbf{X}} f(\mathbf{X})^{-1} \\ & \frac{\partial a^\top \mathbf{X}^{-1} b}{\partial \mathbf{X}} = - (\mathbf{X}^{-1})^\top a b^\top (\mathbf{X}^{-1})^\top \\ & \frac{\partial x^\top a}{\partial x} = a^\top \\ & \frac{\partial a^\top x}{\partial x} = a^\top \\ & \frac{\partial a^\top \mathbf{X} b}{\partial \mathbf{X}} = a b^\top \\ & \frac{\partial x^\top B x}{\partial x} = x^\top (B + B^\top) \\ & \frac{\partial}{\partial s} (x - As)^\top W (x - As) = -2 (x - As)^\top W A \quad \text{for symmetric } W \end{align}

神经元模型

神经元模型的三种基本元素

  • 突触或连接链集:一组突触(或称连接链路),每个突触都具有其特征性的权重或强度。具体而言,在连接到神经元kk的突触jj输入端,信号xjx_j会被突触权重wkjw_{kj}所加权。需要特别注意突触权重wkjw_{kj}下标标记的规范:其中第一个下标kk表示所关联的神经元,第二个下标jj表示该权重对应的突触输入端。与生物大脑的突触权重不同,人工神经元的突触权重取值范围可以包含正值和负值。这种数学特性使得人工神经网络具有更灵活的信号处理能力,权重值的符号决定了输入信号的增强或抑制效应,而绝对值则表征了信号传递的强度。该设计为神经网络实现复杂的非线性映射提供了基础数学框架。
  • 加法器
  • 激活函数:可让神经网络学习特征与标签之间的非线性(复杂)关系。常用作激活函数的三个数学函数是 Sigmoid 函数、tanh 函数和 ReLU 函数。

神经元的非线性模型

如图所示的神经元模型还包含一个外部施加的偏置,记为bkb_{k}。该偏置bkb_{k}的作用是依据其正负性,分别增强或削弱激活函数的净输入。

用数学术语来表述,如图所示的神经元kk可通过以下两个方程描述:

uk=j=1mwkjxj\begin{align} u_{k}\,=\,\sum_{j=1}^{m}w_{kj}x_{j} \end{align}

yk=φ(uk+bk)\begin{align} y_{k}\,=\,\varphi(u_{k}\,+\,b_{k}) \end{align}

其中x1,x2,...,xmx_{1},x_{2},...,x_{m}输入信号wk1,wk2,...,wkmw_{k1},w_{k2},...,w_{km}为神经元kk对应的突触权重uku_{k}(未在图中标注)是由输入信号产生的线性组合器输出;bkb_{k}偏置φ()\varphi(\cdot)激活函数yky_{k}为神经元输出信号。偏置bkb_{k}的作用在于对如图模型中线性组合器的输出uku_{k}施加仿射变换,即:

vk=uk+bk\begin{align} v_{k}\,=\,u_{k}\,+\,b_{k} \end{align}

特别地,偏置bkb_{k}的正负性会改变神经元kk的诱导局部场(或称激活电位)vkv_{k}与线性组合器输出uku_{k}之间的关系。此后,这两个术语将互换使用。值得注意的是,此仿射变换导致vkv_{k}相对于uku_{k}的曲线不再通过原点。
偏置bkb_{k}是神经元kk的外部参数。如式(2)所示,其存在可通过数学形式体现。等价地,可将式(1)至式(3)合并为:

vk=j=0mwkjxj\begin{align} v_{k}\,=\,\sum_{j=0}^{m}w_{kj}x_{j} \end{align}

(注:此处x0=1x_{0}=1wk0=bkw_{k0}=b_{k},通过引入虚拟输入x0x_{0},将偏置项整合至权重求和表达式中。)

Rosenblatt感知机

感知机是神经网络的最简形式,用于对线性可分模式(即分布于超平面两侧的模式)进行分类。其本质由一个具有可调节突触权重和偏置的单一神经元构成。Rosenblatt证明:若用于训练感知机的模式(向量)来自两个线性可分类别,则感知机算法会收敛,并以超平面形式将决策面定位在两类之间。此算法的收敛性证明被称为感知机收敛定理
感知机收敛算法

用Python实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def Preceptron(X, y, learning_rate=0.01, n_iterations=1000, Early_termination = True):
n_samples, n_features = X.shape
weights = np.zeros(n_features)
bias = 0

for _ in range(n_iterations):
for idx, x_i in enumerate(X):
linear_output = np.dot(x_i, weights) + bias
y_predicted = np.where(linear_output >= 0, 1, 0)

# Update weights and bias
update = learning_rate * (y[idx] - y_predicted)
weights += update * x_i
bias += update

# Early stopping condition
if np.all((np.dot(X, weights) + bias >= 0) == y) and Early_termination:
break

return weights, bias

感知机收敛定理

现可表述感知机的固定增量收敛定理如下(Rosenblatt, 1962):
设训练向量子集H1\mathcal{H}_1H2\mathcal{H}_2是线性可分的,且输入到感知机的样本均源自这两个子集。则感知机在有限次迭代后收敛,即存在某次迭代non_o使得:

w(no)=w(no+1)=w(no+2)=\begin{align} \mathbf{w}(n_o) = \mathbf{w}(n_o + 1) = \mathbf{w}(n_o + 2) = \cdots \end{align}

构成解向量,且满足nonmaxn_o \leq n_{\max}

感知机收敛定理证明提示

感知机收敛定理的证明核心在于说明,如果数据线性可分,算法在每次错误调整后都会朝着一个“理想方向”靠近,但这种靠近的过程不能无限持续,从而导出更新次数的有限性。具体来说,首先假设存在一个能将所有数据正确分类且带有最小间隔的理想超平面。每次误分类时,权重会根据误分类点更新,这使得权重向量与理想方向的对齐程度(内积)至少增加一个固定值。另一方面,每次更新后权重的长度增长被数据点的最大长度所限制。将这两个趋势结合起来,对齐程度的线性增长最终会超过长度增长的平方根速度,从而迫使更新次数必须有限,否则会导致矛盾。因此算法必然在有限步内停止更新,找到正确分类的超平面。可以使用柯西-施瓦茨不等式(Cauchy–Schwarz inequality)进行证明。

多层感知机

如下图展示了一个具有两个隐藏层和一个输出层的多层感知器结构图。
多层感知机

如下图所示为多层感知机的一部分,该网络识别两种信号:

  • 函数信号(输入信号):函数信号是指从网络输入端传入的输入信号(激励),通过前向传播(逐神经元传递)穿过网络,最终作为输出信号从网络输出端产生。
  • 误差信号:误差信号始于网络的输出层神经元,通过反向传播(逐层传递)穿过网络。
    多层感知机信号流

输出神经元构成了网络的输出层。其余神经元则组成了网络的隐藏层。因此,隐藏单元并不属于网络的输入或输出部分——这正是其被称为"隐藏"的缘由。第一隐藏层接收由感知单元(源节点)构成的输入层所传递的信号;该隐藏层的输出结果继而传递至下一隐藏层;网络其余层级均依此类推进行信号传输。