机器学习(机器学习+线性回归+代价函数+梯度下降)
一、什么是机器学习一个计算机程序据说从经验 E 学习关于 一些任务 T 和一些性能措施 P,如果它在 T 上的性能, 由 P 测量,随着经验 E 的提高, 体验 E 将是 让程序玩成千上万的游戏本身的经验。 任务 T 将 是玩跳棋的任务,性能测量 P 将 赢得下一场比赛的跳棋对阵一些新的对手的概率。(1)有监督学习有监督学习是指 事实上 我们给算法的数据集 被称为“正确答案”。这也被称为回归问题
一、什么是机器学习
一个计算机程序据说从经验 E 学习关于 一些任务 T 和一些性能措施 P,如果它在 T 上的性能, 由 P 测量,随着经验 E 的提高, 体验 E 将是 让程序玩成千上万的游戏本身的经验。 任务 T 将 是玩跳棋的任务,性能测量 P 将 赢得下一场比赛的跳棋对阵一些新的对手的概率。
(1)有监督学习
有监督学习是指 事实上 我们给算法的数据集 被称为“正确答案”。这也被称为回归问题 ,通过回归问题 ,我们试图预测一个连续的输出值。作为一个连续的数值 术语–回归 指的是我们将要 预测出连续值属性的类型 。
分类这个词指的是这样一个事实,就是 我们试图预测离散值输出0或1,在分类问题中 有时输出可能有两个以上的值 。
给定一个这样的数据集 学习算法可能做的是把一条直线拟合到数据中去 。
一种学习算法不单单只能处理两个特征 或者三个,或者五个特征 而是无数个特征,对于一些学习问题来说 真正想要的是不要用三到五个特征 而是你想要使用无限多的特性 无数的属性 学习算法有很多属性 或者特征,或者做出这些预测的线索 那么,如何处理无限多的特性呢? 你如何存储无限数量的东西 你的电脑什么时候会内存不足? 当我们讨论一种叫做支持向量机的算法时 会有一个简洁的数学技巧 允许计算机处理无限多的特性 。
(2)无监督学习
对于监督学习中的每一个样本 我们已经被清楚地告知了 什么是所谓的正确答案 即它们是良性还是恶性 在无监督学习中 我们用的数据会和监督学习里的看起来有些不一样 在无监督学习中 没有属性或标签这一概念 也就是说所有的数据 都是一样的 没有区别
所以在无监督学习中 我们只有一个数据集 没人告诉我们该怎么做 我们也不知道 每个数据点究竟是什么意思 相反 它只告诉我们 现在有一个数据集 你能在其中找到某种结构吗? 对于给定的数据集 无监督学习算法可能判定 该数据集包含两个不同的聚类无监督学习算法 会把这些数据分成两个不同的聚类,所以这就是所谓的聚类算法 实际上它被用在许多地方。它被用来组织大型的计算机集群
二、线性回归算法
用小写字母x来表示输入变量 往往也被称为特征量 这就是用x表示输入的特征 并且我们将用y来表示输出变量或者目标变量 也就是我的预测结果 那么这就是第二列 在这里 我要使用(x, y)来表示一个训练样本 所以 在表格中的单独的一行对应于一个训练样本 为了表示某个训练样本 我将使用x上标(i)与y上标(i)来表示
并且用这个表示第i个训练样本 所以这个上标 i 看这里 这不是求幂运算 这个(x(i), y(i)) 括号里的上标i 只是一个索引 表示我的训练集里的第i行 这里不是x的i和y的i次方 仅仅是指(x(i), y(i))是在此表中的第 i 行 举个例子 x(1) 指的是 第一个训练集里值为2104的输入值 ,y(1) 等于460 这是我第一个训练集样本的y值 这就是(1)所代表的含义
然后输出一个函数 按照惯例 通常表示为小写h h代表hypothesis(假设) h表示一个函数
这个模型被称为线性回归(linear regression)模型 另外 这实际上是关于单个变量的线性回归 这个变量就是x 根据x来预测所有的价格函数 同时 对于这种模型有另外一个名称 称作单变量线性回归 单变量是对一个变量的一种 特别的表述方式 总而言之 这就是线性回归
三、代价函数
代价函数也被称作平方误差函数 有时也被称为平方误差代价函数 。事实上 我们之所以要求出 误差的平方和 是因为误差平方代价函数 对于大多数问题 特别是回归问题 都是一个合理的选择
还有其他的代价函数也能很好地发挥作用 但是平方误差代价函数可能是解决回归问题最常用的手段了
我们可以使用成本函数来测量假设函数的准确性。这需要一个平均差异(实际上是一个平均的幻想版本)的所有假设的结果与输入从x的和实际输出y的。
要打破它,它是弗拉克
或预测值和实际值之间的差值。
此函数称为"平方错误函数"或"平均平方错误"。平均值减半\左
作为梯度下降计算的便利,由于方形函数的衍生术语将取消弗拉克
术语。下图总结了代价函数的作用:
测试函数与代价函数的对比
对于任意一个 θ1 的取值 我们会得到 一个不同的 J(θ1) 而且我们可以利用这些来描出右边的这条曲线
学习算法的优化目标 是我们想找到一个 θ1 的值 来将 J(θ1) 最小化 对,这是我们线性回归的目标函数。
这条曲线 让 J(θ1) 最小化的值 是 θ1 等于1 然后你,这个确实就对应着最佳的通过了数据点的拟合直线 这条直线就是由 θ1=1 的设定而得到的 然后 对于这个特定的训练样本 我们最后能够完美地拟合 这就是为什么最小化 J(θ1) 对应着寻找一个最佳拟合直线的目标
重要公式:假设函数h,参数,代价函数J以及优化目标
轮廓图:
轮廓图是包含许多轮廓线的图形。两个可变函数的轮廓线在同一行的所有点都有恒定值。这样一个图形的一个例子是下面的右侧。
四、梯度下降算法
梯度下降算法可以将代价函数J最小化 梯度下降是很常用的算法 它不仅被用在线性回归上 它实际上被广泛的应用于机器学习领域中的众多领域
我只用两个参数 下面就是关于梯度下降的构想
我们要做的是 我们要开始对θ0和θ1 进行一些初步猜测 它们到底是什么其实并不重要 但通常的选择是将 θ0设为0 将θ1也设为0 将它们都初始化为0 我们在梯度下降算法中要做的 就是不停地一点点地改变 θ0和θ1 试图通过这种改变使得J(θ0, θ1)变小 直到我们找到 J 的最小值 或许是局部最小值
让我们通过一些图片来看看梯度下降法是如何工作的 我在试图让这个函数值最小 注意坐标轴 θ0和θ1在水平轴上 而函数 J在垂直坐标轴上 图形表面高度则是 J的值 我们希望最小化这个函数 所以我们从 θ0和θ1的某个值出发 所以想象一下 对 θ0和θ1赋以某个初值 也就是对应于从这个函数表面上的某个起始点出发
所以不管 θ0和θ1的取值是多少 我将它们初始化为0 但有时你也可把它初始化为其他值 现在我希望大家把这个图像想象为一座山 想像类似这样的景色 公园中有两座山 想象一下你正站立在山的这一点上 站立在你想象的公园这座红色山上 在梯度下降算法中 我们要做的就是旋转360度 看看我们的周围, 并问自己 我要在某个方向上 用小碎步尽快下山 如果我想要下山 如果我想尽快走下山 这些小碎步需要朝什么方向? 如果我们站在山坡上的这一点 你看一下周围 你会发现最佳的下山方向 大约是那个方向 好的 现在你在山上的新起点上 你再看看周围 然后再一次想想 我应该从什么方向迈着小碎步下山? 然后你按照自己的判断又迈出一步 往那个方向走了一步 然后重复上面的步骤 从这个新的点 你环顾四周 并决定从什么方向将会最快下山 然后又迈进了一小步 又是一小步 并依此类推 直到你接近这里 直到局部最低点的位置
此外 这种下降有一个有趣的特点 第一次我们是从这个点开始进行梯度下降算法的 是吧 在这一点上从这里开始 现在想象一下 我们在刚才的右边一些的位置 对梯度下降进行初始化 想象我们在右边高一些的这个点 开始使用梯度下降 如果你重复上述步骤 停留在该点 并环顾四周 往下降最快的方向迈出一小步 然后环顾四周 又迈出一步 然后如此往复 如果你从右边不远处开始 梯度下降算法将会带你来到 这个右边的第二个局部最优处 如果从刚才的第一个点出发 你会得到这个局部最优解 但如果你的起始点偏移了一些 起始点的位置略有不同 你会得到一个 非常不同的局部最优解 这就是梯度下降算法的一个特点
这是我们从图中得到的直观感受 看看这个图 这是梯度下降算法的定义 我们将会反复做这些 直到收敛 我们要更新参数 θj 方法是 用 θj 减去 α乘以这一部分 让我们来看看 这个公式有很多细节问题 我来详细讲解一下
首先 注意这个符号 := 我们使用 := 表示赋值 这是一个赋值运算符 具体地说 如果我写 a:= b 在计算机专业内 这意味着不管 a的值是什么 取 b的值 并将其赋给a 这意味着我们让 a等于b的值 这就是赋值 我也可以做 a:= a+1 这意味着 取出a值 并将其增加1 与此不同的是 如果我使用等号 = 并且写出a=b 那么这是一个判断为真的声明 如果我写 a=b 就是在断言 a的值是等于 b的值的 在左边这里 这是计算机运算 将一个值赋给 a 而在右边这里 这是声明 声明 a的值 与b的值相同 因此 我可以写 a:=a+1 这意味着 将 a的值再加上1 但我不会写 a=a+1 因为这本来就是错误的 a 和 a+1 永远不会是同一个值 这是这个定义的第一个部分
这里的α 是一个数字 被称为学习速率 什么是α呢? 在梯度下降算法中 它控制了 我们下山时会迈出多大的步子 因此如果 α值很大 那么相应的梯度下降过程中 我们会试图用大步子下山 如果α值很小 那么我们会迈着很小的小碎步下山 关于如何设置 α的值等内容 在之后的课程中 我会回到这里并且详细说明 最后 是公式的这一部分 这是一个微分项 我现在不想谈论它 但我会推导出这个微分项 并告诉你到底这要如何计算 你们中有人大概比较熟悉微积分 但即使你不熟悉微积分 也不用担心 我会告诉你 对这一项 你最后需要做什么 现在 在梯度下降算法中 还有一个更微妙的问题 在梯度下降中 我们要更新 θ0和θ1 当 j=0 和 j=1 时 会产生更新 所以你将更新 J θ0还有θ1
实现梯度下降算法的微妙之处是 在这个表达式中 如果你要更新这个等式 你需要同时更新 θ0和θ1 我的意思是在这个等式中 我们要这样更新 θ0:=θ0 - 一些东西 并更新 θ1:=θ1 - 一些东西 实现方法是 你应该计算公式右边的部分 通过那一部分计算出θ0和θ1的值 然后同时更新 θ0和θ1 让我进一步阐述这个过程 在梯度下降算法中 这是正确实现同时更新的方法
我要设 temp0等于这些 设temp1等于那些 所以首先计算出公式右边这一部分 然后将计算出的结果 一起存入 temp0和 temp1 之中 然后同时更新 θ0和θ1 因为这才是正确的实现方法 与此相反 下面是不正确的实现方法 因为它没有做到同步更新 在这种不正确的实现方法中 我们计算 temp0 然后我们更新θ0 然后我们计算 temp1 然后我们将 temp1 赋给θ1 右边的方法和左边的区别是 让我们看这里 就是这一步 如果这个时候你已经更新了θ0 那么你会使用 θ0的新的值来计算这个微分项 所以由于你已经在这个公式中使用了新的 θ0的值 那么这会产生一个与左边不同的 temp1的值 所以右边并不是正确地实现梯度下降的做法 我不打算解释为什么你需要同时更新 同时更新是梯度下降中的一种常用方法
实际上同步更新是更自然的实现方法 当人们谈到梯度下降时 他们的意思就是同步更新 如果用非同步更新去实现算法 代码可能也会正确工作 但是右边的方法并不是人们所指的那个梯度下降算法 而是具有不同性质的其他算法 由于各种原因 这其中会表现出微小的差别 你应该做的是 在梯度下降中真正实现同时更新 这些就是梯度下降算法的梗概 在接下来的视频中 我们要进入这个微分项的细节之中 我已经写了出来但没有真正定义 如果你已经修过微积分课程 如果你熟悉偏导数和导数 这其实就是这个微分项
我们将知道,当我们的成本函数位于我们图表中坑的最底部时,即当其值是最低值时,我们就成功了。红色箭头显示图形中的最低点。
我们这样做的方式是将成本函数的衍生物(切线到函数)。切线的斜率是当时衍生物,它将给我们一个前进的方向。我们以最陡峭的下降方向降低成本功能。每个步骤的大小由参数α(称为学习速率)决定。
这个参数 α 术语称为学习速率 它控制我们以多大的幅度更新这个参数θj,假如我们有一个代价函数J 只有一个参数 θ1,那么我们可以画出一维的曲线 看起来很简单 让我们试着去理解 为什么梯度下降法 会在这个函数上起作用 所以 假如这是我的函数 关于θ1的函数J θ1是一个实数,现在我们已经对这个点上用于梯度下降法的θ1 进行了初始化 想象一下在我的函数图像上 从那个点出发 那么梯度下降 要做的事情是不断更新 θ1等于θ1减α倍的d/dθ1J(θ1)这个项 。
在数学中 我们称这是一个偏导数 这是一个导数 这取决于函数J的参数数量 但是这是一个 数学上的区别 就本课的目标而言 可以默认为 这些偏导数符号 和d/dθ1是完全一样的东西 不用担心 是否存在任何差异 我会尽量使用数学上的 精确的符号 但就我们的目的而言 这些符号是没有区别的 好的 那么我们来看这个方程 我们要计算 这个导数 我不确定之前你是否在微积分中学过导数 但对于这个问题 求导的目的 基本上可以说 取这一点的切线 就是这样一条红色的直线 刚好与函数相切于这一点 让我们看看这条红色直线的斜率 其实这就是导数 也就是说 直线的斜率 也就是这条 刚好与函数曲线相切的这条直线 这条直线的斜率正好是 这个高度除以这个水平长度 现在 这条线有 一个正斜率 也就是说它有正导数 因此 我得到的新的θ θ1更新后等于θ1减去一个正数乘以α. α 也就是学习速率也是一个正数 所以 我要使θ1减去一个东西 所以相当于我将θ1向左移 使θ1变小了 我们可以看到 这么做是对的 因为实际上我往这个方向移动 确实让我更接近那边的最低点 所以 梯度下降到目前为止似乎 是在做正确的事
让我们来看看另一个例子 让我们用同样的函数J 同样再画出函数J(θ1)的图像 而这次 我们把参数初始化到左边这点 所以θ1在这里 同样把这点对应到曲线上 现在 导数项d/dθ1J(θ1) 在这点上计算时 看上去会是这样。 但是这条线向下倾斜 所以这条线具有负斜率 对吧? 或者说 这个函数有负导数 也就意味着在那一点上有负斜率 因此 这个导数项小于等于零 所以 当我更新θ时 θ被更新为θ减去α乘以一个负数 因此我是在用 θ1减去一个负数 这意味着我实际上是在增加θ1 对不对?因为这是减去一个负数 意味着给θ加上一个数,这就意味着最后我实际上增加了θ的值 因此 我们将 从这里开始 增加θ 似乎这也是我希望得到的 也就是 让我更接近最小值了 所以 我希望这样很直观地给你解释了 导数项的意义。
α太小会发生什么呢 这是我的函数J(θ) 就从这里开始 如果α太小了 那么我要做的是要去 用一个比较小的数乘以更新的值。 如果α 太大 那么梯度下降法可能会越过最低点 甚至可能无法收敛。如果我的学习率太大 下一次迭代 又移动了一大步 越过一次 又越过一次 一次次越过最低点 直到你发现
实际上 离最低点越来越远 所以 如果α太大 它会导致无法收敛 甚至发散 现在 我还有一个问题 这问题挺狡猾的 当我第一次学习这个地方时 我花了很长一段时间才理解这个问题 如果我们预先把θ1 放在一个局部的最低点 你认为下一步梯度下降法会怎样工作? 所以假设你将θ1初始化在局部最低点 假设这是你的θ1的初始值 在这儿 它已经在一个局部的 最优处或局部最低点 结果是局部最优点的导数 将等于零 因为它是那条切线的斜率 而这条线的斜率将等于零
因此 此导数项等于0 因此 在你的梯度下降更新过程中 你有一个θ1 然后用θ1 减α 乘以0来更新θ1 所以这意味着什么 这意味着你已经在局部最优点 它使得θ1不再改变 也就是新的θ1等于原来的θ1 因此 如果你的参数已经处于局部最低点 那么梯度下降法更新其实什么都没做 它不会改变参数的值 这也正是你想要的 因为它使你的解始终保持在 局部最优点 这也解释了为什么即使学习速率α 保持不变时 梯度下降也可以收敛到局部最低点 我想说的是这个意思 我们来看一个例子 这是代价函数J(θ) 我想找到它的最小值 首先初始化我的梯度下降算法 在那个品红色的点初始化 如果我更新一步梯度下降 也许它会带我到这个点 因为这个点的导数是相当陡的
现在 在这个绿色的点 如果我再更新一步 你会发现我的导数 也即斜率 是没那么陡的 相比于在品红点 对吧?因为随着我接近最低点 我的导数越来越接近零 所以 梯度下降一步后 新的导数会变小一点点 然后我想再梯度下降一步 在这个绿点我自然会用一个稍微 跟刚才在那个品红点时比 再小一点的一步 现在到了新的点 红色点 更接近全局最低点了 因此这点的导数会比在绿点时更小 所以 我再进行一步梯度下降时 我的导数项是更小的 θ1更新的幅度就会更小 所以你会移动更小的一步 像这样 随着梯度下降法的运行 你移动的幅度会自动变得越来越小 直到最终移动幅度非常小 你会发现 已经收敛到局部极小值 所以回顾一下 在梯度下降法中 当我们接近局部最低点时 梯度下降法会自动采取更小的幅度 这是因为当我们接近局部最低点时 很显然在局部最低时导数等于零 所以当我们 接近局部最低时 导数值会自动变得越来越小,所以梯度下降将自动采取较小的幅度 这就是梯度下降的做法
所以实际上没有必要再另外减小α 这就是梯度下降算法 你可以用它来最小化 最小化任何代价函数J 不只是线性回归中的代价函数J 在接下来的视频中 我们要用代价函数J 回到它的本质 线性回归中的代价函数 也就是我们前面得出的平方误差函数 结合梯度下降法 以及平方代价函数 我们会得出第一个机器学习算法 即线性回归算法 。
回顾一下, 在梯度下降中, 当我们接近一个局部的最小值的过程里, 梯度下降算法会自动采取越来越小的步子。 这是因为当我们接近局部最优时, 其定义就是导数等于0。 当我们接近局部最优,导数项会自动变 小,所以梯度下降会自动采取更小的步子。 这就是不需要减小alpha或时间的原因。
这就是梯度下降算法,你可以用它来最小化 任何成本函数J,而不是我们为线性回归定义的那个成本函数J。
这仅仅是原始成本函数J的梯度下降。这种方法着眼于整个训练设置的每一个步骤的每一个例子,并被称为批量梯度下降。请注意,虽然梯度下降一般容易受到局部微瘤的影响,但我们在这里提出的线性回归优化问题只有一个全球性的,没有其他局部的optima:因此,梯度下降总是趋同(假设学习率α不是太大)到全球最低。事实上,J 是一个凸起的二次函数。下面是梯度下降的示例,因为它运行以最大限度地减少二次函数。
更多推荐
所有评论(0)