第1章 线性代数的基本概念
1.1 向量和深度学习
在开展人工智能相关工作时,我们面临的业务大都是客观世界中的问题,例如图片、视频、文本的识别及推荐系统的设计等。这些业务包含各式各样的数据——图片对应于像素值,文本对应于字符串,语音对应于声波,推荐系统则包含大量的用户行为数据——五花八门、无奇不有。但是,机器学习模型作为一个数学函数,接受的输入一般是浮点数数组。这个数组用专业术语表述,叫作特征向量。数组的长度叫作特征向量的维度。例如:
在这里,x是一个向量,它对应的维度是3(有3个数字)。因为这3个数字是竖着排成一列的,所以x也被称作列向量。向量也可以写成如下形式。
y=[1.1,2.3,3.2]
这种写法,3个数字横着排成一行,因此y也被称作行向量。
我们一般使用转置符号T(写在向量的右上角)表示对向量旋转90°,即将行向量变成列向量,将列向量变成行向量。例如,上述向量x和y,有如下关系。
xT=y
yT=x
行向量和列向量本质上没有差别,都可以用来描述事物的特征。为了后续运算方便,一般来说,机器学习大都采用列向量作为特征描述,即
但是,由于这样书写公式占用的篇幅较大,所以有时也写成转置的形式:
x=[1.1,2.3,3.2]T
在本书中,对向量中具体维度的数值,采用下角标的形式表示:
x=[x1,x2,x3]T
x1=1.1
x2=2.3
x3=3.2
在机器学习中,特征向量的某个具体位置的数值表示真实世界中某个属性的强度。因此,无论何种业务,都需要将业务特征表示为向量,这个过程就叫作特征提取,如图1-1所示。
图1-1
如果各类业务特征统一用向量表示(不同的特征提取方法),后续的模型设计环节就可以与业务解耦。模型本身可以部分脱离业务(但不能完全脱离),仅需要针对特征向量进行研发,而这些特征向量可能来自完全不同的业务场景。
一些业务特征天然就是数值化的。例如,一个年龄30岁、身高175厘米的人,可直接表示成特征向量[30,175]T。另一些业务特征则不太容易直接表示成特征向量。例如,“我喜欢机器学习”这句话对应的是一个字符串,需要使用特征提取技术对其进行向量化(转换成向量[-0.1,0.3,0.2,0.4]T)。特征提取有很多方法,并且往往和业务有关。即使是同一客观事物,在面向不同的业务时关注的目标也是不一样的。因此,特征的关注点千差万别。
下面介绍一些常用的特征提取方法。
在做图像识别时,首先要对输入的图片进行尺寸归一化,即将不同尺寸的图片缩放至同一尺寸,例如200像素×200像素。我们知道,图片是由大量像素点以2维方式排列而成的。在彩色图片中,一个像素点由一个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-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,1,0,0,1,1,0,0,0,0]T。而如果在一篇文章中,词a出现了2次,就可以进一步用词频来表示,即[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对文本进行编码时,无法体现语义的相似度。例如,对于“手机”“互联网”“红烧肉”3个词,在语义上,“手机”和“互联网”比较近,“红烧肉”和它们没有关系。采用one-hot,这3个词的对应向量分别为[1,0,0]T、[0,1,0]T、[0,0,1]T。从向量的角度看,这3个词彼此之间的夹角都是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段,用一个4维向量来表示。不同年龄段有如下特征。
● 小孩:[1,0,0,0]T,0<age≤18。
● 年轻人:[0,1,0,0]T,18<age≤40。
● 中年人:[0,0,1,0]T,40<age≤60。
● 老年人:[0,0,0,1]T,60<age。
通过这种方法提取的特征能更好地反映用户的消费能力和购物特点,例如小孩喜欢为游戏充值、年轻人愿意购买新奇的商品、中年人偏爱购买贵重商品、老年人经常购买保健品,与场景的贴合度很高。
从机器学习的角度看,这种方法的一个好处就是特征较为稳定。例如,25岁和26岁其实没有本质的差别,因为它们在同一区间内。这种方法的缺点在于对分段点附近的年龄过于敏感,例如17岁和19岁会被划分到两个区间。因此,这种方法对划分区间提出了较高的要求。为了降低边界点的敏感性,可以在划分时令相邻区间有交集,例如0~18、15~40、35~60、55~100,这样,36岁的人所对应的特征为[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,即x7=x1x4,x7代表“年轻女性”这种更高层次的特征,特征向量为[1,0,0,1,0,0,1]T。
一些资讯类App会提供视频、图片和文字等内容。对于视频,可以考虑的特征包括时长、清晰度、完成率等;对于图片,涉及的特征包括清晰度、敏感信息等;对于文章,主要特征包括篇幅、关键字、作者等。各种特征组合起来,数量巨大且具有较强的业务性。这些特征的具体组合方式,需要代码编写者和策略产品经理共同确定。随着机器学习的发展,现在也出现了很多能够进行特征自动组合的模型。
在二手汽车交易平台中,汽车的颜色是一个很重要的特征。我们能否用数组[0~255,0~255,0~255]表示颜色?答案是:不能。因为在汽车交易领域,颜色只代表购买者的审美倾向,并无数值大小之分。同时,汽车颜色种类有限,如果有20种颜色,就用一个20维的one-hot向量表示即可。
总之,特征向量的定义方式要根据具体的业务场景确定,特征要能尽量客观地描述实际问题。
综上所述,机器学习的步骤如图1-3所示。
图1-3
在使用非深度学习模型(也就是传统模型)时,对特征工程的要求比较高。而深度学习模型与非深度学习模型相比,对特征工程的要求大幅降低。深度学习模型通过计算机的运算能力对所处场景进行理解,根据目标任务自动提取特征,减轻了人的工作量——尽管模型复杂度增加、运算量增大,但对人的要求降低了。同时,硬件的迅速发展使机器的成本不断降低——这也是近年来深度学习流行的原因之一。