神经网络基础
一、逻辑回归( Logic Regression )
1 问题的模型
模型:
其中xx为输入量,y^预测量,σ()激活函数。 逻辑回归主要用于二分类问题的拟合:0≤y^=P(y=1∣x)≤1,σ(z)如图:
问题:
对于模型(1.1)(1.1),需要通过一系列的样本(x,y={0,1})(x,y={0,1}),求解出系数w,bw,b。
求解:
转为最优化问题,然后对未知系数进行求解。
2 最优化问题求解
2.1 损失函数(Loss Function)
-
作用: 用于衡量单个样本,在进行模型预测后 y 与 y^之间的差距。
-
二分问题的损失函数
-
拟合问题的一般损失函数
注意:
L()函数应该是凸集,防止在寻优的过程中出现多个局部最优解。(y=x平方 就是典型的凸集)
2.2 消耗函数(Cost Function)
用于对全部的样本的预测结果进行评估。也就是最终寻优的目标函数。
2.3 寻优方法
对于目标函数JJ使用梯度下降法进行寻优,迭代更新(w,b)(w,b),最终得到使得JJ最小的变量值(w,b)(w,b)就是模型(1.1)(1.1)的解。也就完成了对于模型的训练。
二、浅层神经网络(Shallow Neural Network)
2.1 模型结构
BP神经网络层只有三层:Input layer,Hiden layer,Output layer;
节点的计算与逻辑回归相似。
2.2 激活函数
-
sigmoid
二分问题,输出节点必使用sigmoid。
-
tanh (tansig) MATLAB中的 tansig 激活函数,就是tanh的化解形式。
-
ReLU
拟合问题,输出节点必使用ReLU
-
Leaking ReLU
2.3 正向传播(frontpropagation)与反向传播(backpropagation)
-
正向传播
-
反向传播
注意:
- 代表的是:numpy.multiply()
- 上述反向传播公式只适用于二分问题
2.4 w系数初始化
- 隐含层节点的初始化值应当不同;否则会导致节点的计算结果一样,多节点无意义。
- W的初始化值应当较小;使得激活函数落在斜率大的地方,梯度下降法收敛快
改善深层神经网络
一、基础理论
1.1 超参数
对于神经网络模型而言,决定最终神经网络模型性能的系数是w和b,其余可调的系数均为超参数。
1.2 训练集、测试集和开发集
在模型生成的过程中,根据样本数据起到的作用,进行集合类型的划分。
- 训练集(Train Set): 用于模型的训练。
- 开发集(Dev Set): 用于对训练中的模型进行测试。
- 测试集(Test Set): 用于对最终的模型进行测试。
注意:训练集和开发集的数据应当来自于同一组样本。
1.3 方差(Variance)和偏差(Bias)
-
偏差
模型在样本上,输入与输出之间的误差,即模型本身的精确度。反应在训练集上。
-
方差
模型预测结果与输出期望之间的误差,即模型的稳定性。反应在开发集与训练集上。
-
关系
- 低偏差|低方差:最想要的结果。
- 低偏差|高方差: 过拟合 (overfitting) ,对测试集和开发集拟合能力差。
- 高偏差: 欠拟合 (underfitting) ,模型拟合得很差。
1.4 过拟合与欠拟合解决方案
-
过拟合
- 简化模型复杂度
- L2正则化和Dropout
- 增加样本数量
-
欠拟合
- 使用更复杂的神经网络模型
- 更换优化方法
- 增加迭代训练次数
二、正则化(regularization)
作用:降低模型的复杂度,从而防止模型的过拟合问题。
2.1 L2正则化
在梯度下降法中,对于目标函数J添加一个正则项:
这就会导致更新每一层的w系数时:
增大系数λλ便会使得w^[l]的值减小;当一个神经元节点的w≈0时,该神经元节点便在模型中失效。
2.2 Droput正则
减少一次训练样本中的节点,防止过拟合。不依赖一个特性,将权重值分散。
-
实现:将a[l] 中的某些元素置为0。(inverted dropout)
-
注意:
- 经过处理后的J无明确的意义
- 该方法主要用于图像识别
三、归一化(Normalize)
对于样本首先进行归一化处理,然后才能使用。
3.1 映射到[-1,1]
正向:
反向:
3.2 映射到[0,1]
正向:
反向:
四、系数初始化
4.1 梯度消失与梯度爆炸
假设一个深层的网络,其激活函数为线性的,且网络中的偏执系数 b[l]=0
则
进一步假设 w[l]=W 都相等
令上图网络中的 则
随着网络的加深,就会导致 a[l]a[l] 指数爆炸。
令上图网络中的 则
随着网络的加深,就会导致 a[l] 会趋近于 0
。
根据梯度求导公式
综上可得
- 当前
l-1
个的系数矩阵 WW 中的分量 wij<1 ,会导致 a[l−1] 趋近于零,进而使得 dw[l]≈0 ,即「梯度消失」 - 当前
l-1
个的系数矩阵 WW 中的分量 wij>1 ,会导致 a[l−1] 指数爆照,进而使得 dw[l] 指数爆炸 ,即「梯度爆炸」
4.2 初始值选取
对于深度的神经网络;
- 当w > 1时,从输入层到输出层,输出值将会很大
- 当w < 1时,从输入层到输出层,输出值将会很小
为了避免这些问题,需要对w值进行合理的初始化。即
其中n代表一个神经元节点输入的个数。
五、指数加权平均
对于vtvt可以认为是前1/(1-β)个v值的平均值。
在初始时刻,使用指数加权平均,会导致估计值偏差较大。在后期时刻,偏差就基本近似。所以可以对初期的估计值进行修正。
vt=vt1−βt(5.2)vt=1−βtvt(5.2)
六、Mini Batch
6.1 模型
将样本数据中的训练集再划分为多个子集,再依次利用这些子集进行模型训练。
- 子集的样本量:m≤200
- 子集的个数:2^i
- mini batch 训练过程中,J的变化是振荡。
6.2 梯度下降法
对于梯度下降法,Mini Batch的(w,b) 的变化如上图所示,是振荡的,向着最优解靠近。在这种情形下,使用梯度下降法时,学习率α不能太大。
6.3 动量梯度下降法
对变量(w,b)使用 指数加权平均 降低振荡,使得收敛过程更加的平缓。这样就能加大学习率α,减少迭代次数。
6.4 RMSprop法
在降低振荡振幅的基础上,还要缩短纵轴的波动,延长横轴的长度。
其中ϵ 是一个很小的值,防止S 为0,造成运算异常。
6.5 ADAM法
对RMSprop法和动量法的整合,改进。
七、衰减学习率
在训练的前期使用较大的学习率,在快要收敛时,使用较小的学习率。
八,超参数取值
-
采用枚举法,在一个区间内随机试;
-
对数标尺随机数的实现 从[0.001,1]之间的对数标尺随机数的实现:
r = -4 * np.randm.rand() a = 10 ** r
九,Batch Norm
9.1 原理
对一个batch样本在一个神经元节点中的所有zj[i]zj[i]进行Z标准化处理,然后再带入激活函数,求解。
注意:
- 由于对z(i)z(i)进行了标准化处理,对于系数b[i] 将没有实质意义,可以从网络中去掉;
- 引入两个调节参数β[i],γ[i] 。
9.2 μ,δ的获取
- 训练集:直接使用min-batch中的所有样本进行计算从而获取。
- 测试集:将训练集中计算得到的 μ{i},δ{i}μ{i},δ{i}进行指数平均获取到的μ,δμ,δ用于测试计算。
9.3 covariate shift
对于第3,4层神经网络而言,它们以a[2] 作为样本输入(就认为是样本定值),从而实现结果向y^靠拢。但是从整体网络上来看a[2] 受到了第1,2层网络的影响,是变化的。因此,对于a[2]就存在协变量偏移的情况。Batch Norm的作用就是将每一个神经元激活前的样本尽可能都保持在统一的一个分布内。
十、softmax回归
10.1 作用
可以对种数据类型的学习,实现多类型划分。
10.2 原理
-
激活函数
输出层的节点数量=类别的数量,并且输出层的激活函数为softmax激活函数。
其中: y^y^各个输出量的总和为1。输出结果就是样本在各个分类所占的概率。
-
损失函数
-
目标函数
10.3 输出(y)编码
-
顺序编码 对于结果按照数字顺序分类。
[ABCD]
[1234]
-
one-hot 编码
结构化机器学习策略
一、正交化(orthogonalization)
正交化:每次调整的选项最好只影响一个阶段,尽量不要影响其他阶段。
对于模型训练遇到的问题可以分四个阶段:
-
首先,确保训练集的结果能达到human-level
- 扩大模型的规模
- 更换训练方法
-
其次,开发集的结果能够让人接收
- 添加正则
- 增加训练数据量
-
然后,测试集的结果能达到目标
- 更大的训练数据量
-
最后,模型正式使用没问题
- 修改cost Function
- 修改指标
二、评价指标
评价指标是在对模型各个阶段的结果进行评价,不是cost function。
2.1 单一评价指标
评价结果好坏的标准应当体现在最终的一个值上(多个评价指标也要规划成一个指标),方便人做出判断,避免选择综合症。
-
F1 分数(调和评价)
查全率(recall):分辨出的猫的数量 / 猫的总量 查准率(precision):分类正确的量 / 总的样本量
-
加权平均
2.2 满足和优化指标
当单一评价指标不能对训练目标进行很好描述时,可以使用 满足(satisfacting metrics)+ 优化(optimizing metrics)。 将所有涉及的指标描述成一个带约束的优化问题,这样就又能形成一个单一的指标。
- optimizing metrics : 主要优化的目标。
- satisfacing metrics : 其余指标的约束条件。
2.3 什么时候应当调整指标
当前的模型指标产生的结果,偏离了或者不满足正式使用的需求,就得马上更改。
三、Human-level
3.1 自然感知问题(natural perception problem)
自然感知类问题:就是人类能根据自身经验做出判断的问题。例如:图像识别,语言识别,给人看病。。。
- 在人类的水平(human-level)以下,精度上升很快,当超过人类水平,速度缓慢,逐渐收敛
- 理论上模型能达到的最高精度称之为 贝叶斯最优估计(Bayes optimal error)
- 对于自然感知类问题,人类水平基本上靠近贝叶斯估计,也会直接用人类水平代替贝叶斯估计。
- 对于模型指标低于人类水平,上面所述的方法有效;当超过人类水平,上面所述的方法可能就效果不明显了。
3.1.1 可避免偏差(avoidable Bias)
以human-level为基准,来进行偏差和方差分析(分析方法同上一章),然后在采用不同的方法来优化模型训练。
avoidableBias=trainingerror−human−level
variance=deverror−trainingerror
3.1.2 human-level取值
human-level的取值应当根据具体的问题要求进行选择。
3.2 超人类水平问题(surpassses human-level)
超人类水平问题:模型的表现远远超过超人类水平的问题,例如广告分析,由A到B汽车行驶时间等等。 对于这些问题的表现超出人的表现,主要是因为模型训练涉及到了大量数据的处理。对于这些问题以人类水平作为基础的模型训练方案就不再适用了。
四、错误分析
当发现开发集,训练集的指标结果很差劲,可以对 开发集识别错误的样本进行人工分析。
- 将所有猜想的导致错误的原因 列向标出;所有 错误的样本 在横向列出
- 人工逐列分析各个样本错误的原因,并统计
- 最后分析结果,确定优化的方向。
五、样本的结论存在问题
5.1 问题分析
对于收集的样本,如果只是一小部分输入x与输入y之间的对应关系存在问题:
训练集:一般不用修改这些错误,因为训练集样本量大,且算法具有鲁棒性。 开发集:首先进行 错误分析 ,问题样本导致的误差挺大的,就要修正开发集。
5.2 问题修正
当发现问题很严重时,需要就行样本修正:
- 修正后,保证开发集和测试集的分布一致性。
- 也要尽量去检验那些 侥幸计算对的样本
- 修复了开发集和测试集,可能导致与训练集的分布不统一
六、训练的起步
-
先搭建一个简单的模型,不用想太多
-
进行样本错误分析与各个集的误差分析,确定模型优化方向
七、训练集与开发集,测试集分布不同
7.1 实践样本太少的样本划分
当模型实际应用的样本太少或者不好获取时,对于样本的分布就不能在采用训练集,开发集,测试集样本均匀分布的方案,应当将实践样本全划分到开发集和测试集,让模型训练是朝着期望走。
7.2 数据不匹配判别及处理
数据不匹配问题:由于开发集,测试集同训练集的分布不同,可能会导致训练的模型不能达到我们的预期。 为了观测出 是不是由于这问题导致了模型的不准确 又引入了一个 训练-开发集:该集合的样本分布与训练集相同。
当 dev error 相对于 train-dev error 比较大时,就存在数据不匹配问题。
- 对比训练集样本与实际样本之间的差别
- 增加实际情况的样本数据
- 人工制造实际情况样本数据,尽量增加数据的多样性(可能会导致对单一情况的过拟合)
八、迁移学习
迁移学习:继承其他已经成功的模型,来继续训练当前的模型。
- A模型的x与B模型的x相同
- A模型训练的样本量 相对于 B模型的样本量大的多。
- A模型最开始的几层网络能提升B模型性能的可能性最大:模型从后向前进行修改。
九、多任务学习
多任务学习:将多个训练目的全放到一个模型中进行训练。 对于无人驾驶而言,可以把识别人,车,路标等功能都集成到一个模型中进行训练。
- 多个任务可以共用一套浅层的网络
- 多个任务分开时,样本量应当能保证大体一致,数量平均
- 当效果不好时,主要因素是网络结构太小
- softmax: 分辨的是什么。多任务学习:分辨的是有什么
十、端对端学习
直接使用x映射到y,进行神经网络学习,中间不做任何的内容处理,完全的黑箱。
-
好处:
- 模型完全依赖数据
- 在x -> y的过程中,不用再考虑添加其他处理流程。
-
坏处:
- 一般需要大量的数据才能出效果
- 人工控制降低
卷积神经网络
一、卷积
1.1 数学运算
- 单步卷积:计算流程如上图所示,卷积核(过滤器)与图片颜色通道值对应相乘,然后乘积结果再相加。
-
卷积移动:如动态图所示,输入为
7x7
,卷积核3x3
,卷积核移动步长1
,输出结果为5x5
-
输出维度:
- f : 过滤器的纬度
- p : 输入图片填充的像素
- s : 过滤器在输入图像上移动的步长
当步长s不为1时,可能导致过滤器越界,所以使用floor进行向下取整。
Tip
在图像识别中所说的“卷积”和实际定义有一点小差别,图像识别省略了:对过滤器进行右对角线的翻转(对结果没啥影响,没必要算了)。图像识别中的卷积准确应当称之为:cross-correlation
。
1.2 Padding
卷积计算后,原来的图像会被缩小,为了规避这个问题,可以将原来的图像的进行边缘扩充像素。卷积核的步长一般取s=1
,那么上面的式就变为
现在要使得 no=ni,可以求解得
p=(f-1)/2
因此,只要再对原图扩充p
个像素,就能使得卷积后的图像尺寸和输入图像一样大。例如对5x5
的输入,卷积核取3x3
,步长为1
,当取p=1
时,输出结果与原图尺寸一样。
Note
从上面公式可以看出,当卷积步长为1
且卷积核的尺寸f
为奇数时,计算得到的p
值为整数。因此,一般会选用「奇数」尺寸的卷积核。例如3x3
、5x5
、7x7
等。
二、卷积操作
2.1 边缘监测
定义一个竖向的过滤器,就能实现对竖向的边缘进行监测;同样定义一个横向的过滤器,就能对一个横向的边缘进行监测。对于过滤器的值,可以自定义,不用完全是-1或者1。
2.2 其他卷积操作
卷积操作
三、卷积神经网络
3.1 卷积层
1 卷积核
Note
从上一节可以知道,对图片进行「卷积操作」后,可以对「图像特征」进行提取。因此,卷积神经网络就直接将卷积核中的所有系数都设置为w
系数,然后通过训练得到具体的卷积核。
2 三维卷积
- 输入的通道数和过滤器的通道数相同,才能进行计算。
- 所有颜色通道进行一步卷积计算后,得到一个输出结果,即颜色通道被降维。
3 卷积层结构
图中展示的卷积层:一张图像通过两个滤波器,计算得到两层结果;再将两层送入激活函数;最后将两个层重合得到输出。这里的卷积核可以设置多个。
3.2 池化层(pooling)
不同于卷积,池化的作用是将原来的像素,按照块操作,进行压缩处理。 根据压缩数据方式的不同分为:
-
max pooling
,区域内的最大值; -
average pooling
,区域求平均值。
Note
- 对于pooling的计算,每一个通道分别进行一次计算,输出结果通道数不改变。
- pooling涉及的超参数,训练集训练时视为常量。
3.3 卷积神经网络模型
- 图像刚输入的时候,靠卷积和池化提取特征,降低图片参数数量。
- 输出就是靠全连接网络(BP网络)和分类器获取估计结果。
3.4 卷积的作用
与普通神经网络相比,卷积网络大大降低了超参数的量,实现了对图像像素的压缩和特征提取。
- parameter sharing:用于一次过滤的过滤器都是一样的,数据处理过程统一,也降低了超参数的量。
- sparsity of connection:每个像素只能影响局部的结果,符合常规认知。
四、1x1 卷积
-
压缩信道并改变信道维度: 对于单信道的输入数据来说,
1x1
的卷积没啥鸟用,结果就是在原理的输入上通乘一个数,并没有对特征进行提取。但是对于多信道的输入数据,1x1
卷积实现了对输入特征图在信道方向上的压缩,例如6x6x32
的输入,经过1
个1x1
卷积核的卷积结果为6x6x1
,经过2
个1x1
卷积核的卷积结果为6x6x2
-
缩减计算次数与参数:
没有引入
1x1
卷积步骤,其乘法计算次数为:(28x28x32)x(5x5x192)=120,422,400
;卷积核系数个数为:5x5x192x32=153600
引入
1x1
卷积步骤后,其乘法计算次数为:(28x28x16)x192 + (28x28x32)x(5x5x16) = 12,433,648
;卷积核系数个数为:192*16+5x5x16x32=15872
在中间步骤中,引入
1x1
卷积,乘法计算量缩小为原来的10.3 %
,参数个数缩减为原来的10.3 %
五、卷积网络模型
5.1 经典卷积网络
5.1.1 LeNet-5
- 作用: 识别手写数字
- 特点: 提出了每个「卷积层」之后添加一个「池化层」
5.1.2 AlexNet
- 作用: 给包含有1000种类别的共120万张高分辨率图片进行分类
- 特点: 在隐含层中设置了大量的参数,并且卷积层的通道数也比较大
- 意义: 从这个网络模型开始,计算机视觉的研究开始重视深度学习的应用。
5.1.3 VGG16
- 作用: 图像分类
-
特点:
- 利用最简单的卷积和池化进行网络搭建,卷积核的尺寸越小,对于图片特征就更加的敏感。
- 更加丧心病狂的添加隐含层信道
5.2 残差网络
-
作用: 随着传统深度学习网络
Plain network
加深时,其模型预测结果并非越来越好,反而会变得更差。为了实现深层网络的学习,何凯明等人提出了「残差网络」,在dlib
库中,人脸特征描述符的预测,就利用了该网络。
-
残差块: 在计算 a[l+2] 时,添加了 a[l] 的结果
其中 M 为维度转换矩阵,当 a[l] 与 al+2的维度不一样时,需要对 a[l] 的维度进行转化,需要当作网络参数进行学习;当 a[l]与 al+2 的维度一样时 M 就是一个单位阵,不要学习。
-
残差块工作原理: 假设网络模型的训练结果为 W[l+2]=0,b[l+2]=0,则
从结论上来看看,a[l+2] 的计算结果只与 a[l]a[l] 相关, 即 [l+1] 层网络被屏蔽了,网络隐含层被减少。又由于 W[l+2]=0,b[l+2]=0 只是极端情况,实际中出现概率低, [l+1] 层肯定会起点作用的,因此最终的隐含层多的网络模型肯定比隐含层少的效果要好。
-
卷积网络: 在卷积网络中的使用方法同理。
5.3 inception 网络
- 作用: 当我们不知道当前卷积层采用哪个类型卷积核更好,还是说当前层不卷积而是进行池化的时候,这是就可以利用 inception 网络,让模型自己判断。
-
inception层: 将不同卷积核以及池化后的结果在信道方向上堆叠起来,组合成当前隐含层,这个组合层就是「inception层」。从上图中可以看出,这样设计模型后,参数量核计算量都挺大,因此应用
1x1
卷积核,实现计算量与参数压缩
其中为了保持池化后特征图的「尺寸」不变,这里在池化之前,首先对原图进行了 padding
-
inception 网络: 使劲堆叠 inception 层
5.4 GoogleNet
在 inception 网络的基础上, 为了避免梯度消失,增加了两个「辅助分类(上图红框)」用于向前传导梯度。
5.5 迁移学习
Tip
从头训练自己的模型,费时又费力,可以通过迁移学习抄别人的网络,实现偷懒。
-
方法一: 将红色框框住的部分「系数冻结」,重新训练自己任务的「输出层」
-
方法二: 对别人模型的「前面几层」进行系数冻结,后面部分自己重新训练或者设计
-
方法三: 用给人的「前面几层」是作为一个「特征转换函数」,用该特征函数对自己的样本进行预处理,之后再根据预处理结果进行模型设计
- 方法四: 将别人的的模型权重系数初始化自己模型,之后重新训练
为什么要选择别人模型的「前面几层」?
越靠前卷积层,着重的是对「局部特征」的提取;越靠后的层级则是注重对检测目标的「整体特征」进行过滤,例如对于第一层卷积得到的特征图的一个像素位置对应「原图」的3x3
,第二层卷积得到的特征图的一个像素位置对应「原图」的 5x5
,即越靠后的卷积层,看见原图区域越广,「感受野」越大。
- 感受野:特征图上的一个像素位置对应原始图多大区域。
5.6 全连接层卷积化
在传统网络中,经过卷积层特征提取后的数据最后都会接入全连接层进行最终结果的输出,然而接入全连接层后,就会导致输入的图片尺寸必须固定。
由于多通道的1x1
卷积运算和全连接层的远算其实是类似,就可以通过 1x1
的卷积操作将原来的全连接层转化为卷积层。
六、目标检测
6.1 概念区分
计算机视觉需要解决的问