前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >神经网络和深度学习(二) ——从logistic回归谈神经网络基础

神经网络和深度学习(二) ——从logistic回归谈神经网络基础

作者头像
用户1327360
发布2018-03-07 17:05:16
1.6K0
发布2018-03-07 17:05:16
举报

神经网络和深度学习(二)——从logistic回归谈神经网络基础

(原创内容,转载请注明来源,谢谢)

一、概述

之前学习机器学习的时候,已经学过logistic回归,不过由于神经网络中,一些思想会涉及到logistic,另外会拿一些神经网络用到的解决方案,以logistic来举例,更浅显易懂(例如BP算法)。

因此,这里就再次复习logistic回归及其梯度下降、代价函数等,主要是讲述和后面学习神经网络有关的内容,其他部分会快速略过。

二、logistic输出函数

logistic是解决二分分类问题,即假设结果只有两种,这是一个大前提。

由于是二分分类,需要输出的是y的概率,故要求y的值在0~1之间,故不能用线性回归的那种wx+b,而是套上一层激励函数,称为sigmoid函数,f(z)=1/(1+e-z),这个函数的区间在0~1,满足这个要求,且z=0.5时函数为0,正好对半分。

通常有两种方式表达logistic,一种是用w和b,此时x在1~n(样本特征值个数);另一种是设x0=1,则只需要用一个θ就可以来表示,其中θ0对应的x0=1,即表示了b的值。本文用的是w和b的方式。

三、logistic代价函数与梯度下降

单个样本求出来的损失函数用L表示,样本集的代价函数用J表示。

这个J不直接用预测结果和实际结果的平方差求和公式,是因为这样会导致代价函数是非凸函数,后面的梯度下降对于非凸函数只能求到极小值,无法求到最小值,故加上log,让其变换成了凸函数,以便后面的梯度下降。

公式如下图所示:

梯度下降,目的是为了求,当给定w和b时,代价函数J取得最小值。故需要用J对w和b求偏导数,并令其为0,再用w-α*偏导数(同理b-α*偏导数),其中α为学习函数,表示其迈向最小值的步伐。

经过若干次求偏倒,并且递减后,会得到一个最优化的J,并且此时的w和b就是所要求的参数。

四、计算图

1、概念

计算图是后续理解神经网络的前向传播、反向传播算法的基础。这里先抛开logistic,讨论一下计算图的概念。

1)前向传播

假设a=5,b=3,c=2,且u=bc,v=a+u,J=3v,则很容易求得j的结果,其画图后如下图所示:

2)反向传播——求导

现在要求J对参数a的导数dJ/da。可以先求J对v的倒数dJ/dv,将结果记录起来;再求J对a的导数,dJ/da = (dJ/dv)* (dv/da),其中dJ/dv的值直接用上一步计算的结果,不需要再次计算。

同理,可以求出J对参数b、c的导数。如下图所示:

计算图对于后面理解反向传播算法很重要。当初学ng的机器学习的课,那时候他没讲到这个,我去理解反向传播算法,理解了好久。现在看到这个,有种突然恍然大悟的感觉。

2、计算图优化logistic(单个样本)

现在再来看logistic。实际上对于logistic,并不需要用计算图,可以直接进行优化,但是这里拿logistic举例,是为了便于以后理解神经网络的算法。

现在假设有三个参数w1、w2、b(即样本有两个特征),则如下图所示,可以正向求得该样本的损失函数L:

根据上面的推论,可以反向来求的损失函数L对w1、w2、b的偏导数。此时就用w1=w1-αdw1(w2、b同理),则就完成了一次优化。

可以用优化了的w1、w2、b再次前向计算L,再反向计算偏导数,再计算减法,以此类推,多次计算后,可以得到最小L情况下的w1、w2、b。

3、样本集计算

当考虑整个样本集的代价函数,实际上就是每个样本损失函数的和,这里为了调整数值大小,会将和除以样本容量m。但是其正向、反向求解过程和上面是一样的。

用伪代码描述,如下图所示:

五、向量化

1、概念

向量化要解决的问题是,求解上述logistic的过程中,会出现太多的for循环。这里使用numpy的矩阵运算,避开手工去写for循环,而是调用现有的函数,让计算机内部去执行for循环。

由于numpy的矩阵运算,是可以并行执行的,且numpy是用C语言写的python库,其运行效率比python原生写法快得多。

故所有能用numpy函数的,建议都要用,避免自己去写函数。

向量化本身概念很简单,即把w、x、z、y等变量,都用numpy的矩阵表示,而不用单个数字或者普通的数组,这样做的好处就是可以调用numpy的矩阵处理函数了。

2、简单举例

下图左边是没有用向量化,使用了for循环;右边是向量化,可以看到仅仅一行np.exp(v),即可实现对向量v的每个元素的求e次幂的操作,非常快捷,且运算速度快得多。

ng讲课的时候演示过,当数量级在1百万时,numpy处理矩阵的速度约是原生for循环处理速度的200倍。

右图其他的式子是其他的一些举例,例如所有元素求log、求绝对值、求最大值、求平方、求倒数等,都非常方便快捷。

3、logistic向量化

要进行向量化,要将多个dw合并成1个dw,同时对其进行的优化计算也合并成一个矩阵运算。同理,后续的除法运算也合并成矩阵运算。

可以理解成,对于样本的每个特征值,简化成一个x(i);接着,再将所有的x(i)整合到一个矩阵,最终简化成x来表示,且用整个x来参与运算。y同理。

这段讲解基本让我更理解了《机器学习实战》书上的代码,上面大量用到了向量化的技术。

第一次优化(把一个样本的所有特征整合到一个矩阵):

最终优化(把所有样本整合到一个矩阵):

六、logistic推导

这里主要讲解了为什么logistic的输出函数和代价函数会是那样的公式。

1、单个样本的损失函数

首先,要明确logistic的输出,是y=1的概率,故当y=1时输出的是y1,则y=0时输出的是1-y1(因为y只有0、1两种可能,故两者的概率和必定为1)。

为了简便,可以把这个函数整合成一个表达式y1y(1-y1)(1-y),将y=0、1带入,可以看到还是上面的公式。

logistic的损失函数,为了是一个凸函数,取了log函数,故表达式改写成ylogy1 + (1-y)log(1-y1),如下图所示:

上图没有加负号,实际上损失函数是加负号的,即表示要求最小的损失函数,会得到尽量大的logP。

2、样本集的代价函数

假设样本之间是独立的,则总的概率即为各个样本概率的乘积,由于乘积求log后,变成了加法,另外为了调整数量的大小,取了m个样本的平均值,且加上负号,最终就变成了代价函数的样子:

七、总结

本章还有讲到numpy、python的一些内容,我转到python的专题中。

这一章,重新学了logistic,我还是挺有收获的,感觉对logistic有了更清晰的认识,另外计算图部分我感觉对我理解BP有很大的帮助,向量化部分对理解其他机器学习编程书的python代码也有很大的帮助。

——written by linhxx 2018.01.31

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 决胜机器学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档