人工智能(AI,Artificial Intelligence)是对人类智能在计算机上的复制。人工智能作为一门学科成立于1956年
。当时的目标和现在一样,是让计算机执行被认为是人类独有的任务:即需要智力的任务
。最初,研究人员研究的问题包括玩跳棋和解决逻辑问题。
机器学习(ML,Machine Learning),指的是机器使用大量数据集而非硬编码规则来进行学习的能力。
硬编码算法或固定的、基于规则的系统在图像识别或从文本中提取含义等方面表现不佳。结果证明,解决方法不仅仅是模仿人类行为(AI),而是模仿人类的学习方式。
深度学习(DL,Deep Learning),简而言之,深度学习就是使用更多神经元、层次和相互连接的神经网络。我们离模拟人类大脑的复杂性还有很长的路要走,但我们正在朝着这个方向前进。
随着人工智能的研究,人工智能的领域也在不断扩大,下图展示了人工智能研究的各个分支,包括专家系统、机器学习、进化计算、模糊逻辑、计算机视觉、自然语言处理、推荐系统等。AI、ML和DL的关系如下图所示。
从给定的训练数据集中学习出一个函数(模型参数)
,当新的数据到来时,可以根据这个函数预测结果。监督学习的训练集要求包括输入输出,也可以说是特征和目标。
常见的监督学习算法:感知机、SVM、人工神经网络、决策树、逻辑回归
我们不知道数据集中数据、特征之间的关系
,而是要根据聚类或一定的模型得到数据之间的关系。
非监督学习目标不是告诉计算机怎么做,而是让它(计算机)自己去学习怎样做事情。非监督学习有两种思路。
- 一类为基于
概率密度函数估计的直接方法
:指设法找到各类别在特征空间的分布参数,再进行分类。- 另一类是称为
基于样本间相似性度量的简洁聚类方法
:其原理是设法定出不同类别的核心或初始内核,然后依据样本与核心之间的相似性度量将样本聚集成不同的类别。
如下图所示,在无监督学习中,我们只是给定了一组数据,我们的目标是发现这组数据中的特殊结构。例如我们使用无监督学习算法会将这组数据分成两个不同的簇,,这样的算法就叫聚类算法。
深度神经网络(deep neural networks,DNN)是深度学习目前几乎唯一行之有效的实现形式
。简单的说,深度神经网络就是很深的神经网络
。我们利用网络中逐层对特征进行加工的特性,逐渐从低级特征提取高级特征。除了深度神经网络之外,有学者在探索其他深度学习的实现形式,比如深度森林。
- 深度神经网络的学习是特征递进的,浅层的神经元只能学习一些低层次的简单特征(如边缘、纹理),而
深层神经网络可以学到更高级特征
。- 深层网络的隐藏单元数目较少,隐藏层数目较多。 若
浅层网络想达到同样的计算结果须指数级增长单元数量
。- 在神经元数量相同的情况下,深层网络具有更大容量,
能构造更复杂的映射关系
。
激活函数是神经网络的必要组成部分,数据经过函数运算后由激活函数映射输出
。如果没有激活函数,多次线性运算的堆叠仍然是一个线性运算。如下图,Y的表达式f,就是一个激活函数。也就是说,每一个输入都有自己的权重,权重和输入的值相乘,然后加上一个偏置b之后在经过一个函数f得到输出y,这个f就是激活函数。
Y = f ( w 1 ∗ x 1 + w 2 ∗ x 2 + b ) Y = f(w_1*x_1 + w_2*x_2 +b) Y=f(w1∗x1+w2∗x2+b)
- 可以
引入非线性因素
,方便学习复杂数据。- 激活函数可以把当前特征空间通过一定的
线性映射转换到另一个空间
,让数据能够更好的被分类。
下面介绍一些常用的激活函数。
输入一个实值,输出一个 0 至 1 间的值。
f ( x ) = 1 1 + e − x f(x)=\frac1{1+e^{-x}} f(x)=1+e−x1
其导函数图像如下所示:
其值域范围为(-1, 1)。
f ( x ) = t a n h ( x ) = e x − e − x e x + e − x f(x)=tanh(x)=\frac{e^x\;-e^{-x}\;}{e^x\;+e^{-x}} f(x)=tanh(x)=ex+e−xex−e−x
其值域范围为 [ 0 , ∞ ) \lbrack0,\infty) [0,∞)。
f ( x ) = m a x ( 0 , x ) f(x)=max(0,x) f(x)=max(0,x)
- 导数为1,解决了梯度消失、梯度爆炸问题。
- 计算方便,加速了网格的训练。
- 正饱和区的梯度大于0,不会造成梯度弥散。
Relu激活函数的的缺点:
- 由于负数部分恒为0,会导致一些神经元无法激活(可通过设置小学习率部分解决)
- 输出不是以0为中心的
其值域范围为 [ − ∞ , ∞ ) \lbrack-\infty,\infty) [−∞,∞)。
f ( x ) = m a x ( k x , x ) f(x)=max(kx,x) f(x)=max(kx,x)
解决了Relu中0区间的影响,k为leak系数,一般选择0.01或0.02。
Softmax 多用于多分类神经网络输出。
输出层为2分类
问题时使用。tanh 是非常优秀的,几乎适合所有场合
。隐藏层上不确定使用哪个激活函数,那么通常会使用 Relu 激活函数。有时,也会使用 tanh 激活函数
。死的神经元
,我们可以使用 Leaky Relu 函数。模型不能很好的拟合数据,通常表现在训练集上准确率不高。
每次只训练相同的数据,若一段时间后准确率很高,则说明网络的拟合能力不足,即当前网络无法拟合全部数据
。
- 增加网络的深度
- 减小正则化参数
模型学的太彻底,把一些噪声特征也学到了
。通常表现在训练集上表现很好,但在测试集上准确率不高。
模型在验证集合上和训练集合上表现都很好,而在测试集合上变现很差。过拟合即在训练误差很小,而泛化误差很大,因为模型可能过于的复杂.
- 增加训练数据量,并对已有数据进行样本增强。
- 采用正则化(dropout、L1、L2正则)
- 提前终止训练
正则化是一种减小测试误差的行为,通常用于防止模型的过拟合问题。
理论上,当损失函数为0时,预测结果与实际情况完全一致,但是此时模型的过拟合现象显然已经发生,模型不再具备任何泛化能力
,即对于输入的新数据,模型将无法做出正确的判断。既然知道了过拟合发生的数学原因,解决的办法就是给模型增加一个约束,限制最终参数的取值范围,让原有损失函数无法取到0,因此就出现了正则化的方法,即在上述公式的最后人为添加一个约束
。
欠拟合的现象也常会发生,这是由于在实际工作当中,获取训练数据的成本很高,与海量现实信息相比,人们掌握的数据量往往少的可怜。为了解决数据量的问题,就出现了数据增强所谓数据增强,就是通过一些技术手段,使原来不那么丰富的数据变得丰富起来
。总体来说,数据增强的作用有两点:
- 增加训练数据量,提高模型的泛化能力。
- 增加噪声数据,提升模型的鲁棒性。
以图像数据为例,数据增强的方法有如下几种:
- 图像翻转:数据翻转是一种常用的数据增强方法,这种方法也可以看作对数据做镜像处理,顾名思义这种方法是做一种类似于镜面的翻折。
- 图像旋转:旋转就是顺时针或者逆时针的旋转,旋转的时候尽量旋转 90 - 180 度否则会出现尺度的问题。
- 图像缩放:图像可以被放大或缩小。放大时,放大后的图像尺寸会大于原始尺寸。大多数图像处理架构会按照原始尺寸对放大后的图像进行裁切而图像缩小会减小图像尺寸,这使我们不得不对图像边界之外的东西做出假设。
- 图像剪裁:这种方法也可以叫做裁剪,效果甚至可以看作是局部随机放大,图像剪裁随机从图像中选择一部分,然后将这部分图像裁剪出来,再调整为原图像的大小。
- 像平移:将图像沿着 x 或者 y 方向 (或者两个方向) 移动。我们在平移的时候需对背景进行假设,这一点类似于图像缩放,
需要对原来没有的区域进行填充
,比如说假设为黑色等等,因为平移的时候有一部分图像是空的,由于图片中的物体可能出现在任意的位置,所以说平移增强方法十分有用。- 添加噪声:过拟合通常发生在神经网络学习高频特征的时候 (因为低频特征神经网络很容易就可以学到,而高频特征只有在最后的时候才可以学到) 而这些特征对于神经网络所做的任务可能没有帮助,而且会对低频特征产生影响,为了消除高频特征我们随机加入噪声数据来消除这些特征。
我们知道,典型的神经网络其训练流程是将输入通过网络进行正向传导,然后将误差进行反向传播。Dropout就是针对这一过程之中,随机地删除隐藏层的部分单元,进行上述过程。综合而言,上述过程可以分步骤为:
随机删除网络中的一些隐藏神经元
,保持输入输出神经元不变;- 将输入通过修改后的网络进行前向传播,然后将误差通过修改后的网络进行反向传播;
- 对于另外一批的训练样本,重复上述操作.
假如我们设置得训练次数是30次,但是训练了20次之后,验证集得损失不再下降,精确度不再上升,所以第20轮之后。模型逐渐开始过拟合。对于这种特殊情况,我们可以通过在二十个左右的时期之后停止训练来防止过度拟合。
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。基础的CNN由 卷积(convolution), 激活(activation), and 池化(pooling)三种结构组成
。
与常规神经网络不同,卷积神经网络的各层中的神经元是3维排列的:宽度、高度和深度
。其中的宽度和高度是很好理解的,因为本身卷积就是一个二维模板,但是在卷积神经网络中的深度指的是激活数据体的第三个维度
,而不是整个网络的深度,整个网络的深度指的是网络的层数。举个例子来理解什么是宽度,高度和深度,假如使用CIFAR-10中的图像是作为卷积神经网络的输入,该输入数据体的维度是32x32x3(宽度,高度和深度)。我们将看到,层中的神经元将只与前一层中的一小块区域连接,而不是采取全连接方式
。对于用来分类CIFAR-10中的图像的卷积网络,其最后的输出层的维度是1x1x10,因为在卷积神经网络结构的最后部分将会把全尺寸的图像压缩为包含分类评分的一个向量,向量是在深度方向排列的。下列是全连接神经网络与卷积神经网络的对比。
样本出现的时间顺序对于自然语言处理、语音识别、手写体识别等应用非常重要。为了能对时间序列上的变化进行建模
, 比如当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列,就出现了另一种神经网络结构——循环神经网络RNN(不知道为什么很多叫循环的。计算机术语里循环一般是同一层次的,Recurrent 其实是时间递归,所以本文叫他递归神经网络)。
在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward Neural Networks)。而在RNN中,神经元的输出可以在下一个时间戳直接作用到自身。下图是一个简单的循环神经网络图:
如果把上面有W的那个带箭头的圈去掉,它就变成了最普通的全连接神经网络。x是一个向量,它表示输入层的值(这里面没有画出来表示神经元节点的圆圈);s是一个向量,它表示隐藏层的值(这里隐藏层面画了一个节点,你也可以想象这一层其实是多个节点,节点数与向量s的维度相同);U是输入层到隐藏层的权重矩阵,o也是一个向量,它表示输出层的值;V是隐藏层到输出层的权重矩阵。循环神经网络的隐藏层的值s不仅仅取决于当前这次的输入x,还取决于上一次隐藏层的值s。权重矩阵 W就是隐藏层上一次的值作为这一次的输入的权重
。
损失函数是定义在单个样本上的,算的是一个样本的误差
。
代价函数是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均
。
目标函数是最终需要优化的函数
。等于经验风险+结构风险(也就是Cost Function + 正则化项)。
损失函数和代价函数越小越好,目标函数可能是最大值,也可能是最小值
。
在线性回归中,最常用的代价函数是
均方误差(Mean squared error)
。在逻辑回归中,最常用的是代价函数是交叉熵(Cross Entropy)
。
如上图所示,绿颜色的为GT Box(ground truth box),红颜色的Predict Box
。如果要正确检测出图中的猫和狗,那怎么才能算是正确的检测呢?下边的这三个标准是都需要看的:
- GT与预测框IoU是否大于阈值
- 预测的类别是否正确?
- 置信度是否大于阈值?
IoU的作用是评价两个矩形框之间的相似性,在目标检测中是度量两个检测框的交叠程度。计算公式如下:
a r e a ( B g t ∩ B p ) a r e a ( B g t ∪ B p ) \frac{area(B_{gt}\cap B_p)}{area(B_{gt}\cup B_p)} area(Bgt∪Bp)area(Bgt∩Bp)
其中 B g t B_{gt} Bgt表示GT Box, B p {B_p} Bp表示Predict Box。
下列Positive和Negative表示模型对样本预测的结果是正样本(正列)还是负样本(负例)。True和False表示预测的结果和真实结果是否相同。
概念 | 解释 | 备注 |
---|---|---|
True positives(TP) | 被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数。 | IoU>IOU,IOU一般取0.5 |
False positives(FP) | 被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数。 | IoU<=IOU |
False negatives(FN) | 被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数。 | 没有检测到GT的数量 |
True negatives(TN) | 被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数。 | 一般不会使用 |
如果假设IoU阈值为0.5的话,那在目标检测中:
被预测为正样本的检测框中预测正确的占比。其中 a l l d e t c t i o n s all \ detctions all detctions 代表所有预测框的数量
。
P r e c i s i o n = T P T P + F P = T P a l l d e t e c t i o n s Precision = \frac{TP}{TP + FP}= \frac{TP}{all\ detections} Precision=TP+FPTP=all detectionsTP
如上图所示,图中GT共有5只猫待检测,但实际上只检测出来了一只,而且这个检测是正确的。那这种情况下的查准率就是:
P r e c i s i o n = 1 1 = 100 % Precision = \frac{1}{1}= 100\% Precision=11=100%
被正确检测出来的真实框占所有真实框的比例, a l l g r o u n d t r u t h s all \ ground \ truths all ground truths 代表所有 GT 的数量
。
R e c a l l = T P T P + F N = T P a l l g r o u n d t r u t h s Recall = \frac{TP}{TP + FN}= \frac{TP}{all\ ground \ truths } Recall=TP+FNTP=all ground truthsTP
同样是上边有5个待检测的GT,这次得到了50个预测框,其中5个全部预测正确,这种情况下TP=5,漏检FN=0最终的查全率为:
R e c a l l = 5 5 + 0 = 100 % Recall = \frac{5}{5+0}=100\% Recall=5+05=100%
AP 是计算某一类 P-R 曲线下的面积,mAP 则是计算所有类别 P-R 曲线下面积的平均值。其中P是查准率Precision,R是查全率Recall。PR曲线如下所示:
下面以3张图片为例,说明AP和mAP的计算过程:
在所有的图片中(当前只有上图一张),待检测的目标的数量 n u m o b = 2 num_{ob}=2 numob=2,上图中的检测情况如下表所示:
GT id | Confidence | OB(IoU=0.5) |
---|---|---|
1 | 0.98 | True |
1 | 0.61 | False |
该表中的顺序是按Confidence从高到低排序的,对于一个GT来说,只能有一个检测框为正确的检测。
加入第二张图片,此时待检测的目标数量 n u m o b = 3 num_{ob}=3 numob=3,检测情况如下表所示
GT id | Confidence | OB(IoU=0.5) |
---|---|---|
1 | 0.98 | True |
3 | 0.89 | True |
3 | 0.66 | False |
1 | 0.61 | False |
加入第三张图片,加上前两张中的待检测目标,共有 n u m o b = 7 num_{ob}=7 numob=7个目标需要检测,检测情况如下表所示:
GT id | Confidence | OB(IoU=0.5) |
---|---|---|
1 | 0.98 | True |
3 | 0.89 | True |
6 | 0.88 | True |
7 | 0.78 | True |
3 | 0.66 | False |
1 | 0.61 | False |
4 | 0.52 | True |
依次取Confidence的阈值为[0.98, 0.89, 0.88, 0.78, 0.66, 0.61, 0.52],计算对应的查准率和查全率如下表所示:
Rank | Precision | Recall | Confidence thread |
---|---|---|---|
1 | 1.0 | 0.14 | 0.98 |
2 | 1.0 | 0.28 | 0.89 |
3 | 1.0 | 0.42 | 0.88 |
4 | 1.0 | 0.57 | 0.78 |
5 | 0.80 | 0.57 | 0.66 |
6 | 0.66 | 0.57 | 0.61 |
7 | 0.71 | 0.71 | 0.52 |
以Confidence thread=0.52为例:
此时的TP=5,误检FP=2,第一张和第三张两张图片共漏检FN=2,所以
P r e c i s i o n = T P T P + F P = 5 5 + 2 = 0.71 Precision=\frac{TP}{TP+FP}=\frac5{5+2}=0.71 Precision=TP+FPTP=5+25=0.71
R e c a l l = T P T P + F N = 5 5 + 2 = 0.71 Recall=\frac{TP}{TP+FN}=\frac5{5+2}=0.71 Recall=TP+FNTP=5+25=0.71
绘制出对应的P-R曲线图:
计算曲线下方的面积,也就是猫这一类别的AP:
( 0.14 − 0 ) × 1.0 + ( 0.28 − 0.14 ) × 1.0 + ( 0.42 − 0.28 ) × 1.0 + ( 0.57 − 0.42 ) × 1.0 + ( 0.71 − 0.57 ) × 0.71 = 0.6694 (0.14−0)×1.0+(0.28−0.14)×1.0+(0.42−0.28)×1.0+(0.57−0.42)×1.0+(0.71−0.57)×0.71=0.6694 (0.14−0)×1.0+(0.28−0.14)×1.0+(0.42−0.28)×1.0+(0.57−0.42)×1.0+(0.71−0.57)×0.71=0.6694
对于表格中Recall相同的,只保留Precision最高的值进行计算,最终得到猫这一类的AP=0.6694,如果要计算mAP则需要计算出其他类别的AP,并取平均值
。
参考列表: