Coursera deeplearning.ai 深度学习笔记1-2-Neural Network Basics-逻辑回归原理推导与代码实现
2017-12-09 14:09
1011 查看
逻辑回归(Logistic Regression)是一个非线性回归模型,主要应用于0、1分类问题,也可看作单层的神经网络。
x=⎡⎣⎢⎢⎢⎢x1x2⋮xnx⎤⎦⎥⎥⎥⎥(1)
训练集包含m个样本:{(x(1),y(1)),(x(2),y(2)),⋯,(x(m),y(m))},上标(m)为第m个样本。
为了保证期望值a在0 ~ 1之间,给定逻辑回归模型:
z=wTx+b(2)
a=σ(z)(3)
式中,w维度为(nx, 1),b为实数,z为线性模型,σ(z)为非线性的sigmoid函数。
当z → ∞时,σ(z) → 1;当z → -∞时,σ(z) → 0。函数值处于0 ~ 1之间,因此适合于0、1分类问题。曲线如下:
由于期望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)
梯度下降法:初始化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进行更新。
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)
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
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
各个模块如下:
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−αdw,b=b−αdb
关键代码如下:
得到结果如下,可知,代价函数在迭代过程中不断降低,训练样本准确率99%,测试样本准确率70%。
得到结果如下,可知,不同学习因子得到的结果不同。如果学习因子较大,可能会发散;如果学习因子太小,学习速度较慢。
代码下载地址:https://gitee.com/tuzhen301/Coursera-deeplearning.ai1-2
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
相关文章推荐
- Coursera deeplearning.ai 深度学习笔记1-4-Deep Neural Networks-深度神经网络原理推导与代码实现
- Coursera deeplearning.ai 深度学习笔记1-3-Shallow Neural Networks-浅层神经网络原理推导与代码实现
- Coursera deeplearning.ai 深度学习笔记4-1-Foundations of Convolutional Neural Networks-卷积神经网络基础及代码实现
- Coursera deeplearning.ai 深度学习笔记4-2-Deep Convolutional Models Case Studies-深度卷积模型案例及代码实现
- Coursera deeplearning.ai 深度学习习题1-4-Neural Network Basics
- Coursera deeplearning.ai 深度学习笔记2-1-Practical aspects of deep learning-神经网络实际问题分析(初始化&正则化&训练效率)与代码实现
- Coursera deeplearning.ai 深度学习笔记2-2-Optimization algorithms-优化算法与代码实现
- Coursera deeplearning.ai 深度学习习题1-2-Neural Network Basics
- 吴恩达老师深度学习视频课笔记:逻辑回归公式推导及C++实现
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(2-3)-- 超参数调试 和 Batch Norm
- 台湾大学深度学习课程 学习笔记 lecture1-2 Neural Network Basics
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(4-4)-- 特殊应用:人脸识别和神经风格迁移
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(4-3)-- 目标检测
- [深度学习]Python/Theano实现逻辑回归网络的代码分析
- Coursera deeplearning.ai 深度学习笔记3-Structuring Machine Learning Projects
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(3-1)-- 机器学习策略(1)(转)
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-2)-- 神经网络基础(转载)
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(4-4)-- 特殊应用:人脸识别和神经风格迁移
- 吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(1-3)-- 浅层神经网络(转载)
- Coursera吴恩达机器学习课程 总结笔记及作业代码——第3周逻辑回归