Week2 神经网络基础之逻辑回归
上节课我们主要对深度学习(Deep Learning)的概念做了简要的概述。我们先从房价预测的例子出发,建立了标准的神经网络(Neural Network)模型结构。然后从监督式学习入手,介绍了Standard NN,CNN和RNN三种不同的神经网络模型。接着介绍了两种不同类型的数据集:Structured Data和Unstructured Data。最后,我们解释了近些年来深度学习性能优于传统机器学习的原因,归结为三个因素:Data,Computation和Algorithms。本节课,我们将开始介绍神经网络的基础:逻辑回归(Logistic Regression)。通过对逻辑回归模型结构的分析,为我们后面学习神经网络模型打下基础。
1. Binary Classification
![](https://i-blog.csdnimg.cn/blog_migrate/32ad9a2179cd06830e18379e8bf87395.png)
如上图所示,这是一个典型的二分类问题。一般来说,彩色图片包含RGB三个通道。例如该cat图片的尺寸为(64,64,3)。在神经网络模型中,我们首先要将图片输入x(维度是(64,64,3))转化为一维的特征向量(feature vector)。方法是每个通道一行一行取,再连接起来。由于64x64x3=12288,则转化后的输入特征向量维度为(12288,1)。此特征向量x是列向量,维度一般记为 。
![n_x](https://i-blog.csdnimg.cn/blog_migrate/d7e5e8284dfa4313084e96f47868923b.png)
![n_x](https://i-blog.csdnimg.cn/blog_migrate/d7e5e8284dfa4313084e96f47868923b.png+)
![x^{(i)}](https://i-blog.csdnimg.cn/blog_migrate/8e8258c7869997b45fe1d697b95b4e54.png)
![n_x](https://i-blog.csdnimg.cn/blog_migrate/d7e5e8284dfa4313084e96f47868923b.png)
![n_x](https://i-blog.csdnimg.cn/blog_migrate/d7e5e8284dfa4313084e96f47868923b.png)
2. Logistic Regression
![\hat h=P(y=1\ |\ x)](https://i-blog.csdnimg.cn/blog_migrate/a87c300ff68c7c66062b81913eb66fac.png)
![n_x](https://i-blog.csdnimg.cn/blog_migrate/d7e5e8284dfa4313084e96f47868923b.png)
![\hat y = w^Tx+b](https://i-blog.csdnimg.cn/blog_migrate/7a81b42dd765845c1ddfe2227c4a898c.png)
![w_0](https://i-blog.csdnimg.cn/blog_migrate/c172255992954e12b1e4bd1d0b8133f4.png)
![x_0=1](https://i-blog.csdnimg.cn/blog_migrate/2efeb92512564da9e642f35eebcaf376.png)
上式的线性输出区间为整个实数范围,而逻辑回归要求输出范围在[0,1]之间,所以还需要对上式的线性函数输出进行处理。方法是引入Sigmoid函数,让输出限定在[0,1]之间。这样,逻辑回归的预测输出就可以完整写成:
![\hat y = Sigmoid(w^Tx+b)=\sigma(w^Tx+b)](https://i-blog.csdnimg.cn/blog_migrate/7bcb4ae45b48e57612c1e5c1b9f18669.png)
Sigmoid函数是一种非线性的S型函数,输出被限定在[0,1]之间,通常被用在神经网络中当作激活函数(Activation function)使用。Sigmoid函数的表达式和曲线如下所示:
![Sigmoid(z)=\frac{1}{1+e^{-z}}](https://i-blog.csdnimg.cn/blog_migrate/33597a110af1e7108bf4668fedab4d65.png)
![](https://i-blog.csdnimg.cn/blog_migrate/24de9c3ef46178c2302efca0bf4e6972.png)
从Sigmoid函数曲线可以看出,当z值很大时,函数值趋向于1;当z值很小时,函数值趋向于0。且当z=0时,函数值为0.5。还有一点值得注意的是,Sigmoid函数的一阶导数可以用其自身表示:
![\sigma'(z)=\sigma(z)(1-\sigma(z))](https://i-blog.csdnimg.cn/blog_migrate/f7b97759f1fe1befa6c6f13100a26dc3.png)
这样,通过Sigmoid函数,就能够将逻辑回归的输出限定在[0,1]之间了。
3. Logistic Regression Cost Function
逻辑回归中,w和b都是未知参数,需要反复训练优化得到。因此,我们需要定义一个cost function,包含了参数w和b。通过优化cost function,当cost function取值最小时,得到对应的w和b。
提一下,对于m个训练样本,我们通常使用上标来表示对应的样本。例如 表示第i个样本。
如何定义所有m个样本的cost function呢?先从单个样本出发,我们希望该样本的预测值 与真实值越相似越好。我们把单个样本的cost function用Loss function来表示,根据以往经验,如果使用平方错误(squared error)来衡量,如下所示:
![L(\hat y,y)=\frac12(\hat y-y)^2](https://i-blog.csdnimg.cn/blog_migrate/16b73a833b53c4e797f09a6e165e6546.png)
但是,对于逻辑回归,我们一般不使用平方错误来作为Loss function。原因是这种Loss function一般是non-convex的。non-convex函数在使用梯度下降算法时,容易得到局部最小值(local minumum),即局部最优化。而我们最优化的目标是计算得到全局最优化(Global optimization)。因此,我们一般选择的Loss function应该是convex的。
Loss function的原则和目的就是要衡量预测输出 与真实样本输出y的接近程度。平方错误其实也可以,只是它是non-convex的,不利于使用梯度下降算法来进行全局优化。因此,我们可以构建另外一种Loss function,且是convex的,如下所示:
![L(\hat y,y)=-(ylog\ \hat y+(1-y)log\ (1-\hat y))](https://i-blog.csdnimg.cn/blog_migrate/a0daf4906ae5a7a2ec849dbbd8e7c2db.png)
我们来分析一下这个Loss function,它是衡量错误大小的,Loss function越小越好。
当y=1时, 。如果
越接近1,
,表示预测效果越好;如果
越接近0,
,表示预测效果越差。这正是我们希望Loss function所实现的功能。
当y=0时, 。如果
越接近0,
,表示预测效果越好;如果
越接近1,
,表示预测效果越差。这也正是我们希望Loss function所实现的功能。
因此,这个Loss function能够很好地反映预测输出 与真实样本输出y的接近程度,越接近的话,其Loss function值越小。而且这个函数是convex的。上面我们只是简要地分析为什么要使用这个Loss function,后面的课程中,我们将详细推导该Loss function是如何得到的。并不是凭空捏造的哦。。。
还要提一点的是,上面介绍的Loss function是针对单个样本的。那对于m个样本,我们定义Cost function,Cost function是m个样本的Loss function的平均值,反映了m个样本的预测输出 与真实样本输出y的平均接近程度。Cost function可表示为:
![J(w,b)=\frac1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})=-\frac1m\sum_{i=1}^m[y^{(i)}log\ \hat y^{(i)}+(1-y^{(i)})log\ (1-\hat y^{(i)})]](https://i-blog.csdnimg.cn/blog_migrate/ea08c621a89727a3c556dbeaf936168e.png)
Cost function已经推导出来了,Cost function是关于待求系数w和b的函数。我们的目标就是迭代计算出最佳的w和b值,最小化Cost function,让Cost function尽可能地接近于零。
其实逻辑回归问题可以看成是一个简单的神经网络,只包含一个神经元。这也是我们这里先介绍逻辑回归的原因。
4. Gradient Descent
我们已经掌握了Cost function的表达式,接下来将使用梯度下降(Gradient Descent)算法来计算出合适的w和b值,从而最小化m个训练样本的Cost function,即J(w,b)。
![](https://i-blog.csdnimg.cn/blog_migrate/64d1ae026b2c323776aaf9bfa69458d3.png)
梯度下降算法每次迭代更新,w和b的修正表达式为:
![w:=w-\alpha\frac{\partial J(w,b)}{\partial w}](https://i-blog.csdnimg.cn/blog_migrate/de9e6e8d8d2eeac92a72cdead924df36.png)
![b:=b-\alpha\frac{\partial J(w,b)}{\partial b}](https://i-blog.csdnimg.cn/blog_migrate/34027313b58432dcf60c762775307586.png)
上式中, 是学习因子(learning rate),表示梯度下降的步进长度。
越大,w和b每次更新的“步伐”更大一些;
越小,w和b每次更新的“步伐”更小一些。在程序代码中,我们通常使用dw来表示
,用db来表示
。微积分里,
表示对单一变量求导数,
表示对多个变量中某个变量求偏导数。
5. Derivatives
这一部分的内容非常简单,Andrew主要是给对微积分、求导数不太清楚的同学介绍的。梯度或者导数一定程度上可以看成是斜率。关于求导数的方法这里就不再赘述了。
6. More Derivative Examples
Andrew给出了更加复杂的求导数的例子,略。
7. Computation graph
整个神经网络的训练过程实际上包含了两个过程:正向传播(Forward Propagation)和反向传播(Back Propagation)。正向传播是从输入到输出,由神经网络计算得到预测输出的过程;反向传播是从输出到输入,对参数w和b计算梯度的过程。下面,我们用计算图(Computation graph)的形式来理解这两个过程。
![](https://i-blog.csdnimg.cn/blog_migrate/ae4653f1d129c888c26b32bcf6bfafd4.png)
8. Derivatives with a Computation Graph
上一部分介绍的是计算图的正向传播(Forward Propagation),下面我们来介绍其反向传播(Back Propagation),即计算输出对输入的偏导数。
还是上个计算图的例子,输入参数有3个,分别是a,b,c。
首先计算J对参数a的偏导数。从计算图上来看,从右到左,J是v的函数,v是a的函数。则利用求导技巧,可以得到:
![\frac{\partial J}{\partial a}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial a}=3\cdot 1=3](https://i-blog.csdnimg.cn/blog_migrate/cb62a22cdaa4b83954727030777e1ff0.png)
根据这种思想,然后计算J对参数b的偏导数。从计算图上来看,从右到左,J是v的函数,v是u的函数,u是b的函数。可以推导:
![\frac{\partial J}{\partial b}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial u}\cdot \frac{\partial u}{\partial b}=3\cdot 1\cdot c=3\cdot 1\cdot 2=6](https://i-blog.csdnimg.cn/blog_migrate/e875e6339afddc2982a8c02524fd2325.png)
最后计算J对参数c的偏导数。仍从计算图上来看,从右到左,J是v的函数,v是u的函数,u是c的函数。可以推导:
![\frac{\partial J}{\partial c}=\frac{\partial J}{\partial v}\cdot \frac{\partial v}{\partial u}\cdot \frac{\partial u}{\partial c}=3\cdot 1\cdot b=3\cdot 1\cdot 3=9](https://i-blog.csdnimg.cn/blog_migrate/629322a3cc90b4e2cf0f3c92bca3fb37.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f65c575340bb09dfd960897bb5d2642b.png)
9. Logistic Regression Gradient Descent
现在,我们将对逻辑回归进行梯度计算。对单个样本而言,逻辑回归Loss function表达式如下:
![z=w^Tx+b](https://i-blog.csdnimg.cn/blog_migrate/e824d059cdc2fe1add31202b6ecc96d1.png)
![\hat y=a=\sigma(z)](https://i-blog.csdnimg.cn/blog_migrate/cf6619643b5cb085d120327abd1d7fe5.png%3Da%3D%5Csigma%28z%29)
![L(a,y)=-(ylog(a)+(1-y)log(1-a))](https://i-blog.csdnimg.cn/blog_migrate/9881cac7cc9fc7fee2275a80e99091e6.png)
![(x_1,x_2)](https://i-blog.csdnimg.cn/blog_migrate/b1ed79cba76a01a35fe57526cae81f4f.png)
![(w_1,w_2)](https://i-blog.csdnimg.cn/blog_migrate/27663253e67d5a6e1e21a1c7fe865069.png)
![z=w_1x_1+w_2x_2+b](https://i-blog.csdnimg.cn/blog_migrate/e7656e839bcd32843acd7af8bc8e5eeb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9fea42fcff2112f758468dea1bc4277a.png)
然后,计算该逻辑回归的反向传播过程,即由Loss function计算参数w和b的偏导数。推导过程如下:
![da=\frac{\partial L}{\partial a}=-\frac ya+\frac{1-y}{1-a}](https://i-blog.csdnimg.cn/blog_migrate/86afbbd9cb54a84576bf9c91eeecb85a.png)
![dz=\frac{\partial L}{\partial z}=\frac{\partial L}{\partial a}\cdot \frac{\partial a}{\partial z}=(-\frac ya+\frac{1-y}{1-a})\cdot a(1-a)=a-y](https://i-blog.csdnimg.cn/blog_migrate/5d6bcc752769c66bc48c758757b01139.png)
知道了dz之后,就可以直接对 ,
和b进行求导了。
![dw_1=\frac{\partial L}{\partial w_1}=\frac{\partial L}{\partial z}\cdot \frac{\partial z}{\partial w_1}=x_1\cdot dz=x_1(a-y)](https://i-blog.csdnimg.cn/blog_migrate/648498670378c5b55c416839e8a9de9c.png)
![dw_2=\frac{\partial L}{\partial w_2}=\frac{\partial L}{\partial z}\cdot \frac{\partial z}{\partial w_2}=x_2\cdot dz=x_2(a-y)](https://i-blog.csdnimg.cn/blog_migrate/6e0879edd9b3056ab9ec0e07a1b4c5a9.png)
![db=\frac{\partial L}{\partial b}=\frac{\partial L}{\partial z}\cdot \frac{\partial z}{\partial b}=1\cdot dz=a-y](https://i-blog.csdnimg.cn/blog_migrate/9c04373541ecdf641b799260c99c1419.png)
则梯度下降算法可表示为:
![w_1:=w_1-\alpha\ dw_1](https://i-blog.csdnimg.cn/blog_migrate/74f5de2ff69b7cfef69af98a241cab8f.png%3A%3Dw_1-%5Calpha%5C+dw_1)
![w_2:=w_2-\alpha\ dw_2](https://i-blog.csdnimg.cn/blog_migrate/7d14123e119e632c388bc57662119a70.png%3A%3Dw_2-%5Calpha%5C+dw_2)
![b:=b-\alpha\ db](https://i-blog.csdnimg.cn/blog_migrate/9ab777480241ac02ffa1163a51de5b09.png)
![](https://i-blog.csdnimg.cn/blog_migrate/aecf712d9c2ab69c8da3a24655003f4f.png)
10. Gradient descent on
examples
上一部分讲的是对单个样本求偏导和梯度下降。如果有m个样本,其Cost function表达式如下:
![z^{(i)}=w^Tx^{(i)}+b](https://i-blog.csdnimg.cn/blog_migrate/bede46278f8164958b4c2961873d8606.png)
![\hat y^{(i)}=a^{(i)}=\sigma(z^{(i)})](https://i-blog.csdnimg.cn/blog_migrate/cf6619643b5cb085d120327abd1d7fe5.png%5E%7B%28i%29%7D%3Da%5E%7B%28i%29%7D%3D%5Csigma%28z%5E%7B%28i%29%7D%29)
![J(w,b)=\frac1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})=-\frac1m\sum_{i=1}^m[y^{(i)}log\ \hat y^{(i)}+(1-y^{(i)})log\ (1-\hat y^{(i)})]](https://i-blog.csdnimg.cn/blog_migrate/ea08c621a89727a3c556dbeaf936168e.png)
Cost function关于w和b的偏导数可以写成和平均的形式:
![dw_1=\frac1m\sum_{i=1}^mx_1^{(i)}(a^{(i)}-y^{(i)})](https://i-blog.csdnimg.cn/blog_migrate/f750163a4f348d7b0794f69f2c99f60c.png)
![dw_2=\frac1m\sum_{i=1}^mx_2^{(i)}(a^{(i)}-y^{(i)})](https://i-blog.csdnimg.cn/blog_migrate/269bb08c91d18adbf1f1cf5a8d0d336b.png)
![db=\frac1m\sum_{i=1}^m(a^{(i)}-y^{(i)})](https://i-blog.csdnimg.cn/blog_migrate/be4ec3279facbfefbdbf988f2c83e95b.png)
这样,每次迭代中w和b的梯度有m个训练样本计算平均值得到。其算法流程图如下所示:
J=0; dw1=0; dw2=0; db=0;
for i = 1 to m
z(i) = wx(i)+b;
a(i) = sigmoid(z(i));
J += -[y(i)log(a(i))+(1-y(i))log(1-a(i));
dz(i) = a(i)-y(i);
dw1 += x1(i)dz(i);
dw2 += x2(i)dz(i);
db += dz(i);
J /= m;
dw1 /= m;
dw2 /= m;
db /= m;
经过每次迭代后,根据梯度下降算法,w和b都进行更新:
![w_1:=w_1-\alpha\ dw_1](https://i-blog.csdnimg.cn/blog_migrate/74f5de2ff69b7cfef69af98a241cab8f.png%3A%3Dw_1-%5Calpha%5C+dw_1)
![w_2:=w_2-\alpha\ dw_2](https://i-blog.csdnimg.cn/blog_migrate/7d14123e119e632c388bc57662119a70.png%3A%3Dw_2-%5Calpha%5C+dw_2)
![b:=b-\alpha\ db](https://i-blog.csdnimg.cn/blog_migrate/9ab777480241ac02ffa1163a51de5b09.png)
这样经过n次迭代后,整个梯度下降算法就完成了。
值得一提的是,在上述的梯度下降算法中,我们是利用for循环对每个样本进行dw1,dw2和db的累加计算最后再求平均数的。在深度学习中,样本数量m通常很大,使用for循环会让神经网络程序运行得很慢。所以,我们应该尽量避免使用for循环操作,而使用矩阵运算,能够大大提高程序运行速度。关于vectorization的内容我们放在下次笔记中再说。
11. Summary
本节课的内容比较简单,主要介绍了神经网络的基础——逻辑回归。首先,我们介绍了二分类问题,以图片为例,将多维输入x转化为feature vector,输出y只有{0,1}两个离散值。接着,我们介绍了逻辑回归及其对应的Cost function形式。然后,我们介绍了梯度下降算法,并使用计算图的方式来讲述神经网络的正向传播和反向传播两个过程。最后,我们在逻辑回归中使用梯度下降算法,总结出最优化参数w和b的算法流程。
注:转载自《红色石头的机器学习之路》