进击的 TensorFlow

TensorFlow 机器学习   2017-12-08 20:50:14 发布
您的评价:
     
5.0
收藏     1收藏
文件夹
标签
(多个标签用逗号分隔)

AI

(Artificial Intelligence)人工智能及机器学习(Machine Learning)最近大热,Google - Deep Mind的AlphaGo踢馆人类所向披靡,最终宣布正式进入智能时代1.0。我们今天也来体验学习一下Google的人工智能项目。

1. Jeff Dean

老传统,我们先来看看这位Google TensoFlow的主要负责人,在加州山景城除了拉里佩奇Larry Page和布林Sergey Brin,Google数一数二,被用来打造下一代Google核心大脑的(Google Brain)的头号人物Jeff Dean。

列一下大神的大作,颤抖一下吧:

  • Google MapReduce

  • Google BigTable

  • Google Spanner

  • Google AdSense

  • Google Translate

  • Google Brain

  • LevelDB

  • TensorFlow

够重量级了吧,说其影响了第三代互联网及第四代也不夸张,开启了互联网大数据及人工智能时代。

Jeff Dean于2009年当选美国工程院院士。

2. Artificial Neural Networks, ANNs

在开始介绍TensorFlow之前我们先看一个TensorFlow的Online Playground,在线神经网络(Artificial Neural Networks,ANNs)!

http://playground.tensorflow.org

神经网络(NNs)主要模仿动物神经网络,进行分布式并行算法的数学模型。

神经网络最大的魔力,在于不需要用各种特征用来输入给机器学习系统,如上图事例,只需要输入最基本的x1, x2, 只要给予足够多层的神经网络和神经元,神经网络会自己组合出 最有用 的特征。

总体来说,神将网络需要大量神经元(节点)及:

  • 每个神经元可以通过输出/激励函数(Activation Function)来计算来自其它相邻神经元的加权输入值

  • 计算模型可以依靠大量数据训练

    • 成本函数(Cost Function):定量评估对于给定输入值的输出结果离正确值的偏移,用于评估计算的精准

    • 学习算法(Learning Algorithm):根据Cost Function的结果,自学,纠错

有了上述的核心,就有点智能感觉了,可以计算评估,并且可以递归自我学习。

3. TensorFlow Overview

TensorFlow是Google研发的第二代人工智能学习系统。官网描述,TensorFlow™ 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

Tensor即张量,N维数组,Flow代表基于数据流图的计算,TensorFlow的计算就是张量从图的一端流动到另一端的并行计算。

张量:

TensorFlow架构灵活,可做到多平台并行计算,如台式机,服务器,云端,移动设备等,同时又可以充分发挥多核CPU或者GPU的强大并行计算能力。

CPU v.s. GPU

科普一下CPU与GPU的差别吧,为什么GPU会在深度学习时代又火了起来。

设计架构:

可以看出CPU的设计目标是处理不同数据类型,支持大量逻辑判断,分之跳转及中断处理;而GPU则诞生于目标处理大量图形图像(游戏),即大规模类型统一,相互依赖的数据,同时不需要被打断的纯计算环境,所以在架构设计上,GPU采用了数量众多的计算单元和超长流水线,仅保留简单控制逻辑,甚至省去了Cache。

所以,GPU天生具备大规模精良并发计算能力,而CPU的计算能力则只是很小一部分。大多数台式机甚至包括服务器,其CPU多核也没有超过2位数,每个核也包含了大量缓存及逻辑运算单元;GPU则称之为重核,如512核甚至上千之多。CPU被称之为Latency Oriented Cores, 而GPU则称之为Throughput Oriented Cores。

所以,不难看出为什么在深度学习领域,GPU为何能炙手可热,GPU最适合:

  • 计算密集型程序(Compute-Intensive),其大部分时间花在寄存器,几乎没有延时,而内存及SSD的延时则不可同日而语(达上百倍,千倍差异)

  • 并行计算程序,上百核同时做同样事情

有了上述的铺垫,不能看出对于Tensor张量的计算处理,GPU简直是张量计算的天堂。

TensorFlow特征

TensorFlow并不是一个严格的神经网络,只要你可以抽象为数据流图,便可以使用TensorFlow来构建计算。

TensorFlow用C++来编写,目前版本提供的API相对低阶,确实是C/C++风格,任君打造。当然也提供暴露了深度学习中流行的Python接口,及其它Google自己的Go, Java, Lua, Javascript, R等。

开源神器

Goolge近年来突然意识到开源的威力,赶紧跟上。

官网当然是官言,其实在这个互联网,深度学习时代,除了秀肌肉,研发产品,占领市场,最重要的是占领程序员,程序员是未来世界的缔造者,通过开源直接输出核心思想到程序员大脑,甚至让程序员反向输入。

4. 机器学习之-MNIST

接下来正式展开TensorFlow的介绍,注意,其中涉及大量数学,请自行脑补。

简单来说,机器学习即通过经验自动改进的算法程序。

MNIST

MNIST则为机器学习领域的一个经典问题,解决28*28像素的灰度手写数字图片识别,数字范围0-9,即人类的3-4岁左右水平,别小看。

人类的视觉系统是一大奇迹,我们可以毫秒级别轻易识别上述手写数字为5041,而我们的大脑则通过视觉皮层V1的包含1.4亿个神经元及与其他视觉皮层V2,V3,V4,V5构成数百亿神经元网络 - 超级计算机。

所谓学习,必然有学习的教程,官网提供了大概6万多训练图片,5千图片用语迭代验证及另外1万图片用语最终测试。

MNIST的数据集可以从官网下载Yann LeCun's website, 此人目前就职于Facebook。

Softmax Regression模型

数字如何和向量挂钩?又如何TensorFlow?

显然,对于上述28*28像素的图片,我们可以用数组表示,展成向量即, 28*28=784。

整个算法我们把MNIST分成两个数据集,图片训练数据集 xs ,每个图片对应标签 ys

所以在MNIST训练集 xs 中,张量为[60000, 784],第一个维度索引图片6w张训练图片,第二个维度则索引像素点28*28,在此张量的每个元素都表示某个像素的强度介于0-1之间:

而其对应的标签 ys 数据集是介于0-9的数字,为了简化这里使用了“one-hot vectors”。

one-hot即只有一位编码有效,如使用n位状态寄存器来对n个状态编码,任意时候只有其中一位有效。

在MNIST标签数据集中,我们用10维向量来表示某0-9的数字,如数字n(0-9)表示只有在第n维为数字1,其余维度都是0,如数字0,表示为:

[1,0,0,0,0,0,0,0,0,0]。

:warning: : 官网貌似写成11维,多了个0,所以众多copy模式也copyright。

这样,MNIST数据集标签组成一个[60000,10]的数字矩阵。

好了,有了上述的数据结构抽象,接下来整体算法就是要得出给定图片代表每个数字的概率,如模型推算一张包含9的图片代表数字9的概率为80%,而判断它代表数字8的概率为5%(上半部分小圆),给予其他数字更小概率值。

Softmax模型可以用来给不同对象分配概率,通常分为两步:

  • 对图片像素值进行加权求和,如果这个像素具有很强证据证明这张图片不属于该类,则权值为负数,相反则为正数。

上图红色表示正,蓝色表示负数。

  • 偏置量(bias),用于排除干扰

则图片x代表数字i的evidence表示为:

其中,wi为权重,bi为i的偏置量,j