【神经网络基础】第一课--逻辑回归

课程来源:吴恩达 深度学习课程 《神经网络基础》
笔记整理:王小草
时间:2018年5月15日


1.什么是二分类

1.1 二分类?

给定一张图片,要识别出这张图片,“是猫”或“不是猫“的问题就是二分类问题。
输入以x表示,输出以y表示。
image_1cd2ged0lukucr91rmpiug1d8l9.png-106.4kB

如何表示图片:计算机是如何计算图片的呢?
一张图片实际上由一堆像素构成,一堆像素可以由矩阵表示出来。如果你输入的是一张64*64像素的彩色图片,那么表示成三个64*64的矩阵(彩色图片有RGB三个通道,每个通道对应一个矩阵)
image_1cd2gnh5nj9jd703bt222170i16.png-57.6kB

将这些像素亮度转换成一个向量形式的特征x。维度是64*64*3=12288的向量
image_1cd2gr53t1sb0s996065dm7mg1j.png-20kB

讲特征向量输入模型,预测输出结果标签y是1还是0(比如1代表有猫,0代表无猫)

1.2 符号约定

定义一下接下去所有课程中都会统一用到的符号。

一个样本用(x,y)表示,x是nx维的实属向量,y是一个属于{0,1}集合内的整数
image_1cd2h5v2ljnl1tbru7vgc81g1823.png-12.8kB

符号表示:
m个样本如下表示:
image_1cd2haca916u51t71bvm8ojkas2g.png-20.9kB
样本会分为训练集于测试集,训练集的数目用Mtrain表示,测试集的数目用Mtest表示。

矩阵表示:
用矩阵表示样本的特征x,每一列是一个样本特征,若有m个样本的话,每个样本有nx维的话,该矩阵就有nx * m大小
image_1cd2hh1aaufl1ljc1ivk1n22bn64t.png-28kB
注:平时会每行放一个样本,但在神经网络中1列一个样本会更方便计算。

用矩阵表示样本的标签y,大小为1 * m的矩阵
image_1cd2ho2nq5mm10ao1s458991du95a.png-12.9kB

2.logistic回归

对于二分类,输入特征向量x, 期望输出一个概率,根据这个概率去判断是输出1还是0.
image_1cd2i30ds1bmi1numa3q1vg0tcf5n.png-14.9kB

那要选择什么样的函数或模型,去做二分类呢?若使用线性函数:
参数:image_1cd2i70albo812f6u1itrc1ubo64.png-8.8kB
输出:image_1cd2i7ra0huj1c94jt8mnc1bqh6h.png-6.5kB
可见输出的y并非是一个0-1之间的概率,因此不能选用。

于是逻辑回归在线性函数的外面又加了一层sigmoid函数:
image_1cd2ic0on1upnu29c791mpll87e.png-11.7kB

sigmoid函数长这样:
image_1cd2ie7d5102hspv1oivnk5vur8e.png-14.6kB
将线性函数的输出作为z,即sigmoid函数的输入。而sigmoid的输出是分布再[0,1]之间的值,符合概率取值。

sigmoid函数的公式:
image_1cd2ii44e1k5l1arg10sb1dn44h88r.png-8.7kB
如果z越大,则simoid输出越接近于1
如果z越小,则simoid输出越接近于0

3.logistic回归损失函数

要通过训练得到w,b两个参数的正确值,则需要损失函数。

回顾逻辑回归的函数:
image_1cd3lkj6j1181j7013uis4pnqf98.png-13.6kB

给出一组样本{(x{1),y(1)),…,(x(m),y(m))},希望得到y^ ≈ y。 (y^是以上逻辑回归函数的预测值,y是真实值)。
也就是希望去得到参数w,b,使得逻辑回归函数的预测与真实值尽量一致。而y^与y不一致的部分就成为损失。

针对单个样本的损失函数:
可以如下用误差平方和定义损失函数,但是再逻辑回归中不采取,因为这不是一个凸函数,梯度下降发求解时会有多个局部最优解。
image_1cd3m2e36ir317rv17dt188n1ba79l.png-13.3kB

在逻辑回归中,我们使用交叉熵损失函数:
image_1cd3m50ua1k4m1vsc15fn11mt1k55ai.png-23.4kB

如何理解交叉熵损失函数呢?
当真实值y=1,则损失L(y^, y) = -logy^,要使损失越小,logy^希望越大,则y^需要越大,由于y^最大为1,则意味着越接近于真实值;
当真实值y=0,则损失L(y^, y) = -log(1-y^),要使损失越小,log(1-y^)希望越大,则y^需要越小,由于y^最大为0,则意味着越接近于真实值;

针对多个样本的成本函数:
成本函数是将每个样本的损失函数加起来求均值:
image_1cd3mubuh1n9nafkgh21gh7a7jbc.png-28.6kB
在训练模型得到参数的过程中,我们追求的是使成本函数降到最小。

4.梯度下降法 Gradient descent

要获取成本函数最小的时候的参数w,b,可以通过梯度下降法求解。

目标:
J(w,b)是成本函数,横坐标是参数w,b,也就是求这个凸函数最低点时的w,b值。
image_1cd3n13cs19u61bq518hrjg01c52bp.png-58.7kB

梯度下降法的步骤:
(1)首先随机初始化w,b的值
(2)然后针对每个样本重复以下过程:
更新w:w = w - a (dJ(w,b) / dw)
更新b:b = b - a (dJ(w,b) / db)
a是学习率, dJ(w,b) / dw是成本函数对w求偏导,dJ(w,b) / db是成本函数对b求偏导。

为何以上过程就可以求取成本函数的最小值呢?
如下图,纵轴是成本函数,横轴是参数w
image_1cd3npnjaldp19ca1t701r1n4rec6.png-36.1kB
若当前w的取值在成本函数最低点对左侧,对w的导数为负,w = w - a (dJ(w,b) / dw)的运算后,新的w值会增加,即向右移动,更靠近最低点;
若当前w的取值在成本函数最低点对右侧,对w的导数为正,w = w - a (dJ(w,b) / dw)的运算后,新的w值会减少,即向左移动,更靠近最低点;
因此通过梯度下降法,参数会越来越接近成本函数最小值时的参数值。

5.导数基础知识

直线上的导数计算:
直线上所有位置导数相同
image_1cd3omjj5g2ag71mlh19891ojlfe.png-26.1kB

a = 2时:
image_1cd3ooojhpe1151q1a791eai10h1fr.png-20.6kB

a = 5时:
image_1cd3opqqftsat0111du1kfshojgl.png-15kB

曲线上的导数计算:
曲线上不痛位置斜率不同
image_1cd3oia0k1c4o1uhb1drtik91bqoe7.png-3kB
image_1cd3ohilj1876krpplglkn16p1dq.png-21kB

a = 2时:
image_1cd3ojei25il1n61o7o1gn33beek.png-30.4kB

a = 5时:
image_1cd3okkpsmgk1bi41m3dgpk16ihf1.png-28.2kB

更多导数的例子:
平方:
image_1cd3oercrlfph3e1mao1j8g1voocj.png-15.1kB
三次方:
image_1cd3ofgm812e41imi1vkf1udb15fgd0.png-19.3kB
log:
image_1cd3og6qqgr21uih3e53c31qk1dd.png-23.6kB

6.计算图的导数计算

6.1 什么是计算图

神经网络可以用计算图表示,先前向计算,然后根据输出求损失与成本函数,再根据梯度反向传播。
先以一个小栗子来了解什么是计算图。

假设有一个函数J(a,b,c) = 3(a + bc),它的计算步骤应该是:
u = bc
v = a + u
J = 3v
将着3步画成计算图:
image_1cd3qkrel895qlk6jm1g0e19tohv.png-32.7kB

从左到右可以计算出函数J的值,若J是逻辑回归的成本函数,要求它最小值时的参数a,b,c,就可以用梯度下降法从右到左求梯度。

6.2计算图的导数计算

通过计算图求导数,其实就是求偏导的过程,因此课程中讲的细节不再这里赘述,对偏导若不懂,建议额外找资料来学习一下。

J(a,b,c) = 3(a + bc) 对a,b,c分别求偏导对结果如下:
image_1cd3qttuv151g7k518va1eau1jf9j6.png-19.5kB
image_1cd3qqu5o10ihpe7ias1ic81n4tic.png-27.8kB
image_1cd3qrhidj9t6svrci22l1s5aip.png-17.8kB

7.logistic回归中的梯度下降法

回顾逻辑回归与单个样本的损失函数:
image_1cd52jth8f9q12541pdt1k9qi4e2p.png-25.4kB

画出一个样本的计算图:
image_1cd52q40m1jqcg3k8i1jru1cjh3j.png-31.5kB

要使损失函数L(a,y)最小,通过对参数求偏导的梯度下降法,寻找最优的参数。
首先使L(a,y)对a进行求偏导
image_1cd53ebt92291hlq12511sep1ba14t.png-18.8kB

再向后一步计算,使L(a,y)对z求导
image_1cd53rc6h12aj1j141utc1ajugee5a.png-44.2kB

再向后一步,求L(a,y)对w1,w2,b的偏导
dw1 = x1*dz
dw2 = x2*dz
db = dz

有了偏导数之后,就可以进行梯度下降更新参数了:
image_1cd541f0h1h901hb81fqp1h4ddpq64.png-18.6kB

8.m个样本的梯度下降法

上面介绍的是对单个样本的梯度下降法,现在把它应用到m个样本上。

首先回归cost function成本函数:
image_1cd54fqd51vt612l6110mcg713ap6h.png-20kB

再回顾逻辑回归的计算公式:(i表示第i个样本)
image_1cd54gn4vh0u1qhtpnj1rmq183c6u.png-20.8kB

对成本函数进行求导,其实就是对m个样本分别求参数梯度,然后将所有m个样本对梯度求均值,作为最终对梯度区更新参数。
image_1cd54n5go1ng2so41pq5khmia7b.png-32.5kB

梯度下降过程:
(1)初始化参数dw1=0,dw2=0, db=0
(2)对每个参数求梯度,并求的最终参数
image_1cd54vbenb6143r1gp9n4kta97o.png-102kB
(3)利用梯度更新参数
image_1cd5529771lga1i89m9d78j1i5j95.png-24.4kB

(4)利用新的参数,重新前向计算损失函数,并重复(2)(3)两步,知道到达终止条件(迭代次数到了,或者损失小于给定阀值,或者参数的更新量小雨某个阀值等)

以上步骤的缺点:
对1-m个样本分别进行1-n次迭代的for循环计算量是非常庞大的。解决办法就是将数据向量化,从而拜托for循环。

10.向量化vectorization

向量化的好处是消除你代码中的for循环。

对于以下计算
image_1cd6a518p15ifkhd1hlf15hq1pg29.png-19.7kB

若有x有n个维度,则也有n个w,对每个样本进行如上计算时,使用for循环需要n次计算:
image_1cd6a7nuv11j5s4q1qci1bh31qtp16.png-25.2kB

但若使用向量化,则只需要计算一次:(np.dot(w,x)是将w,x进行点乘
image_1cd6aa2o91jk91fc41fo155j7ns1j.png-18.2kB

其他例子:
image_1cd6aq2omost1qumeu91ppv1rfi2g.png-17.7kB
要从v转换成U,直接调用numpy中的exp()函数即可:
image_1cd6ar2cr1eeaq3q1efm13n01lr92t.png-19.4kB

其他这样的函数还有求log,绝对值,最大值等等:
image_1cd6arvtl5d914ll13dqc5m1m9h3a.png-22.2kB

11.向量化logistict回归

当有m个样本的时候,我们需要去前向计算m次,对每个样本都计算z和a:
image_1cd6b4rqo2v11css7lqgam17r83n.png-36.9kB

现在我们使用向量化的方法避免m次循环。
将样本特征x(i)向量化,定义一个矩阵X,每个向量的x是其一列,若每个x有n维特征,则改矩阵大小是(n*m)
image_1cd6bb3h711hcdvn1eoc1dkccgb44.png-17.1kB

Z的向量计算
image_1cd6btk601i1nur2jcu1ti3vki4h.png-22.3kB
python代码一句搞定:z = np.dot(wT, x) + b
其中b是一个常数,但是由于它和一个vector相乘,就会自动广播成1 * m的vector,称其为广播变量。

A的向量计算
image_1cd6ce3iq1qj38trq428dsjr4u.png-21.4kB
之久调用sigmoid函数即可。

12.向量化logistic回归的梯度输出

上面讲的是逻辑回归前向计算得到a的向量化计算过程,现在讲一讲求梯度的向量化计算过程。

dZ是所有dz(i)组成的向量:
image_1cdc1v6fh1vne9agheik3bnd9.png-16.6kB
其中:
image_1cdc21kjo14j51v2fsl51r5t1j9em.png-18.4kB
将所有a与y向量化:
image_1cdc2g98tass172gn6c68nara23.png-18kB
于是dZ可以通过A,Y矩阵一次性求得:
image_1cdc2hn7coec1rsk1incgdv1cf52g.png-16.5kB

db可以如下计算:
image_1cdc2n5prd3u48tln611fmcga2t.png-23.8kB

dw可以如下计算:
image_1cdc2o85415b71p521u9392u167f3a.png-44.4kB

因此,如果不向量化计算,则代码如下:
image_1cdc2qc2pnvsla91v1j1bedhv63n.png-101.7kB
每次迭代都需要进行m次for循环

但如果使用向量化计算则代码如下:
image_1cdc2tq9jjp5mh6dgpsvo1uev44.png-64.4kB

13.损失函数的解释

之前给出了逻辑回归得损失函数,现在来解释一下为什么逻辑回归的损失函数要用这种形式表达。

设y^是当y=1时得预测值:y^ = P(y=1/x)
if y=1: P(y/x) = y^
if y=0: P(y/x) = 1-y^

可见这是一个二项分布,用最大似然法求解二项分布:
image_1cdc3ib4g187g1sns1gns1sp11cuh4u.png-33.4kB

因为上式是一个单调递增函数,因此可以转换成log形式
image_1cdc3n4134539lh2l21q20156q5b.png-42.8kB

因为直观上希望损失越小越好,因此在上式基础上加上负号

推广到m个样本上:
image_1cdc3rmc1r1tnkm1hhqqautqq5o.png-36.5kB
变形以下得到:
image_1cdc3thenf8n1e5r14p8ng16ao65.png-25.4kB

猜你喜欢

转载自blog.csdn.net/sinat_33761963/article/details/80317671