CNTK从入门到深入研究(3) - Network Builders

前言

在上一篇文章中已经介绍了CNTK配置文件的基本语法以及组成部分。在讲解任务块部分时,有提及在一定的action情况下,需要我们定义Network Builder以定义网络模型,并执行网络模型的训练。本文将着重讲解目前CNTK中提供的两种Network Builder的使用方法。
(还存在第三种BrianScript,由于没有官方的文档作参考,所以暂时不加以评论)。

Network Builders 网络创建器

目前支持两种Network Builder(也许存在第三种), 分别是:

  • SimpleNetworkBuilder
  • NDLNetworkBuilder
  • BrianScript(这个是在代码中发现的第三种,但是没有详细记录如何使用)

SimpleNetworkBuilder

根据名字可以看出这个是一个简单的网络创建器。使用方式也相对简单,缺点是不够灵活。但是用于定义一些一般情况的网络模型,其所提供的功能基本已经够了。

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

initValueScale参数用于设定初始化随机数的范围。默认值为1。在使用平均分布时,随机数的产生范围是[-0.05 * initValueScale, 0.05 * initValueScale],在使用正态分布时,标准差的范围是0.2 * initValueScale * fanout^(-1/2)

layerTypes

layerTypes参数用于设定隐含层的非线性的操作函数类型。可以选择的取值是SigmoidTanh以及RectifiedLinear。其中Sigmoid为默认值。(写LeTex的公式和找图像的图片真累,请忽略上图的softplus函数的曲线)

Sigmoid函数

S(x)=11+ex

CNTK从入门到深入研究(3) - Network Builders_第1张图片

Tanh函数:

Tanh(x)=Sinh(x)Cosh(x)=exexex+ex

RectifiedLinear函数

  • hard ReLU: f(x)=Max(0,x)
  • Noise ReLU: f(x)=Max(0,x+N(0,σ(x))

CNTK从入门到深入研究(3) - Network Builders_第2张图片

uniformInit

uniformInit参数用于指定初始化随机数的产生方式(是否使用平均分布),可选的值为true或者false。true代表平均分布,false标示使用正态分布。默认值为true(平均分布)。

applyMeanVarNorm

applyMeanVarNorm参数用于指明是否针对输入数据采用使用均值/方差归一化处理。可选的值为true或者false。默认值为false。

addDropoutNodes

addDropoutNodes参数用于标明是否添加drop-out节点,可选择的值为true或者false。默认值为false。当取值为true时,将会针对输入节点以及每一隐含层的输出节点添加drop-out节点。

layerSizes

layerSizes参数用于设定网络模型每一层的大小,为一个数组类型,其中每一项代表了改层所包含的节点数。

layerSizes=50:150:150:100

或者是

layerSizes=50:150*2:100

trainingCriterion

trainingCriterion参数用于指定训练的标准,也就是网络模型优化的目标,可选的值为CrossEntropyWithSoftmax、SquareError、CrossEntropy和ClassBasedCrossEntropyWithSoftmax。其中CrossEntropyWithSoftmax为默认值。
官方还对ClassBasedCrossEntropyWithSoftmax进行了进一步的说明,大体意思是,ClassBasedCrossEntropyWithSoftmax是基于类进行训练的,当输出很大需要被拆分到各种类去加速和评估训练的时候会很有用。

evalCriterion

evalCriterion参数和trainingCriterion一样,区别是这个参数用于指定的是评估的标准。

lookupTableOrder

确切的说笔者并非理解这个参数,只能按照文档生硬的翻译。lookupTableOrder参数按照官方给出资料的翻译是指定一个用于拓展上下文的规则,默认值是1。

recurrentLayer

recurrentLayer参数用于指定包含自激发连接层。默认设定的网络不包含任何自激发层,可以使用n1:n2:n3 这种去指定n1、n2和n3包含自激发的关系。

defaultHiddenActivity

defaultHiddenActivity参数用于指定隐含层激活值,被用于滞后节点在第一次观察前被访问。默认值是0.1。

rnnType

rnnType参数用于指定一个预定义的网络模型的类型。默认值是SIMPLENET(指定前馈神经网络)。可选的参数如下:

  • SIMPLENET: feedforward neural network 前馈神经网络
  • SIMPLERNN: 简单的RNN(递归神经网络)网络,可能是一个包含了若干个循环的回环。
  • CLASSLM:基于类的简单递归神经网络。它采用稀疏输入,稀疏参数和稀疏输出。经常用于语言建模的情况使用。
  • LBLM: Hinton在研究RBM时,结合神经网络语言模型提出了三种基于RBM的语言模型,这个是其中的Log-BiLinear。
  • LSTM: the long short-term memory neural network.
  • CLASSLSTM: 及鱼类的LSTM。它采用稀疏输入,稀疏参数和稀疏输出。经常用于语言建模的情况使用。

NDLNetworkBuilder

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

networkDescription 参数用于设定执行的NDL脚本,这里只能写一个文件,如果需要加载多个文件,可以使用后面介绍的ndlMacros参数。

run

run参数用于指定NDL脚本中的内容,一般如果用于将NDL脚本写于.cntk配置文件中去执行。如果没有定义networkDescription则一般定义run参数。

load

load参数也用于加载NDL脚本,load参数可以加载多个多个块,需要使用“:”进行分割。load参数一般用于加载一些NDL预定义宏。

ndlMacros

ndlMacros参数用于指定需要被加载的NDL宏文件。可以使用“+”分割来加载多个NDL文件。如果一些预定义宏需要被多个地方使用,可以考虑将ndlMacros定义在配置文件的最上层。

randomSeedOffset

randomSeedOffset是一个非负的随机数的种子偏移量,用于初始化学习参数,默认是0,用户可以指定一个值用于随机数种子。

总结及下一步的计划

本文介绍了CNTK中提供的Network Builders的一些基本使用方法和参数。但是没有给出每个参数的使用方式。大家可以去参考CNTK给出的例子来揣测将具体的功能细节。

下一步我将会继续讲解学习方法相关的东西。目前CNTK中只提供了随即梯度下降法来作为学习方法,下一文章中,将会在其中讲解可以配置的参数以及一些基本的使用方式。

本节中仍感觉有些内容可以被补充,看情况笔者日后会慢慢补充,本节完,其他章节将会持续更新……

你可能感兴趣的:(人工智能,微软,神经网络,深度学习,CNTK)