近日,亚马逊云服务(AWS)机器学习总监 Alex Smola走进今日头条并进行题为《为什么你的机器学习代码运行速度慢(Why your machine learning code is slow)》的技术分享。

Alex Smola在分享中谈到了多核、多机器和 GPU 的可扩展数据分析方法,并以个性化内容推荐及用户参与预测的深度学习系统为例,讨论了建立灵活可扩展的深度学习系统所遇到的挑战。现场观众与其进行了深入的交流互动。主题分享结束后,今日头条人工智能实验室主任马维英、总监李磊、以及相关同事进一步围绕机器学习展开讨论。

以下是分享全文:

一年前我和各位头条的同学有个约定,当时还没在这栋楼里。我们从今日头条获得了一些文本资料,对它们进行分析,现在还欠大家一个汇报。肯定有不少人是来听听我们对这些数据做了怎样的工作。我向大家表示感谢。

首先简单讲一下深度学习算法。Joe Ruth很多年前在Google的一个面试题,要编程解决一个孩子们玩的数字游戏问题——“Fizz-Buzz”。我给你们说出游戏规则你们就可以轻易地写出代码,规则是:教学生做除数是3和5的除法。我们从数字1开始往上数,1,2,Fizz,4,Buzz,Fizz,7,8,Fizz,Buzz…继续下去,到数字15的时候我们说Fizz-Buzz。换句话说,你们已经看出来了,说到能被数字3整除的数,就替换成Fizz;被5整除的就替换为Buzz;如果两个都可以整除,就喊Fizz-Buzz。图片4

这个伙计就觉得很无语,竟然被问到这么愚蠢的问题。于是他就想用机器学习来解决这个问题。首先当然是要构建训练集:数字——还有对应这个数字我们喊什么;接下来他还抽取了特征——被3或5整除,这些;下一步就是训练分类器了。他为什么偏好用机器学习来解决问题不得而知,但是我们知道的是他最后没能拿到Google的这份工作。这个例子举得有些愚蠢,接下来给一个自然一点的例子:

图片5

假如我们有一些猫的图片,和一些狗的图片。如果你交给一个三岁小孩儿来做——前提是你得有一个三岁大的小孩——那么ta可以很轻易地把猫和狗的图片分开。但是要问ta是怎么做到的,这个问题就绝不那么简单了:这是人类的某种智能。那么概括一下,我们要编程来实现,那么我们拥有的数据(data)是图片、文字、音频、视频之类,目标是让计算机学习从数据到输出结果(output)的映射。第一个我们会想到代价函数(loss function),比如我想要区分松露(Truffle)和死帽蕈(DeathCap),后者含有的鹅膏毒素(amatoxin)会致人于死地,而如果你白白丢掉 了松露会损失很多钱。当然这是一个比较极端的代价函数,因为人们宁愿损失珍贵的松露也不愿意误食毒蘑菇死掉。所以,分类任务之外,我们常常还需要一些限制条件(restrictions),在限制之下去对代价函数做一个最优化问题(Optimization)。说到“训练”,通常我们指的就是去找到这样一个最优的函数f——这就是我们GPU派上用场的地方——我们有一个数据集叫做“训练集”,有“训练误差(Training error)”的概念,而我们也有“测试集”用来检验训练的成果好坏。以上这些都是众所周知的了。

图片6

所以我们就从一些简单的东西开始。神经网络,我们有输入、输出值,非线性相关。我们先对输入数据进行一个线性叠加,一我们分类猫狗的练习为例,比如说系数为2的一个线性组合,然后为了映射到「是猫」「非猫」的输出,我们需要一个变换,把全是(-∞,+∞)范围的数据映射到(0,1)区间。一个Sigmoid函数可以做到这一点。接下来,我就获得了一个分类函数。看起来很好,就这五行的机器学习代码我们可以完成分类的工作,这些我们都必须熟练掌握了。当然,我们也可以做分到十个不同类的分类器,像图上这样,一个MxNet分类器,在此就不展开讲了。那么我们有一个完全连接的神经网络,自动生成的形状。我们这里需要一个Softmax()的输出,因为要映射到(0,1)。五行代码,剩下的工作就是自动的了,可以接受么?有点枯燥?这就是1970年代的前沿算法了。

图片7

我们快进到80年代。我们的神经网络,有输入层(input layer)、输出一个值作为下一层的输入,最后到输出层(output layer),这样总共三层,就要比两层更好。有时候问题就会变得令人头疼。我们想要做的是优化一组参数。不如说这里我用x来表示y,x-1……然后我就利用以简单的梯度下降法,或者随机梯度下降,对代价函数作参数的偏导;当然也可能用到像Batch-normalization这样的各种小技巧。请迅速思考并回答:为什么我这个地方要用到非线性性(non-linearity)呢?有想法吗?为什么我就不用一个接一个的线性函数去做模型呢——毕竟线性函数我们都喜欢嘛。

图片8

回答是,如果我们讲一个又一个的线性变换叠加,得到的结果仍然是线性的,这样无论如何也逃不出线性函数的那个空间。这就是为什么我们要在线性和非线性之间  达到一个很好的平衡,既有线性函数便于计算的好处,有是非线性的。那接下来就是优化算法了。向后传播(backprop),这就是简单的链式法则,应用到神经网络当中,算起来就冗长乏味了,MxNet帮我们自动算出这些代数计算。好的,理解了的话我们就从单层网络进化到了双层网络,黑色的部分是我们以前就掌握的,绿色部分是加上的——我们看到其实我就是加了一个非线性变换的项。接下来是一些整化(regularization)、归一化(normalization)、剔除(drop-out)等工序,之后再加一个层,再剔除……而后通过一个Softmax得到输出。

图片9

现在我们就是比一层的网络多了一层非线性的,虽然仍然是非常平凡的改进,但已经比刚才的更有意思一些了。

图片10

说到底,Amazon是一个做推荐和媒体的公司,所以我们有大量的多媒体资源,比如说图  片。现在这个就是如何处理图片信息的极好的例子:这是一个益智游戏,给你一张大照片,你的任务是找到照片中卡通人物Waldo在哪里。

图片11

图片12

Waldo这个人物形象是用他的灰帽子、圆眼镜、条纹T等界定的——你们可以看到。曾经世界上长得像Waldo的人聚集在同一个地点,这个事件打破了世界纪录——人们大概觉得这很有趣吧。那么回到我们要解决的问题上来,我们掌握的信息有两条:一、Waldo在哪儿的信息完全是局域的(local),如果Waldo在这里,你看那里是不会得到任何关于Waldo在哪里的线索的;二、Waldo的形象是平移不变的:不管Waldo在哪里,他的卡通形象是不变的。下面问题来了:我能不能通过某种方式,把多层感知机(perceptron)变成在“寻找Waldo”任务上表现良好的机器呢?Waldo是全局的,信息是全局的这正是我们现在所说,一个多层感知机+卷积神经网络(convolutional NN)所做的事情。我们这样想,如果一幅图片,有一百万个像素,那么把它转换成矢量就是1000,000维的矢量。输入是1000,000维,中间经过多层感知机,输出也是1000,000维,我就需要训练1个T的参数。你的电脑没有那么大的内存,——那是一种浪费,而且就算真的能学到那么多的特征,也没有必要。所以下一步你应当给这个巨大的权重矩阵(weight matrix)加条件限制。但是怎么限制它呢?——直觉就是把很多不必要的项扔掉。首先设想,我们有平移不变性,那么不管Waldo在哪里,它的形象那部分图形是不依赖于坐标(i,j)的。就剩下一个W_a。其次,我只关注一个位置-delta(a,b),由此我可以立即得出一个卷积神经网络的算法,——这就是1995年的前沿水平了,我们注意到这里是线性的。比如就目前这个例子来说,我们可以取3✖️3的矩 阵,对原图片向量做卷积,看到我们把原向量约化成了什么——再做卷积,再……经  过几个多层感知机的层次。线性的,——这就是1995年的前沿了;我们从1985年快进到了1995年,看到了图像处理策略的演进。接着当然我们要把代码写出来:一切只用了一页纸就写完了。

图片13

好~告别1995年,我们来看一看新的千禧年有什么进展。人们开始尝试不同的卷积,不同的层次,不同的矩阵——比如可能尝试1✖️1的,5✖️5的……谁也不知道怎么做就会收到效果,所以人们把一切的可能都拿来试一试,就像Poplog那样。于是我们就有了现存的这些宏模块(macro blocks),每个对应一个不同的滤函数(filter)。比如说我在这里有一个模块——这实质上就是所谓的神经网络。传统意义上,要给出整个30层神经网络的架构,需要大量的人工;但现在你不再需要手动定义每一层网络,而只用给整个模块做好定义。下一步就是把这个算法写成代码了。看,这只是个开始。如果你想用Caffe来写的话,就要上千行代码。这是用Python写的整个初始网络,当然有一些压缩的部分,比如说这个inception factory A和B,是在另一个页面里定义的卷积部分的代码,不过全都加在一块也远小于一千行。以上就是截至2014年的机器学习前沿了——两页ppt的精简版。

图片14图片15

图片16

继续,这很有可能是大家最感兴趣的部分了——序列模型(sequence model)。先前我们花了大力气去讲变量模型和参数模型,因为说到底我们可以采取各种各样的模型和手段去解释人类的行为。我们能够收集到的关于用户的情报只有用户和App发生交互的时候的数据,像ta登陆了ta的账号、分享了某个状态,等等。

图片17

我们可能有集群(cluster)——把用户聚集成一堆又一堆;有话题(topic)——用户的兴趣的时间分布;可能有各种过滤器(filter)——去过滤关键词和心理行为……总之我们掌握用户采取的行动(action)的信息,想要的出用户行为的合理解释:也就是所谓潜在状态(latent state)。一个潜在状态会影响下一步你的观察,你接下来的观察会进一步作用于下一个潜在状态,这就是潜在状态模型。所有这些模型都有着大致相同的结构,你 可以在PhD论文的时候写一篇相关的东西,我已经有不止一个博士生做的是这方面研究了。可以说到底,这些模型的解释都是真的么?真的1)头条的用户是集群的吗?不见得。2)人们遵循同一个中国餐饮业的法则吗?可能不是的。退一步讲,我们能不能抛开这些做统计的人提出来的参数化模型,试想,也许一百年前的时候,人们没有足够多的数据,没有强大的计算机,人们想到了集群这样一个模型,身边没有计算机可以用,那就需要手动解方程来解决聚类问题。

图片18

现在,让我们从过去这一百年的思维当中脱出身来,来考察非参数化的算法。抛开那些过于具体而微的假设,来聆听数据在说什么。我的假设是,我有一个潜在的状态(hidden state),它由上一时刻的观察和上一时刻的状态决定;我的下一个观察,则是这一时刻我的状态和上一时刻的观察的函数。这是一个完全广义的模型。接下来我就要用LSTM(Long Short-Term Memory),不是说LSTM有什么神奇的过人之处,我们用它单纯是因为它是第一个被证明对付潜在状态问题有效的算法。幻灯片上是具体的方程,——不过你并不需要记忆它。就把它看成一个黑祥子就好了——各种复杂精妙的深度学习算法将为你完成其中的一切步骤。目前为止,应该都是大家熟悉的内容——两年前大家就在这么做了。

图片19

接下来是重点了:我们的问题是,给你了用户的一些交互信息,如何预测用户下一次活跃是在什么时间呢?ta可能40分钟以后再次上线,也许就干脆不上线了——可能他下一整个星期都出差在外。也就是说,你需要建立一个模型,去解释用户的经历如何分配给你的App。纵然你可以观看当日的报表、股票市场的信息,但这些都不能告诉你故事的全部。或许你有个1亿用户群体每周上限一次,也有可能你就1500万用户,他们每天上线。请问这两种量度哪一种更好一些?哪一种更好的给出了用户群体的行为模式?其实,每一种测量方法都不完全契合你的需要,因为你真正想知道 的,其实是他们什么时候会再次上线/再次将注意力集中在你的App上面。事实上用户的使用决策往往是被动的而非主动的,例如人们会花费大量时间刷微博、很大一部分时间在Yahoo!邮箱客户端……很可能不是你主动想要在某个时刻点开邮箱按钮,而是你被视野当中的那个图标不自觉地吸引了。所以你想要建模的不是被动决策,而是主动地打开并使用App的行为。

图片20

图片21

同样的,你需要纳入考虑的还有用户的习惯以及之前发生的各种事件的影响。用一点数学——不用害怕——我们要用到一个存续时间(survival time)的概念:一个用户离开你的App能活多久?直到他一定想要打开你的软件为止。这个数值是一个积分。这个有一个半衰期,也就是对于ta再次使用App之前的时间长度的期望。

图片22

这个模型不是我们自己想出来的,它已经存在了相当长的时间。之所以叫它“存续/存活模型”,是因为它最初用于建模治疗干预下的存活时间。就是说,用药以后能够存活多长时间,死亡率又是多少;即便到了时间t很大的时候患者都死亡了,但是由于存活的时间有显著的群体性的提升,这仍然可能是一个好的药物。最早用到这个模型的其实是核反应:原子的衰变。放射性核素有着恒定的半衰期:浓度降到初始浓度的一半。你没有办法干预铀元素自然衰变的速度,除非用中子什么的轰击它。用同一个模型,你也可以建模日本女性的婚姻行为,——那很有意思,因为结婚对日本女性来讲几乎就是一个终止态——她们鲜有离婚的情况发生。

图片23

我们回到预测用户回到App行为的问题上来。我们掌握的大体就是用户什么时候下线,过一段时间再上线,下线,上线,……这样的时间序列,可能长达几年。然后干什么用呢?我们同样掌握用户的一些信息,时间信息,等等的外部特征,通过某种方式给到隐藏层,然后让神经网络跑起来。大体上每一个用户由一个LSTM单元来处理。接下来,我们就有可能感兴趣一些不同用户个体之间的群体行为,比如说,如果同一时间有大量的用户在线,可能就会进一步吸引群体中的更多人上线,因为这可能是由于有什么重要的或者有趣的事情正在微博上发生。

以上都是一些热身的介绍,接下来我还想向大家讲述的是,我们发现,不仅用户有他们各自的“历史”状态,就连产品本身也有它的历史性。我们下这个判断的原因是,在某些特定的时间范围内,用户对商品的评价(perception)呈现畸高。问题来了:这是我们有的信息,两个维度分别是用户和商品的评价。我们想要通过已知过往的评价数据,来预测未来的走势。众所周知,如果你抽取了新的特征,但是不去用它,那么它就变成一堆垃圾信息。这就是为什么我们在对向量表示做约化之前,要做A-B测试。

图片24

如果你观察NetFlix的数据集,你会发现它有点违反了上述规则。这是用户-电影-评分的三元关系图。数据集本身可能有误,但是更重要的一点是,我们利用未来的前景来预测过去的历史。就好像,如果我告诉你头条过去一年的估值,让你预测一个月以后的情形,这就要比让你直接预测一个月以后要来得容易许多。所以这个方式是有效的,就是把已经掌握的信息,一层层地进行处理,用来预测未来。

那么接下来我们做的正是我们想要看见的:用户有他们的历史,商品也一样有自己的历史。所以做估计是要有时间的维度在里面的:我只能估计某具体时间某商品的评价。我们发现一个叫做“证言偏见(confirmation bias)”的现象:举例来说,我走进一个很美妙的茶楼,我一点也不懂茶叶,那么店主人给我介绍说某某茶特别好,我品尝了之后也会觉得哇这个茶真好。因为店主人是专家,专家的意见影响了我。

图片25

回到电影评分的问题上来,每年奥斯卡颁奖期间,我们仍然把用户分层来分析,会发现,在颁奖的那几天,获奖和获得提名的作品评分升高了。有趣的是,一年之后,人们的评分又回到了原本那个不虚 高的水平。为什么?在座的各位谁记得去年奥斯卡奖得主是那些作品?大家都不是影迷吗?好吧我也不是,不过我想这就正合评分上涨又回落的现象:一年以后人们普遍忘了奥斯卡奖颁给了谁,就好比我一年后再回到同一家茶店,没有了专家的品鉴,我喝了就觉得并不多可口了——茶也可能是铁观音或者味道很好,但是我的评价就不如那一次了。

好,以上就是我对“怎么用深度学习”想要给大家分享的,关于图片处理和推荐系统。

下面的一些时间我来讲讲MxNet。讲它之前我们肯定不禁要问:我们已经有很多机器学习的环境了,为什么还需要添一个MxNet呢?我们已经有一个长长的清单:Caffe已经出到了第二代,Torch的Python版本,Theano,TenserFlow,CNTK,Keras,Paddle,Chainer,SINGA,DL4J……我们还需要再多一个工具包吗?

图片26

图片27

这就是回答了:一,我们想要一个更简洁朴素的环境,需要资源利用效率。快是重要的,同时我们想说,MXNet并不带来什么神奇的算法,但是对于硬件,你想要在 硬件上得到提升总是比改进算法更困难棘手的:数学运算比硬件便宜,代价小一些。二,因此我们想要一个能很好的用GPU进行线性度量(linear scaling)的东西,希望即便只用一台机器单独运作也能实现好的效率。第三我们想要结合声明式代码和命令式代码的优点,力求简洁。

图片28

感觉要求还蛮高的,需要兼容不同的语言对不对?那让我们看一下什么叫做结合命令式和声明式的优点。命令式的代码就像通常我们用得最多的那样,初始化a,初始化b,c赋值为b乘以a,打印变量c的值,d赋值为c+1。非常直接而且灵活,但是不太好优化:如果我就要用变量d,那我必须得有变量c嘛?声明式则是在abcd之后加一步预先编译d,就可以让c和d共用一份内存空间,计算d之后c就被删去了。这样的好处是便于优化,但是相应的代码就没有那么灵活。具体用哪个取决于你的需求,一般在定义一个深度学习的层的时候,你可能会更想用命令式。因为代码会依赖大量的优化操作,用命令式更得心应手。这个图正是我之前给大家展示进入下一步更多层次的网络之前 所要讲解的内容。那这之后,更新数据以及参数就是我们常见的套路了,也许你会用Beam Search,也许会抽取一些特征,也许你甚至想要修改某些原子算法把它变成其他的算法。用到if,就要用命令式。

图片29

到目前为止我们都是在谈合适的语言,C++,Python,R什么的。我们不是在探讨具体语言,而是在说你用一种最熟悉的编程语言完成剩下部分的代码,——你肯定不会享受在不同语言之间来回切换的快感的。事实上,MXNet的一个优点就在于,它可以把几种不同的口味混合在一起。上面是命令式,下面是声明式代码。事实上,这个变量c正是下边你可以直接用的变量c。听起来挺方便的,接下来,

你在做LSTM的时候可能会想要按照句子的长度排序,——以形成好的线性矩阵。

图片30

再比如你想要做三维影像构建,例如在制作电影的时候,现在手里有2D的图片,想变成3D的——当然不是真的3D,但是有一些神似。100行Pthon代码实现。如果在头条的各位有需要的话,大可以去检验一下。

图片31

我说说我在选择多语言环境的时候关心什么。很可能你在用MXNet之前也早已经做过一些深度学习的项目了,这样你可能对某些特定的编程语言有着自己的偏好,也许是R,Julia,Matlab,Mathematica——当然Mathematica用的就是MXNet作为它的后端(backend),或者Scala。或者还有可能,你用Torch用了七年,自从它出现就用了,现在有这么多遗留下来的(legacy)代码分散各处;还有像Caffe:我强烈推荐它写的代码,非常简洁,再修改某个特定的地方的时候错误率就会小很多。我觉得Python很好,但是我更喜欢R/Julia/Matlab;我喜欢用Scala来做Spark模块的工作;我做界面用C++,用Javascript在用户浏览器中运行……那我用这么多语言,怎么能走在同一个平台下达到native的使用效果呢?事实上,我们这些不同语言,是从前台看的,它们其实共用一个后台。MxNet是通过这一点让编写的时候可以兼容多语言混用,而保证实现的时候的表现就像分别在不同的编译环境下用本土的语言一样好。

图片32

图片33

例如,你想在MXNet里面用Caffe的代码。有两种可能的方式:第一,我们事实上有在MxNet里运行Caffe的代码的操作符(executor),所以你可以直接把Caffe的问题定义拿过来,如果在Caffe下编译没有问题,那么在MxNet当中运行也会一样的流畅。第二,你其实可以直接在MxNet里面回调(call)Caffe,像这张幻灯片里的layers。类似的也可以用于Torch的代码上。

图片34

接下来是我个人最喜欢的部分:NumPy特别好,你再写好了框架之后,那些计算梯度等等的操作不需要你来写了,而是自动完成,能够支持微分操作。这个模型整个在GPU上完成运转。为了对照方便,我们把TensorFlow程序的代码写在左边,右栏是MinPy的代码。我不用说,很显然的右面的代码比左面的更利于工程实践。一个具体的场景,比如说我想要弄明白这串代码是怎么工作的,今天下午我要拿它来询问我的同事,明天我要在上面进行开发,这样右边的代码不需要我给出那么多具体的变量名,也就避免了一些开发上的困难。这可以提高我们的生产效率。然而整个图景看上去四两拨千斤的,实际上真正运行起来并不见得就能那么好,效率能不能赶上传统的单语言系统尚需要实践来支持。事实上,我们确实做到了——不过原理不那么简单。

图片35

我们的MXNet背后的机理就是用了两层神经网络,把两个GPU组成并行系统,如图所示这是GPU1,这是CPU,这是GPU2。有很多个组件,是用来具体执行每一个命令和操作的,它们之间可能存在依存关系。大家懂得,有一些求梯度的运算,需要在某个点上集群,可能是在CPU,也有可能是哪一个GPU来完成。依存关系图就像这样非常复杂,你大概不会想要徒手完成这些框框的实现,而是交给计算机自动处理。所以,解决前端支持不同语言是怎么做的呢?

图片36

比如我们有这样的几行代码:我们有A的初始化,有B和C:B=A+1,C=A+2,然后做一个乘法得到D。显然这里面的操作是可以并行的。一个节点从两个方向汇集,另一个节点导向两个方向。所以当你有某种构造的依存关系图之后,我们就可以细致分析得到并行的系统。那么现在我向大家展示究竟在多个GPU上,以及很好的数据并行(data parallelism)是如何实现的。于是我们又回到了数据流程图。

图片37

首先,你要从数字化的文献当中得到数据片;其次,你要从中“拉”(pull)出参数,可能是通过求值系统(evaluation store)实现的;第三步,计算出相应的梯度;第四步,把求得的梯度推(push)还给求值存储机构;最后你要更新参数值。一切都非常的直截了当,但正是我们所做的,——而且有效率。

下面是和TensorFlow对比的一个图。这个点是56个GPU集群的数据。使用超过10台机器共同运转的时候效率就比TensorFlow 高了一倍以上。我需要提一句的是这不是初代(Version 1.0)的实验数据,那个数据和这个也相近。这个里面,最多是47台机器共同运转。不同的架构,得到的效果是一样的。不是很完美,但是很实在。我们做了更精细的分析研究,下面一张图就是我把AlexNet、Google的Inception v3跟Resnet画在  一起。速度(每秒处理的图像张数)-GPU个数的曲线是一条非常标准的直线。你需要关心这个二元关系,因为假如你的机器需要太长时间来处理一遍图片,那么你就无法很有效的更新参数,从而面向及其大量数据的机器学习就会受阻。

图片38

图片39

这样,我做的第一件事是分开了每秒处理的图像数量和GPU个数,探究了它们之间的关系。第二件事是我把横坐标换成了对数坐标。我们看到,Inception 和 resnet这两者的图线都近乎完美,是接近于水平的直线;那么问题来了,AlexNet 的仿佛差强人意。大家知道为什么Alex net的表现比其他两个差那么多吗?用的是同样的硬件环境,同样的MxNet,代码写的都很好了,为什么这样呢?

图片40

AlexNet是很吃内存的,它需要花费大量的力气去探明大型的完全连接的层(fully connected layer),然后才能做下一步的处理。对于完全连接的两个神经网络层,有着大量的梯度计算,需要被同步。所以我对这张图里面展现出来的情况的解释是,从一个GPU改为两个GPU,你就要开始考虑数据同步的问题了。我相信我们可以把这个情况改善一下,并且实际上很快就在改善了,——只要我们转移到Nichole——Nichole是NVIDIA的通讯图书馆之所以我们现在还在用当前的系统是因为它已经比较稳定和够用了。

说上面这些,是告诉大家你可以通过增加并行的GPU来提高单位时间处理图像的速度。但是其实我们谈这一切都要建立在收敛的前提下。如果不收敛,没有人会关心你到底处理了多少幅图片,而是在乎你训练的结果——也就是最终识别的准确度。这是一个大问题。我们假设自己有156块GPU。而我们minibatch的大小是每个GPU20张图。那么我们现在对每个mini batch有5120个观测,这就比第一步数据分析就用机器学习多了许多观测。所以说这个mini batch 设置的就是蛮大的了。而且,我们也很难从大的minibatch当中获取高精确度。事实表明,当我们增大minibatch的大小的时候,方差(variance)在缩小。这是测量集中的效应。所以,你需要做的就是去保证方差在缩小这个事实,所用的方法就是调节学习速率。提高学习速率,收缩绿色的线条的变化。

图片41

这是一场Amazon的讨论,所以我也讲一些Amazon当前在做的事情。MxNet,然后是一些建模,我们可以看一看AWS究竟可以做什么实务。我们了解到,对于很多人来说,搭建一个深度学习的框架这件事本身是痛苦的:你需要时间和技巧来完成专配环境、看视频、得到许可、从英特尔(Intel)那里访问得到所需的图书馆(library)MKL,还要引用各个工具包……这要花上很多时间。我们意识到了,我们想帮大家做好这些后勤工作,提前做好这些,搭建好平台,让数据科学家只需要关注他们真正需要关心的数据集就好。

图片42

接下来,简要介绍一下计算机集群(computer cluster)的工作。这是一个繁琐的工作,Amazon的AWS CloudFormation 模版正是面向这一应用场景做的,Amazon的深度学习团队的任务就是这个。他给你解决了这一部分的疑难,短短五分钟,就可以得到一个可用的集群。 还有一个问题是我们的CloudFormation解决的,关于防火墙只能对主管负责,网络系统主管需要知道每一个用户的信息,我们对这个进行了优化。

简要总结今天的内容,前半段梳理了深度学习如何应用于图像处理和推荐算法,后半段介绍了MxNet。谢谢大家。