正向传播
正向传播是指数据X传入到神经网络,经过各个隐藏层得到最终损失值的过程。
本次就以逻辑回归模型为例讲解一下正向传播以及反向传播。
逻辑回归模型一般用来解决二分类问题,
y
^
=
P
(
y
=
1
∣
x
)
\hat{y}=P(y=1 \mid x)
y^=P(y=1∣x)表示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+e−z1
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)=m1∑i=1mL(y^(i),y(i))=−m1∑i=1m[y(i)logy^(i)+(1−y(i))log(1−y^(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−α∂w∂J(w,b):=b−α∂b∂J(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} ∂w∂J(w,b),用db来表示 ∂ J ( w , b ) ∂ b \frac{\partial J(w, b)}{\partial b} ∂b∂J(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)+(1−y)log(1−a))
计算该逻辑回归的反向传播过程,即由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=∂a∂L=−ay+1−a1−ydz=∂z∂L=∂a∂L⋅∂z∂a=(−ay+1−a1−y)⋅a(1−a)=a−y
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=∂w∂L=∂z∂L⋅∂w∂z=x⋅dz=x(a−y)db=∂b∂L=∂z∂L⋅∂b∂z=1⋅dz=a−y
以上讲得是对单个样本求梯度的推到过程,当我们有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)=m1∑i=1mL(y^(i),y(i))=−m1∑i=1m[y(i)logy^(i)+(1−y(i))log(1−y^(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=1∑mx(i)(a(i)−y(i))=m1i=1∑m(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−α∂w∂J(w,b):=b−α∂b∂J(w,b)
矩阵求导
矩阵导数的类型:
| 种类 | 标量 | 向量 | 矩阵 |
|---|---|---|---|
| 标量 | ∂ y ∂ x \frac{\partial y}{\partial x} ∂x∂y | ∂ y ∂ x \frac{\partial \mathbf{y}}{\partial x} ∂x∂y | ∂ Y ∂ x \frac{\partial \mathbf{Y}}{\partial x} ∂x∂Y |
| 向量 | ∂ y ∂ x \frac{\partial y}{\partial \mathbf{x}} ∂x∂y | ∂ y ∂ x \frac{\partial \mathbf{y}}{\partial \mathbf{x}} ∂x∂y | |
| 矩阵 | ∂ y ∂ X \frac{\partial y}{\partial \mathbf{X}} ∂X∂y |
在实际的机器学习工作中,最常用到的就是实值函数y对向量X的求导,定义如下(其实就是y对向量X的每一个元素求导):
实值函数对矩阵X求导也类似:
为了方便推导,下面列出一些机器学习中常用的求导公式,其中andrew ng那一套用矩阵迹的方法还是挺不错的,矩阵的迹也是实值的,而一个实数的迹等于其本身,实际工作中可以将loss函数转化成迹,然后在求导,可能会简化推导的步骤。