代码改变世界

对机器学习的一点理解

2018-04-09 21:49  xinchen1111  阅读(575)  评论(0编辑  收藏  举报

    机器是什么,机器就是电脑、芯片、代码这些东西。让电脑遵循人的指令,完成一件特定的任务从计算机发明那天开始就在研究了,现在的各种编程语言、数据结构和编程算法等都是在做这个。但是它们只能依赖于程序员输入的确定的代码才能 work,也就是说他们不能“自己学习”,这样对于有些问题就很尴尬,比如检测一张图片中有几个人,识别一句话中提到了几个人名,识别一张图片是不是黄图等等。这些任务要是写一个代码,依靠规则去实现,那还是非常困难。但是我们可以换个思路,让我们写代码去实现这些功能很困难,但是让我们去给图片打标签(比如给一批图,人为的打上是不是黄图的标签…)不是很简单的嘛,我们如果能让机器自己从打好标签的图片中自己学习那些是黄图不就万事大吉了嘛。这样看的话,标注的工作就对应了传统写代码中写规则匹配的工作。
    那么有了标注好的图片,怎么让程序学习呢?这一步就需要借助于万能的数学了。如果我们能构造一个拟合函数,这个拟合函数可以拟合训练集,比如这里就是给函数输入各个图片的像素 RGB 值,输出就是是不是黄图。拟合完了之后给定一张没见过的图片也就能用这个函数得到是不是黄图了。
    那么具体是怎么实现这个思路的呢?想一想最小二乘法的做法。举个例子,比如有 100 个点\((x_{0},y_{0}),...,(x_{100},y_{100})\),我们想用一条直线去拟合它。首先直线的方程就是 \(y = ax+b\), 其实这里我们只要求出 a 和 b 就行了,a 和 b 的选择有无数多种,我们要选一种最好的。没有量化就没有优化,我们首先要把 “最好的” 这个标准进行量化,在数学上就是选一个目标函数,比较好的一个目标函数就是让每个点到 y 的距离之和最小(图上画圈部分就是每个点的误差,目标就是让每个点的误差加起来最小)。

最小二乘法示意图
    所以目标函数就是 $\sum_{i=0}^{n}\frac{\left | ax_{i} - y_{i} + b \right |}{\sqrt{a^{2}+1}}$,我们要让它最小。     但是这样比较难算(点到直线的公式太烦了……),所以我们可以退而求其次,让每个点到 y 的差的和最小,这里只要关注距离,所以可以把一个点的误差写成 $\left | x_{i}- (ax_{i}+b)\right |$ 。然后把每个点的误差加起来就是我们的目标函数了。我们要让理论值和测试值之间误差最小。
最小二乘法示意图
    这样表示的目标函数就是 $\sum_{i=0}^{n}\left | x_{i}- (ax_{i}+b)\right |$。     但是绝对值是个令人头痛的东西,是一个分段函数并且还有不可导的点。所以我们用平方代替,最终的目标函数是 $\sum_{i=0}^{n} (x_{i}- (ax_{i}+b))^{2}$,现在的任务只要求使得这个式子最小的 a 和 b 就行了。在高等数学中,对于这个问题只要对 a 和 b 分别求偏导,并令其为 0,然后解一个二元一次方程就行了。鉴别黄图的思路也是类似的,只不过这个拟合函数就没有 $y = ax+b$ 这么简单了,可能还要用到高大上的深度学习什么的……但是道理是一样的。     对于其他的大部分机器学习算法思路是一样的。流程都是确定目标函数,然后对每个参数求导的方法找到目标函数的最大值(优化参数的过程)。只不过这里每个步骤都有很多方法可以选择。比如针对是否有训练集可以分为有监督、无监督和半监督。目标函数有极大似然估计、贝叶斯估计、平方误差、交叉熵之类的。优化参数可以直接求出解析解(如果可以的话),或者用 EM 算法、梯度下降法、牛顿法之类的进行迭代优化。

如需转载,请注明出处.
出处:http://www.cnblogs.com/xinchen1111/p/8763213.html