深度学习初步,全连接神经网络,MLP从原理到实现(二)原理部分,过拟合,**函数,batchsize和epochs,训练DL模型的建议
其他两篇:
深度学习初步,全连接神经网络,MLP从原理到实现(一)原理部分,反向传播详细解释和实际计算例子
深度学习初步,全连接神经网络,MLP从原理到实现(三)实现部分,用java实现MLP
1.**函数
(1)Sigmoid
Sigmoid将所有输入压缩到0到1之间,这样造成的问题是,当随着神经网络的层次加深时,特征的变化由于sigmoid而慢慢衰减。这样会造成靠近输入层的梯度很小。
(2)ReLU
普通类型的ReLU
ReLU是现在DL流行使用的**函数,有一些变种。
ReLU实际上是一种线性的函数,
在z<0,σ(z) = 0
在z>0,σ(z) = z
(3)MaxOut
MaxOut可以自适应的训练出**函数。
将每层的神经元分组,在组内选择最大的z值作为下一层的输入,例如:
这样可以产生不同的**函数:
组内神经元数不同的效果:
怎么计算梯度呢?
因为取max操作是针对特定样本,比如:
被选中为最大,那么其对应的**函数就是线性的
,会更新
对应的权重,输入不同的样本,可能选中不同的z,
也可能会被选中更新参数。
还有其他类型的**函数,可以自己查询。
2.batch size 和 epochs
batch size的来源:将样本分批,每一批样本用来优化损失函数,这其实就是批量梯度下降,分批最好随机。。比如样本有10000个,batch size = 100,那么分批为100批,优化时需要做100次参数更新。
epochs:将样本分批后,一次epoch就是用完所有批次的样本用来梯度下降。例如:样本10000,batch size = 100,epochs = 10,每一个epoch参数更新100次,共10个epoch。
考虑下面的情况:
样本10000:
- batch size = 1,每一个epoch梯度下降10000次,更新10000次参数
- batch size = 10,每一个epoch梯度下降1000次,更新1000次参数
因为单次更新参数,计算梯度时可以并行(大量的矩阵运算可以用gpu并行)的,(2)的bach size更大更利于并行,单次epoch快于(1),但是batch size有限制,太大会占用很多内存。另外如果batch size调的太大,那么此时就直接优化比较多样本的损失(越大越接近总损失),这样容易陷入局部最小值,而batch size小一些就成了批量梯度下降,这样下降时会具有一定的随机性,有利于跳出局部最小。
3.过拟合处理(正则和dropout)
(1)正则
和线性回归和逻辑回归中的正则类似,L1和L2正则项
(2)dropout(提升模型泛化能力)
1)什么是dropout
在训练时,设定概率p,添加dropout的层中的每个神经元有p的概率被丢掉和之相连的所有权重不被更新,注意训练时才会这样操作,预测时不需要。
在预测时需要,如果概率设置p,预测时所有权重需要乘以(1-p),为什么?
如果神经元被扔掉的概率时0.5,训练时可能出现下面的情况:
在预测时,由于多了2个权重,所以计算出的z可能是训练的2倍,为了降低z,每个权重乘以1-p=0.5
2)为什么dropout有效
dropout可以被认为是一种集成学习,这里的集成概念类似于随机森林,adaboost中的集成概念。
因为每次丢掉了一些神经元,每次minibatch训练时神经网络的结构不一样。
预测时,使用了完整的神经网络结构,权重乘以1-p,它的结果会和不同结构的神经网络预测出的平均结果接近。
举个例子:设p=0.5
(1)(2)(3)(4)出现的可能都是1/4。例如(1)x1不被丢掉的概率是0.5,x2不被丢掉的概率是0.5,所以情况(1)出现的可能是0.5*0.5=0.25=1/4。总和计算4中情况的z结果,就是算一个z的期望,
0.25*z(1)+ 0.25*z(2)+ 0.25*z(3)+ 0.25*z(4) = 1/2w1x1+1/2w2x2
这样的结果和图中右下角直接对权重乘以1-p的结果相等。
上述这种情况只有当**函数是线性时成立,若非线性不成立。
但是非线性**函数使用dropout任然有效,只是可能没有线性的有效。(关于理论解释暂时不知道)
3.训练DL模型的建议
Keras注意事项:
- 做分类时,label必须要one-hot编码
- 首先关注在训练集上的效果,如果训练集上的效果都不好,那么一定有问题,如果训练集上拟合得比较好,但测试集不太好,这时可以考虑是不是过拟合了
- 损失函数的选择
- **函数的选择(见**函数小节)
- 优化算法的选择(adam是比较好的优化算法)