在上一篇文章中已经介绍了CNTK配置文件的基本语法以及组成部分。在讲解任务块部分时,有提及在一定的action情况下,需要我们定义Network Builder以定义网络模型,并执行网络模型的训练。本文将着重讲解目前CNTK中提供的两种Network Builder的使用方法。
(还存在第三种BrianScript,由于没有官方的文档作参考,所以暂时不加以评论)。
目前支持两种Network Builder(也许存在第三种), 分别是:
根据名字可以看出这个是一个简单的网络创建器。使用方式也相对简单,缺点是不够灵活。但是用于定义一些一般情况的网络模型,其所提供的功能基本已经够了。
SimpleNetworkBuilder = [
# 2 inputs, 2 hidden layers with 50 element nodes each, 2 outputs
layerSizes = 2:50*2:2
trainingCriterion = "CrossEntropyWithSoftmax"
evalCriterion = "ErrorPrediction"
layerTypes = "Sigmoid"
applyMeanVarNorm = true
]
SimpleNetworkBuilder 的网络模型定义完全由配置参数给出,下面针对每一个配置参数详细的进行说明:
initValueScale参数用于设定初始化随机数的范围。默认值为1。在使用平均分布时,随机数的产生范围是[-0.05 * initValueScale, 0.05 * initValueScale]
,在使用正态分布时,标准差的范围是0.2 * initValueScale * fanout^(-1/2)
。
layerTypes参数用于设定隐含层的非线性的操作函数类型。可以选择的取值是Sigmoid、Tanh以及RectifiedLinear。其中Sigmoid为默认值。(写LeTex的公式和找图像的图片真累,请忽略上图的softplus函数的曲线)
S(x)=11+e−x
Tanh(x)=Sinh(x)Cosh(x)=ex−e−xex+e−x
uniformInit参数用于指定初始化随机数的产生方式(是否使用平均分布),可选的值为true或者false。true代表平均分布,false标示使用正态分布。默认值为true(平均分布)。
applyMeanVarNorm参数用于指明是否针对输入数据采用使用均值/方差归一化处理。可选的值为true或者false。默认值为false。
addDropoutNodes参数用于标明是否添加drop-out节点,可选择的值为true或者false。默认值为false。当取值为true时,将会针对输入节点以及每一隐含层的输出节点添加drop-out节点。
layerSizes参数用于设定网络模型每一层的大小,为一个数组类型,其中每一项代表了改层所包含的节点数。
layerSizes=50:150:150:100
或者是
layerSizes=50:150*2:100
trainingCriterion参数用于指定训练的标准,也就是网络模型优化的目标,可选的值为CrossEntropyWithSoftmax、SquareError、CrossEntropy和ClassBasedCrossEntropyWithSoftmax。其中CrossEntropyWithSoftmax为默认值。
官方还对ClassBasedCrossEntropyWithSoftmax进行了进一步的说明,大体意思是,ClassBasedCrossEntropyWithSoftmax是基于类进行训练的,当输出很大需要被拆分到各种类去加速和评估训练的时候会很有用。
evalCriterion参数和trainingCriterion一样,区别是这个参数用于指定的是评估的标准。
确切的说笔者并非理解这个参数,只能按照文档生硬的翻译。lookupTableOrder参数按照官方给出资料的翻译是指定一个用于拓展上下文的规则,默认值是1。
recurrentLayer参数用于指定包含自激发连接层。默认设定的网络不包含任何自激发层,可以使用n1:n2:n3
这种去指定n1、n2和n3包含自激发的关系。
defaultHiddenActivity参数用于指定隐含层激活值,被用于滞后节点在第一次观察前被访问。默认值是0.1。
rnnType参数用于指定一个预定义的网络模型的类型。默认值是SIMPLENET(指定前馈神经网络)。可选的参数如下:
NDL是Network Description Language 网络定义语言的缩写,在定义一些复杂网络的时候,简单网络模型就存在了局限性,CNTK提供了NDL语言专门用于定义复杂网络,NDLNetworkBuilder就是用于解析NDL来创建网络的网络创建器。
一般情况下使用方法如下:
NDLNetworkBuilder = [
networkDescription = "$ConfigDir$/yourNetwork.ndl"
]
NDL的基本情况请参考如下链接,笔者将会将讲解CNTK的主要功能的使用以及实现原理,后期也将会简单的讲解NDL如何使用。
https://github.com/Microsoft/CNTK/wiki/NDL-Basic-concepts
NDLNetworkBuilder除了提供加载NDL文件的参数以外也提供了其他参数。
networkDescription 参数用于设定执行的NDL脚本,这里只能写一个文件,如果需要加载多个文件,可以使用后面介绍的ndlMacros
参数。
run参数用于指定NDL脚本中的内容,一般如果用于将NDL脚本写于.cntk配置文件中去执行。如果没有定义networkDescription则一般定义run参数。
load参数也用于加载NDL脚本,load参数可以加载多个多个块,需要使用“:”进行分割。load参数一般用于加载一些NDL预定义宏。
ndlMacros参数用于指定需要被加载的NDL宏文件。可以使用“+”分割来加载多个NDL文件。如果一些预定义宏需要被多个地方使用,可以考虑将ndlMacros定义在配置文件的最上层。
randomSeedOffset是一个非负的随机数的种子偏移量,用于初始化学习参数,默认是0,用户可以指定一个值用于随机数种子。
本文介绍了CNTK中提供的Network Builders的一些基本使用方法和参数。但是没有给出每个参数的使用方式。大家可以去参考CNTK给出的例子来揣测将具体的功能细节。
下一步我将会继续讲解学习方法相关的东西。目前CNTK中只提供了随即梯度下降法来作为学习方法,下一文章中,将会在其中讲解可以配置的参数以及一些基本的使用方式。
本节中仍感觉有些内容可以被补充,看情况笔者日后会慢慢补充,本节完,其他章节将会持续更新……