人工智能的基本概念
01
所谓“人工智能”,就是机器能像人一样地分析、解决问题。然而,以我们目前的科学技术水平,是造不出这样的机器的。现在的机器最多只能完成一些特定的任务,比如人脸识别、语音识别,等等。而这刚好就是我们经常听到的、“机器学习”的定义。
本黄鸭曾经举过一个鸢尾花机器学习的例子。在开始机器学习之前,我们首先要从“sklearn.datasets”库中,把“iris.data”数据集导入进来。那么,这个数据集是从哪里来的呢?答案是从鸢尾花的样本中来。
在世界上众多的鸢尾花中,我们只要挑选出一百五十朵作为样本就行了。这个挑选的过程被叫做“采样”。不仅能随机采样,而且可以根据具体的算法来挑选,比如在一片花田中,本黄鸭每隔五米就摘一朵花;还比如本黄鸭可以不把花摘下来,这样在采样的时候,可能会多次选到这朵花花。
另外,在选择鸢尾花样本的时候,还必须注意一点,那就是三个品种的鸢尾花的数量应该差不多。如果A种鸢尾花的数目远多于其他两种,那么我们的模型无疑会倾向于把花花判定为A种鸢尾花。
这个要求对于鸢尾花采样来说是比较简单的,但是对于行为日志的分析就不那么容易了。本黄鸭现在想要有一个模型,通过分析计算机系统的行为日志,就能预测哪些行为是黑客行为,哪些是正常行为。一般地,前者被称为“负例样本”,后者又被称为“正例样本”。
鉴于本黄鸭上网的时候一直小心谨慎,电脑每隔三十年才被黑客入侵一次,即负例样本明显要比正例样本少很多,很难做到两种样本数量接近。在这种情况下,我们要做的是对样本进行加权,放大每一个负例样本对模型的影响。
在找到了鸢尾花样本之后,我们进入了“人工标注”环节。先人工测量它们的花萼长度、花萼宽度、花瓣长度、花瓣宽度,并且人工地判断它们的种类。然后,把这些数据都录入到系统中。由此可见,人工标注是机器学习中最需要的human labor的一个环节,很多小伙伴在网上找到的兼职就属于这一类。
在导入的“iris.data”数据集中,前四列是鸢尾花的四个特征,或者叫做“属性”,一般记作“X”;最后一列是鸢尾花的种类,或者叫做“目标”,通常记作“Y”。数据集中的每一列都有名称,这个名称又可以叫做“标签(label)”。单独拿一个特征出来是“特征向量”。这个概念既与标量有所不同,因为标量只有大小没有方向;也与序列有所不同,因为序列强调的是一组有序的数。
在录入系统的数据与“iris.data”数据集之间,可能还差以下几个步骤:
首先,如果数据在数值上的差距比较大,比如:很多的人的身高是一米七零,但体重是一百七十公斤的却很少。为了使得身高、体重在模型中具有大致相同的比例和权重,我们需要做的是“归一化”、“正则化”,例如用(数据的值 - 最小值)除以(最大值 - 最小值);还可以再研究一下“L1稀疏模型”和“惩罚项”,以减少极端值对于归一化的影响。
其次,在人工标注过程中,我们有时需要做一些近似。比如:花瓣的长度的通常是一个精确度高、连续的数值。这时可以把测量值四舍五入,精确到一厘米,使之变成离散的数据。这样既能抹掉一些冗余的信息,节约数据占用的空间,也可以加快算法的运行。
第三,我们还可以做的是“特征选择”,或者把多个特征compound在一起,投影到低维空间(降维)。前者是根据经验或者算法,直接删除一些多余的、没有用的特征。比如:计算两个特征向量之间的夹角,或者欧几里得距离,看两个特征向量的相似程度。如果相似程度高,那么可以删除其中的一个特征向量。
后者可以先绘制数据的分布,如果分布是heavy-tailed,即有许多数据虽然每个都不起眼,但加在一起占了整体的很大一部分,那么可以考虑使用联合分布、累积分布函数,等等。
最后,与在线技术相关的数据集很可能会因为缺少预测值,从而成为“待分类项”。比如:网站上一边有人在注册账户、上传身份证照片,一边在使用模型来识别身份证号。
即便不缺少预测值,我们录入系统的数据就是数据集了吗?答案是否定的,因为可能还需要做聚类(cluster)操作,即把不同的样本划分为几个类别,这里的类别又叫做“簇”。
典型的例子是推荐算法和协同过滤。前者是根据用户的喜好来推荐他们可能感兴趣的商品。比如:本黄鸭经常在当当网上购买编程类的书籍。如果店家想要提升销量,那么,在下次登录的时候,应该向本黄鸭推荐“编程类”这个类别中的另外一本书。
协同过滤与前者略有不同,我们来看一个例子:不仅是本黄鸭,程序员也经常在当当网上购买编程类的书籍。所以,当当网判定本黄鸭和“程序员”是一类人。那么,在下次登录的时候,应该向本黄鸭推荐其他程序员曾经购买过的商品,比如键盘、鼠标、U盘、显示器,等等。
在几何学中,把样本划分成簇的直线、曲线、平面,被叫做“决策边界”;一个簇的平均值又叫做“聚类中心”,还可以有从坐标原点指向聚类中心的向量,等等。
02
在机器学习中,最重要的环节就是训练一个模型,或者说,一个分类器。这是因为模型可以完成的特定任务很多,但操作基本都是分类操作,比如:区分鸢尾花的类别,区分进程是黑客的还是正常的,区分身份证号的第一位是一还是二,等等。分类器可以是一个函数、决策树、神经网络,等等。如果分类器是一个神经网络,而且度很深,那么这种机器学习又被叫做“深度学习”。
现在,本黄鸭假设模型是一元函数y = ax。其中,“x”是自变量,“y”是应变量,“a”是参数,参数的范围是从负一万到一万。训练模型的做法可以是:每次迭代都把a的值设定为范围中的一个,然后带入每一个训练集中的x的值,计算出对应的y值。接着,对比计算出来的y值与真实值之间的误差,比如:准确度,即(真实值-预测值)的平方;残差,即(真实值-预测值);自定义的损失函数,等等。最后,误差最小的a就是我们要找的a。
当然,事情远远没有想象的这么简单。首先,把负一万到一万的每一个值都依次试验一遍的做法是低效的,我们可以采用线性搜索(a = a + 梯度的方向*学习率),或者解空间搜索,更快地逼近我们想要找的参数。
现在是一个数据爆炸的时代,如果单个计算机无法容纳、计算那么多的数据,我们可以把数据分配给多个计算机来处理。请各位宝宝千万不要把这里说的“分布式”和“并行”搞混了,后者指的是把数据分配给同一台计算机的多个线程。
分布式系统还有更多的问题需要解决。虽然有的数据处理是本地就能完成的,比如:筛选出含有字符“鸭”的句子;但还有更多的数据处理必须是跨节点的,比如:统计含有字符“鸭”的句子的个数,那么在每台计算机都完成筛选、统计之后,我们还要把每台计算机的数字累加在一起。
另外,在分布式系统中,随时随地可能会出现机器死机、退出系统的情况。所以,我们需要系统有一定的容错性,即不论是否有机器退出,分布式系统都能正常地运行。
其次,模型可能会存在过拟合(over-fitting),或者欠拟合(under-fitting)的问题。前者指的是模型对训练集的效果好,但对测试集的效果不好;后者说的是模型对训练集和测试集的效果都不好。遇到这两种情况,大量的交叉验证是不可避免的。
最后,模型肯定会比y = ax复杂。有的时候是多个参数的线性组合,比如(a1 + 2* a2 + 3* a3);有的时候是BP神经网络,最外面一排nodes是输入层,中间有各种隐藏层,最里面是输出层,每一层都有无数个参数;还有的时候误差还会被及时地反向传播,反馈给模型。
版权声明
本站所有文章来源于本站原创或网络,如有侵权请联系删除。文章观点并不代表本站观点,请网友自行判断,如涉及投资、理财请谨慎应对!
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。