您的位置:首页 > 其它

深度学习基本知识

2017-02-14 17:50 232 查看
machinelearningmastery.com/grid-search-hyperparameters-deep-learning-models-python-keras/

损失函数loss:目标函数,函数用于调整参数
评价指标metric:评价指标方法,其结果不用雨训练模型

优化函数optimizer:更新参数的方法
随机梯度是默认的.adam,RMSprop也不错.

激活函数:
推荐Relu激活函数,因为其效果更好;
sigmoid和tanh,输出层的softmax,线性和sigmoid函数。不建议尝试其它的选择。

网络拓扑结构
-试下添加一层有很多节点的隐藏层;
-试下添加一个深层的神经网络,每层节点较少;
-尝试上面2种组合;

正则项
克服训练数据过拟合的好方法。
最近很火的是droput,其在训练过程中随机的忽略一些神经节点。
L1,L2或两者之和

防止过拟合的措施:
1.dropout
2.提前结束训练(当模型在验证集上的效果变差的时候):
earlystopping:
需要在每轮训练结束后观察模型在训练集和验证集上的效果.
3.L1/L2正则化
4.soft weight sharing

理解Dropout
dropout指在深度学习网络的训练过程中,对于固定的某一层,按照一定的概率将神经网络节点从网络中“暂时”丢失。由于是暂时随机丢弃,因此每一个batch都在训练不同的网络。

dropout在训练阶段和测试阶段是不一样的,训练的时候会添加一道概率流程。

对应的训练公式也有所变化:

测试的时候,不存在丢掉节点的过程。每个节点都要参与运算。

dropout率的选择:
(1)由交叉验证,隐含节点dropout率等于0.5的时候效果最好,原因在于此时dropout随机生成的网络结构最多。
(2)dropout也可以用作一种添加噪声的方法,直接对input进行操作。输入层设为更接近1的数,保证输入变化不会太大。

dropout的缺点:其训练时间是没有dropout网络的2-3倍。
适合于训练数据集很大的情况。

学习率:
调节学习率能带来效果提升。
探索的思路:
-尝试非常大/非常小的学习率;
-根据参考文献,在常规值附件用网格化搜索
-尝试使用逐步减小的学习率;
-尝试增加一个值,然后用网格搜索
优化目标函数时的学习率,leraning_rate越小收敛速度越快;
若模型添加了更多的节点和网络层,加大学习率

2种常用学习率的调整方法
-基于时间
LearningRate= LearningRate * 1/(1 + decay * epoch)
decay可以事先指定,也可以更改,例如Decay=
LearningRate / Epochs;
momentum?
-基于drop
每隔固定时间(EpochDrop))就乘以DropRate
LearningRate= InitialLearningRate * DropRate^floor(Epoch / EpochDrop)

batchsize:
batchsize决定了下降的方向,也就是梯度值以及权重更新的频率。
一个epoch指的是训练集的所有样本都参与了一轮训练,以batchsize为一批。
当数据集比较小的时候,可以采用全数据集,这样做的好处是全部的数据集所确定的方向能够更好的代表样本总体,从而能够更加准确的向极值所在的方向移动;由于不同样本造成的梯度值差别巨大,因此选出一个全局的学习率很困难,此时用所有数据集便于选择。
当数据集变得很大时,采用全部数据集的话,一次性载入所有数据集变得不太可行,由于内存的限制;数据集变多之后,由于各个batch之间的采样差异性,各个梯度的修正值相互抵消,导致参数无法修正。

另一个极端就是每次只使用一个样本,batchsize=1,也就是在线学习。每次修正参数时都是以当前样本的梯度方向来修改,难以达到收敛。

选择一个适中的batchsize。
当数据集足够充分的时候,用一半或者更少的数据训练得到的梯度和用全部数据集训练出来的差不多。

在合理的范围内,增大batchsize的好处:
内存利用率提高了,大矩阵乘法的并行化效率提高;
跑完一次epoch(数据集)所需的迭代次数减少,对于相同数据量的处理速度变快;
在一定范围内,一般来说batchsize越大,其确定的下降方向越准确,引起训练震荡越小。

盲目增大batchsize的坏处:
内存利用率虽然提高了,但是可能导致内存容量撑不住;
跑完一次epoch(全数据集)所需迭代次数减小,要想达到相同的精度,其花费的时间增加了,对参数的修正也变慢了;
当batchsize大到一定程度,其确定的下降方向已经基本不再发生变化。

为什么模型的性能不再有提升?模型总是处于过拟合和欠拟合之间;一种快速查看模型性能的方法就是将每一步计算模型在训练集和验证集上的表现绘制成图。横轴迭代次数,纵轴accuracy。
在训练集和验证集上测试模型的准确率
-若训练集的效果好于验证集,说明可能存在过拟合的现象,尝试增加正则项;
-若训练集和验证集的准确率都很低,说明可能存在欠拟合,尝试提升模型的能力/增加迭代次数
-分析模型正确预测和错误预测的样本;

权重的初始化
经验规则:用小的随机数初始化权重
尝试所有的初始化方法,选出最好的;

使用融合方法来提升效果
1.模型融合
将训练的多个深度学习模型集成:每次训练网络模型时,以不同的方式初始化,最后的权重也收敛到不同的值.多次重复生成多个网络模型,最后集成这些模型的预测结果.其预测结果会高度相关.但可能对于难预测的样本会有一点提升.
2.视角融合
对训练数据采取完全不同的缩放的变换技巧.所选用的变化方式和问题的刻画角度差异越大,效果提升的可能性爷越大.简单的对预测结果取均值也不错.
3.stacking
用简单的线性回归的方式学习各个模型预测值的权重.把各个模型预测结果取均值的方法作为baseline.带权重的作为实验组.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: