机器学习三要素

上次的报告中,我们介绍了一种用于求解模型参数的迭代算法——梯度下降法。首先需要明确一点,即“梯度下降算法”在一个完整的统计学习流程中,属于什么?根据《统计学习方法》这本书,统计学习一般有三个要素,即模型、策略和算法(目前以笔者的浅见,统计学习和机器学习没有太大的差别)。

模型

所谓模型,我们可以简单理解为数据的组织形式。换句话说,就是输入数据与输出数据之间可能存在的关系。机器学习的主要任务是预测,根据预测值的取值情况,我们可以分为“分类任务”(预测值是离散的),“回归任务”(预测值是连续的),“聚类任务”(预测值是空白的,对输入数据进行自动分组)。

因此,我们分别可以提出相应的模型,即分类模型,回归模型和聚类模型。继续向下细分,分类模型有二分类模型,多分类模型;回归模型有线性回归,非线性回归模型;聚类模型还有Kmeans,DBSCAN等……

当我们抛开这些术语,回到初始的情况,其实就是输入数据,经过某种机制的加工,得到了预测输出数据。这个加工数据的机制,就是所谓的模型。上次提到的一元线性回归模型,,其实就是“”经过“”的处理,得到了“”。


策略

策略,可以简单理解为模型的评价标准。例如同样是1000组的数据,我们选择什么样的模型更能表达它们之间的关系呢?线性模型,还是二次函数模型²?

这里,我们就要引入某种准则,对每种模型进行评价。通常,我们把损失函数作为我们的评价函数。常用的损失函数有0-1损失函数、平方损失函数、绝对损失函数,对数损失函数等等,在上次的分析报告中,我们使用的就是平方损失函数,也就是我们想要最小化的目标函数。

显然,当模型中的参数取值不同,损失函数的值也不同。我们便可以通过损失函数的值,来衡量不同模型的优劣。这便是所谓的策略。

当然,对于机器学习的模型而言,评价其能力的最重要的指标应该是它的泛化能力,也就是预测未知数据的能力,但归根到底,还是通过选择合适的损失函数或者策略函数,来量化这种能力。


算法

最后,就是算法啦。无论是我们已经确定了某种模型,想要求解参数。亦或是我们希望比较两种或多种模型的优劣,我们都需要通过算法,去找到损失函数的全局最小值,以确定相关的参数,以及模型的最优拟合效果。对于参数的求解,就是算法需要做到的。

所以说到这里,我们就知道算法的重要性了,即使你提出了好的模型和好的策略,但如果你找不到合适的算法去求解你的模型参数,那么你的模型就无法发挥功能,最终也只是一文不值。现在十分火热的神经网络模型,曾经一度处于低谷状态,就是因为当时没有找到合适的算法对模型进行求解。而它的复苏,也是源于某位数学家提出了“每层局部最优最终达到全局近似最优”的想法并取得了很不错的效果。

上次提到的梯度下降算法,就是目前业界最为常用的机器学习优化算法之一。同时,经典梯度下降算法还衍生出一系列算法,例如随机梯度下降、小批量梯度下降、动量梯度下降法等等。此外,还有拉格朗日乘数法、Adam算法、牛顿法及相关延申、分治法及相关延申等等。启发式算法也是一类不错的算法,例如模拟退火、遗传算法、粒子群优化等等,针对某些问题也会有很不错的效果。

随机梯度下降

下面进入正题,随机梯度下降算法。显而易见,随机梯度算法是引入了随机性的梯度下降算法。如果理解了经典的梯度下降算法,随机梯度下降就很简单啦。

在经典的随机梯度下降算法中,我们的迭代下降公式是

以一元线性回归的目标函数为例,其梯度可以表达为

显然我们可以看到,这里的梯度计算,使用了所有的样本数据。倘若我们的数据集有1000组数据,那就需要计算1000次才可以得到梯度,倘若数据集有1亿组数据,就需要计算一亿次,其时间复杂度是O(n)。当我们面对的样本数据较多时,毫无疑问,模型的求解,学习一次的过程是很浪费时间的。因此,我们可以在所有的样本数据中选择随机的一个实例,用这个实例所包含的数据计算我们的“梯度”。此时的梯度为

其中是一个随机选中的样本。

到了这里,可能会存在一定的疑问,因为对于

这个目标函数,其梯度并不是既然如此,这个方向还是不是可以使函数值下降的方向?只能说,对于一次迭代而言,不一定,但是站在宏观的角度去考虑,最后还是很有机会收敛到近似最优解的。

事实上,我们的目标函数可以写成

所以我们的梯度则是这个时候,我们的优化目标是所有样本的损失函数之和,所以在梯度下降时,自然而然是朝着使总的偏差缩小的方向去移动的。而对于随机梯度下降,我们每一步迭代的优化目标函数不是始终不变的,其变化的范围就是在第步,我们随机地选中了作为我们的优化目标,其梯度便是而在第步,我们的优化目标可能就变成了此时,梯度也自然变成了显然,随机梯度下降迭代过程中,我们考虑的下降方向并不是全局下降方向,而是使得某个随机选中的样本的损失函数下降的方向。在一步迭代中,这种局部样本的下降未必会导致全局损失的下降,但是当迭代次数足够的时候,绝大部分样本都会被考虑到,最终一步一步走向全局最优解。

所以,随机梯度下降相对于梯度下降而言,其根本区别在于每一步迭代时需要优化的目标函数不同。对于经典的梯度下降,其每一步的目标函数(损失函数)是一样的,即所有样本的(平均)损失函数之和。而对于随机梯度下降而言,其每一步的目标函数是被随机选中的某个样本的损失函数,并不是一直不变的。

下面这个视频可以直观的感受一下随机梯度下降。

上面的每个小球,我们可以将其理解为随机梯度下降过程中由于随机性而带来的迭代情况的分支。正是由于这种随机性的存在,每个球可以较为自由地选择其运动方向,有些就停在某个位置,有些则一路向下。当迭代的次数足够多时,总会有某个球的路径十分顺畅,最终到达全局最优解的附近。我们甚至可以猜测,随机梯度下降相对于经典梯度下降,其逃离局部最优的能力更强。因为一旦到达了某个样本的局部最优,随着目标函数的更换,很可能不再是另一个样本的局部最优,迭代就可以继续进行。

当然,随机梯度下降的缺点也是存在的,即它很可能无法收敛到全局最优解。什么是全局最优,是达到最小嘛?还是每一个都无法继续下降?一般而言,前者可能更容易衡量一些,我们也更偏向于使用总体的最优作为全局最优,而非每一个样本的最优。而对于随机梯度下降,即使我们已经达到了总体全局最优,对于某些样本而言,其可能依然可以继续下降,所以一旦选中了这些样本,我们就要偏离全局最优点了。所以随机梯度下降最终的收敛性确实值得考虑。

但总的来说,随机梯度下降还是很不错的,特别是对于大样本的处理情况,每一次迭代中O(1)的计算开销无疑会轻松很多,至于最终的收敛问题,则要根据迭代次数,终止准则等进行一个衡量取舍啦。

代码基本上是差不多的,只是参数的选择上要多花时间调整了……

clear;clc;load a1data.mata=[0;0];% 初始值,a(1)=a;   a(2)=b; y=ax+balpha=1e-5; %学习率 alphaeps=1e-12; %终止准则 eps[q,s,num]=SGD(a,x,y,alpha,eps); %q是最终的解,s的均方误差的变化向量,num是迭代次数figure(1);plot(1:length(s),s);disp("迭代了"+num+"次"+"   收敛结果是"+q)title("均方误差下降曲线")xlabel("迭代次数")ylabel("均方误差")y1=q(1)*x+q(2);figure(2);plot(x,y,'or',x,y1,'b');
function [q,s,num,daa]=SGD(a,x,y,alpha,eps)i=1; %迭代序号s=1:10;  %MSE向量num=0; %迭代次数q=[inf;inf]; %返回结果的初值daa=1:10; % 梯度对a的分量向量while 1    disp(i);    ch=unidrnd(length(x));    da=2*x(ch)*(a(1)*x(ch)+a(2)-y(ch));    db=2*(a(1)*x(ch)+a(2)-y(ch));%梯度对b的分量    a1=a-alpha*[da;db]; %迭代格式    %disp(a1);    num=i;     s(i)=sum((a1(1)*x+a1(2)-y).^2)/length(x); %计算MSE    disp(s(i));    if i>500 && abs(s(i)-s(i-1))        q=a1;        break;    end    if i>200000000        disp("迭代了20000次也没有收敛,停下来改一下最大迭代次数试试")        break;    end    a=a1;    daa(i)=da;    i=i+1;endend 

由于一次只计算一个样本的损失函数,所以其迭代次数肯定更多啦。但是除以样本数目1000,其计算开销也就相当于经典梯度下降迭代了200次。而之前的梯度下降700多次才收敛。当然啦,经典梯度下降更加稳定,随机梯度下降的结果相对而言还是差了点。



最优结果:


确实有些差距,如果多花点时间调节参数,修改修改终止准则,结果应该会好些。

小批量梯度下降

我们现在了解了经典的梯度下降和随机梯度下降,并且知道其不同之处主要在于迭代过程中目标函数选择的不同。同时,我们知道经典梯度下降虽然稳定性比较强,但是大样本情况下迭代速度较慢;随机梯度下降虽然每一步迭代计算较快,但是其稳定性不太好,而且实际使用中,参数的调整往往更加麻烦。

所以,为了协调稳定性和速度,小批量梯度下降应运而生啦。其实很简单,小批量梯度下降法和前面两种梯度下降的主要区别就是每一步迭代过程中目标函数的选择不同。小批量梯度下降是从个样本中随机且不重复地选择个进行损失函数的求和

并将其作为每一步迭代过程中的目标函数。此时,迭代公式中的梯度也就变成了

显然,m=1时,小批量梯度下降就是随机梯度下降,m=n时,小批量梯度下降就是经典梯度下降。同时,我们也把经典的梯度下降方法称之为全批量梯度下降。这里的m一般称之为批量尺寸,其值的选择对于收敛的稳定性和速度有着较大的影响,也是一个技术活。

其他的也没什么好分析的了,基本上和随机梯度下降差不多。

以上。

3. 机器学习中为什么需要梯度下降?梯度下降算法缺点?_浅谈随机梯度下降amp;小批量梯度下降...相关推荐

  1. python中分支语句elif与else的区别_浅谈对python中if、elif、else的误解

    今天下午在练习python时用了"if...if...else..."的分支结构,结果运行出来吓我一跳.原来我想当然的认为"if...if...else..." ...

  2. 综合评价模型的缺点_浅谈交通影响评价中不同交通预测方法的特性

    目前,据小编经验觉得,我国交通影响评价的工作中仍有很多问题未得到很好的解决,主要表现在:交通需求预测模型有待进一步精细.交通的影响程度评价内容与指标不够明确.报告中提出的交通改善措施很难落实到位等方面 ...

  3. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列

    唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...

  4. python中for循环和while循环的区别_浅谈python中的while循环

    python中有两种循环,while和for,两种循环的区别是,while循环之前,先判断一次,如果满足条件的话,再循环:for循环的时候必须有一个可迭代的对象,才能循环,比如说 列表.字典.字符串等 ...

  5. 批量梯度下降(BGD)、随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解

    批量梯度下降(BGD).随机梯度下降(SGD)以及小批量梯度下降(MBGD)的理解 </h1><div class="clear"></div> ...

  6. Lesson 4.34.4 梯度下降(Gradient Descent)基本原理与手动实现随机梯度下降与小批量梯度下降

    Lesson 4.3 梯度下降(Gradient Descent)基本原理与手动实现 在上一小节中,我们已经成功的构建了逻辑回归的损失函数,但由于逻辑回归模型本身的特殊性,我们在构造损失函数时无法采用 ...

  7. 全梯度下降算法、随机梯度下降算法、小批量梯度下降算法、随机平均梯度下降算法、梯度下降算法总结

    一.常见梯度下降算法 全梯度下降算法(Full gradient descent,FGD) 随机梯度下降算法(Stochastic gradient descent,SGD) 随机平均梯度下降算法(S ...

  8. 常见优化算法批量梯度下降、小批量梯度下降、随机梯度下降的对比

    在机器学习领域中,梯度下降的方式有三种,分别是:批量梯度下降法BGD.随机梯度下降法SGD.小批量梯度下降法MBGD,并且都有不同的优缺点. 下面我们以线性回归算法(也可以是别的算法,只是损失函数(目 ...

  9. 【深度学习】——梯度下降优化算法(批量梯度下降、随机梯度下降、小批量梯度下降、Momentum、Adam)

    目录 梯度 梯度下降 常用的梯度下降算法(BGD,SGD,MBGD) 梯度下降的详细算法 算法过程 批量梯度下降法(Batch Gradient Descent) 随机梯度下降法(Stochastic ...

最新文章

  1. clisp语言中的包
  2. 51NOD 1001 数组中和等于K的数对
  3. asp.net 表单总结
  4. C#中,当鼠标移动到控件上,动态显示提示内容 - 用代码操作ToolTip
  5. 马尔科夫链和马尔科夫链蒙特卡洛方法
  6. Pycharm Professional(专业版2018.2.1)最简单方法破解,亲测有效(转)
  7. python安卓下载-python手册中文版apk下载
  8. nyoj 1172 unlucky number
  9. 网络爬虫-2018个人总结
  10. 破解还原卡的方法总结
  11. 猿辅导揭秘听课小窍门,掌握这些技巧让你的学习事半功倍
  12. hold命令matlab,Matlab中的命令hold on hold off
  13. idea调试源代码c语言,IDEA阅读spring源码并调试
  14. 音曼Omnos 5.1全景声音响全网首评 声音惊艳
  15. 透过散射介质的成像matlab,Advanced Photonics|深度神经网络实现透过厚散射介质成像...
  16. 五、分享优秀的 RISC-V 项目资源
  17. Android的IPC
  18. 13:Scala语言的数据结构和算法
  19. 关于云计算必知的关键核心技术
  20. Digg.com:投票的动力因素分析

热门文章

  1. Axure RP 简介
  2. python算法与数据结构-插入排序算法(34)
  3. 并发insert情况下会发生重复的数据插入问题
  4. linux (centos)下安装 mongodb v3.2 笔记(启动的时候可以指定配置文件)
  5. 利用PHP执行SQL文件,将SQL文件导入到数据库
  6. Gin使用mongo进行增删改查/聚合/数据转换
  7. JavaScript函数节流和函数防抖
  8. 反思技术面试题目准备汇总链接汇总
  9. Yii获取指定URL路径字符串
  10. Google 出品的 Java 编码规范和编程指南!