机器学习小试(5)机器学习应用前的认识准备

来源:互联网 发布:java葵花宝典2017 编辑:程序博客网 时间:2024/06/01 09:19

近期,见缝插针地逐一学习、实践了http://mooc.guokr.com/note/16274/这个视频教程中的大部分算法。从一开始对“机器学习”这个名词的敬畏,到现在的疑惑,算是稍微能够提出点自己的问题了,在准备应用机器学习解决实际问题之前,在认识方面,还是有必要自我准备一番。

一、机器学习的概念有多宽

引用百度百科的词条,

“机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。

下面有一张思维导图,大概列举了这个交叉学科涉及的算法:
机器学习思维导图

吴大神的教材中,主要介绍了监督、非监督两类算法,解决回归(拟合)与分类两类问题。涉及到具体的算法(如线性拟合(包括最小二程)、BP网络、K均值、支持向量机(SVM)等具体算法)以及算法的调优,工程实践背景很浓厚。即使仅限于全日制工科本科教学来看,该教材叙述的大量算法在《模式识别》、《统计信号处理》课程中均有涉及,在《计算方法》、《神经网络》等课程中,甚至包括了大量的调优策略。

从另一方面来看,机器学习带有很强的工程背景。它更多的是从目的出发进行的定义,可能只要是“为了让机器能够具有智能,所涉及的理论、方法、技术”,皆可纳入。这确实非常宽泛,非常宽泛——宽泛的东西,就可能有大坑!

二、人脑认知与特征构造,绕不过的坎儿

2.1 机器学习对特征好坏的依赖

按照一般工程师的思维,至少在几年前,我非常确信,必须要首先认清问题的本质,并为学习算法准备合适的特征。比如经典的拟合问题,在参量的特征表示与真实情况非常一致时,可以使用简单的、小规模的参数拟合出非常好的结果。像下面这个函数(示意图1),x1,x2是我们的传感器输出的数值,y是客户感兴趣的变量,他们之间的关系如下式:

y=1.2sin(20πx1)+3.6exp(cos(17πx2))

在拟合、预测时,可以:
1. 直接用x1,x2作为特征
2. 变换构造x1=sin(20πx1),x2=exp(cos(17πx2))为特征
1、2对应的算法复杂程度完全不同。2采用了正确的特征变换,使得一个非线性问题,变为线性问题。不但如此,在粗暴的直接采用x1,x2作为特征时,即使用多项式进行拟合,或者构造复杂的神经网络,其拟合效果也严重取决于训练样本的定义域。

比如,在定义域[-0.1,0.1]下,使用样本进行训练,可以拟合相同定义域下的曲面特征(示意图2),可是拿着训练成果,出了定义域,在更宽的定义域[-0.2,0.2]下使用,高阶拟合函数便会发散(示意图3):
训练数据定义域与拟合效果

使用多项式或者简单的级联网络,而不是真实的特征来拟合数据,拟合效果严重依赖于训练样本。上图中,测试数据的红色样点在出了训练样本定义域范围后,迅速发散。

自我提醒1:对问题的本质是否有了准确认识?OK的话,尽量提前进行特征构造、变换;

自我提醒2:究竟能不能划定问题的边界?是否可以均匀的在整个定义域内收集训练样本?

2.2 特征自动构造需要更深的人脑认知

近年来,以卷积神经网络(CNN)为代表的一些新算法,能够在给定特征构造框架的前提下,尽可能的自动构造有效特征。
这里写图片描述

上图,是引用网上用于面部识别的卷积神经网络的结构,分为卷积部分、经典神经网络部分。
1. 卷积部分,学过信号处理的同学应该很熟悉,就是滤波器。时域/空域的卷积,相当于频域的乘法。
2. 卷积部分,训练的目的是找到较好的滤波器参数wxy,使得能够准确的体现人脸的差异。如果是波形识别,就是一个FIR滤波器。
3. 池化,可理解为下抽,相当于波形处理中的采样率变换。下抽避免了因为设置过多的滤波器,产生的结果集合过多、过大。同时,不断下抽的过程,也是从微观(局部)到宏观的过程。
4. 在多层下抽后,从原始图像得到了高度抽象的少量特征。卷积神经网络的卷积部分在训练时,会尽量确保各层可以逆构造,即通过滤波结果大致还原出原始图像,这样以确保有效信息的保留。
5. 全连接层即使经典神经网络,用来执行最终的任务。

CNN这种结构的发明者,正是归纳了传统图像处理中,各种特征构造的共性方法,即“二维滤波器”的使用,才能提出这样的模型。我们想想,经典的SIFT尺度不变特征,采用高斯核滤波器,实质上是基于图像中的圆形斑点特征对高斯核的尺度敏感性。再看看边缘检测滤波器,感兴趣的是灰度的阶跃。传统的图像处理中,为了完成两幅不同角度拍摄的照片中,相同元素的检测,往往需要人工选择、联合运用多类特征。
特征检测
上图,是引用网上的照片配准的例子。CNN正是根据设计者对图像处理的算法共性的深入认识,巧妙构造了一种可以进行训练的滤波器+下抽器组结构,实现了用于二维图像处理的通用算法框架。

自我提醒3:特定领域的机器学习技术,可能融入了设计者对本领域比较深入的归纳。迁移(演绎)到不同的领域,首先要评估可行性;

自我提醒4:在全新的领域应用机器学习技术,最好应该要对该领域的传统方法有比较深入的了解;

三、术业专攻,嗅到了统计的味道

对于一些问题,能不能用现有机器学习的方法去解决,最好是动手试一试。不过,遇到问题是浅尝辄止,还是死磕硬抗?恐怕很多情况下要听钱袋子的。在踏实能干的同时,机器学习的使用者,或许可以先预估一下成功的可能性。凡事术业专攻,不能强求。

搜索一下网络,机器学习的主要领域:
机器学习的领域

会发现,这些领域带有浓厚的“统计学”味道。所谓统计的味道,大概又隐隐的能嗅出一些深层次的零碎念头:
1. 信息。如果是完全的随机事件,那无论是分类还是拟合都是徒劳的。机器学习的前提是有隐含信息可用,且能为机器提供全面、足够的信息。
2. 自然界。这里的自然界,既包括自然界产生的量,又包括自然界的认识手段。前者如温度、气压、声音、亮度、运动……后者,包括动物的神经系统、思维方式。
3. 预认知。这些事情,想让机器干,人类自己都是先能干的。比如人脸识别,差别在于速度、精度,而不是有无能力;又如数据挖掘,也是可以干的,差别在于应对的数据量、速度、关联的广度。

要让现有的机器学习技术很好的应用,除了确保不是随机事件之外,可能至少需要以下三个因素满足其一:
1. 人类可以为机器给出正确的特征;如普通的函数拟合,能够不遗漏交叉项。
2. 人类可以提出能够得到正确特征的自动化特征构造器结构;如CNN的滤波器组结构来自对图像处理行业的沉淀。
3. 人类可以告诉机器详细的算法规则;如Alpha-Go的博弈,机器要清楚地知道围棋规则。

倘若上述三者都不满足,却强行使用现有的学习算法,可能会遇到困难。这里头除了典型的无脑想法,比如某篇民科文所述机器学习预测彩票等等外,事实上很容易自己构造出一些较难的问题。比如,根据有限的值,预测下面这个函数foo的输出:

#include <stdlib.h>#include <stdio.h>double foo (double bar){    unsigned int * p = ( unsigned int *) & bar;    srand(p[0] ^ p[1]);    unsigned int seed = (unsigned int )(bar * 13847238413) % 32768;    for (unsigned int i=0;i<seed ;++i)        rand();    return rand()/32768.0;}int main(){    for (double x=-1;x<=1;x+=0.001)        printf ("%lf,%lf;\n",x,foo(x));    return 0;}

仔细看 下图,这个函数并不是均匀分布的,甚至有着很强的结构性。但是,由于其高度非线性,且临近的输入会得到截然不同的输出。
foo

自我提醒5:在使用机器学习技术之前,应该看看,输入信息全不全面?人类能够给出思路吗?如果人类都不知道该怎么玩儿,就麻烦了。