读者朋友们大家好,从这篇开始更新我本人撰写的《速通机器学习》一书;本书已出版并发售于JD,想要实体书的可以自行购买。
本书从传统的机器学习,如线性回归、逻辑回归、朴素贝叶斯、支持向量机、集成学习,到前沿的深度学习和神经网络,如DNN、CNN、BERT、ResNet等,对人工智能技术进行零基础讲解,内容涵盖数学原理、公式推导、图表展示、企业应用案例。
本书面向初,中级读者,能帮助读者迅速掌握机器学习技术的相关概念及原理。本书内容结合作者多年的科研工作经验,理论和实践并重,对科研、学习、面试等均有帮助。
如若想要《速通机器学习》与《速通深度学习数学基础》二书电子档,可以后台私信或者评论区留言;如对机器学习感兴趣想一起学习讨论也可后台留言,我看到就会回复;谢谢大家。
机器学习是人工智能领域最活跃的分支之一,作为多学科交叉的重要工具,为计算机领域解决实际学习问题提供了理论支撑与应用算法。近年来,机器学习在互联网应用中崭露头角,计算机视觉、自然语言处理、推荐系统、搜索系统等积累了大量的数据和丰富的场景,促进了包括机器学习在内的诸学科的发展与繁荣。与此同时,机器学习的快速发展,也让我们切实领略了人工智能给人类生活带来各种改变的潜力。
这是一本涵盖机器学习现有重要领域和关键算法的读物,主要面向人工智能、机器学习、模式识别、数据挖掘、计算机应用、数学和统计学等领域的研究生和相关技术人员。这本书为我们介绍了经典机器学习、深度学习的常见模型,涉及领域包括图像处理、自然语言处理、推荐系统等。
不同于侧重理论的机器学习读物,本书作者摒弃了复杂烦琐的数学公式和理论推导,转而采用对各类知识点给出应用实例和绘制图表等方式进行讲解。同时,书中蕴含了作者对机器学习理论及各类模型的内在关系的理解与思考,并通过细致的对比和说明,透彻地讲述了不同概念之间的传承与发展,使读者可以快速领略机器学习的精髓并掌握一定的自学能力。
本书作者勤于思考、关注技术发展,在工作中积累了丰富的机器学习实战经验,这些经验正是本书的灵感和和创意来源。难能可贵的是,书中的大量示例均源于作者亲身参与的项目,对读者具有借鉴意义,这也是本书的亮点之一;特此推荐。
中国科学院院士 樊文飞
1956年夏季,以麦卡赛、明斯基、罗切斯特、申农等为首的一批有远见卓识的年轻科学家举办了一次聚会,共同研究和探讨用机器模拟智能的一系列有关问题,并首次提出了“人工智能”这一术语。这次聚会标志着“人工智能”这门新兴学科的正式诞生。
经过数十年的发展,人工智能已从最初的感知机,历经逻辑回归和支持向量机,发展到目前最为火热的深度学习。人工智能的研究成果已经从实验室落地,其工程实践涉及的应用也从个别领域延伸至各行各业。目前,绝大多数人工智能都是通过机器学习实现的(这里的“机器”特指计算机),因此,在本书中,人工智能和机器学习同指一个概念。
机器学习是什么呢?通俗地讲,就是机器(计算机)使用模型进行学习,以解决特定任务。模型可以理解为一个数学运算函数。模型的输入是图像等信息(函数的自变量),模型的输出是我们想要的结果(函数的因变量),例如识别图像中的动物是“猫”还是“狗”。函数里的很多参数是未知的,学习阶段就是通过已知结果的数据来寻找合适的参数,使模型能够给出正确的输出。学习一般被形象地称为训练。模型训练完成后,我们就可以使用它对未知类别的数据进行预测。
任何一项技术都有自己的业务边界,业务边界决定了技术的应用场景。机器学习只能处理有规律的、平滑连续的任务,例如声音识别、图像识别、文本分类等,但对猜骰子点数、预测彩票等完全随机事件无能为力。平滑连续是指输入的微小改变不会影响预测结果,例如“预测一个数字是否为质数”等非连续任务,输入从12到13,仅增大了1,预测结果却完全不同(机器学习很难在这类任务上取得较好的效果)。
人工智能的目的是使用机器代替人类的脑力劳动。人类的脑力劳动一般分为创新性脑力劳动和重复性脑力劳动。识别声音、文字、图像等属于重复性脑力劳动,这类任务在不久的将来可以由机器胜任;而在创新性脑力劳动方面,例如写作、发明创造等,机器学习还有很长的路要走。
在开展人工智能相关工作时,我们面临的业务大都是客观世界中的问题,例如图片、视频、文本的识别及推荐系统的设计等。这些业务包含各式各样的数据——图片对应的是像素值,文本对应的是字符串,语音对应的是声波,推荐系统则包含大量的用户行为数据——五花八门、无奇不有。但是,机器学习模型作为一个数学函数,接受的输入一般是浮点数数组。这个数组用专业术语表述,叫作特征向量,数组的长度叫作特征向量的维度。特征向量的某个具体位置的数值表示真实世界中某个属性的强度。因此,无论何种业务,都需要将业务特征表示为向量 x,这个过程叫作特征提取,如图1-1所示。
图1-1
如果各类业务特征统一以向量表示(不同的特征提取方法),后续的模型设计环节就可以与业务解耦。模型本身可以部分脱离业务(但不能完全脱离),仅需要针对特征向量进行研发,而这些特征向量可能来自完全不同的业务场景。
一些业务特征天然就是数值化的。例如,一个年龄30岁、身高175厘米的人,可以直接表示成特征向量 〖[30,175]〗^T。另一些业务特征不太容易直接表示成特征向量。例如,“我喜欢机器学习”这句话对应的是一个字符串,需要使用特征提取技术对其进行向量化(如转换成向量 〖[-0.1,0.3,0.2,0.4]〗^T)。特征提取有很多方法,并且往往和业务有关。即使是同一客观事物,在面向不同的业务时关注的目标也是不一样的。因此,特征的关注点千差万别。
下面介绍一些常用的特征提取方法。
在做图像识别时,首先会对输入的图片进行尺寸归一化,既将不同尺寸的图片缩放至同一尺寸,例如200像素×200像素。我们知道,图片是由大量像素点以二维方式排列而成的。在彩色图片中,每个像素点由一个3维数组组成,分别表示R、G、B(红、绿、蓝)颜色的强度,每种颜色的取值范围为0~255。例如,[255,0,0] 表示红色,[0,125,125] 则对应于黄色。因此,彩色图片对应于 200×200 的矩阵,矩阵中的每个元素都使用一个3维向量来表示颜色信息,彩色图片可以表示为 200×200×3 的向量,其中的“3”也称作通道数。黑白图片每个像素点的取值范围为0~255,0表示白色,255表示黑色,其他数值则表示从白色到黑色的渐变色(灰色)。黑白图片对应的是 200×200×1 的向量(黑白图片为单通道图片)。彩色图片和黑白图片的特征,如图1-2所示。在一些颜色不是特别重要的场景中,会将彩色图片转换成黑白图片,这时特征维度只有原来的 1/3,计算量和模型复杂度有所降低。
图1-2
在做视频处理时,一个视频其实是由多幅有序图片组成的。一幅图片称为一帧。常见的帧频是30帧/秒,即一段1秒的视频其实是快速播放30幅有序图片形成的。视频特征和图片特征类似,只不过加上了时间维度。例如,一段5秒的彩色视频(5秒×30帧/秒=150帧)所对应的特征向量的长度为 200×200×3×150。长视频往往会对应非常多的帧,这对计算来说负担很重。为了减轻计算压力,通常会使用关键帧技术,从视频中抽取一些视觉效果发生了急剧变化的帧作为特征,其他帧则会被舍弃。
除图像外,文本处理也是人工智能的一个重点领域。与文本处理相关的技术和应用主要包括文本内容理解、信息提取、智能聊天对话等,这些技术和应用称为自然语言处理(Nature Language Process,NLP)。假设词库中有a、b、c、d、e、f、g、h、i、j共10个词(实际词库中的词往往在20万个以上),每个词可以表示为一个10维向量,a~j分别对应于特征向量的1~10位,那么词a可以用10维向量 〖[1,0,0,0,0,0,0,0,0,0]〗^T 来表示,这种向量 化方法叫作one-hot。
如何对文章进行向量化呢?如果在一篇文章中,词a、b、e、f各出现了一次,则对应的特征向量为 〖[1,1,0,0,1,1,0,0,0,0]〗^T。而如果在一篇文章中,词a出现了两次,就可以进一步用词频来表示,即 〖[2,1,0,0,1,1,0,0,0,0]〗^T。这种对文章进行向量化的方法叫作multi-hot。
one-hot和multi-hot比较粗糙,有很多缺点,列举如下。
汉语的常用词有约20万个,但在一篇文章中可能仅出现几百个,因此,特征值会出现大量的0,向量稀疏,信息不紧凑,造成了存储资源的浪费。
没有考虑词的顺序问题。例如,“我借给你钱”和“你借给我钱”这种意思相反的句子的multi-hot向量是一样的。
中文的语义歧义问题。例如,“苹果手机”和“吃苹果”中的“苹果”是完全不同的事物,但这两个“苹果”所对应的one-hot和multi-hot向量是一样的。
在使用one-hot对文本进行编码时,无法体现语义的相似度。例如,“手机”“互联网”“红烧肉”三个词,在语义上,“手机”和“互联网”比较近,“红烧肉”和它们没有关系。采用one-hot编码,这三个词的对应向量为 〖[1,0,0]〗^T、〖[0,1,0]〗^T、〖[0,0,1]〗^T。从向量的角度看,这三个词彼此之间的夹角都为90°,表达不出语义上的相似性。
尽管one-hot方法有以上缺点,但在2014年之前,做自然语言处理的人基本上都在使用它——毕竟方法简单,在要求不高的场景中效果也能达标。在深度学习得到广泛应用之后,one-hot式微。目前流行的方法是让每个词对应于一个稠密低维(常见128维、256维,远低于one-hot中动辄几十万维)向量,例如词“苹果”对应于向量 〖[-0.1,1.2,3.3,2.1,4.3]〗^T。这类向量也称为词向量或Word embedding。词向量的生成方法,一般是先进行随机初始化,再进行任务驱动(例如文本分类、情感分析),从而训练模型以改变稠密向量,其经典方法是Word2vec。在使用稠密向量时,每个词所对应的embedding将会不同,具体表现为:近义词的embedding之间的夹角很小,语义无关的词的embedding之间的夹角很大。
对于包含多个词的文本,可以把每个词所对应的词向量相加作为文本向量。不过,相加(求和)忽略了词出现的顺序。为了解决这个问题,可以把词向量按顺序串联起来。例如,词向量有128维特征,一共10个词,那么该文本对应的就是 128×10 维的特征向量。可以使用配套的时序模型(例如RNN、LSTM、Transformer),将这个 128×10 维的向量转换成低维(例如128维)向量来表示文本语义。特别地,一词多义问题也可以通过BERT之类的模型来解决。从整体看,人工智能处理文字的难度远高于处理图像。目前,图像处理技术已经比较成熟了,有很多固定的方法和模式,但文字处理的难度仍然很大,技术仍然很不成熟。
除了图像、文字、语音等自然特征,还有很多业务特征需要向量化。例如,电商场景需要对每个用户进行用户画像。用户画像的一个维度是性别,而性别这个特征可以用以下两种方式表达。
男:〖[0]〗^T。女:〖[1]〗^T。
男:〖[0,1]〗^T。女:〖[1,0]〗^T。
第一种方式只有1维特征,男、女用数值来区分,但这样做是有问题的:同一位置具有可比性,从数值上看女大于男,但实际上男、女只是两个状态而已,没有大小关系。第二种方式其实就是one-hot。这样看来,第二种方式更合适——虽然存在冗余问题,但保证了男、女的平等性。在机器学习中通常会采用第二种方式。由此可见,虽然one-hot在NLP领域不适用,但并非一无是处,仍然有其适合的场景。这也说明,在机器学习领域,方法本身没有好坏之分,关键在于方法和场景是否契合。
再举个例子。在电商场景中,将年龄的取值范围设置为0~100,最简单的方法是用1维特征来表示,例如将32岁表示成 [32]。但是,在电商场景中,单纯的年龄数据并不重要,我们更关心“小孩”“年轻人”“中年人”“老年人”这种能够反映消费能力和消费习惯的特征。因此,用1维特征来表示的方法欠妥——单纯的数值特征,尽管具有数值的含义(例如,20岁和50岁的平均值是35岁,而在实际的电商场景中不会这样使用),但没有将业务的特点明确表示出来。
作为改进,我们可以把0~100岁分成四段,用一个4维向量来表示。不同年龄段有如下特征。
小孩:〖[1,0,0,0]〗^T,0 年轻人:〖[0,1,0,0]〗^T,18 中年人:〖[0,0,1,0]〗^T,40 老年人:〖[0,0,0,1]〗^T,60 通过这种方法提取的特征能更好地反映用户的消费能力和购物特点,例如小孩喜欢为游戏充值、年轻人愿意购买新奇的商品、中年人容易购买贵重商品、老年人经常购买保健品,与场景的贴合度很高。 从机器学习的角度看,这个方法的一个好处就是特征较为稳定。例如,25岁和26岁其实没有本质的差别,因为它们在同一区间内。这个方法的缺点在于对分段点附近的年龄过于敏感,例如17岁和19岁会被划分到两个区间。因此,这个方法对划分区间提出了较高的要求。为了缓和边界点的敏感性,可在划分时令相邻区间有交集,例如“0~18、15~40、35~60、55~100”,这样,30岁的人所对应的特征为 〖[0,1,1,0]〗^T,即同时具备中年人和年轻人的特点。 还有一个特点值得研究。电商网站一般会在后台存储用户的消费能力数据,例如:16~40岁的人购买能力比较强,消费能力为 10;女性的购买欲望比较强,消费能力为 15;若两者同时满足,例如“25岁的女性”,则其消费能力可能会飙升到100 ——不是简单的 10+15。因此,除了直接特征,还需要一些组合特征。例如,对一位26岁的女性,原来表示为性别 [1,0]^T、年龄 [0,1,0,0]^T,拼接后得到一个6维特征向量 x=〖[1,0,0,1,0,0]〗^T;而现在需要引入第7维作为组合特征,当第1维和第4维同时为1时将其置1,即 x_7=x_1 x_4,x_7 代表“年轻女性”这种更高层次的特征,特征向量为 〖[1,0,0,1,0,0,1]〗^T。 一些资讯类App会提供视频、图片和文字等内容。对于视频,可以考虑的特征有时长、清晰度、完成率等;对于图片,涉及的特征有清晰度、敏感信息等;对于文章,主要特征有篇幅、关键字、作者等。各种特征组合起来,数量巨大且具有较强的业务性。这些特征的具体组合方式,需要代码编写者和策略产品经理共同确定。随着机器学习的发展,现在也出现了很多能够进行特征自动组合的模型。 在二手汽车交易平台中,汽车的颜色是一个很重要的特征。能否用数组 [0~255,0~255,0~255] 表示颜色?答案是:不能。因为在汽车交易领域,颜色只代表购买者的审美倾向,并无大小之分。同时,汽车颜色种类有限,如果有20种颜色,就用一个20维的one-hot向量表示即可。 总之,特征向量的定义方式要根据具体的业务场景确定,特征要能尽量客观地描述实际问题。 综上所述,机器学习的步骤如图1-3所示。 图1-3 在使用非深度学习(传统)模型时,对特征工程的要求比较高。而深度学习模型与非深度学习模型相比,对特征工程的要求大幅降低,它通过计算机的运算能力对所处场景进行理解,模型可以根据目标任务自动提取特征,减轻了人的工作量——尽管模型复杂度增加、运算量增大,但对人的要求降低了。同时,硬件的迅速发展使机器成本不断降低——这也是近年来深度学习流行的原因之一。 前面详细讲解了如何使用向量来表示各类特征。除了将向量 x 输入模型作为特征,我们有时也需要通过向量之间的距离来衡量特征之间的差异。 有多种方法可以度量向量之间的距离,每种方法都有其应用场景和优缺点。这些方法有一些共性,列举如下。 同一性:d(x,x)=0,同一点到自身的距离为0。 非负性:d(x,y) ≥ 0,距离不能小于0。 对称性:d(x,y)=d(y,x)。 直递性:d(x,y) ≤ d(x,z)+d(y,z),即三角形法则(由3个点组成的三角形,两边长之和大于第三边)。 多种函数可以同时满足上述条件。理论上,这些函数都可用于度量距离。但是,这些函数中的大部分在机器学习中并不常用。下面介绍机器学习中的常用距离。 欧氏距离是机器学习中最为常见的距离之一,它源自两点之间的距离公式。两个特征向量分别为 x=[x_1,x_2,⋯,x_n ]^T y=〖[y_1,y_2,⋯,y_n]〗^(T ) 欧氏距离的计算公式如下。 d_Euclidean (x,y)=√(∑_(i=1)^n▒〖(x_i-y_i)〗^2 )=√((x-y)^T (x-y) ) d_Euclidean (x,y) 常写作 ‖x,y‖。特别地,‖x‖ 表示 x 距离原点的欧氏距离,‖x‖=√(∑_(i=1)^n▒〖(x_i)〗^2 )。 曼哈顿距离(Manhattan Distance)也可用于度量两点之间的距离。想象一下:你在曼哈顿街头,要开车从一个十字路口到另一个十字路口,实际驾驶距离是这两个十字路口之间的直线距离吗?显然不是——除非你能穿越大楼。这里的实际驾驶距离就是曼哈顿距离。曼哈顿距离也称为城市街区距离(City Block Distance),其计算公式如下。 d_Manhattan (x,y)=∑_(i=1)^n▒|x_i-y_i | d_Manhattan (x,y) 也常写作 |x,y|。特别地,|x| 表示 x 距离原点的曼哈顿距离,即 |x|=∑_(i=1)^n▒|x_i | 。 在国际象棋棋盘上,国王可以朝8个方向移动。国王移动到目标点所需的步数就是切比雪夫距离(Chebyshev Distance)。切比雪夫距离用于计算各维度数值差中的最大值,计算公式如下。 d_Chebyshev (x,y)=max(|x_1-y_1 |,|x_2-y_2 |,⋯,|x_n-y_n |) 切比雪夫距离和曼哈顿距离的区别在于:在斜向移动时,曼哈顿距离所需的距离为2,切比雪夫距离所需的距离为1。 广义圆可以定义为到圆心距离相等的点的集合。分别使用以上介绍的三种距离画出来的“圆”,如图1-4所示。 图1-4 闵可夫斯基距离(Minkowski Distance)的计算公式如下。 ▒〖〖〗〗d(Minkowski)(x,y)=(∑(i=1)n▒〖〖|x〗i−yi|〗p)(1/p) 其中,p 是一个变参数。 闵可夫斯基距离公式其实是一个通项公式。以上介绍的三种距离其实都是闵可夫斯基距离的特例。 当 p=1 时,就是曼哈顿距离。 当 p=2 时,就是欧氏距离。 当 p→∞ 时,就是切比雪夫距离。 以上三种距离都有一个缺点,就是容易受特征量纲的影响。例如,用一个2维特征表示人的体重和身高,体重的单位为千克,身高的单位为毫米,如 〖[60,1700]〗^T。此时,体重的数量级远小于身高,这会导致在计算距离时放大身高的作用。 我们以欧氏距离为例,讨论如何解决这个问题。对数据进行归一化,即将各个维度的均值和方差分别归一至 (0,1),以消除量纲不同带来的差异。归一化在各个维度独立进行,公式如下。 x_i^'=x_i/σ_i σ_i 为第 i 维特征所对应的标准差。修正后的距离计算公式如下。 d_(Standardized Euclidean) (x,y)=√(∑_(i=1)^n▒〖(x_i^'-y_i^')〗^2 ) 上述方法称作标准化欧氏距离(Standardized Euclidean Distance)。 在提取特征时,特征之间并不是独立的,维度之间往往存在冗余的问题。例如,体重和身高之间就存在较强的相关性。特征冗余带来的影响是:某些因素在各个维度重复出现,在计算距离时会被重复计算,从而使其影响被放大。为了降低特征冗余带来的影响,可以使用马氏距离(Mahalanobis Distance)进行计算,公式如下。 d_Mahalanobis (x,y)=√((x-y)^T Σ^(-1) (x-y)) 这里使用了向量的表示方式。Σ 为各维度的协方差矩阵,其中,对角线元素表示各维度自身的方差,非对角线元素表示各维度之间的相关性。可以看出,对于马氏距离,如果不考虑特征之间的相关性(非对角线元素为0),就会退化为标准欧氏距离。在使用标准欧氏距离或马氏距离时,因为涉及估计方差(协方差矩阵),所以需要一定的数据量,且数据量越大,方差(协方差矩阵)的估计结果越准。 我们用one-hot向量来表示所观看的电影的特征。假设有五部电影,那么向量的维度为5维。在看过的电影的特征位置写1,在没看过的电影的特征位置写0。我们是否可以通过one-hot向量的距离来度量两个人观影习惯的差异呢?答案是:不可以。因为我们无法确定这两个人是否全部看过这五部电影——如果没有观影,那么自然无法提供关于喜好的信息,而在都为0的位置计算出来的距离是没有意义的。假设有三个人,user1和user2共同观看了两部电影,user1和user3共同观看了一部电影,则他们观看电影所对应的向量分别为 user1=[1,0,0,1,0] user2=[1,0,1,1,0] user3=[0,0,0,1,0] 而我们的期望是 user1 和 user2 的距离更近。使用欧氏距离计算 user1 和 user2、user1 和 user3 的距离,公式如下。 d_Euclidean (user1,user2)=1 d_Euclidean (user1,user3)=1 user1 和 user2、user1 和 user3 的欧氏距离相等,与我们的期望不符。因此,欧氏距离不能在此场景中有效度量观影习惯的差异。 然而,对于两个人都看过的电影,即两个人都为1的位置,却能反映出两个人的喜好相同。可以使用Jaccard距离度量两个集合之间的差异,计算公式如下。 d_Jaccard (user1,user2)=1-|A∩B|/|A∪B| 在这里,A 和 B 分别为这两个人看过的电影的集合,A∩B 为这两个人看过的电影的交集,A∪B 为这两个人看过的电影的并集。使用Jaccard距离进行计算,公式如下。 d_Jaccard (user1,user2)=1-2/3=1/3 d_Jaccard (user1,user3)=1-1/2=1/2 显然,此时 d_Jaccard (user1,user2) 在机器学习中,除了距离,也常使用相似度来度量两个向量。顾名思义,两个向量的相似度越高,说明它们越相似。因此,相似度和距离成反相关。余弦相似度(Cosine Similarity)是一种常见的相似度,其计算公式如下。 cos(x,y)=(∑_(i=1)^n▒〖x_i y_i 〗)/‖x‖‖y‖ 余弦相似度的值域是 [-1,+1]。它用于衡量两个向量的夹角,夹角越小,两个向量越相似。+1 表示两个向量的相似度相同,即两个向量的方向完全相同(cos0=1)。-1 则表示两个向量的方向完全相反(cosπ=-1),此时两个向量呈高度负相关。当余弦相似度为0时,两个向量是互相垂直的(cos π/2=0),称作正交。相互正交的向量彼此线性无关。 余弦相似度,如图1-5所示。 图1-5 可以看出,余弦相似度和向量的长度无关,它是用来衡量各个维度比例的相似性的。当两个向量各维度的比例相同时,它们的夹角为0,相似度为1。 ∑_(i=1)^n▒〖x_i y_i 〗 称为向量 x 和 y 的内积,记作 〈x,y〉=∑_(i=1)^n▒〖x_i y_i 〗=x^T y。内积可以理解成未 必归一化的余弦相似度,值域为 (-∞,+∞),有时也用于度量向量的相似性。‖x‖ 为归一化因子,用于将向量 x 的长度归一至1。相比较而言,cos(x,y) 只考虑了 x 和 y 的角度差,〈x,y〉 则综合考虑了 x 和 y 的角度差与长度差。 有时需要将余弦相似度转换为余弦距离,公式如下。 d_cos (x,y)=1-cos(x,y) 特别地,当 ‖x‖=1、‖y‖=1 时,d_cos (x,y) 和 d_Euclidean (x,y) 有如下关系。 d_Euclidean (x,y)=√(2d_cos (x,y)))=√(2(1-cos(x,y))) 即欧氏距离和余弦相似度之间存在单调关系。 (由于平台稿件格式问题,公式格式不能正确写上;如若读写困难可评论区或者后台私信我要完整电子版)1.3 向量距离计算