正向传播

正向传播是指数据X传入到神经网络,经过各个隐藏层得到最终损失值的过程。
本次就以逻辑回归模型为例讲解一下正向传播以及反向传播。
逻辑回归模型一般用来解决二分类问题, y ^ = P ( y = 1 ∣ x ) \hat{y}=P(y=1 \mid x) y^=P(y=1x)表示y = 1的概率,取值范围在[0,1]之间。引入线性模型:
y ^ ( i ) = w T x ( i ) + b \hat{y}^{(i)}=w^{T} x^{(i)}+b y^(i)=wTx(i)+b
其中 w w w是权重系数, b b b是个常数项, w w w的维度为 ( n x , 1 ) \left(n_{x}, 1\right) (nx,1),可以看出该线性模型的输出区间为整个实数区间,而逻辑回归要求输出范围在[0,1]之间。所以我们需要引入Sigmoid**函数,逻辑回归预测输出可以写为:
y ^ = Sigmoid ⁡ ( w T x ( i ) + b ) = σ ( w T x ( i ) + b ) \hat{y}=\operatorname{Sigmoid}\left(w^{T} x^{(i)}+b\right)=\sigma\left(w^{T} x^{(i)}+b\right) y^=Sigmoid(wTx(i)+b)=σ(wTx(i)+b)
Sigmoid函数是一种非线性函数,它的表达式以及曲线如下图表示:
 Sigmoid  ( z ) = 1 1 + e − z \text { Sigmoid }(z)=\frac{1}{1+e^{-z}}  Sigmoid (z)=1+ez1
正向传播,反向传播,矩阵求导
Sigmoid函数导数表达式:
σ ′ ( z ) = σ ( z ) ( 1 − σ ( z ) ) \sigma^{\prime}(z)=\sigma(z)(1-\sigma(z)) σ(z)=σ(z)(1σ(z))
由函数曲线图可以看出,Sigmoid函数的输出范围在[0,1]之间,这样也就将逻辑回归的输出限定在[0,1]之间。常用的**函数还有Tanh函数、Relu函数、Leaky Relu函数。
逻辑回归模型中, w w w b b b都是未知参数,需要通过反复训练优化得到最优值。因此,我们需要定义一个cost function,包含了参数 w w w b b b。通过梯度下降法优化cost function,当cost function取值最小时,得到对应的 w w w b b b。cost function定义为:
J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ y ^ ( i ) + ( 1 − y ( i ) ) log ⁡ ( 1 − y ^ ( i ) ) ] \begin{array}{c} J(w, b)=\frac{1}{m} \sum_{i=1}^{m} L\left(\hat{y}^{(i)}, y^{(i)}\right)=-\frac{1}{m} \sum_{i=1}^{m}\left[y^{(i)} \log \hat{y}^{(i)}+\left(1-y^{(i)}\right) \log \left(1-\hat{y}^{(i)}\right)\right] \end{array} J(w,b)=m1i=1mL(y^(i),y(i))=m1i=1m[y(i)logy^(i)+(1y(i))log(1y^(i))]
当我们有m个样本时,通常使用上标来表示相应的样本,例如 ( x ( i ) , y ( i ) ) \left(x^{(i)}, y^{(i)}\right) (x(i),y(i))表示第i个样本。

梯度下降法

由于J(w,b)是凸函数,梯度下降算法是先随机选择一组参数 w w w b b b值,然后每次迭代的过程中分别沿着w和b的梯度(偏导数)的反方向前进一小步,不断修正 w w w b b b。每次迭代更新 w w w b b b后,都能让J(w,b)更接近全局最小值。梯度下降的过程如下图所示:
正向传播,反向传播,矩阵求导
w w w b b b的更新表达式为:
w : = w − α ∂ J ( w , b ) ∂ w b : = b − α ∂ J ( w , b ) ∂ b \begin{array}{c} w &:=w-\alpha \frac{\partial J(w, b)}{\partial w} \\\\ b &:=b-\alpha \frac{\partial J(w, b)}{\partial b} \end{array} wb:=wαwJ(w,b):=bαbJ(w,b)

上式中,α是学习因子(learning rate),表示梯度下降的步长。α越大, w w w b b b每次更新的“步伐”更大一些;α越小, w w w b b b每次更新的“步伐”更小一些。在程序代码中,我们通常使用dw来表示 ∂ J ( w , b ) ∂ w \frac{\partial J(w, b)}{\partial w} wJ(w,b),用db来表示 ∂ J ( w , b ) ∂ b \frac{\partial J(w, b)}{\partial b} bJ(w,b)

反向传播

反向传播主要是针对神经网络优化的过程中进行,在输出端计算总的损失函数,然后根据梯度下降法不断迭代递减 w w w b b b参数,逐层的向前反馈,形成反向传播机制。
以一个样本为例,正向传播所有公式为:
z = w T x + b y ^ = a = σ ( z ) L ( a , y ) = − ( y log ⁡ ( a ) + ( 1 − y ) log ⁡ ( 1 − a ) ) \begin{array}{c} z=w^{T} x+b \\\\ \hat{y}=a=\sigma(z) \\\\ L(a, y)=-(y \log (a)+(1-y) \log (1-a)) \end{array} z=wTx+by^=a=σ(z)L(a,y)=(ylog(a)+(1y)log(1a))
计算该逻辑回归的反向传播过程,即由Loss function计算参数 w w w b b b的偏导数。推导过程如下:
d a = ∂ L ∂ a = − y a + 1 − y 1 − a d z = ∂ L ∂ z = ∂ L ∂ a ⋅ ∂ a ∂ z = ( − y a + 1 − y 1 − a ) ⋅ a ( 1 − a ) = a − y \begin{array}{c} d a=\frac{\partial L}{\partial a}=-\frac{y}{a}+\frac{1-y}{1-a} \\\\ d z=\frac{\partial L}{\partial z}=\frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z}=\left(-\frac{y}{a}+\frac{1-y}{1-a}\right) \cdot a(1-a)=a-y \end{array} da=aL=ay+1a1ydz=zL=aLza=(ay+1a1y)a(1a)=ay
d w = ∂ L ∂ w = ∂ L ∂ z ⋅ ∂ z ∂ w = x ⋅ d z = x ( a − y ) d b = ∂ L ∂ b = ∂ L ∂ z ⋅ ∂ z ∂ b = 1 ⋅ d z = a − y \begin{array}{c} d w &=\frac{\partial L}{\partial w}=\frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial w}=x \cdot d z=x(a-y) \\\\ & d b=\frac{\partial L}{\partial b}=\frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial b}=1 \cdot d z=a-y \end{array} dw=wL=zLwz=xdz=x(ay)db=bL=zLbz=1dz=ay
以上讲得是对单个样本求梯度的推到过程,当我们有m个样本时,正向传播所需的公式为:
z ( i ) = w T x ( i ) + b y ^ ( i ) = a ( i ) = σ ( z ( i ) ) J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) = − 1 m ∑ i = 1 m [ y ( i ) log ⁡ y ^ ( i ) + ( 1 − y ( i ) ) log ⁡ ( 1 − y ^ ( i ) ) ] \begin{array}{c} z^{(i)}=w^{T} x^{(i)}+b \\\\ \hat{y}^{(i)}=a^{(i)}=\sigma\left(z^{(i)}\right) \\\\ J(w, b)=\frac{1}{m} \sum_{i=1}^{m} L\left(\hat{y}^{(i)}, y^{(i)}\right)=-\frac{1}{m} \sum_{i=1}^{m}\left[y^{(i)} \log \hat{y}^{(i)}+\left(1-y^{(i)}\right) \log \left(1-\hat{y}^{(i)}\right)\right] \end{array} z(i)=wTx(i)+by^(i)=a(i)=σ(z(i))J(w,b)=m1i=1mL(y^(i),y(i))=m1i=1m[y(i)logy^(i)+(1y(i))log(1y^(i))]
Cost function关于 w w w b b b的梯度可以由m个样本求取平均值得到:
d w = 1 m ∑ i = 1 m x ( i ) ( a ( i ) − y ( i ) ) d b = 1 m ∑ i = 1 m ( a ( i ) − y ( i ) ) \begin{aligned} d w &=\frac{1}{m} \sum_{i=1}^{m} x^{(i)}\left(a^{(i)}-y^{(i)}\right) \\\\ d b &=\frac{1}{m} \sum_{i=1}^{m}\left(a^{(i)}-y^{(i)}\right) \end{aligned} dwdb=m1i=1mx(i)(a(i)y(i))=m1i=1m(a(i)y(i))
根据梯度下降算法,对 w w w b b b都进行更新,这一过程可以进行多次:
w : = w − α ∂ J ( w , b ) ∂ w b : = b − α ∂ J ( w , b ) ∂ b \begin{array}{c} w &:=w-\alpha \frac{\partial J(w, b)}{\partial w} \\\\ b &:=b-\alpha \frac{\partial J(w, b)}{\partial b} \end{array} wb:=wαwJ(w,b):=bαbJ(w,b)

矩阵求导

矩阵导数的类型:

种类 标量 向量 矩阵
标量 ∂ y ∂ x \frac{\partial y}{\partial x} xy ∂ y ∂ x \frac{\partial \mathbf{y}}{\partial x} xy ∂ Y ∂ x \frac{\partial \mathbf{Y}}{\partial x} xY
向量 ∂ y ∂ x \frac{\partial y}{\partial \mathbf{x}} xy ∂ y ∂ x \frac{\partial \mathbf{y}}{\partial \mathbf{x}} xy
矩阵 ∂ y ∂ X \frac{\partial y}{\partial \mathbf{X}} Xy

在实际的机器学习工作中,最常用到的就是实值函数y对向量X的求导,定义如下(其实就是y对向量X的每一个元素求导):
正向传播,反向传播,矩阵求导
实值函数对矩阵X求导也类似:
正向传播,反向传播,矩阵求导
为了方便推导,下面列出一些机器学习中常用的求导公式,其中andrew ng那一套用矩阵迹的方法还是挺不错的,矩阵的迹也是实值的,而一个实数的迹等于其本身,实际工作中可以将loss函数转化成迹,然后在求导,可能会简化推导的步骤。
正向传播,反向传播,矩阵求导

相关文章:

  • 2022-12-23
  • 2021-10-22
  • 2021-10-26
猜你喜欢
  • 2022-12-23
  • 2022-01-19
  • 2021-06-02
  • 2021-06-27
  • 2021-08-15
  • 2021-11-27
  • 2021-11-28
相关资源
相似解决方案