从概念提出到走向繁荣:人工智能AI、机器学习和深度学习的区别

有人说,人工智能(AI)是未来,人工智能是科幻,人工智能也是我们日常生活中的一部分。这些评价可以说都是正确的,就看你指的是哪一种人工智能。

今年早些时候,Google DeepMind的AlphaGo打败了韩国的围棋大师李世乭九段。在媒体描述DeepMind胜利的时候,将人工智能(AI)、机器学习(machine learning)和深度学习(deep learning)都用上了。这三者在AlphaGo击败李世乭的过程中都起了作用,但它们说的并不是一回事。

今天我们就用最简单的方法——同心圆,可视化地展现出它们三者的关系和应用。

从概念提出到走向繁荣:人工智能AI、机器学习和深度学习的区别

如上图,人工智能是最早出现的,也是最大、最外侧的同心圆;其次是机器学习,稍晚一点;最内侧,是深度学习,当今人工智能大爆炸的核心驱动。

五十年代,人工智能曾一度被极为看好。之后,人工智能的一些较小的子集发展了起来。先是机器学习,然后是深度学习。深度学习又是机器学习的子集。深度学习造成了前所未有的巨大的影响。

从概念的提出到走向繁荣

1956年,几个计算机科学家相聚在达特茅斯会议(Dartmouth Conferences),提出了“人工智能”的概念。其后,人工智能就一直萦绕于人们的脑海之中,并在科研实验室中慢慢孵化。之后的几十年,人工智能一直在两极反转,或被称作人类文明耀眼未来的预言;或者被当成技术疯子的狂想扔到垃圾堆里。坦白说,直到2012年之前,这两种声音还在同时存在。

过去几年,尤其是2015年以来,人工智能开始大爆发。很大一部分是由于GPU的广泛应用,使得并行计算变得更快、更便宜、更有效。当然,无限拓展的存储能力和骤然爆发的数据洪流(大数据)的组合拳,也使得图像数据、文本数据、交易数据、映射数据全面海量爆发。

让我们慢慢梳理一下计算机科学家们是如何将人工智能从最早的一点点苗头,发展到能够支撑那些每天被数亿用户使用的应用的。

人工智能(Artificial Intelligence)——为机器赋予人的智能

从概念提出到走向繁荣:人工智能AI、机器学习和深度学习的区别

成王(King me):能下国际跳棋的程序是早期人工智能的一个典型应用,在二十世纪五十年代曾掀起一阵风潮。(译者注:国际跳棋棋子到达底线位置后,可以成王,成王棋子可以向后移动)。

早在1956年夏天那次会议,人工智能的先驱们就梦想着用当时刚刚出现的计算机来构造复杂的、拥有与人类智慧同样本质特性的机器。这就是我们现在所说的“强人工智能”(General AI)。这个无所不能的机器,它有着我们所有的感知(甚至比人更多),我们所有的理性,可以像我们一样思考。

人们在电影里也总是看到这样的机器:友好的,像星球大战中的C-3PO;邪恶的,如终结者。强人工智能现在还只存在于电影和科幻小说中,原因不难理解,我们还没法实现它们,至少目前还不行。

我们目前能实现的,一般被称为“弱人工智能”(Narrow AI)。弱人工智能是能够与人一样,甚至比人更好地执行特定任务的技术。例如,Pinterest上的图像分类;或者Facebook的人脸识别。

这些是弱人工智能在实践中的例子。这些技术实现的是人类智能的一些具体的局部。但它们是如何实现的?这种智能是从何而来?这就带我们来到同心圆的里面一层,机器学习。

更多人工智能AI解读:www.yangfenzi.com/tag/rengongzhineng

机器学习—— 一种实现人工智能的方法

从概念提出到走向繁荣:人工智能AI、机器学习和深度学习的区别

健康食谱(Spam free diet):机器学习能够帮你过滤电子信箱里的(大部分)垃圾邮件。(译者注:英文中垃圾邮件的单词spam来源于二战中美国曾大量援助英国的午餐肉品牌SPAM。直到六十年代,英国的农业一直没有从二战的损失中恢复,因而从美国大量进口了这种廉价的罐头肉制品。据传闻不甚好吃且充斥市场。)

机器学习最基本的做法,是使用算法来解析数据、从中学习,然后对真实世界中的事件做出决策和预测。与传统的为解决特定任务、硬编码的软件程序不同,机器学习是用大量的数据来“训练”,通过各种算法从数据中学习如何完成任务。

机器学习直接来源于早期的人工智能领域。传统算法包括决策树学习、推导逻辑规划、聚类、强化学习和贝叶斯网络等等。众所周知,我们还没有实现强人工智能。早期机器学习方法甚至都无法实现弱人工智能。

机器学习最成功的应用领域是计算机视觉,虽然也还是需要大量的手工编码来完成工作。人们需要手工编写分类器、边缘检测滤波器,以便让程序能识别物体从哪里开始,到哪里结束;写形状检测程序来判断检测对象是不是有八条边;写分类器来识别字母“ST-O-P”。使用以上这些手工编写的分类器,人们总算可以开发算法来感知图像,判断图像是不是一个停止标志牌。

这个结果还算不错,但并不是那种能让人为之一振的成功。特别是遇到云雾天,标志牌变得不是那么清晰可见,又或者被树遮挡一部分,算法就难以成功了。这就是为什么前一段时间,计算机视觉的性能一直无法接近到人的能力。它太僵化,太容易受环境条件的干扰。

随着时间的推进,学习算法的发展改变了一切。

更多机器学习解读:www.yangfenzi.com/tag/jiqixuexi

深度学习——一种实现机器学习的技术

从概念提出到走向繁荣:人工智能AI、机器学习和深度学习的区别

放猫(Herding Cats):从YouTube视频里面寻找猫的图片是深度学习杰出性能的首次展现。(译者注:herdingcats是英语习语,照顾一群喜欢自由,不喜欢驯服的猫,用来形容局面混乱,任务难以完成。)

人工神经网络(Artificial Neural Networks)是早期机器学习中的一个重要的算法,历经数十年风风雨雨。神经网络的原理是受我们大脑的生理结构——互相交叉相连的神经元启发。但与大脑中一个神经元可以连接一定距离内的任意神经元不同,人工神经网络具有离散的层、连接和数据传播的方向。

例如,我们可以把一幅图像切分成图像块,输入到神经网络的第一层。在第一层的每一个神经元都把数据传递到第二层。第二层的神经元也是完成类似的工作,把数据传递到第三层,以此类推,直到最后一层,然后生成结果。

每一个神经元都为它的输入分配权重,这个权重的正确与否与其执行的任务直接相关。最终的输出由这些权重加总来决定。

我们仍以停止(Stop)标志牌为例。将一个停止标志牌图像的所有元素都打碎,然后用神经元进行“检查”:八边形的外形、救火车般的红颜色、鲜明突出的字母、交通标志的典型尺寸和静止不动运动特性等等。神经网络的任务就是给出结论,它到底是不是一个停止标志牌。神经网络会根据所有权重,给出一个经过深思熟虑的猜测——“概率向量”。

这个例子里,系统可能会给出这样的结果:86%可能是一个停止标志牌;7%的可能是一个限速标志牌;5%的可能是一个风筝挂在树上等等。然后网络结构告知神经网络,它的结论是否正确。

即使是这个例子,也算是比较超前了。直到前不久,神经网络也还是为人工智能圈所淡忘。其实在人工智能出现的早期,神经网络就已经存在了,但神经网络对于“智能”的贡献微乎其微。主要问题是,即使是最基本的神经网络,也需要大量的运算。神经网络算法的运算需求难以得到满足。

不过,还是有一些虔诚的研究团队,以多伦多大学的Geoffrey Hinton为代表,坚持研究,实现了以超算为目标的并行算法的运行与概念证明。但也直到GPU得到广泛应用,这些努力才见到成效。

我们回过头来看这个停止标志识别的例子。神经网络是调制、训练出来的,时不时还是很容易出错的。它最需要的,就是训练。需要成百上千甚至几百万张图像来训练,直到神经元的输入的权值都被调制得十分精确,无论是否有雾,晴天还是雨天,每次都能得到正确的结果。

只有这个时候,我们才可以说神经网络成功地自学习到一个停止标志的样子;或者在Facebook的应用里,神经网络自学习了你妈妈的脸;又或者是2012年吴恩达(Andrew Ng)教授在Google实现了神经网络学习到猫的样子等等。

吴教授的突破在于,把这些神经网络从基础上显著地增大了。层数非常多,神经元也非常多,然后给系统输入海量的数据,来训练网络。在吴教授这里,数据是一千万YouTube视频中的图像。吴教授为深度学习(deep learning)加入了“深度”(deep)。这里的“深度”就是说神经网络中众多的层。更多深度学习解读:www.yangfenzi.com/tag/shenduxuexi

现在,经过深度学习训练的图像识别,在一些场景中甚至可以比人做得更好:从识别猫,到辨别血液中癌症的早期成分,到识别核磁共振成像中的肿瘤。Google的AlphaGo先是学会了如何下围棋,然后与它自己下棋训练。它训练自己神经网络的方法,就是不断地与自己下棋,反复地下,永不停歇。

深度学习,给人工智能以璀璨的未来

深度学习使得机器学习能够实现众多的应用,并拓展了人工智能的领域范围。深度学习摧枯拉朽般地实现了各种任务,使得似乎所有的机器辅助功能都变为可能。无人驾驶汽车,预防性医疗保健,甚至是更好的电影推荐,都近在眼前,或者即将实现。

人工智能就在现在,就在明天。有了深度学习,人工智能甚至可以达到我们畅想的科幻小说一般。你的C-3PO我拿走了,你有你的终结者就好了。

【本文由微信公众号“将门创业(thejiangmen)”原创编译,译者:曲晓峰,香港理工大学人体生物特征识别研究中心博士生。】

氧分子网(www.yangfenzi.com)是关注互联网生态圈的科技新媒体

·氧分子网(http://www.yangfenzi.com)延伸阅读:

➤ Facebook开源深度学习框架Torchnet与谷歌TensorFlow有何不同

➤ 地平线机器人李星宇:复杂的中国驾驶场景,正是深度学习的优势

➤ 百度吴恩达谈深度学习局限:AI经济价值目前仅来自监督学习

➤ Facebook深度学习专家:未来的人工智能是怎样

➤ 卡耐基梅隆大学邢波:为人工智能装上引擎—忆格拉丹东登山之旅

➤ 傅盛:深度学习是什么?企业核心竞争力正在从算法转变为数据

➤ 质疑AI泡沫:当我们谈论机器学习时,我们究竟在说些什么

➤ 谷歌宣告“云1.0 时代”终结,机器学习会让它称霸智能云市场?

➤ 哥伦比亚大学教授:机器学习胜过人类编程?AI 终极挑战是创造力

您可能还喜欢…

13 Responses

  1. AI Graduate说道:

    其实,机器学习跟模式识别,统计学习,数据挖掘,计算机视觉,语音识别,自然语言处理等领域有着很深的联系。
      从范围上来说,机器学习跟模式识别,统计学习,数据挖掘是类似的,同时,机器学习与其他领域的处理技术的结合,形成了计算机视觉、语音识别、自然语言处理等交叉学科。因此,一般说数据挖掘时,可以等同于说机器学习。同时,我们平常所说的机器学习应用,应该是通用的,不仅仅局限在结构化数据,还有图像,音频等应用。

      在这节对机器学习这些相关领域的介绍有助于我们理清机器学习的应用场景与研究范围,更好的理解后面的算法与应用层次。
      下图是机器学习所牵扯的一些相关范围的学科与研究领域。

                  
      模式识别
      模式识别=机器学习。两者的主要区别在于前者是从工业界发展起来的概念,后者则主要源自计算机学科。在著名的《Pattern Recognition And Machine Learning》这本书中,Christopher M. Bishop在开头是这样说的“模式识别源自工业界,而机器学习来自于计算机学科。不过,它们中的活动可以被视为同一个领域的两个方面,同时在过去的10年间,它们都有了长足的发展”。

      数据挖掘
      数据挖掘=机器学习+数据库。这几年数据挖掘的概念实在是太耳熟能详。几乎等同于炒作。但凡说数据挖掘都会吹嘘数据挖掘如何如何,例如从数据中挖出金子,以及将废弃的数据转化为价值等等。但是,我尽管可能会挖出金子,但我也可能挖的是“石头”啊。这个说法的意思是,数据挖掘仅仅是一种思考方式,告诉我们应该尝试从数据中挖掘出知识,但不是每个数据都能挖掘出金子的,所以不要神话它。一个系统绝对不会因为上了一个数据挖掘模块就变得无所不能(这是IBM最喜欢吹嘘的),恰恰相反,一个拥有数据挖掘思维的人员才是关键,而且他还必须对数据有深刻的认识,这样才可能从数据中导出模式指引业务的改善。大部分数据挖掘中的算法是机器学习的算法在数据库中的优化。

      统计学习
      统计学习近似等于机器学习。统计学习是个与机器学习高度重叠的学科。因为机器学习中的大多数方法来自统计学,甚至可以认为,统计学的发展促进机器学习的繁荣昌盛。例如著名的支持向量机算法,就是源自统计学科。但是在某种程度上两者是有分别的,这个分别在于:统计学习者重点关注的是统计模型的发展与优化,偏数学,而机器学习者更关注的是能够解决问题,偏实践,因此机器学习研究者会重点研究学习算法在计算机上执行的效率与准确性的提升。

      计算机视觉
      计算机视觉=图像处理+机器学习。图像处理技术用于将图像处理为适合进入机器学习模型中的输入,机器学习则负责从图像中识别出相关的模式。计算机视觉相关的应用非常的多,例如百度识图、手写字符识别、车牌识别等等应用。这个领域是应用前景非常火热的,同时也是研究的热门方向。随着机器学习的新领域深度学习的发展,大大促进了计算机图像识别的效果,因此未来计算机视觉界的发展前景不可估量。

      语音识别
      语音识别=语音处理+机器学习。语音识别就是音频处理技术与机器学习的结合。语音识别技术一般不会单独使用,一般会结合自然语言处理的相关技术。目前的相关应用有苹果的语音助手siri等。

      自然语言处理
      自然语言处理=文本处理+机器学习。自然语言处理技术主要是让机器理解人类的语言的一门领域。在自然语言处理技术中,大量使用了编译原理相关的技术,例如词法分析,语法分析等等,除此之外,在理解这个层面,则使用了语义理解,机器学习等技术。作为唯一由人类自身创造的符号,自然语言处理一直是机器学习界不断研究的方向。按照百度机器学习专家余凯的说法“听与看,说白了就是阿猫和阿狗都会的,而只有语言才是人类独有的”。如何利用机器学习技术进行自然语言的的深度理解,一直是工业和学术界关注的焦点。

      可以看出机器学习在众多领域的外延和应用。机器学习技术的发展促使了很多智能领域的进步,改善着我们的生活。

      神经网络是机器学习中的一个算法,跟SVM(支持向量机)齐名,同时也是深度学习的基础。深度学习实际上就是多隐层的深度神经网络。

    相互之间关联在一起,有些应用领域所代表的含义是一样的,这里我想引用台大机器学习课程中老师所讲的这些概念相互之间的区别,具体如下:
    ML与DM之间的关系
    机器学习是从假设空间H中寻找假设函数g近似目标函数f.
    数据挖掘是从大量的数据中寻找数据相互之间的特性

    ML与AI之间的关系
    人工智能是一种应用领域,机器学习是实现人工智能的一种手段,但是不限于此。

    ML与统计之间的关系
    统计的方法可以用来机器学习,比如:聚类、贝叶斯等等,当然机器学习还有很多其他的方法,如神经网络(更小范围)、SVM

    模式识别也是一个应用领域

    1
    赞同反对,不会显示你的姓名
    li zhengyang lzy
    1 人赞同
    自己的观点,不一定对。机器学习和统计分析的哲学不一样,比如前者用最大似然估计,后者会说它不是无偏的,但人家说自己是结构风险最小化压根没跟你扯统计量。神经网络是机器学习的一种建模方法,是机器学习里的小哲学,不扯多了。模式识别与数据挖掘用机器学习的模型解决,当然也用统计分析的模型,当然这些词的区分现在都不大了。人工智能还可以基于解空间的搜索来做,机器学习可以作为它的一部分(那只要是能代替人工解决问题的统计方法也可以作为人工智能的一部分?)。

    人工智能一词出现较早,主要是想利用计算机模拟人类的智慧行为,从搭建系统方面完成。机器学习词出现较晚,它是以解决预测问题为目的,一系列建模,优化,设计算法的过程。可以把这些算法移植到你要搭建的实体系统上面形成人工智能系统(例如可自动识别道路自动行驶的智能车)。神经网络只是机器学习里面的一种方法。自然语言处理只是其中机器学习的方法应用的一个领域。

    人工智能这个领域太大,它和其他几个的关系,我在另外一个回答里有一些我的观点里有回答,我就不多赘述了:通过机器学习以及大规模数据的统计,电脑可以无限逼近人脑的能力么?如果可以,哪些能力是比较容易被逼近的?

    关于另外几个,模式识别,统计理论和数据挖掘:

    关于模式识别,他基本用的是机器学习的方法(确切说是概率理论里的机器学习),而基于概率的机器学习和统计理论有很大的交际。

    而数据挖掘是机器学习和统计理论交叉的一个应用方向,他期望从一堆观察到的数据里,发现一些潜在的关系和核心。他的核心方法基本都囊括在机器学习中,也基本被统计理论包含。

    关于神经网络,计算机方向最了解的是把他作为AI中machine learning的一个分支来对待。而在其他领域,比如control里,bioinformatics里,也有应用。有一部分研究者把它作为一个独立的方向来对待,结构上也更加复杂了。
    2分钟前回复顶转发

  2. 食量不小,志气比天高说道:

    机器学习、统计分析、数据挖掘、神经网络、人工智能、模式识别,很难说谁包含于谁,只能分开说每一个概念的意义,谁服务于谁。

    数据挖掘是一种概念,从数据中挖掘到有意义的信息。
    很多人认为数据挖掘是新学科,是基于大数据,其实不然,如果给你一个数据说李嘉诚有100多亿美元,再给你一个数据是全国平均人均可支配收入水平是13279元人民币,你能挖掘出一个信息叫,李嘉诚很有钱,这也是数据挖掘。只不过很小白而已。

    模式识别是目的,识别出一种模式,比如两个眼睛一个鼻子的是人脸的模式。如果不通过电脑,手工的通过计算来识别模式,也属于模式识别

    机器学习是一种方法,通常用来进行模式识别,用机器去学习不直观的数据得到模式,这其中会需要用到各种各样的知识,比如统计分析的知识。

    人工智能,这个概念就大了,这个概念是想要人工制造出和人类一样的智能,所以很多人就想出了机器人这么一个科幻产物,有人类的智能,并且依托于机器的强大运算能力。事实上,人工智能也不一定要和电脑挂钩的,只不过现在只有电脑有这么强大的计算能力,如果有一天生物科技能够突破,说不定也能实现。(纯属YY)

    神经网络,这是学习算法中的一个很火的模型,它号称结合了多学科,模拟了人的神经过程,是很好的一种学习方法,可以说这个是基于统计学范畴的。机器学习:强调学习能力,机器在算法的指导下有一点的学习能力,比如神经网络,训练算法
    统计分析:从统计的角度出发,发现系统的规律,比如线性回归等,不过神经网络也可以看作一种非线性回归。
    数据挖掘:强调的是从一大堆数据里有价值的数据,比如最赚钱的信息,指标,比如,啤酒尿布要放一块,为了挖掘有价值的信息,当然所有方法都会用上。
    神经网络:强调模拟生物神经系统,尤其是大脑的神经网络。比如:BP网络,竞争神经网络,等各种仿生的算法。神经网络的学习机制,收敛性质等都会讨论
    人工智能:这个强调的是让机器象人一样聪明,方法就不限了,规则也罢,神经网络等仿生学也罢,都可以来为我所用
    模式识别:强调训练和识别,比如图像里识别出一个人脸,识别出树木,背景,识别验证码,。。。使用各种学习算法,分类算法,比如神经网络,SVM,。。。

    每个概念都是不同人从不同角度,不用的关注点,看这些前沿技术。有的人为了实现象人一样的机器人,比如,强调人工智能的人,有的人想从中赚钱,比如,强调数据挖掘的人,有的人对仿生比较喜爱,比如强调神经网络的人。。。。。每个相关书籍都看看,理解他们就好了

    关于模式识别,图像里找出一个人脸,树木,这个叫检测。确定图像中的人脸是谁的的,这叫识别。人工智能属于一个非常大的研究领域,其需要解决的子问题很多:演绎/推理/问题求解、知识表示、(机器)学习、自然语言处理、感知等,可见机器学习和自然语言处理同属于属于人工智能研究子领域

    从机器学习的wiki词条,可以看到神经网络属于机器学习的方法(approach)

    模式识别和机器学习的关系的确比较纠缠不清人工智能最大,机器学习是人工智能最近比较流行的一个分支。

    机器学习通常会用统计分析的方法进行分析,统计学在机器学习里占有非常重要的地位。

    神经网络是机器学习里一个研究非常广泛的方法,貌似有个会议就是研究神经网络的,NIPS,不过现在其实NIPS上很多论文也都和神经网络无关的,NIPS现在和ICML比较像了哦。。。

    数据挖掘可以认为是机器学习的一个方向了的。

    至于模式识别和机器学习的关系,就有点说不清了哦。。。不要低估搞量化金工丧心病狂的程度。
    复杂的包括非常繁复的Bayesian reasoning,甚至包含deep learning/deep reinforcement learning(当然用法没那么简单)等等。这些能表示非常复杂的hidden variables之间的关系。
    还有一些方法能自动地挖掘出一些数据中隐含的统计关系。
    有些机构还会动用新的数据源。比如红外摄像、航拍、卫星监视等等。甚至还有一些非法手段,比如行政力量干预,通过黑色渠道非法获取数据等等。
    这些第一手好的数据再加上合理的算法都能帮助提前发现变动模式。

    是模型总有失效的时间。这点要搞清楚。而优秀的机构不亏的原因只有一个:依赖持续不断的研发力量更新模型和基础设施;而新的模型和基础设施会极大地增加市场的效率。

    更新:
    1.这个行当就是rocket science,是个系统工程。母系统下面管理子系统非常庞大,复杂度高;最后拼的是整个系统运行效率、处理信息对信息解读的效率。
    2.有些答主认为不可行,理由是很奇怪的。就好比看见礼花炮仗飞不高安全系数低,就推理出没法做出火箭来载人去月球一样。

    用“机器学习”的方法去学习股价涨跌 — 这个问题已经被无数的人思考,并且实践过了。但不意味着没有价值。

    这个问题其实可以分为两个部分:
    1. 股市可以预测吗?
    2. 假如可以预测,用机器学习的方法去预测可以吗?

    先回答第一个:股市的涨跌可以预测吗?
    股市的价格变化,事实就是一个随时间变化的序列。

    只要把这个函数写出来就可以预测股价了。这个函数是什么样子的? 我们可以尝试用N个模型(线性,非线性, 概率)来进行逼近。如果股价的变化是符合这几个模型的,那么在有足够多的训练数据的情况下,股价将被模拟出来。但是事实是,在尝试过许多许多模型的情况下,这些模型几乎没能预测股价的变化,有的模型只能在特定的区间能做一些不是十分精准的预测。

    先讨论一下Reinforcement Learning, 这个算法基于马尔可夫性,从一个状态预测下一个状态,但是股价的涨跌具有强烈的马尔可夫性吗?也就是上一时刻的股价与下一个时刻的股价间有必然的联系吗?应该是不太大。这种基于N阶马尔可夫性的系统对于股价的分析很不利。而且假如只使用股价的历史数据进行模型的训练的话,准确度可以说几乎为0。

    影响股价的因素不仅仅是历史股价,还有更多的因素,公司的近况,股民对股票的态度,政策的影响等等。所以许多人会从这方面进行入手,用人工智能提供的快速计算能力,使用合适的模型,来量化这些因素,例如, (政策X出台, 可能会对股价造成变化y元)。

    还有在一些有趣的预测股价方法大都有基于语义分析, 分析股民对某支股票的评论,对某个事件的情绪等等,以此来预测股价的涨跌。等等 当你的模型将所有的因素全都考虑进来, 那么股价的预测就唾手可得了。
    股价 = f(政策因素, 公司情况,市场因素, 历史股价,上一年历史股价, 某个股民自杀的影响…)

    这些因素到底有多少? 它们之间会如何影响,这才是问题的关键。在某些稳定的情况下,我们是可以做大概的预测的,但是有很多时候,会不准确,这是因为,你的模型 永远不可能把所有的 因素都考虑进来。而且你也不会知道 还会有什么因素会影响股价的波动。在这么多的因素,和因素与因素间还会产生互相影响的情况下。股价的模型将会变得极其复杂。如下图.

    一个因素与一个因素之间的互相影响是 很可能被预测出来的,但是 假如它们之间产生了相互的影响,这时候整个系统就变得几乎不可预测了。一个因素发生变化,会造成好几个因素的变化,最后这几个因素又会反作用回来使上一个因素发生变化(直接的,间接的),股价变化一下子就变得虚无飘渺起来。一些微小的因素也可以通过这种系统无限的放大,最后给股市造成巨大的影响。

    也就是 在南美洲一只蝴蝶扇动她的翅膀也可能会对你的股价造成巨大的影响,这就是混沌现象。
    是不是预测股价是一点希望都没有了呢?
    当然,在某些情况下可以认为 部分因素是稳定的(的确, 因为许多事件的影响是有延时的,在延时之间我们可以认为其不变),而且可以忽略掉一些影响较小的因素(假设它们乖乖的,不要调皮),所以幸运的话,我们的模型将变得稍微简单一点,这样,也许有时候我们就能得到一些令人开心的结果了。

    所以LZ想要进行股价的预测的话,还是从分析各方面因素来入手。和前面各位说的一样,如果你的真的把历史数据做为 依据来建立了你的系统。那么 只能用来 给别人作为(历史股价)这个因素的参考。 真正的股价还得靠各方面信息综合起来考虑。

    (自然界中还有许多无法预测的现象,欲知more, 请继续阅读..)

    为什么股市的涨跌不容易被预测?
    因为股市是一个有反馈的非线性系统,而股票的涨跌现象是一种混沌现象。
    混沌现象是一个目前仍不可预测的东西。(例如 奶牛身上的花纹形状,天气的变化,心跳的波形,人脑的运行, 海滩上乱石的现状,滩涂的形状等等都属于混沌现象,我们能略知其一二,却永远无法精确地预测)http://www.yyets.com/resource/29824(这个BBC的视频做了精彩的探讨)
    但具体是为什么呢? 为什么有反馈的系统会造成了一种完全不可预测的状态变化?<这个有空再继续探讨>机器学习的用法不是帮我们寻找因素(即:特征量),而是根据给定的特征量对模型进行学习。另外不必须知道所有因素才能做预测。请注意我的逻辑,我是说存在只了解部分因素而做出准确判断的情况。正是因为特征量相互之间也许并不独立,因此可以给问题降维也就是消掉一些特征量。此外,对于因素相互之间有影响的系统,也不一定不可以进行分析。比如网页的检索算法就很好地处理了相互影响的复杂网络系统,为用户找到了与他们的问题最相关的网站。

  3. Nong Bloody说道:

    一个是 没有足够的数据,即使有了大量数据也没有足够的计算能力去计算。 就拿模拟神经元来说吧。10几个神经元互相连接,互相反馈,其变化的可能性一般的计算机都已经无法模拟了。更别说10亿个相连的神经元。 这是非得用数字系统去计算 连续的模拟系统的弊端。 一滴水引起的水振荡的波纹,在自然中我们很容易就能观察到,和创造。但是一个数字系统中需要模拟这种波纹可是很复杂的。一些游戏中需要很强大的显卡才能将一滴水引起的波纹模拟出来。更别提去计算和预测几滴水,一条河,一片海了。 或许我们需要更科学的方法去复制和实现人工智能。

    建立一个三层的神经网络大概也就用几十个神经元,这个是可以用计算机模拟的,而且从经验上来看拟合误差相对于四层和五层还算不错,而且速度远比四层和五层的神经网络要快,10亿个神经元暂时还用不到。。。你所说的过拟合确实是存在的,神经网络模型每一次仿真结果都可能会不同,所以还需要进行针对过拟合程度进行评价,我对量化投资中忌讳的未来函数非常不了解,不敢过多评价

    “记得谷歌创始人说过,利用人们的搜索内容的大数据进行股市预测,不是不可能,只是不允许。。。”
    凡是能够从股市中稳定获利的手段,都会导致市场更有效(同时加入到市场中的信息也变多了),从而导致这个手段会随着时间失效。
    还有一个问题是,加入到市场中的信息越多,“理想的、正确的”模型中需要包含的参数就越来越多,市场变的更加混沌和不可预测。由于大家都在不停地用自己的模型去影响市场,所以任何人的模型都会在一段时间后失效,因为系统里多出了许多你的模型中原本没有考虑的因素。
    也就是说市场里的玩家越多、越强,这个系统会自动的变的越来越复杂,wtf?!真是个悲剧……

    人工智能带给人类生活更多的是积极影响。第一,人工智能可以把人类从繁重的劳动中解放出来,提高人类生产生活的效率和质量。(如果只侧重生活,这一点可以展开为 提高生产效率 使人类免受高风险工作 提高生活质量等)第二,人工智能的进步会极大地革新人类的思维方式,看待世界的角度,深化人类对自身所处宇宙地位等问题的思考。第三,人工智能本身是人类最杰出的作品,它在某种程度上可以实现人类文化思想等一切文明结晶的永生。
    负面影响也要提,人工智能的过度发展会使人类越来越依赖科技,甚至成为科技的奴隶,同时人的各种能力也会在惰性中退化,人的价值和尊严会逐渐被更高效更智能的机器取代。
    但是在可预见的短期,人工智能会极大的造福人类。同时从长远来看,无论人工智能是否最终会取代人类,它始终是人类在浩瀚宇宙中孤独探索所造出最像我们自己的东西,人类所经受的消极影响从来不在于人工智能的进化程度,而在于人类对自我的认知和把握。

    文艺复兴旗下的另几支基金都不怎么赚钱,大奖章的个例不可用来说明“有稳赚不赔的方法”。基金公司亏损和关门的也有很多啊。
    某些时候如果你依靠技术优势或别的某种优势,发现了别人没发现的信息,或利用了别人利用不了的信息,那么挣钱的“概率”会比较大,但仍然是不可持续的,短则几个月、长则一两年即会逐渐失效,必须要不停的改进模型。
    根据文艺复兴囤积了这么多高级人才,就可以推算出它的模型肯定一直在不断演化。如果一个固定的模型能够永远高回报的运行下去的话,最佳策略显然是几个创始人低调的坐吃金山就行了,招聘那么多人除了分掉本属自己的钱,还有暴露自己模型和策略的风险。目前的做法是这样的,通过时间序列分析去捕捉系统动力学性质,可以计算出一个最优估计,从而分析未来走向。如果没有重大新闻出现,还是可以有比较好的估计,这要是所谓的自动交易

    因为做量化本来就是去想去试无数的方法来拟合市场的过程,首先1要有一套方法,然后2细化成一套算法,然后3进行历史数据回测,然后4进行实际交易。我不可能只在第一步就预见性的看到第四步的效果。
    从第一步到第二步中,可能方法是有用的,但本身交易中有着非常多的数据,海量数据如何分类、如何描述、如何选取,可能一点点细微的不同都会导致结果完全不一样。
    从第二步到第三步,有了算法去进行历史数据回测,其实就是去训练和优化参数的过程,但很难避免的就是过度优化的问题,这个度如何选取是量化的难点。
    第三步到第四步,即使有了漂亮的历史回测结果,但真正用到实盘上并不一定会赚钱,要知道市场结构和属性一直在不断的变化中,中间又是一个反复调整的过程。
    所以我的观点是,你倒是找到历史数据先测呀。。。。

    强化学习的本质,【如果我没有记错。。。】,应该就是求解一个概率转移矩阵吧,从控制的角度来理解。我觉得强化学习的弱点在于,对于高维数据的处理能力和对于海量数据的处理能力,以及其基于的一些假设,比如是马尔科夫假设等等。
    如果用深度学习做是否可以,百度谷歌都在弄深度学习,这个概念被炒爆了,百度深度学习实验室的余凯前段时间到清华开了讲座。那么它是否可以解决呢?

    我个人虽然对于DL实现人工智能很怀疑,觉得至少还有很长一段路要走,但是我觉得处理大数据应该是没有问题的。问题就在于输入的信息(输入的数据)。如果信息是不对称的,那么即使再大的数据,也是有缺失的,而缺失的部分不能通过推理获得的时候,再好的算法也无济于事。所以即使一开始你有一个“正确”模型,也未必意味着它的完全正确性。当影响股市的某些独立因素加入,而这些因素没有在你的模型中的时候,你的模型就可能fail了。

    另一个问题是,如何获得局大的计算能力。记得去年去复旦参加MLA2013,阿里就有人在上面说,他们现在用的其实就是很简单的算法,也遇到了很多问题,不知道如何解决,因为数据实在是太大了【curse of dimensionality】。我不知道股票购买行为一天会生成多少数据量,但是和淘宝应该还是有得一比的。如果你想自己组团做DL来分析和预测股票行为,恐怕有点困难。【要知道百度都去硅谷开了LDL】

    最后一个问题,基于你能够预测别人的行为(=你的学习算法works)的前提假设,分两类讨论。
    1)同时别人也可以预测你的行为(=别人的算法也works)。那么你能预测到他,你会采取一定措施。而他能够预测到你,他也会采取措施。这样下去就类似于你在两面镜子之间,有无数多个你在镜子里。总之,你仅能通过上一时刻的信息预测对方的行为,而对方行为在这一刻的不可知性是难以预知的。虽然RL有这方面的功能,比如Kalman filter,但是那个模型未免也太简单了。那个就是一个线性函数加一个(正态的)噪声项。所以我觉得,当双方能力平等时,预知股市行为是困难的。
    2)同时别人没有预测你的行为的能力(=别人的算法不work)。那么你就【可能】可以预测股市了。那又怎么样呢?你不如去预测点对于社会有好处的东西,比如语言翻译,比如文本信息处理,比如智能车,比如智能电网,比如机器人等等。

    所以我觉得首先算法hardly可以预测股市行为,其次即使我们有很好的预测算法也可能预测不了股市行为,最后我们如果有很好的预测方法,为什么不去做一些对社会有积极意义的事情呢,而不是投机取巧。

    。强化学习的本质是学习动作状态与值的映射,通过与环境的交互获取反馈,并最大化累积回报来求取最优策略。
    这其中有一个重要前提就是环境MDP模型且保持不变。在目前已有的强化学习研究中,在某一MDP环境下获得的策略,在其他环境下适用性的问题,还是一个很大的难题。因此如果假设股价变动为一MDP模型,且模型保持不变,那么通过强化学确实可以获得最优策略。但实际上,股价的影响因素过于复杂,根本不可能为一确定的MDP模型,所以通过强化学习是没有办法求解的。
    强化学习无须先验知识,需要不断试错,因此在机器学习中应该是效率较低的一种学习方法。在已知模型的情况下,通过动态规划方法能获得更好的结果。
    至于机器学习方法对股价进行预测,由于专业不在这个方向就不细说了,其他大神会解释的更清楚。个人觉得采用SVM和DL效果会更好。

  4. 上官 永庆说道:

    所谓的“同一种思维范式”就是人工神经网络。人工神经网络,说到底是机器学习算法的一类。从古溯今,该类算法的发展大致经历了三次高潮:1. 二十世纪四十至六十年代,当时广为人知的控制论(cybernetics);2. 二十世纪八十至九十年代的连接主义(connectionism);3. 再就是2006年之后的深度学习(deep learning)。

    在此我想说的是,深度学习,相比前两次高潮中的神经网络模型,并非仅仅是层数上简单粗暴的堆叠,更重要则是端到端(end-to-end)的表示学习(representation learning)思想。深度学习时代,输入数据直接变成了欲处理对象的最初形态,如初始图像、初始语音等。这类数据表示与高层概念表示之间往往存在较大鸿沟(gap),而端到端的无缝学习过程将表示学习和分类器训练整体耦合为一个系统,可以较理想的弥合这一鸿沟,这也是DL在图像和语音这类数据上独占鳌头的原因。由是,新时代下的发展赋予了神经网络新的含义,还不应该取个新名字吗?:)

    深度学习的内涵多了去了,把深度学习说成是神经网络的rebranding,感觉是做传统统计学习的人不了解而犯的错误。

    深度学习的核心思想,就是训练一些有多层trainable transformation的变换。以此来实现knowledge representation的任务。

    深度学习的算法远不止有DNN做classification 跟regression这么简单。深度学习在unsupervised learning,reinforcement learning等任务上,也已经彻底超越了传统方法。

    最简单的,deep graphical model是nn吗?当然不是。但显然也算深度学习。

    1. 2006年改的,Geoffrey Hinton等人搞了一个深度信念网络,率先使用“深度”这个词。他们引入一个叫greedy layer wise pre-training策略,其他研究者发现这个对训练更深层度的神经网络很有效,由此引发了一波热潮。

    2. 这波的研究者热衷于使用“深度学习“这个词,公开的说法是为了强调”深度“在理论上重要性。原来使用BP来训练,信号是逐层更新的,当层次增加后,原有的反馈信号就变得很弱,所以往往只使用一层。当网络层次增加后,我们可以使用更复杂拓扑网络结构去训练一些奇奇怪怪的东西。

    当然,私以为骗经费忽悠人也是重要原因之一。

    3. 其实没啥区别,深度网络就是神经网络。不正式地说,单讲神经网络的时候常常特指BP算法;而深度学习指代的是一系列训练深层神经网络的算法。

    虽然两者结构相似(或者说一样),但NN即便有BP,在深度大的情况下训练非常非常慢,以至于没法实用。而且可能面临梯度消失,以至于没法继续train下去。

    深度学习的结构之一是NN的递归,把一个NN的结果作为另一个NN的输入,分段分别搞。而且深度学习大量用GPU做训练,靠硬件解决一部分training速度慢的问题。而真正说深度学习的部分,就是它与NN区别的部分。或者说,NN是深度学习的工具(之一)。

    “神经网络”相对“人工智能”是一个相对狭隘的领域。“人工智能”的3个基本学派所谓“符号主义“、”行为主义“,”连接主义“,”神经网络“只是连接主义派的代表之作,也就是说只是人工智能的冰山一角而已。

    下面就我一己之见解读一下怎么入门:
    1. 必须感兴趣,必须感兴趣,必须感兴趣(重要的话重复3遍) 。认可这门科学,认识到进入这个领域你将不再是一个机械的coder,而是一个有更高追求的研究和实践者。保持学习热情,接下来什么方法入门才有意义。

    2. 人工智能本身是一门复杂性科学。复杂性科学意味着它是一个多学科综合产物,范围相当之广。我觉得必须具备的几个基础是 数学、计算机基础(算法 数据结构)、一些语言和逻辑学基础。数学我觉得熟练掌握大学里面的一些工科数学就可以,主要是矩阵、概率论;计算机基础主要是基本的编程能力,算的法解读能力;语言和逻辑学的基础主要对NLP(自然语言处理)和符号计算这块比较重要。题主说看到其中有些数学就想哭了,别哭!万物一理,世界的本质是简单的,要在理解的基础上去对待数学。比如,你看到BP神经网络的反向传播训练算法,一堆公式就想自挂东南枝了,打住!其实就是在网络权重张成的空间上对误差函数做梯度下降(当看到这部分回头好好想想我说的这句话),梯度下降找到权重极小值,网络就训练好了,没那么复杂的,要理解。

    3. 这个领域如果很宽泛的学习往往一无所获很迷茫。书本上只告诉你基本原理,自己也自以为懂了,其实不是的。这时候“神经网络”不失为一个很好的切入点,神经网络里面的前馈网络基本就是一种回归模型的变种,在很多实战场合做分类预测效果很好;反馈网络里面包含了一些有趣的系统动力学特性,其中的数学也是相当漂亮,Hopfield网络的自联想、玻尔兹曼机的能量钳制(多层玻尔兹曼就演变成深度学习模型了)都很有吸引力。所以,我建议你学习人工智能就从学习神经网络开始吧,虽然目前的神经网络模型距离人类的神经网络还差十万八千里,但是这里是能激发你学习热情的地方

    4. 好了,上面说了一堆然并卵,讲讲具体该干点啥。实践出真知,不写程序跑跑几个神经网络,是不会真正领悟其中精髓的。书看完之后,找一些算法包实践其中的算法,MATLAB就把神经网络工具箱的例子起码运行一遍,Python的话也有很多包,找测试数据,自己编代码试验。如果能在你的工作项目中用到一点神经网络,那就更NB了,自豪感油然而生,接下来不多说了,到这里你已经入门了!

    边做边学,我就是这么入门的。学HMM的时候就去翻线性代数的马尔科夫矩阵和特征值这一节来看。
    2. 有项目最重要,实践出真知,真实的问题下才知道算法的优劣之处。
    3. 申请个学术文献库的账号,前人总结的结论就在那里,文章质量要好于行业网站转载的。
    4. 选好研究方向,以神经网络为例,图像优先学CNN(就是上面 @李济深 所说的卷积神经网络),NLP方面优先学RNN和LSTM。
    5. 看名校的课程吧,推荐网易公开课。

    此外,『神经网络』和『人工智能』这两个概念不是在同一个层面上的。
    其实,我还想说,计算机之外的行业经验才是最重要的,额……,也觉得人工智能这个词被滥用了

  5. 王小龙说道:

    神经网络很萌的!

    0. 分类
    神经网络最重要的用途是分类,为了让大家对分类有个直观的认识,咱们先看几个例子:
    垃圾邮件识别:现在有一封电子邮件,把出现在里面的所有词汇提取出来,送进一个机器里,机器需要判断这封邮件是否是垃圾邮件。
    疾病判断:病人到医院去做了一大堆肝功、尿检测验,把测验结果送进一个机器里,机器需要判断这个病人是否得病,得的什么病。
    猫狗分类:有一大堆猫、狗照片,把每一张照片送进一个机器里,机器需要判断这幅照片里的东西是猫还是狗。
    这种能自动对输入的东西进行分类的机器,就叫做分类器。

    分类器的输入是一个数值向量,叫做特征(向量)。在第一个例子里,分类器的输入是一堆0、1值,表示字典里的每一个词是否在邮件中出现,比如向量(1,1,0,0,0……)就表示这封邮件里只出现了两个词abandon和abnormal;第二个例子里,分类器的输入是一堆化验指标;第三个例子里,分类器的输入是照片,假如每一张照片都是320*240像素的红绿蓝三通道彩色照片,那么分类器的输入就是一个长度为320*240*3=230400的向量。

    分类器的输出也是数值。第一个例子中,输出1表示邮件是垃圾邮件,输出0则说明邮件是正常邮件;第二个例子中,输出0表示健康,输出1表示有甲肝,输出2表示有乙肝,输出3表示有饼干等等;第三个例子中,输出0表示图片中是狗,输出1表示是猫。

    分类器的目标就是让正确分类的比例尽可能高。一般我们需要首先收集一些样本,人为标记上正确分类结果,然后用这些标记好的数据训练分类器,训练好的分类器就可以在新来的特征向量上工作了。

    1. 神经元
    咱们假设分类器的输入是通过某种途径获得的两个值,输出是0和1,比如分别代表猫和狗。现在有一些样本:
    大家想想,最简单地把这两组特征向量分开的方法是啥?当然是在两组数据中间画一条竖直线,直线左边是狗,右边是猫,分类器就完成了。以后来了新的向量,凡是落在直线左边的都是狗,落在右边的都是猫。

    一条直线把平面一分为二,一个平面把三维空间一分为二,一个n-1维超平面把n维空间一分为二,两边分属不同的两类,这种分类器就叫做神经元。

    大家都知道平面上的直线方程是,等式左边大于零和小于零分别表示点在直线的一侧还是另一侧,把这个式子推广到n维空间里,直线的高维形式称为超平面,它的方程是:

    神经元就是当h大于0时输出1,h小于0时输出0这么一个模型,它的实质就是把特征空间一切两半,认为两瓣分别属两个类。你恐怕再也想不到比这更简单的分类器了,它是McCulloch和Pitts在1943年想出来了。

    这个模型有点像人脑中的神经元:从多个感受器接受电信号,进行处理(加权相加再偏移一点,即判断输入是否在某条直线的一侧),发出电信号(在正确的那侧发出1,否则不发信号,可以认为是发出0),这就是它叫神经元的原因。

    当然,上面那幅图我们是开了上帝视角才知道“一条竖直线能分开两类”,在实际训练神经元时,我们并不知道特征是怎么抱团的。神经元模型的一种学习方法称为Hebb算法:

    先随机选一条直线/平面/超平面,然后把样本一个个拿过来,如果这条直线分错了,说明这个点分错边了,就稍微把直线移动一点,让它靠近这个样本,争取跨过这个样本,让它跑到直线正确的一侧;如果直线分对了,它就暂时停下不动。因此训练神经元的过程就是这条直线不断在跳舞,最终跳到两个类之间的竖直线位置。

    2. 神经网络
    MP神经元有几个显著缺点。首先它把直线一侧变为0,另一侧变为1,这东西不可微,不利于数学分析。人们用一个和0-1阶跃函数类似但是更平滑的函数Sigmoid函数来代替它(Sigmoid函数自带一个尺度参数,可以控制神经元对离超平面距离不同的点的响应,这里忽略它),从此神经网络的训练就可以用梯度下降法来构造了,这就是有名的反向传播算法。

    神经元的另一个缺点是:它只能切一刀!你给我说说一刀怎么能把下面这两类分开吧。

    解决办法是多层神经网络,底层神经元的输出是高层神经元的输入。我们可以在中间横着砍一刀,竖着砍一刀,然后把左上和右下的部分合在一起,与右上的左下部分分开;也可以围着左上角的边沿砍10刀把这一部分先挖出来,然后和右下角合并。

    每砍一刀,其实就是使用了一个神经元,把不同砍下的半平面做交、并等运算,就是把这些神经元的输出当作输入,后面再连接一个神经元。这个例子中特征的形状称为异或,这种情况一个神经元搞不定,但是两层神经元就能正确对其进行分类。

    只要你能砍足够多刀,把结果拼在一起,什么奇怪形状的边界神经网络都能够表示,所以说神经网络在理论上可以表示很复杂的函数/空间分布。但是真实的神经网络是否能摆动到正确的位置还要看网络初始值设置、样本容量和分布。

    神经网络神奇的地方在于它的每一个组件非常简单——把空间切一刀+某种激活函数(0-1阶跃、sigmoid、max-pooling),但是可以一层一层级联。输入向量连到许多神经元上,这些神经元的输出又连到一堆神经元上,这一过程可以重复很多次。这和人脑中的神经元很相似:每一个神经元都有一些神经元作为其输入,又是另一些神经元的输入,数值向量就像是电信号,在不同神经元之间传导,每一个神经元只有满足了某种条件才会发射信号到下一层神经元。当然,人脑比神经网络模型复杂很多:人工神经网络一般不存在环状结构;人脑神经元的电信号不仅有强弱,还有时间缓急之分,就像莫尔斯电码,在人工神经网络里没有这种复杂的信号模式。

    神经网络的训练依靠反向传播算法:最开始输入层输入特征向量,网络层层计算获得输出,输出层发现输出和正确的类号不一样,这时它就让最后一层神经元进行参数调整,最后一层神经元不仅自己调整参数,还会勒令连接它的倒数第二层神经元调整,层层往回退着调整。经过调整的网络会在样本上继续测试,如果输出还是老分错,继续来一轮回退调整,直到网络输出满意为止。这很像中国的文艺体制,武媚娘传奇剧组就是网络中的一个神经元,最近刚刚调整了参数。

    3. 大型神经网络

    我们不禁要想了,假如我们的这个网络有10层神经元,第8层第2015个神经元,它有什么含义呢?我们知道它把第七层的一大堆神经元的输出作为输入,第七层的神经元又是以第六层的一大堆神经元做为输入,那么这个特殊第八层的神经元,它会不会代表了某种抽象的概念?

    就好比你的大脑里有一大堆负责处理声音、视觉、触觉信号的神经元,它们对于不同的信息会发出不同的信号,那么会不会有这么一个神经元(或者神经元小集团),它收集这些信号,分析其是否符合某个抽象的概念,和其他负责更具体和更抽象概念的神经元进行交互。

    2012年多伦多大学的Krizhevsky等人构造了一个超大型卷积神经网络 ,有9层,共65万个神经元,6千万个参数。网络的输入是图片,输出是1000个类,比如小虫、美洲豹、救生船等等。这个模型的训练需要海量图片,它的分类准确率也完爆先前所有分类器。纽约大学的Zeiler和Fergusi 把这个网络中某些神经元挑出来,把在其上响应特别大的那些输入图像放在一起,看它们有什么共同点。他们发现中间层的神经元响应了某些十分抽象的特征。

    第一层神经元主要负责识别颜色和简单纹理

    第二层的一些神经元可以识别更加细化的纹理,比如布纹、刻度、叶纹。

    第三层的一些神经元负责感受黑夜里的黄色烛光、鸡蛋黄、高光。

    第四层的一些神经元负责识别萌狗的脸、七星瓢虫和一堆圆形物体的存在。

    第五层的一些神经元可以识别出花、圆形屋顶、键盘、鸟、黑眼圈动物。

    这里面的概念并不是整个网络的输出,是网络中间层神经元的偏好,它们为后面的神经元服务。虽然每一个神经元都傻不拉几的(只会切一刀),但是65万个神经元能学到的东西还真是深邃呢。

  6. 王小龙说道:

    神经网络很萌的!

    0. 分类
    神经网络最重要的用途是分类,为了让大家对分类有个直观的认识,咱们先看几个例子:
    垃圾邮件识别:现在有一封电子邮件,把出现在里面的所有词汇提取出来,送进一个机器里,机器需要判断这封邮件是否是垃圾邮件。
    疾病判断:病人到医院去做了一大堆肝功、尿检测验,把测验结果送进一个机器里,机器需要判断这个病人是否得病,得的什么病。
    猫狗分类:有一大堆猫、狗照片,把每一张照片送进一个机器里,机器需要判断这幅照片里的东西是猫还是狗。
    这种能自动对输入的东西进行分类的机器,就叫做分类器。

    分类器的输入是一个数值向量,叫做特征(向量)。在第一个例子里,分类器的输入是一堆0、1值,表示字典里的每一个词是否在邮件中出现,比如向量(1,1,0,0,0……)就表示这封邮件里只出现了两个词abandon和abnormal;第二个例子里,分类器的输入是一堆化验指标;第三个例子里,分类器的输入是照片,假如每一张照片都是320*240像素的红绿蓝三通道彩色照片,那么分类器的输入就是一个长度为320*240*3=230400的向量。

    分类器的输出也是数值。第一个例子中,输出1表示邮件是垃圾邮件,输出0则说明邮件是正常邮件;第二个例子中,输出0表示健康,输出1表示有甲肝,输出2表示有乙肝,输出3表示有饼干等等;第三个例子中,输出0表示图片中是狗,输出1表示是猫。

    分类器的目标就是让正确分类的比例尽可能高。一般我们需要首先收集一些样本,人为标记上正确分类结果,然后用这些标记好的数据训练分类器,训练好的分类器就可以在新来的特征向量上工作了。

    1. 神经元
    咱们假设分类器的输入是通过某种途径获得的两个值,输出是0和1,比如分别代表猫和狗。现在有一些样本:
    大家想想,最简单地把这两组特征向量分开的方法是啥?当然是在两组数据中间画一条竖直线,直线左边是狗,右边是猫,分类器就完成了。以后来了新的向量,凡是落在直线左边的都是狗,落在右边的都是猫。

    一条直线把平面一分为二,一个平面把三维空间一分为二,一个n-1维超平面把n维空间一分为二,两边分属不同的两类,这种分类器就叫做神经元。

    大家都知道平面上的直线方程是,等式左边大于零和小于零分别表示点在直线的一侧还是另一侧,把这个式子推广到n维空间里,直线的高维形式称为超平面,它的方程是:

    神经元就是当h大于0时输出1,h小于0时输出0这么一个模型,它的实质就是把特征空间一切两半,认为两瓣分别属两个类。你恐怕再也想不到比这更简单的分类器了,它是McCulloch和Pitts在1943年想出来了。

    这个模型有点像人脑中的神经元:从多个感受器接受电信号,进行处理(加权相加再偏移一点,即判断输入是否在某条直线的一侧),发出电信号(在正确的那侧发出1,否则不发信号,可以认为是发出0),这就是它叫神经元的原因。

    当然,上面那幅图我们是开了上帝视角才知道“一条竖直线能分开两类”,在实际训练神经元时,我们并不知道特征是怎么抱团的。神经元模型的一种学习方法称为Hebb算法:

    先随机选一条直线/平面/超平面,然后把样本一个个拿过来,如果这条直线分错了,说明这个点分错边了,就稍微把直线移动一点,让它靠近这个样本,争取跨过这个样本,让它跑到直线正确的一侧;如果直线分对了,它就暂时停下不动。因此训练神经元的过程就是这条直线不断在跳舞,最终跳到两个类之间的竖直线位置。

    2. 神经网络
    MP神经元有几个显著缺点。首先它把直线一侧变为0,另一侧变为1,这东西不可微,不利于数学分析。人们用一个和0-1阶跃函数类似但是更平滑的函数Sigmoid函数来代替它(Sigmoid函数自带一个尺度参数,可以控制神经元对离超平面距离不同的点的响应,这里忽略它),从此神经网络的训练就可以用梯度下降法来构造了,这就是有名的反向传播算法。

    神经元的另一个缺点是:它只能切一刀!你给我说说一刀怎么能把下面这两类分开吧。

    解决办法是多层神经网络,底层神经元的输出是高层神经元的输入。我们可以在中间横着砍一刀,竖着砍一刀,然后把左上和右下的部分合在一起,与右上的左下部分分开;也可以围着左上角的边沿砍10刀把这一部分先挖出来,然后和右下角合并。

    每砍一刀,其实就是使用了一个神经元,把不同砍下的半平面做交、并等运算,就是把这些神经元的输出当作输入,后面再连接一个神经元。这个例子中特征的形状称为异或,这种情况一个神经元搞不定,但是两层神经元就能正确对其进行分类。

    只要你能砍足够多刀,把结果拼在一起,什么奇怪形状的边界神经网络都能够表示,所以说神经网络在理论上可以表示很复杂的函数/空间分布。但是真实的神经网络是否能摆动到正确的位置还要看网络初始值设置、样本容量和分布。

    神经网络神奇的地方在于它的每一个组件非常简单——把空间切一刀+某种激活函数(0-1阶跃、sigmoid、max-pooling),但是可以一层一层级联。输入向量连到许多神经元上,这些神经元的输出又连到一堆神经元上,这一过程可以重复很多次。这和人脑中的神经元很相似:每一个神经元都有一些神经元作为其输入,又是另一些神经元的输入,数值向量就像是电信号,在不同神经元之间传导,每一个神经元只有满足了某种条件才会发射信号到下一层神经元。当然,人脑比神经网络模型复杂很多:人工神经网络一般不存在环状结构;人脑神经元的电信号不仅有强弱,还有时间缓急之分,就像莫尔斯电码,在人工神经网络里没有这种复杂的信号模式。

    神经网络的训练依靠反向传播算法:最开始输入层输入特征向量,网络层层计算获得输出,输出层发现输出和正确的类号不一样,这时它就让最后一层神经元进行参数调整,最后一层神经元不仅自己调整参数,还会勒令连接它的倒数第二层神经元调整,层层往回退着调整。经过调整的网络会在样本上继续测试,如果输出还是老分错,继续来一轮回退调整,直到网络输出满意为止。这很像中国的文艺体制,武媚娘传奇剧组就是网络中的一个神经元,最近刚刚调整了参数。

    3. 大型神经网络

    我们不禁要想了,假如我们的这个网络有10层神经元,第8层第2015个神经元,它有什么含义呢?我们知道它把第七层的一大堆神经元的输出作为输入,第七层的神经元又是以第六层的一大堆神经元做为输入,那么这个特殊第八层的神经元,它会不会代表了某种抽象的概念?

    就好比你的大脑里有一大堆负责处理声音、视觉、触觉信号的神经元,它们对于不同的信息会发出不同的信号,那么会不会有这么一个神经元(或者神经元小集团),它收集这些信号,分析其是否符合某个抽象的概念,和其他负责更具体和更抽象概念的神经元进行交互。

    2012年多伦多大学的Krizhevsky等人构造了一个超大型卷积神经网络 ,有9层,共65万个神经元,6千万个参数。网络的输入是图片,输出是1000个类,比如小虫、美洲豹、救生船等等。这个模型的训练需要海量图片,它的分类准确率也完爆先前所有分类器。纽约大学的Zeiler和Fergusi 把这个网络中某些神经元挑出来,把在其上响应特别大的那些输入图像放在一起,看它们有什么共同点。他们发现中间层的神经元响应了某些十分抽象的特征。

    第一层神经元主要负责识别颜色和简单纹理

    第二层的一些神经元可以识别更加细化的纹理,比如布纹、刻度、叶纹。

    第三层的一些神经元负责感受黑夜里的黄色烛光、鸡蛋黄、高光。

    第四层的一些神经元负责识别萌狗的脸、七星瓢虫和一堆圆形物体的存在。

    第五层的一些神经元可以识别出花、圆形屋顶、键盘、鸟、黑眼圈动物。

    这里面的概念并不是整个网络的输出,是网络中间层神经元的偏好,它们为后面的神经元服务。虽然每一个神经元都傻不拉几的(只会切一刀),但是65万个神经元能学到的东西还真是深邃呢。

  7. 谨言慎行说道:

    中国科学院计算技术研究所陈云霁、陈天石课题组提出的深度学习处理器指令集DianNaoYu被计算机体系结构领域顶级国际会议ISCA2016(InternationalSymposiumonComputerArchitecture)所接收,其评分排名所有近300篇投稿的第一名。模拟实验表明,采用DianNaoYu指令集的寒武纪深度学习处理器相对于x86指令集的CPU有两个数量级的性能提升。

    DianNao是寒武纪系列的第一个原型处理器结构,包含一个处理器核,主频为0.98GHz,峰值性能达每秒4520亿次神经网络基本运算,65nm工艺下功耗为0.485W,面积3.02mm2。在若干代表性神经网络上的实验结果表明,DianNao的平均性能超过主流CPU核的100倍,但是面积和功耗仅为1/10,效能提升可达三个数量级;DianNao的平均性能与主流GPGPU相当,但面积和功耗仅为主流GPGPU百分之一量级。
    3月23日听了陈老师的报告,感觉受益良多。

    陈老师课题组做的工作应该算是很开创性的工作了。以往我们总是说国内的科研人员做课题喜欢跟热点凑热闹,现在看来全球的研究人员其实也都是这样——陈老师的工作发表以后,去年一年国际上就有几十篇paper跟住了他们,针对他们的工作做了一些改进。

    陈老师首先介绍了为什么要有神经网络处理器:
    CPU/GPU用于智能信息的处理时,效率十分低下,谷歌大脑项目用了1.6万个CPU核跑了7天才完成猫脸识别。为了追求更高的识别能力,神经网络的规模正在快速增长。目前阻碍Deep Learning发展的很大的一个瓶颈就是速度了。他认为要克服这个瓶颈,神经网络处理器是迄今为止最好解决方案。

    而且回顾计算的历史,我们会发现一个从通用计算走向专用计算的一个细分趋势:
    图形处理-> GPU
    信号处理-> DSP
    认知处理-> 神经网络处理器

    其实我本来是挺想把神经网络处理器叫NNP(Neural Network Processor)的,但陈老师他们把它起了名字叫DianNao(电脑)。这里面还有一段渊源:
    本来陈老师课题组想给这个芯片起个electric brain之类的名字的,后来与陈老师课题组合作的一位法国学者建议他们给成果起个中文名字,这样对于法国方面来说是外文,显得比较“洋气”。

    要说效能的话,我们可以摆一点数据:1GHz, 0.485W@65nm, 通用CPU 1/10的面积,100的性能。但是我觉得这个数据放在这里并没有太大的意义。首先,DianNao系列处理器现在并没有完全进入商业生产阶段,芯片制程方面的优化应该还有很大的余地。其次,他是神经网络处理器,算的东西跟通用CPU不一样。发明有先后,术业有专攻,你让GPU跟CPU去比浮点计算能力意义也不大。
    如果硬要比的话,从陈老师课题组2012年的成果来看,在计算DNN,CNN,MLP,SOM等人工神经网络算法时,他们可以用CPU(Xeon E5-4620)和GPU(K20M)十分之一的面积,分别达到CPU-117倍,GPU-1.1倍的性能。
    不从上面数据的角度看,我认为利用DianNao来做神经网络的运算,主要的优点有两个:
    1、由于硬件的支持,效率的提升是成数量级的。
    2、DianNao支持任意规模的神经网络!
    这里任意规模神经网络很值得我们关注一下,这也是他们的处理器技术关键点所在。传统的神经网络芯片的做法是把硬件运算单元和算法神经元一一对应起来,这样一来只能对一个固定的神经网络进行计算。他们采用了对小尺度神经网络分时复用的方法来支持任意规模的神经网络,这个做法很厉害,极大地提高了芯片对于不同算法的能力。
    从08年到16年的这八年里,陈老师课题组针对神经网络处理器做了一系列的出色研究:
    12年国际首个神经网络硬件测试集
    13年国际首个深度学习处理器
    DianNao(电脑):ASPLOS’14最佳论文 亚洲首获计算机硬件A类会议最佳论文
    14年国际首个深度学习多核处理器
    DaDianNao(大电脑):MICRO’14最佳论文
    15年国际首个通用机器学习处理器
    PuDianNao(普电脑):ASPLOS’15
    15年摄像头上的智能识别IP
    ShiDianNao(视电脑) ISCA’15
    16年国际首个神经网络通用指令集
    DianNaoYu(电脑语)ISCA2016接收,分数第一
    小预告:
    TingDianNao(听电脑)也快出来啦

    针对这个芯片,陈老师课题组还成立了公司,申请了一系列专利保护,目前也在和华为三星等一系列企业洽谈合作。相信不久将来我们就可以在移动设备上看见DianNao的应用了。

    一年前看过dadiannao那文章。当时看完文章后,一拍大腿,我怎么没想到装这个逼呢。

    结果是不错的,配合现在CNN,DNN大热,引用数一直在往上刷。

    计算上特点就是实现了一个64*64,64输入64输出,的全连接网络。实现是用了16个cell,每个cell是16×16。(64×64=16×16×16)。每个cell的ASIC计算没有什么新奇,就是一排乘法,一排加法,一排插值。
    “创新”其实在于内存的实现上:本来这种东西最大瓶颈在于那64×64的weight的读取。这里用的解决办法是本地化在每个芯片上。用的是eDRAM,比DRAM省电(因为本地化,所以addressing功耗降低很多。)比SRAM更省电(但是慢些)。
    话了很多时间在benchmark,在layout,在讨论读取。当然这一切,都不是rocket-science。

    ×其实我不是完全理解文章中那些64×64的weight不是一样需要传到off-chip的中央DRAM上来?怎么降低这个功耗?把这64×64都放在同一个page里面?忘了文章里面在experiment上是怎么描述这块的功耗的。

    有人要和CPU比?当然不公平,也没有太大意义。但是人家在paper里面吹吹还是放过别人吧。
    和GPU比?我觉得最大区别是GPU的版本很少memory本地化。本地化distributed localization(比如dadiannao)的缺陷在于基本固定死了网络的拓扑(64×64),这点上来说确实通用性损失很大。文章肯定可以argue说大网络,比如200*200:1)它可以复用很多个64*64,但是这样效率就会降到接近于GPU了,因为localization的gain就变得很小了。2)它可以argue说那你就需要重新tape-out一个200*200的chip。对于2),其实我一直看好用FPGA而不是ASIC。
    所以它不敢随便拿个github上的 应用来跑。都是针对它文章优化(挑选)过的。

    我觉得未来来说。大型应用还是会需要这种DaDianNao的。比如他们合作的法国inria组老大就刚去了Google。
    不过对于一般应用,GPU应该还会是主流。

    不行,我也要往上灌水。明天就和老板建议招个硕士做做这个。我连abstract都想好了。

    计算机,手机芯片的时代要过去了,将来是 AI芯片,Robot芯片了。 神经网络芯片将为Robot芯片,AI芯片作为基础,AI芯片也为量子计算机芯片作为基础也为智能家居中心作为基础,智能城市中心作为基础。比如无人机中心塔,Robot集结中心,自动驾驶车,无人车中心,工业4.0的数据中心芯片,已经涉及到更多更广的各行各业的领域,医院,学校,工厂,警察,物流,电商,交通,建筑,工程,生物,医药,研究院,等等。一切需要大量数据的位置都依赖于持续有更快处理能力,更小体积,更便宜的芯片。

    不过这些都是物理芯片,生物芯片还在科幻世界里面呢。biocpu, biokernel

    目前看独当一面的应用范围比较窄,卖IP是个不错的主意。最近 Google Tensorflow 做了一个非常直观的神经网络 playground。不夸张地说,现在每个人都可以在自己的浏览器里面直接“玩深度神经网络”了。什么都不用说,自己玩玩就明白。

    地址是: A Neural Network Playground (可能要翻墙)
    ReLU至少三层隐藏层每层神经元数最大,我可以把test loss降到0.01左右,层数加到最大学习速率最低的话可以降到0.00几又玩了一会儿,学螺旋形的数据分布最重要的是就是至少要用三层隐藏层,隐藏层的节点数也要尽量多。其他用默认设置都可以……如果不明白里面的 ReLU,L1 等等是什么,没关系,在搜索引擎查一下都可以查到答案。代码在 Github 上,有兴趣的朋友可以去给它加 Dropout,Convolution,Pooling 之类。

  8. 认识了一帮敢爱敢恨的人说道:

    你需要挑选芒果,你不知道什么样的芒果最好吃,所以你就尝遍了所有的芒果,然后自己总结出个大深黄色的比较好吃,以后再去买的时候,就可以直接挑选这种。
    那什么是机器学习呢,就是你让机器“尝”一遍所有芒果,当然,也假设它知道哪些好吃,让机器去总结一套规律(个大深黄色),这就是机器学习。具体操作,就是你描述给机器每一个芒果的特征(颜色,大小,软硬……),描述给机器其输出(味道如何,是否好吃),剩下的就等机器去学习出一套规则。

    等等,那机器是怎么学习到这个规则(个大深黄色的好吃)的?没错,是通过机器学习算法。而题主所问的神经网络,恰好就是一种机器学习算法!近些年来,由于深度学习概念的兴起,神经网络又成为了机器学习领域最热门的研究方法。

    我相信当明确神经网络是一种机器学习算法之后,就可以很轻易的给一个外行讲清楚神经网络到底是用来做什么的。可是神经网络为什么可以完成这个功能呢?

    神经网络就像一个刚开始学习东西的小孩子,开始认东西,作为一个大人(监督者),第一天,他看见一只京巴狗,你告诉他这是狗;第二天他看见一只波斯猫,他开心地说,这是狗,纠正他,这是猫;第三天,他看见一只蝴蝶犬,他又迷惑了,你告诉他这是狗……直到有一天,他可以分清任何一只猫或者狗。
    其实神经网络最初得名,就是其在模拟人的大脑,把每一个节点当作一个神经元,这些“神经元”组成的网络就是神经网络。而由于计算机出色的计算能力和细节把握能力,在大数据的基础上,神经网络往往有比人更出色的表现。
    当然了,也可以把神经网络当作一个黑箱子,只要告诉它输入,输出,他可以学到输入与输出的函数关系。神经网络的理论基础之一是三层的神经网络可以逼近任意的函数,所以理论上,只要数据量够大,“箱子容量”够大(神经元数量),神经网络就可以学到你要的东西。

    选修了一门《人工神经网络》课程,老师讲得云山雾罩,我们听得如梦似幻。虽然最后也考了80多分,但同学们相互间吐槽,都觉得这门课把人给学神经了!别人怎么样我不知道,我反正是稀里糊涂的,没弄清楚概念。

    今年,审读吴军老师的《数学之美》第二版,读到这两段话时,我笑了,原来我并不孤独——
    【 有不少专业术语乍一听很唬人,“人工神经网络”就属于这一类,至少我第一次听到这个词就被唬住了。你想啊,在大家的印象当中,人们对人脑的结构都还根本没有搞清楚,这就冒出来一个“人工的”神经网络,似乎是在用计算机来模拟人脑。想到人脑的结构那么复杂,大家的第一反应一定是人工神经网络肯定非常高深。如果我们有幸遇到一个好心同时又善于表达的科学家或教授,他愿意花一两个小时的时间,深入浅出地把人工神经网络的底细告诉你,你便会发现,“哦,原来是这么回事”。如果我们不幸遇到一个爱卖弄的人,他会很郑重地告诉你“我在使用人工神经网络”或者“我研究的课题是人工神经网络”,然后就没有下文了,如此,你除了对他肃然起敬外,不由得可能还会感到自卑。当然还有好心却不善于表达的人试图将这个概念给你讲清楚,但是他用了一些更难懂的名词,讲得云山雾罩,最后你发现听他讲了好几个小时,结果是更加糊涂了,你除了浪费时间外一无所获,于是你得出一个结论:反正我这辈子不需要搞懂它了。
    大家可别以为我是在说笑话,这些都是我的亲身经历。首先,我没有遇到过一两小时给我讲懂的好心人,其次我遇到了一批在我前面卖弄的人,作为年轻人,总是希望把自己不明白的东西搞懂,于是我决定去旁听一门课。不过,我听了大约两三次便不再去了,因为除了浪费时间,似乎我并没得到什么收获。好在我自己做研究暂时用不到它,也就不再关心了。后来在美国读博士期间,我喜欢在睡觉前躺着看书,没事儿就捧着几本关于人工神经网络的教科书在床上看,居然也看懂了。然后再用它做了两三个项目,算是学会了。到这时回过头来再看“人工神经网络”,其实并不复杂,入门也不难,只是我走了弯路。——吴军】

    君子报仇,三十年不晚。大学毕业三十年后,吴老师在数学之美 (第二版) 里,单独用一章讲Google大脑和人工神经网络,一抒当年的郁闷,也顺便帮我解了气:)

    Good! 通俗易懂。 但是我觉得还只是"假懂",。真的要有直观认识,还是要自己建立一个分类器,跑一下数据体会更深。这些还都是要基础的。你想让神经网络(简称神经)辨认猫和狗(算法类型为分类)。于是给它看一百万只狗,和一百万只猫,每只狗的脑门上都贴着“我是狗”的字条,猫则贴“我是猫”(使用标注数据)。神经同时看五十万只禽兽,分四批看,并作出判断(实现时用并行处理,使用mini-batch)。每个看到的猫或狗,如果判断错了,就修正自己的判断标准(优化)。每看完这二百万只禽兽算一轮,每学十轮就看一些之前完全没见过的猫猫狗狗做出判断(推广性测试)。当神经刻苦学习猫狗知识的时候,你正在睡觉,一觉睡醒,发现神经一小时前判断猫和狗比较准(次最优解),现在学太多反而判断不准了(过拟合),于是你让神经使用一小时前的标准(防止过拟合技巧之early-stopping)。这样训练过程就结束了。

    结论:神经网络是一个参数数量突破天际的回归分析。
    %突然发现在做算法的眼睛里神经网络就是模式识别。。
    —————-
    Part1 这些名字很帅的统计和优化方法是“粗暴的”
    通常来说,现在解决不确定优化问题。都会使用随机模拟、神经元网络和遗传算法联立的混合智能算法来求解。比如使目标变量的数学期望达到最优值的期望值模型,概率最优的可靠度模型(机会约束),还有我校Liu老师常提的随即相关机会,就是你前几个优化组合一下。

    其中随机模拟是一个不确定问题不可少的输入,遗传算法用来调神经网络的参数,神经网络用来逼近现实。互相配合,解决问题。在我看来是及其简单粗暴,不得已而为之的。只是用它们最干脆的思路,优化了最粗暴的方法。

    比方说,你能写出一个事物期望值的显示表达,那么对参变量求导就可以找到极大值点。当然有的时候不是很方便求出全局导数,那么梯度递降、可行方向等规划学方法和数值方法也大有可为。离散的最优值问题在凸区域上的解也是很方便就可以求出的,此所谓整数优化。

    这样一看这个混合算法真是毫无必要呀,那我们为什么还要用它们呢?原因是因为这是通用方法。

    我来举一个例子。整数优化,我们选取适当的函数把两种变量聚为两类。

    图中有圈圈的是我们想区分的训练集。这个时候我们需要找一个合适的评价使得他们分开。最方便的是取机器学习里常用的gauss核函数(数值随距离中心点距离单调递减的光滑函数RBF),那么有九个参数。(均值协方差)

    优化目标是对几千个数聚类之后聚类结果中训练集被识别的个数的两倍与分出的非训练集的元素的个数的差值。我们知道这个值兼顾一二类错误的重要性,又是一个明确的目标,当然它越大越好。这个时候常规的优化算法就很难找出这九个参数的最优值了。

    结果:

    毕竟经过一次聚类算法之后,中心点的位置是迭代的结果而完全不确定的。如果能在聚类之前就知道中心点的位置,那么还聚类干嘛呢?这个时候聚类这个操作就像黑盒子,是传统优化问题极度依赖,却表达不出的优化过程。输入是几千个点,输出只是我之前说的评价函数,参数有九个,这时候不太好把他们看做神经元,因为我并没有显式的给出其激活函数,或者这里的激活函数实际上是相互耦合的,或者我没有将每一个输入都看做是均等的,所以不太好做一个典型的例子。

    我选取6个染色体(开始是对训练集主成分分析的参数加上白噪声),迭代一万次之后,其9个参数依旧没有收敛。而且对于参数极度敏感,gauss核的均值稍做变化,聚类结果可能就会均分整个样本集,从而导致失败。

    在这种情况下,我觉得,可能没有比遗传算法更好的调参数方法了。虽然其毫无道理,但由于其根基是遍历,只是加了稍许随机性,合理的选择解,来使得收敛变快。所以不失为一个好方法。也许有人分析其收敛速度,但我觉得并不太必要。因为它并不好看。当我们开始考虑用遍历求解一个问题的时候,我猜我们对其难度,对其解的形式,对其收敛性也不会有太好的判断。这样我们评估遗传算法的复杂度时,肯定也是要因地制宜的。有些绝大部分信息我们都知道的问题,也许遗传算法也不慢;有些从头到尾都在拍脑袋的问题,遗传算法也能用。

    Part2 神经网络就是一个“超多参数的回归分析”
    那么神经网络到底是什么呢?【扯了那么多遗传算法还没有说正题】正如遗传算法是遍历所有参数选最优的过程,神经网络大致也就是遍历全部函数选最优的过程。

    我们知道一些输入和输出的数据,想找出其中的数量关系。但又不是那么容易看出来,比如我们不像开普勒那样一眼就能看出行星运动时半径的立方和时间平方成反比。有时我们也不太在意具体的显式表达,这个时候我们就说:你们看好了,这是一张已经训练好的神经网,你想要知道你想求的函数值,那么你把输入丢进去,然后把输出抱走就好。虽然有的时候【绝大部分时候】,单论神经网络,我们是可以把我们想求得函数展开成为显式表达的,但是太难看了我们就不这么做。

    当然也许你会说这不就是拟合吗? Indeed . 一般来说我们用来评价神经网络的函数也就是用和拟合一样的最小二乘和。神经网络的参数(权重)也就可以看做一般回归分析的参数。好,我们来看一下一般的线性回归。,一共两个参数。我们把他们调到最优,可惜还是只有0.3,不work。这个时候我们就想,会不会是呢?一共三个参数,到了0.5,然后你心里想,那我把原函数泰勒展开:-D,假设原函数足够光滑,我们还是可以得到一个足够好的解的。

    那么假设我们有一张神经网络,有6个输入神经元,15个隐层神经元,3个输出神经元,我们大概有多少个参数呢?【这里跳过了神经网络中权重和下一层的关系描述,包括激活函数,因为我觉得这毕竟不是神经网络的教材】

    每个隐层都有一个linear的偏差,还有对应六个输入的权重,这一层有105个参数,然后三个输出神经元每个对16个权重参数,共有48个参数,加起来一共153个参数,( ⊙ o ⊙ ),你用153阶泰勒展开逼近函数!老师,他作弊QAQ!【当然未必全都要变化

    道理就是这个道理,简单粗暴。接下来就是些技巧了,借着计算机的东风,这些本来没什么内涵的方法都放出了其绚丽的光芒。把朴素的枚举法发挥到了极致。至于之后的选取光滑激活函数,比如常用的sigmoid,好做梯度递降,或者直接简单粗暴的按照下图方法进行训练网络,都是可以的。

    Step1 随机初始产生权重向量w
    Step2 通过交叉变异更新w
    Step3 算误差函数
    Step4 算适应度,然后轮盘赌,
    Step5 重复2到5
    Step6 给出最优权重向量

    妈妈再也不用担心我不会训练神经网络了,【手动再见】,激活函数怎么选貌似不是很要紧呀。【你再想想是这样吗?】

    为了满足某些强迫症,这里给出一个定理:具有一个或多个隐层的前向神经元网络可以以任意精度毕竟任意连续函数。[手动不规范引用 2016]再看看我之前和泰勒展开的比较,想想魏尔施特拉斯定理,是不是也觉得可以接受了呢?

    借宝定老师书上的例子:

    至于神经网络被一些人鼓吹的神奇特效,比如这里说的可以减小白噪声。我只能表示我还需要学习一个。毕竟我没有试过用153个参数去进行回归分析,能不能消除白噪声呀~

    对了,这里还要提一句,一般用153个参数回归分析,总要用154个输入对吧~
    但你看神经网络,其实只要随机生成一个权重,然后调几圈就可以了【现实中确实可以不让这些参数都变化,但我不是做算法或者计算机的,所以不太清楚计算机业界怎么做。我只是做优化的时候碰到了一些这样的问题,自学了一下来吹牛而已】,感觉帅帅的呢~
    【不过这倒并不是黑点,只是说有些人乱用这些现代学习方法,拿来批判统计学;现代的这些学习方法,都是在大数据科学的要求下应运而生,也不是说其粗暴就是坏事,毕竟解决了很多新的以往无法解决的问题】不过搞机器学习的一天到晚过拟合过拟合。。我觉得这参数取多点还是有道理的。。不知道有没有暴力增加神经元防止过拟合的方法。

    Appendix:
    聚类原理
    citation:
    Liu B, Theory and Practice of Uncertain Programming, 3rd ed., http://orsc.edu.cn/
    —–
    pretty good…
    有个答主举了个例子拿20个样本进去跑:-D
    所以数学背景还是很重要

  9. 赛德说道:

    神经网络某种意义上可以看作一种插值/拟合。

    以最简单的二维平面上二分类为例子,给出了二维平面上的点集A和B,那么我们只要能找到一个函数F,使得F在A上取0,B上取1(或者其他值),就解决了分类问题。

    考虑简单的情况,比如两个神经元接入信号,再传递到一个神经元并输出,那么就是

    当激励函数f是线性的时候,显然F还是线性的,这无法解决一些复杂问题。
    而当激励函数f非线性的时候,F就可以相对复杂。通过调整相应的参数,F可以接近很多函数。
    可以想象,当神经元的个数足够多,层次足够复杂时,F可以接近任何连续函数。

    人工神经网络算法的作用机理还是比较难理解,现在以一个例子来说明其原理。这个例子是关于人的识别技术的,在门禁系统,逃犯识别,各种验证码破译,银行预留印鉴签名比对,机器人设计等领域都有比较好的应用前景,当然也可以用来做客户数据的挖掘工作,比如建立一个能筛选满足某种要求的客户群的模型。
    机器识别人和我们人类识别人的机理大体相似,看到一个人也就是识别对象以后,我们首先提取其关键的外部特征比如身高,体形,面部特征,声音等等。根据这些信息大脑迅速在内部寻找相关的记忆区间,有这个人的信息的话,这个人就是熟人,否则就是陌生人。
    人工神经网络就是这种机理。假设上图中X(1)代表我们为电脑输入的人的面部特征,X(2)代表人的身高特征X(3)代表人的体形特征X(4)代表人的声音特征W(1)W(2)W(3)W(4)分别代表四种特征的链接权重,这个权重非常重要,也是人工神经网络起作用的核心变量。
    现在我们随便找一个人阿猫站在电脑面前,电脑根据预设变量提取这个人的信息,阿猫面部怎么样,身高多少,体形胖瘦,声音有什么特征,链接权重初始值是随机的,假设每一个W均是0.25,这时候电脑按这个公式自动计算,Y=X(1)*W(1)+X(2)*W(2)+X(3)*W(3)+X(4)*W(4)得出一个结果Y,这个Y要和一个门槛值(设为Q)进行比较,如果Y>Q,那么电脑就判定这个人是阿猫,否则判定不是阿猫.由于第一次计算电脑没有经验,所以结果是随机的.一般我们设定是正确的,因为我们输入的就是阿猫的身体数据啊.

    现在还是阿猫站在电脑面前,不过阿猫怕被电脑认出来,所以换了一件衣服,这个行为会影响阿猫的体形,也就是X(3)变了,那么最后计算的Y值也就变了,它和Q比较的结果随即发生变化,这时候电脑的判断失误,它的结论是这个人不是阿猫.但是我们告诉它这个人就是阿猫,电脑就会追溯自己的判断过程,到底是哪一步出错了,结果发现原来阿猫体形X(3)这个体征的变化导致了其判断失误,很显然,体形X(3)欺骗了它,这个属性在人的识别中不是那么重要,电脑自动修改其权重W(3),第一次我对你是0.25的相信,现在我降低信任值,我0.10的相信你.修改了这个权重就意味着电脑通过学习认为体形在判断一个人是否是自己认识的人的时候并不是那么重要.这就是机器学习的一个循环.我们可以要求阿猫再穿一双高跟皮鞋改变一下身高这个属性,

    让电脑再一次进行学习,通过变换所有可能变换的外部特征,轮换让电脑学习记忆,它就会记住阿猫这个人比较关键的特征,也就是没有经过修改的特征.也就是电脑通过学习会总结出识别阿猫甚至任何一个人所依赖的关键特征.经过阿猫的训练电脑,电脑已经非常聪明了,这时你在让阿猫换身衣服或者换双鞋站在电脑前面,电脑都可以迅速的判断这个人就是阿猫.因为电脑已经不主要依据这些特征识别人了,通过改变衣服,身高骗不了它.当然,有时候如果电脑赖以判断的阿猫关键特征发生变化,它也会判断失误.我们就不要要求这么高了,不要说电脑,就是人类也无能为力,你的一个好朋友你经过多次的识记肯定认识吧,但是他整了容你们在大街上邂逅.你可能觉得这个人声音好熟悉,体形好熟悉,—-都像自己一个朋友,就是脸长的不像.你不敢贸然上去搭讪吧(否定的判断).因为我们判定一个人是否是自己的朋友的时候依靠的关键的特征就是面部特征,而他恰恰就是改变了这一特征.当然也存在我们把一个拥有和我们朋友足够多相似特征的人判定为我们的朋友,这就是认错人的现象了.这些问题电脑也会出现.
    不过这个算法还是有比较积极的意义的,实现了一定程度上的智能化.

    神经网络是个黑箱子,有个入口有个出口,里面不知道都有啥。
    往入口扔进去个1+1,出口会扔出来个250,。去打黑箱子的屁屁,说不对,应该是2。
    不断的往入口扔东西,打屁屁,给正确答案
    ……
    突然黑箱子就学会加法了

    类似的,可以教会黑箱子加减乘除、解方程、游泳、打架,吹New B
    同样,母箱子还可以教会公箱子怎么泡妞

    如果你想往入口扔上期双色球中奖号码,在出口不断给出本期中奖号,那你就想多了。
    我试过,黑箱子学不会啊~~~

    曾经做过一个计算机识别美女的程序,效果渣到可以把凤姐当作美女。 不过还是说说吧
    找二十个女性图片正面照,做成标准格式(此处不展开)编程测量眼睛大小,宽度,鼻子大小,高度,宽度等等你认为可以衡量美女的特点作为自变量。然后自己给这二十个女性的美貌打分0至100。把自变量和因变量一一对应输入计算机,让计算机学习
    之后只要把未判定的图片给计算机,计算机就会根据你的审美打分了(一秒钟在一百个头像中找到凤姐发送约吗我会乱说?)
    那么如何才能避开凤姐找到范冰冰呢?
    1,增加学习样本量,上万为佳,越大越好
    2,换个算法,这也是神经网络最核心的部分,或选择合适的层数,做非线性变换等

    1.问题:人为什么能判断正确?
    1.人的大脑就是一个牛逼的神经网络,通过从小的训练,见识,并且记住了苹果和橘子,我们分分钟能作出判断哪一个是苹果,哪一个是橘子(可能就是百分之百),即使我们蒙住了人的眼睛,我们还是可以通过气味,重量,手感做出较为准确的判断(但是可能不能完全判断正确).说到底就是人从小开始第一次见到苹果,橘子时,就不断的强化,记忆他们的特点,并且做出判断!有这么个大脑以后,通过直观的比方说颜色,我们就可以区分,颜色涂成一样,好,那我们依靠重量,重量等重,那我们依靠气味,气味也掩盖,那我们依靠密度。。。。。。。。。

    2.计算机是死的,不是人,怎样达到人的水平或者模拟人的水平?
    神经网络粉墨登场,初始的神经网络啥用都没有,智商为零。我们想让他区分苹果和橘子,对不起,你还不如去问问木头!由此我们想到人类区分的过程是不断强化,记忆(也就是训练大脑),然后就能区分(做出判断).好嘛!对一个神经网络(大脑),我们做同样的处理.先拿一堆的橘子和苹果,告诉它哪些是橘子,哪些是苹果(妈妈教你),这称之为训练.然后,再哪一个东东出来,让它判断是橘子还是苹果(做出判断),大事不好,神经网络判断错误了?别急,妈妈不会打你,不会骂你,错了就记住,再训练,强化!
    3.问题还有,一大堆橘子,苹果,计算机怎么强化,记忆,计算机只认识数字,谁知道你这是什么怪物?

    .好,为了让计算机知道啥是橘子,啥是苹果,我们必须将橘子和苹果的特点变成数字(特征提取),送入到计算机里面去,让他记忆(训练).再把未知是什么东西的东东的特点变成数字送入计算机中让计算机做出判断(效应).颜色,我们用0~255来表示从黑到白,重量,我们用秤来秤嘛,气味,我们测算芳香因子的数量,密度,好吧,质量除以体积。。。。。。苹果我们用1表示,橘子我们用-1表示,为什么呢?前面我们说了,训练的时候,我们要告诉计算机什么是苹果,什么是橘子,用嘴和计算机说嘛?当然是数字啊,少年,没错就是国际惯例1和-1,接下来,我们将这些知道类别的数据送入计算机让他记住,再来一个不知道类别的东东,提取出上面的特点,我们就能判断出是橘子还是苹果了!
    4.问题又来了,计算机怎么记住?(非常浅显,专业人士一看就是不对的,还有很多别的条件没有提到)

    数据送进来,好嘛,神经网络来了,以苹果为例(用1标记),苹果的特点一串数字,我们用x表示,苹果的类别1,也就是这个网络最后要得到的效果就是x通过网络后就变成了1,数学上就是x*w = 1,好嘛解个方程就完了!(如果是多层呢?x*w1*w2*….wn=1,当然还会有更多的已知量给你哈!)解出方程得到w,后面再送入一个未知是啥的东东的特征数字,乘以w,就知道类别!橘子和苹果就区分出来!
    每一个步骤都有很多方法,很多内容可以挖掘,甚至很多步骤已经成为了一门专门的领域了!
    神经网络就相当于一个黑盒子,这个盒子呀,它很厉害,像个魔术师,一个满脸都是痘痘的女孩子走进去,走出来可能就是皮肤光滑细腻的美女了( ´▽` )

    好了,正经一点(严肃脸)。知道函数吗?就是给你一个数,你变呀变呀,它就变成了另外一个数。怎么变得呢?有一系列参数,a啦b啦α啦β啦,他们扭曲缠绕在一起,就把x变成y啦,神奇不?

    哦不,并不神奇,这些我都懂,可是神经网络和这个有什么关系呢?

    嗯,这么说吧。你平时见到的函数呀,都是最简单的函数,什么线性函数呀,二次函数呀,log呀,cos呀,它们太简单了,所以只依靠它们不能解决复杂的问题。你看,如果你想知道这个娃子是男孩是女孩呀,这幅图片上画的是小汽车呀还是宇宙飞船呀,那些函数可不能告诉你答案,实际上,你也很难很难写出来一个明确的复杂的表达式,用来实现这些功能。

    那怎么办捏?人类的智慧是伟大的´∀`,于是他们想出了神经网络这个东西。简单点说,神经网络也像普通的函数那样,有各种乱七八糟的参数,有自己独特的体系结构。不同的是,你很难把它用式子写出来,它的实现更复杂,它的功能也更强大。所以就像一开始说的,你可以把它想象成一个很厉害的黑盒子,你把一辆小汽车输进去,它能告诉你这是一辆小汽车,更厉害点的,它能把小汽车变成大卡车。

    这下,神奇了不?*罒▽罒*

    当然,神经网络还没有强大到和人脑的神经网络相提并论,但是在某在方面上人脑的神经网络是比不过它们的,比如记忆和计算等。

    最近正在做神经网络的Project,正好强行来答一发。我还有很多不了解的,继续学习哇
    人工神经网络(nn)对模式识别很有用,比如血象分析,金相分析,文字识别,纹理识别,指纹识别,面容识别等,但是对于视觉研究它无能为力,他无法解释单神经元对特定人或事发放的事实(祖母细胞,概念细胞),为此英国著名神经生理学家Barlow(英国皇家学会会员)就此写了不少文章,有兴趣的自己可以用谷粉搜搜自己去搜。

  10. 互联网非公开股权融资平台说道:

    如果以神经网络观点看,整个人类社会其实就是一个巨大的神经网络;每个人都可以看做一个神经元;真是这些神经元的不断深度学习,才让这个世界更文明更先进。
    用过去预测未来!
    历史不会重演,但是历史总是惊人的相似!

    多层的好处是可以用较少的参数表示复杂的函数。
    在监督学习中,以前的多层神经网络的问题是容易陷入局部极值点。如果训练样本足够充分覆盖未来的样本,那么学到的多层权重可以很好的用来预测新的测试样本。但是很多任务难以得到足够多的标记样本,在这种情况下,简单的模型,比如线性回归或者决策树往往能得到比多层神经网络更好的结果(更好的泛化性,更差的训练误差)。
    非监督学习中,以往没有有效的方法构造多层网络。多层神经网络的顶层是底层特征的高级表示,比如底层是像素点,上一层的结点可能表示横线,三角; 而顶层可能有一个结点表示人脸。一个成功的算法应该能让生成的顶层特征最大化的代表底层的样例。如果对所有层同时训练,时间复杂度会太高; 如果每次训练一层,偏差就会逐层传递。这会面临跟上面监督学习中相反的问题,会严重欠拟合。

    2006年,hinton提出了在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步,一是每次训练一层网络,二是调优使原始表示x向上生成的高级表示r和该高级表示r向下生成的x’尽可能一致。方法是
    1,首先逐层构建单层神经元,这样每次都是训练一个单层网络。
    2,当所有层训练完后,hinton使用wake-sleep算法进行调优。将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于”认知“,向下的权重用于”生成“。然后使用Wake-Sleep算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。Wake-Sleep算法分为醒(wake)和睡(sleep)两个部分。

    2.1,wake阶段,认知过程,通过外界的特征和向上的权重(认知权重)产生每一层的抽象表示(结点状态),并且使用梯度下降修改层间的下行权重(生成权重)。也就是“如果现实跟我想像的不一样,改变我的权重使得我想像的东西就是这样的“。
    2.2,sleep阶段,生成过程,通过顶层表示(醒时学得的概念)和向下权重,生成底层的状态,同时修改层间向上的权重。也就是“如果梦中的景象不是我脑中的相应概念,改变我的认知权重使得这种景象在我看来就是这个概念“。

    由于自动编码器(auto-encoder,即上面说的神经网络。广义上的自动编码器指所有的从低级表示得到高级表示,并能从高级表示生成低级表示的近似的结构,狭义上指的是其中的一种,谷歌的猫脸识别用的)有联想功能,也就是缺失部分输入也能得到正确的编码,所以上面说的算法也可以用于有监督学习,训练时y做为顶层网络输入的补充,应用时顶层网络生成y’。

    dl基于神经网络,神经网络简单说就是输入是训练数据,中间是隐藏节点,输出是标签。训练数据可以以一定的权重激活隐藏节点,隐藏节点激活输出标签。dl的创造性在自编码和稀疏性,自编码是说dl把输入当作训练数据,输出还是训练数据,这样假如中间节点数比较少的话,相当于对数据起了个压缩的作用(想象输入是文件,中间层相当于rar压缩文件,输出还是输入文件,这样只要知道中间层rar的信息,和整个模型的结构,就可以知道输入是什么了,这个就相当于压缩文件)。另一个是稀疏性,就是说假如我想让中间节点多一点,又不想让训练过于overfit,可以加一个限制,假设每个训练数据都激活尽量少的中间层节点(相当于模拟大脑,大脑对每个输入不可能所有神经元都起反应,肯定也是少量神经元有反应)。

    这样训练出来的模型一是可以无监督,二是可以起到降维的作用。训练出来的模型就可以很好的表达原始数据了。这时候我们对训练好的数据再在有监督的数据上做进一步训练,就可以满足新的需求

    先说最基础的结构
    第一层是输入,input 之后好多就是隐藏的层,再之后就是输出啦。
    那每一个节点的值怎么确定呢?
    就是依靠他前面所有节点线性组合之后,再将这个值作用到他自己的函数上。例如第二层的某个点
    参数都是学习出来的,f用什么也是自选

    参数已经训练好了是20 20 -30
    然后根据每个向量x的输入 我们可以看到y的结果。

    如果有一幅图片,一个像素有一个人那么大,当你距离图片50cm去看图片,你只能看到几个像素,所以你是看不出来这个图片是个什么鬼的。站到很远很远地方再看它,反而能看得清全貌了。
    神经网络的层数多起来,就像你站得更远去看这个图片一样,是观察粒度上的改变。而更宏观的粒度层面是需要底下更微观的粒度层面一层一层传递和堆砌出来的,这个传递过程当然是信息丢失尽可能少是最好的,这样才能保证你在大粒度上看东西时信息是尽可能原汁原味的。

    简单来说,首先如果你明白了所谓的perceptron[感知器],那么恭喜你,明白了FP,也就是前馈式的网络结构。其实这东西就好像是kNN[最近鄰居法],只不过距离是用和分界面(分类器)点积替代了可能的欧几里得距离。而很简单,如果把perception的similarity function替换成为某些特定的kernel,或者说任意的simialrity function,那么其实就构成了大量的svm的逻辑了。

    那么好的,如果到这里你明白了perceptron,也是人工神经网络的雏形吧。那么它就可以构成一个神经元了。由神经元组成就构成了一个一层的网络结构对吧。[其实这些wiki上都有我就不多扯了,图请自行参考]。对于单一神经元而言,结果是一个logistic regression啦。

    然后就剩下隐层需要被解释了。那么就扯到了非线性的问题上,就是我们的世界并不是多么的简单,以至于东西都是线性可加的。那么我们加了一层隐层在网络上,通过引入了更多的参数参考,以链式法则的方式增加了对非线性的容纳性。并增加了网络的鲁棒性。

    用一个lancelod大大在别处的回答来解释[如何理解神经网络里面的反向传播算法?]隐层就是个传话的,用自己的理解来处理加工了上一层给下一层的信息。 [我要开始十分不专业的讲故事了,里面误导小朋友的地方求各位大大轻喷并纠正]比如一幅画,输入就是看到这幅画的我们定义的第一个人(1层输入节点),然后就告诉第二个人(2层隐层节点),第二个人自己琢磨了琢磨,讲给了第三个人(3层隐层节点),这样,每一层传输,信息都被有效的加工和提炼了,构成了更为复杂的信息流。那么假设我们的网络就两个隐层,第三个人添油加醋的告诉了第四个人(4层输出节点)。这个时候第四个人说,你们说的是非洲平原的大马猴么。这就告诉我们,这个层数多了啊,信息量少的时候训练很多时候会出问题的,因为每一层,大家的理解(权重分配)都并不是很合理呢。这个时候呢,怎么办呢。这就要开始说到BP,也就是反向传播了。嗯,lancelod大大是这么说的:“反向传播就是,把画拿给最后一个人看(求取误差),然后最后一个人就会告诉前面的人下次描述时需要注意哪里(权值修正)。” 可是,如果中间传话的人太多,而我们又只有1幅画(训练样本极少)让我们来训练他们传话的技巧,那么就会很容易,不能很好地,描绘其他的画[这就会出现卡在局部最优的样子]。所以我们需要拿很多东西来训练他们的描述方式,这样就要求我们有充分的训练样本。而且很容易理解,中间传话的人呢越多,我们需要越多的训练来校准每个人表达上的误差。

    嗯,不知道这么说,你是不是会对其中的概念有了一些了解呢。

    其实我自己也就拿DNN做过分类,求轻拍。。。

    试着解释MLP
    当用MLP 做2分类的时候, 相当于做一个变换 (非线性因为有激活函数), 然后再来切一刀。
    有的时候,数据集不好分, 就需要把隐层神经元个数增加(增加维度), 再来切。

    从data mining的角度来说, 神经网络就是一个特征提取器(feature selection & feature extraction), 一个固定的网络会提取出最适合这个网络分类的特征。
    从数学的角度来说,
    证了下任意一个连续函数可以被NN得到的函数一致逼近
    理论是不多, 感觉更多是经验

    神经元(Neuron)是神经网络的基本单元,也称节点(Node),它从外部或其它节点收到输入(Input),并通过一个激活函数(Activation Function)来计算输出(Output);每一个输入都对应权重(Weight),即这个节点收到的每一个输入的相对重要性;偏置(Bias)可以理解为一种特殊的输入。

    图1的神经元有输入x1和x2,对应的权重值分别为w1和w2,以及值为1的偏置,对应的权重值为b;这个节点通过激活函数f计算出输出y。
    逐层排列的节点构成前馈神经网络(Feedforward Neural Network),每一层中的每一个节点连接下一层中的每一个节点,同一层中的节点之间没有连接,并且初始来自外部世界的输入只会朝向输出层做单向传递,而不会构成循环;前馈神经网络分为单层感知器(Single Layer Perceptron)和多层感知器(Multi-Layer Perceptron)两种。
    单层感知器由一个输入层(Input Layer)和一个输出层(Output Layer)构成,输入层中的每一个输入节点将其从外部收到的输入提供给输出层中的每一个输出节点;输出节点在计算输出的过程中,对每一个收到的输入都会按照其对应的权重进行调整。
    多层感知器由一个输入层、一个输出层和中间的一个或多个隐藏层(Hidden Layer)构成。

    图2是只有一个隐藏层的多层感知器,其中偏置只能看做一种输入;隐藏层中的隐藏节点与外部世界没有直接联系。传统的机器学习大多基于单层感知器,或者至多有一个隐藏层;而要实现深度架构,需要包含超过一个隐藏层。

    如图3,在初始状态,一个前馈神经网络所有的输入和节点的权重都是随机分配的,网络对训练数据集给定的输入进行计算,得到相应的输出则被观察,并与已知的期望输出做比较,得出误差(Error);这一误差进而被传回上一层,分摊给上一层中所有的节点,使每一个节点可以调整其收到的每一个输入的权重,从而更新计算结果;这个过程将不断重复,直到实际输出与期望输出的误差低于预定门槛,人工神经网络就有了“举一反三”的能力,即实现泛化(Generalization)。
    调整权重的常用方法之一是梯度下降(Gradient Descent),梯度即斜率,是总体网络误差与每一个权重的关系的描述,在前馈神经网络中表示为:
    了描述误差被从输出层中的输出节点传回上一层中的节点的过程;可以略过图中的公式而简单将这个网络看做f(g(h(x)))形式的嵌套函数,并使用链式法则(Chain Rule)来求导这样的函数。

  11. 天使不哭说道:

    1. 图像
    这个是Deep Learning的经典强势应用领域了,似乎不需要太多介绍。
    相关的完整产品应用已经相当之多了,随便举几个例子:
    Face++/Sensetime的人脸识别
    Google的街景识别
    Google/Baidu的OCR翻译识别
    主流电商网站的“以图搜图”
    深圳码隆科技 的服装时尚搭配
    等等。

    2. 语音
    这个也是Deep Learning的强势领域,相关的产品应用也很多了,举几个例子:
    科大讯飞的语音平台
    阿里/百度的语音识别平台(比如应用在客服场景)
    思必驰/云知声这样的start-up推出的语音输入法
    出门问问
    等等。

    3. 文本
    这个一直是这两年学术界和工业界的关注热点。也能看到一些use case(不像语音和图像那样跟传统方法引比可以获得巨大的提升,但也会有一定margin的收益),比如
    广告CTR预估(百度、京东 和Google 都已经应用到线上,也不难找到相关的公开作法资料,前不久携程组织的技术meetup上,搜狗无线广告的同学也有一个相关的技术分享 比较实在)
    广告的召回环节(CIKM16上Yahoo!的技术团队有一篇相关paper 里介绍了他们的作法,大抵是基于自已开发的分布式版本的word2vec,对query和广告进行embedding建模,用于改善broad match的质量,跟论文作者之一确认这篇论文的工作已经在production cluster上运行有两个Q了)
    搜索相关性语义层面改善(WSDM15上百度有一篇tutorial 提到了一些具体的作法,我了解到的360和阿里也在尝试,作法跟百度相似,都是基于微软的DSSM的变种,不过提升并没有百度claim的那么高)。与广告作法有所区分的是,搜索相关性目前我还没有了解到端到端基于Deep Learning,而是由DL生成若干维特征,再使用shallow model根据人工标注数据进行re-train,而广告则已经可以做到基本端到端的训练了。造成这种区别的关键原因还是业务优化目标的差异性。
    机器翻译(这个是被业界期望相当高的一个应用领域,我二手了解到的信息是Google在准备全面切换到DL-based的机器翻译系统,百度也在推进类似的事情,阿里的机器翻译因为面向的领域比较特殊,节奏上不会那么激进。去年ACL会议上,大家对DL-based机器翻译所担心的主要问题(可解释性/可干预性)已经随着这一年来的技术进步有了很大的改善,随着技术的演化进步,我个人感觉机器翻译这样的复杂建模场景还是非常有希望被DL主导。

    回到这个问题上,我想问这个问题的人,以及关注的人,是期望通过了解到工业界有哪些成熟的应用case,好供自己在实际工作中借鉴参考。我也想沿着这个主题说一下自己的看法。

    如果是图像和语音的应用场景,我想没有什么好犹豫的,这是Deep Learning的经典强势场景,而且有大量的成熟的model资源可以复用,再加上这一年来DL平台技术的进步,使用门槛已经低了很多。一个背景稍好的应届master、phd,稍加coach,也就可以跑起一个DL的应用流程了。不过,引用某位同学的话“有很多人可以跑DL model,但只是很少人可以去自己设计新的DL model",所以工具的便利性减少了试错的门槛,但是也要警惕不要因此就认为现有的DL model真就是一个"turn-key" solution,拿来就准能解决问题了(说这个是因为最近看到一些距离一线已经很远的CEO们在claim DL的入门门槛之低让他自己都可以掌握,于是开始延伸出一系列演绎有感)

    至于文本类的应用场景,我的建议还是要谨慎一些。在资源有余量的情况下,可以投入尝试,因为复杂网络确实可以提供shallow网络所没有的数据拟合建模能力,当然这会对数据量以及算力资源提出比较高的要求。否则,先从传统的shallow model+feature engineering做起,会更具ROI一些。

    具体到应用的时候,除了模型训练以外,也不可忽略的是线上的布署成本和可解释性。毕竟DL模型的尺寸以及计算复杂性是显著高于shallow model的,不过这一两年来,关于模型压缩,学术界和工业界也有了不少的探索和进展,比如TensorFlow里的8-bit quantization[10],ICLR16里的best paper之一Deep Compression ,以及DeepScale和Stanford合作的SqueezeNet 以及其他一些研究工作 都为解决DL模型的线上serving问题提供了非常好的参考借鉴。再有兴趣的,还可以关注一下embedding-vision[11]上的一些资料,因为嵌入式领域是对模型的尺寸、功耗、计算量最为敏感的了。至于可解释性,我的接触范围内能够看到一些相关的工作(比如香港中文大学的王晓刚做过一些相关的有趣工作[12][13]以及其他人做过的一些NN generation&interpretation[14][15][16][17]的工作—-interpretation和generation在我看来往往是一体两面"What I cannot create, I do not understand"),但个人感觉,这些工作给人的感觉是很interesting,但距离工业界所期望的可解释性还有一定的距离。所以在可解释性要求很高的应用场景,要么是将DL以feature的方式融合到shallow model里,要么是需要自己花费相当多的精力去做可解释性所需的r&d工作。

    References:
    . 码隆科技 – Malong Tech
    . 包勇军. 京东电商广告和推荐系统的机器学习系统实践. 2016年第七届中国数据库技术大会.
    . Erik Ordentlich. Network–Efficient Distributed Word2vec Training System for Large Vocabularies. CIKM, 2016.
    . Jeff Dean. Distributed Machine Learning and Matrix Computations. NIPS workshop, 2014.
    . 舒鹏. 深度学习在搜狗无线索广告中的应用. 携程深度学习技术Meetup, 2016.
    . 朱凯华. Baidu Search: Challenges we face, Experiences we learned. WSDM, 2015.
    . Song Han. Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffman Coding. ICLR16.
    . Forrest N. Iandola. SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size. Arxiv, 2016.
    . Song Han. Learning both Weights and Connections for Efficient Neural Networks. Arxiv, 2015.
    [10]. How to Quantize Neural Networks with TensorFlow
    [11]. Embedded Vision Alliance
    [12]. Xiaogang Wang. Sparsifying Neural Network Connections for Face Recognition. CVPR, 2016.
    [13]. Xiaogang Wang. Deeply learned face representations are sparse, selective, and robust. CVPR, 2015.
    [14]. Aravindh Mahendran. Understanding Deep Image Representations by Inverting Them. Arxiv, 2015.
    [15]. Jiwei Li. Visualizing and Understanding Neural Models in NLP. Arxiv, 2015.
    [16]. Anh Nguyen. Deep Neural Networks are Easily Fooled: High Confidence Predictions for Unrecognizable Images. CVPR, 2015.
    [17]. Harvard NLP. Visual Analysis of Hidden State Dynamics in Recurrent Neural Networks. Arxiv, 2016.

    比如google的图片搜索,靠深度学习来识别网上收集来的图;facebook、instagram每张上传的照片都会经过两个convnet来识别人和物。只是用户不知道,也没必要知道背后用的究竟是什么技术。

    深度学习的性质就决定了他不会有直接面对用户的应用,而是作为图像识别、语音识别等相关应用背后的核心技术来提升用户体验。

    以后你会见到更多用到深度学习的应用,但他们都不会把“深度学习”这种不明觉厉的字眼直接抛给一般用户,最多只会说“我们用了最先进的XX识别技术,准确率达到XX%”

    现在很多商用语音识别的声学模型都是用深度学习做的,甚至很多公司都是基于学校的开源包进行再开发,比如有JHU开发的Kaldi就是带有深度学习功能的语音识别开源库,包括云之声在内的很多语音识别公司都有在用。

  12. 米八说道:

    人脸识别开源界的一股清流。

    检测方面在JDA大家都报告无法复现,CNN方法又太慢(特指开源方法,各个公司应该都有很好的优化方案了)不能应用到手机端的当下,这套开源软件的检测模块无论在效果还是速度方面都达到了可用的程度。

    对齐这块本身比较简单,现有的开源软件也都能做得比较好了,随便搞个cnn回归一下效果就已经不错了。

    人脸验证模块在使用对齐好的LFW图片上能做到98.6%,检测对齐全部使用该开源软件的情况下97.1%,已经超过或与现有开源软件持平,由于有完整方案,易用性应该完胜其他开源软件。

    目测一大波实验室都能凭这套软件接人脸识别项目了,我们这种号称专业搞人脸识别但实际上就是跑跑模型的实验室感觉要混不下去了T T

    Kagemusha 国際旅人、在华“外国人”
    代码声明用VS开发的,除了OpenCV以外不依赖任何第三方库。简单试了一下,在OS X下轻松编译通过。

    CV发展了这么多年,人脸框架的原理大家都已经掌握了。对于公司来说,除了检测代码,数据和完整的训练框架才是王道啊,否则只能跑跑现成的model。

    个人理解(可能有失偏颇):
    设计类似caffe,人脸对齐用的sift,人脸检测用的mlp,人脸识别用的cnn,只有forward没有backward所以只能测试,而且只能测试他给的模型。他们应该有一个类似于caffe的东西,可以训练的玩意,这次开源没有完全开源所有东西。
    不过挺不错的,可以写个程序把caffe训练的权重转换成他的格式,然后再把caffe的算子移植过去,避免重新造轮子。然后就可以开心滴在移动设备上跑起来。

    与caffe的不同点(刘昕介绍):
    另外identification的模块训练用到了caffe或tesorflow,前向框架是重新设计的,不依赖任何第三方库。

    预计SeetaFace可以拉高人脸识别草根创业公司的下限,但是除此以外对工业界影响应该不会很大:

    1. 虽然说SeetaFace是开源引擎,但是核心的内容是CNN模型参数的二进制文件(针对identification而论),而SeetaFace的模型并不能像caffemodel那样随意拿来finetune。

    2. 人脸识别应用领域还有一些更有挑战性和现实意义的问题(比如cross-domain matching),而SeetaFace就是一个写死的东西,工业界无法基于SeetaFace做出改进。有技术能力的公司还是得用自己的模型和框架来解决这些问题。

    3. 想把caffe在移动设备上跑起来更可靠的方案是OpenCV的DNN module,而seetaFace的特征提取支持的东西还是太少,目测要加个PReLU还得自己写。。。

    另外想靠这套软件接人脸识别项目的实验室还是不要指望了,甲方雇个本科生调用一下SeetaFace的动态链接库就能完事的事情就轮不到实验室来抢饭碗了。。。
    1. 算法和模型变得不是最重要的了,数据和业务积累越来越重要;
    2. 降低行业门槛,让更多的人进来玩,一起再把蛋糕做的更大些,玩的人多了,玩法就更多了;
    3. 山老师这套东西应该不是业内最好的,和SenseTime、Face++还应该有些差距,根据市场数一数二的理论,可以赚钱,但是个应该赚的比较费劲;
    4. 技术开放出来,让同行帮忙挑挑毛病,帮忙改进下,同时也看看自己的技术能用到那些地方,摸一摸底;
    5. 提高知名度和美誉度;
    6. 开源的其实也有开源的赚钱方式,比如像但年的康盛创想、wordpress都赚的盆满钵流,但是要有足够的市场支持。

    确实佩服山老师他们,人脸应该不缺开源的项目,但是以前的都是某些固定方向的,比如检测、定位、识别,但是像这次这么系统同时名气这么大的是第一次。而且开源需要勇气,出了放弃既得利益还有要对自己的项目代码有足够的自信,毕竟被吐槽也是有可能的。

    指导意义还是挺大,是一个完整算法级的解决方案。不过当前人脸识别的主要应用点是身份证现场照比对,直接现场照现场照比对应用不是特别多。目前不太清楚山老师采用的什么人脸库进行训练,如果没有身份证照片训练,估计比对效果会大打折扣。这个做过人脸识别的应该都清楚。我实现了一个android版的身份证现场照人脸识别(verification),只有三个接口调用,直接给出相似度,感兴趣的可以看一下(https://github.com/fengFly2014 里面有个Android_Face_Verification项目)。至于算法层面我想大家已经都比较熟悉,人脸检测(使用opencv)+人脸对齐(3000fps)+特征提取(CNN和openblas加速)+比对(LR),其中人脸检测自训练算法和暂时不开放。整理好的话后续也按照山老师的格式给一个android版完整开源版本。

    人脸识别开源界的一股清流。

    检测方面在JDA大家都报告无法复现,CNN方法又太慢(特指开源方法,各个公司应该都有很好的优化方案了)不能应用到手机端的当下,这套开源软件的检测模块无论在效果还是速度方面都达到了可用的程度。

    对齐这块本身比较简单,现有的开源软件也都能做得比较好了,随便搞个cnn回归一下效果就已经不错了。

    大致觉得是 pixel RNN 从图像换到了音频,再加上 seq2seq training 的结果,算法挺直观而且 make sense。先占个坑,下周和楼下语音组的同学吃饭再来回答技术问题。

    小小的吐槽一句:这年代连 arxiv 一天的处理时间都不愿意等了,论文直接首发 google doc??? 可能因为围观过 reddit 对某篇 nips withdrawn paper 撕 x 大战而导致我这几天太敏感了吧。。。我现在觉得 DL 的应用研究已经有些像"老中医炼丹",从 make sense theory 到真正的 stunning performance 还差着些愚笨的我所不能理解的 tricks。
    不过话又说回来,Deepmind 在圈里名声非常好 (every DL phd student is a potential employee of Deepmind 笑),他们承担着 google 的股价不可能造假,估计应该是拿到内幕消息要抢在对手前头。

    种方法是基于神经网络的HMM-free的方法。以前的基于神经网络的语音合成方法都要依赖于HMM强制对齐的结果,只能做frame-to-frame的回归。这种方法彻底摆脱了HMM,应该是基于神经网络的语音合成第一次做到end-to-end。
    我认为这种方法应该跟给出前一帧预测下一帧的方法差不多,就是用当前帧之前的信息预测当前帧。能生成特定的语音,这个就类似与VAE,GAN都有conditional的版本,把想要生成的文本作为一部分输入。

    微软的语音合成效果也挺不错,感觉并没有和这套系统给的例子差很多

    1.学习程序的第一步,先让程序跑起来,看看结果,这样就会有直观的感受。
    Caffe的官网上Caffe | Deep Learning Framework 提供了很多的examples,你可以很容易地开始训练一些已有的经典模型,如LeNet。我建议先从 LeNet MNIST Tutorial开始,因为数据集很小,网络也很小但很经典,用很少的时间就可以跑起来了。当你看到terminal刷拉拉的一行行输出,看到不断减少的loss和不断上升的accuracy,训练结束你得到了99+%的准确率,感觉好厉害的样子。你可以多跑跑几个例子,熟悉一下环境和接口。

    2.单步调试,跟着Caffe在网络里流动
    当玩了几天之后,你对Caffe的接口有点熟悉了,对已有的例子也玩腻了,你开始想看看具体是怎么实现的了。我觉得最好的方法是通过单步调试的方式跟着程序一步一步的在网络里前向传播,然后再被当成误差信息传回来。

    Caffe就像一个你平常编程中Project,你可以使用IDE或者GDB去调试它,这里我们不细说调试的过程。你可以先跟踪前向传播的过程,无非就是从高层次到低层次的调用Forward函数, Solver->Net->Layer->Specific Layer (Convolution等…).后向传播也类似,但因为你对Caffe里面的各种变量运算不熟悉,当你跟踪完前向传播时可能已经头晕眼花了,还是休息一下,消化一下整个前向传播的流程。

    刚刚开始你没有必要对每个Layer的计算细节都那么较真,大概知道程序的运算流程就好,这样你才可以比较快的对Caffe有个大体的把握。

    3.个性化定制Caffe
    到这里,你已经可以说自己有用过Caffe了,但是还不能算入门,因为你还不知道怎么修改源码,满足自己特定的需求。我们很多时候都需要自己定义新的层来完成特定的运算,这时你需要在Caffe里添加新的层。

    你一开肯定无从下手,脑子一片空白。幸运的是Caffe github上的Wiki Development · BVLC/caffe Wiki · GitHub已经有了教程了,而且这是最接近latest Caffe的源码结构的教程,你在网上搜到的Blog很多是有点过时的,因为Caffe最近又重构了代码。你可以跟着它的指导去添加自己的层。

    虽然你已经知道要在哪里添加自己的东西了,但你遇到最核心的问题是如何写下面这四个函数。
    forward_cpu()
    forward_gpu()
    backward_cpu()
    backward_gpu()
    你可以先模仿已有的层去实现这四个函数,而且我相信forward函数很快就可以写出来了,但backward的还是一头雾水。这时我们就要补补神经网络里最核心的内容了——Backpropagation.

    4.理解并实现Backpropagation
    这个我觉得是与平台无关的,不管你是使用Caffe、Torch 7,还是Theano,你都需要深刻理解并掌握的。因为我比较笨,花了好长时间才能够适应推导中的各种符号。其实也不难,就是误差顺着Chain rule法则流回到前面的层。我不打算自己推导后向传播的过程,因为我知道我没有办法将它表达得很好,而且网上已经有很多非常好的教程了。下面是我觉得比较好的学习步骤吧。
    从浅层的神经网络(所谓的全连接层)的后向传播开始,因为这个比较简单,而且现在我们常说的CNN和LSTM的梯度计算也最终会回归到这里。
    第一个必看的是Ng深入浅出的Ufldl教程UFLDL Tutorial,还有中文版的,这对不喜欢看英语的同学是个好消息。当然你看一遍不理解,再看一遍,忘了,再看,读个几遍你才会对推导过程和数学符号熟悉。我头脑不大行,来来回回看了好多次。
    当然,Ufldl的教程有点短,我还发现了一个讲得更细腻清晰的教程, Michael Nielsen写的Neural networks and deep learning。它讲得实在太好了,以至于把我的任督二脉打通了。在Ufldl的基础上读这个,你应该可以很快掌握全连接层的反向传播。
    最后在拿出standford大牛karpathy的一篇博客Hacker’s guide to Neural Networks,这里用了具体的编程例子手把手教你算梯度,并不是推导后向传播公式的,是关于通用梯度计算的。用心去体会一下。
    这时你跃跃欲试,回去查看Caffe源码里Convolution层的实现,但发现自己好像没看懂。虽说卷积层和全连接层的推导大同小异,但思维上还是有个gap的。我建议你先去看看Caffe如何实现卷积的,Caffe作者贾扬清大牛在知乎上的回答在 Caffe 中如何计算卷积?让我茅塞顿开。重点理解im2col和col2im.
    这时你知道了Convolution的前向传播,还差一点就可以弄明白后向传播怎么实现了。我建议你死磕Caffe中Convolution层的计算过程,把每一步都搞清楚,经过痛苦的过程之后你会对反向传播有了新的体会的。在这之后,你应该有能力添加自己的层了。再补充一个完整的添加新的层的教程Making a Caffe Layer • Computer Vision Enthusiast。这篇教程从头开始实现了一个Angle To Sine Cosine Layer,包含了梯度推导,前向与后向传播的CPU和GPU函数,非常棒的一个教程。
    最后,建议学习一下基本的GPU Cuda编程,虽然Caffe中已经把Cuda函数封装起来了,用起来很方便,但有时还是需要使用kernel函数等Cuda接口的函数。这里有一个入门的视频教程,讲得挺不错的NVIDIA CUDA初级教程视频。

    我是从Torch7转移到Caffe的人,仅供参考,当你阅读前你应该具备一些有关DL的基础知识,本文集中写Caffe代码结构而非介绍DL知识
    我是去年底开始看Caffe代码的,看代码的时间加在一起也不到一个月,也算半个新手,的

    1. 初识Caffe
    1.1. Caffe相对与其他DL框架的优点和缺点:
    优点:
    速度快。Google Protocol Buffer数据标准为Caffe提升了效率。
    学术论文采用此模型较多。不确定是不是最多,但接触到的不少论文都与Caffe有关(R-CNN,DSN,最近还有人用Caffe实现LSTM)
    缺点:
    曾更新过重要函数接口。有人反映,偶尔会出现接口变换的情况,自己很久前写的代码可能过了一段时间就不能和新版本很好地兼容了。(现在更新速度放缓,接口逐步趋于稳定,感谢 评论区王峰的建议)
    对于某些研究方向来说的人并不适合。这个需要对Caffe的结构有一定了解,(后面提到)。
    1.2. Caffe代码层次。
    回答里面有人说熟悉Blob,Layer,Net,Solver这样的几大类,我比较赞同。我基本是从这个顺序开始学习的,这四个类复杂性从低到高,贯穿了整个Caffe。把他们分为三个层次介绍。
    Blob:是基础的数据结构,是用来保存学习到的参数以及网络传输过程中产生数据的类。
    Layer:是网络的基本单元,由此派生出了各种层类。修改这部分的人主要是研究特征表达方向的。
    Net:是网络的搭建,将Layer所派生出层类组合成网络。Solver:是Net的求解,修改这部分人主要会是研究DL求解方向的。

    2. Caffe进阶
    2.1. Blob:
    Caffe支持CUDA,在数据级别上也做了一些优化,这部分最重要的是知道它主要是对protocol buffer所定义的数据结构的继承,Caffe也因此可以在尽可能小的内存占用下获得很高的效率。(追求性能的同时Caffe也牺牲了一些代码可读性)
    在更高一级的Layer中Blob用下面的形式表示学习到的参数:
    vector<shared_ptr<Blob<Dtype> > > blobs_;
    这里使用的是一个Blob的容器是因为某些Layer包含多组学习参数,比如多个卷积核的卷积层。
    以及Layer所传递的数据形式,后面还会涉及到这里:
    vector<Blob<Dtype>*> &bottom;
    vector<Blob<Dtype>*> *top
    2.2. Layer:
    2.2.1. 5大Layer派生类型
    Caffe十分强调网络的层次性,也就是说卷积操作,非线性变换(ReLU等),Pooling,权值连接等全部都由某一种Layer来表示。具体来说分为5大类Layer
    NeuronLayer类 定义于neuron_layers.hpp中,其派生类主要是元素级别的运算(比如Dropout运算,激活函数ReLu,Sigmoid等),运算均为同址计算(in-place computation,返回值覆盖原值而占用新的内存)。
    LossLayer类 定义于loss_layers.hpp中,其派生类会产生loss,只有这些层能够产生loss。
    数据层 定义于data_layer.hpp中,作为网络的最底层,主要实现数据格式的转换。
    特征表达层(我自己分的类)定义于vision_layers.hpp(为什么叫vision这个名字,我目前还不清楚),实现特征表达功能,更具体地说包含卷积操作,Pooling操作,他们基本都会产生新的内存占用(Pooling相对较小)。
    网络连接层和激活函数(我自己分的类)定义于common_layers.hpp,Caffe提供了单个层与多个层的连接,并在这个头文件中声明。这里还包括了常用的全连接层InnerProductLayer类。
    2.2.2. Layer的重要成员函数
    在Layer内部,数据主要有两种传递方式,正向传导(Forward)和反向传导(Backward)。Forward和Backward有CPU和GPU(部分有)两种实现。Caffe中所有的Layer都要用这两种方法传递数据。
    virtual void Forward(const vector<Blob<Dtype>*> &bottom,
    vector<Blob<Dtype>*> *top) = 0;
    virtual void Backward(const vector<Blob<Dtype>*> &top,
    const vector<bool> &propagate_down,
    vector<Blob<Dtype>*> *bottom) = 0;
    Layer类派生出来的层类通过这实现这两个虚函数,产生了各式各样功能的层类。Forward是从根据bottom计算top的过程,Backward则相反(根据top计算bottom)。注意这里为什么用了一个包含Blob的容器(vector),对于大多数Layer来说输入和输出都各连接只有一个Layer,然而对于某些Layer存在一对多的情况,比如LossLayer和某些连接层。在网路结构定义文件(*.proto)中每一层的参数bottom和top数目就决定了vector中元素数目。
    layers {
    bottom: "decode1neuron" // 该层底下连接的第一个Layer
    bottom: "flatdata" // 该层底下连接的第二个Layer
    top: "l2_error" // 该层顶上连接的一个Layer
    name: "loss" // 该层的名字
    type: EUCLIDEAN_LOSS // 该层的类型
    loss_weight: 0
    }
    2.2.3. Layer的重要成员变量
    loss
    vector<Dtype> loss_;
    每一层又有一个loss_值,只不多大多数Layer都是0,只有LossLayer才可能产生非0的loss_。计算loss是会把所有层的loss_相加。
    learnable parameters
    vector<shared_ptr<Blob<Dtype> > > blobs_;
    前面提到过的,Layer学习到的参数。
    2.3. Net:
    Net用容器的形式将多个Layer有序地放在一起,其自身实现的功能主要是对逐层Layer进行初始化,以及提供Update( )的接口(更新网络参数),本身不能对参数进行有效地学习过程。
    vector<shared_ptr<Layer<Dtype> > > layers_;
    同样Net也有它自己的
    vector<Blob<Dtype>*>& Forward(const vector<Blob<Dtype>* > & bottom,
    Dtype* loss = NULL);
    void Net<Dtype>::Backward();
    他们是对整个网络的前向和方向传导,各调用一次就可以计算出网络的loss了。
    2.4. Solver
    这个类中包含一个Net的指针,主要是实现了训练模型参数所采用的优化算法,它所派生的类就可以对整个网络进行训练了。
    shared_ptr<Net<Dtype> > net_;
    不同的模型训练方法通过重载函数ComputeUpdateValue( )实现计算update参数的核心功能
    virtual void ComputeUpdateValue() = 0;
    最后当进行整个网络训练过程(也就是你运行Caffe训练某个模型)的时候,实际上是在运行caffe.cpp中的train( )函数,而这个函数实际上是实例化一个Solver对象,初始化后调用了Solver中的Solve( )方法。而这个Solve( )函数主要就是在迭代运行下面这两个函数,就是刚才介绍的哪几个函数。
    ComputeUpdateValue();
    net_->Update();

    至此,从底层到顶层对Caffe的主要结构都应该有了大致的概念。为了集中重点介绍Caffe的代码结构,文中略去了大量Caffe相关的实现细节和技巧,比如Layer和Net的参数如何初始化,proto文件的定义,基于cblas的卷积等操作的实现(cblas实现卷积这一点我的个人主页GanYuFei中的《Caffe学习笔记5-BLAS与boost::thread加速》有介绍)等等就不一一列举了。

    整体来看Layer部分代码最多,也反映出Caffe比较重视丰富网络单元的类型,然而由于Caffe的代码结构高度层次化,使得某些研究以及应用(比如研究类似非逐层连接的神经网络这种复杂的网络连接方式)难以在该平台实现。这也就是一开始说的一个不足。

    另外,Caffe基本数据单元都用Blob,使得数据在内存中的存储变得十分高效,紧凑,从而提升了整体训练能力,而同时带来的问题是我们看见的一些可读性上的不便,比如forward的参数也是直接用Blob而不是设计一个新类以增强可读性。所以说性能的提升是以可读性为代价的。
    最后一点也是最重要的一点,我从Caffe学到了很多。第一次看的C++项目就看到这么好的代码,实在是受益匪浅,在这里也感谢作者贾扬清等人的贡献。
    14年初因为赶NIPS,开始用caffe,大概用了有一年半了。

    先说个大概,知道了神经网络的结构,forward跟backward是怎样的一个过程,基本上就知道了caffe的结构了。按照神经网络的运行过程看Caffe就好了。

    既然说神经网络,那么就得有一个网络出来,caffe里面就用Net这个类来记录这个网络。

    那么网络是由很多个layer构成,自然而然就会有Layer这个类,为了统一管理这些类,自然而然就想要抽象,那么Layer这个抽象类作为一个最基本的单元出现了,接下来就会有实现各种功能的layer出现,如:Convolution/ReLU/Softmax等。

    Layer间需要连接啊,Layer需要有输入输出啊,caffe里面用Bottom来表示输入,Top表示输出,前一层Layer的top是后一层layer的bottom,这样,连接搞掂了,输入输出也搞掂了。

    网络搞掂了,layer搞掂了,那就要搞个求解算法啊,那么Solver这个类就出现了,这个就是用来求解网络的。

    就酱紫,有时间再写得详细一点。反正就这么一句话:按照神经网络的运行过程看Caffe就好了。

  13. 弱菜说道:

    人脸识别开源界的一股清流。

    检测方面在JDA大家都报告无法复现,CNN方法又太慢(特指开源方法,各个公司应该都有很好的优化方案了)不能应用到手机端的当下,这套开源软件的检测模块无论在效果还是速度方面都达到了可用的程度。

    对齐这块本身比较简单,现有的开源软件也都能做得比较好了,随便搞个cnn回归一下效果就已经不错了。

    人脸验证模块在使用对齐好的LFW图片上能做到98.6%,检测对齐全部使用该开源软件的情况下97.1%,已经超过或与现有开源软件持平,由于有完整方案,易用性应该完胜其他开源软件。

    目测一大波实验室都能凭这套软件接人脸识别项目了,我们这种号称专业搞人脸识别但实际上就是跑跑模型的实验室感觉要混不下去了T T

    Kagemusha 国際旅人、在华“外国人”
    代码声明用VS开发的,除了OpenCV以外不依赖任何第三方库。简单试了一下,在OS X下轻松编译通过。

    CV发展了这么多年,人脸框架的原理大家都已经掌握了。对于公司来说,除了检测代码,数据和完整的训练框架才是王道啊,否则只能跑跑现成的model。

    个人理解(可能有失偏颇):
    设计类似caffe,人脸对齐用的sift,人脸检测用的mlp,人脸识别用的cnn,只有forward没有backward所以只能测试,而且只能测试他给的模型。他们应该有一个类似于caffe的东西,可以训练的玩意,这次开源没有完全开源所有东西。
    不过挺不错的,可以写个程序把caffe训练的权重转换成他的格式,然后再把caffe的算子移植过去,避免重新造轮子。然后就可以开心滴在移动设备上跑起来。

    与caffe的不同点(刘昕介绍):
    另外identification的模块训练用到了caffe或tesorflow,前向框架是重新设计的,不依赖任何第三方库。

    预计SeetaFace可以拉高人脸识别草根创业公司的下限,但是除此以外对工业界影响应该不会很大:

    1. 虽然说SeetaFace是开源引擎,但是核心的内容是CNN模型参数的二进制文件(针对identification而论),而SeetaFace的模型并不能像caffemodel那样随意拿来finetune。

    2. 人脸识别应用领域还有一些更有挑战性和现实意义的问题(比如cross-domain matching),而SeetaFace就是一个写死的东西,工业界无法基于SeetaFace做出改进。有技术能力的公司还是得用自己的模型和框架来解决这些问题。

    3. 想把caffe在移动设备上跑起来更可靠的方案是OpenCV的DNN module,而seetaFace的特征提取支持的东西还是太少,目测要加个PReLU还得自己写。。。

    另外想靠这套软件接人脸识别项目的实验室还是不要指望了,甲方雇个本科生调用一下SeetaFace的动态链接库就能完事的事情就轮不到实验室来抢饭碗了。。。
    1. 算法和模型变得不是最重要的了,数据和业务积累越来越重要;
    2. 降低行业门槛,让更多的人进来玩,一起再把蛋糕做的更大些,玩的人多了,玩法就更多了;
    3. 山老师这套东西应该不是业内最好的,和SenseTime、Face++还应该有些差距,根据市场数一数二的理论,可以赚钱,但是个应该赚的比较费劲;
    4. 技术开放出来,让同行帮忙挑挑毛病,帮忙改进下,同时也看看自己的技术能用到那些地方,摸一摸底;
    5. 提高知名度和美誉度;
    6. 开源的其实也有开源的赚钱方式,比如像但年的康盛创想、wordpress都赚的盆满钵流,但是要有足够的市场支持。

    确实佩服山老师他们,人脸应该不缺开源的项目,但是以前的都是某些固定方向的,比如检测、定位、识别,但是像这次这么系统同时名气这么大的是第一次。而且开源需要勇气,出了放弃既得利益还有要对自己的项目代码有足够的自信,毕竟被吐槽也是有可能的。

    指导意义还是挺大,是一个完整算法级的解决方案。不过当前人脸识别的主要应用点是身份证现场照比对,直接现场照现场照比对应用不是特别多。目前不太清楚山老师采用的什么人脸库进行训练,如果没有身份证照片训练,估计比对效果会大打折扣。这个做过人脸识别的应该都清楚。我实现了一个android版的身份证现场照人脸识别(verification),只有三个接口调用,直接给出相似度,感兴趣的可以看一下(https://github.com/fengFly2014 里面有个Android_Face_Verification项目)。至于算法层面我想大家已经都比较熟悉,人脸检测(使用opencv)+人脸对齐(3000fps)+特征提取(CNN和openblas加速)+比对(LR),其中人脸检测自训练算法和暂时不开放。整理好的话后续也按照山老师的格式给一个android版完整开源版本。

    人脸识别开源界的一股清流。

    检测方面在JDA大家都报告无法复现,CNN方法又太慢(特指开源方法,各个公司应该都有很好的优化方案了)不能应用到手机端的当下,这套开源软件的检测模块无论在效果还是速度方面都达到了可用的程度。

    对齐这块本身比较简单,现有的开源软件也都能做得比较好了,随便搞个cnn回归一下效果就已经不错了。

    大致觉得是 pixel RNN 从图像换到了音频,再加上 seq2seq training 的结果,算法挺直观而且 make sense。先占个坑,下周和楼下语音组的同学吃饭再来回答技术问题。

    小小的吐槽一句:这年代连 arxiv 一天的处理时间都不愿意等了,论文直接首发 google doc??? 可能因为围观过 reddit 对某篇 nips withdrawn paper 撕 x 大战而导致我这几天太敏感了吧。。。我现在觉得 DL 的应用研究已经有些像"老中医炼丹",从 make sense theory 到真正的 stunning performance 还差着些愚笨的我所不能理解的 tricks。
    不过话又说回来,Deepmind 在圈里名声非常好 (every DL phd student is a potential employee of Deepmind 笑),他们承担着 google 的股价不可能造假,估计应该是拿到内幕消息要抢在对手前头。

    种方法是基于神经网络的HMM-free的方法。以前的基于神经网络的语音合成方法都要依赖于HMM强制对齐的结果,只能做frame-to-frame的回归。这种方法彻底摆脱了HMM,应该是基于神经网络的语音合成第一次做到end-to-end。
    我认为这种方法应该跟给出前一帧预测下一帧的方法差不多,就是用当前帧之前的信息预测当前帧。能生成特定的语音,这个就类似与VAE,GAN都有conditional的版本,把想要生成的文本作为一部分输入。

    微软的语音合成效果也挺不错,感觉并没有和这套系统给的例子差很多

    1.学习程序的第一步,先让程序跑起来,看看结果,这样就会有直观的感受。
    Caffe的官网上Caffe | Deep Learning Framework 提供了很多的examples,你可以很容易地开始训练一些已有的经典模型,如LeNet。我建议先从 LeNet MNIST Tutorial开始,因为数据集很小,网络也很小但很经典,用很少的时间就可以跑起来了。当你看到terminal刷拉拉的一行行输出,看到不断减少的loss和不断上升的accuracy,训练结束你得到了99+%的准确率,感觉好厉害的样子。你可以多跑跑几个例子,熟悉一下环境和接口。

    2.单步调试,跟着Caffe在网络里流动
    当玩了几天之后,你对Caffe的接口有点熟悉了,对已有的例子也玩腻了,你开始想看看具体是怎么实现的了。我觉得最好的方法是通过单步调试的方式跟着程序一步一步的在网络里前向传播,然后再被当成误差信息传回来。

    Caffe就像一个你平常编程中Project,你可以使用IDE或者GDB去调试它,这里我们不细说调试的过程。你可以先跟踪前向传播的过程,无非就是从高层次到低层次的调用Forward函数, Solver->Net->Layer->Specific Layer (Convolution等…).后向传播也类似,但因为你对Caffe里面的各种变量运算不熟悉,当你跟踪完前向传播时可能已经头晕眼花了,还是休息一下,消化一下整个前向传播的流程。

    刚刚开始你没有必要对每个Layer的计算细节都那么较真,大概知道程序的运算流程就好,这样你才可以比较快的对Caffe有个大体的把握。

    3.个性化定制Caffe
    到这里,你已经可以说自己有用过Caffe了,但是还不能算入门,因为你还不知道怎么修改源码,满足自己特定的需求。我们很多时候都需要自己定义新的层来完成特定的运算,这时你需要在Caffe里添加新的层。

    你一开肯定无从下手,脑子一片空白。幸运的是Caffe github上的Wiki Development · BVLC/caffe Wiki · GitHub已经有了教程了,而且这是最接近latest Caffe的源码结构的教程,你在网上搜到的Blog很多是有点过时的,因为Caffe最近又重构了代码。你可以跟着它的指导去添加自己的层。

    虽然你已经知道要在哪里添加自己的东西了,但你遇到最核心的问题是如何写下面这四个函数。
    forward_cpu()
    forward_gpu()
    backward_cpu()
    backward_gpu()
    你可以先模仿已有的层去实现这四个函数,而且我相信forward函数很快就可以写出来了,但backward的还是一头雾水。这时我们就要补补神经网络里最核心的内容了——Backpropagation.

    4.理解并实现Backpropagation
    这个我觉得是与平台无关的,不管你是使用Caffe、Torch 7,还是Theano,你都需要深刻理解并掌握的。因为我比较笨,花了好长时间才能够适应推导中的各种符号。其实也不难,就是误差顺着Chain rule法则流回到前面的层。我不打算自己推导后向传播的过程,因为我知道我没有办法将它表达得很好,而且网上已经有很多非常好的教程了。下面是我觉得比较好的学习步骤吧。
    从浅层的神经网络(所谓的全连接层)的后向传播开始,因为这个比较简单,而且现在我们常说的CNN和LSTM的梯度计算也最终会回归到这里。
    第一个必看的是Ng深入浅出的Ufldl教程UFLDL Tutorial,还有中文版的,这对不喜欢看英语的同学是个好消息。当然你看一遍不理解,再看一遍,忘了,再看,读个几遍你才会对推导过程和数学符号熟悉。我头脑不大行,来来回回看了好多次。
    当然,Ufldl的教程有点短,我还发现了一个讲得更细腻清晰的教程, Michael Nielsen写的Neural networks and deep learning。它讲得实在太好了,以至于把我的任督二脉打通了。在Ufldl的基础上读这个,你应该可以很快掌握全连接层的反向传播。
    最后在拿出standford大牛karpathy的一篇博客Hacker’s guide to Neural Networks,这里用了具体的编程例子手把手教你算梯度,并不是推导后向传播公式的,是关于通用梯度计算的。用心去体会一下。
    这时你跃跃欲试,回去查看Caffe源码里Convolution层的实现,但发现自己好像没看懂。虽说卷积层和全连接层的推导大同小异,但思维上还是有个gap的。我建议你先去看看Caffe如何实现卷积的,Caffe作者贾扬清大牛在知乎上的回答在 Caffe 中如何计算卷积?让我茅塞顿开。重点理解im2col和col2im.
    这时你知道了Convolution的前向传播,还差一点就可以弄明白后向传播怎么实现了。我建议你死磕Caffe中Convolution层的计算过程,把每一步都搞清楚,经过痛苦的过程之后你会对反向传播有了新的体会的。在这之后,你应该有能力添加自己的层了。再补充一个完整的添加新的层的教程Making a Caffe Layer • Computer Vision Enthusiast。这篇教程从头开始实现了一个Angle To Sine Cosine Layer,包含了梯度推导,前向与后向传播的CPU和GPU函数,非常棒的一个教程。
    最后,建议学习一下基本的GPU Cuda编程,虽然Caffe中已经把Cuda函数封装起来了,用起来很方便,但有时还是需要使用kernel函数等Cuda接口的函数。这里有一个入门的视频教程,讲得挺不错的NVIDIA CUDA初级教程视频。

    我是从Torch7转移到Caffe的人,仅供参考,当你阅读前你应该具备一些有关DL的基础知识,本文集中写Caffe代码结构而非介绍DL知识
    我是去年底开始看Caffe代码的,看代码的时间加在一起也不到一个月,也算半个新手,的

    1. 初识Caffe
    1.1. Caffe相对与其他DL框架的优点和缺点:
    优点:
    速度快。Google Protocol Buffer数据标准为Caffe提升了效率。
    学术论文采用此模型较多。不确定是不是最多,但接触到的不少论文都与Caffe有关(R-CNN,DSN,最近还有人用Caffe实现LSTM)
    缺点:
    曾更新过重要函数接口。有人反映,偶尔会出现接口变换的情况,自己很久前写的代码可能过了一段时间就不能和新版本很好地兼容了。(现在更新速度放缓,接口逐步趋于稳定,感谢 评论区王峰的建议)
    对于某些研究方向来说的人并不适合。这个需要对Caffe的结构有一定了解,(后面提到)。
    1.2. Caffe代码层次。
    回答里面有人说熟悉Blob,Layer,Net,Solver这样的几大类,我比较赞同。我基本是从这个顺序开始学习的,这四个类复杂性从低到高,贯穿了整个Caffe。把他们分为三个层次介绍。
    Blob:是基础的数据结构,是用来保存学习到的参数以及网络传输过程中产生数据的类。
    Layer:是网络的基本单元,由此派生出了各种层类。修改这部分的人主要是研究特征表达方向的。
    Net:是网络的搭建,将Layer所派生出层类组合成网络。Solver:是Net的求解,修改这部分人主要会是研究DL求解方向的。

    2. Caffe进阶
    2.1. Blob:
    Caffe支持CUDA,在数据级别上也做了一些优化,这部分最重要的是知道它主要是对protocol buffer所定义的数据结构的继承,Caffe也因此可以在尽可能小的内存占用下获得很高的效率。(追求性能的同时Caffe也牺牲了一些代码可读性)
    在更高一级的Layer中Blob用下面的形式表示学习到的参数:
    vector<shared_ptr<Blob<Dtype> > > blobs_;
    这里使用的是一个Blob的容器是因为某些Layer包含多组学习参数,比如多个卷积核的卷积层。
    以及Layer所传递的数据形式,后面还会涉及到这里:
    vector<Blob<Dtype>*> &bottom;
    vector<Blob<Dtype>*> *top
    2.2. Layer:
    2.2.1. 5大Layer派生类型
    Caffe十分强调网络的层次性,也就是说卷积操作,非线性变换(ReLU等),Pooling,权值连接等全部都由某一种Layer来表示。具体来说分为5大类Layer
    NeuronLayer类 定义于neuron_layers.hpp中,其派生类主要是元素级别的运算(比如Dropout运算,激活函数ReLu,Sigmoid等),运算均为同址计算(in-place computation,返回值覆盖原值而占用新的内存)。
    LossLayer类 定义于loss_layers.hpp中,其派生类会产生loss,只有这些层能够产生loss。
    数据层 定义于data_layer.hpp中,作为网络的最底层,主要实现数据格式的转换。
    特征表达层(我自己分的类)定义于vision_layers.hpp(为什么叫vision这个名字,我目前还不清楚),实现特征表达功能,更具体地说包含卷积操作,Pooling操作,他们基本都会产生新的内存占用(Pooling相对较小)。
    网络连接层和激活函数(我自己分的类)定义于common_layers.hpp,Caffe提供了单个层与多个层的连接,并在这个头文件中声明。这里还包括了常用的全连接层InnerProductLayer类。
    2.2.2. Layer的重要成员函数
    在Layer内部,数据主要有两种传递方式,正向传导(Forward)和反向传导(Backward)。Forward和Backward有CPU和GPU(部分有)两种实现。Caffe中所有的Layer都要用这两种方法传递数据。
    virtual void Forward(const vector<Blob<Dtype>*> &bottom,
    vector<Blob<Dtype>*> *top) = 0;
    virtual void Backward(const vector<Blob<Dtype>*> &top,
    const vector<bool> &propagate_down,
    vector<Blob<Dtype>*> *bottom) = 0;
    Layer类派生出来的层类通过这实现这两个虚函数,产生了各式各样功能的层类。Forward是从根据bottom计算top的过程,Backward则相反(根据top计算bottom)。注意这里为什么用了一个包含Blob的容器(vector),对于大多数Layer来说输入和输出都各连接只有一个Layer,然而对于某些Layer存在一对多的情况,比如LossLayer和某些连接层。在网路结构定义文件(*.proto)中每一层的参数bottom和top数目就决定了vector中元素数目。
    layers {
    bottom: "decode1neuron" // 该层底下连接的第一个Layer
    bottom: "flatdata" // 该层底下连接的第二个Layer
    top: "l2_error" // 该层顶上连接的一个Layer
    name: "loss" // 该层的名字
    type: EUCLIDEAN_LOSS // 该层的类型
    loss_weight: 0
    }
    2.2.3. Layer的重要成员变量
    loss
    vector<Dtype> loss_;
    每一层又有一个loss_值,只不多大多数Layer都是0,只有LossLayer才可能产生非0的loss_。计算loss是会把所有层的loss_相加。
    learnable parameters
    vector<shared_ptr<Blob<Dtype> > > blobs_;
    前面提到过的,Layer学习到的参数。
    2.3. Net:
    Net用容器的形式将多个Layer有序地放在一起,其自身实现的功能主要是对逐层Layer进行初始化,以及提供Update( )的接口(更新网络参数),本身不能对参数进行有效地学习过程。
    vector<shared_ptr<Layer<Dtype> > > layers_;
    同样Net也有它自己的
    vector<Blob<Dtype>*>& Forward(const vector<Blob<Dtype>* > & bottom,
    Dtype* loss = NULL);
    void Net<Dtype>::Backward();
    他们是对整个网络的前向和方向传导,各调用一次就可以计算出网络的loss了。
    2.4. Solver
    这个类中包含一个Net的指针,主要是实现了训练模型参数所采用的优化算法,它所派生的类就可以对整个网络进行训练了。
    shared_ptr<Net<Dtype> > net_;
    不同的模型训练方法通过重载函数ComputeUpdateValue( )实现计算update参数的核心功能
    virtual void ComputeUpdateValue() = 0;
    最后当进行整个网络训练过程(也就是你运行Caffe训练某个模型)的时候,实际上是在运行caffe.cpp中的train( )函数,而这个函数实际上是实例化一个Solver对象,初始化后调用了Solver中的Solve( )方法。而这个Solve( )函数主要就是在迭代运行下面这两个函数,就是刚才介绍的哪几个函数。
    ComputeUpdateValue();
    net_->Update();

    至此,从底层到顶层对Caffe的主要结构都应该有了大致的概念。为了集中重点介绍Caffe的代码结构,文中略去了大量Caffe相关的实现细节和技巧,比如Layer和Net的参数如何初始化,proto文件的定义,基于cblas的卷积等操作的实现(cblas实现卷积这一点我的个人主页GanYuFei中的《Caffe学习笔记5-BLAS与boost::thread加速》有介绍)等等就不一一列举了。

    整体来看Layer部分代码最多,也反映出Caffe比较重视丰富网络单元的类型,然而由于Caffe的代码结构高度层次化,使得某些研究以及应用(比如研究类似非逐层连接的神经网络这种复杂的网络连接方式)难以在该平台实现。这也就是一开始说的一个不足。

    另外,Caffe基本数据单元都用Blob,使得数据在内存中的存储变得十分高效,紧凑,从而提升了整体训练能力,而同时带来的问题是我们看见的一些可读性上的不便,比如forward的参数也是直接用Blob而不是设计一个新类以增强可读性。所以说性能的提升是以可读性为代价的。
    最后一点也是最重要的一点,我从Caffe学到了很多。第一次看的C++项目就看到这么好的代码,实在是受益匪浅,在这里也感谢作者贾扬清等人的贡献。
    14年初因为赶NIPS,开始用caffe,大概用了有一年半了。

    先说个大概,知道了神经网络的结构,forward跟backward是怎样的一个过程,基本上就知道了caffe的结构了。按照神经网络的运行过程看Caffe就好了。

    既然说神经网络,那么就得有一个网络出来,caffe里面就用Net这个类来记录这个网络。

    那么网络是由很多个layer构成,自然而然就会有Layer这个类,为了统一管理这些类,自然而然就想要抽象,那么Layer这个抽象类作为一个最基本的单元出现了,接下来就会有实现各种功能的layer出现,如:Convolution/ReLU/Softmax等。

    Layer间需要连接啊,Layer需要有输入输出啊,caffe里面用Bottom来表示输入,Top表示输出,前一层Layer的top是后一层layer的bottom,这样,连接搞掂了,输入输出也搞掂了。

    网络搞掂了,layer搞掂了,那就要搞个求解算法啊,那么Solver这个类就出现了,这个就是用来求解网络的。

    就酱紫,有时间再写得详细一点。反正就这么一句话:按照神经网络的运行过程看Caffe就好了。

发表评论

邮箱地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>