本笔记系列参照吴恩达深度学习课程的视频和课件,并在学习和做练习过程中从CSDN博主何宽分享的文章中得到了帮助,再此表示感谢。
本周主要学习的内容有:二元分类、logistic回归、logistic回归损失函数、梯度下降法、计算图、logistic回归中的梯度下降法、向量化logistic回归以及梯度输出、Python广播操作
二元分类问题是指输出值为0或1的问题,属于离散输出问题,我们可以使用逻辑回归算法来解决,换句话来说逻辑回归可以有效解决输出值为0或1这样的二元分类问题。逻辑回归模型的数学表达如下
给定一个输出
x
(
i
)
x^{(i)}
x(i)及其对应的标签值
y
(
i
)
y^{(i)}
y(i):
我们首先进行初始化权重W和偏差b后得到
z
(
i
)
=
w
T
x
(
i
)
+
b
(1)
z^{(i)} = w^T x^{(i)} + b \tag{1}
z(i)=wTx(i)+b(1)
根据sigmoid激活函数我们可以得到本次模型的预测值
y
^
(
i
)
\hat{y}^{(i)}
y^(i):
y
^
(
i
)
=
a
(
i
)
=
s
i
g
m
o
i
d
(
z
(
i
)
)
=
1
1
+
e
−
z
(2)
\hat{y}^{(i)} = a^{(i)} = sigmoid(z^{(i)})=\frac{1}{1+e^{-z}}\tag{2}
y^(i)=a(i)=sigmoid(z(i))=1+e−z1(2)
进一步我们得出本次输出的损失函数为:
L
(
a
(
i
)
,
y
(
i
)
)
=
−
y
(
i
)
log
(
a
(
i
)
)
−
(
1
−
y
(
i
)
)
log
(
1
−
a
(
i
)
)
(3)
\mathcal{L}(a^{(i)}, y^{(i)}) = - y^{(i)} \log(a^{(i)}) - (1-y^{(i)} ) \log(1-a^{(i)})\tag{3}
L(a(i),y(i))=−y(i)log(a(i))−(1−y(i))log(1−a(i))(3)
对于m个样本模型的损失函数为:
J
=
1
m
∑
i
=
1
m
L
(
a
(
i
)
,
y
(
i
)
)
(4)
J = \frac{1}{m} \sum_{i=1}^m \mathcal{L}(a^{(i)}, y^{(i)})\tag{4}
J=m1i=1∑mL(a(i),y(i))(4)
以上就是一次前向传播的推导过程,如下图中蓝色箭头所示,
而对于反向传播实际上等效于复合函数求导,反向传播过程如下图中的红色箭头所示:
逻辑回归模型的反向传播推导过程如下:
为方便说明,先讨论一个样本,由上图及微积分中的链式法则可知:
∂
L
∂
w
=
∂
L
∂
a
∂
a
∂
z
∂
z
∂
w
\frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \frac{\partial a}{\partial z} \frac{\partial z}{\partial w}
∂w∂L=∂a∂L∂z∂a∂w∂z
∂
L
∂
b
=
∂
L
∂
a
∂
a
∂
z
∂
z
∂
b
\frac{\partial L}{\partial b} = \frac{\partial L}{\partial a} \frac{\partial a}{\partial z} \frac{\partial z}{\partial b}
∂b∂L=∂a∂L∂z∂a∂b∂z
-
1.已知 L ( a , y ) = − [ y l o g ( a ) + ( 1 − y ) l o g ( 1 − a ) ] L(a,y)=-[ylog(a)+(1-y)log(1-a)] L(a,y)=−[ylog(a)+(1−y)log(1−a)],很容易算出 ∂ L ∂ a = − y a + 1 − y 1 − a = a − y a ( 1 − a ) (5) \frac{\partial L}{\partial a} = - \frac{y}{a}+\frac{1-y}{1-a} = \frac{a-y}{a(1-a)} \tag{5} ∂a∂L=−ay+1−a1−y=a(1−a)a−y(5)
-
2.另外 a = 1 1 + e − z a = \frac{1}{1+e^{-z}} a=1+e−z1,则有 ∂ a ∂ z = a ( 1 − a ) (6) \frac{\partial a}{\partial z} = a(1-a) \tag{6} ∂z∂a=a(1−a)(6)
-
3.还有 z = w 1 x 1 + w 2 x 2 + b z = w_1x_1+w_2x_2+b z=w1x1+w2x2+b,故 ∂ z ∂ w = [ x 1 , x 2 ] (7) \frac{\partial z}{\partial w}=[x_1, x_2] \tag{7} ∂w∂z=[x1,x2](7)
同理有 ∂ z ∂ b = 1 (8) \frac{\partial z}{\partial b} = 1 \tag{8} ∂b∂z=1(8)
通过(5)~(8)式得出对于单个样本有:
∂
L
∂
w
=
∂
L
∂
a
∂
a
∂
z
∂
z
∂
w
=
a
−
y
a
(
1
−
a
)
a
(
1
−
a
)
x
=
(
a
−
y
)
x
\frac{\partial L}{\partial w} =\frac{\partial L}{\partial a} \frac{\partial a}{\partial z} \frac{\partial z}{\partial w} = \frac{a-y}{a(1-a)} a(1-a)x \\= (a-y)x
∂w∂L=∂a∂L∂z∂a∂w∂z=a(1−a)a−ya(1−a)x=(a−y)x
∂ L ∂ b = ∂ L ∂ a ∂ a ∂ z ∂ z ∂ b = a − y a ( 1 − a ) a ( 1 − a ) = ( a − y ) \frac{\partial L}{\partial b} =\frac{\partial L}{\partial a} \frac{\partial a}{\partial z} \frac{\partial z}{\partial b} = \frac{a-y}{a(1-a)} a(1-a) \\ = (a-y) ∂b∂L=∂a∂L∂z∂a∂b∂z=a(1−a)a−ya(1−a)=(a−y)
对于所有样本则有如下(9)(10)公式所示:
- 给定一组逻辑回归模型输入矩阵 X
- 我们通过计算得到 A = σ ( w T X + b ) = ( a ( 0 ) , a ( 1 ) , . . . , a ( m − 1 ) , a ( m ) ) A = \sigma(w^T X + b) = (a^{(0)}, a^{(1)}, ..., a^{(m-1)}, a^{(m)}) A=σ(wTX+b)=(a(0),a(1),...,a(m−1),a(m))
- 然后我们可以计算逻辑回归模型的损失函数 J = − 1 m ∑ i = 1 m y ( i ) log ( a ( i ) ) + ( 1 − y ( i ) ) log ( 1 − a ( i ) ) J = -\frac{1}{m}\sum_{i=1}^{m}y^{(i)}\log(a^{(i)})+(1-y^{(i)})\log(1-a^{(i)}) J=−m1∑i=1my(i)log(a(i))+(1−y(i))log(1−a(i))
- 根据上面(5)(6)(7)(8)公式的推导出
d w = ∂ J ∂ w = 1 m X ( A − Y ) T (9) dw=\frac{\partial J}{\partial w} = \frac{1}{m}X(A-Y)^T\tag{9} dw=∂w∂J=m1X(A−Y)T(9)
d b = ∂ J ∂ b = 1 m ∑ i = 1 m ( a ( i ) − y ( i ) ) (10) db=\frac{\partial J}{\partial b} = \frac{1}{m} \sum_{i=1}^m (a^{(i)}-y^{(i)})\tag{10} db=∂b∂J=m1i=1∑m(a(i)−y(i))(10)
根据(9)(10)公式得到的dw和db,模型会对参数进行一次更新:
w
′
=
w
−
α
d
w
w'=w-\alpha{dw}
w′=w−αdw
b
′
=
b
−
α
d
b
b'=b-\alpha{db}
b′=b−αdb
得到w’和b’重新进行前向传播,得到新的输出值,代价函数,如此循环…
因此,从以上的推理分析来看,深度神经网络的训练计算过程我们可以这样来理解:
- 对于给定的输入X及其标签Y,我们首先给模型初始化设置一组参数W和b,学习速率 α \alpha α
- 模型根据参数对输入X进行计算,得到预测值 Y ^ \hat Y Y^
- 通过标签Y和预测值 Y ^ \hat Y Y^,我们计算得到模型本次输出的损失函数J,至此这是模型的一次前向传播过程
- 很明显,模型不可能只进行一次训练就能让预测值 Y ^ \hat Y Y^十分接近标签值Y,我们需要将不断地减小损失函数J,而让函数曲线递减,用微积分的观念理解是不断地给损失函数一个递减量dJ,理解到这儿后,我们可以联想到复合函数的求导概念,要想损失函数在下一次输出时变换一个递减量dJ,我们只需要更新下参数w和b的值即可,而反向传播就是为了计算得出参数W和b在下一次训练需要的变化量dw和db,所以根据公式(9)(10),模型得到新的参数w’和b’,这样模型可以进行新的一次迭代,如此反复,指的模型的损失函数值达到我们可接受的范围为止。
Python中的广播机制(Broadcasting):如果你有一个mn的矩阵,让它加减乘除一个1n的矩阵,它会被复制m次,成为一个mn的矩阵,然后再逐元素地进行加减乘除操作。同样地对m1的矩阵成立,广播机制可以减少我们的代码量,特别是for循环,在深度学习编程中我们要遵循的一条重要规则是:无论何时,尽可能地避免显示地使用for循环。
广播机制在深度学习函数构建中应用得很广,比如说我们在逻辑回归函数中,激活函数z = wT * X + b, b是一个数而前面的wT * X是一个1*n的矩阵,由于python这种机制,不需要我们为b构建向量,这就减轻了代码量。
注意:Python和numpy中矩阵的元素乘法用a*b表示,而矩阵的乘法运算用np.dot(a,b)表示