揭秘TensorFlow:Google开源到底开的是什么?

站长资源 2021-07-09 13:20www.dzhlxh.cnseo优化

文/出门问问

这两天发现朋友圈被Google开源深度学习系统TensorFlow的新闻刷屏了。这当然是一个很好的消息,尤其对我们这种用机器学习来解决实际问题的工程师来说更是如此。但同时很多人并不清楚听起来神乎其神的“TensorFlow”到底是什么,有什么意义?

我是人工智能科技公司“出门问问”的工程师,对人工智能“深度学习”理论有一定的了解,在这里就为大家“破雾”,聊一聊Google的开源系统TensorFlow。

什么是深度学习?

在机器学习流行之前,都是基于规则的系统,因此做语音的需要了解语音学,做NLP的需要很多语言学知识,做深蓝需要很多国际象棋大师。

而到后来统计方法成为主流之后,领域知识就不再那么重要,但是我们还是需要一些领域知识或者经验来提取合适的feature(特征),feature的好坏往往决定了机器学习算法的成败。对于NLP来说,feature还相对比较好提取,因为语言本身就是高度的抽象;而对于Speech或者Image来说,我们人类自己也很难描述我们是怎么提取feature的。比如我们识别一只猫,我们隐隐约约觉得猫有两个眼睛一个鼻子有个长尾巴,而且它们之间有一定的空间约束关系,比如两只眼睛到鼻子的距离可能差不多。但怎么用像素来定义”眼睛“呢?如果仔细想一下就会发现很难。当然我们有很多特征提取的方法,比如提取边缘轮廓等等。

但是人类学习似乎不需要这么复杂,我们只要给几张猫的照片给人看,他就能学习到什么是猫。人似乎能自动“学习”出feature来,你给他看了几张猫的照片,然后问猫有什么特征,他可能会隐隐预约地告诉你猫有什么特征,甚至是猫特有的特征,这些特征豹子或者老虎没有。

深度学习为什么最近这么火,其中一个重要的原因就是不需要(太多)提取feature。

从机器学习的使用者来说,我们以前做的大部分事情是feature engineering,然后调一些参数,一般是为了防止过拟合。而有了深度学习之后,如果我们不需要实现一个CNN或者LSTM,那么我们似乎什么也不用干。(机器让工人失业,机器学习让搞机器学习的人失业!人工智能最终的目的是让人类失业?)

但是深度学习也不是万能的,至少现在的一个问题是它需要更强的计算能力才能训练出一个比较好的模型。它还不能像人类那样通过很少的训练样本就能学习很好的效果。

其实神经网络提出好几十年了,为什么最近才火呢?其中一个原因就是之前它的效果并不比非深度学习算法好,比如SVM。

到了2006年之后,随着计算能力的增强(尤其是GPU的出现),深度神经网络在很多传统的机器学习数据集上体现出优势来之后,后来用到Image和Speech,因为它自动学出的feature不需要人工提取feature,效果提升更加明显。这是否也说明,我们之前提取的图像feature都不够好,或者是根据人脑的经验提取的feature不适合机器的模型?

很多人对深度学习颇有微词的一个理由就是它没有太多理论依据,更多的像蛮力的搜索——非常深的层数,几千万甚至上亿参数,然后调整参数拟合输入与输出。其实目前所有的机器学习都是这样,人类的大脑的学习有所不同吗,不是神经元连接的调整吗?

但不管怎么说,从深度神经网络的使用者(我们这样的工程师)的角度来说,如果我们选定了一种网络结构,比如CNN,那么我们要做的就是根据经验,选择合适的层数,每层的神经元数量,激活函数,损失函数,正则化的参数,然后使用validation数据来判定这次训练的效果。从效果来说,一般层次越多效果越好(至少相对一两层的网络来说),但是层次越多参数也越多,训练就越慢。单机训练一个网络花几天甚至几周的时间非常常见。因此用多个节点的计算机集群来训练就是深度学习的核心竞争力——尤其对于用户数据瞬息万变的互联网应用来说更是如此。

常见深度神经网络的训练和问题

对于机器学习来说,训练是最关键也最困难的部分,一般的机器学习模型都是参数化的模型,我们可以把它看成一个函数y=f(w;x)。

比如拿识别图像来说,输入x是这张图片的每个像素值,比如MNIST的数据是28*28的图片,每个点是RGB的颜色值,那么x就是一个28*28*3的向量。而一个模型有很多参数,用w表示。输出y是一个向量,比如MNIST的数据是0-9的10个数字,所以我们可以让y输出一个10维的向量,分别代表识别成0-9的置信度(概率),选择最大的那个作为我们的识别结果(当然更常见的是最后一层是softmax而不是普通的激活函数,这样这个10维向量加起来等于1,可以认为是分类的概率)。

而训练就是给这个模型很多(x,y),然后训练的过程就是不断的调整参数w,然后使得分类错误尽可能少(由于分类错误相对w不连续因而不可求导,所以一般使用一个连续的Loss Function)。

对于神经网络来说,标准的训练算法就是反向传播算法(BackPropagation)。从数学上来说就是使用(随机)梯度下降算法,求Loss Function对每个参数的梯度。另外我们也可以从另外一个角度来看反向传播算法,比如最后一层的神经网络参数,直接造成错误(Loss);而倒数第二层的神经网络参数,通过这一次的激活函数影响最后一层,然后间接影响最终的输出。反向传播算法也可以看成错误不断往前传播的过程。

由于深度神经网络的参数非常多,比如GoogleNet, 2014年ILSVRC挑战赛冠军,将Top5 的错误率降低到6.67%,它是一个22层的CNN,有5百多万个参数。所以需要强大的计算资源来训练这么深的神经网络。

Copyright © 2016-2025 www.dzhlxh.cn 金源码 版权所有 Power by

网站模板下载|网络推广|微博营销|seo优化|视频营销|网络营销|微信营销|网站建设|织梦模板|小程序模板