神经网络和深度学习(二)——从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