机器学习中的梯度下降法






4.17/5 (3投票s)
本文主要讨论对梯度下降的理解以及如何在 Python 中实现它。
引言
本文是对 Coursera 上 Andrew Ng 的神经网络课程第二周内容的总结。 第二周主要讲解如何处理二元分类等逻辑回归问题。
逻辑回归在我们的日常生活中应用广泛,例如预测房价,以及估计本月可以销售多少商品。 逻辑回归问题是指,给定一组输入数据和真实输出结果,要求您模拟一个线性函数,使预测结果与真实结果尽可能接近。 而二元分类是在相同的给定条件下,唯一的区别是结果只有两个数字,通常是0
和1
。 一种数学实现方法是应用最小二乘法,根据公式我们可以得到我们的系数。 但是如果存在 100 个训练集,每个集合包含 5 个特征呢? 我不知道是否有公式可以应用,即使存在,也一定非常复杂,难以计算。 所以梯度下降就出现了。
梯度下降
众所周知,函数的梯度指向其最陡的下降方向,就像下山一样,您总是会选择最陡峭的方式下山,因为这是最快的方式。 梯度下降的哲学就在于此。 在每一步中,您都朝着最陡峭的下降方向前进,然后环顾四周,找到当前位置中最陡峭的另一个方向,然后递归地执行此操作,直到获得想要的结果。 在这种情况下,结果是我们可以获得的估计输出和真实输出之间误差的最小值。
梯度下降是如何真正工作的? 这是一个例子,我相信看完这个例子,您就会清楚地了解梯度下降,并使用它编写一段代码。
问题:找到一个值 x,使得 f(x)=3+14x-5x^2,初始 x=0。
你一定会嗤之以鼻,因为它太简单了,不适合作为说明。 但我不得不说,初学者最好从简单的开始,特别是如果您使用另一种方法可以处理的示例,那就更好了。
好的,让我们开始吧。 首先,让我们定义什么是误差。 显然,这里的误差是 f(x) 和 0 之间的差值,也就是 f(x) 本身,但我们定义的误差应该是 f(x) 和 0 之间的差值,它可能是负数,这不好,因为我们希望它始终为正数。 因此,我们定义误差函数,也称为成本函数
L(x)=f(x)^2=(3+14x-5x^2)^2
根据梯度下降,我们需要在每一步都采取最陡的方向,所以我们必须计算它的导数,即
L`(x)=2(3+14x-5x^2)(14-10x)
因此,应用梯度下降,x 应按以下规则更新
x=x-alpha * L`(x)=x- alpha * 2(3+14x-5x^2)(14-10x),
其中 alpha 决定了您要采取的步长大小,称为学习率。
整个过程是您检查真实输出和预测输出之间的差异,通常您会得到一个非常糟糕的结果,因为这是第一次猜测。 在这种情况下,x=0,这意味着 error=9(3 的平方)。 如果您对这个结果感到满意,那么退出程序。 (但我相信没有人会对此感到满意),否则,转到更新规则,更新 x 并查看结果。 在这种情况下,如果我令 alpha=0.01,那么 x 的新值应为 0-2*0.01*3*14=-0.84。 再次使用此 x 计算误差,如果您不满意,则更新 x 并再次执行此操作!
一些细心的读者可能会注意到,这个函数必须有 2 个不同的根。 是的,你说的对。 但通过这种方式,我们只能得到一个结果。 如果你想要另一个结果,你应该怎么做? 你可以考虑一下。
是的,我们可以让初始 x=10,或者如果您不确定根有多大,您可以让它尽可能大(但不要让 Python 抱怨溢出),以确保您可以获得正根!
背景
我们都希望我们的机器更智能,这意味着它们可以根据环境调整其行动,它们可以比您更聪明地告诉您这是否可行,甚至可以诊断出某种疾病!
我对此充满热情,让机器做人类能做的事情,甚至做我们做不到的事情。 例如,根据一些统计数据,它可以告诉你你的肿瘤是良性还是恶性的概率,说实话,我做不到。
Using the Code
这段代码用于上面说明的示例,您可以自己编码,实际上它非常简单。
x=2
alpha=0.001
error=(3+14*x-5*(x**2))**2
count=0
accuracy=0.00000000001
while error>accuracy or error<-accuracy:
x-=(-10*x+14)*(-5*x**2+14*x+3)*alpha*2
error=(3+14*x-5*(x**2))**2
count+=1
预报
下次,我将写一篇关于如何使用梯度下降来预测肿瘤是恶性还是良性的文章。 再见!
历史
- 2018 年 3 月 14 日:初始版本