1. 神经网络(Neural network)

这一部分知识在另一个功课里详细讨论了,这里讨论的神经网络是数学模型,而不是生物学上的大脑。
传统的线性模型: f = W x f=Wx f=Wx
这样的模型难以学习复杂的函数映射,因此有神经网络: f = W 2 m a x ( 0 , W 1 x ) f=W_2max(0,W_1x) f=W2max(0,W1x)(两层)
在这里插入图片描述
或者三层神经网络: f = W 3 m a x ( 0 , W 2 m a x ( 0 , W 1 x ) ) f=W_3max(0,W_2max(0,W_1x)) f=W3max(0,W2max(0,W1x))

1.1 激活函数(Activation Functions)

神经网络里有多种激活函数(Activation Functions),我们快速带过:

  1. Sigmoid: σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1
    在这里插入图片描述
    S形曲线,输出值在0到1之间。
    平滑,输出值范围有限,但容易受到梯度消失问题的影响。

  2. tanh: tanh ⁡ ( x ) \tanh(x) tanh(x)
    在这里插入图片描述
    S形曲线,输出值在-1到1之间。
    相对于Sigmoid,tanh的输出中心对称,但同样可能遇到梯度消失问题。

  3. ReLU (Rectified Linear Unit): max ⁡ ( 0 , x ) \max(0, x) max(0,x)
    在这里插入图片描述
    在x=0处有一个转折点,x>0时输出为x,x<=0时输出为0。
    简单,计算效率高,有助于缓解梯度消失问题,但可能导致“死亡ReLU”问题(即神经元永久失活)。

  4. Leaky ReLU: max ⁡ ( 0.1 x , x ) \max(0.1x, x) max(0.1x,x)
    在这里插入图片描述
    在x<0时有一个小的斜率(0.1),x>=0时斜率为1。
    改进了ReLU,允许负值有一个小的梯度,有助于解决“死亡ReLU”问题。

  5. Maxout: max ⁡ ( w 1 T x + b 1 , w 2 T x + b 2 ) \max(w_1^Tx + b_1, w_2^Tx + b_2) max(w1Tx+b1,w2Tx+b2)
    是一种通用的激活函数,可以看作是ReLU和Leaky ReLU的推广,通过选择两个线性函数的最大值来激活。

  6. ELU (Exponential Linear Unit):
    f ( x ) = { x if  x > 0 α ( exp ⁡ ( x ) − 1 ) if  x ≤ 0 f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha(\exp(x) - 1) & \text{if } x \leq 0 \end{cases} f(x)={xα(exp(x)1)if x>0if x0
    在这里插入图片描述
    x > 0 x>0 x>0时输出为 x x x,在 x < = 0 x<=0 x<=0时输出为 α ( e x p ( x ) − 1 ) α(exp(x)−1) α(exp(x)1)
    类似于Leaky ReLU,但使用指数函数来处理负值,有助于解决梯度消失问题,并且可以提供更好的性能。

1.2 神经网络的架构

在这里插入图片描述
主要由三个部分组成:
输入层(input layer):接收输入数据。
隐藏层(hidden layer):处理输入数据,并通过激活函数引入非线性。
输出层(output layer):产生最终的输出结果。
这里左边是单一隐藏层,右边是两层隐藏层。
每一层的每个神经元都与下一层的所有神经元相连,这种连接方式是全连接的。

1.3 神经网络的过程

前向传播是指数据从输入层经过隐藏层最终到达输出层的过程,其中每一层的输出成为下一层的输入。
这里给出代码示例。

f = lambda x: 1.0/(1.0 + np.exp(-x))
x = np.random.randn(3, 1)
h1 = f(np.dot(W1, x) + b1)
h2 = f(np.dot(W2, h1) + b2)
out = np.dot(W3, h2) + b3

这里定义了一个匿名函数f,使用Sigmoid函数作为激活函数。
然后生成一个包含3个随机数的列向量,作为输入层的输入。
再使用使用权重矩阵W1和偏置向量b1计算第一隐藏层的激活值。这里np.dot(W1, x)计算输入和权重的点积,然后加上偏置,最后通过激活函数f处理。
接着使用权重矩阵W2和偏置向量b2计算第二隐藏层的激活值,其中h1是第一隐藏层的输出。
最后使用权重矩阵W3和偏置向量b3计算输出层的激活值,其中h2是第二隐藏层的输出。这里没有应用激活函数,假设输出层直接输出线性组合的结果。

前向传播的下一步是损失计算。
线性模型的输出: s = f ( x ; W ) = W x s = f(x; W) = Wx s=f(x;W)=Wx
支持向量机(SVM)的损失函数: L i = ∑ j ≠ y i max ⁡ ( 0 , s j − s y i + 1 ) L_i = \sum_{j \neq y_i} \max(0, s_j - s_{y_i} + 1) Li=j=yimax(0,sjsyi+1)这个公式表示对于每个样本,计算其分数与其他所有样本分数的差异,如果这个差异大于1,则计算损失。
总损失函数: L = 1 N ∑ i = 1 N L i + ∑ k W k 2 L = \frac{1}{N} \sum_{i=1}^{N} L_i + \sum_k W_k^2 L=N1i=1NLi+kWk2,由两部分组成:
第一部分是数据损失,即所有样本损失的平均值。
第二部分是正则化项,用于防止过拟合。这里使用的是L2正则化,即权重的平方和。

计算完损失函数进入下一步后向传播(Backpropagation),
这里使用梯度下降来优化损失函数,这么做的目标是计算这个梯度 ∇ W L \nabla_W L WL,以便更新权重,从而最小化损失函数。
利用链式法则从输出层向输入层反向计算梯度。
这一步的目的是确定如何调整网络参数以减少损失。

因此前向传播的计算过程如下图所示。
在这里插入图片描述
先通过输入和权重计算分数,然后算出单个样本的SVM损失,然后和正则化项一起得到总损失。
卷积神经网络(AlexNet架构)的过程如下图所示。
在这里插入图片描述
神经图灵机(Neural Turing Machine,NTM)的过程如下图所示。
在这里插入图片描述
我们来看一个例子。
在这里插入图片描述
定义函数: f ( x , y , z ) = ( x + y ) z f(x,y,z)=(x+y)z f(x,y,z)=(x+y)z
q = x + y q=x+y q=x+y
f = q z f=qz f=qz
输入: x = − 2 x=-2 x=2
y = 5 y=5 y=5
z = − 4 z=-4 z=4
所以计算可以得到: q = 3 q=3 q=3
f = − 12 f=-12 f=12
计算完后完成前向传播,我们现在计算暂时跳过计算损失函数,我们这个例子默认里面存在损失,现在我们利用反向传播更新网络参数以减少损失。
所以我们需要计算损失函数相对于输入变量 x x x, y y y, 和 z z z的梯度。在梯度下降优化算法中,需要计算损失函数相对于模型参数(包括输入变量)的梯度,以确定如何调整这些参数来减少损失。
对于 q = x + y q=x+y q=x+y
∂ q ∂ x = 1 \frac{\partial q}{\partial x} = 1 xq=1
∂ q ∂ y = 1 \frac{\partial q}{\partial y} = 1 yq=1
对于 f = q z f=qz f=qz
∂ f ∂ q = z \frac{\partial f}{\partial q} = z qf=z
∂ f ∂ z = q \frac{\partial f}{\partial z} = q zf=q
计算 ∂ f ∂ y \frac{\partial f}{\partial y} yf使用链式法则,可以得到 ∂ f ∂ y = ∂ f ∂ q ∂ q ∂ y = z \frac{\partial f}{\partial y} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial y}=z yf=qfyq=z
计算 ∂ f ∂ x \frac{\partial f}{\partial x} xf使用链式法则,可以得到 ∂ f ∂ y = ∂ f ∂ q ∂ q ∂ z = z \frac{\partial f}{\partial y} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial z}=z yf=qfzq=z

因此最后的结果如下图所示。在这里插入图片描述
然后我们可以根据这里计算得到的梯度来更新网络中的权重。

1.3.1 链式法则(Chain Rule)

链式法则是微积分中用于计算复合函数导数的一个基本法则,我们来回顾一下。
使用链式法则可以通过将损失函数相对于中间变量 z z z的梯度与中间变量 z z z相对于输入 x x x y y y的梯度相乘,来计算损失函数相对于输入 x x x y y y的梯度。
∂ L ∂ x = ∂ L ∂ z ∂ z ∂ x \frac{\partial L}{\partial x} = \frac{\partial L}{\partial z}\frac{\partial z}{\partial x} xL=zLxz
∂ L ∂ y = ∂ L ∂ z ∂ z ∂ y \frac{\partial L}{\partial y} = \frac{\partial L}{\partial z}\frac{\partial z}{\partial y} yL=zLyz
在这里插入图片描述

下面我们尝试一个比较复杂的例子。

在这里插入图片描述

函数: f ( w , x ) = 1 1 + e − ( w 0 x 0 + w 1 x 1 + w 2 ) f(w, x) = \frac{1}{1 + e^{-(w_0x_0 + w_1x_1 + w_2)}} f(w,x)=1+e(w0x0+w1x1+w2)1
我们先接受输入计算 z = w 0 x 0 + w 1 x 1 + w 2 z=w_0x_0+w_1x_1+w_2 z=w0x0+w1x1+w2
z = 2.00 × ( − 1.00 ) + ( − 3.00 ) × ( − 2.00 ) + ( − 3.00 ) = − 2.00 + 6.00 − 3.00 = 1.00 z=2.00×(−1.00)+(−3.00)×(−2.00)+(−3.00)=−2.00+6.00−3.00=1.00 z=2.00×(1.00)+(3.00)×(2.00)+(3.00)=2.00+6.003.00=1.00
因此 − z = − 1 -z=-1 z=1
e x p ( − z ) = e x p ( − 1.00 ) ≈ 0.37 exp(−z)=exp(−1.00)≈0.37 exp(z)=exp(1.00)0.37
计算 e x p ( − z ) + 1 exp(−z)+1 exp(z)+1 e x p ( − 1.00 ) + 1 ≈ 0.37 + 1 = 1.37 exp(−1.00)+1≈0.37+1=1.37 exp(1.00)+10.37+1=1.37
最后,计算 1 x \frac{1}{x} x1 1 1.37 ≈ 0.73 \frac{1}{1.37}≈0.73 1.3710.73

在这里插入图片描述
先看一下基础函数的导数: f ( x ) = e x ⇒ d f d x = e x f(x) = e^x \Rightarrow \quad \frac{df}{dx} = e^x f(x)=exdxdf=ex
f a ( x ) = a x ⇒ d f d x = a f_a(x) = ax \Rightarrow \quad \frac{df}{dx} = a fa(x)=axdxdf=a
f ( x ) = 1 x ⇒ d f d x = − 1 x 2 f(x) = \frac{1}{x} \Rightarrow \quad \frac{df}{dx} = -\frac{1}{x^2} f(x)=x1dxdf=x21
f c ( x ) = c + x ⇒ d f d x = 1 f_c(x) = c + x \Rightarrow \quad \frac{df}{dx} = 1 fc(x)=c+xdxdf=1
然后我们开始反向传播,首先是起点, f f f f f f的梯度,即: ∂ f ∂ f = 1.00 \frac{∂f}{∂f}=1.00 ff=1.00

在这里插入图片描述
然后下一步,经过 f = 1 a f=\frac{1}{a} f=a1节点,我们要计算 ∂ L ∂ a \frac{∂L}{∂a} aL
根据链式法则 ∂ L ∂ a = ∂ f ∂ a ∂ L ∂ f \frac{∂L}{∂a}=\frac{∂f}{∂a}\frac{∂L}{∂f} aL=affL
因为 ∂ f ∂ a = − 1 a 2 \frac{∂f}{∂a}=-\frac{1}{a^2} af=a21
所以 ∂ L ∂ a = − 1 a 2 ∂ L ∂ f = − 1 1.37 2 ( 1.00 ) = − 0.53 \frac{∂L}{∂a}=-\frac{1}{a^2}\frac{∂L}{∂f}=-\frac{1}{1.37^2}(1.00)=-0.53 aL=a21fL=1.3721(1.00)=0.53

在这里插入图片描述
然后下一步,经过 a = 1 + t a=1+t a=1+t节点,我们要计算 ∂ L ∂ t \frac{∂L}{∂t} tL
根据链式法则 ∂ L ∂ t = ∂ a ∂ t ∂ L ∂ a \frac{∂L}{∂t}=\frac{∂a}{∂t}\frac{∂L}{∂a} tL=taaL
因为 ∂ a ∂ t = 1 \frac{∂a}{∂t}=1 ta=1(因为 a = 1 + t a = 1 + t a=1+t t t t 的导数为 1)
所以 ∂ L ∂ t = 1 × ( − 0.53 ) = − 0.53 \frac{∂L}{∂t}=1×(−0.53)=−0.53 tL=1×(0.53)=0.53
在这里插入图片描述
然后下一步,经过 t = e u t=e^u t=eu节点,我们要计算 ∂ L ∂ u \frac{∂L}{∂u} uL
根据链式法则 ∂ L ∂ u = ∂ t ∂ u ∂ L ∂ t \frac{∂L}{∂u}=\frac{∂t}{∂u}\frac{∂L}{∂t} uL=uttL
因为 ∂ t ∂ u = e u \frac{∂t}{∂u}=e^u ut=eu
所以 ∂ L ∂ u = e u × ∂ L ∂ t = ≈ 0.37 × ( − 0.53 ) ≈ − 0.196 \frac{∂L}{∂u}=e^u×\frac{∂L}{∂t}=≈0.37×(−0.53)≈−0.196 uL=eu×tL=≈0.37×(0.53)0.196
在这里插入图片描述
然后下一步,经过 u = − z u=−z u=z节点,我们要计算 ∂ L ∂ z \frac{∂L}{∂z} zL
根据链式法则 ∂ L ∂ z = ∂ u ∂ z ∂ L ∂ u \frac{∂L}{∂z}=\frac{∂u}{∂z}\frac{∂L}{∂u} zL=zuuL
因为 u = − z u=-z u=z
所以 ∂ L ∂ z = ( − 1 ) × ( − 0.20 ) = 0.20 \frac{∂L}{∂z}=(−1)×(−0.20)=0.20 zL=(1)×(0.20)=0.20

在这里插入图片描述
然后下一步,经过 z = A + B + C z=A+B+C z=A+B+C节点,其中: A = w 0 x 0 A=w_0x_0 A=w0x0
B = w 1 x 1 B=w_1x_1 B=w1x1
C = w 2 C=w_2 C=w2
我们要计算 ∂ L ∂ A \frac{∂L}{∂A} AL ∂ L ∂ B \frac{∂L}{∂B} BL ∂ L ∂ C \frac{∂L}{∂C} CL
根据链式法则 ∂ L ∂ A = ∂ z ∂ A ∂ L ∂ z = 1 × 0.20 = 0.20 \frac{∂L}{∂A}=\frac{∂z}{∂A}\frac{∂L}{∂z}=1×0.20=0.20 AL=AzzL=1×0.20=0.20
∂ L ∂ B = ∂ z ∂ B ∂ L ∂ z = 1 × 0.20 = 0.20 \frac{∂L}{∂B}=\frac{∂z}{∂B}\frac{∂L}{∂z}=1×0.20=0.20 BL=BzzL=1×0.20=0.20
∂ L ∂ C = ∂ z ∂ C ∂ L ∂ z = 1 × 0.20 = 0.20 \frac{∂L}{∂C}=\frac{∂z}{∂C}\frac{∂L}{∂z}=1×0.20=0.20 CL=CzzL=1×0.20=0.20
也就是局部梯度(local gradient)乘以上游梯度(its gradient,从后面传回来的梯度)
在这里插入图片描述

然后下一步,经过 w 0 × x 0 w_0×x_0 w0×x0节点,其中: A = w 0 x 0 A=w_0x_0 A=w0x0
w 0 = 2.00 w_0=2.00 w0=2.00
x 0 = − 1.00 x_0=-1.00 x0=1.00
我们要计算 ∂ L ∂ w 0 \frac{∂L}{∂w_0} w0L ∂ L ∂ x 0 \frac{∂L}{∂x_0} x0L
根据链式法则 ∂ L ∂ w 0 = ∂ A ∂ w 0 ∂ L ∂ A = x 0 × 0.20 = ( − 1.00 ) × 0.20 = − 0.20 \frac{∂L}{∂w_0}=\frac{∂A}{∂w_0}\frac{∂L}{∂A}=x_0×0.20=(−1.00)×0.20=−0.20 w0L=w0AAL=x0×0.20=(1.00)×0.20=0.20
∂ L ∂ x 0 = ∂ A ∂ x 0 ∂ L ∂ A = w 0 × 0.20 = 2.00 × 0.20 = 0.40 \frac{∂L}{∂x_0}=\frac{∂A}{∂x_0}\frac{∂L}{∂A}=w_0×0.20=2.00×0.20=0.40 x0L=x0AAL=w0×0.20=2.00×0.20=0.40

类似地,我们可以计算得到另一边 w 1 × x 1 w_1×x_1 w1×x1节点的结果是 ∂ L ∂ w 1 = ∂ B ∂ w 1 ∂ L ∂ B = x 1 × 0.20 = ( − 2.00 ) × 0.20 = − 0.40 \frac{∂L}{∂w_1}=\frac{∂B}{∂w_1}\frac{∂L}{∂B}=x_1×0.20=(−2.00)×0.20=−0.40 w1L=w1BBL=x1×0.20=(2.00)×0.20=0.40
∂ L ∂ x 1 = ∂ B ∂ x 1 ∂ L ∂ B = w 1 × 0.20 = − 3.00 × 0.20 = 0.60 \frac{∂L}{∂x_1}=\frac{∂B}{∂x_1}\frac{∂L}{∂B}=w_1×0.20=-3.00×0.20=0.60 x1L=x1BBL=w1×0.20=3.00×0.20=0.60

当然我们这里是一步一步通过链式法则解决的,我们也可以将其看作一个完整的函数也就是将整个 Sigmoid 函数看作一个计算节点(gate)。
Sigmoid 函数: σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1
Sigmoid 的导数为: d σ ( x ) d x = σ ( x ) ( 1 − σ ( x ) ) \frac{d\sigma(x)}{dx} = \sigma(x)(1 - \sigma(x)) dxdσ(x)=σ(x)(1σ(x))
推导过程: σ ′ ( x ) = e − x ( 1 + e − x ) 2 = 1 + e − x − 1 1 + e − x = σ ( x ) ( 1 − σ ( x ) ) \sigma'(x) =\frac{e^{-x}}{{(1+e^{-x})}^2}=\frac{1+e^{-x}-1}{{1+e^{-x}}}= \sigma(x)(1 - \sigma(x)) σ(x)=(1+ex)2ex=1+ex1+ex1=σ(x)(1σ(x))
计算结果: ( 0.73 ) ∗ ( 1 − 0.73 ) = 0.2 (0.73)*(1-0.73)=0.2 (0.73)(10.73)=0.2
在这里插入图片描述
这与我们之前反向传播得到的结果一致。

1.3.1.1 三种基本节点的反向传播模式

在这里插入图片描述

有三种基本节点:

  1. 加法节点(add gate):梯度分配器(gradient distributor)
    特点:将上游梯度原样分配给所有输入
    原理: z = x + y z=x+y z=x+y ∂ z ∂ x = 1 \frac{∂z}{∂x}=1 xz=1 ∂ z ∂ y = 1 \frac{∂z}{∂y}=1 yz=1
    例子:上游梯度为 2.00,两个输入都得到 2.00
  2. 乘法节点(mul gate):梯度交换器(gradient switcher)
    特点:将上游梯度乘以另一个输入的值后传递
    原理: z = x × y z=x×y z=x×y ∂ z ∂ x = y \frac{∂z}{∂x}=y xz=y ∂ z ∂ y = x \frac{∂z}{∂y}=x yz=x
    例子: ∂ L ∂ x = y × 2.00 = − 4.00 × 2.00 = − 8.00 \frac{∂L}{∂x}=y×2.00=−4.00×2.00=−8.00 xL=y×2.00=4.00×2.00=8.00
    ∂ L ∂ y = x × 2.00 = 3.00 × 2.00 = 6.00 \frac{∂L}{∂y}=x×2.00=3.00×2.00=6.00 yL=x×2.00=3.00×2.00=6.00
  3. 最大值节点(max gate):梯度路由器(gradient router)
    特点:只将梯度传递给较大的输入,较小输入得到零梯度
    原理: z = m a x ( x , y ) z=max(x,y) z=max(x,y)
    如果 x > y x>y x>y,则 ∂ z ∂ x = 1 \frac{∂z}{∂x}=1 xz=1 ∂ z ∂ y = 0 \frac{∂z}{∂y}=0 yz=0
    如果 y > x y>x y>x,则 ∂ z ∂ x = 0 \frac{∂z}{∂x}=0 xz=0 ∂ z ∂ y = 1 \frac{∂z}{∂y}=1 yz=1
    例子中,因为 x x x较大所以 ∂ L ∂ x = 2.00 \frac{∂L}{∂x}=2.00 xL=2.00 ∂ L ∂ y = 0.00 \frac{∂L}{∂y}=0.00 yL=0.00
1.3.1.2 池化的反向传播
  1. Lp池化(Lp-pooling)
    y = ( ∑ i x i p ) 1 p y = \left( \sum_i x_i^p \right)^{\frac{1}{p}} y=(ixip)p1,其中 x i > 0 x_i > 0 xi>0
    已知: y ′ = ∂ L ∂ y y' = \frac{\partial L}{\partial y} y=yL
    求: x i ′ = ∂ L ∂ x i x_i' = \frac{\partial L}{\partial x_i} xi=xiL
    我们设 S = ∑ i x i p S = \sum_i x_i^p S=ixip,则$ y = S 1 / p y = S^{1/p} y=S1/p
    先求 ∂ y ∂ x i \frac{\partial y}{\partial x_i} xiy
    ∂ y ∂ x i = 1 p S 1 p − 1 ⋅ p x i p − 1 = S 1 p − 1 x i p − 1 \frac{\partial y}{\partial x_i} = \frac{1}{p} S^{\frac{1}{p} - 1} \cdot p x_i^{p-1} = S^{\frac{1}{p} - 1} x_i^{p-1} xiy=p1Sp11pxip1=Sp11xip1
    由于 y = S 1 / p y = S^{1/p} y=S1/p,所以 S 1 p − 1 = y S = y ∑ j x j p S^{\frac{1}{p} - 1} = \frac{y}{S} = \frac{y}{\sum_j x_j^p} Sp11=Sy=jxjpy
    因此: ∂ y ∂ x i = y ∑ j x j p x i p − 1 \frac{\partial y}{\partial x_i} = \frac{y}{\sum_j x_j^p} x_i^{p-1} xiy=jxjpyxip1
    最终: x i ′ = ∂ L ∂ x i = ∂ L ∂ y ⋅ ∂ y ∂ x i = y ′ ⋅ y ∑ j x j p x i p − 1 x_i' = \frac{\partial L}{\partial x_i} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x_i} = y' \cdot \frac{y}{\sum_j x_j^p} x_i^{p-1} xi=xiL=yLxiy=yjxjpyxip1
  2. 对数平均池化(log-average module)
    y = 1 β ln ⁡ ( 1 n ∑ i exp ⁡ ( β x i ) ) y = \frac{1}{\beta} \ln \left( \frac{1}{n} \sum_i \exp(\beta x_i) \right) y=β1ln(n1iexp(βxi))
    已知: y ′ = ∂ L ∂ y y' = \frac{\partial L}{\partial y} y=yL
    求: x i ′ = ∂ L ∂ x i x_i' = \frac{\partial L}{\partial x_i} xi=xiL
    我们设 S = 1 n ∑ i exp ⁡ ( β x i ) S = \frac{1}{n} \sum_i \exp(\beta x_i) S=n1iexp(βxi),则 y = 1 β ln ⁡ S y = \frac{1}{\beta} \ln S y=β1lnS
    先求 ∂ y ∂ x i \frac{\partial y}{\partial x_i} xiy
    ∂ y ∂ x i = 1 β ⋅ 1 S ⋅ ∂ S ∂ x i = 1 β ⋅ 1 S ⋅ 1 n ⋅ β exp ⁡ ( β x i ) \frac{\partial y}{\partial x_i} = \frac{1}{\beta} \cdot \frac{1}{S} \cdot \frac{\partial S}{\partial x_i} = \frac{1}{\beta} \cdot \frac{1}{S} \cdot \frac{1}{n} \cdot \beta \exp(\beta x_i) xiy=β1S1xiS=β1S1n1βexp(βxi)
    ∂ y ∂ x i = exp ⁡ ( β x i ) n S \frac{\partial y}{\partial x_i} = \frac{\exp(\beta x_i)}{nS} xiy=nSexp(βxi)
    由于 S = 1 n ∑ j exp ⁡ ( β x j ) S = \frac{1}{n} \sum_j \exp(\beta x_j) S=n1jexp(βxj),且 β y = ln ⁡ S \beta y = \ln S βy=lnS,所以 S = exp ⁡ ( β y ) S = \exp(\beta y) S=exp(βy)
    因此: ∂ y ∂ x i = exp ⁡ ( β x i ) n exp ⁡ ( β y ) = exp ⁡ ( β x i − β y ) n \frac{\partial y}{\partial x_i} = \frac{\exp(\beta x_i)}{n \exp(\beta y)} = \frac{\exp(\beta x_i - \beta y)}{n} xiy=nexp(βy)exp(βxi)=nexp(βxiβy)
    最终: x i ′ = ∂ L ∂ x i = ∂ L ∂ y ⋅ ∂ y ∂ x i = y ′ ⋅ exp ⁡ ( β ( x i − y ) ) n x_i' = \frac{\partial L}{\partial x_i} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x_i} = y' \cdot \frac{\exp(\beta (x_i - y))}{n} xi=xiL=yLxiy=ynexp(β(xiy))
1.3.1.3 向量时的梯度计算

在之前的例子中, x , y , z x,y,z x,y,z都是标量(单个数值)。现在考虑它们都是向量的情况。
我们用雅可比矩阵来描述向量值函数变化率,其中每个元素是 z z z的一个分量对 x x x的一个分量的偏导数。
在这里插入图片描述

向量化操作如下。
在这里插入图片描述
由于输入和输出都是4096维向量,且每个输出元素都是输入元素的逐元素操作的结果,因此雅可比矩阵是一个4096x4096的矩阵。这是因为每个输出元素对每个输入元素都有一个偏导数,形成了一个完整的矩阵。
我们这里使用的函数是ReLU函数,此时雅可比矩阵是一个稀疏矩阵,其中大部分元素为0,只有当输入元素 x i > 0 x_i>0 xi>0时,对应的偏导数为1。因此,雅可比矩阵中只有少数元素为1,其余为0。
理论上,如果考虑整个minibatch,雅可比矩阵的大小将是 409600×409600。这是因为每个输入向量有4096个元素,minibatch中有100个这样的向量,所以总的输入维度是 4096×100=409600,输出也是如此。
在实际应用中,尽管理论上雅可比矩阵的大小是 409600×409600,但在实践中,由于ReLU函数的特性(其导数在正值区域为1,在非正值区域为0),雅可比矩阵通常是稀疏的。这意味着在计算梯度时,我们只需要关注那些输入值为正的元素,从而大大减少了计算量,提升了计算效率。

我们现在看一个例子,用向量化操作计算L2范数(也称为欧几里得范数)的平方
在这里插入图片描述
f ( x , W ) = ∥ W ⋅ x ∥ 2 = ∑ i = 1 n ( W ⋅ x ) i 2 f(x, W) = \|W \cdot x\|^2 = \sum_{i=1}^{n} (W \cdot x)_i^2 f(x,W)=Wx2=i=1n(Wx)i2,其中 x x x是一个 R n R^n Rn维的向量, W W W是一个 R n × n R^{n×n} Rn×n维的矩阵。
我们给定输入值矩阵,如下图示。
在这里插入图片描述
我们先进行前向计算:
q = W x = [ 0.1 × 0.2 + 0.5 × 0.4 − 0.3 × 0.2 + 0.8 × 0.4 ] = [ 0.22 0.26 ] , f = ∥ q ∥ 2 = 0.22 2 + 0.26 2 = 0.116 q = W x =\begin{bmatrix} 0.1×0.2+0.5×0.4 \\ -0.3×0.2+0.8×0.4 \end{bmatrix} =\begin{bmatrix} 0.22 \\ 0.26 \end{bmatrix}, \quad f = \|q\|^2 =0.22^2+0.26^2=0.116 q=Wx=[0.1×0.2+0.5×0.40.3×0.2+0.8×0.4]=[0.220.26],f=q2=0.222+0.262=0.116

在这里插入图片描述

再计算反向传播梯度。
从损失 f f f开始, ∂ f ∂ f = 1.00 \frac{\partial f}{\partial f} = 1.00 ff=1.00
计算梯度: ∂ f ∂ q i = ( q 1 2 + q 2 2 ) ∂ q i = 2 q i \frac{\partial f}{\partial q_i} = \frac{(q_1^2+q_2^2)}{\partial q_i}=2q_i qif=qi(q12+q22)=2qi
∇ q f = 2 q = [ 0.44 0.52 ] \quad \nabla_q f = 2q = \begin{bmatrix} 0.44 \\ 0.52 \end{bmatrix} qf=2q=[0.440.52]

在这里插入图片描述

我们现在计算 f f f对权重矩阵 W W W的梯度。
使用链式法则: ∂ f ∂ W i , j = ∑ k ∂ f ∂ q k ∂ q k ∂ W i , j \frac{\partial f}{\partial W_{i,j}} = \sum_k \frac{\partial f}{\partial q_k} \frac{\partial q_k}{\partial W_{i,j}} Wi,jf=kqkfWi,jqk
其中: ∂ f ∂ q k = 2 q k \frac{\partial f}{\partial q_k} = 2q_k qkf=2qk
∂ q k ∂ W i , j = 1 k = i x j \frac{\partial q_k}{\partial W_{i,j}} = 1_{k=i} x_j Wi,jqk=1k=ixj( q k = ∑ l W k , l x l q_k = \sum_l W_{k,l} x_l qk=lWk,lxl ∂ q k ∂ W i , j = { x j if  k = i 0 otherwise \frac{\partial q_k}{\partial W_{i,j}} = \begin{cases} x_j & \text{if } k = i \\ 0 & \text{otherwise} \end{cases} Wi,jqk={xj0if k=iotherwise)
代入得: ∂ f ∂ W i , j = ∑ k ( 2 q k ) ( 1 k = i x j ) = 2 q i x j \frac{\partial f}{\partial W_{i,j}} = \sum_k (2q_k)(1_{k=i} x_j) = 2q_i x_j Wi,jf=k(2qk)(1k=ixj)=2qixj
矩阵形式: ∇ W f = 2 q x ⊤ \nabla_W f = 2q x^\top Wf=2qx
所以 ∇ W f = 2 × [ 0.22 0.26 ] [ 0.2 0.4 ] = [ 0.088 0.176 0.104 0.208 ] \nabla_W f = 2 \times \begin{bmatrix} 0.22 \\ 0.26 \end{bmatrix} \begin{bmatrix} 0.2 & 0.4 \end{bmatrix} = \begin{bmatrix} 0.088 & 0.176 \\ 0.104 & 0.208 \end{bmatrix} Wf=2×[0.220.26][0.20.4]=[0.0880.1040.1760.208]

在这里插入图片描述
我们现在计算输入向量 x x x对权重矩阵 W W W的梯度。
使用链式法则: ∂ f ∂ x i = ∑ k ∂ f ∂ q k ∂ q k ∂ x i \frac{\partial f}{\partial x_{i}} = \sum_k \frac{\partial f}{\partial q_k} \frac{\partial q_k}{\partial x_{i}} xif=kqkfxiqk
其中: ∂ f ∂ q k = 2 q k \frac{\partial f}{\partial q_k} = 2q_k qkf=2qk
∂ q k ∂ x i = W k , i \frac{\partial q_k}{\partial x_{i}} = W_{k,i} xiqk=Wk,i( q k = ∑ l W k , l x l q_k = \sum_l W_{k,l} x_l qk=lWk,lxl)
代入得: ∂ f ∂ x i = ∑ k ( 2 q k ) W k , i \frac{\partial f}{\partial x_i} = \sum_k (2q_k) W_{k,i} xif=k(2qk)Wk,i
矩阵形式: ∇ x f = 2 W ⊤ q \nabla_x f = 2W^\top q xf=2Wq
所以 ∇ x f = 2 × [ 0.1 − 0.3 0.5 0.8 ] [ 0.22 0.26 ] = [ − 0.112 0.636 ] \nabla_x f = 2 \times \begin{bmatrix} 0.1 & -0.3 \\ 0.5 & 0.8 \end{bmatrix} \begin{bmatrix} 0.22 \\ 0.26 \end{bmatrix} = \begin{bmatrix} -0.112 \\ 0.636 \end{bmatrix} xf=2×[0.10.50.30.8][0.220.26]=[0.1120.636]

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐