㈠ 深度学习中的神经网络参数怎么调整
根据前一次运行的情况做调整,例如出现梯度爆炸则要调低学习速率,出现过拟合则要调高正则化参数的系数。
㈡ AI数学基础14——神经网络的参数和超参数
神经网络的参数( Parameters ),是指神经网络模型内部的配置变量,比如W、b,可以用训练的方式获得
神经网络的超参数( Hyper Parameters) ,是神经网络模型外部的配置参数,比如学习率a、隐藏层数L、隐藏层单元数、激活函数的选择、momentum、mini batch size、regularization parameters等等,这些参数不能从训练中得到, 必须手动设置, 并且影响最后的参数W和b的值 。
训练神经网络的过程,也是系统性调整神经网络超参数的过程;Andrew Ng说:“经常试试不同的超参数,勤于检查结果,看看有没有更好的超参数取值,你将会得到设定超参数的直觉”
㈢ 卷积神经网络参数解析
(1)现象:
(1-1)一次性将batch数量个样本feed神经网络,进行前向传播;然后再进行权重的调整,这样的一整个过程叫做一个回合(epoch),也即一个batch大小样本的全过程就是一次迭代。
(1-2)将训练数据分块,做成批(batch training)训练可以将多个训练数据元的loss function求和,使用梯度下降法,最小化 求和后的loss function ,进而对神经网络的参数进行优化更新
(2)一次迭代:包括前向传播计算输出向量、输出向量与label的loss计算和后向传播求loss对权重向量 w 导数(梯度下降法计算),并实现权重向量 w 的更新。
(3)优点:
(a)对梯度向量(代价函数对权值向量 w 的导数)的精确估计,保证以最快的速度下降到局部极小值的收敛性;一个batch一次梯度下降;
(b)学习过程的并行运行;
(c)更加接近随机梯度下降的算法效果;
(d)Batch Normalization 使用同批次的统计平均和偏差对数据进行正则化,加速训练,有时可提高正确率 [7]
(4)现实工程问题:存在计算机存储问题,一次加载的batch大小受到内存的影响;
(5)batch参数选择:
(5-1)从收敛速度的角度来说,小批量的样本集合是最优的,也就是我们所说的mini-batch,这时的batch size往往从几十到几百不等,但一般不会超过几千
(5-2)GPU对2的幂次的batch可李丛核以发挥更佳的性能,因此设置成16、32、64、128...时往往要比设置为整10、整100的倍数时表现更优
(6)4种加速批郑槐梯度下降的方法 [8] :
(6-1)使用动量-使用权重的 速度 而非 位置 来改变权重。
(6-2)针对不同权重参数使用不同学习率。
(6-3)RMSProp-这是Prop 的均方根 ( Mean Square ) 改进形式,Rprop 仅仅使用梯度的符号,RMSProp 是其针对 Mini-batches 的平均化版本
(6-4)利用曲率信息的最优化方法。
(1)定义:运用梯度下降算法优化loss成本函数时,权重向量的更新规则中,在梯度项前会乘以一个系数,这个系数就叫学习速率η
(2)效果:
(2-1)学习率η越小,每次迭代权值向量变化小,学习速度慢,轨迹在权值空间中较光滑,收敛慢;
(2-2)学习率η越大,每次迭代权值向量变化大,学习速度快,但是有可能使变化处于震荡中,无法收敛;
(3)处理方法:
(3-1)既要加快学习速度又要保持稳定的方法修改delta法哪掘则,即添加动量项。
(4)选择经验:
(4-1)基于经验的手动调整。 通过尝试不同的固定学习率,如0.1, 0.01, 0.001等,观察迭代次数和loss的变化关系,找到loss下降最快关系对应的学习率。
(4-2)基于策略的调整。
(4-2-1)fixed 、exponential、polynomial
(4-2-2)自适应动态调整。adadelta、adagrad、ftrl、momentum、rmsprop、sgd
(5)学习率η的调整:学习速率在学习过程中实现自适应调整(一般是衰减)
(5-1)非自适应学习速率可能不是最佳的。
(5-2)动量是一种自适应学习速率方法的参数,允许沿浅方向使用较高的速度,同时沿陡峭方向降低速度前进
(5-3)降低学习速率是必要的,因为在训练过程中,较高学习速率很可能陷入局部最小值。
参考文献:
[1] Simon Haykin. 神经网络与机器学习[M]. 机械工业出版社, 2011.
[2] 训练神经网络时如何确定batch的大小?
[3] 学习笔记:Batch Size 对深度神经网络预言能力的影响
[4] 机器学习算法中如何选取超参数:学习速率、正则项系数、minibatch size. http://blog.csdn.net/u012162613/article/details/44265967
[5] 深度学习如何设置学习率 . http://blog.csdn.net/mao_feng/article/details/52902666
[6] 调整学习速率以优化神经网络训练. https://zhuanlan.hu.com/p/28893986
[7] 机器学习中用来防止过拟合的方法有哪些?
[8] Neural Networks for Machine Learning by Geoffrey Hinton .
[9] 如何确定卷积神经网络的卷积核大小、卷积层数、每层map个数
[10] 卷积神经网络的卷积核大小、卷积层数、每层map个数都是如何确定下来的呢?
㈣ 神经网络算法中,参数的设置或者调整,有什么方法可以采用
若果对你有帮助,请点赞。
神经网络的结构(例如2输入3隐节点1输出)建好后,一般就要求神经网络里的权值和阈值。现在一般求解权值和阈值,都是采用梯度下降之类的搜索算法(梯度下降法、牛顿法、列文伯格-马跨特法、狗腿法等等),这些算法会先初始化一个解,在这个解的基础上,确定一个搜索方向和一个移动步长(各种法算确定方向和步长的方法不同,也就使各种算法适用于解决不同的问题),使初始解根据这个方向和步长移动后,能使目标函数的输出(在神经网络中就是预测误差)下降。 然后将它更新为新的解,再继续寻找下一步的移动方向的步长,这样不断的迭代下去,目标函数(神经网络中的预测误差)也不断下降,最终就能找到一个解,使得目标函数(预测误差)比较小。
而在寻解过程中,步长太大,就会搜索得不仔细,可能跨过了优秀的解,而步长太小,又会使寻解过程进行得太慢。因此,步长设置适当非常重要。
学习率对原步长(在梯度下降法中就是梯度的长度)作调整,如果学习率lr = 0.1,那么梯度下降法中每次调整的步长就是0.1*梯度,
而在matlab神经网络工具箱里的lr,代表的是初始学习率。因为matlab工具箱为了在寻解不同阶段更智能的选择合适的步长,使用的是可变学习率,它会根据上一次解的调整对目标函数带来的效果来对学习率作调整,再根据学习率决定步长。
机制如下:
if newE2/E2 > maxE_inc %若果误差上升大于阈值
lr = lr * lr_dec; %则降低学习率
else
if newE2 < E2 %若果误差减少
lr = lr * lr_inc;%则增加学习率
end
详细的可以看《神经网络之家》nnetinfo里的《[重要]写自己的BP神经网络(traingd)》一文,里面是matlab神经网络工具箱梯度下降法的简化代码
若果对你有帮助,请点赞。
祝学习愉快
㈤ 极简神经网络--如何计算神经网络的参数个数
首先,我们搭建一个神经网络,然后输出看一下参数个数
输出如下
可以看出,keras输出了每层的参数个前春前数,分别是2,16,18,三层总计36个参数
那么这些参数是如何确定的呢?
我们先来总结下规律
第一层,1个输入,1个输出,结果为2
第二层,1个输入,8个输出,结果为16
第三层,8个输入,2个森陵输出,结果为18
规律不难找,参数个数=输入个数*输出个数+输出个数
其中的原因不难分析,每个神经元其实是在进行一个y= ax+b的计算,所以他有两个参数,一个是输入的权重a,一个是偏置b,如果输入有多个值,则存在多个权重a,所以一个神经元的参数个数是 输入个数+一个偏置,如果该层有多个输出,则整体参数个数为
输出个数 *(输入个数+1)=输入个数 * 输出个数+输出个数。
1 查找use_bias参数,将Dense参数改为False,看看模型的参数数量慧清是否有变化?
2 增加Dense的activation参数,看看模型的参数数量是否有变化?
㈥ 神经网络超参数选择
深度学习模型通常由随机梯度下降算法进行训练。随机梯度下降算法有许多变形:例如 Adam、RMSProp、Adagrad 等等。这些算法都需要你设置学习率。学习率决定了在一个小批量(mini-batch)中权重在梯度方向要移动多远。
如果学习率很低,训练会变得更加可靠,但是优化会耗费较长的时间,因为朝向损失函数最小值的每个步长很小。
如果学习率很高,训练可能根本不会收敛,损失函数一直处于波动中,甚至会发散。权重的改变量可能非常大,使得优化越过最小值,使得损失函数变得更糟。
训练应当从相对较大的学习率开始。这是因为在开始时,初始的随机权重远离最优值。在训练过程中,学习率应当下降,以允许细粒度的权重更新。
参考: https://www.jiqixin.com/articles/2017-11-17-2
批次大小是每一次训练神经网络送入模型的样本数。在 合理的范围之内 ,越大的 batch size 使下降方向越准确,震荡越小,通常取值为[16,32,64,128]。
Batch_Size=全部数据集 缺点:
1) 随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
2) 以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。
Batch_Size = 1 缺点:
使用在线学习,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。
在合理范围内,增大 Batch_Size 有何好处?
1) 内存利用率提高了,大矩阵乘法的并行化效率提高。
2) 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
3) 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
盲目增大 Batch_Size 有何坏处?
1) 内存利用率提高了,但是内存容量可能撑不住了。
2) 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
3) Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
参考: https://blog.csdn.net/juronghui/article/details/78612653
迭代次数是指整个训练集输入到神经网络进行训练的次数,当测试错误率和训练错误率相差较小,且测试准确率趋于稳定时(达到最优),可认为当前迭代次数合适;当测试错误率先变小后变大时则说明迭代次数过大了,需要减小迭代次数,否则容易出现过拟合。
用激活函数给神经网络加入一些非线性因素,使得网络可以更好地解决较为复杂的问题。参考: https://blog.csdn.net/tyhj_sf/article/details/79932893
它能够把输入的连续实值变换为0和1之间的输出。
缺点:
1) 在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大。
2) Sigmoid 的 output 不是0均值,使得收敛缓慢。batch的输入能缓解这个问题。
它解决了Sigmoid函数的不是zero-centered输出问题,然而梯度消失的问题和幂运算的问题仍然存在。
tanh函数具有中心对称性,适合于有对称性的二分类
虽然简单,但却是近几年的重要成果,有以下几大优点:
1) 解决了梯度消散问题 (在正区间)
2)计算速度非常快,只需要判断输入是否大于0
3)收敛速度远快于sigmoid和tanh
ReLU也有几个需要特别注意的问题:
1)ReLU的输出不是zero-centered
2)Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
为了解决Dead ReLU Problem,提出了将ReLU的前半段设为 αx 而非 0 ,如 PReLU 。
1)深度学习往往需要大量时间来处理大量数据,模型的收敛速度是尤为重要的。所以,总体上来讲,训练深度学习网络尽量使用zero-centered数据 (可以经过数据预处理实现) 和zero-centered输出。所以要尽量选择输出具有zero-centered特点的激活函数以加快模型的收敛速度。
2)如果使用 ReLU,那么一定要小心设置 learning rate,而且要注意不要让网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
3)最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.
公式: https://www.cnblogs.com/xiaobingqianrui/p/10756046.html
优化器比较: https://blog.csdn.net/weixin_40170902/article/details/80092628
㈦ 神经网络weight参数怎么初始化
不一定,也可设置为[-1,1]之间。事实上,必须要有权值为负数,不然只有激活神经元,没有抑制的也不行。至于为什么在[-1,1]之间就足够了,这是因为归一化和Sigmoid函数输出区间限制这两个原因。一般在编程时,设置一个矩阵为bounds=ones(S,1)*[-1,1]; %权值上下界。
在MATLAB中,可以直接使用net = init(net);来初始化。我们可以通过设定网络参数net.initFcn和net.layer{i}.initFcn这一技巧来初始化一个给定的网络。net.initFcn用来决定整个网络的初始化函数。前馈网络的缺省值为initlay,它允许每一层用单独的初始化函数。设定了net.initFcn ,那么参数net.layer{i}.initFcn 也要设定用来决定每一层的初始化函数。对前馈网络来说,有两种不同的初始化方式经常被用到:initwb和initnw。initwb函数根据每一层自己的初始化参数(net.inputWeights{i,j}.initFcn)初始化权重矩阵和偏置。前馈网络的初始化权重通常设为rands,它使权重在-1到1之间随机取值。这种方式经常用在转换函数是线性函数时。initnw通常用于转换函数是曲线函数。它根据Nguyen和Widrow[NgWi90]为层产生初始权重和偏置值,使得每层神经元的活动区域能大致平坦的分布在输入空间。
㈧ 深层神经网络的超参数调试、正则化及优化
训练集 ( Training set )
作用是用来拟合模型,通过设置分类器的参数,训练分类模型。后续结合验证集作用时,会选出同一参数的不同取值,拟合出多个分类器。
验证集 ( Dev set )
作用是当通过训练集训练出多个模型后,为了能找出效果最佳的模型,使用各个模型对验证集数据进行预测,并记录模型准确率。选出效果最佳的模型所对应的参数,即用来调整模型参数。如svm中的参数c和核函数等。
测试集 ( Test set )
通过训练集和验证集得出最优模型后,使用测试集进行模型预测。用来衡量该最优模型的性能和分类能力。即可以把测试集当做从来不存在的数据集,当已经确定模型参数后,使用测试集进行模型性能评价。
一个有助于理解的形象比喻:
训练集 —— 课本,学生根据课本里的内容来掌握知识。
验证集 —— 作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。
测试集 —— 考试,考的题是平常都没有见过,考察学生举一反三的能力。
训练集 直接参与了模型调参的过程,显然不能用来反映模型真实的能力(防止课本死记硬背的学生拥有最好的成绩,即防止 过拟合 ) 。
验证集 参与了人工调参(超参数)的过程,也不能用来最终评判一个模型(刷题库的学生不代表其学习能力强)。
所以要通过最终的考试 (测试集) 来考察一个学生(模型)真正的能力。
如何将只有一个包含m个样例的数据集D,产生出训练集S和测试集T(验证集可以省略)?主要有以下三种方法:
自助法 ( bootstrapping )
给定m个样本的数据集D,我们对它进行采样产生数据集D',每次随机从D中挑选一个样本,将其拷贝入D',然后再将样本放回原始数据集D。显然,该样本在下次采样时任然有可能被采到。这个过程重复m次后,我们就得到了含有m个样本的数据集D',这就是自助采样的结果。 样本有重复采样,也有一次也没有被采到的。从未采到的结果是 ,取极限得到
因此,使用自助法约有1/3的数据集没有被选中过,它们用于测试,这种方式叫“外包估计”。
自助法在数据集小,难以划分训练集、测试集的时候有很大的效果,如果数据集足够大的时候,留出法和交叉验证是更好的选择。
留出法 ( hold-out )
将整个数据集D划分为两个互斥的集合,其中一个作为训练集S,另一个作为测试集T。即,D=S∪T,S∩T=∅。在S上训练出模型,T作为测试集,来评估模型效果。
当样本数据量较小(10000条左右及以下)时,通常取其中70%作为训练集,30%作为测试集;或60%作为训练集,验证集和测试集各20%。
交叉验证法 ( cross validation )
如图所示,交叉验证法的实现流程大致如下:
(1) 将整个数据集分成k个大小相似的子集,即D=D1∪D2∪...∪Dk,Di∩Dj=∅(故又称k折交叉验证法,通常取k=10 )。
(2) 对于每一个模型Mi,算法执行k次,每次选择一个Sj(1≤j≤k)作为测试集,其它作为训练集来训练模型Mi,把训练得到的模型在Sj上进行测试,这样一来,每次都会得到一个误差E,最后对k次得到的误差求平均,就可以得到模型Mi的泛化误差。
(3) 算法选择具有最小泛化误差的模型作为最终模型,并且在整个训练集上再次训练该模型,从而得到最终的模型。
交叉验证的主要的目的是 为了选择不同的模型类型(比如一次线性模型、非线性模型) ,而 不是为了选择具体模型的具体参数 。比如在BP神经网络中,其目的主要为了选择模型的层数、神经元的激活函数、每层模型的神经元个数(即所谓的超参数),每一层网络神经元连接的最终权重是在模型选择(即K折交叉验证)之后,由全部的训练数据重新训练。
假设这就是数据集,显然用简单分类器(如逻辑回归)并不能很好地拟合上述数据。这种情况称为 欠拟合 。
相反地,如果采用一个非常复杂的分类器(如深度神经网络或含有隐藏单元的神经网络),拟合效果会非常好。但与此同时,模型的复杂度也会过高,这种称为 过拟合 。
在两者之间,可能会存在一些复杂程度适中、数据拟合适度的分类器,拟合结果较为合理,称为 适度拟合 。
如上图所示,训练集误差和验证集误差均较高时为 高偏差(欠拟合) 情况;训练集误差较高,验证集误差较高低时为 高方差(过拟合) 情况。
(1) 如何减小偏差(防止欠拟合)
① 增大神经网络规模。
(2) 如何减小方差(防止过拟合)
① 增加数据集样本数量;
② 正则化。
参数 是指神经网络中由数据驱动并进行调整的变量,如𝑊和𝑏。
超参数 是指无需数据驱动,而是在训练前或者训练中人为进行调整的变量。例如算法中的learning rate 𝑎(学习率)、iterations(梯度下降法循环的数量)、𝐿(隐藏层数目)、𝑛[𝑙](隐藏层单元数目)、choice of activation function(激活函数的选择)等都需要人为设置,这些数字实际上控制了最后的参数𝑊和𝑏的值,所以它们被称作超参数。
神经网络中的超参数主要分为三类:网络参数、优化参数、正则化参数。
网络参数
可指网络层与层之间的交互方式(相加、相乘或者串接等)、卷积核数量和卷积核尺寸、网络层数(也称深度)和激活函数等。
优化参数
一般指学习率(learning rate)、批样本数量(batch size)、不同优化器的参数以及部分损失函数的可调参数等。
正则化参数
权重衰减系数,随机失活比率(dropout)等。
正则化有利于减小训练集和验证集准确率的方差,防止过拟合。在无法增加样本数量或增加样本数量的成本过高时,正则化是一种行之有效的方法。
一般将任意 维向量 的 - 范数定义为
根据定义:
当 时, 的 范数为 ,表示向量 中非0元素的个数。
当 时, 的 范数为 ,等于向量 中所有元素的绝对值之和。
当 时, 的 范数为 ,等于向量 中所有元素的平方和开根号。
正则化(Regularization) 的主要目的是控制模型复杂度,减小过拟合。最基本的正则化方法是在原目标(代价)函数 中添加惩罚项,对复杂度高的模型进行“惩罚”。
对于神经网络模型, 正则化即在其代价函数中添加 正则项:
其中, 。之后再求解优化问题 即可。
假设某三层神经网络存在过拟合问题,采用dropout正则化会遍历网络的每一层,并设置消除该层中每一个节点的概率(比如0.5),最后得到一个节点更少、规模更小的网络,然后再用反向传播方法进行训练,就能有效防止过拟合。
最常用的方法是 inverted dropout(反向随机失活) 。对于一个三层神经网络( ),以第三层为例,实施dropout的步骤如下:
① 定义一个三层dropout矩阵d3:
d3=numpy.random.rand(a3.shape[0],a3.shape[1])
其中,a3表示神经网络第三层的激活函数矩阵。
② 设置 ( )的大小。 表示保留某个隐藏单元的概率。将第①步产生的随机矩阵d3的每个元素与 进行比较,小于置1,大于置0,得到新的d3矩阵(1表示保留该节点,0表示删除该节点)。
③ 将a3与新的d3矩阵相乘(矩阵对应元素相乘),得到新的激活函数矩阵:
a3 =np.multiply(a3,d3)
④ 将新的a3矩阵除以keep-prob:
a3 /= keep_prob
目的是保证a3的期望值(均值)不变,从而保证第三层的输出不变。
① 使用dropout可以使得部分节点失活,可以起到简化神经网络结构的作用,从而起到正则化的作用。
② 因为dropout是使得神经网络的节点随机失活,这样会让神经网络在训练的时候不会使得某一个节点权重过大。因为该节点输入的特征可能会被清除,所以神经网络的节点不能依赖任何输入的特征。dropout最终会产生收缩权重的平方范数的效果,来压缩权重,达到类似于 正则化的效果。
① dropout在测试阶段不需要使用,因为如果在测试阶段使用dropout可能会导致预测值产生随机变化(因为dropout使节点随机失活)。而且,在训练阶段已经将权重参数除以keep-prob来保证输出的期望值不变,所以在测试阶段没必要再使用dropout。
② 神经网络的不同层在使用dropout的时候,keep-prob可以不同。因为可能有的层参数比较多,比较复杂,keep-prob可以小一些,而对于结构比较简单的层,keep-prob的值可以大一些甚至为1,keep-prob等于1表示不使用dropout,即该层的所有节点都保留。
加快训练速度。
对于一个神经网络模型,考虑其代价函数:
如果未归一化输入,其代价函数的形状会较为细长狭窄。在这样的代价函数的限制下,为避免陷入局部最优解,梯度下降法的学习率必须设置得非常小。
如果归一化输入,代价函数便呈现球形轮廓。这种情况下,不论从哪个位置开始梯度下降法,都能使用较大的学习率,从而更快速、直接地找到全局最优解。
对于包含n个特征的m个样本的数据集,其输入归一化的过程主要分为两步:
① 零均值化
② 归一化方差
其中, 代表第 个样本的特征矩阵。
训练集、验证集、测试集特征矩阵的平均值 和标准差 要保持一致,确保它们归一化后符合同一分布。
㈨ 神经网络参数hyper-parameters选择
我们到目前为止在神经网络中使用了好几个参数, hyper-parameters包括:
学习率(learning rate):η
Regularization parameter:λ
之前只是设置了一些合适的值, 如何来选择合适的hyper-parameters呢?
例如:
我们设置如下参数:
隐藏层: 30个神经元, mini-batch size: 10, 训练30个薯正epochs
η=10.0, λ=1000.0
>>>importmnist_loader>>>
training_data,validation_data,test_data=\...mnist_loader.load_data_wrapper()
>>>importnetwork2>>>net=network2.Network([784,30,10]) >>数氏悔>net.SGD(training_data,30,10,10.0,lmbda=1000.0,...evaluation_data=validation_data,monitor_evaluation_accuracy=True)
结果:
结果: Epoch 0 training complete Accuracy on evaluation data: 1030 / 10000
Epoch 1 training complete Accuracy on evaluation data: 990 / 10000
Epoch 2 training complete Accuracy on evaluation data: 1009 / 10000
差到跟随机猜测一样!
神经网络中可变化调整的因素很多:
神经网络结构::层数、每层神经元个数多少
初始化w和b的方法
Cost函数(目标定义的cost函数最小)
Regularization: L1、L2(减少overfitting的方式)
Sigmoid输出还是Softmax?
使用Droput?
训练集大小
mini-batch size()
学习率(learning rate):η
Regularization parameter:λ
总体策略:
从简单的出发:开始实验,循环的个数减小
如:MNIST数据集, 开始不知如何设置, 可以先简化使用0,1两类图, 减少80%数据量, 用两层神经网络[784, 2] (比[784, 30, 2]快),取得设置是否合理?核困
更快的获取反馈: 之前每个epoch来检测准确率, 可以替换为每1000个图之后,或者减少validation set的量, 比如用100代替10000
重复实验:
>>> net = network2.Network([784, 10])
>>> net.SGD(training_data[:1000], 30, 10, 10.0, lmbda = 1000.0, \ ... evaluation_data=validation_data[:100], \ ... monitor_evaluation_accuracy=True)
Epoch 0 training complete Accuracy on evaluation data: 10 / 100
Epoch 1 training complete Accuracy on evaluation data: 10 / 100
Epoch 2 training complete Accuracy on evaluation data: 10 / 100
更快得到反馈, 之前可能每轮要等10秒,现在不到1秒: λ之前设置为1000, 因为减少了训练集的数量, λ为了保证weight decay一样,对应的减少λ = 20.0
>>> net = network2.Network([784, 10])
>>> net.SGD(training_data[:1000], 30, 10, 10.0, lmbda = 20.0, \ ... evaluation_data=validation_data[:100], \ ... monitor_evaluation_accuracy=True)
结果:
Epoch0 training complete Accuracy one valuationdata:12/100
Epoch1 training complete Accuracy one valuationdata:14/100
Epoch2 training complete Accuracy one valuationdata:25/100
Epoch3 training complete Accuracy one valuationdata:18/100
也许学习率η=10.0太低? 应该更高?增大到100:
>>>net=network2.Network([784,10])
>>>net.SGD(training_data[:1000],30,10,100.0,lmbda=20.0,\...evaluation_data=validation_data[:100],\...monitor_evaluation_accuracy=True)
结果:
Epoch0 training complete Accuracy one valuationdata:10/100
Epoch1 training complete Accuracy one valuationdata:10/100
Epoch2 training complete Accuracy one valuationdata:10/100
Epoch3 training complete Accuracy one valuationdata:10/100
结果非常差, 也许结果学习率应该更低? =10
>>>net=network2.Network([784,10])
>>>net.SGD(training_data[:1000],30,10,1.0,lmbda=20.0,\...evaluation_data=validation_data[:100],\...monitor_evaluation_accuracy=True)
结果好很多:
Epoch0 training complete Accuracy one valuationdata:62/100
Epoch1 training complete Accuracy one valuationdata:42/100
Epoch2 training complete Accuracy one valuationdata:43/100
Epoch3 training complete Accuracy one valuationdata:61/100
假设保持其他参数不变: 30 epochs, mini-batch size: 10,λ=5.0
实验学习率=0.025, 0.25, 2.5
如果学习率太大,可能造成越走越高,跳过局部最低点 太小,学习可能太慢
对于学习率, 可以从0.001, 0.01, 0.1, 1, 10 开始尝试, 如果发现cost开始增大, 停止, 实验更小的微调 。
对于MNIST, 先找到0.1, 然后0.5, 然后0.25。
对于提前停止学习的条件设置, 如果accuracy在一段时间内变化很小 (不是一两次,5到10次变化很小)。
之前一直使用学习率是常数, 可以开始设置大一下, 后面逐渐减少: 比如开始设定常数, 直到在验证集上准确率开始下降, 减少学习率 (/2, /3)。
对于regularization parameterλ:
先不设定regularization, 把学习率调整好, 然后再开始实验λ, 1.0, 10, 100..., 找到合适的, 再微调。
对于mini-batch size:
太小: 没有充分利用矩阵计算的library和硬件的整合的快速计算。
太大: 更新权重和偏向不够频繁。
好在mini-batch size和其他参数变化相对独立, 所以不用重新尝试, 一旦选定。
自动搜索: 网格状搜索各种参数组合
(grid search) 2012**Random search for hyper-parameter optimization, by James Bergstra and Yoshua Bengio (2012). by James Bergstra and Yoshua Bengio 1998
paper**Efficient BackProp, by Yann LeCun, Léon Bottou, Genevieve Orr and Klaus-Robert Müller (1998) by Yann LeCun, Léon Bottou, Genevieve Orr and Klaus-Robert Müller.
参数之前会互相影响 如何选择合适的hyper-parameters仍是一个正在研究的课题,
随机梯度下降有没有其他变种: Hessian 优化, Momentum-based gradient descent
除了sigmoid,其他人工神经网络的模型?
tanh
tanh(w⋅x+b)
要靠实验比较rectified、linear和sigmoid,tanh的好坏,目前神经网络还有很多方面理论基础需要研究,为什么学习能力强,现在的一些实验表明结果比较好,但发展底层理论基础还有很长的路要走。
㈩ SPSS的神经网络模型参数设置疑问
1神经网络对于定量数据也能用
2因子根据具体研究面对确定
3比例3:7,也可以cross
4验证集必须
5这些就多了,有数学公式