机器学习课程学习--梯度下降GradientDscent的理解
最近在跟着吴恩达老师和周莫烦老师的机器学习课程学习,
越往后学习越感觉基本知识的重要性
所以我自己恶补了一些基本的概念
这里从为什么做深度学习开始
一直谈到为什么梯度下降
一个学习笔记
供复习,学习,交流
本文中所有例子来源于吴恩达老师的课程和周莫烦老师的课程
1.深度学习之数据
预先给定数据集(training data),数据可能代表了很多含义,包含了所描述对象的很多特征,在这里抽象成如下的笛卡尔序列:
2.建模与拟合
这就是深度学习的原因:为了达成某个目标,对机器进行训练,成长为一个独立的个体,完成目标
对于一组整合了物体各种属性的数据,我们先用标准答案,也就是training data进行喂养(feed),让他知道对应取值下的标准的
。
这就是类似于人类平时的学习行为:
学习的好坏,和每个人的天赋,做习题的多少等很多因素有关系。
类比到机器里面去,就是学习(拟合)过程中,构建的参数(hyperparameters)的准确性(对应一个人的天赋),和总共训练的数据的多少(对应习题的多少),这两个是机器进行学习过程中最为主要的影响因素。
学习完毕之后还有测验,这时候就用到测试集(testing data),测试集有答案,但是不告诉机器,机器会计算出一个预测值(根据周莫烦老师的记法,称为为prediction),这里根据吴恩达老师的记法记为
由原始的y和机器学习之后的可以构建误差,这里有两个记法:
(1)对于单个训练样本误差函数称为loss
(2)对于所有的n个数据误差函数称为cost
具体函数的说明放到后面
如图,蓝色部分的散点就是所有的散点图,红色的曲线是机器进行学习,不断校验,迭代,改变参数得到的拟合曲线,这里是引用周莫烦老师的例子
3.构建误差函数
误差函数用于对学习的好坏做出评价
需要设置可调控参数(自己的理解,官方名字hyperparameters)。方便后来的迭代和逼近最优化值
构建误差函数这种行为,
放到人类学习过程就是随堂小测验的分数评估你这节课学得怎么样,
也就是对于当前的样本数据的学习程度
通过同样的,预测值肯定不会精确的得到
于是,我们构建了误差函数,
这里学习的不够深入,暂时只阐述logistic regression
这里做一下说明,为什么叫回归,因为我们一开始只给指定的参数一个初值,这个初值不一定准确,构建出来的拟合曲线是非常不准确的,如图所示:
红色是正弦曲线,蓝色是初始的拟合曲线,
通过最初的设置的参数的值,可以看出拟合结果非常差
所以我们需要在不断的迭代过程中,反向传播这个参数,使用梯度下降,把这个参数回馈,然后优化。这些概念我都会在后面解释。先来看看不断迭代优化之后的拟合曲线:
可以看到在迭代次数很高之后,误差已经非常小了!
误差函数
在我们给定一些特征的情况下,要让机器给出预测值,我们就需要具体深入探讨一些数学的东西。
为了预测的值,必须建立
关于预设的参数和自变量
的预测函数,跟着前人的步子,站在巨人的肩膀上,prediction
,也就是
,定义为:
其中是总结出来的具有一定满足人们需求的函数,典型的函数有ReLU,sigmoid,tanh等等。后续的文章中可能会做具体解释,此处,顺着吴恩达老师的思路,先学习logistic regression,这里用到的
函数是sigmoid函数,其表达式为:
顺着吴恩达老师的教学思路,最容易想到的误差函数:
尽管看着不错,也符合了我们的要求,但是误差函数的定义是用于回馈我们设置的参数的,这其中最常用的方法就是梯度下降(Gradient Dscent),后面我们会重点讲述。上述定义的误差函数不是严格的凸函数(convex),沿着导数变化的方向不一定能找到最优化的解。于是,我们使用的误差函数被定义为如下这样,对原因感兴趣的同学可以继续深入学习一下。
单个训练样本的误差loss:
整个m的数据集的误差cost:
(这里cdsn好像硬要强行打广告,后面的黑块去不掉,所以我截图导入的。。。)
我们会利用变化的梯度值去刻画和
,每次迭代的过程完毕后,利用导数对
和
进行微调的公式如下:
其中的代表了学习速率,其实直观理解就好,就是一个导数的系数,控制朝优化方向移动的移动速度,给一个好听的名字,就叫做学习速率
那么问题来了,在对参数和
的校正,和对于误差的整体优化上,我们为什么要用梯度来对他们进行刻画呢?
开始解释梯度下降的概念
梯度下降
梯度下降是对于误差函数的一种优化操作,
上面我们定义的“J”函数就是整个数据集上的误差(cost),
“J”大致呈现的是一个开口向上的凹函数。
如图所示(草图,真正意义上草图)
给定初始和
的值(随意赋值),产生误差“J”,
“J”可能分布在其导数大于零的一端,也可能分布在导数小于零的一端,
对应图中的A(导数大于0)和B(导数小于0)
整个误差函数的图像中,显而易见,
误差函数最小值的点(C点),
也就是最优化的点在导数为0的点
那在我不断迭代的过程中,怎么确保最终收敛到这个点呢?
“导数”
说到这里时还是有点小激动的,
因为说实话这玩意儿以前学了没什么用,
现在看来还真是挺神奇的:
在A点,导数大于零,应用w和b的迭代格式,
对他两进行调整,这里再给出一次:
每次迭代完毕之后减去导数的倍数(学习速率),误差在逐渐缩小,
误差正朝着最优化的值逼近,如图箭头所示
假如越过了最优化的值怎么办?
同样举例子,假如参数的变化使得它跃升到了B点,
再B点,导数小于0,
每次 迭代之后都要减去导数的倍数,
相当于加上一个数!
因此,也同样是朝着最优化值C点靠近
而且因为越逼近于最优化值点,导数越小,
最终必然会收敛在C附近
用一个极限的公式抽象大致表示为:
C是我图中的最优化值点
总结
有需求才会衍生出新的东西,
社会总是不断的进步正是因为人的需求是在逐渐增加。
所以顺着这个需求,追溯一下衍生出梯度下降方法的过程
以流程的方式呈现,
也希望看官能指出我的理解不足的地方,
大家互相交流
实际的神经网络用到的方法更为复杂,
有时间再更新下一篇
愿大家一起学习,一起进步