从logistic回归到神经网络——理论与实践

有任何问题请联系 [email protected]

本文是深度学习入门教程序列的第一篇,通过介绍logistic回归的原理,进而引入一层神经网络的前向传播和后向传播公式,并提供了示例代码。

1.logistic回归详解

logistic回归模型是用来解决二分类问题的,因此我们将首先在概率的框架下描述什么是分类问题。分类问题的一般描述如下图所示:

从logistic回归到神经网络——理论与实践

图1.1 分类问题的一般描述

用X代表输入空间,是输入向量的所有可能取值的集合,也叫特征空间;Y代表输出空间,是输出的所有可能取值的集合。x(i)X代表特征空间的一个样本,y(i)Y代表其类别(标签)。分类问题的一般描述可总结为:利用已知标签的训练集Xtrain训练出一个模型,该模型包含一个映射关系h:XYh应该能够对新的数据点x(m+1)预测其类别y(m+1),并且预测结果应该尽可能好。通常情况下,这种“好”的标准为正确率尽可能高。

以二分类问题为例,用0和1代表可能的类别,也即Y={0,1}。我们从概率的框架下来讨论二分类问题:给定输入特征向量x,我们希望估计出它分别属于两类的概率P(y=0|x;θ)P(y=1|x;θ)。因为现在讨论的是二分类问题,可令y^=P(y=1|x;θ),那么只要估计出y^就可以了。在估计之前,需要选择合适形式的函数对各类别的后验概率建模,一种最简单也是最笨的方法就是令y^=wTx+b,也即线性回归。但是这样可能会导致y^的值大于1或者大于0,这和概率的定义相违背。因此,我们可以在线性回归的表达式前面加上一层sigmoid函数,也即y^=σ(ωTx+b)。sigmoid函数的表达式为:

(1-1)σ(z)=11+ez

其函数图像为:

从logistic回归到神经网络——理论与实践

图1.2 logistic函数图像

到此,我们得到了logistic回归模型:
(1-2)y^=11+e(θTx)

注意,在(12)中,我们将参数项b用x0表示,这样能够写成更紧凑的形式。为了突出参数θ,我们用hθ表示公式(2)中的函数,它代表了在已知特征x的情况下,类别为y=1的概率,也即P(y=1|x;θ)=hθ;显然,P(y=0|x;θ)=1hθ
假设我们的目标是让分类的错误率最小(即最小错误率决策准则,这是最普遍的一种分类准则)。不难证明,最小化错误等价于最大化各类的后验概率。因此,若(12)的值大于0.5,则判定为类别1;否则判定为类别0。

注意,logistic模型仍然是一个线性分类模型,因为它的决策面是0=wTx+b,我一个线性决策面。

2.损失函数的选取

选取好了模型后,接下来要选取损失函数(Loss function),然后在训练集上利用一定的算法(例如梯度下降法)最小化损失函数,从而确定hθ中的参数θ。一种很自然的想法是选取L(y^,y)=12(y^y)2作为损失函数,但是这会导致在后面学习参数的过程中,最优问题不是一个凸问题。我们在这里采用极大似然估计的方法来推导出一个更合理的损失函数,并且该损失函数是凸函数。

2.1.最大化后验概率与极大似然估计

回忆一下极大似然估计的思想:对于可观测的样本X及其观测值Y,写出该观测值的概率表达式(记为L(θ)),该概率表达式一般依赖于参数θ,极大似然估计的目标是寻找θ的估计值θ^使得L(θ)最大。
对于某一个观测样本x(i)和观测值y(i),有:

(2-1)L(θ)=P(y(i)|x;θ)=(hθ(x))1(y(i)=1)(1hθ(x))1(y(i)=0)=(hθ(x))y(1hθ(x))1y

L(θ)也叫似然函数。
对数似然函数为:
l(θ)=logL(θ)(2-2)=ylog(hθ(x))+(1y)log(1hθ(x))

(22)就是单个样本的损失函数。下面讨论训练集上的代价函数(cost function)。
对于多个观测样本X和观测值Y,似然函数可写成:
(2-3)L(θ)=P(Y|X;θ)=i=1mP(y(i)|x(i);θ)=i=1m(hθ(x(i)))y(i)(1hθ(x(i)))1y(i)

对数似然函数为:
(2-4)l(θ)=logL(θ)=i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))

因为对数似然函数需要最大化,而损失函数需要最小化,因此我们选择如下表达式作为损失函数:
(2-5)J(θ)=1m[i=1my(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]

(25)就是代价函数(cost function),它等价于对所有的(22)取平均。
损失函数(loss function)是定义在单个样本上的,代价函数(cost function)是定义在多个样本上的。

3.梯度下降方法求解最优的参数wb(一层神经网络)

利用logistic可以构造一个只含有输出层的神经网络,其结构图如下:

从logistic回归到神经网络——理论与实践

图3.1 用logistic回归表示的单层神经网络结构图

下面介绍其作为神经网络时的前向传播、反向传播过程,为后面理解更复杂的神经网络打下基础。
logistic回归的代价函数的凸函数,因此可以用梯度下降的方法求得全局最优值,并且与初始化的方式无关,一般利用零初始化。

(3-1)w:=wαJ(w,b)wb:=bαJ(b,b)b

注意,Andrew NG在Cousera开设的深度学习课程中,求偏导用的是符号d,我们这里不区分d
下面我们讨论只有输入层和输出层(**函数为sigmoid函数)的简单神经网络的前向传播和反向传播过程,也即logistic回归。

3.1.前向传播

(3-2)X=[x(1),x(2),,x(m)]Z=[z(1),z(2),,z(m)]=[wTx(1)+b,wTx(2)+b,,wTx(m)+b]A=[a(1),a(2),,a(m)]=[σ(a(1)),σ(a(2)),,σ(a(m))]Y=[y(1),y(2),,y(m)]

(32)中从上到下的顺序可以代表前向传播过程。

3.2.反向传播

先对求导公式进行一些化简:

(3-3)da=dL(a,y)da=ya+1y1a

(3-4)dz=dL(a,y)dz=dL(a,y)dadadz=(ya+1y1a)a(1a)=ay

有了(34),我们就能得到dZ=AY。因此反向传播过程如下:
(3-5)dZ=AYdw=1mXdZT=1mX(AY)Tdb=1mi=1m(dZ(i))

注意,(35)的流程可以理解为先对每一个样本求损失函数关于z的梯度,并对每个样本求出dw,在对所有样本的dw球平均,因此有1/m

从logistic回归到神经网络——理论与实践

图3.2 logistic回归梯度下降

也可以对m个样本的代价函数一次性直接求偏导,这需要一定的向量微分和复合函数微分的知识。这样的话,在dZ中就会有一个1/m,那么在求dw时就不用另外再加一个1/m了,并且形状可能互为转置,最终的结果是一样的。具体过程这里省略,有兴趣的读者可以自行推导。

4.单层神经网络示例代码

网络结构见图3.1
请点击下面的超链接跳转至github页面:
用logistic回归实现一层神经网络用来识别猫的图片
其中Logistic_Regression_with_a_Neural_Network_mindset.ipynb文件包含详细的注释和图示,但需要在jupyternotebook中运行;Logistic_Regression_with_a_Neural_Network_mindset.py文件可直接用“python”命令运行,两者的功能是一样的。

5.两层神经网络

5.1.前向传播

(5-1)X=[x(1),x(2),,x(m)]W[1]=[w1[1],w2[1],,wn1[1]]Tb[1]=[b1[1],b2[1],,bn1[1]]Z[1]=W[1]X+b[1]A[1]=g[1](Z[1])W[2]=[w1[2],w2[2],,wn2[2]]Tb[2]=[b1[2],b2[2],,bn2[2]]Z[2]=W[2]A[1]+b[2]A[2]=g[2](Z[2])Y=[y(1),y(2),,y(m)]

(51)中从上到下的顺序可以代表前向传播过程。

5.2.反向传播

(5-2)dZ[2]=A[2]YdW[2]=1mdZ[2]A[1] Tdb[2]=1mnp.sum(dZ[2],axis=1,keepdims=True)dA[1]=W[2]TdZ[2]dZ[1]=dA[1]g[1](Z[1])dW[1]=1mdZ[1]A[0] Tdb[1]=1mnp.sum(dZ[1],axis=1,keepdims=True)

(52)中从上到下的顺序可以代表前向传播过程。

5.3.关于参数的初始化

在单层神经网络(logistic回归)中,可以将参数初始化wie全零值;但是在多层神经网络中,W不能初始化为0,否则每一层的各个节点对应的W会训练成一样的值;b可以初始化为0 W不能初始化为特别大,浅层网络一般是0.01量级;因为太大了的话,**函数的自变量要么正向很大,要么负向很大,导致斜率趋近于0 ,收敛速度很慢。尤其是你使用sigmoidtanh**函数。如果不使用这些**函数,但是你是二分类问题(输出层是sigmoid函数),也会出现这个问题.

5.4.2层神经网络示例代码

对如下二维平面上的点进行分类:

从logistic回归到神经网络——理论与实践

图5.1 二维平面上的非线性二分类数据集例子

网络结构如下:
从logistic回归到神经网络——理论与实践

图5.2 2层神经网络结构例子

点击下面的超链接查看完整代码:
2层神经网络的示例代码
其中Palnar_data_clf_with_one_hidden_layer.ipynb文件包含详细的注释和图示,但需要在jupyternotebook中运行;Palnar_data_clf_with_one_hidden_layer.py文件可直接用“python”命令运行,两者的功能是一样的。

6.深层神经网络

6.1.每层的参数及变量的尺寸

(6-1)z[l]:(n[l],1)a[l]:(n[l],1)W[l]:(n[l],n[l1])b[l]:(n[l],1)dW[l]:(n[l],n[l1])db[l]:(n[l],1)

6.2.前向传播递推公式

(6-2)X=[x(1),x(2),,x(m)]W[l]=[w1[l],w2[l],,wnl[l]]Tb[l]=[b1[l],b2[l],,bnl[l]]Z[l]=W[l]A[l1]+b[l]A[l]=g[l](Z[l])W[l+1]=[w1[l+1],w2[l+1],,wnl+1[l+1]]Tb[l+1]=[b1[l+1],b2[l+1],,bn2[l+1]]Z[l+1]=W[l+1]A[l]+b[l+1]A[l+1]=g[l+1](Z[l+1])Y=[y(1),y(2),,y(m)]

6.3.反向传播递推公式

(6-3)dZ[l]=dA[l]g[l](Z[l])dW[l]=1mdZ[l]A[l1] Tdb[l]=1mnp.sum(dZ[l],axis=1,keepdims=True)dA[l1]=W[l]TdZ[l]

6.4.多层神经网络的示例代码

点击如下超链接。
对比了2层神经网络和5层神经网络在对猫分类时的性能
Deep Neural Network - Application.py
Deep Neural Network - Application.ipynb