为了使大家对机器学习有一个基本的认识,在这篇文章中,我们将对以下四个主题做简要的介绍:
-
什么是机器学习?
-
机器学习模型的训练。
-
模型参数的优化。
-
神经网络。
即使你不是机器学习方面的专家也不必担心,因为你只需具备高中数学的基本知识就能读懂本篇文章。
▌什么是机器学习?
牛津词典对“机器学习”的定义如下:
计算机从经验中学习的能力。
机器学习的目标是找到一种或多种算法,在现有示例数据的基础上学习执行某项任务。
例如,假设现在我们想要编写一个能够玩Go这款游戏的程序。我们可以为这款程序添加某些游戏规则,或者也可以为其制定一些开放性策略和决策规则。
但此处存在一个问题。一方面,在编写新规则的同时,程序会变得越来越复杂;另一方面,程序员所能提出的策略也是有限的,程序最终会受到限制。解决这个问题最好的办法就是建立机器学习算法。人类能够根据某些案例和实际的经验去学习如何玩围棋游戏,同样机器学习也可以。这就是DeepMind公司用他们的阿尔法围棋(AlphaGo)程序所做的事情,阿尔法围棋(AlphaGo)程序是一种基于深度学习的机器算法。
▌机器学习模型的训练
机器学习算法是根据带标签的数据实例来训练模型的,通常情况下它会定义一个具有可调参数和优化算法的模型,如下图所示。首先该模型以数据(x)的形式进行输入,然后根据输入的数据及模型参数生成输出(y)。优化算法会设法找到最佳的参数组合,也就是说,在给定输入数据x的情况下,使得模型输出的y尽可能接近期望输出。经过训练的模型将生成特定的函数f,即在输入x时输出y。因此,函数方程式为y = f (x)。
训练机器学习模型的途径
图片翻译:
labeled data——标记数据,
model with tunable parameters——具有可调参数的模型
optimisation algorithm——优化算法
Trained model——训练模型y = f (x))
▌优化算法
有许多方法可以找到参数的最佳组合,它们都能在输入x的情况下使得模型f的输出y尽可能的接近期望输出。其中一种方法是尝试所有可能的参数组合,并选择能够提供最佳结果的组合。如果模型中的参数组合数量有限,那么这种方法可能会起作用,但是对于具有数千甚至数百万个参数的典型机器学习模型来说,这种方法可以说是完全不切实际。幸运的是,目前我们有一种更好的方法可以为某些类型的模型找到最佳解决方案,这种方法得益于17世纪的数学家牛顿。
牛顿和莱布尼茨- https://xkcd.com/626/
图片翻译:
牛顿,1666年,I have invented calculus——我发明了微积分
莱布尼茨,1674年,I have invented calculus——我发明了微积分
Really?sounds a little bit——真的吗?听起来有点……
Derivative——导数
牛顿发明了导数(也被称为梯度)。函数的导数表示该函数伴随其中某一参数的变化而变化的趋势,它能够表示函数的增减方向。如果我们有一个函数f,该函数有一个参数p,那么参数p的变化就可以表示为dp,函数f相对于dp的变化就可以表示为df,其方程式为df(p)/ dp。
Derivative (gradient) df(p)/dp of f(p) = psin(p^2) for different values of p.
那么,我们如何利用导数来提高模型的优化效率呢? 假设我们有一些数据(x,t),在输入x时对应于输出t,并且这些数据在图表中的表示如下:
标签数据(x,t)
如果我们现在想要创建一个模型,在该模型中对于所有给定的示例数据,在输入x时都能输出最接近期的t,那么我们就可以尝试拟合出一条通过原点的直线(这也被称为线性回归)。这条直线可以用y=f(x)和f(x)=p·x的函数来表示,其中p是该模型的唯一参数(注意:p表示该直线的斜率)。这个模型可以用下图来表示:
表示我们的模型y = f(x)
为了找到参数p,使函数y=x·p的值在所有给定的示例(x,t)中都接近期望输出t,我们必须用数学方法定义一种能够衡量“亲密度”的度量方法,即“成本函数”。在此,我们有一个解决该问题的典型成本函数,即将所有的示例(x,t)的期望输出t和模型输出y之差的绝对值的平方值(也就是|t-y|²)求和。最终,成本函数的形式为Σ| t - (xp)| ²,其中Σ(sigma)表示求和。由于这个例子非常简单,对于所有的参数p,我们很容易便能看到整个的成本函数。
例子中的成本函数
为了找到最好的参数p,我们需要最小化成本函数。请记住,我们的模型中存在一个参数p,并且在输入x时生成输出y。因此我们可以把这个模型写成y = xp。由于成本函数的表达式是Σ| t-y | ²,我们可以用xp代替y,并将成本函数写成Σ | t -(xp)| ²的形式。如果我们想要最小化这个函数,并使输出y尽可能接近期望输出t, 我们可以让每个输入样本(x,t)尝试所有可能的p值,并最终选择其中一个p值,该p值能够使所有输入样本的成本之和最低。
当模型中只有一个参数时,尝试所有可能的p值是可能的,但是很快当模型中存在多个参数时尝试所有p值的方法就会变得不可行。这也就是导数能够发挥作用的时候。利用导数,我们可以简单地为p选择一个随机起始参数值,然后开始在相反的方向上求导,最终找到成本函数的最低点。导数(梯度)下降的过程也被称为梯度下降。
这个过程如下图所示,我们从p=0.3开始,然后沿着梯度进行12个次渐变,同时改善模型与数据的拟合的情况(右图所示的线)。当成本函数不再大幅度下降时,我们停止对模型进行拟合,此时最终的参数p的值为1.94,成本函数的值为0.451。我们注意到,相比最初的线性回归函数,最终的线性回归函数与数据(x,t)的匹配程度更高,而且高很多。
梯度下降优化
▌神经网络
以上就是我们在训练神经网络模型时实实在在发生的事情。然而,更典型的神经网络模型是由比y=xp模型复杂得多的函数组成的。我们有各种各样的神经网络模型,但通常它们都是可以区分的,并且可以用在上文介绍的梯度下降法进行优化。
例如,在计算机视觉中使用的典型神经网络由多个层组成,每一层都对应成百上千个参数以及一个非线性函数。正是由于在神经网络中存在许多个层,所以才有了“深度学习”这一术语。在模型中使用多个层的好处是,每个层都可以利用上一层提取的信息来建立更为复杂的数据表示。正因为如此,神经网络才会非常强大,经过训练后不仅可以从视频中识别出猫,还能识别语音,甚至也能玩Atari视频游戏。
如果你想尝试一些小型的神经网络,可以试试谷歌的Tensorflow;如果你想尝试一些更具技术含量的神经网络,想要学习更多的东西,你可以尝试查阅我的教程“如何实现神经网络”(how to implement networks),并且在它的帮助下尝试建立自己的模型。
gradient descent
https://en.wikipedia.org/wiki/Gradient_descent
how to implement networks
http://peterroelants.github.io/posts/neural_network_implementation_part01/
原文地址
https://medium.com/onfido-tech/machine-learning-101-be2e0a86c96a
https://mp.weixin.qq.com/s?__biz=MzI0ODcxODk5OA==&mid=2247485749&idx=1&sn=a6424a7606513bb16545b5f089bca46e&chksm=e99d3accdeeab3daa880f23bdbecff319e35271ef242a0b40595cf09c49bb2e705cdf9ca1332#rd