本文已参与「新人创作礼」活动,一起开启掘金创作之路。
本文是深度学习入门教程序列的第一篇,通过介绍logistic回归的原理,进而引入一层神经网络的前向传播和后向传播公式,并提供了示例代码。
1.logistic回归详解
logistic回归模型是用来解决二分类问题的,因此我们将首先在概率的框架下描述什么是分类问题。分类问题的一般描述如下图所示:

图1.1 分类问题的一般描述
用X代表输入空间,是输入向量的所有可能取值的集合,也叫特征空间;Y代表输出空间,是输出的所有可能取值的集合。x(i)∈X代表特征空间的一个样本,y(i)∈Y代表其类别(标签)。分类问题的一般描述可总结为:利用已知标签的训练集Xtrain训练出一个模型,该模型包含一个映射关系h:X→Y,h应该能够对新的数据点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函数的表达式为:
\sigma (z)=\frac{1}{1+e^{-z}}\\ \tag{1-1}
其函数图像为:

到此,我们得到了logistic回归模型:
\hat y=\frac{1}{1+e^{(-\theta^Tx)}} \tag{1-2}
注意,在(1−2)中,我们将参数项b用x0表示,这样能够写成更紧凑的形式。为了突出参数θ,我们用hθ表示公式(2)中的函数,它代表了在已知特征x的情况下,类别为y=1的概率,也即P(y=1∣x;θ)=hθ;显然,P(y=0∣x;θ)=1−hθ
假设我们的目标是让分类的错误率最小(即最小错误率决策准则,这是最普遍的一种分类准则)。不难证明,最小化错误等价于最大化各类的后验概率。因此,若(1−2)的值大于0.5,则判定为类别1;否则判定为类别0。
注意,logistic模型仍然是一个线性分类模型,因为它的决策面是0=wTx+b,我一个线性决策面。
2.损失函数的选取
选取好了模型后,接下来要选取损失函数(Loss function),然后在训练集上利用一定的算法(例如梯度下降法)最小化损失函数,从而确定hθ中的参数θ。一种很自然的想法是选取L(y^,y)=21(y^−y)2作为损失函数,但是这会导致在后面学习参数的过程中,最优问题不是一个凸问题。我们在这里采用极大似然估计的方法来推导出一个更合理的损失函数,并且该损失函数是凸函数。
2.1.最大化后验概率与极大似然估计
回忆一下极大似然估计的思想:对于可观测的样本X及其观测值Y,写出该观测值的概率表达式(记为L(θ)),该概率表达式一般依赖于参数θ,极大似然估计的目标是寻找θ的估计值θ^使得L(θ)最大。
对于某一个观测样本x(i)和观测值y(i),有:
L(θ)=P(y(i)∣x;θ)=(hθ(x))1(y(i)=1)(1−hθ(x))1(y(i)=0)=(hθ(x))y(1−hθ(x))1−y(2-1)
L(θ)也叫似然函数。
对数似然函数为:
l(θ)=logL(θ)=ylog(hθ(x))+(1−y)log(1−hθ(x))(2-2)
(2−2)就是单个样本的损失函数。下面讨论训练集上的代价函数(cost function)。
对于多个观测样本X和观测值Y,似然函数可写成:
L(θ)=P(Y∣X;θ)=i=1∏mP(y(i)∣x(i);θ)=i=1∏m(hθ(x(i)))y(i)(1−hθ(x(i)))1−y(i)(2-3)
对数似然函数为:
l(θ)=logL(θ)=i=1∑my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))(2-4)
因为对数似然函数需要最大化,而损失函数需要最小化,因此我们选择如下表达式作为损失函数:
(2−5)就是代价函数(cost function),它等价于对所有的(2−2)取平均。
损失函数(loss function)是定义在单个样本上的,代价函数(cost function)是定义在多个样本上的。
3.梯度下降方法求解最优的参数w和b(一层神经网络)
利用logistic可以构造一个只含有输出层的神经网络,其结构图如下:

图3.1 用logistic回归表示的单层神经网络结构图
下面介绍其作为神经网络时的前向传播、反向传播过程,为后面理解更复杂的神经网络打下基础。
logistic回归的代价函数的凸函数,因此可以用梯度下降的方法求得全局最优值,并且与初始化的方式无关,一般利用零初始化。
wb:=w−α∂w∂J(w,b):=b−α∂b∂J(b,b)(3-1)
注意,Andrew NG在Cousera开设的深度学习课程中,求偏导用的是符号d,我们这里不区分∂和d。
下面我们讨论只有输入层和输出层(激活函数为sigmoid函数)的简单神经网络的前向传播和反向传播过程,也即logistic回归。
3.1.前向传播
XZAY=[x(1),x(2),⋯,x(m)]=[z(1),z(2),⋯,z(m)]=[wTx(1)+b,wTx(2)+b,⋯,wTx(m)+b]=[a(1),a(2),⋯,a(m)]=[σ(a(1)),σ(a(2)),⋯,σ(a(m))]=[y(1),y(2),⋯,y(m)](3-2)
(3−2)中从上到下的顺序可以代表前向传播过程。
3.2.反向传播
先对求导公式进行一些化简:
da=dadL(a,y)=−ay+1−a1−y(3-3)
dz=dzdL(a,y)=dadL(a,y)⋅dzda=(−ay+1−a1−y)⋅a(1−a)=a−y(3-4)
有了(3−4),我们就能得到dZ=A−Y。因此反向传播过程如下:
dZdwdb=A−Y=m1⋅X⋅dZT=m1X(A−Y)T=m1⋅i=1∑m(dZ(i))(3-5)
注意,(3−5)的流程可以理解为先对每一个样本求损失函数关于z的梯度,并对每个样本求出dw,在对所有样本的dw球平均,因此有1/m。

图3.2 logistic回归梯度下降
也可以对m个样本的代价函数一次性直接求偏导,这需要一定的向量微分和复合函数微分的知识。这样的话,在dZ中就会有一个1/m,那么在求dw时就不用另外再加一个1/m了,并且形状可能互为转置,最终的结果是一样的。具体过程这里省略,有兴趣的读者可以自行推导。
参考
Andrew NG Coursera课程《Neural Networks and Deep Learning》
有任何问题请联系 languoxing@126.com