为什么要做深度学习而不是宽度学习?「建议收藏」

为什么要做深度学习而不是宽度学习?「建议收藏」点击此处返回总目录 前面在深度学习介绍的最后有留下一个疑问。我们为什么要dee…

大家好,又见面了,我是你们的朋友全栈君。

                                                                                                                                                   点击此处返回总目录

 

前面在深度学习介绍的最后有留下一个疑问。我们为什么要deep learning。

                             为什么要做深度学习而不是宽度学习?「建议收藏」

我们说,变深了,参数增多,model变复杂,performance变好,是很正常的。

所以,真正要比较一个深度model和一个shallow(浅层) model的时候,你要调整两个model,让他们的参数是一样多的。这样才有说服力。很多人在比较deep 和shallow model 的时候,没有注意到这件事,这样对比是不公平的。你要让两者的参数一样多,这样才公平,这种情况下shallow的model就是一个矮胖的model,deep的model就会是一个高瘦的model。接下来的问题就是,在这个公平的评比之下,shallow比较强还是deep比较强呢?

                               为什么要做深度学习而不是宽度学习?「建议收藏」

所以,刚才的实验结果是有后半段的。后半段的实验结果是这样的,用5层,每层2K个神经元得到的error是17.2%。另外,用1层,3772个神经元得到的error是22.5%,为什么是3772个神经元呢?因为这样这两个网络的参数是接近的。我们发现1层的error比较大。

同样,7层每层2K个神经元和1层4634个神经元,他们的参数是接近的。发现1层的也是比较差的。

甚至,增加参数变成1层但是有16K个神经元,error也只是从22.6变到22.1而已。

当用一层非常非常宽的网络(参数多),跟只有2层每层2K个神经元的网络(参数少)相比,效果还不如后者。

                                    为什么要做深度学习而不是宽度学习?「建议收藏」

 

在很多人的想象里面,deep learning就是一个暴力碾压的方法,我弄一个很大很大的model,然后collect一大堆的data,所以就得到了一个比较好的performance,它就是一个暴力的方法。实际上,你会发现不是这样子。如果你今天只是单纯地增加参数,你是让网络长宽而不是长高的话,其实对performance的帮助是比较小的。把网络长高对performance很有帮助,把网络长宽帮助没有那么好。

 

—————————————————————————————————————————-

为什么会这样呢?

我们可以想象说,当我们在做deep learning的时候,其实我们是在做模块化这件事情。什么意思呢,大家应该都会写程序,写程序的时候不能把所有的代码都写在一个函数里面,而是写一些子函数。然后层层调用。这样做的好处是,有的函数可以共用,不用每次都写,进而减小程序的复杂度。

                                为什么要做深度学习而不是宽度学习?「建议收藏」

 

如果用在machine learning上面呢。假设我们要做图像分类。我们要把image分成4类。长发男,长发女,短发男,短发女。然后我们对这四类去收集data,然后去train 4个分类器,然后就可以解决这个问题。但是长发男生的examples可能是比较少的,所以没有太多的training data,所以分类器2就比较弱,它的performance就比较差。

 

                      为什么要做深度学习而不是宽度学习?「建议收藏」

 

那怎么办呢?你可以用模块化的思想。

假设我们现在不是直接去解那个问题,而是把原来的问题切成比较小的问题,比如我们去learn一些分类器,这个分类器的工作呢,是去detect 有没有一种attribute(属性)出现。比如这里不是这里不是直接detect长发男生还是长发女生,而是把这个问题切成比较小的问题。切成两个问题,输入一张图片判断是长头发还是短头发,输入一张图片判断是男生还是女生。虽然说长头发的男生数量很少,但是男生女生的data可以收集很多。同样长头发和短头发的data也可以收集很多。所以,在train这个basic 分类器的时候,就不会说train的太差。这个分类器都有足够的data。

                             为什么要做深度学习而不是宽度学习?「建议收藏」

 

接下来呢,要解最后的问题,四个分类器只需要参考前面的basic 分类器就好了。每一个分类器都公用前面的basic 分类器。后面可以用前面的分类器。后面分类器的参数只需要很少的data就可以train好,因为真正复杂的事都被basic 分类器做了。

                  为什么要做深度学习而不是宽度学习?「建议收藏」

 

deep learning怎么跟模块化扯上关系呢?每一个神经元就是一个basic的分类器。第一层的是最basic的,第二层的把第一层的当做模块…以此类推。当然要强调的是说,在做deep learning的时候,怎么做模块化这件事情是machine自动学到的。

                    为什么要做深度学习而不是宽度学习?「建议收藏」

刚才我们说,模块化的好处是什么?模块化的好处是,让我们的模型变简单了。我们是把本来复杂的问题,变得比较简单。当我们把问题变简单的时候,就算training data没有那么多,我们也可以把这个task做好。如果deep learning做的是模块化的话,那其实,神奇的是,deep learning需要的data是比较少的。

                    为什么要做深度学习而不是宽度学习?「建议收藏」

这跟我们的认知是相反的。很多人会说没有big data,deep learning就不会work。其实,并不是这样。如果数据量非常多,比如有全世界的图片,再来做图像分类,就不需要deep learning了。所以deep learning在某种程度上是跟big data是相反的。就是因为没有足够的data,我们才用machine learning去举一反三。

 

在图像上面,可以观察到类似模块化的现象。

                            为什么要做深度学习而不是宽度学习?「建议收藏」

 

在声音上面,deep learning 也显示模块化的思想。

 

—————————————————————————————————————————-

我们回到很久以前提到过的University theory。过去有个理论告诉我们说,任何的连续函数f都可以用一层神经网络来完成。只要那一层神经网路够宽的话。这是在90年代很多人放弃做deep learning的一个原因。只要一层隐藏层就可以表示任何的function,那deep learning的意义何在呢?所以很多人说deep 是没有必要的,我们就只要一个隐藏层就好。但是这个理论有个事情没有告诉我们。它只告诉我们可能性,没有告诉我们要做到这件事情有多有效率。

没错,只要有够多的参数,就可以描述任何的function。但是当我们用一个隐藏层来描述function的时候,它是没有效率的。当使用deep structure来描述的时候,是比较有效率的。

                           为什么要做深度学习而不是宽度学习?「建议收藏」

—————————————————————————————————————————-

如果刚才模块化的概念没有听明白的话,我们举另外一个例子。

学过逻辑电路的可以看一下。就不讲了。

 

如果没学过的话,还有一个剪窗花的例子。也不讲了。

 

—————————————————————————————————————————-

当我们用deep learning的时候呢,另外一个好处是,我们可以做end-to-end learning.所谓的end-to-end learning,意思是这样。

比如说我们要处理的问题呢,非常复杂。比如语音识别。我们要解一个machine learning的问题,我们首先要找一个Model。当你要处理的问题很复杂的时候,你的model它会需要是一个生产线。这个model表示一个很复杂的function,是由很多个比较简单的function串叠在一起。比如说要做声音识别,先把声音信号送进来,然后通过很多个function一层一层的转换,最后变成文字。当做end-to-end learning的时候,就是说,只给你的model input和output,不告诉它说中间每一个function要怎么分工,让它自己去学每一个点要做什么事情。在deep learning里,要做这件事情的时候,就是叠一个很深的神经网络,每一层就是生产线上的一个点,就是一个简单的函数,每一层就会自己学到应该做什么事情。

 

                               为什么要做深度学习而不是宽度学习?「建议收藏」

比如说,在声音识别里面,还没有用deep learning 的时候,怎么做呢?现有一段声音信号,然后先做DFT,变成spectrogram,然后再做Filter bank,再取log,然后再做DCT,得到MFCC,再把MFCC丢掉GMM里面,得到结果。在整个生产线上面呢,只有最后的GMM是由training data学出来的,其他的都是手工做的。其他的部分都是古圣先贤花了好几十年研究出来的。

 

                                  为什么要做深度学习而不是宽度学习?「建议收藏」

但是有了deep learning以后,我们就可以把手工的这些步骤用神经网络取代掉。比如可以把DCT拿掉,直接从log后面加deep learning。甚至可以从spectrogram开始用深度学习做,把后面的都拿掉。

有人挑战说,能不能叠一个很深很深的网络,直接输入是声音信号,输出是文字,中间完全不用做什么傅里叶变换。如果傅里叶变换都不用做,就可以不用学信号系统了。后来这件事情的结局是这样的,Google拼死learn了一个很大的网络,输入就是声音信号,输出是文字。最后可以做到跟有做傅里叶变换的结果打平。但是也仅仅是打平,这说明傅里叶变换很强,或许它已经是信号处理的极限了,machine learning learn出来的结果,其实也就是傅里叶变换。所以,信号系统还是必要的。

                                 为什么要做深度学习而不是宽度学习?「建议收藏」

 

刚才是声音的例子,图像也差不多,就不多说了。过去图像处理也是很多的人工的步骤,但现在也就直接用一个很深的网络,输入是像素,输出是文字。

                                     为什么要做深度学习而不是宽度学习?「建议收藏」

 

                                    为什么要做深度学习而不是宽度学习?「建议收藏」

 

—————————————————————————————————————————-

 

deep learning还有什么好处呢?

通常我们task,是非常复杂的。有时候非常像的input,会有很不一样的output。比如白色的狗和北极熊看起来很像,但是output不一样。有时候非常不一样的东西,看起来是一样的。比如下面两个都是火车。

                            为什么要做深度学习而不是宽度学习?「建议收藏」

如果,网络只有一层的话,只能做简单的transform,没有办法把一样的东西变成不一样,没法把不一样的东西变得很像。

要让原来input很不一样的东西变成一样,需要做很多层次的转换。举例来说,看下面的例子。这来自12年的一篇文章。做的事情是,把MFCC投影到二维平面上,不同颜色代表不同人说的话。这些人说的话是一样的。看左图,同样的句子,不同的人说声音信号很不一样。如果今天learn 一个神经网络,只看第一层的hidden layer的output,你会说不同的人说的同一个句子还是很不一样。但是如果看第8个隐藏层的输入的话,会发现不同人说的同一个句子在一起了。也就是说,dnn在转换的时候把本来看起来很不像的东西,就把他们连在一起了。本来很不像,经过8个layer的变换以后,就变得很像了。

 

          为什么要做深度学习而不是宽度学习?「建议收藏」

刚才是语音的例子,如果用手写数字辨识的例子,输入是这样。如果把28*28的像素投影到二维平面的话,看起来是input这样。你会发现4跟9几乎是叠在一起的。几乎没有办法分开。第一个隐藏层的output,还是很像,没有分的太开。看第二个hidden layer,会发现逐渐分开。第三个分的更开。所以要让本来看的很像的分的很开,也需要好多层才能办到这件事。

                                 为什么要做深度学习而不是宽度学习?「建议收藏」

 

—————————————————————————————————————————-

 

其实还有更多,用deep learning的理由了。比如这个人,第一个PPT是Do deep net really need to be deep?第二页PPT就写了个yes,然后留了很多时间让大家问问题。哈哈

                           为什么要做深度学习而不是宽度学习?「建议收藏」

 

还有一些其他的解释,可以自己去看。

                             为什么要做深度学习而不是宽度学习?「建议收藏」

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143455.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月21日 下午5:00
下一篇 2022年5月21日 下午5:20


相关推荐

  • 网卡TSO

    网卡TSO网卡 TSO 功能当一个系统需要通过网络发送一大段数据时 计算机需要将这段数据拆分为多个长度较短的数据 以便这些数据能够通过网络中所有的网络设备 这个过程被称作分段 而当网卡支持 TSO 时 TCP 层会逐渐增大 mss 总是整数倍数增加 当 TCP 层向下发送大块数据时 仅仅计算 TCP 头 网卡接到到了 IP 层传下的大数据包后自己重新分成若干个 IP 数据包 添加 IP 头 复制 TCP 头并且重新计算校验和等相关数据 TCP 分段卸载将 TCP 的分片运算 如将要发送的 1M 字节的数据拆分为 MTU 大小的包 交给网卡处理

    2026年3月18日
    2
  • 微信个人号机器人

    微信个人号机器人前段时间公司需求开发一套自定义的微信机器人,需求是可以自批量添加好友,自动聊天,自动回复,发朋友圈,转发语音,以及定时群发等,还可以提取聊天内容,进行数据汇总,what????微信还可以这样做!!调研开发了3个月,3个月啊!!!(主要被各种技术走偏路),终于成功了,都是走过的心酸泪,分享给大家,大家学习完,记得给我点个赞!!!大家一般需求点无非是以下几个需求:1.开发个人微信营销系统2.开发自定义的微信机器人,3.开发微信智能聊天客服系统4.定制行业内的群数据分析功能需求很

    2022年5月7日
    50
  • 自旋锁和互斥锁区别在哪_互斥锁的实现

    自旋锁和互斥锁区别在哪_互斥锁的实现POSIXthreads(简称Pthreads)是在多核平台上进行并行编程的一套常用的API。线程同步(ThreadSynchronization)是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间共享的临界区(CriticalSection)进行保护(另一种常用的同步机制是barrier)。Pthreads提供了多种锁机制:…

    2025年8月20日
    5
  • 容器技术基础介绍

    容器技术基础介绍作为云原生发展的基石 容器技术的新趋势和新挑战备受关注 以容器为代表的云原生技术正在成为释放云价值的最短路径

    2026年3月18日
    2
  • java大数据培训[通俗易懂]

    java大数据培训[通俗易懂]从近几年的发展来看,大数据已经可以说是当之无愧的热门了,大数据在越来越多的行业实现落地,也就需要更多的专业人才来支持。很多人都看好大数据行业,想要转向大数据发展,其中也不乏Java一类的技术开发人员。今天的大数据课程学习培训分享,我们来聊聊Java转大数据的那些事儿。因为大数据本身也与Java开发存在着紧密的关联性,行业当中现有的大数据从业者,其中也不乏Java资深开发者,在实际的工作当中,抓住大数据机遇,从Java开发转向了大数据开发,薪资待遇和发展空间,都有了明显的增长和拓宽。Java转大数

    2022年8月30日
    8
  • matlab中如何调用lm算法,lm算法的matlab实现「建议收藏」

    matlab中如何调用lm算法,lm算法的matlab实现「建议收藏」inlm’);%下面使用遗传算法对网络进行优化P=XX;T=YY;R=size(P,1);S2=size(T,1);S1=25;%隐含层节点数S=R*S1+S1*S2+S1+S2;%遗传算法编码……实现nfc95p算法的matlab程序_数学_自然科学_专业资料。cleara…{on}|off]例子1用matlab实现对fmsinsin2…lm1;…

    2026年4月19日
    6

发表回复

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

关注全栈程序员社区公众号