在machine learning (机器学习)中,特征工程是重中之重,我们今天就来简单介绍一下特征工程里面的feature(特征),以及feature selection (特征选择)。
- 中文字典里是这么解释特征的:一事物异于其他事物的特点。
- 英文字典里是这么解释feature的:A feature of something is an interesting or important part or characteristic of it.
我们把这两个综合一下,特征就是,于己而言,特征是某些突出性质的表现,于他而言,特征是区分事物的关键,所以,当我们要对事物进行分类或者识别,我们实际上就是提取‘特征’,通过特征的表现进行判断。
我们提取得特征中有冗余特征,对模型的性能几乎没有帮助。
我们提取的特征中有些可以列为噪声(或者可以称为老鼠屎),对模型的性能不仅没有帮助,还会降低模型的性能。
那么,我们很自然就会想到要进行feature selection(特征选择)。
要是你从事过machine learning相关工作,肯定会发现一个问题,模型一样,算法一样,使用的机器,软件啊也一样,甚至连原始数据都一样,但最后训练得到的model效果还是有差别,这是为啥子咧?其中一个可能的原因,不同的model, 选取的特征不一样,效果也不一样。
机器学习本质上就是针对一堆数据进行统计学的分析,最后得到的模型是根据分析的数据为基础的。feature selection 的本质就是对一个给定特征子集的优良性通过一个特定的评价标准(evaluation criterion)进行衡量.通过特征选择,原始特征集合中的冗余(redundant)特征和不相关(irrelevant)特征被除去。而有用特征得以保留。
针对未来的训练,我们可以尝试提取表现最好的几个特征就好了,这样我们就:
- 降低了模型的复杂度,节省了大量计算资源以及计算时间。
- 提高了模型的泛化能力。什么是泛化能力呢,我打个比方,一个模型是通过训测,可是有些人长的就像噪声,对模型将会产生一定的影响,这样第一个模型的泛化能力就比第二个模型好不少,因为他不看脸,普适性更强。
通常来说,我们要从两个方面来考虑特征选择:
- 特征是否发散:如果一个特征不发散,就是说这个特征大家都有或者非常相似,说明这个特征不需要。
- 特征和目标是否相关:与目标的相关性越高,越应该优先选择。
总得来说,特征选择有三种常用的思路:(以下的方法由于涉及到大量专业知识以及公式推演,全部说清楚篇幅较长,请读者们自己搜吧,网上都有)
- 特征过滤(Filter Methods)
对各个特征按照发散性或者相关 性进行评分,对分数设定阈值或者选择靠前得分的特征。
- 优点:简单,快。
- 缺点:对于排序靠前的特征,如果他们相关性较强,则引入了冗 余特征,浪费了计算资源。 对于排序靠后的特征,虽然独立作 用不显著,但和其他特征想组合可能会对模型有很好的帮助,这样就损失了有价值的特征。
- 方法有:
- Pearson’s Correlation,:皮尔逊相关系数,是用来度量 两个变量相互关系(线性相关)的,不过更多反应两个服从 正态分布的随机变量的相关性,取值范围在 [-1,+1] 之 间。
- Linear Discriminant Analysis(LDA,线性判别分析):更 像一种特征抽取方式,基本思想是将高维的特征影到最佳鉴 别矢量空间,这样就可以抽取分类信息和达到压缩特征空 间维数的效果。投影后的样本在子空间有最大可分离性。
- Analysis of Variance:ANOVA,方差分析,通过分析研究不 同来源的变异对总变异的贡献大小,从而确定可控因素对研 究结果影响力的大小。
- Chi-Square:卡方检验,就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,卡方值越大,越不符合;卡方值越小,偏差越小,越趋于符合。
- 特征筛选(Wrapper Methods)
通过不断排除特征或者不断选择特征,并对训练得到的模型效果进行打分,通过预测效果评分来决定特征的去留。
- 优点:能较好的保留有价值的特征。
- 缺点:会消耗巨大的计算资源和计算时间。
- 方法有:
- 前向选择法:从0开始不断向模型加能最大限度提升模型效果的特征数据用以训练,直到任何训练数据都无法提升模型表现。
- 后向剃除法:先用所有特征数据进行建模,再逐一丢弃贡献最低的特征来提升模型效果,直到模型效果收敛。
- 迭代剃除法:反复训练模型并抛弃每次循环的最优或最劣特征,然后按照抛弃的顺序给特征种类的重要性评分。
- 嵌入法(Embedded Methods)
有不少特征筛选和特征过滤的共性,主要的特点就是通过不同的方法去计算不同特征对于模型的贡献。
- 方法:Lasso,Elastic Net,Ridge Regression,等。
嵌入法需要涉及到大量的理论基础和公式,这里就不讨论了。
实际上,特征工程实际上是一个非常大的概念,包括数据预处理,特征选择,降维等等。本篇文章仅做一个入门级的特征以及特征选取的讲解。后面我会对降维进行解析,因为降维在特征工程中也是重中之重。
它的物理意义大概可以理解为:系统某一时刻的输出是由多个输入共同作用(叠加)的结果。
放在图像分析里,f(x)可以理解为原始像素点(source pixel),所有的原始像素点叠加起来,就是原始图了。
g(x)可以称为作用点,所有作用点合起来我们称为卷积核(Convolution kernel)
卷积核上所有作用点依次作用于原始像素点后(即乘起来),线性叠加的输出结果,即是最终卷积的输出,也是我们想要的结果,我们称为destination pixel。
为啥要用卷积核,destination pixel的意义何在,别急,我先挖个坑,我们往下走。
图像的锐化和边缘检测很像,我们先检测边缘,然后把边缘叠加到原来的边缘上,原本图像边缘的值如同被加强了一般,亮度没有变化,但是更加锐利。
但是,我们一般是什么操作去检测边缘呢?
微分算子的响应程度与图像在用算子操作的这一点的突变程度成正比,这样,图像微分增强边缘和其他突变(如噪声),而削弱灰度变化缓慢的区域。
也就是说,微分算子(尤其是二阶微分),对边缘图像非常敏感。
很多时候,我们最关注的是一种各向同性的滤波器,这种滤波器的响应与滤波器作用的图像的突变方向无关。也就是说,各向同性滤波器是旋转不变的,即将原图像旋转之后进行滤波处理,与先对图像滤波再旋转的结果应该是相同的。
可以证明,最简单的各向同性微分算子是拉普拉斯算子。
额外再说明一点:
同样提取某个特征,经过不同卷积核卷积后效果也不一样(这是个重点,为什么说重点,因为CNN里面卷积核的大小就是有讲究的)。
说明,
(1)原始图像通过与卷积核的数学运算,可以提取出图像的某些指定特征(features)。
(2)不同卷积核,提取的特征也是不一样的。
(3)提取的特征一样,不同的卷积核,效果也不一样。
我为啥子要说这些,是因为,CNN实际上也就是一个不断提取特征,进行特征选择,然后进行分类的过程,卷积在CNN里,就是充当前排步兵,首先对原始图像进行特征提取。所以我们首先要弄懂卷积在干什么,才能弄懂CNN。
卷积实际上可以充当一个对原图像进行二次转化,提取feature 的作用,
相当于信号处理的滤波器,大家可以再去了解一下高斯滤波,拉普拉斯滤波等,这些都可以写成卷积的形式
神经网络想必大家都有了解,评价神经网络好坏的一个重要的依据就是:
以最少的代价,使神经网络获得最好的准确率
关键词:代价,准确率
机器如何去看全局呢
实际上,就是把所有pixels 一股脑全放进一个神经网络
让神经网络去处理这些pixels
这个神经网络,我们先叫他全连接层吧
仅仅是一个32*32 的图像,运算量非常大了
同时,由于参数过多,极其容易产生训练结果好,检测结果差的现象(overfitting)
但我们仔细看这个图,我们肉眼其实也是有选择性的,我们并不太关心上图中灰色的区域,以及数字’2‘中的黑色区域
我们更关心’2‘与灰色区域的相交的边缘,因为这才是我们判断的主要依据
那我们会不会也可以在计算机里也这么做,主要提取边缘特征,对于灰色和黑色这种冗余或者不重要的的区域特征,我们尽量丢弃或者少保留,那么这样可能会减少参数或者减少提参数的过程
既然这样,那我们干脆在全连接层前面,对输入图像进行一个预处理吧
于是我们加了个采集模块
我们只保留那些我们想要的,或者相对比较重要的pixels
我们就叫它采样层吧
如果我们只知道局部的图片,以及局部的相对位置,只要我们能将它正确组合起来,我们也可以对物体进行识别
同时局部与局部之间关联性不大,也就是局部的变化,很少影响到另外一个局部
我们还要解决两个问题:
- 输入的只是原始图片,我们还没有提取图片的特征
- 我们目前要处理的参数仍然非常多,我们需要对原始输入进行降维或者减少参数
一个3x3 source pixels 经过一个3x3的卷积核后,source pixels 的特征映射成一个1x1 destination pixel
然后我们再加上以上我们提到一些人眼识别图像的性质
那么
我们就会发现
来着早不如来得巧,卷积加上刚刚好
好了 ,我们得到了如下神经网络:
实际上,我们还会遇到两个问题:
一张图片特征这么多,一个卷积层提取的特征数量有限的,提取不过来啊!
我怎么知道最后采样层选出来的特征是不是重要的呢?
我这里又要提一个新概念----级联分类器(cascade of classifiers)
这个概念我以后会在机器学习入门上会细说,是个很常用的方法
我来大概介绍一下级联分类器
大概意思就是我从一堆弱分类器里面,挑出一个最符合要求的弱分类器,用着这个弱分类器把不想要的数据剔除,保留想要的数据
然后再从剩下的弱分类器里,再挑出一个最符合要求的弱分类器,对上一级保留的数据,把不想要的数据剔除,保留想要的数据。
最后,通过不断串联几个弱分类器,进过数据层层筛选,最后得到我们想要的数据
(你们也可以去搜搜Adaboost)
那么,针对刚才的问题,我们是否也可以级联一个卷积层和采样层?
是的,效果还不错
最简单的一个卷积神经网络,就诞生了
我想要申明的是,这是一个最简答的CNN结构,往后我会慢慢把结构加深
好了,我们来总结一下
CNN主要由3钟模块构成:
- 卷积层
- 采样层
- 全连接层
大致上可以理解为:
通过第一个卷积层提取最初特征,输出特征图(feature map)
通过第一个采样层对最初的特征图(feature map)进行特征选择,去除多余特征,重构新的特征图。
第二个卷积层是对上一层的采样层的输出特征图(feature map)进行二次特征提取
第二个采样层也对上层输出进行二次特征选择
全连接层就是根据得到的特征进行分类
这个最简单的卷积神经网络说到底,终究是起到一个分类器的作用,
卷积层负责提取特征,采样层负责特征选择,全连接层负责分类
卷积神经网络的出现,以参数少,训练快,得分高,易迁移的特点全面碾压之前的简单神经网络
而其中的卷积层可以说是这个卷积神经网络的灵魂
我们接下来会分两节来分析,卷积层到底是怎么充当“灵魂伴侣”这个角色的
正常情况下,我们输入图片是RGB格式,也就对红(R)、绿(G)、蓝(B)三个颜色
RGB格式大家自己谷歌吧,这也不多说了
总的来说,也就是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色, 这三个颜色通道叠加之后,就是我们看到的RGB图片了
卷积核放在神经网络里,就代表对应的权重(weight)
卷积核和图像进行点乘(dot product), 就代表卷积核里的权重单独对相应位置的Pixel进行作用
这里我想强调一下点乘,虽说我们称为卷积,实际上是位置一一对应的点乘,不是真正意义的卷积
比如图像位置(1,1)乘以卷积核位置(1,1),仔细观察右上角你就会发现了。
至于为什么要把点乘完所有结果加起来,实际上就是把所有作用效果叠加起来。
我们在这已经知道卷积可以提取特征
但是我们也不能随机找图像的pixels进行卷积吧
上一次我们讲到,我们卷积输出的特征图(feature map),除了特征值本身外,还包含相对位置信息
比如人脸检测,眼睛,鼻子,嘴巴都是从上到下排列的
那么提取出的相应的特征值也是按照这个顺序排列的
- 这样有什么好处呢
(1)我们获得的更多更细致的特征信息,上面那个例子我们就可以获得更多的图像边缘信息
(2)我们可以控制卷积层输出的特征图的size,从而可以达到控制网络结构的作用,还是以上面的例子,如果没有做zero-padding以及第二层卷积层的卷积核仍然是3x3, 那么第二层卷积层输出的特征图就是1x1,CNN的特征提取就这么结束了。
同样的情况下加了zero-padding的第二层卷积层输出特征图仍然为5x5,这样我们可以再增加一层卷积层提取更深层次的特征
上一次我们讲到哪了
嗯,对了,讲到卷积输出了,输出的特征图(feature map)到了采样(pooling,有些也叫subsample)层手上,
采样层实际上就是一个特征选择的过程
其实采样层(pooling)非常好理解,我们这里特指maxpooling
什么是maxpooling 呢
实际操作就是在四个方格里选最大的那个,对,就是9
这个矩阵就是特征图
数字的含义,你可以理解为能代表这个特征的程度
比如上一层卷积层的卷积核或者说过滤器是边缘过滤器
9的意思就代表在这个区域,这一块部位最符合边缘特征
Maxpooling 就是在这个区域内选出最能代表边缘的值,也就是9,然后丢掉那些没多大用的信息
你就可以理解为卷积核每空两格做一次卷积,卷积核的大小是2x2, 但是卷积核的作用是取这个核里面最大的值(即特征最明显的值),而不是做卷积运算
池化层还有什么性质
- 它可以一定程度提高空间不变性,比如说平移不变性,尺度不变性,形变不变性
对,一定程度上
为什么会有空间不变性呢
因为上一层卷积本身就是对图像一个区域一个区域去卷积
因此对于CNN来说
重要是单独区域的特征,以及特征之间的相对位置(而不是绝对位置)
图像细微的变换
经过卷积,maxpooling之后,输出结果和原来差别可能不算大,或者没有差别
比如平移不变性(translation invariant)
意思就是图像经过一个小小的平移之后,依然产生相同的池化特征
这个小小的平移要注意了
这个平移是在你的池化矩阵的范围
对于单个像素,有8个变换的方向(上、下、左、右、左上、左下、右上、右下),如果最大层是在2*2的窗口上面实现,这8个可能的配置中,有3个可以准确的产生和平移前相同的结果(filter size 2x2)
说明鲁棒性还行
为什么我们想要平移不变性
Pooling 层说到底还是一个特征选择,信息过滤的过程,也就是说我们损失了一部分信息,这是一个和计算性能的一个妥协,随着运算速度的不断提高,我觉得这个妥协会越来越小。
现在有些网络都开始少用或者不用pooling层了
关于,average pooling
实际上就是把filter 里面的所以值求一个平均值
特征提取的误差主要来自两个方面:
(1)邻域大小受限;
(2)卷积层权值参数误差。
目前主流上对于average pooling 和max-pooling 的主要区别在于
average -pooling能减小第一种误差,更多的保留图像的背景信
max-pooling能减小第二种误差,更多的保留纹理信息
我们来看激活函数
实际上,从下采样层出来的结果,不是又到卷积层,而是进入了一个激活函数(activation function)
因为每个激活函数都要考虑输入输出以及数据变化
所以要谨慎选择
激活函数确实是很好宽广的点,它对于提高模型鲁棒性,非线性表达能力,缓解梯度消失问题,将特征图映射到新的特征空间从何更有利于训练,加速模型收敛等问题都有很好的帮助
这个要讲就很广了,这里就不多说了
开始到达全连接层
泰勒公式都知道吧
意思就是用多项式函数去拟合光滑函数
我们这里的全连接层中一层的一个神经元就可以看成一个多项式
我们用许多神经元去拟合数据分布
但是只用一层fully connected layer 有时候没法解决非线性问题
而如果有两层或以上fully connected layer就可以很好地解决非线性问题了
说了这么多,我猜你应该懂的
听不懂?
那我换个方式给你讲
我们都知道,全连接层之前的作用是提取特征
全理解层的作用是分类
假设这个神经网络模型已经训练完了
全连接层已经知道
当我们得到以上特征,我就可以判断这个东东是猫了
因为全连接层的作用主要就是实现分类(Classification)
当我们找到这些特征,神经元就被激活了(上图红色圆圈)
这细节特征又是怎么来的?
就是从前面的卷积层,下采样层来的
至此,关于全连接层的信息就简单介绍完了
全连接层参数特多(可占整个网络参数80%左右),近期一些性能优异的网络模型如ResNet和GoogLeNet等均用全局平均池化(global average pooling,GAP)取代全连接层来融合学到的深度特征
需要指出的是,用GAP替代FC的网络通常有较好的预测性能
- 全连接层对模型的影响
那么全连接层对模型影响参数就是三个:
全接解层的总层数(长度)
单个全连接层的神经元数(宽度)
激活函数
首先我们要明白激活函数的作用是:
增加模型的非线性表达能力
- 如果全连接层宽度不变,增加长度:
优点:神经元个数增加,模型复杂度提升;全连接层数加深,模型非线性表达能力提高。理论上都可以提高模型的学习能力。
- 如果全连接层长度不变,增加宽度:
优点:神经元个数增加,模型复杂度提升。理论上可以提高模型的学习能力。
难度长度和宽度都是越多越好?
肯定不是
(1)缺点:学习能力太好容易造成过拟合。
(2)缺点:运算时间增加,效率变低。
- 那么怎么判断模型学习能力如何
看Training Curve 以及 Validation Curve,在其他条件理想的情况下,如果Training Accuracy 高, Validation Accuracy 低,也就是过拟合 了,可以尝试去减少层数或者参数。如果Training Accuracy 低,说明模型学的不好,可以尝试增加参数或者层数。至于是增加长度和宽度,这个又要根据实际情况来考虑了。
PS:很多时候我们设计一个网络模型,不光考虑准确率,也常常得在Accuracy/Efficiency 里寻找一个好的平衡点。
大家在看一些机器学习或者深度学习的文章时,在数据预处理的时候,会不会经常看到一个步骤:
(输入数据-数据均值)/数据标准差
初学者的你可能就直接略过了
因为你觉得它就是一个简单的线性变换,并没有多复杂
但是
就像爱因斯坦的相对论:
E = mc^2
大道至简
这个数据预处理的步骤在机器学习或者深度学习里面,都是重中之重
其实,它是标准化(Normalization)的一种
标准化的方法这是最常用的。
Z-score 怎么用python 代码实现:
实现时有2种不同的方式:
(1)使用sklearn.preprocessing.scale()函数,直接将数据进行标准化。
(2)使用sklearn.preprocessing.StandardScaler类,其优点可以保存训练数据中的参数(均值、方差),也可以直接使用其对象转换(transform)其测试集数据。
标准化的方法有很多,还有归一化,规范化等,具体都可以在 网上找到答案
- Softmax作用
首先这是卷积神经网络最后一层全连接层的构造,W是神经元的权值,K是要分类的类别数,X是上一层的输出平铺(Flatten)后的结果
预测结果与输入特征之间存在明显相关性
并且,Softmax 具有更好的解释性,包含属于猫的这一类的特征越多,输出为猫的概率就越大
(插播一句,这里所谓的概率,是相对概率,而不是绝对概率,假设上图P输出的概率为0.75,物理含义是,当输入为X时,预测为猫的概率是预测不是猫的概率的3倍))
上面的情况是假设不同特征是相互独立的
然而,这可能在许多情况下不成立,因为特征之间可能存在协同作用或冗余
为了解决这种情况,我们可以:
1)去除有协同作用或冗余的特征,如x3 =X1⋅x2x3=x1⋅x2(但是如果我们不知道哪些特征值是相关的,我们可能会引入更多无用的特征!
2)当两个特征经常一起被激活时,训练过程将学习较小的权重W1和W2,使得它们的联合效果更接近真实效果