您的位置:首页 > 编程语言

Coursera deeplearning.ai 深度学习笔记1-2-Neural Network Basics-逻辑回归原理推导与代码实现

2017-12-09 14:09 1011 查看
逻辑回归(Logistic Regression)是一个非线性回归模型,主要应用于0、1分类问题,也可看作单层的神经网络。

1. 原理推导

1.1 样本定义

每个样本计作(x, y),其中x为特征向量,y为标签0或1,x包含nx个特征:

x=⎡⎣⎢⎢⎢⎢x1x2⋮xnx⎤⎦⎥⎥⎥⎥(1)

训练集包含m个样本:{(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))},上标(m)为第m个样本。

1.2 逻辑回归模型

问题:给定x,如何训练参数w和b,得到期望值a=P(y=1|x)?

为了保证期望值a在0 ~ 1之间,给定逻辑回归模型:

z=wTx+b(2)

a=σ(z)(3)

式中,w维度为(nx, 1),b为实数,z为线性模型,σ(z)为非线性的sigmoid函数。

1.3 sigmoid函数

σ(z)=11+e−z(4)

当z → ∞时,σ(z) → 1;当z → -∞时,σ(z) → 0。函数值处于0 ~ 1之间,因此适合于0、1分类问题。曲线如下:



1.4 代价函数(Cost Function)

目标:给定训练集{(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))},预测值a(i) ≈ y(i)。

由于期望a=P(y=1|x),可得:

{P(y=1|x)=aP(y=0|x)=1−a(5)

使用概率论中极大似然估计(Maximum Likelihood Estimate,MLE)的方法来计算损失函数,可将概率写成:

P(y|x)=ay(1−a)1−y(6)

取对数似然函数:

log[P(y|x)]=yloga+(1−y)log(1−a)=−L(a,y)(7)

上式中,L(a, y)为损失函数(Loss Function),最大似然估计的目标是使log[P(y|x)]最大化,也就是损失函数L(a, y)最小化。则损失函数为:

L(a,y)=−[yloga+(1−y)log(1−a)](8)

当y = 1时,L(a,1)=−loga,要使L尽可能小,则预测值a尽可能大,最大为1;

当y = 0时,L(a,0)=−log(1−a),要使L尽可能小,则预测值a尽可能小,最小为0。

对于m个训练样本,假设训练样本互相独立,则m个样本的联合概率可以写成:

Pmsamples=∏i=1mP(y(i)∣∣x(i))(9)

取对数似然函数:

logPmsamples=log[∏i=1mP(y(i)∣∣x(i))]=∑i=1mlogP(y(i)∣∣x(i))=−J(10)

上式中,J为代价函数,最大似然估计的目标是使log(Pmsamples)最大化,也就是代价函数J最小化,可得代价函数:

J(w,b)=1m∑i=1mL(a(i),y(i))=−1m∑i=1m[y(i)loga(i)+(1−y(i))log(1−a(i))](11)

1.5 梯度下降(Gradient Descent)

目标:寻找最优参数w, b,使得代价函数J(w, b)最小化。

梯度下降法:初始化w, b,沿着梯度最大的方向对参数进行更新,直到代价函数最小化,得到全局最优参数。



参数更新如下式,α为学习因子(learning rate):

wj=wj−αdJ(w)dwj(12)

bj=bj−αdJ(b)dbj(13)

为了方便推导,用“dr”代表损失函数或代价函数对r的偏导数dLdr 或dJdr。

由求导链式法则以及z=wTx+b可得:

dw=dJdz⋅dzdw=xdz(14)

db=dJdz⋅dzdb=dz(15)

可得:

wj=wj−αdwj=wj−α1m∑i=1mx(i)dz(i)(16)

bj=bj−αdbj=bj−α1m∑i=1mdz(i)(17)

对于逻辑回归模型,易得:

dLda=dda{−[yloga+(1−y)log(1−a)]}=−ya+1−y1−a(18)

dadz=ddz(11+e−z)=−−e−z(1+e−z)2=a⋅e−z1+e−z=a⋅(1−11+e−z)=a(1−a)(19)

dz=dJda⋅dadz=a−y(20)

通过上式,即可对参数w和b进行更新。

1.6 向量化(Vectorization)

对于m个样本,将训练集(X, Y)写成矩阵的形式,X维度为(nx, m),Y维度为(1, m):

X=⎡⎣⎢|x(1)||x(2)||⋯||x(m)|⎤⎦⎥Y=[y(1)y(2)⋯y(m)](21)

正向传播(Forward Propagation ):

Z=[z(1)z(2)⋯z(m)]=wTX+b(22)

A=[a(1)a(2)⋯a(m)]=σ(Z)(23)

反向传播(Backward Propagation):

dZ=[dz(1)dz(2)⋯dz(m)]=A−Y(24)

dw=1mXdZT(25)

db=1mnp.sum(dZ)(26)

1.7 逻辑回归实现(For循环与向量化对比)

1.7.1 For循环实现

需要iteration * m次循环。

J=0,dw1=0,dw2=0,db=0foriterinrange(iteration):foriinrange(1,m+1):z(i)=wTx(i)+ba(i)=σ(z(i))J+=−[y(i)loga(i)+(1−y(i))log(1−a(i))]dz(i)=a(i)−y(i)dw(i)1+=x(i)1dz(i)dw(i)2+=x(i)2dz(i)db+=dz(i)J=1mJ,dw1=1mdw1,dw2=1mdw2,db=1mdbw1=w1−αdw1,w2=w2−αdw2,b=b−αdb

1.7.2 向量化实现

仅需要iteration次循环。

J=0,dw=[00],db=0foriterinrange(iteration):Z=wTX+b=np.dot(w.T,X)+bA=σ(Z)J=−1mnp.sum(np.multiply(Y,np.log(A))+np.multiply(1−Y,np.log(1−A)))dZ=A−Ydw=1mXdZTdb=1mnp.sum(dZ)w=w−αdwb=b−αdb

2. 代码实现

案例:判断一张图片是否为猫。



各个模块如下:



2.1 初始化initialize_zeros

初始化w为零矩阵,维度(nx, 1),b为0。关键代码如下:



2.2 正向传播和反向传播propagate

输入w, b, X, Y,按照下式计算代价函数J以及梯度dw、db。

Z=wTX+b=np.dot(w.T,X)+bA=σ(Z)J=−1mnp.sum(np.multiply(Y,np.log(A))+np.multiply(1−Y,np.log(1−A)))dZ=A−Ydw=1mXdZTdb=1mnp.sum(dZ)

关键代码如下:



2.3 参数更新优化optimize

按照下式的梯度下降法更新参数w和b,α为学习因子。

w=w−αdw,b=b−αdb

关键代码如下:



2.4 预测predict

根据优化得到的参数w和b,输入样本x,得到预测值,如果预测概率大于0.5,则预测值为1,否则为0。关键代码如下:



2.5 模型训练model

将以上几个模块进行整合,输入训练样本和测试样本,得到预测准确率。关键代码如下:



2.6 样本测试



得到结果如下,可知,代价函数在迭代过程中不断降低,训练样本准确率99%,测试样本准确率70%。





2.7 学习因子的影响

代码如下:



得到结果如下,可知,不同学习因子得到的结果不同。如果学习因子较大,可能会发散;如果学习因子太小,学习速度较慢。





代码下载地址:https://gitee.com/tuzhen301/Coursera-deeplearning.ai1-2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐