热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【基础】吴恩达机器学习笔记线性回归代价函数梯度下降

一、基本概念1.1机器学习的定义一个年代近一点的定义,由来自卡内基梅隆大学的TomMitchell提出,一个好的学习问题定义如下:一个程序

一、基本概

1.1 机器学习的定义

一个年代近一点的定义,由来自卡内基梅隆大学的 Tom Mitchell 提出,一个好的学习问题定义如下:

一个程序被认为能从经验 E 中学习,解决任务 T,达到性能度量值 P,当且仅当,有了经验 E 后,经过 P 评判,程序在处理 T 时的性能有所提升。

比如以下棋的机器学习算法为例:经验 E 就是程序上万次的自我练习的经验,任务 T 是下棋,性能度量值 P 是它在与一些新的对手比赛时,赢得比赛的概率。

1.2 分类问题和回归问题

分类问题:预测离散的数据点。比如下面的二分类问题:

红×和蓝圈代表两种不同类型,中间的直线是我们算法预测的分类边界函数。

当函数参数确定好了,我们给定一个输入,那么输出就是在直线上部或者下部的一个离散的点,表示该输入数据是最可能是哪一种类型,对于多个特征的分类问题,原理是一样的。

回归问题:预测连续的输出(拟合函数曲线),比如用最小二乘回归一个连续的输出曲线:

拟合的曲线可能有多条,通过不断的优化函数模型和参数,可以看出蓝色的曲线比紫色的直线拟合(回归)效果好。

再来练习下:

你有一大批同样的货物,想象一下,你有上千件一模一样的货物等待出售,这时你想预测接下来的三个月能卖多少件?- 回归问题

你有许多客户,这时你想写一个软件来检验每一个用户的账户。对于每一个账户,你要判断它们是否曾经被盗过?- 分类问题

1.3 监督学习

监督学习可以理解为:算法使用的数据集中已经人为设置了正确的属性。

比如用监督学习来根据房屋面积预测房价,那么在训练数据集中每个房屋面积都对应一个确定的价格(750, 200)。

这个确定的价格 200 就是我们人为给定的,用来训练算法模型(预测函数参数)。

1.3 无监督学习

无监督学习:算法使用的数据集不做任何人为处理,即没有加上任何属性。

上面是监督学习,已经人为设置了属性(红叉,蓝圈)。

这是无监督学习,所有的数据没有进行处理,表面上看起来都差不多。

在无监督学习中,常用的是聚类算法,即把距离相近的数据点划分为同一个簇,比如 Google 新闻从互联网上收集很多条新闻,然后将类型相近的文章划分为同一个类别:科技,情感,政治等等。

二、单变量线性回归算法

这个线性回归算法就是高中学的最小二乘拟合曲线数据点,通过下面这个例子来复习下机器学习算法工作流程,根据房屋面积预测出售价格(监督学习):

训练数据集如下(训练就是用给定的数据来计算最优的函数曲线参数,使得拟合效果最好):

m 代表训练集中实例的数量

x 代表输入变量(特征 Feature)

y 代表输出变量(目标变量)

(x, y) 代表训练集中的实例

(Xi, Yi) 代表第 i 个观察实例

h 代表学习算法的解决方案或函数,也称为假设函数(hypothesis)

一个经典监督学习算法工作流程如下图:

使用训练数据集和选择的训练算法,来计算假设函数 h 的参数,使得给定一个输入,假设函数给出一个预测的输出。比如预测房屋价格:

训练集:人为标记的房屋面积和对应房价的一组数据点

学习算法:比如梯度下降法

假设函数 h:

比如 h(x) = ax + b,线性函数拟合

输入和输出:房屋的预测价格 y = h(房屋面积 x)

机器学习算法的训练就是计算最优的参数 a 和 b,这里的函数只有一个输入特征面积,所以叫单变量线性回归模型。

三、代价函数

我的理解:代价函数(cost function,loss function)在机器学习中的作用是确定最优的函数参数,使得拟合数据点的误差达到最小,即拟合效果最好。

因为我们训练函数参数,最终还是要选择一个最优的,那么代价函数就给我们一个最优参数的度量方式,使得我们可以根据数学理论选择训练参数。

3.1 预测房价的代价函数

还是用预测房价的例子来介绍下代价函数的原理,这是预测房价的数据集:

我们使用线性回归算法来预测,所以取假设函数 Hypothesis 的表达式为 2 个参数(theta_0,theta_1)线性函数。

那么这个机器学习的问题就可以转换为如何选择最优的参数来使得预测的误差(代价)最小?

可问题是用什么方式来度量预测的误差呢?

这时代价函数就派上用场了,我们可以用代价函数来计算不同参数所对应的误差,取误差最小的那组参数作为训练的最终结果。

代价函数有挺多种形式,线性回归常用误差的平方和计算代价:

上面的代价函数 Cost Function 的求和公式其实就是高中学习的最小二乘法的平方误差的计算。

最终的求和结果就是预测值与真实值误差的平方和,再除以训练集实例数量,不过要注意这里的乘以 1/2,只是为了尽量把最后的求和结果变小一点,不含有其他逻辑。

可以将 Cost Function 的求和值理解就是下图中三条蓝色线段的长度平方之和再除以 1/ 2m,表示当前预测的函数值与实际的函数值之间的总的误差:

可以直观的理解,蓝色的线段总长度越小(误差越小,代价越小),则预测的函数直线就越接近(1,1)(2,2)(3,3)这 3 个点。

且当代价函数的值为 0 时,预测的函数直线就是 y = x(浅蓝色直线),直接拟合了这 3 个训练的数据点。

这时误差达到最小,对应的函数参数为 theta_0 = 0,theta_1 = 1,这就是训练的最终结果了。

所以机器学习的训练就是找到使得代价函数取最小值得那组参数,就这么简单,听起来挺高大上的。

上图中右边的代价函数 J(theta_0) = 0,但如果不把 theta_0 设置为 0,又如何理解带有 2 个参数的代价函数呢?继续往下看。

3.2 理解 2 个参数的代价函数

上面一个参数 theta_1 的代价函数容易理解,如果是两个参数的 J(theta_0, theta_1) 的代价函数,函数图形稍微复杂些,不过也不是很难。

我们目前只需要理解 2 个参数成本函数的求最小值的过程就行了,其他的暂时不需要深究。

来看下这个 2 参数的代价函数,其实就是在参数 theta_1 的基础上,纵向扩展了一个 theta_0 维度。

最后的曲线变成了一个像渔网一样的图像,我们称这样的函数为凸函数,不必追究它的概念,只需要知道凸函数只有一个局部最优解 - 即渔网的最底部。

但这个渔网一样的曲线也不是很直观,为了在二维坐标系中显示这个曲线,我们使用等高线来表示这 2 个参数。

可以把上面的渔网从下往上看,像个小山头,下面右图就相当于山头的等高线,每个等高线上函数的代价都相同。

当代价函数达到最小时:

渔网图像中(theta_0,theta_1)在渔网的最底部取得,使得代价函数达到最小值;

h_theta(x) 图像中预测的函数曲线对训练数据的拟合效果达到最优;

四、梯度下降算法

如何在程序中求代价函数的最小值呢?可以使用经典的梯度下降算法,迭代求代价函数 J(theta_0, theta_1) 的最小值。

4.1 算法思想

梯度下降基本思想:开始时随机选择一个参数的组合 (theta_0, theta_1, ..., theta_n),计算代价函数,然后寻找下一个能让代价函数值下降最多的参数组合,持续这么迭代直到求出一个局部最小值(local minimum)。

但是因为没有尝试完所有的参数组合,所以不能确定得到的局部最小值是否便是全局最小值(global minimum)。

选择不同的初始参数组合,可能会找到不同的局部最小值(下图中的 2 个谷底就是不同的局部最小值)。

可以拿下山的例子来形象地理解梯度下降:

想象一下你正站立在山顶的某一点上,我们要做的就是原地旋转 360 度,看看我们的周围,并问自己如果要在某个方向上用小碎步尽快下山,那么这些小碎步需要朝什么方向?

如果我们发现最佳的下山方向,就迈出一步,然后再看看周围,想想我应该从什么方向下山?依此类推,直到你接近局部最低点的位置。

你也可以把这个算法记成梯度下山算法,帮助你更好的理解算法的执行逻辑,但还是要记住原名。

4.2 算法数学理解

在实际算法中,常用批量梯度下降算法(Batch Gradient Descent)来同时更新多个参数 theta_i:

解释下这个更新公式:

theta_j 是待更新的参数 (theta_0,theta_1)

a 是学习率(learning rate),决定了代价函数在下降方向每次更新的步长(其实就是每次下山的小碎步)

a 右边的公式是代价函数对参数(theta_0,theta_1)的偏导数

因为是求偏导,所以(theta_0,theta_1)必须同步更新

可以用一句话总结这个公式:在批量梯度下降中,每一次同时让所有参数减去学习率 a 乘以代价函数的偏导数。

4.3 算法的直观理解

下面用实际的预测房价的代价函数曲线来直观理解梯度下降寻找最优解的执行过程:

为了方便理解,上面的代价函数假设 theta_0 = 0,红色的直线线表示 theta_1 点的切线,切线斜率即右端的红框中的对 theta_1 的偏导数,且切线的斜率大于 0。

所以一次更新过程为:新的 theta_1 = 旧的 theta_1 - a * 正数。

影响梯度下降算法的一个重要变量是学习率 a,它对更新会产生如下作用:

如果 a 太小,每次更新的步长很小,导致要很多步才能才能到达最优点;

如果 a 太大,每次更新步长很大,在快接近最优点时,容易应为步长过大错过最优点,最终导致算法无法收敛,甚至发散;

虽然 a 会对更新步长产生影响,但是实际设计算法时,并不需要对 a 进行特殊处理,为什么呢?来看下面这个例子:

我们知道一点的切线越陡则斜率(a)越大,越缓则斜率越小(这里只强调斜率大于 0,斜率小于 0 完全类似,只不过变了符号而已)。

在上图中随着算法不断迭代,更新的数据点越来越接近曲线底部,相对应的切线也越来越缓,即学习率 a 会自动变小。

随着学习率变小,那么下一步更新的步长也就随之变小,因为下一步更新的步长使用的 a 在上一步中已经自动变小了。

所以直到下降到最低点(该点导数为 0)时:新的 theta_1 = 旧的 theta_1 - alpha * 0 = 旧的 theta,此时不再进行迭代,算法找到最优解!

可以看出,梯度下降算法在执行过程中会自动更新 a,所以没必须另外再减小 a,这点一定要注意了!

那么既然学习了梯度下降算法,下面来看看如何用它来找到预测房价的代价函数最优解!

五、梯度下降的线性回归

我们用梯度下降算法来求平方误差代价函数的最小值,以此来拟合房价预测的函数直线,两个部分的公式如下:

当你理解了梯度下降算法的公式后,便可以看出求解的关键点就在于求出代价函数关于参数 theta_i 的偏导数,求偏导是高数中很基础的方法,这里就不介绍了,直接看下求出的 2 个偏导数:

当我们在程序中求出了所有参数的偏导数后,接着就可以按照算法的逻辑来同步更新参数 theta_i,再一步步迭代下去直到找到最优解。

要注意一点,因为这里代价函数求出的偏导,在计算时需要使用到所有的训练集,因为它含有求和公式,需要累加所有训练数据的误差。

所以这里的梯度下降算法也称为批量梯度下降,其中批量的意思就是每次梯度下降时都会用到所有的训练样本。

实际上也有其他不是批量型的梯度下降法,每次迭代值关注训练集中的一个子集,以后我学到了再跟你分享吧,记得持续关注我哈哈哈哈。

微信公众号目前不支持数学公式,所以很多公式表述的不好,建议点击原文链接访问我的博客 dlonng.com!


交流学习,进群备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。



推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 干货 | 携程AI推理性能的自动化优化实践
    作者简介携程度假AI研发团队致力于为携程旅游事业部提供丰富的AI技术产品,其中性能优化组为AI模型提供全方位的优化方案,提升推理性能降低成本࿰ ... [详细]
  • 「爆干7天7夜」入门AI人工智能学习路线一条龙,真的不能再透彻了
    前言应广大粉丝要求,今天迪迦来和大家讲解一下如何去入门人工智能,也算是迪迦对自己学习人工智能这么多年的一个总结吧,本条学习路线并不会那么 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Go语言实现堆排序的详细教程
    本文主要介绍了Go语言实现堆排序的详细教程,包括大根堆的定义和完全二叉树的概念。通过图解和算法描述,详细介绍了堆排序的实现过程。堆排序是一种效率很高的排序算法,时间复杂度为O(nlgn)。阅读本文大约需要15分钟。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 深度学习中的Vision Transformer (ViT)详解
    本文详细介绍了深度学习中的Vision Transformer (ViT)方法。首先介绍了相关工作和ViT的基本原理,包括图像块嵌入、可学习的嵌入、位置嵌入和Transformer编码器等。接着讨论了ViT的张量维度变化、归纳偏置与混合架构、微调及更高分辨率等方面。最后给出了实验结果和相关代码的链接。本文的研究表明,对于CV任务,直接应用纯Transformer架构于图像块序列是可行的,无需依赖于卷积网络。 ... [详细]
  • 本文介绍了Python语言程序设计中文件和数据格式化的操作,包括使用np.savetext保存文本文件,对文本文件和二进制文件进行统一的操作步骤,以及使用Numpy模块进行数据可视化编程的指南。同时还提供了一些关于Python的测试题。 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • 2017亚马逊人工智能奖公布:他们的AI有什么不同?
    事实上,在我们周围,“人工智能”让一切都变得更“智能”极具讽刺意味。随着人类与机器智能之间的界限变得模糊,我们的世界正在变成一个机器 ... [详细]
  • Two Sigma人均22万英镑~
    近期原创文章: ... [详细]
  • 软件测试工程师,需要达到什么水平才能顺利拿到 20k+ 无压力?
    前言最近看到很多应届生晒offer,稍有名气点的公司给出的价格都是一年30多W或者月薪20几k,相比之下工作几年的自己薪资确实很寒酸.根据我自己找工作经历,二线城市一般小公司招聘 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
author-avatar
ayuanliang
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有