CNTK从入门到深入研究(1) - 一切都从介绍和环境搭建开始

前言

微软于前些阶段正式开源人工智能工具包CNTK(Computational Network Toolkit),中文中有人工智能的意思但是实际的英文单词翻译起来其实是一个计算网络工具箱,换个角度说其实可以理解成是一种通过计算来实现人工智能的一种方式。

看似专业的名称后面必定需要一定的数学基础,本系列文章中会尽量的使用通俗的语言去解释这些数学原理,必要的时候会给出相关的链接(也有可能是自己单独写篇文章将资料总结下,也有可能是一个外链)。

这是一个新的东西,网上的资料很少,所以文章中如存在我个人理解错误的地方,请指正,以免我误人子弟。

CNTK具体是什么

CNTK按照我目前的理解是他是一套工具,之前可能有人听说过深入学习或者神经网络之类的东西,也有人看过斯坦福的神经网络的一些教程,CNTK只是一个框架或者说是一套简单的工具帮助我们实现我们所涉及的深入学习或者是神经网络。其中已经集成好很多经典的算法。当然大家也可以根据实际情况去自己定义具体的算法或者输入输出的方式。

CNTK可以解决什么问题?(仅此我目前能想到的)
- 类别分析
- 语音识别
- 图像识别
- 其他?(暂时没想出来,以后继续补充)

CNTK有什么特点?
- 速度快,真的快,微软一直在强调这个
- 支持基于CUDA的GPU计算,当然也支持纯CPU
- 训练简单使用方便
- 其他?(暂时没想出来,以后继续补充)

*不得不说的License问题,CNTK的License是MIT的,它默认带的其他东西也一样,在使用上没有什么大的限制,但是有一样东西大家在使用上需要注意就是1bitSGD(SGD是Stochastic Gradient Descent, 随即梯度下降的意思),这个的License特殊,只可以非商业性质使用,当然,CNTK提供了其他SGD供大家使用。1bitSGD只有在DNN(深度深度神经网络)的训练以及使用上有所帮助。

正式介绍CNTK

上图是CNTK的总体架构,这里我们可以简单地分几部分理解,分别是上中下和左中右两种理解逻辑。

先说上中下,最下面的包含IDataReader这一层可以理解为基础的数据,你想训练一个典当行的孩子鉴别古董的真假,你需要先拿一些真真假假的古董让他自己去领会,这个就是学习的过程,也是初始数据的输入过程。学习的结果就是第二层包含CN的东西,这里的CN缩写我不知道是不是Computational Network,我理解的是Computational Network或者是神经网络的模型。可以理解为典当行孩子通过真真假假的古董所领悟到大脑的知识。最上面的IExecutionEngine其实可以理解是这个典当行孩子的个人行为,顾客拿了一个古董,让其鉴别其真假,这就是最上层的作用或者是意思。

其次左中右,最左边是输入的原始数据,这里引入了CN Description也就是网络的描述,可以理解为典当行孩子的师傅给予的指导性意见或者是古董鉴别教科书,而Features&Labels中的Features就是样本或者古董,Labels可以理解是古董样本上标明真真假假的标签。中间的是ICNBuilder是学习的行为的驱使,IDataReader是仔细观察并且检验所学内容的行为的驱使。最右边的ILeaner是学习方法,CN之前解释过了是学习的成果,IExecutionEngine也就是最终拿来真正东西进行检验的行为。

总之CNTK的总体架构,描述了一个典当行孩子的从入门到精通的学习过程。从样本训练自己,形成自己的能力,然后使用其所学。

神经网络简单的说明

(熟悉神经网络或者略懂的人可随意跳过本节,为了能让萌新也能看懂,所以写了这部分,当然可以一目十行的扫读。)

CNTK的架构图中给出的是一个学习的过程,学习各种方法,我们这里引入一种比较仿生学的方法,也就是上文中总出现的名词“神经网络”。

神经网络这个词顾名思义就是模仿神经细胞所连接成的网络。他模仿了生物的神经细胞,举个例子来说,视觉神经从视网膜开始最终到大脑的视觉识别部分。视网膜将光信号转变为神经信号(生物电信号?),然后他经过若干级别的传导,最终传导到大脑的视觉处理部分,最终归类为一个类别,例如“我看到的是猫”。这里面我们个人只能感知到输入“看到的图像”,以及最终形成的意识“猫”,而其中间的神经细胞的传导过程我们可能不太清楚。

人工神经网络(artificial neural network,缩写ANN),简称神经网络(neural network,缩写NN),是一种模仿生物神经网络(动物的中樞神經系統,特别是大脑)的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。大多数情况下人工神经网络能在外界信息的基础上改变内部结构,是一种自适应系统。现代神经网络是一种非线性统计性数据建模工具,常用来对输入和输出间复杂的关系进行建模,或用来探索数据的模式。

神经网络是一种运算模型,由大量的節點(或稱“神經元”,或“單元”)和之間相互聯接構成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重(weight),這相當於人工神經網路的記憶。网络的输出则依网络的连接方式,权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。

https://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C

其中单个的神经元可以表述为如下图描述的情况,
CNTK从入门到深入研究(1) - 一切都从介绍和环境搭建开始_第1张图片

a开头的a1,a2之类的代表的是这个神经元的输入强度,w开头的w1,w2之类的代表的是相对应输入的有效程度,SUM可以理解为求和,然后输入到右边的f(f代表了某种处理逻辑,一般来讲是一个简单的逻辑函数),f的输出结果就是这个神经元给出的判断。

一个神经元可能不能做出来什么,但是包含若干神经元的神经网络就富有了强大的感知能力或者说变得更加智能。参考如下图所示的简单的情况,

神经元看起来相对比较简单,并且好理解,同样的网络也很简单,也好理解,所谓的神经元网络,就是把神经元链接起来,彼此连接输入输出,这里的连接方式不同,也就出现了目前所谓的不同的神经网络算法,也应对不同的功能和适合的情况。

神经网络可以分层次,也就是输入层,隐含层以及输出层。隐含层只是一个说法,其中可能包含了若干层。当然,层也只是一个描述的一种方式,归根结底就是,神经元的相互连接。

环境搭建

前面已经说了太多介绍,介绍了CNTK,介绍了神经网络,介绍了笔者自己的对此的认知。下面才是真正的接触CNTK。
大家在阅读到本文之前,也许已经知道CNTK的官网和Github的地址,但是也许您会将本文分享给别人,别人可以通过下面的地址来查阅官方的CNTK资料。

CNTK官网:http://www.cntk.ai/
CNTK的Github地址:https://github.com/Microsoft/CNTK

笔者不推荐初学者直接从Github上拉代码自己编译,反而我建议下载已经编译好的Binary版本直接上手实际操作。所以本节中我将会介绍如何部署Binary来先跑通一个Sample,正所谓先上手了解,了解了之后再拆开看里面的机制。等本系列文章的进而深入,笔者会带着大家从Github拉代码,手动编译,手动修改,自己实现对其扩展以及深入的探索里面的机制。

第一步,下载编译好的Binary版本压缩包

这里其实分很多版本的,不同的操作系统(Windows或者是Linux),还分为是否使用基于CUDA的GPU功能。
可以参考的地址如下,这里面讲了如何部署和配置。

https://github.com/Microsoft/CNTK/wiki/CNTK-Binary-Download-and-Configuration

其中具体的下载地址如下,大家根据自己的情况进行下载,这个是CNTK的release的页面。

https://github.com/Microsoft/CNTK/releases

大家可能发现,有好多版本啊,windows的,linux的,这个还好说,根据自己情况下载,然后解压缩,具体使用起来基本都一样。
操作系统之外,还有三个版本CPU-only,GPU,以及GPU-1bit-SGD。这里如果你的环境可以使用CUDA(也就是你可以使用Nvidia的显卡加速),那可以选择GPU的,否则则是CPU,这里说一下1big-SGD这个,这个之前说过其License的问题,由于他本身不是MIT License的,所以Binary将其单独拉出来一个版本编译了。如果你不是商业行为使用,则没有问题,当然具体的相见License。

下载后将其解压,然后进入第二步,第一步中都不会有问题,请稳步前进至第二步。

第二步,解决所以依赖的环境问题

(其实这一步你可以先略过,先执行第三部之后的,当遇到问题以后再回来检查这一步也可以,因为这步骤的本质是解决CNTK的环境依赖问题)

首先,如果你是开发环境装过VS2013之类的,(具体指的是Visual C++ Redistributable for Visual Studio 2013)。那可能没有什么问题,但是如果报错什么dll找不到啦之类的,你可以考虑去安装下“Visual C++ Redistributable for Visual Studio 2013”

http://www.microsoft.com/en-us/download/details.aspx?id=40784

其次,如果你是GPU的版本,建议更新NVIDIA的驱动到最新的版本,并且确保CUDA功能是使能的。同时,根据说明CNTK不需要用户自己安装CUDA的SDK,但是还是建议安装下。

最后,检查下MS-MPI SDK有没有安装。MPI是c++的多线程编程用的东西,微软将其列入HPC,使其成为其一部分。

https://msdn.microsoft.com/en-us/library/bb524831(v=vs.85).aspx

第三步,设置环境变量

首先,按照说明里面写的,设置一个环境变量ACML_FMA为0(ACML_FMA=0)。

(有人可能问ACML_FMA是什么,笔者也好奇,搜了搜,好像是和CPU指令集有关。先设置,等后期仔细研究代码的时候,发现了在详细解读下)

其次,我建议设置一个Path的环境变量到CNTK中cntk.exe的位置(其实是为了方便调用,虽然在命令行中可以指定,不过需要修改Sample的文件或者敲命令行需要多带一个参数比较麻烦),当然这个说明中没写,只是笔者目前条件下的一个建议。

完成第三步后,其实就基本完成了环境的设置了,下面一部分我们可以尝试Run一个CNTK中给出的例子。以作为这个本系列文章中这一章节的一个暂时的结束,这也是一个入门的基础。

运行一个提供的Sample

为了验证上节中所搭建环境的正确情况,同时为了满足达成CNTK入门条件的成就感,我们需要跑一个简单的Sample来验证一下,这里我们选择最简单的Simple2d这个例子。

.\Examples\Other\Simple2d

笔者简单的介绍下这个Sample,这是一个分类的例子,训练的样本是若干个分布在平面上的二维坐标,包括X坐标和Y坐标,并且每一个点归结为一种类型,绘制在图标上如下图所示。

图上的坐标也就是训练的原始数据,Sample中给入的输入文件为Data目录下的SimpleDataTrain.txt,这里,每一行是一个输入数据,第一个数值是X,第二个是Y,第三个是类别0或者1。通过这些数据做训练后。使用SimpleDataTest.txt做测试以检测训练的结果。
最终你能够形成一个如下图所示的神经网络模型。
CNTK从入门到深入研究(1) - 一切都从介绍和环境搭建开始_第2张图片

下面开始运行这个Sample。
首先,打开熟悉的CMD(Win+R,cmd,回车)。用cd命令导航到 Config目录。

cd C:\cntk\Examples\Other\Simple2d\Config

然后,运行如下的命令。

cntk configFile=Sample.cntk

这里会执行两个事情,第一件事是训练,第二件事是测试。
观察到如下图所示内容,即成功训练并且测试完成。
CNTK从入门到深入研究(1) - 一切都从介绍和环境搭建开始_第3张图片

下一步的计划

目前大家已经知道如何使用Binary的Release压缩包搭建CNTK的环境,并且也简单的运行了一个Sample。
本章内容先写到这里,下一步笔者将会从使用角度上来继续使用已有的Sample去讲解cntk配置文件的定义语法和使用方式。
CNTK很容易上手,但是能够配置并且拓展的东西也很多,笔者将会慢慢的进行学习并且拿出来与大家分享。最后也将探索其实现原理。并视情况进行扩展。

本节完,其他章节将会持续更新……

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