精华内容
下载资源
问答
  • Han Yang 的答案说「可解释性应该指的是对于数据的可解释性」,我觉得可解释性应该指的是对于「结构」的可解释性。以分类问题举例,对于一些简单的...但用神经网络来解决同样的问题,最终训练而来的模型同样是某种...

    Han Yang 的答案说「可解释性应该指的是对于数据的可解释性」,我觉得可解释性应该指的是对于「结构」的可解释性。以分类问题举例,对于一些简单的分类问题,我们可以主动设计出一个解决算法,也就是某种结构,并通过测试数据来优化或者纠正这个结构,最重要的是,这个结构可以被人分析、理解和抽象——它最终可以还原为某种流程图,乃至一个逻辑代数的公式。但用神经网络来解决同样的问题,最终训练而来的模型同样是某种结构,却好像是「生长」出来的,没办法把它还原成更抽象的东西,甚至没有太多道理可以讲。

    我感觉传统算法比较像传统机器制造业。假如我要做一个硬币分类器,我可以设计一个斜坡,从上到下开由小到大的孔,然后让硬币滑过斜坡,小硬币会先滑落,大硬币会最后滑落,这个结构是可以理解的(并且 predictable)。而神经网络比较像养蛊:我在一个粗大的垂直玻璃管中间放个架子,铺上几层有活性的胶状微粒。然后从玻璃管上方不停往下倒硬币,这些硬币会沉入胶状微粒层,从而改变掉落的方向。如果微粒层使得硬币按照大小分别接近指定落点,我就给这些胶状微粒投点营养剂,如果离远了,我就投点毒。倒了几百万个硬币之后,这些胶状物自己固化出来了一个结构,可以把我扔进去的硬币分别掉落到指定落点,而我却(接近于完全)不知道这些微粒生成出来的这个结构为什么能做到这件事(即便我知道单个微粒的工作原理,能调整每一个微粒,也可以改变微粒的层数,或者投放的营养液的剂量),也不知道这些微粒子为什么会生成这样一个结构

    展开全文
  • 循环神经网络(RNN)原理通俗解释

    万次阅读 多人点赞 2017-11-30 15:15:37
    1.RNN怎么来的? 2.RNN的网络结构及原理 3.RNN的改进1:双向RNN 4.RNN的改进2:深层双向RNN...循环神经网络的应用场景比较多,比如暂时能写论文,写程序,写诗,但是,(总是会有但是的),但是他们现在还不能正常使...

    1.RNN怎么来的?

    循环神经网络的应用场景比较多,比如暂时能写论文,写程序,写诗,但是,(总是会有但是的),但是他们现在还不能正常使用,学习出来的东西没有逻辑,所以要想真正让它更有用,路还很远。

    这是一般的神经网络应该有的结构:
    这里写图片描述

    既然我们已经有了人工神经网络和卷积神经网络,为什么还要循环神经网络?
    原因很简单,无论是卷积神经网络,还是人工神经网络,他们的前提假设都是:元素之间是相互独立的,输入与输出也是独立的,比如猫和狗。
    但现实世界中,很多元素都是相互连接的,比如股票随时间的变化,一个人说了:我喜欢旅游,其中最喜欢的地方是云南,以后有机会一定要去_____.这里填空,人应该都知道是填“云南“。因为我们是根据上下文的内容推断出来的,但机会要做到这一步就相当得难了。因此,就有了现在的循环神经网络,他的本质是:像人一样拥有记忆的能力。因此,他的输出就依赖于当前的输入和记忆。

    2.RNN的网络结构及原理

    它的网络结构如下:
    这里写图片描述
    其中每个圆圈可以看作是一个单元,而且每个单元做的事情也是一样的,因此可以折叠呈左半图的样子。用一句话解释RNN,就是一个单元结构重复使用

    RNN是一个序列到序列的模型,假设xt1,xt,xt+1是一个输入:“我是中国“,那么ot1,ot就应该对应”是”,”中国”这两个,预测下一个词最有可能是什么?就是ot+1应该是”人”的概率比较大。

    因此,我们可以做这样的定义:

    Xt:tot:tSt:t
    。因为我们当前时刻的输出是由记忆和当前时刻的输入决定的,就像你现在大四,你的知识是由大四学到的知识(当前输入)和大三以及大三以前学到的东西的(记忆)的结合,RNN在这点上也类似,神经网络最擅长做的就是通过一系列参数把很多内容整合到一起,然后学习这个参数,因此就定义了RNN的基础:
    St=f(UXt+WSt1)
    大家可能会很好奇,为什么还要加一个f()函数,其实这个函数是神经网络中的激活函数,但为什么要加上它呢?
    举个例子,假如你在大学学了非常好的解题方法,那你初中那时候的解题方法还要用吗?显然是不用了的。RNN的想法也一样,既然我能记忆了,那我当然是只记重要的信息啦,其他不重要的,就肯定会忘记,是吧。但是在神经网络中什么最适合过滤信息呀?肯定是激活函数嘛,因此在这里就套用一个激活函数,来做一个非线性映射,来过滤信息,这个激活函数可能为tanh,也可为其他。

    假设你大四快毕业了,要参加考研,请问你参加考研是不是先记住你学过的内容然后去考研,还是直接带几本书去参加考研呢?很显然嘛,那RNN的想法就是预测的时候带着当前时刻的记忆St去预测。假如你要预测“我是中国“的下一个词出现的概率,这里已经很显然了,运用softmax来预测每个词出现的概率再合适不过了,但预测不能直接带用一个矩阵来预测呀,所有预测的时候还要带一个权重矩阵V,用公式表示为:

    ot=softmax(VSt)
    其中ot就表示时刻t的输出。

    RNN中的结构细节:
    1.可以把St当作隐状态,捕捉了之前时间点上的信息。就像你去考研一样,考的时候记住了你能记住的所有信息。
    2.ot是由当前时间以及之前所有的记忆得到的。就是你考研之后做的考试卷子,是用你的记忆得到的。
    3.很可惜的是,St并不能捕捉之前所有时间点的信息。就像你考研不能记住所有的英语单词一样。
    4.和卷积神经网络一样,这里的网络中每个cell都共享了一组参数(U,V,W),这样就能极大的降低计算量了。
    5.ot在很多情况下都是不存在的,因为很多任务,比如文本情感分析,都是只关注最后的结果的。就像考研之后选择学校,学校不会管你到底怎么努力,怎么心酸的准备考研,而只关注你最后考了多少分。

    3.RNN的改进1:双向RNN

    在有些情况,比如有一部电视剧,在第三集的时候才出现的人物,现在让预测一下在第三集中出现的人物名字,你用前面两集的内容是预测不出来的,所以你需要用到第四,第五集的内容来预测第三集的内容,这就是双向RNN的想法。如图是双向RNN的图解:
    这里写图片描述

    St1=f(U1Xt+W1St1+b1)
    :St2=f(U2Xt+W2St1+b2)
    ot=softmax(V[St1;St2])
    这里的[St1;St2]做的是一个拼接,如果他们都是1000X1维的,拼接在一起就是1000X2维的了。

    双向RNN需要的内存是单向RNN的两倍,因为在同一时间点,双向RNN需要保存两个方向上的权重参数,在分类的时候,需要同时输入两个隐藏层输出的信息。

    4.RNN的改进2:深层双向RNN

    深层双向RNN 与双向RNN相比,多了几个隐藏层,因为他的想法是很多信息记一次记不下来,比如你去考研,复习考研英语的时候,背英语单词一定不会就看一次就记住了所有要考的考研单词吧,你应该也是带着先前几次背过的单词,然后选择那些背过,但不熟的内容,或者没背过的单词来背吧。

    深层双向RNN就是基于这么一个想法,他的输入有两方面,第一就是前一时刻的隐藏层传过来的信息ht1(i),和当前时刻上一隐藏层传过来的信息ht(i1)=[ht(i1);ht(i1)],包括前向和后向的。
    这里写图片描述

    我们用公式来表示是这样的:
    这里写图片描述
    然后再利用最后一层来进行分类,分类公式如下:
    这里写图片描述

    4.1 Pyramidal RNN

    其他类似的网络还有Pyramidal RNN:
    这里写图片描述
    我们现在有一个很长的输入序列,可以看到这是一个双向的RNN,上图是谷歌的W.Chan做的一个测试,它原先要做的是语音识别,他要用序列到序列的模型做语音识别,序列到序列就是说,输入一个序列然后就输出一个序列。

    由图我们发现,上一层的两个输出,作为当前层的输入,如果是非常长的序列的话,这样做的话,每一层的序列都比上一层要短,但当前层的输入f(x)也会随之增多,貌似看一起相互抵消,运算量并没有什么改进。

    但我们知道,对于一层来说,它是从前往后转的,比如要预测一个股市的变化,以天为单位,假如要预测明天的股市变化,你就要用今天,以及今天之前的所有数据,我们暂时无法只用昨天的数据,不用今天的数据,预测明天的数据,也即是说,预测必须具有连续性。
    但每一层的f运算是可以并行的,从这个角度来看,运算量还是可以接受的,特别是在原始输入序列较短的时候还是有优势的。

    5.RNN的训练-BPTT

    如前面我们讲的,如果要预测t时刻的输出,我们必须先利用上一时刻(t-1)的记忆和当前时刻的输入,得到t时刻的记忆:

    st=tanh(Uxt+Wst1)
    然后利用当前时刻的记忆,通过softmax分类器输出每个词出现的概率:
    y^t=softmax(Vst)
    为了找出模型最好的参数,U,W,V,我们就要知道当前参数得到的结果怎么样,因此就要定义我们的损失函数,用交叉熵损失函数:
    tEt(yt,y^t)=ytlogy^t
    其中ytt时刻的标准答案,是一个只有一个是1,其他都是0的向量;y^t是我们预测出来的结果,与yt的维度一样,但它是一个概率向量,里面是每个词出现的概率。因为对结果的影响,肯定不止一个时刻,因此需要把所有时刻的造成的损失都加起来:
    E(yt,y^t)=tEt(yt,y^t)=tytlogy^t

    如图所示,你会发现每个cell都会有一个损失,我们已经定义好了损失函数,接下来就是熟悉的一步了,那就是根据损失函数利用SGD来求解最优参数,在CNN中使用反向传播BP算法来求解最优参数,但在RNN就要用到BPTT,它和BP算法的本质区别,也是CNN和RNN的本质区别:CNN没有记忆功能,它的输出仅依赖与输入,但RNN有记忆功能,它的输出不仅依赖与当前输入,还依赖与当前的记忆。这个记忆是序列到序列的,也就是当前时刻收到上一时刻的影响,比如股市的变化。

    因此,在对参数求偏导的时候,对当前时刻求偏导,一定会涉及前一时刻,我们用例子看一下:

    假设我们对E3的W求偏导:它的损失首先来源于预测的输出y^3,预测的输出又是来源于当前时刻的记忆s3,当前的记忆又是来源于当前的输出和截止到上一时刻的记忆:s3=tanh(Ux3+Ws2)
    因此,根据链式法则可以有:

    E3W=E3y^3y^3s3s3W
    但是,你会发现,s2=tanh(Ux2+Ws1),也就是s2里面的函数还包含了W,因此,这个链式法则还没到底,就像图上画的那样,所以真正的链式法则是这样的:
    这里写图片描述
    我们要把当前时刻造成的损失,和以往每个时刻造成的损失加起来,因为我们每一个时刻都用到了权重参数W。和以往的网络不同,一般的网络,比如人工神经网络,参数是不同享的,但在循环神经网络,和CNN一样,设立了参数共享机制,来降低模型的计算量。

    6.RNN与CNN的结合应用:看图说话

    在图像处理中,目前做的最好的是CNN,而自然语言处理中,表现比较好的是RNN,因此,我们能否把他们结合起来,一起用呢?那就是看图说话了,这个原理也比较简单,举个小栗子:假设我们有CNN的模型训练了一个网络结构,比如是这个

    最后我们不是要分类嘛,那在分类前,是不是已经拿到了图像的特征呀,那我们能不能把图像的特征拿出来,放到RNN的输入里,让他学习呢?

    之前的RNN是这样的:

    St=tanh(UXt+WSt1)
    我们把图像的特征加在里面,可以得到:
    St=tanh(UXt+WSt1+VX)
    其中的X就是图像的特征。如果用的是上面的CNN网络,X应该是一个4096X1的向量。

    注:这个公式只在第一步做,后面每次更新就没有V了,因为给RNN数据只在第一次迭代的时候给。

    7.RNN项目练手

    RNN可以写歌词,写诗等,这有个项目可以玩玩,还不错。
    Tensorflow实现RNN

    展开全文
  • 神经网络通俗解释

    千次阅读 2015-03-04 11:44:46
    人工神经网络算法的作用机理还是比较难理解,现在以一个例子来说明其原理。这个例子是关于人的识别技术的,在门禁系统,逃犯识别,各种验证码破译,银行预留印鉴签名比对,机器人设计等领域都有比较好的应用前景,...
    人工神经网络算法的作用机理还是比较难理解,现在以一个例子来说明其原理。这个例子是关于人的识别技术的,在门禁系统,逃犯识别,各种验证码破译,银行预留印鉴签名比对,机器人设计等领域都有比较好的应用前景,当然也可以用来做客户数据的挖掘工作,比如建立一个能筛选满足某种要求的客户群的模型。
    
        机器识别人和我们人类识别人的机理大体相似,看到一个人也就是识别对象以后,我们首先提取其关键的外部特征比如身高,体形,面部特征,声音等等。根据这些信息大脑迅速在内部寻找相关的记忆区间,有这个人的信息的话,这个人就是熟人,否则就是陌生人。
       人工神经网络就是这种机理。假设上图中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的相信你.修改了这个权重就意味着电脑通过学习认为体形在判断一个人是否是自己认识的人的时候并不是那么重要.这就是机器学习的一个循环.我们可以要求阿猫再穿一双高跟皮鞋改变一下身高这个属性,让电脑再一次进行学习,通过变换所有可能变换的外部特征,轮换让电脑学习记忆,它就会记住阿猫这个人比较关键的特征,也就是没有经过修改的特征.也就是电脑通过学习会总结出识别阿猫甚至任何一个人所依赖的关键特征.经过阿猫的训练电脑,电脑已经非常聪明了,这时你在让阿猫换身衣服或者换双鞋站在电脑前面,电脑都可以迅速的判断这个人就是阿猫.因为电脑已经不主要依据这些特征识别人了,通过改变衣服,身高骗不了它.当然,有时候如果电脑赖以判断的阿猫关键特征发生变化,它也会判断失误.我们就不要要求这么高了,不要说电脑,就是人类也无能为力,你的一个好朋友你经过多次的识记肯定认识吧,但是他整了容你们在大街上邂逅.你可能觉得这个人声音好熟悉,体形好熟悉,----都像自己一个朋友,就是脸长的不像.你不敢贸然上去搭讪吧(否定的判断).因为我们判定一个人是否是自己的朋友的时候依靠的关键的特征就是面部特征,而他恰恰就是改变了这一特征.当然也存在我们把一个拥有和我们朋友足够多相似特征的人判定为我们的朋友,这就是认错人的现象了.这些问题电脑也会出现.
    不过这个算法还是有比较积极的意义的,实现了一定程度上的智能化.
    展开全文
  • CNN笔记:通俗理解卷积神经网络

    万次阅读 多人点赞 2016-07-02 22:14:50
    通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言 2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有...

                   通俗理解卷积神经网络(cs231n与5月dl班课程笔记)

     

     

     

    1 前言

        2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有一个词似乎比“机器学习”更火,那就是“深度学习”。

        本博客内写过一些机器学习相关的文章,但上一篇技术文章“LDA主题模型”还是写于2014年11月份,毕竟自2015年开始创业做在线教育后,太多的杂事、琐碎事,让我一直想再写点技术性文章但每每恨时间抽不开。然由于公司在不断开机器学习、深度学习等相关的在线课程,耳濡目染中,总会顺带着学习学习。

        我虽不参与讲任何课程(我所在公司“七月在线”的所有在线课程都是由目前讲师团队的100多位讲师讲),但依然可以用最最小白的方式 把一些初看复杂的东西抽丝剥茧的通俗写出来。这算重写技术博客的价值所在。

        在dl中,有一个很重要的概念,就是卷积神经网络CNN,基本是入门dl必须搞懂的东西。本文基本根据斯坦福的机器学习公开课、cs231n、与七月在线寒小阳讲的5月dl班所写,是一篇课程笔记。

        一开始本文只是想重点讲下CNN中的卷积操作具体是怎么计算怎么操作的,但后面不断补充,包括增加不少自己的理解,故写成了关于卷积神经网络的通俗导论性的文章。有何问题,欢迎不吝指正。

     

     

    2 人工神经网络

    2.1 神经元

        神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。

        举个手写识别的例子,给定一个未知数字,让神经网络识别是什么数字。此时的神经网络的输入由一组被输入图像的像素所激活的输入神经元所定义。在通过非线性激活函数进行非线性变换后,神经元被激活然后被传递到其他神经元。重复这一过程,直到最后一个输出神经元被激活。从而识别当前数字是什么字。

        神经网络的每个神经元如下

        基本wx + b的形式,其中

    • 表示输入向量
    • 为权重,几个输入则意味着有几个权重,即每个输入都被赋予一个权重
    • b为偏置bias
    • g(z) 为激活函数
    • a 为输出

        如果只是上面这样一说,估计以前没接触过的十有八九又必定迷糊了。事实上,上述简单模型可以追溯到20世纪50/60年代的感知器,可以把感知器理解为一个根据不同因素、以及各个因素的重要性程度而做决策的模型。

        举个例子,这周末北京有一草莓音乐节,那去不去呢?决定你是否去有二个因素,这二个因素可以对应二个输入,分别用x1、x2表示。此外,这二个因素对做决策的影响程度不一样,各自的影响程度用权重w1、w2表示。一般来说,音乐节的演唱嘉宾会非常影响你去不去,唱得好的前提下 即便没人陪同都可忍受,但如果唱得不好还不如你上台唱呢。所以,我们可以如下表示:

    • :是否有喜欢的演唱嘉宾。 = 1 你喜欢这些嘉宾, = 0 你不喜欢这些嘉宾。嘉宾因素的权重 = 7
    • :是否有人陪你同去。 = 1 有人陪你同去, = 0 没人陪你同去。是否有人陪同的权重 = 3。

        这样,咱们的决策模型便建立起来了:g(z) = g( * + * + b ),g表示激活函数,这里的b可以理解成 为更好达到目标而做调整的偏置项。

        一开始为了简单,人们把激活函数定义成一个线性函数,即对于结果做一个线性变化,比如一个简单的线性激活函数是g(z) = z,输出都是输入的线性变换。后来实际应用中发现,线性激活函数太过局限,于是人们引入了非线性激活函数。

    2.2 激活函数

        常用的非线性激活函数有sigmoid、tanhrelu等等,前两者sigmoid/tanh比较常见于全连接层,后者relu常见于卷积层。这里先简要介绍下最基础的sigmoid函数(btw,在本博客中SVM那篇文章开头有提过)。

        sigmoid的函数表达式如下

        其中z是一个线性组合,比如z可以等于:b + * + *通过代入很大的正数或很小的负数到g(z)函数中可知,其结果趋近于0或1

        因此,sigmoid函数g(z)的图形表示如下( 横轴表示定义域z,纵轴表示值域g(z) ):

        也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常小的负数时,则g(z)会趋近于0

        压缩至0到1有何用处呢?用处是这样一来便可以把激活函数看作一种“分类的概率”,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。

        举个例子,如下图(图引自Stanford机器学习公开课

        z = b + * + *,其中b为偏置项 假定取-30,都取为20

    • 如果 = 0  = 0,则z = -30,g(z) = 1/( 1 + e^-z )趋近于0。此外,从上图sigmoid函数的图形上也可以看出,当z=-30的时候,g(z)的值趋近于0
    • 如果 = 0 = 1,或 =1 = 0,则z = b + * + * = -30 + 20 = -10,同样,g(z)的值趋近于0
    • 如果 = 1 = 1,则z = b + * + * = -30 + 20*1 + 20*1 = 10,此时,g(z)趋近于1。

        换言之,只有都取1的时候,g(z)→1,判定为正样本;取0的时候,g(z)→0,判定为负样本如此达到分类的目的。

    2.3 神经网络

        将下图的这种单个神经元

        组织在一起,便形成了神经网络。下图便是一个三层神经网络结构

        上图中最左边的原始输入信息称之为输入层,最右边的神经元称之为输出层(上图中输出层只有一个神经元),中间的叫隐藏层。

        啥叫输入层、输出层、隐藏层呢?

    • 输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。
    • 输出层(Output layer),讯息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。
    • 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。

        同时,每一层都可能由单个或多个神经元组成,每一层的输出将会作为下一层的输入数据。比如下图中间隐藏层来说,隐藏层的3个神经元a1、a2、a3皆各自接受来自多个不同权重的输入(因为有x1、x2、x3这三个输入,所以a1 a2 a3都会接受x1 x2 x3各自分别赋予的权重,即几个输入则几个权重),接着,a1、a2、a3又在自身各自不同权重的影响下 成为的输出层的输入,最终由输出层输出最终结果。

        上图(图引自Stanford机器学习公开课)中

    • 表示第j层第i个单元的激活函数/神经元
    • 表示从第j层映射到第j+1层的控制函数的权重矩阵 

        此外,输入层和隐藏层都存在一个偏置(bias unit),所以上图中也增加了偏置项:x0、a0。针对上图,有如下公式

        此外,上文中讲的都是一层隐藏层,但实际中也有多层隐藏层的,即输入层和输出层中间夹着数层隐藏层,层和层之间是全连接的结构,同一层的神经元之间没有连接。

     

     

    3 卷积神经网络之层级结构

       cs231n课程里给出了卷积神经网络各个层级结构,如下图

        上图中CNN要做的事情是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车 那是什么车

        所以

    • 最左边是数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。

        中间是

    • CONV:卷积计算层,线性乘积 求和。
    • RELU:激励层,上文2.2节中有提到:ReLU是激活函数的一种。
    • POOL:池化层,简言之,即取区域平均或最大。

        最右边是

    • FC:全连接层

        这几个部分中,卷积计算层是CNN的核心,下文将重点阐述。


    4 CNN之卷积计算层

    4.1 CNN怎么进行识别
       简言之,当我们给定一个"X"的图案,计算机怎么识别这个图案就是“X”呢?一个可能的办法就是计算机存储一张标准的“X”图案,然后把需要识别的未知图案跟标准"X"图案进行比对,如果二者一致,则判定未知图案即是一个"X"图案。

       而且即便未知图案可能有一些平移或稍稍变形,依然能辨别出它是一个X图案。如此,CNN是把未知图案和标准X图案一个局部一个局部的对比,如下图所示 [图来自参考文案25]


    而未知图案的局部和标准X图案的局部一个一个比对时的计算过程,便是卷积操作。卷积计算结果为1表示匹配,否则不匹配。

    具体而言,为了确定一幅图像是包含有"X"还是"O",相当于我们需要判断它是否含有"X"或者"O",并且假设必须两者选其一,不是"X"就是"O"。



    理想的情况就像下面这个样子:

    标准的"X"和"O",字母位于图像的正中央,并且比例合适,无变形

    对于计算机来说,只要图像稍稍有一点变化,不是标准的,那么要解决这个问题还是不是那么容易的:


    计算机要解决上面这个问题,一个比较天真的做法就是先保存一张"X"和"O"的标准图像(就像前面给出的例子),然后将其他的新给出的图像来和这两张标准图像进行对比,看看到底和哪一张图更匹配,就判断为哪个字母。

    但是这么做的话,其实是非常不可靠的,因为计算机还是比较死板的。在计算机的“视觉”中,一幅图看起来就像是一个二维的像素数组(可以想象成一个棋盘),每一个位置对应一个数字。在我们这个例子当中,像素值"1"代表白色,像素值"-1"代表黑色。


    当比较两幅图的时候,如果有任何一个像素值不匹配,那么这两幅图就不匹配,至少对于计算机来说是这样的。

    对于这个例子,计算机认为上述两幅图中的白色像素除了中间的3*3的小方格里面是相同的,其他四个角上都不同:


    因此,从表面上看,计算机判别右边那幅图不是"X",两幅图不同,得出结论:


    但是这么做,显得太不合理了。理想的情况下,我们希望,对于那些仅仅只是做了一些像平移,缩放,旋转,微变形等简单变换的图像,计算机仍然能够识别出图中的"X"和"O"。就像下面这些情况,我们希望计算机依然能够很快并且很准的识别出来:


    这也就是CNN出现所要解决的问题。

    Features


    对于CNN来说,它是一块一块地来进行比对。它拿来比对的这个“小块”我们称之为Features(特征)。在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性,相比起传统的整幅图逐一比对的方法。

    每一个feature就像是一个小图(就是一个比较小的有值的二维数组)。不同的Feature匹配图像中不同的特征。在字母"X"的例子中,那些由对角线和交叉线组成的features基本上能够识别出大多数"X"所具有的重要特征。


    这些features很有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体到底是怎么匹配的呢?如下:






    看到这里是不是有了一点头目呢。但其实这只是第一步,你知道了这些Features是怎么在原图上面进行匹配的。但是你还不知道在这里面究竟进行的是怎样的数学计算,比如这个下面3*3的小块到底干了什么?


    这里面的数学操作,就是我们常说的“卷积”操作。接下来,我们来了解下什么是卷积操作。

    4.2 什么是卷积

        对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。

        非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。

        OK,举个具体的例子。比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。

        分解下上图

    对应位置上是数字先相乘后相加 =

        中间滤波器filter与数据窗口做内积,其具体计算过程则是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8

    4.3 图像上的卷积

        在下图对应的计算过程中,输入是一定区域大小(width*height)的数据,和滤波器filter(带着一组固定权重的神经元)做内积后等到新的二维数据。

        具体来说,左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。

        如下图所示

      

     

    4.4 GIF动态卷积图

        在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数: 
      a. 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
      b. 步长stride:决定滑动多少步可以到边缘。

      c. 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。 

      这里写图片描述 

        cs231n课程中有一张卷积动图,貌似是用d3js 和一个util 画的,我根据cs231n的卷积动图依次截取了18张图,然后用一gif 制图工具制作了一gif 动态卷积图。如下gif 图所示

        可以看到:

    • 两个神经元,即depth=2,意味着有两个滤波器。
    • 数据窗口每次移动两个步长取3*3的局部数据,即stride=2。
    • zero-padding=1。

        然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。

        如果初看上图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情:

    • 左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
    • 中间部分是两个不同的滤波器Filter w0、Filter w1
    • 最右边则是两个不同的输出

        随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。

        值得一提的是:

    1. 左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。
    • 打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。

    与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。

    • 再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。

        我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说计算过程是“相乘后相加”,但到底具体是个怎么相乘后相加的计算过程 则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。

        首先,我们来分解下上述动图,如下图

        接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示:

    1* 0 + 1*0 + -1*

    +

    -1*0 + 0*0 + 1*1

    +

    -1*0 + -1*0 + 0*1

     

    +

    -1*0 + 0*0 + -1*0

    +

    0*0 + 0*1 + -1*1

    +

    1*0 + -1*0 + 0*2

     

    +

    0*0 + 1*0 + 0*0

    +

    1*0 + 0*2 + 1*0

    +

    0*0 + -1*0 + 1*0

     

    +

     

    1

    =

    1

        然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果

        最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。

     

     

    5 CNN之激励层与池化层

    5.1 ReLU激励层

        2.2节介绍了激活函数sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,其图形表示如下

        ReLU的优点是收敛快,求梯度简单。

    5.2 池化pool层

        前头说了,池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n)

        上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。很简单不是?

     

     

    6 后记

        本文基本上边看5月dl班寒讲的CNN视频边做笔记,之前断断续续看过不少CNN相关的资料(包括cs231n),但看过视频之后,才系统了解CNN到底是个什么东西,作为听众 寒讲的真心赞、清晰。然后在写CNN相关的东西时,发现一些前置知识(比如神经元、多层神经网络等也需要介绍下),包括CNN的其它层次机构(比如激励层),所以本文本只想简要介绍下卷积操作的,但考虑到知识之间的前后关联,所以越写越长,便成本文了。

        此外,在写作本文的过程中,请教了我们讲师团队里的寒、冯两位,感谢他两。同时,感谢爱可可老师的微博转发,感谢七月在线所有同事。

    以下是修改日志:

    • 2016年7月5日,修正了一些笔误、错误,以让全文更通俗、更精准。有任何问题或槽点,欢迎随时指出。
    • 2016年7月7日,第二轮修改完毕。且根据cs231n的卷积动图依次截取了18张图,然后用制图工具制作了一gif 动态卷积图,放在文中4.3节。
    • 2016年7月16日,完成第三轮修改。本轮修改主要体现在sigmoid函数的说明上,通过举例和统一相关符号让其含义更一目了然、更清晰。
    • 2016年8月15日,完成第四轮修改,增补相关细节。比如补充4.3节GIF动态卷积图中输入部分的解释,即7*7*3的含义(其中7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)。不断更易懂。
    • 2016年8月22日,完成第五轮修改。本轮修改主要加强滤波器的解释,及引入CNN中滤波器的通俗比喻。

        July、最后修改于二零一六年八月二十二日中午于七月在线办公室。

     


    7 参考文献及推荐阅读

    1. 人工神经网络wikipedia
    2. 斯坦福机器学习公开课
    3. http://neuralnetworksanddeeplearning.com/
    4. 雨石 卷积神经网络:http://blog.csdn.net/stdcoutzyx/article/details/41596663
    5. cs231n 神经网络结构与神经元激励函数:http://cs231n.github.io/neural-networks-1/中译版
    6. cs231n 卷积神经网络:http://cs231n.github.io/convolutional-networks/
    7. 七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频,已经剪切部分放在七月在线官网:julyedu.com
    8. 七月在线5月深度学习班第5课CNN训练注意事项部分视频:https://www.julyedu.com/video/play/42/207
    9. 七月在线5月深度学习班:https://www.julyedu.com/course/getDetail/37
    10. 七月在线5月深度学习班课程笔记——No.4《CNN与常用框架》:http://blog.csdn.net/joycewyj/article/details/51792477
    11. 七月在线6月数据数据挖掘班第7课视频:数据分类与排序
    12. 手把手入门神经网络系列(1)_从初等数学的角度初探神经网络:http://blog.csdn.net/han_xiaoyang/article/details/50100367
    13. 深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数:http://blog.csdn.net/han_xiaoyang/article/details/50447834
    14. 深度学习与计算机视觉系列(10)_细说卷积神经网络:http://blog.csdn.net/han_xiaoyang/article/details/50542880
    15. zxy 图像卷积与滤波的一些知识点:http://blog.csdn.net/zouxy09/article/details/49080029
    16. zxy 深度学习CNN笔记:http://blog.csdn.net/zouxy09/article/details/8781543/
    17. http://www.wildml.com/2015/11/understanding-convolutional-neural-networks-for-nlp/中译版
    18. 《神经网络与深度学习》中文讲义:http://vdisk.weibo.com/s/A_pmE4iIPs9D
    19. ReLU与sigmoid/tanh的区别:https://www.zhihu.com/question/29021768
    20. CNN、RNN、DNN内部网络结构区别:https://www.zhihu.com/question/34681168
    21. 理解卷积:https://www.zhihu.com/question/22298352
    22. 神经网络与深度学习简史:1 感知机和BP算法4 深度学习的伟大复兴
    23. 在线制作gif 动图:http://www.tuyitu.com/photoshop/gif.htm
    24. 支持向量机通俗导论(理解SVM的三层境界)
    25. CNN究竟是怎样一步一步工作的? 本博客把卷积操作具体怎么个计算过程写清楚了,但这篇把为何要卷积操作也写清楚了,而且配偶图非常形象,甚赞。
    展开全文
  • 神经网络是在传统多项式回归的基础上,受到了生物神经网络”激活“现象的启发,引入了激活函数而构建起来的机器学习模型。在图像处理领域,由于图像的数据量非常大,伴随着产生的问题是网络参数量非常大,而卷积神经...
  • 通俗解释"神经网络

    2017-12-06 18:20:23
    当下互联网圈最火的要数"人工智能"了,而人工智能是基于神经网络的,这里简单描述一下"神经网络" 人的神经元 人的神经元 简化版神经元 简化版 上图中的圆圈表示一个"感知器",它可以接受多个输入,产出一...
  • 神经网络通俗讲,麻瓜变大神(二)-解释非线性 理解神经网络,我们就从一个例子开始吧,该例子输入5个特征,然后输出这个人是美还是丑: 该神经网络结构包含三层,分别为: 1.输入层(input):5个特征,分别表示皮肤...
  • 神经网络通俗讲,麻瓜变大神(二)-解释非线性 下面是很常见的神经网络代码,3层神经网络,输入层(300,2),隐藏层(2,3),激活函数ReLu,输出层(3,3),epoch=5000: import numpy as np import matplotlib.pyplot as plt ...
  • 卷积神经网络通俗解读

    千次阅读 2018-07-20 15:45:40
     神经网络(《简单又复杂的人工神经网络》)可以逼近任何连续的函数,那么神经网络就有无限的泛化能力。对于大部分分类问题而言,本质就是求得一个函数y=f(x),例如:对于图像识别而言就是求得一个以像素张量为自...
  • LSTM神经网络通俗讲解

    2019-07-30 14:46:06
    由来 人类并不是每时每刻都从一片空白的大脑开始他们的思考。在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见词的理解来推断当前词的真实...传统的神经网络应该很难来处理这个问题——使用电影中先前的事...
  • 现在谈人工智能已经绕不开“神经网络”这个词了。人造神经网络粗线条地模拟人脑,使得计算机能够从数据中学习。 机器学习这一强大的分支结束了 AI 的寒冬,迎来了人工智能的新时代。简而言之,神经网络可能...
  • 卷积神经网络是当下AI人工智能深度学习的基础,CNN可以应用在场景分类,图像分类,现在还可以应用到自然语言处理(NLP)方面的很多问题,比如句子分类等。下面进行讲解。 计算机视觉和 CNN 发展十一座里程碑 2.神经元 ...
  • 卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。 它包括卷积层(convolutional layer)和池化层(pooling ...
  • 神经网络图灵机的通俗解释和详细过程及应用? 神经图灵机的本质是一个使用外部存储矩阵进行attentive interaction机制的RNN,由于定义的RNN各个部分都是可导的,使得输入训练数据通过机器学习(bp加gd)训练...
  • 于是,“人工神经网络(ANN, Artificial Neural Network)”就在这样苛刻的条件下粉墨登场了,神经科学的研究成果为机器学习领域开辟了广阔的道路。 神经元 有一种假说:“智能来源于单一的算法(One Learning ...
  • 其实CNN(网络)很简单,先上图: 可以看到,MLP和CNN之间的差别其实就是CNN多了一层CONV(卷积层)和一层POOLING(池化层)。 那么这两层有什么作用呢? 其实卷积池化完全可以是看作网络自动帮你提取特征的过程,...
  • 通俗易懂的解释卷积神经网络

    千次阅读 2019-01-17 18:51:45
    什么是卷积神经网络?为什么它们很重要? 卷积神经网络(ConvNets 或者 CNNs)属于神经网络的范畴,已经在诸如图像识别和分类的领域证明了其高效的能力。卷积神经网络可以成功识别人脸、物体和交通信号,从而为...
  • 附件是VISIO版本的CNN的通俗解释。包含了卷积的运算过程的图片化过程展示。卷积神经网络的的运行步骤。
  • 神经网络通俗理解

    2015-07-12 16:39:00
    数学之美--上对人工神经网络通俗解释很形象: 0. 分类神经网络最重要的用途是分类,为了让大家对分类有个直观的认识,咱们先看几个例子: 垃圾邮件识别:现在有一封电子邮件,把出现在里面的所有词汇...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,518
精华内容 5,807
关键字:

神经网络通俗解释