CNTK中目前仅提供了一种学习方法,即SGD(Stochastic Gradient Descent Learner)随机梯度下降法。本文将针对CNTK中有关SGD随机梯度下降相关的训练配置选项进行说明。本文虽说是一片交流用文章,但是更加类似于针对CNTK的内容的一些翻译,因为在讨论SGD相关内容时如果不提及其中机理,那就只剩下如何使用了。
SGD块的基本格式如下,如同其他数据块一样,很多参数都会有默认的参数,所以具体的使用时,按需要进行配置。
SGD = [ modelPath = "$ModelDir$/myModel.dnn" epochSize = 60000 minibatchSize = 32 learningRatesPerMB = 0.1 maxEpochs = 30]
modePath参数用于设定一个全路径,用于指定最终保存的网络模型文件。
trainCriterionNodeName参数用于指定一个用于训练的训练准则节点名称,如果没有指定,则会使用默认的训练准则。
evalCriterionNodeName参数通trainCriterionNodeName参数类似,用于指定一个用于评估的评估准侧节点名称,如果没有指定,则会使用默认的评估准则。
epochSize参数用于指定epoch的大小,epochSize一般默认为整个数据集的大小。每个epoch都会被保存下来。当epochSize设置为0时,则相当于设定为整个数据集大小。
keepCheckPointFiles参数用于指定是否在每个epoch开始时将检查点信息保存到一个文件中,可已设定为true或者false,默认值为false。
maxEpochs参数用于指定最大运行的epoch数。
minibatchSize参数用于指定每个mini-batch的数量。默认值为256,该参数可以指定为数组形式,例如128*2:1024代表前两个epoch使用128个样本,之后的所有epoch使用1024个样本。
dropoutRate参数用于指定在每个epoch中的去除神经元的比率。默认值为0.0,该参数可以指定为数组形式,例如0.5*10:0.2代表前两个epoch使用0.5作为dorpoutRate,之后的所有epoch使用0.2。
maxTempMemSizeInSamplesForCNN用于指定限定最大内存使用量(在打包或解包一定数量的输入时),参数为0代表不作任何限制。该参数常用与在使用GPU时控制内存堆栈栈顶位置。
learningRatesPerMB参数用于设定使用固定的学习率来执行训练过程。可以针对每个mini-Batch进行设定,使用数组的方式设定。例如0.8*10:0.2代表前10个mini-Batch使用0.8作为学习率,之后的所有mini-Batch使用0.2作为学习值。learningRatesPerMB同learningRatesPerSample冲突,所以一般情况只设定一个,如果未设定则由算法自动控制学习率。
learningRatesPerSample参数同样用于设定使用固定的学习率来执行训练过程。可以针对每个Sample进行设定,使用数组的方式设定。例如0.008*10:0.002代表前10个epoch的Sample使用0.008作为学习率,之后的所有epoch中每个Sample使用0.002作为学习值。learningRatesPerMB同learningRatesPerSample冲突,所以一般情况只设定一个,如果未设定则由算法自动控制学习率。
momentumPerMB参数用于控制每个mini-Batch学习的momentum。可使用数组方式进行设定,例如0.1*2:0.9用于指定前2个mini-Batch使用0.1作为momentum,其他的mini-Batch使用0.9。
momentumPerSample参数用于控制每个sample的momentum。同样可以使用数组的方式进行指定。momentumPerSample同momentumPerMB的关系如同learningRatesPerSample与learningRatesPerMB类似。
autoAdjust参数块包括自动学习率控制的算法相关参数配置。默认的情况下为空(”“),代表不适用任何自动调整学习率算法。autoAdjust块中,首先使用autoAdjustLR指定自动调整逻辑的算法。其他参数则是根据具体算法进行指定。
autoAdjustLR参数用于指定自动调整逻辑的算法,可选择的为None、AdjustAfterEpoch、SearchBeforeEpoch以及AdaptiveMinibatchSizing。默认为None不使用任何自动调整逻辑算法。
当autoAdjustLR设定为AdjustAfterEpoch
时:
1#INF
(无限大)。当autoAdjustLR设定为SearchBeforeEpoch
时:
当autoAdjustLR设定为AdaptiveMinibatchSizing
时:
gradientClippingWithTruncation参数用于指定是否使用梯度剪裁(the truncation based gradient clipping)来控制gradient explosion。默认值为true,如果设置为false则可能导致模型很难被训练。
clippingThresholdPerSample参数用于指定每个样本的剪裁门限。默认值为1#INF代表部剪裁。
L2RegWeight用于指定L2正规化权重,默认值为0。
L1RegWeight用于指定L2正规化权重,默认值为0。
gradUpdateType参数用于设定梯度更新方式,可选的值为None(默认值)、AdaGrad和RmsProp。
当gradUpdateType参数为AdaGrad或RmsProp时可设定如下参数:
当gradUpdateType参数为RmsProp时,还可设定如下参数:
gaussianNoiseInjectStd参数用于设定当使用AdaGrad时所注入的高斯噪声的标准差。默认值为0。
目前只支持KL散度正则化(KL divergence regularization),其他的自适应技术可以通过向网络中增加计算节点来实现(通过使用MEL网络编辑语言去编辑网络)。
adaptationRegType参数用于指定自适应类型,可以设定的值为None(默认值)或者为KL,其中KL代表KL divergence based regularization。
adaptationRegWeight参数用于指定自适应的权重,默认值为0。
traceLevel用于显示输出消息的等级,可以设置为0(默认值)或者1。
numMBsToShowResult参数用于指定当训练多少个mini-Batch后显示一次统计信息,默认值为10。
gradientCheck参数用于指定是否进行梯度检查,默认值为false。
本文基本上是根据CNTK针对SGD的文档进行翻译过来的,很多东西翻译的很死板,因为毕竟涉及到了一些算法的东西,随机梯度下降法其实是一种相对简单的下降法,参数就是那些,重要的其实就是学习率。
下一步笔者将会去研究各种Data Reader。Data Reader其实同机器学习不想关,但是由于CNTK是一个工具,仍需要将其作为软件工具箱的重要组成部分进行相关的探索与研究。
本节完,其他章节将会持续更新……
联系客服