从零构建机器学习模型(三)模型分析及神经网络入门
听老哥的,以后文章写短点,哈哈。
1.2 模型分析(Model Exploration)
1.2.1 模型准确性(Accuracy)
数据在经过预处理之后我们就可以考虑开始构建我们的模型。
任何一个模型都存在误差,并可以被分解成两部分:偏差bias,也叫经验风险empirical risk,用来衡量模型拟合的优劣;方差variance,也成为结构风险structure risk,用来衡量模型的复杂程度,二者之和作为模型误差。一般来说模型有以下关系:
低偏差<=>低训练误差,可能导致模型过于复杂,既过拟合=>高泛化误差=>
regularize[SVM],
dropout,dropconnect[Neural Network],
prepruning,postpruning[Decision Tree],=
bootstrap[Random Forest],
data boost参考上一节
低方差<=>低泛化误差可能性,可能导致模型过于简单,既欠拟合=>高训练误差=>
重构层次[Neural Network],
boost[CART],
这么说其实并不准确,因为模型的误差取决于诸多因素:样本容量,误差限,模型复杂度三者服从概率关系,也就是一致性,参考Andrew Ng斯坦福大学公开课 :机器学习课程 经验风险最小化。而实际情况可以参考下图:
v2-aa0650fbef52674a2a138eb59ae1776e_hd.jpg我们现在来分析上面的训练图,把Capacity换成Complexity比较好,不过因为这个误差图比较典型,我们暂时采用这一张:
- Underfitting部分对应低偏差高方差,我们可以看到训练误差和测试误差相近,但都处于较高值,也就是高偏差低方差;
- Overfitting部分对应高偏差低方差,我们可以看到训练误差和测试误差差异较大,训练误差小而测试误差打,也就是高方差低偏差;
- 模型Loss函数下降过快,对应大学习率或过长的epoch,这一点会在之后的Neural Network做解释;
- 最优容量即模型的最优参数,如果此时模型准确性仍不满足要求,我们需要更新模型,调用复杂的模型并重复以上分析进行调优;
当然更多时候模型会如下图(resnet):
v2-3af17a90e525977618b5d801062b2518_hd.jpg二者的区别主要在于MLP那张图误差稳定而Resnet图有振荡。前者可能是Batch的训练方式,模型的误差会有稳定变化,而更多时候我们为了跳出局部最优并且快速收敛,会采用mini batch(也就是后者)这种一次抓取部分样本训练的方式,而这种不稳定的抓取也就导致了误差的不稳定性。
1.2.2 模型实时性(On-Time)
一般学术上的机器学习模型更多考虑的时模型的准确性,而工业上还需模型实时性。例如我们在部署基于CNN的自动驾驶深度学习模型,我们就要考虑到模型是否能保证输出的帧率。如果模型过于复杂,则可能需要大型的处理器,或是降低输入帧率,这对自动驾驶都是有很大影响的。这部分等算法部分结束再讨论可能比较合适,跳过算法直接说实时性不好解释清楚。
1.3 机器学习算法初阶
前面我们已经讨论过了构建模型的一些基本考虑,接下来我们开始讨论一下具体的算法。
1.3.1 神经网络(Neural Network)
想了一下还是从这个Deep Learning的父类开始说能比较清楚地解释机器学习的概念。基础知识我就不做介绍了,百度谷歌有很多的资料,今天先从一个问题说一下:
为什么神经网络需要激活函数?
我们在考虑通过多个特征预测结果的问题时,很自然的想法就是对所有特征进行加权组合,而最初的神经网络其实做的就是这样一件事情:
v2-19f71a7508aab1c4c2f6fcfa34832aa7_hd.jpg前半部分的加权求和(weighted sum)中权值就表征了特征的重要性,而最终的求和值就表征了预测结果。那为什么要加后面的激活函数(activation function)呢?
- 仿生学的原因。在一开始研究神经网络的时候,学者们认为每个神经的从抑制到兴奋的过程其实都是大量的输入神经递质在神经突触上聚合并在总量超越阈值的时候激活(fire)神经元,因此仿生的神经元也被加上了一个阶跃函数作为激活的过程;
- 规范化输出。神经元如果没有一个激活函数,那么它的输出是不可控的,比如在做分类,可能需要的label是0,1,但神经元在更新会有数值计算误差的问题,这时如果加上激活函数,就可以保证输出只是二值化的0,1(当然现今并不一定是这样,比如tansig和sig效果都要好一些,因为考虑到可微性);
- 激活函数的非线性化是深层网络(Multi-Layer-Perceptron)的基础,也会提升网络的表达能力。考虑这样一个事实,假设我们的yk只是加权求和,两层网络输出就会等价于单层网络的输出,可以参考下面的计算式:
第二个问题,
为什么神经网络权值更新策略是负梯度?
第二个问题,
为什么神经网络权值更新策略是负梯度?
捕获.PNG因此我们的基本更新策略就是取cost函数的负梯度
今天先为神经网络开一个头,下一章我们继续讨论神经网络的细节,东西比较多……
另外再补充具体的Resnet的变种的总结:
1.NiN(神经网络学习变换过程,内部结构是个Perceptron)
2.wide resnet(添加维数的resnet)
3.stochastic depth(依概率dropout掉resnet块)
4.identity restnet(构造标准的resnet块)
5.FractalNet(带有层次Path的Resnet)
6.Aggreated residual netword(用inception的思路添加多个resnet块)
7.Densely connected CNN(shortcut的path可以横跨种块结构)
其实总结起来就是模型的performance不仅决定于信息流过的深度(Resnet),也决定于信息流的宽度(Inception)