CNTK从⼊门到深⼊研究(1)
前⾔
微软于前些阶段正式开源⼈⼯智能⼯具包CNTK(Computational Network Toolkit),中⽂中有⼈⼯智能的意思但是实际的英⽂单词翻译起来其实是⼀个计算⽹络⼯具箱,换个⾓度说其实可以理解成是⼀种通过计算来实现⼈⼯智能的⼀种⽅式。
看似专业的名称后⾯必定需要⼀定的数学基础,本系列⽂章中会尽量的使⽤通俗的语⾔去解释这些数学原理,必要的时候会给出相关的链接(也有可能是⾃⼰单独写篇⽂章将资料总结下,也有可能是⼀个外链)。
这是⼀个新的东西,⽹上的资料很少,所以⽂章中如存在我个⼈理解错误的地⽅,请指正,以免我误⼈⼦弟。
CNTK具体是什么
CNTK按照我⽬前的理解是他是⼀套⼯具,之前可能有⼈听说过深⼊学习或者神经⽹络之类的东西,也有⼈看过斯坦福的神经⽹络的⼀些教程,CNTK只是⼀个框架或者说是⼀套简单的⼯具帮助我们实现我们所涉及的深⼊学习或者是神经⽹络。其中已经集成好很多经典的算法。当然⼤家也可以根据实际情况
去⾃⼰定义具体的算法或者输⼊输出的⽅式。
CNTK可以解决什么问题?(仅此我⽬前能想到的)
- 类别分析
- 语⾳识别
- 图像识别
- 其他?(暂时没想出来,以后继续补充)
CNTK有什么特点?
- 速度快,真的快,微软⼀直在强调这个
- ⽀持基于CUDA的GPU计算,当然也⽀持纯CPU
- 训练简单使⽤⽅便
- 其他?(暂时没想出来,以后继续补充)
*不得不说的Licen问题,CNTK的Licen是MIT的,它默认带的其他东西也⼀样,
在使⽤上没有什么⼤的限制,但是有⼀样东西⼤家在使⽤上需要注意就是
1bitSGD(SGD是Stochastic Gradient Descent, 随即梯度下降的意思),这个的
Licen特殊,只可以⾮商业性质使⽤,当然,CNTK提供了其他SGD供⼤家使⽤。
1bitSGD只有在DNN(深度深度神经⽹络)的训练以及使⽤上有所帮助。
正式介绍CNTK
上图是CNTK的总体架构,这⾥我们可以简单地分⼏部分理解,分别是上中下和左中右两种理解逻辑。
先说上中下,最下⾯的包含IDataReader这⼀层可以理解为基础的数据,你想训练⼀个典当⾏的孩⼦鉴别古董的真假,你需要先拿⼀些真真假假的古董让他⾃⼰去领会,这个就是学习的过程,也是初始数据的输⼊过程。学习的结果就是第⼆层包含CN的东西,这⾥的CN缩写我不知道是不是Computational Network,我理解的是Computational Network或者是神经⽹络的模型。可以理解为典当⾏孩⼦通过真真假假的古董所领悟到⼤脑的知识。最上⾯的IExecutionEngine其实可以理解是这个典当⾏孩⼦的个⼈⾏为,顾客拿了⼀个古董,让其鉴别其真假,这就是最上层的作⽤或者是意思。
其次左中右,最左边是输⼊的原始数据,这⾥引⼊了CN Description也就是⽹络的描述,可以理解为典当⾏孩⼦的师傅给予的指导性意见或者是古董鉴别教科书,⽽Features&草书书法欣赏
amp;Labels中的Features就是样本或者古董,Labels可以理解是古董样本上标明真真假假的标签。中间的是ICNBuilder是学习的⾏为的驱使,IDataReader是仔细观察并且检验所学内容的⾏为的驱使。最
右边的ILeaner是学习⽅法,CN之前解释过了是学习的成果,IExecutionEngine也就是最终拿来真正东西进⾏检验的⾏为。
总之CNT薄情男
K的总体架构,描述了⼀个典当⾏孩⼦的从⼊门到精通的学习过程。从样本训练⾃⼰,形成⾃⼰的能⼒,然后使⽤其所学。
神经⽹络简单的说明
(熟悉神经⽹络或者略懂的⼈可随意跳过本节,为了能让萌新也能看懂,所以写了这部分,当然可以⼀⽬⼗⾏的扫读。)
CNTK的架构图中给出的是⼀个学习的过程,学习各种⽅法,我们这⾥引⼊⼀种⽐较仿⽣学的⽅法,也就是上⽂中总出现的名词“神经⽹络”。
神经⽹络这个词顾名思义就是模仿神经细胞所连接成的⽹络。他模仿了⽣物的神经细胞,举个例⼦来
说,视觉神经从视⽹膜开始最终到⼤脑的视觉识别部分。视⽹膜将光信号转变为神经信号(⽣物电信号?),然后他经过若⼲级别的传导,最终传导到⼤脑的视觉处理部分,最终归类为⼀个类别,例如“我看到的是猫”。这⾥⾯我们个⼈只能感知到输⼊“看到的图像”,以及最终形成的意识“猫”,⽽其中间的神经细胞的传导过程我们可能不太清楚。
⼈⼯神经⽹络(artificial neural network,缩写ANN),简称神经⽹络(neural
network,缩写NN),是⼀种模仿⽣物神经⽹络(动物的中樞神經系統,特别是⼤脑)
的结构和功能的数学模型或计算模型。神经⽹络由⼤量的⼈⼯神经元联结进⾏计
算。⼤多数情况下⼈⼯神经⽹络能在外界信息的基础上改变内部结构,是⼀种⾃适
应系统。现代神经⽹络是⼀种⾮线性统计性数据建模⼯具法布尔
,常⽤来对输⼊和输出间
复杂的关系进⾏建模,或⽤来探索数据的模式。
神经⽹络是⼀种运算模型,由⼤量的節點(或稱“神經元”,或“單元”)和之間相互聯
接構成。每个节点代表⼀种特定的输出函数,称为激励函数(activation
function)。每两个节点间的连接都代表⼀个对于通过该连接信号的加权值,称之为
权重(weight),這相當於⼈⼯神經網路的記憶。⽹络的输出则依⽹络的连接⽅
式,权重值和激励函数的不同⽽不同。⽽⽹络⾃⾝通常都是对⾃然界某种算法或者
函数的逼近,也可能是对⼀种逻辑策略的表达。
其中单个的神经元可以表述为如下图描述的情况,
a开头的a1,a2之类的代表的是这个神经元的输⼊强度,w开头的w1,w2之类的代表的是相对应输⼊的有效程度,SUM可以理解为求和,然后输⼊到右边的f(f代表了某种处理逻辑,⼀般来讲是⼀个简单的逻辑函数),f的输出结果就是这个神经元给出的判断。
⼀个神经元可能不能做出来什么,但是包含若⼲神经元的神经⽹络就富有了强⼤的感知能⼒或者说变得更加智能。参考如下图所⽰的简单的情况,
神经元看起来相对⽐较简单,并且好理解,同样的⽹络也很简单,也好理解,所谓的神经元⽹络,就是把神经元链接起来,彼此连接输⼊输出,这⾥的连接⽅式不同,也就出现了⽬前所谓的不同的神经⽹络算法,也应对不同的功能和适合的情况。
神经⽹络可以分层次,也就是输⼊层,隐含层以及输出层。隐含层只是⼀个说法,其中可能包含了若⼲层。当然,层也只是⼀个描述的⼀种⽅式,归根结底就是,神经元的相互连接。
环境搭建
前⾯已经说了太多介绍,介绍了CNTK,介绍了神经⽹络,介绍了笔者⾃⼰的对此的认知。下⾯才是真正的接触CNTK。
⼤家在阅读到本⽂之前,也许已经知道CNTK的官⽹和Github的地址,但是也许您会将本⽂分享给别⼈,别⼈可以通过下⾯的地址来查阅官⽅的CNTK资料。
笔者不推荐初学者直接从Github上拉代码⾃⼰编译,反⽽我建议下载已经编译好的Binary版本直接上⼿实际操作。所以本节中我将会介绍如何部署Binary来先跑通⼀个Sample,正所谓先上⼿了解,了解了之后再拆开看⾥⾯的机制。等本系列⽂章的进⽽深⼊,笔者会带着⼤家从Github 拉代码,⼿动编译,⼿动修改,⾃⼰实现对其扩展以及深⼊的探索⾥⾯的机制。
第⼀步,下载编译好的Binary版本压缩包
这⾥其实分很多版本的,不同的操作系统(Windows或者是Linux),还分为是否使⽤基于CUDA的GPU功能。
可以参考的地址如下,这⾥⾯讲了如何部署和配置。
其中具体的下载地址如下,⼤家根据⾃⼰的情况进⾏下载,这个是CNTK的relea的页⾯。
⼤家可能发现,有好多版本啊,windows的,linux的,这个还好说,根据⾃⼰情况下载,然后解压缩,具体使⽤起来基本都⼀样。
操作系统之外,还有三个版本CPU-only,GPU,以及GPU-1bit-SGD。这⾥如果你的环境可以使秋天的夜晚作文
⽤CUDA(也就是你可以使⽤Nvidia的显卡加速),那可以选择GPU的,否则则是CPU,这⾥说⼀下1big-SGD这个,这个之前说过其Licen的问题,由于他本⾝不是MIT Licen的,所以Binary将其单独拉出来⼀个版本编译了。如果你不是商业⾏为使⽤,则没有问题,当然具体的相见Licen。
下载后将其解压,然后进⼊第⼆步,第⼀步中都不会有问题,请稳步前进⾄第⼆步。
第⼆步,解决所以依赖的环境问题
(其实这⼀步你可以先略过,先执⾏第三部之后的,当遇到问题以后再回来检查这⼀步也可以,因为这步骤的本质是解决CNTK的环境依赖问题)
⾸先,如果你是开发环境装过VS2013之类的,(具体指的是Visual C++ Redistributable for Visual St
udio 2013)。那可能没有什么问题,但是如果报错什么dll找不到啦之类的,你可以考虑去安装下“Visual C++ Redistributable for Visual Studio 2013”
其次,如果你是GPU的版本,建议更新NVIDIA的驱动到最新的版本,并且确保CUDA功能是使能的。同时,根据说明CNTK不需要⽤户⾃⼰安装CUDA的SDK,但是还是建议安装下。
最后,检查下MS-MPI SDK有没有安装。MPI是c++的多线程编程⽤的东西,微软将其列⼊HPC,使其成为其⼀部分。
第三步,设置环境变量
⾸先,按照说明⾥⾯写的,设置⼀个环境变量ACML_FMA为0(ACML_FMA=0)。
(有⼈可能问ACML_FMA是什么,笔者也好奇,搜了搜,好像是和CPU指令集有关。先设置,等后期仔细研究代码的时候,发现了在详细解读下)
其次,我建议设置⼀个新手如何买基金
Path的环境变量到CNTK中幼儿园园本培训方案
的位置(其实是为了⽅便调⽤,虽然在命令⾏中可以指定,不过需要修改Sample的⽂件或者敲命令⾏需要多带⼀个参数⽐较⿇烦),当然这个说明中没写,只是笔者⽬前条件下的⼀个建议。
完成第三步后,其实就基本完成了环境的设置了,下⾯⼀部分我们可以尝试Run⼀个CNTK中给出的例⼦。以作为这个本系列⽂章中这⼀章节的⼀个暂时的结束,这也是⼀个⼊门的基础。
运⾏⼀个提供的Sample
为了验证上节中所搭建环境的正确情况,同时为了满⾜达成CNTK⼊门条件的成就感,我们需要跑⼀个简单的Sample来验证⼀下,这⾥我们选择最简单的Simple2d成长作文题目
这个例⼦。
.\Examples\Other\Simple2d
笔者简单的介绍下这个Sample,这是⼀个分类的例⼦,训练的样本是若⼲个分布在平⾯上的⼆维坐标,包括X坐标和Y坐标,并且每⼀个点归结为⼀种类型,绘制在图标上如下图所⽰。
图上的坐标也就是训练的原始数据,Sample中给⼊的输⼊⽂件为Data⽬录下的,这⾥,每⼀⾏是⼀个输⼊数据,第⼀个数值是X,第⼆个是Y,第三个是类别0或者1。通过这些数据做训练后。使⽤做测试以检测训练的结果。
最终你能够形成⼀个如下图所⽰的神经⽹络模型。
下⾯开始运⾏这个Sample。
⾸先,打开熟悉的CMD(Win+R,cmd,回车)。⽤cd命令导航到 Config⽬录。
c莲花的象征意义
d C:\cntk\Examples\Other\Simple2d\Config
然后,运⾏如下的命令。
cntk k
这⾥会执⾏两个事情,第⼀件事是训练,第⼆件事是测试。
观察到如下图所⽰内容,即成功训练并且测试完成。
下⼀步的计划
⽬前⼤家已经知道如何使⽤Binary的Relea压缩包搭建CNTK的环境,并且也简单的运⾏了⼀个Sample。
本章内容先写到这⾥,下⼀步笔者将会从使⽤⾓度上来继续使⽤已有的Sample去讲解cntk配置⽂件的定义语法和使⽤⽅式。
CNTK很容易上⼿,但是能够配置并且拓展的东西也很多,笔者将会慢慢的进⾏学习并且拿出来与⼤
家分享。最后也将探索其实现原理。并视情况进⾏扩展。
本节完,其他章节将会持续更新……