然则怎样hhhkl却马克思列宁主义揭示了搜不到下一页面,弹出的马克思列宁主义揭示了wwWhhhklcom框里

额~这个问题,我至少准备了半年。给题主点经验:&br&&br&首先,强烈建议采用“题海战术”。我当然不会告诉题主,今年面了数十家公司,90%的题目是原题(没办法,就那几个知识点,能有什么新题)&br&题库在哪里呢?按照循序渐进的原则,一一介绍:&br&1. cc150,全名cracking the coding interview - 150 Programming Questions and Solutions。经典中的经典,曾有人别的啥都不做,刷这本书三四遍,拿了Google的offer(注意是在美国,在中国就算了……)这本书的优势在于分章节,每章突出一块知识,题目精炼,答案好找;缺点呢,你写出的代码,需要深度检验,而cc150是书不是online judge,这个还是做不到。&br&2. leetcode。程序员刷面试题的第一网站,题多且全,少部分题目收费。刷的人很多,答案非常好找。online judge能深度检验代码的正确性,刷leetcode是最能锻炼算法题能力的。假如说时间有限只能刷一个,那必须是leetcode,假如时间够多……lintcode、meetqun等各大面试题OJ欢迎你,此外还有许多国内外大学的OJ。&br&----------------------------------------------------------------------------------------------------------------------------------------&br&以上是两大主力,但是光这两个,还不能到“题海”的水平,而且由于它们名气太响,有些公司有时会避开里面的题目……来,我们继续找题目。&br&3. 编程之美、剑指offer:就当成两本习题集好了,里面有些题目和1、2重复,但是大部分题目还是很优秀很巧妙的。&b&重点是交叉对比,你就知道哪些是经典题目了。&/b&&br&4. careercup、看准网等:每家公司都有自己喜欢出的题目,这些网站方便你去找面经,紧跟公司出题潮流。&br&5. “结构之法”博客:July大神的博客,内容丰富,学习一年都可以。这里只讲里面的算法题:“微软面试100题”(实际上已经快500题了)系列,堪称算法题的大宝库,包罗万象,而且很多题目很新,是面试官喜欢出的类型……不过这个系列的排版略微混乱,很多题也没有答案;“程序员编程艺术”系列,讲的很细致,适合深入去学习一些算法;“教你如何迅速秒杀掉:99%的海量数据处理面试题”,很实用的海量数据处理面试文章。&br&6. 经典库函数。这块单独拉出来,是因为考的很多,比如atoi,strstr,memcpy等等……在“程序员编程艺术”中,杂七杂八有相关的论述,最好自己系统整理一下。&br&------------------------------------------------------------------------------------------------------------------------------------------&br&&br&好,这些足够我们的题海了。下面来讲一下,哪些属于题海中的重点。&br&1. 最高优先级:面经。这个比什么都重要,为了节约招聘成本,同一家公司的题目,通常不会换的太勤快。&br&2. 次优先级:很经典的题目。什么定义为经典?前面我写了123456,假如某道题目能重复出现几次,那绝对是不朽经典(如atoi、LCS、LPS、单链表逆置……),经典的题目毕竟出的最多,一定要非常熟练。&br&3. 再次:稍微短一点(50行之内),稍微新一点的题目。&b&面试官通常时间有限,没时间让你写个上百行,所以50行左右是最好的。&/b&&br&4. 最末:答案很长的题目。这种题目一般不出,要是出出来,一般就是压轴大戏,为了最后检测……通常长题目容易乱,分模块慢慢写,不着急。&br&------------------------------------------------------------------------------------------------------------------------------------------&br&&br&光在IDE上敲是不够的,还要练习多在纸上写。&br&做多了,就会感觉这些题目都一样……无非dp、二分、排序、递归……无非开数组、调函数、用stl……然后题主就会悟出&b&算法题只是公司招聘没办法的选择,因为面fresh grad也没啥别的方法了,这个方法最简单粗暴高效。然而实际工作中,重要的还是项目能力。&/b&能悟出这个道理,题主就该修成正果了。
额~这个问题,我至少准备了半年。给题主点经验: 首先,强烈建议采用“题海战术”。我当然不会告诉题主,今年面了数十家公司,90%的题目是原题(没办法,就那几个知识点,能有什么新题) 题库在哪里呢?按照循序渐进的原则,一一介绍: 1. cc150,全名crack…
EM:&br&作用对象是MLE,方法是拆出latent variables。&br&&img src=&//www.zhihu.com/equation?tex=%5Csum+Q%28z%5Ei%29%5Clog%5Cfrac%7Bp%28x%5Ei%2Cz%5Ei%3B%5Ctheta%29%7D%7BQ%28z%5Ei%29%7D& alt=&\sum Q(z^i)\log\frac{p(x^i,z^i;\theta)}{Q(z^i)}& eeimg=&1&&&br&expectation是指隐变量后验分布的期望,maximization使似然函数的期望最大。&br&Ref: Ng的讲义(CS229 IX)&br&&br&VI:&br&最典型是用来在EM中E歩确定参数求latent variables后验分布。&br&基于p(x,z),对含变分参数的分布q,最小化KL散度即最大化ELBO。&br&平均场假设下,使用坐标上升法得到形式上似Gibbs的:&br&&img src=&//www.zhihu.com/equation?tex=q%5E%2A%28z_k%29%5Cpropto+%5Cexp+%5C%7BE_%7B-k%7D%5B%5Clog+p%28z_k%2CZ_%7B-k%7D%2Cx%29%5D+%5C%7D& alt=&q^*(z_k)\propto \exp \{E_{-k}[\log p(z_k,Z_{-k},x)] \}& eeimg=&1&&&br&迭代循环求解&br&Ref: Blei的讲义(Variational Inference)&br&&br&VB:&br&同样在平均场假设下,对每一个参数分布q,&br&&img src=&//www.zhihu.com/equation?tex=%5Clog+q_j%5E%2A%28z_j%7Cx%29+%3D+E_%7Bi%5Cne+j%7D%5Clog+p%28x%2Cz%29& alt=&\log q_j^*(z_j|x) = E_{i\ne j}\log p(x,z)& eeimg=&1&&&br&用带超参数的先验分布改写&img src=&//www.zhihu.com/equation?tex=p%28x%2Cz%29& alt=&p(x,z)& eeimg=&1&&,&br&得到相同形式的后验分布&br&迭代循环求解&br&Ref: &a href=&//link.zhihu.com/?target=http%3A//en.wikipedia.org/wiki/Variational_Bayesian_methods& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Variational Bayesian methods&/a&&br&&br&p.s.&br&&ul&&li&VB与VI分开写,并不表示VI与贝叶斯无关,KL divergence推导时用的就是贝叶斯公式&br&&/li&&li&因为许多问题是含latent variables,所以VB迭代过程与EM相似,也被叫做VBE歩,VBM歩对应EM中的E歩和M歩&/li&&li&EM可以看作VB的point-wise近似(可能有over-fitting问题)&/li&&li&Bayesian approach(包括MCMC)一般是估计分布,而不是做点估计&/li&&li&conjugate prior × likelihood -& posterior i.d.&/li&&li&期望和似然通过分布统一&/li&&/ul&Ref: PRML Chapter 10
EM: 作用对象是MLE,方法是拆出latent variables。 \sum Q(z^i)\log\frac{p(x^i,z^i;\theta)}{Q(z^i)} expectation是指隐变量后验分布的期望,maximization使似然函数的期望最大。 Ref: Ng的讲义(CS229 IX) VI: 最典型是用来在EM中E歩确定参数求latent vari…
&figure&&img src=&https://pic3.zhimg.com/v2-8a39d7958db7fcfa45bf1bc_b.jpg& data-rawwidth=&560& data-rawheight=&445& class=&origin_image zh-lightbox-thumb& width=&560& data-original=&https://pic3.zhimg.com/v2-8a39d7958db7fcfa45bf1bc_r.jpg&&&/figure&&p&Tensorflow 实现&/p&&p&&br&&/p&&p&A Tensorflow implementation of CapsNet(Capsules Net) in Hinton's paper Dynamic Routing Between Capsules&/p&&p&&br&&/p&&p&项目地址:&a href=&https://link.zhihu.com/?target=https%3A//github.com/naturomics/CapsNet-Tensorflow& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&naturomics/CapsNet-Tensorflow&/a&&/p&&p&&br&&/p&&p&Keras 实现&/p&&p&&br&&/p&&p&A Keras implementation of CapsNet in Hinton's paper Dynamic Routing Between Capsules. Now Val_acc&99.5%.&/p&&p&&br&&/p&&p&项目地址:&a href=&https://link.zhihu.com/?target=https%3A//github.com/XifengGuo/CapsNet-Keras& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&XifengGuo/CapsNet-Keras&/a&&/p&&p&&br&&/p&&p&PyTorch 实现&/p&&p&&br&&/p&&p&Pytorch implementation of Hinton's Dynamic Routing Between Capsules&/p&&p&&br&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//github.com/timomernick/pytorch-capsule& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&timomernick/pytorch-capsule&/a&&/p&&p&&br&&/p&&p&论文 Dynamic Routing Between Capsules&/p&&p&&br&&/p&&p&网址:&a href=&https://link.zhihu.com/?target=https%3A//arxiv.org/abs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&[] Dynamic Routing Between Capsules&/a&&/p&&p&&/p&
Tensorflow 实现 A Tensorflow implementation of CapsNet(Capsules Net) in Hinton's paper Dynamic Routing Between Capsules 项目地址: Keras 实现 A Keras implementation of CapsNet in Hinton's paper Dynamic Routing…
&p&不卸腰~&/p&&p&最近在自己的PC上安装office2016,遇到了一些坑,与大家分享下主要思路,其中就出现了题主所提到的这个问题。&/p&&p&&br&&/p&&p&第一次安装时直接给我装C盘了,我一时没注意,组件还默认全装了。然后,我到微软自家技术论坛上找了下,其官方回复简直让人无法扶期。。。&/p&&p&office2016安装时无法选择安装路径 - Microsoft Community &a href=&//link.zhihu.com/?target=https%3A//answers.microsoft.com/zh-hans/msoffice/forum/msoffice_install-mso_win10/office%25AE%%25A3%%%25E6%/e232778d-c3b0-4121-83bc-6d78f6aca25c%3Fauth%3D1& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&answers.microsoft.com/z&/span&&span class=&invisible&&h-hans/msoffice/forum/msoffice_install-mso_win10/office2016%E5%AE%89%E8%A3%85%E6%97%B6%E6%97%A0/e232778d-c3b0-4121-83bc-6d78f6aca25c?auth=1&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&br&&/p&&p&&b&1.如何在安装office 2016时自定义安装组件和安装路径&/b&&/p&&ul&&li&自定义安装组件&/li&&/ul&&p&方法1,使用特别版本的安装镜像文件 SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-42426.iso,请自行搜索和下载,比如 &a href=&//link.zhihu.com/?target=https%3A//pan.baidu.com/share/link%3Fshareid%3Duk%3D%26fid%3D715& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&pan.baidu.com/share/lin&/span&&span class=&invisible&&k?shareid=&uk=&fid=715&/span&&span class=&ellipsis&&&/span&&/a&,安装时即可选择组件和安装路径~当然如果你的windows系统是32bit的,请搜索&SW_DVD5_Office_Professional_Plus_2016_32&...&/p&&figure&&img src=&https://pic4.zhimg.com/v2-84d3cda7e208c2da20179e3_b.png& data-rawwidth=&622& data-rawheight=&544& class=&origin_image zh-lightbox-thumb& width=&622& data-original=&https://pic4.zhimg.com/v2-84d3cda7e208c2da20179e3_r.png&&&/figure&&p&&br&&/p&&p&方法2,使用Office 2016 C2R Install(Office2016组件自定义安装工具)自主选择安装组件&/p&&p&传送门 → &a href=&//link.zhihu.com/?target=http%3A//www.xiazaiba.com/html/30503.html& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&xiazaiba.com/html/30503&/span&&span class=&invisible&&.html&/span&&span class=&ellipsis&&&/span&&/a&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-5ce960fc857b04d222b45cba_b.png& data-rawwidth=&431& data-rawheight=&474& class=&origin_image zh-lightbox-thumb& width=&431& data-original=&https://pic3.zhimg.com/v2-5ce960fc857b04d222b45cba_r.png&&&/figure&&p&之后选择先下载后离线安装或直接根据需要在线安装皆可~&/p&&p&&br&&/p&&p&当然也可使用officedeploymenttool,然后修改配置文件configuration.xml,把不需安装的组件放进ExcludeApp标签中,比如:&/p&&div class=&highlight&&&pre&&code class=&language-xml&&  &span class=&nt&&&ExcludeApp&/span& &span class=&na&&ID=&/span&&span class=&s&&&Access&&/span& &span class=&nt&&/&&/span&
  &span class=&nt&&&ExcludeApp&/span& &span class=&na&&ID=&/span&&span class=&s&&&Groove&&/span& &span class=&nt&&/&&/span&
  &span class=&nt&&&ExcludeApp&/span& &span class=&na&&ID=&/span&&span class=&s&&&InfoPath&&/span& &span class=&nt&&/&&/span&
  &span class=&nt&&&ExcludeApp&/span& &span class=&na&&ID=&/span&&span class=&s&&&Lync&&/span& &span class=&nt&&/&&/span&
  &span class=&nt&&&ExcludeApp&/span& &span class=&na&&ID=&/span&&span class=&s&&&Publisher&&/span& &span class=&nt&&/&&/span&
  &span class=&nt&&&ExcludeApp&/span& &span class=&na&&ID=&/span&&span class=&s&&&SharePointDesigner&&/span& &span class=&nt&&/&&/span&
&/code&&/pre&&/div&&p&&br&&/p&&ul&&li&自定义安装路径&/li&&/ul&&p&主要也有两种方法。&/p&&p&方法1,使用特别版本的安装镜像文件 SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-42426.iso,安装时即可选择组件和安装路径~如果你是并不愿意配置注册表的懒人抑或是不会倒腾注册表的小白,这个方法对你十分适用~&/p&&p&方法2,倒腾注册表,这个看上去更像是一个野路子,具体方法网上到处都是,贴一个:&br&&a href=&//link.zhihu.com/?target=https%3A//www.gezila.com/tutorials/55179.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Office 2016修改选择安装路径的图文步骤&/a&&/p&&p&&br&&/p&&p&综上,要同时保证安装office 2016时能自定义安装组件和安装路径,你可以使用office2016特别的安装镜像SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-42426.iso。当然也可去倒腾注册表。&/p&&p&&br&&/p&&p&&b&2.Office无法登录账号怎么解决?&/b&&/p&&p&OneNote登录后就能同步云笔记了,可是填入邮箱后,出现页面~&/p&&figure&&img src=&https://pic4.zhimg.com/v2-f43a7b85f9f_b.png& data-rawwidth=&541& data-rawheight=&186& class=&origin_image zh-lightbox-thumb& width=&541& data-original=&https://pic4.zhimg.com/v2-f43a7b85f9f_r.png&&&/figure&&p&接着就跳转到了空白页~&/p&&figure&&img src=&https://pic4.zhimg.com/v2-0d880a9c2bf7a9797f74bcfd105b539f_b.png& data-rawwidth=&463& data-rawheight=&567& class=&origin_image zh-lightbox-thumb& width=&463& data-original=&https://pic4.zhimg.com/v2-0d880a9c2bf7a9797f74bcfd105b539f_r.png&&&/figure&&p&此时,如果是win7,会有个选项提醒导入证书,尝试了一番,无效~&/p&&p&有人说,重置IE浏览器的高级设置或去修改 安全-&自定义级别 中的配置:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-3ff8ab0da8820cac4450bc_b.png& data-rawwidth=&603& data-rawheight=&706& class=&origin_image zh-lightbox-thumb& width=&603& data-original=&https://pic1.zhimg.com/v2-3ff8ab0da8820cac4450bc_r.png&&&/figure&&p&试过了,不行~&/p&&p&&br&&/p&&p&如果你用的是win7,恰好遇到这个问题,那你可以将win7升级到win7 sp1,并将IE升级到IE11,再试试,应该是可以了的~&/p&&p&&br&&/p&&p&&b&别只顾收藏&/b&呀&b&,记得点赞、感谢或关注&/b&本人喔~&/p&
不卸腰~最近在自己的PC上安装office2016,遇到了一些坑,与大家分享下主要思路,其中就出现了题主所提到的这个问题。 第一次安装时直接给我装C盘了,我一时没注意,组件还默认全装了。然后,我到微软自家技术论坛上找了下,其官方回复简直让人无法扶期。。…
&figure&&img src=&https://pic3.zhimg.com/v2-7bcf4642faab35ac7a07dc_b.jpg& data-rawwidth=&2000& data-rawheight=&1250& class=&origin_image zh-lightbox-thumb& width=&2000& data-original=&https://pic3.zhimg.com/v2-7bcf4642faab35ac7a07dc_r.jpg&&&/figure&&p&&/p&&blockquote&近日,帝国理工学院、蒙特利尔大学等研究机构共同发表论文并梳理了生成对抗网络,该论文从最基本的 GAN 架构及其变体到训练过程和训练技巧全面概述了生成对抗网络的概念、问题和解决方案。机器之心简要介绍了该论文。&/blockquote&&p&原 GAN(Goodfellow et al., 2014)的完整理论推导与 TensorFlow 实现请查看机器之心的 GitHub 项目与文章:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&GAN 完整理论推导与实现&/a&。下面,我们将为各位读者介绍该综述论文。&/p&&p&&br&&/p&&p&论文地址:&a href=&http://link.zhihu.com/?target=https%3A//arxiv.org/pdf/.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&arxiv.org/pdf/&/span&&span class=&invisible&&5.pdf&/span&&span class=&ellipsis&&&/span&&/a&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-22bf2e977ee26458acfd9df_b.jpg& data-caption=&& data-rawwidth=&640& data-rawheight=&183& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/v2-22bf2e977ee26458acfd9df_r.jpg&&&/figure&&p&生成对抗网络(GAN)提供了一种不需要大量标注训练数据就能学习深度表征的方式。它们通过反向传播算法分别更新两个网络以执行竞争性学习而达到训练目的。GAN 学习的表征可用于多种应用,包括图像合成、语义图像编辑、风格迁移、图像超分辨率技术和分类。这篇论文的目的是为信号处理社区做一个 GAN 的综述。除了介绍训练和构建 GAN 的不同方法以外,我们还讨论了其理论和应用中尚存在的挑战。&/p&&p&&br&&/p&&p&&b&1. 引言&/b&&/p&&p&生成器和判别器通常由包含卷积和(或)全连接层的多层网络构成。生成器和判别器必须是可微的,但并不必要是直接可逆的(理论分析上必须可逆)。如果生成网络由某些表征空间映射得到,即映射一个隐空间到数据空间中(我们需要把注意力集中在图像上),用更加形式化的表示为:G : G(z) → R^|x|,其中 z ∈ R^|z|是隐空间中的一个样本,x ∈ R^|x|是一张图像,| · |表示维数。&/p&&p&原始 GAN 的判别网络 D 可以看成是将图像数据映射到(该图像是来自真实数据分布,而不是生成器分布)判别概率的函数 D : D(x) → (0, 1)。对于一个固定的生成器 G,判别器 D 可能被训练用于分辨图像是来自训练数据(真,概率接近 1)还是来自生成器(假,概率接近 0)。若判别器已经是最好的,它将变得无法被欺骗,而这时生成器 G 需要继续训练以降低判别器的准确率。如果生成器分布足以完美匹配真实数据分布,那么判别器将会被最大地迷惑而对所有输入给出 0.5 的概率值。在实践中,判别器可能无法训练到理想状态,我们将在第 4 节更深入地探索训练过程。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-2b234a0db1fb0fd35737baf_b.jpg& data-caption=&& data-rawwidth=&640& data-rawheight=&332& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/v2-2b234a0db1fb0fd35737baf_r.jpg&&&/figure&&p&&i&图 1. 这张图分别展示了 GAN 中的判别器 D 和生成器 G 的训练流程。通常利用神经网络实现,但实际上它们可以用任意形式的(将数据从一个空间映射到另一个的)可微系统实现。&/i&&/p&&p&&br&&/p&&p&&b&3.GAN 架构&/b&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-40cdb38a87e9b9c97864_b.jpg& data-caption=&& data-rawwidth=&640& data-rawheight=&298& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/v2-40cdb38a87e9b9c97864_r.jpg&&&/figure&&p&&i&图 2. 在 GAN 的训练过程中,生成器可以生成一个样本分布 p_g(x)以匹配真实数据 p_data(x)。通过适当参数化并训练 GAN,这些分布将变得难以区分。GAN 的表征分布可以通过生成网络和判别网络的学习参数(权重)而构建。&/i&&/p&&p&&br&&/p&&p&&b&A. 全连接 GAN&/b&&/p&&p&首个 GAN 架构在生成器与鉴别器上皆使用全连接神经网络。这种架构类型被应用于相对简单的图像数据库,即 MNIST(手写数字)、CIFAR-10(自然图像)和多伦多人脸数据集(TFD)。&/p&&p&&br&&/p&&p&&b&B. 卷积 GAN&/b&&/p&&p&因为 CNN 非常适合处理图像数据,所以从全连接到卷积神经网络是一个自然的扩展。早期在 CIFAR-10 上进行的试验表明,用监督学习相同水平和表征能力的 CNN 训练生成器和鉴别器网络会更加困难。&/p&&p&通过使用多尺度分解生成过程的形式,拉普拉斯金字塔形对抗网络(LAPGAN)[13] 为这一问题贡献了一个方案:真值图像本身被分解成拉普拉斯金字塔(Laplacian pyramid),并且条件性卷积 GAN 被训练在给定上一层的情况下生成每一层。&/p&&p&此外,Radford et al.[5](为「深度卷积 GAN」)提出了一种称之为 DCGAN 的网络架构族,它允许训练一对深度卷积生成器和判别器网络。DCGAN 在训练中使用带步长的卷积(strided convolution)和小步长卷积(fractionally-strided convolution),并在训练中学习空间下采样和上采样算子。这些算子处理采样率和位置的变化,这是图像空间到低维潜在空间、从图像空间到判别器映射的重要要求。Section IV-B 将详细介绍 DCGAN 架构和训练。&/p&&p&作为 2D 图像合成的扩展,Wu et al. [14] 展示了使用体积卷积(volumetric convolution)合成 3D 数据样本的 GAN。Wu et al. [14] 合成包括新物体,如椅子、桌子和汽车;此外,他们还展示了一种从 2D 图像映射到 3D 图像的方法。&/p&&p&&br&&/p&&p&&b&C. 条件 GAN&/b&&/p&&p&Mirza 等人通过将生成器和判别器改造成条件类(class-conditional)而将(2D)GAN 框架扩展成条件设置。条件 GNN 的优势在于可以对多形式的数据生成提供更好的表征。条件 GAN 和 InfoGAN[16] 是平行的,它可以将噪声源分解为不可压缩源和一个「隐编码」(latent code),并可以通过最大化隐编码和生成器之间的交互信息而发现变化的隐藏因子。这个隐编码可用于在完全无监督的数据中发现目标类,即使这个隐编码是不明确的。由 InfoGAN 学到的表征看起来像是具备语义特征的,可以处理图貌中的复杂纠缠因素(包括姿势变化、光照和面部图像的情绪内容)。&/p&&p&&br&&/p&&p&&b&D.GAN 推断模型&/b&&/p&&p&GAN 的初始形式无法将给定的输入 x 映射为隐空间中的向量(在 GAN 的文献中,这通常被称为一种推断机制)。人们提出了几种反转预训练 GAN 的生成器的技术,比如各自独立提出的对抗性学习推断(Adversarially Learned Inference,ALI)和双向 GAN(Bidirectional GANs),它们能提供简单而有效的扩展,通过加入一个推断网络,使判别器共同测试数据空间和隐空间。&/p&&p&这种形式下的生成器由两个网络组成:即编码器(推断网络)和解码器。它们同时被训练用于欺骗判别器。而判别器将接收到一个向量对(x,z)(见图 4 所示),并决定其是否包含一个真实图像以及其编码,或者一个生成的图像样本以及相关的生成器的隐空间输入。&/p&&p&理想情况下,在一个编码-解码模型中的输出(作为输入的重构)应该和输入相似。通常情况下,使用 ALI/BiGAN 合成的重构数据样本的保真度都很低。通过额外添加(数据样本和它们的重构的)对抗代价函数可以提高样本的保真度。&/p&&p&&br&&/p&&p&&b&E. 对抗自编码器(AAE)&/b&&/p&&p&自编码器是由编码器和解码器组成的网络,学习将数据映射到内部隐表征中,再映射出来,即从数据空间中学习将图像(或其它)通过编码映射到隐空间中,再通过解码从隐空间映射回数据空间。这两个映射形成了一种重构运算,而这两个映射将被训练直到重构图像尽可能的接近初始图像。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-b4e0eda5da452ccabecedf75_b.jpg& data-caption=&& data-rawwidth=&640& data-rawheight=&187& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/v2-b4e0eda5da452ccabecedf75_r.jpg&&&/figure&&p&&i&图 3. 图左,条件 GAN(Conditional GAN),由 Mirza 等人提出,可以根据条件(class-condition)合成图像;判别器根据条件类判定图像为真或假。图右,InfoGAN,其判别器还可以估计类别标签。&/i&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d00bebbf64ebb7ce0c791d9f2b9a23a3_b.jpg& data-caption=&& data-rawwidth=&640& data-rawheight=&366& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic4.zhimg.com/v2-d00bebbf64ebb7ce0c791d9f2b9a23a3_r.jpg&&&/figure&&p&&i&图 4. ALI/BiGAN 的结构,由三个网络构成。其中一个是判别器,还有一个网络将噪声向量从隐空间映射到图像空间(解码器,以 G 表示),最后一个网络(编码器,以 E 表示)将真实图像从图像空间映射到隐空间。&/i&&/p&&p&&br&&/p&&p&&b&4. 训练 GAN&/b&&/p&&p&&br&&/p&&p&&b&A. 引言&/b&&/p&&p&GAN 的训练目标是获得令判别器分类准确率最大化的参数,以及获得最大化欺骗判别器的生成器参数。训练过程已在图 5 中总结。&/p&&p&训练的代价由一个价值函数 V(G,D) 评估,其包含了生成器和判别器的参数。&/p&&p&训练过程可表示如下:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f00a36fde3a8cc6ff07fc_b.jpg& data-caption=&& data-rawwidth=&640& data-rawheight=&173& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/v2-f00a36fde3a8cc6ff07fc_r.jpg&&&/figure&&p&训练过程中,其中一个模型的参数被更新,同时另一个模型的参数固定不变。Goodfellow 等人证明对于一个固定的生成器存在唯一的最优判别器 D* (x) = p_data(x) /(p_data(x)+p_g(x))。他们还证明了生成器 G 在 pg(x) = pdata(x) 的时候是最优的,这等价于最优判别器对所有的样本 x 都给出 0.5 的概率值。换个说法就是当判别器 D 被最大化迷惑而无法区分真假样本的时候,生成器 G 是最优的。&/p&&p&理想情况下,判别器将被训练到对当前生成器为最优;然后生成器再次被更新。然而实际情况下,判别器可能无法训练到最优,因此常用的策略是,判别器只会经过少量的迭代训练,而且生成器和判别器同步更新。此外,生成器通常使用一种交替的、非饱和的训练规范,即使用 max_G log D(G(z)),而不使用 min_G log(1 - D(G(z)))。&/p&&p&尽管理论上存在唯一的解,GAN 的训练还是存在着挑战,经常出现不稳定的状况,原因有好几个。一种提升 GAN 训练效率的办法是追踪训练过程中可能遇到的经验症状,这包括:&/p&&p&&br&&/p&&ul&&li&两个模型(生成器、判别器)无法收敛 [5];&/li&&li&生成器「崩溃」,即用不同的输入生成相似的样本 [25];&/li&&li&判别器的损失很快收敛为零,从而没有足够强的梯度路径可以继续更新生成器。&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/v2-c5f4130fbdefb31709c5_b.jpg& data-caption=&& data-rawwidth=&640& data-rawheight=&337& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/v2-c5f4130fbdefb31709c5_r.jpg&&&/figure&&p&&i&图 5. GAN 训练的主要循环。新型数据样本 x' 可以通过传递随机样本得出,z 为抽取的随机噪声并作为生成器网络的输入。生成器更新一次之前,判别器可能需要更新 k 次。&/i&&/p&&p&&br&&/p&&p&&b&B. 训练技巧&/b&&/p&&p&用于图像生成的 GAN 训练的第一个重大改进是 Radford et al. [5] 提出的 DCGAN 架构。该研究是计算机视觉领域之前使用的 CNN 架构的进一步探索,并且带来了一系列构建和训练生成器、判别器的准则。在 Section III-B 中,我们提到带步长的卷积和小步长卷积的重要性 [27],它们是架构设计的重要组件。这允许生成器和判别器学习优秀的上采样和下采样操作,这些操作可能提升图像合成的质量。具体到训练中,研究者推荐在两种网络中使用批量归一化 [28],以稳定深层模型中的训练。另一个建议是最小化用于提升深层模型训练可行性的全连接层的数量。最后,Radford et al. [5] 认为在判别器中间层使用 leaky ReLU 激活函数的性能优于使用常规的 ReLU 函数。&/p&&p&Salimans et al. [25] 进一步提出稳定 GAN 训练的启发式方法。首先,特征匹配稍稍改变生成器的目标,以增加可获取的信息量。具体来说,判别器仍然需要训练来区分真样本和假样本,但是生成器的训练目标是匹配判别器中假样本和真样本的期望中间激活值(特征)。第二,小批量判别(mini-batch discrimination)向判别器额外添加输入,该特征对小批量中的给定样本和其他样本的距离进行编码。目的在于防止模式崩溃(mode collapse),因为判别器能够轻易判断生成器是否生成同样的输出。&/p&&p&第三个启发式技巧是启发式平均(heuristic averaging),如果网络参数偏离之前值的运行平均值,则会受到惩罚,这有助于收敛到平衡态。第四个技巧是虚拟批量归一化(virtual batch normalization),它可减少小批量内样本对其他样本的依赖性,方法是使用训练开始就确定的固定参考小批量(reference mini-batch)样本计算归一化的批量统计(batch statistics)。&/p&&p&最后,单边标签平滑(one-sided label smoothing)将判别器的目标从 1 替换为 0.9,使判别器的分类边界变得平滑,从而阻止判别器过于自信,为生成器提供较差的梯度。S?nderby et al. [29] 改进了这个想法,他在将样本馈送至判别器之前向样本中添加噪声来挑战判别器。S?nderby et al. [29] 认为单边标签平滑偏向最佳判别器,而他们的技术——样本噪声(instance noise)使真样本和假样本的流形(manifold)更加接近,同时防止判别器轻易找到完全分离真假样本的判别器边界。该技巧在实践中可以通过向合成图像和真实图像中添加高斯噪声来实现,使标准差随着时间逐渐减小。后来 Arjovsky et al. [26] 把向数据样本添加噪声来稳定训练的过程形式化。&/p&&p&&br&&/p&&p&&b&C. 成本函数的修正&/b&&/p&&p&1)GAN 成本函数的泛化:Nowozin et al. [30] 认为 GAN 训练可以泛化至不仅最小化 JS 散度(Jensen-Shannon divergence),同时还最小化 f 散度的估计值。这些可以称为 f-GAN。&/p&&p&2)防止梯度消失的其他成本函数:Arjovsky et al. [32] 提出 WGAN,一种带有其他成本函数的 GAN 网络,该函数从近似 Wasserstein 距离中推导出。&/p&&p&&br&&/p&&p&&b&7. 讨论&/b&&/p&&p&&br&&/p&&p&&b&A. 开放性问题&/b&&/p&&p&1)Mode Collapse:如第四章所述,GAN 的普遍问题是生成器崩溃(generator collapsing),只能输出一小类类似样本(部分崩溃),最坏的情况是仅能生成一个简单样本(完全崩溃)[26], [48]。&/p&&p&2)训练不稳定——鞍点:在 GAN 中,损失函数的海森矩阵(Hessian)变得非正定。因此,二阶矩阵非正定只能找到一个鞍点而不是局部极小值。&/p&&p&&br&&/p&&p&&b&B. 结论&/b&&/p&&p&对 GAN 的研究兴趣不只是因为它们可以从潜在空间和数据空间之间的映射和逆映射中学习深度、高度非线性的映射,还因为它们可以利用大量非标注图像数据,这种操作类似深度表征学习。在 GAN 训练中,存在很多理论和算法的发展机会。有了深度网络的帮助,新应用存在大量机会。&/p&&p&&br&&/p&&p&选自arXiv&/p&&p&&b&机器之心编译&/b&&/p&&p&&b&参与:路雪、刘晓坤、蒋思源&/b&&/p&&p&&br&&/p&&p&&b&本文为机器之心编译,转载请联系本公众号获得授权。&/b&&/p&&p&&/p&
近日,帝国理工学院、蒙特利尔大学等研究机构共同发表论文并梳理了生成对抗网络,该论文从最基本的 GAN 架构及其变体到训练过程和训练技巧全面概述了生成对抗网络的概念、问题和解决方案。机器之心简要介绍了该论文。原 GAN(Goodfellow et al., 2014)的完…
&figure&&img src=&https://pic4.zhimg.com/v2-dcec08f1dfbbca_b.jpg& data-rawwidth=&516& data-rawheight=&281& class=&origin_image zh-lightbox-thumb& width=&516& data-original=&https://pic4.zhimg.com/v2-dcec08f1dfbbca_r.jpg&&&/figure&&blockquote&我的CSDN博客地址:&a href=&https://link.zhihu.com/?target=http%3A//blog.csdn.net/red_stone1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&红色石头的专栏&/a& &br&我的知乎主页:&a href=&https://www.zhihu.com/people/red_stone_wl& class=&internal&&红色石头&/a& &br&我的微博:&a href=&https://link.zhihu.com/?target=https%3A//weibo.com//profile%3Ftopnav%3D1%26wvr%3D6%26is_all%3D1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RedstoneWill的微博&/a& &br&我的GitHub:&a href=&https://link.zhihu.com/?target=https%3A//github.com/RedstoneWill& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RedstoneWill的GitHub&/a& &br&我的微信公众号:红色石头的机器学习之路(ID:redstonewill) &br&欢迎大家关注我!共同学习,共同进步!&/blockquote&&p&&br&&/p&&p&Andrew Ng的深度学习专项课程的第一门课《Neural Networks and Deep Learning》的5份笔记我已经整理完毕。迷路的小伙伴请见如下链接:&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Coursera吴恩达《神经网络与深度学习》课程笔记(1)-- 深度学习概述&/a&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Coursera吴恩达《神经网络与深度学习》课程笔记(2)-- 神经网络基础之逻辑回归&/a&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Coursera吴恩达《神经网络与深度学习》课程笔记(3)-- 神经网络基础之Python与向量化&/a&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Coursera吴恩达《神经网络与深度学习》课程笔记(4)-- 浅层神经网络&/a&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Coursera吴恩达《神经网络与深度学习》课程笔记(5)-- 深层神经网络&/a&&/p&&p&&br&&/p&&p&在接下来的几次笔记中,我们将对第二门课《Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization》进行笔记总结和整理。我们在第一门课中已经学习了如何建立一个神经网络,或者浅层的,或者深度的。而这第二门课,我们将着重讨论和研究如何优化神经网络模型,例如调整超参数,提高算法运行速度等等。开始吧~&/p&&p&&br&&/p&&h2&&b&1. Train/Dev/Test sets&/b&&/h2&&p&选择最佳的训练集(Training sets)、验证集(Development sets)、测试集(Test sets)对神经网络的性能影响非常重要。除此之外,在构建一个神经网络的时候,我们需要设置许多参数,例如神经网络的层数、每个隐藏层包含的神经元个数、学习因子(学习速率)、激活函数的选择等等。实际上很难在第一次设置的时候就选择到这些最佳的参数,而是需要通过不断地迭代更新来获得。这个循环迭代的过程是这样的:我们先有个想法Idea,先选择初始的参数值,构建神经网络模型结构;然后通过代码Code的形式,实现这个神经网络;最后,通过实验Experiment验证这些参数对应的神经网络的表现性能。根据验证结果,我们对参数进行适当的调整优化,再进行下一次的Idea-&Code-&Experiment循环。通过很多次的循环,不断调整参数,选定最佳的参数值,从而让神经网络性能最优化。&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-02996acc8a7185def91b1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1147& data-rawheight=&474& class=&origin_image zh-lightbox-thumb& width=&1147& data-original=&https://pic1.zhimg.com/v2-02996acc8a7185def91b1_r.jpg&&&/figure&&p&&br&&/p&&p&深度学习已经应用于许多领域中,比如NLP,CV,Speech Recognition等等。通常来说,最适合某个领域的深度学习网络往往不能直接应用在其它问题上。解决不同问题的最佳选择是根据样本数量、输入特征数量和电脑配置信息(GPU或者CPU)等,来选择最合适的模型。即使是最有经验的深度学习专家也很难第一次就找到最合适的参数。因此,应用深度学习是一个反复迭代的过程,需要通过反复多次的循环训练得到最优化参数。决定整个训练过程快慢的关键在于单次循环所花费的时间,单次循环越快,训练过程越快。而设置合适的Train/Dev/Test sets数量,能有效提高训练效率。&/p&&p&一般地,我们将所有的样本数据分成三个部分:Train/Dev/Test sets。Train sets用来训练你的算法模型;Dev sets用来验证不同算法的表现情况,从中选择最好的算法模型;Test sets用来测试最好算法的实际表现,作为该算法的无偏估计。&/p&&p&之前人们通常设置Train sets和Test sets的数量比例为70%和30%。如果有Dev sets,则设置比例为60%、20%、20%,分别对应Train/Dev/Test sets。这种比例分配在样本数量不是很大的情况下,例如100,,是比较科学的。但是如果数据量很大的时候,例如100万,这种比例分配就不太合适了。科学的做法是要将Dev sets和Test sets的比例设置得很低。因为Dev sets的目标是用来比较验证不同算法的优劣,从而选择更好的算法模型就行了。因此,通常不需要所有样本的20%这么多的数据来进行验证。对于100万的样本,往往只需要10000个样本来做验证就够了。Test sets也是一样,目标是测试已选算法的实际表现,无偏估计。对于100万的样本,往往也只需要10000个样本就够了。因此,对于大数据样本,Train/Dev/Test sets的比例通常可以设置为98%/1%/1%,或者99%/0.5%/0.5%。样本数据量越大,相应的Dev/Test sets的比例可以设置的越低一些。&/p&&p&现代深度学习还有个重要的问题就是训练样本和测试样本分布上不匹配,意思是训练样本和测试样本来自于不同的分布。举个例子,假设你开发一个手机app,可以让用户上传图片,然后app识别出猫的图片。在app识别算法中,你的训练样本可能来自网络下载,而你的验证和测试样本可能来自不同用户的上传。从网络下载的图片一般像素较高而且比较正规,而用户上传的图片往往像素不稳定,且图片质量不一。因此,训练样本和验证/测试样本可能来自不同的分布。解决这一问题的比较科学的办法是尽量保证Dev sets和Test sets来自于同一分布。值得一提的是,训练样本非常重要,通常我们可以将现有的训练样本做一些处理,例如图片的翻转、假如随机噪声等,来扩大训练样本的数量,从而让该模型更加强大。即使Train sets和Dev/Test sets不来自同一分布,使用这些技巧也能提高模型性能。&/p&&p&最后提一点的是如果没有Test sets也是没有问题的。Test sets的目标主要是进行无偏估计。我们可以通过Train sets训练不同的算法模型,然后分别在Dev sets上进行验证,根据结果选择最好的算法模型。这样也是可以的,不需要再进行无偏估计了。如果只有Train sets和Dev sets,通常也有人把这里的Dev sets称为Test sets,我们要注意加以区别。&/p&&p&&br&&/p&&h2&&b&2. Bias/Variance&/b&&/h2&&p&偏差(Bias)和方差(Variance)是机器学习领域非常重要的两个概念和需要解决的问题。在传统的机器学习算法中,Bias和Variance是对立的,分别对应着欠拟合和过拟合,我们常常需要在Bias和Variance之间进行权衡。而在深度学习中,我们可以同时减小Bias和Variance,构建最佳神经网络模型。&/p&&p&如下图所示,显示了二维平面上,high bias,just right,high variance的例子。可见,high bias对应着欠拟合,而high variance对应着过拟合。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-8dac9ae57e22a12dd37c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1383& data-rawheight=&439& class=&origin_image zh-lightbox-thumb& width=&1383& data-original=&https://pic4.zhimg.com/v2-8dac9ae57e22a12dd37c_r.jpg&&&/figure&&p&&br&&/p&&p&上图这个例子中输入特征是二维的,high bias和high variance可以直接从图中分类线看出来。而对于输入特征是高维的情况,如何来判断是否出现了high bias或者high variance呢?&/p&&p&例如猫识别问题,输入是一幅图像,其特征维度很大。这种情况下,我们可以通过两个数值Train set error和Dev set error来理解bias和variance。假设Train set error为1%,而Dev set error为11%,即该算法模型对训练样本的识别很好,但是对验证集的识别却不太好。这说明了该模型对训练样本可能存在过拟合,模型泛化能力不强,导致验证集识别率低。这恰恰是high variance的表现。假设Train set error为15%,而Dev set error为16%,虽然二者error接近,即该算法模型对训练样本和验证集的识别都不是太好。这说明了该模型对训练样本存在欠拟合。这恰恰是high bias的表现。假设Train set error为15%,而Dev set error为30%,说明了该模型既存在high bias也存在high variance(深度学习中最坏的情况)。再假设Train set error为0.5%,而Dev set error为1%,即low bias和low variance,是最好的情况。值得一提的是,以上的这些假设都是建立在base error是0的基础上,即人类都能正确识别所有猫类图片。base error不同,相应的Train set error和Dev set error会有所变化,但没有相对变化。&/p&&p&一般来说,Train set error体现了是否出现bias,Dev set error体现了是否出现variance(正确地说,应该是Dev set error与Train set error的相对差值)。&/p&&p&我们已经通过二维平面展示了high bias或者high variance的模型,下图展示了high bias and high variance的模型:&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-988d29efc242a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&443& data-rawheight=&443& class=&origin_image zh-lightbox-thumb& width=&443& data-original=&https://pic3.zhimg.com/v2-988d29efc242a_r.jpg&&&/figure&&p&&br&&/p&&p&模型既存在high bias也存在high variance,可以理解成某段区域是欠拟合的,某段区域是过拟合的。&/p&&p&&br&&/p&&h2&&b&3. Basic Recipe for Machine Learning&/b&&/h2&&p&机器学习中基本的一个诀窍就是避免出现high bias和high variance。首先,减少high bias的方法通常是增加神经网络的隐藏层个数、神经元个数,训练时间延长,选择其它更复杂的NN模型等。在base error不高的情况下,一般都能通过这些方式有效降低和避免high bias,至少在训练集上表现良好。其次,减少high variance的方法通常是增加训练样本数据,进行正则化Regularization,选择其他更复杂的NN模型等。&/p&&p&这里有几点需要注意的。第一,解决high bias和high variance的方法是不同的。实际应用中通过Train set error和Dev set error判断是否出现了high bias或者high variance,然后再选择针对性的方法解决问题。&/p&&p&第二,Bias和Variance的折中tradeoff。传统机器学习算法中,Bias和Variance通常是对立的,减小Bias会增加Variance,减小Variance会增加Bias。而在现在的深度学习中,通过使用更复杂的神经网络和海量的训练样本,一般能够同时有效减小Bias和Variance。这也是深度学习之所以如此强大的原因之一。&/p&&p&&br&&/p&&h2&&b&4. Regularization&/b&&/h2&&p&如果出现了过拟合,即high variance,则需要采用正则化regularization来解决。虽然扩大训练样本数量也是减小high variance的一种方法,但是通常获得更多训练样本的成本太高,比较困难。所以,更可行有效的办法就是使用regularization。&/p&&p&我们先来回顾一下之前介绍的Logistic regression。采用L2 regularization,其表达式为:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=J%28w%2Cb%29%3D%5Cfrac1m%5Csum_%7Bi%3D1%7D%5EmL%28%5Chat+y%5E%7B%28i%29%7D%2Cy%5E%7B%28i%29%7D%29%2B%5Cfrac%7B%5Clambda%7D%7B2m%7D%7C%7Cw%7C%7C_2%5E2& alt=&J(w,b)=\frac1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})+\frac{\lambda}{2m}||w||_2^2& eeimg=&1&&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%7C%7Cw%7C%7C_2%5E2%3D%5Csum_%7Bj%3D1%7D%5E%7Bn_x%7Dw_j%5E2%3Dw%5ETw& alt=&||w||_2^2=\sum_{j=1}^{n_x}w_j^2=w^Tw& eeimg=&1&&&/p&&p&&br&&/p&&p&这里有个问题:为什么只对w进行正则化而不对b进行正则化呢?其实也可以对b进行正则化。但是一般w的维度很大,而b只是一个常数。相比较来说,参数很大程度上由w决定,改变b值对整体模型影响较小。所以,一般为了简便,就忽略对b的正则化了。&/p&&p&除了L2 regularization之外,还有另外一只正则化方法:L1 regularization。其表达式为:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=J%28w%2Cb%29%3D%5Cfrac1m%5Csum_%7Bi%3D1%7D%5EmL%28%5Chat+y%5E%7B%28i%29%7D%2Cy%5E%7B%28i%29%7D%29%2B%5Cfrac%7B%5Clambda%7D%7B2m%7D%7C%7Cw%7C%7C_1& alt=&J(w,b)=\frac1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})+\frac{\lambda}{2m}||w||_1& eeimg=&1&&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%7C%7Cw%7C%7C_1%3D%5Csum_%7Bj%3D1%7D%5E%7Bn_x%7D%7Cw_j%7C& alt=&||w||_1=\sum_{j=1}^{n_x}|w_j|& eeimg=&1&&&/p&&p&&br&&/p&&p&与L2 regularization相比,L1 regularization得到的w更加稀疏,即很多w为零值。其优点是节约存储空间,因为大部分w为0。然而,实际上L1 regularization在解决high variance方面比L2 regularization并不更具优势。而且,L1的在微分求导方面比较复杂。所以,一般L2 regularization更加常用。&/p&&p&L1、L2 regularization中的 &img src=&https://www.zhihu.com/equation?tex=%5Clambda& alt=&\lambda& eeimg=&1&& 就是正则化参数(超参数的一种)。可以设置 &img src=&https://www.zhihu.com/equation?tex=%5Clambda& alt=&\lambda& eeimg=&1&& 为不同的值,在Dev set中进行验证,选择最佳的 &img src=&https://www.zhihu.com/equation?tex=%5Clambda& alt=&\lambda& eeimg=&1&& 。顺便提一下,在python中,由于lambda是保留字,所以为了避免冲突,我们使用lambd来表示 &img src=&https://www.zhihu.com/equation?tex=%5Clambda& alt=&\lambda& eeimg=&1&& 。&/p&&p&在深度学习模型中,L2 regularization的表达式为:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=J%28w%5E%7B%5B1%5D%7D%2Cb%5E%7B%5B1%5D%7D%2C%5Ccdots%2Cw%5E%7B%5BL%5D%7D%2Cb%5E%7B%5BL%5D%7D%29%3D%5Cfrac1m%5Csum_%7Bi%3D1%7D%5EmL%28%5Chat+y%5E%7B%28i%29%7D%2Cy%5E%7B%28i%29%7D%29%2B%5Cfrac%7B%5Clambda%7D%7B2m%7D%5Csum_%7Bl%3D1%7D%5EL%7C%7Cw%5E%7B%5Bl%5D%7D%7C%7C%5E2& alt=&J(w^{[1]},b^{[1]},\cdots,w^{[L]},b^{[L]})=\frac1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})+\frac{\lambda}{2m}\sum_{l=1}^L||w^{[l]}||^2& eeimg=&1&&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%7C%7Cw%5E%7B%5Bl%5D%7D%7C%7C%5E2%3D%5Csum_%7Bi%3D1%7D%5E%7Bn%5E%7B%5Bl%5D%7D%7D%5Csum_%7Bj%3D1%7D%5E%7Bn%5E%7B%5Bl-1%5D%7D%7D%28w_%7Bij%7D%5E%7B%5Bl%5D%7D%29%5E2& alt=&||w^{[l]}||^2=\sum_{i=1}^{n^{[l]}}\sum_{j=1}^{n^{[l-1]}}(w_{ij}^{[l]})^2& eeimg=&1&&&/p&&p&&br&&/p&&p&通常,我们把 &img src=&https://www.zhihu.com/equation?tex=%7C%7Cw%5E%7B%5Bl%5D%7D%7C%7C%5E2& alt=&||w^{[l]}||^2& eeimg=&1&& 称为Frobenius范数,记为 &img src=&https://www.zhihu.com/equation?tex=%7C%7Cw%5E%7B%5Bl%5D%7D%7C%7C_F%5E2& alt=&||w^{[l]}||_F^2& eeimg=&1&& 。一个矩阵的Frobenius范数就是计算所有元素平方和再开方,如下所示:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%7C%7CA%7C%7C_F%3D%5Csqrt+%7B%5Csum_%7Bi%3D1%7D%5Em%5Csum_%7Bj%3D1%7D%5En%7Ca_%7Bij%7D%7C%5E2%7D& alt=&||A||_F=\sqrt {\sum_{i=1}^m\sum_{j=1}^n|a_{ij}|^2}& eeimg=&1&&&/p&&p&&br&&/p&&p&值得注意的是,由于加入了正则化项,梯度下降算法中的 &img src=&https://www.zhihu.com/equation?tex=dw%5E%7B%5Bl%5D%7D& alt=&dw^{[l]}& eeimg=&1&& 计算表达式需要做如下修改:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=dw%5E%7B%5Bl%5D%7D%3Ddw%5E%7B%5Bl%5D%7D_%7Bbefore%7D%2B%5Cfrac%7B%5Clambda%7D%7Bm%7Dw%5E%7B%5Bl%5D%7D& alt=&dw^{[l]}=dw^{[l]}_{before}+\frac{\lambda}{m}w^{[l]}& eeimg=&1&&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=w%5E%7B%5Bl%5D%7D%3A%3Dw%5E%7B%5Bl%5D%7D-%5Calpha%5Ccdot+dw%5E%7B%5Bl%5D%7D& alt=&w^{[l]}:=w^{[l]}-\alpha\cdot dw^{[l]}& eeimg=&1&&&img src=&https://www.zhihu.com/equation?tex=w%5E%7B%5Bl%5D%7D%3A%3Dw%5E%7B%5Bl%5D%7D-%5Calpha%5Ccdot+dw%5E%7B%5Bl%5D%7D& alt=&w^{[l]}:=w^{[l]}-\alpha\cdot dw^{[l]}& eeimg=&1&&&/p&&p&&br&&/p&&p&L2 regularization也被称做weight decay。这是因为,由于加上了正则项, &img src=&https://www.zhihu.com/equation?tex=dw%5E%7B%5Bl%5D%7D& alt=&dw^{[l]}& eeimg=&1&& 有个增量,在更新 &img src=&https://www.zhihu.com/equation?tex=w%5E%7B%5Bl%5D%7D& alt=&w^{[l]}& eeimg=&1&& 的时候,会多减去这个增量,使得 &img src=&https://www.zhihu.com/equation?tex=w%5E%7B%5Bl%5D%7D& alt=&w^{[l]}& eeimg=&1&& 比没有正则项的值要小一些。不断迭代更新,不断地减小。&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Cbegin%7Beqnarray%7Dw%5E%7B%5Bl%5D%7D+%26%3A%3D%26w%5E%7B%5Bl%5D%7D-%5Calpha%5Ccdot+dw%5E%7B%5Bl%5D%7D%5C%5C+%26%3D%26w%5E%7B%5Bl%5D%7D-%5Calpha%5Ccdot%28dw%5E%7B%5Bl%5D%7D_%7Bbefore%7D%2B%5Cfrac%7B%5Clambda%7D%7Bm%7Dw%5E%7B%5Bl%5D%7D%29%5C%5C+%26%3D%26%281-%5Calpha%5Cfrac%7B%5Clambda%7D%7Bm%7D%29w%5E%7B%5Bl%5D%7D-%5Calpha%5Ccdot+dw%5E%7B%5Bl%5D%7D_%7Bbefore%7D+%5Cend%7Beqnarray%7D& alt=&\begin{eqnarray}w^{[l]} &:=&w^{[l]}-\alpha\cdot dw^{[l]}\\ &=&w^{[l]}-\alpha\cdot(dw^{[l]}_{before}+\frac{\lambda}{m}w^{[l]})\\ &=&(1-\alpha\frac{\lambda}{m})w^{[l]}-\alpha\cdot dw^{[l]}_{before} \end{eqnarray}& eeimg=&1&&&/p&&p&&br&&/p&&p&其中, &img src=&https://www.zhihu.com/equation?tex=%281-%5Calpha%5Cfrac%7B%5Clambda%7D%7Bm%7D%29%3C1& alt=&(1-\alpha\frac{\lambda}{m})&1& eeimg=&1&& 。&/p&&p&&br&&/p&&h2&&b&5. Why regularization reduces overfitting&/b&&/h2&&p&为什么正则化能够有效避免high variance,防止过拟合呢?下面我们通过几个例子说明。&/p&&p&还是之前那张图,从左到右,分别表示了欠拟合,刚好拟合,过拟合三种情况。&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-3c98a8eb77c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1383& data-rawheight=&617& class=&origin_image zh-lightbox-thumb& width=&1383& data-original=&https://pic3.zhimg.com/v2-3c98a8eb77c_r.jpg&&&/figure&&p&&br&&/p&&p&假如我们选择了非常复杂的神经网络模型,如上图左上角所示。在未使用正则化的情况下,我们得到的分类超平面可能是类似上图右侧的过拟合。但是,如果使用L2 regularization,当 &img src=&https://www.zhihu.com/equation?tex=%5Clambda& alt=&\lambda& eeimg=&1&& 很大时, &img src=&https://www.zhihu.com/equation?tex=w%5E%7B%5Bl%5D%7D%5Capprox0& alt=&w^{[l]}\approx0& eeimg=&1&& 。 &img src=&https://www.zhihu.com/equation?tex=w%5E%7B%5Bl%5D%7D& alt=&w^{[l]}& eeimg=&1&& 近似为零,意味着该神经网络模型中的某些神经元实际的作用很小,可以忽略。从效果上来看,其实是将某些神经元给忽略掉了。这样原本过于复杂的神经网络模型就变得不那么复杂了,而变得非常简单化了。如下图所示,整个简化的神经网络模型变成了一个逻辑回归模型。问题就从high variance变成了high bias了。&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fb9a1f641b9fcacc9de900_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&797& data-rawheight=&264& class=&origin_image zh-lightbox-thumb& width=&797& data-original=&https://pic1.zhimg.com/v2-fb9a1f641b9fcacc9de900_r.jpg&&&/figure&&p&&br&&/p&&p&因此,选择合适大小的 &img src=&https://www.zhihu.com/equation?tex=%5Clambda& alt=&\lambda& eeimg=&1&& 值,就能够同时避免high bias和high variance,得到最佳模型。&/p&&p&还有另外一个直观的例子来解释为什么正则化能够避免发生过拟合。假设激活函数是tanh函数。tanh函数的特点是在z接近零的区域,函数近似是线性的,而当|z|很大的时候,函数非线性且变化缓慢。当使用正则化, &img src=&https://www.zhihu.com/equation?tex=%5Clambda& alt=&\lambda& eeimg=&1&& 较大,即对权重 &img src=&https://www.zhihu.com/equation?tex=w%5E%7B%5Bl%5D%7D& alt=&w^{[l]}& eeimg=&1&& 的惩罚较大, &img src=&https://www.zhihu.com/equation?tex=w%5E%7B%5Bl%5D%7D& alt=&w^{[l]}& eeimg=&1&& 减小。因为 &img src=&https://www.zhihu.com/equation?tex=z%5E%7B%5Bl%5D%7D%3Dw%5E%7B%5Bl%5D%7Da%5E%7B%5Bl%5D%7D%2Bb%5E%7B%5Bl%5D%7D& alt=&z^{[l]}=w^{[l]}a^{[l]}+b^{[l]}& eeimg=&1&& 。当 &img src=&https://www.zhihu.com/equation?tex=w%5E%7B%5Bl%5D%7D& alt=&w^{[l]}& eeimg=&1&& 减小的时候, &img src=&https://www.zhihu.com/equation?tex=z%5E%7B%5Bl%5D%7D& alt=&z^{[l]}& eeimg=&1&& 也会减小。则此时的 &img src=&https://www.zhihu.com/equation?tex=z%5E%7B%5Bl%5D%7D& alt=&z^{[l]}& eeimg=&1&& 分布在tanh函数的近似线性区域。那么这个神经元起的作用就相当于是linear regression。如果每个神经元对应的权重 &img src=&https://www.zhihu.com/equation?tex=w%5E%7B%5Bl%5D%7D& alt=&w^{[l]}& eeimg=&1&& 都比较小,那么整个神经网络模型相当于是多个linear regression的组合,即可看成一个linear network。得到的分类超平面就会比较简单,不会出现过拟合现象。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-9ff54fdbfbdb21bac1d15_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&484& data-rawheight=&356& class=&origin_image zh-lightbox-thumb& width=&484& data-original=&https://pic4.zhimg.com/v2-9ff54fdbfbdb21bac1d15_r.jpg&&&/figure&&p&&br&&/p&&h2&&b&6. Dropout Regularization&/b&&/h2&&p&除了L2 regularization之外,还有另外一种防止过拟合的有效方法:Dropout。&/p&&p&Dropout是指在深度学习网络的训练过程中,对于每层的神经元,按照一定的概率将其暂时从网络中丢弃。也就是说,每次训练时,每一层都有部分神经元不工作,起到简化复杂网络模型的效果,从而避免发生过拟合。&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-024bd8cd2bd6b48196e0ffe954f80071_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&725& data-rawheight=&334& class=&origin_image zh-lightbox-thumb& width=&725& data-original=&https://pic1.zhimg.com/v2-024bd8cd2bd6b48196e0ffe954f80071_r.jpg&&&/figure&&p&&br&&/p&&p&Dropout有不同的实现方法,接下来介绍一种常用的方法:Inverted dropout。假设对于第l层神经元,设定保留神经元比例概率keep_prob=0.8,即该层有20%的神经元停止工作。 &img src=&https://www.zhihu.com/equation?tex=dl& alt=&dl& eeimg=&1&& 为dropout向量,设置 &img src=&https://www.zhihu.com/equation?tex=dl& alt=&dl& eeimg=&1&& 为随机vector,其中80%的元素为1,20%的元素为0。在python中可以使用如下语句生成dropout vector:&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span&&/span&&span class=&n&&dl&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&rand&/span&&span class=&p&&(&/span&&span class=&n&&al&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&[&/span&&span class=&mi&&0&/span&&span class=&p&&],&/span&&span class=&n&&al&/span&&span class=&o&&.&/span&&span class=&n&&shape&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&&span class=&o&&&&/span&&span class=&n&&keep_prob&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&然后,第 &img src=&https://www.zhihu.com/equation?tex=l& alt=&l& eeimg=&1&& 层经过dropout,随机删减20%的神经元,只保留80%的神经元,其输出为:&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span&&/span&&span class=&n&&al&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&multiply&/span&&span class=&p&&(&/span&&span class=&n&&al&/span&&span class=&p&&,&/span&&span class=&n&&dl&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&最后,还要对 &img src=&https://www.zhihu.com/equation?tex=al& alt=&al& eeimg=&1&& 进行scale up处理,即:&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span&&/span&&span class=&n&&al&/span& &span class=&o&&/=&/span& &span class=&n&&keep_prob&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&以上就是Inverted dropout的方法。之所以要对 &img src=&https://www.zhihu.com/equation?tex=al& alt=&al& eeimg=&1&& 进行scale up是为了保证在经过dropout后, &img src=&https://www.zhihu.com/equation?tex=al& alt=&al& eeimg=&1&& 作为下一层神经元的输入值尽量保持不变。假设第 &img src=&https://www.zhihu.com/equation?tex=l& alt=&l& eeimg=&1&& 层有50个神经元,经过dropout后,有10个神经元停止工作,这样只有40神经元有作用。那么得到的 &img src=&https://www.zhihu.com/equation?tex=al& alt=&al& eeimg=&1&& 只相当于原来的80%。scale up后,能够尽可能保持 &img src=&https://www.zhihu.com/equation?tex=al& alt=&al& eeimg=&1&& 的期望值相比之前没有大的变化。&/p&&p&Inverted dropout的另外一个好处就是在对该dropout后的神经网络进行测试时能够减少scaling问题。因为在训练时,使用scale up保证 &img src=&https://www.zhihu.com/equation?tex=al& alt=&al& eeimg=&1&& 的期望值没有大的变化,测试时就不需要再对样本数据进行类似的尺度伸缩操作了。&/p&&p&对于m个样本,单次迭代训练时,随机删除掉隐藏层一定数量的神经元;然后,在删除后的剩下的神经元上正向和反向更新权重w和常数项b;接着,下一次迭代中,再恢复之前删除的神经元,重新随机删除一定数量的神经元,进行正向和反向更新w和b。不断重复上述过程,直至迭代训练完成。&/p&&p&值得注意的是,使用dropout训练结束后,在测试和实际应用模型时,不需要进行dropout和随机删减神经元,所有的神经元都在工作。&/p&&p&&br&&/p&&h2&&b&7. Understanding Dropout&/b&&/h2&&p&Dropout通过每次迭代训练时,随机选择不同的神经元,相当于每次都在不同的神经网络上进行训练,类似机器学习中Bagging的方法(三个臭皮匠,赛过诸葛亮),能够防止过拟合。&/p&&p&除此之外,还可以从权重w的角度来解释为什么dropout能够有效防止过拟合。对于某个神经元来说,某次训练时,它的某些输入在dropout的作用被过滤了。而在下一次训练时,又有不同的某些输入被过滤。经过多次训练后,某些输入被过滤,某些输入被保留。这样,该神经元就不会受某个输入非常大的影响,影响被均匀化了。也就是说,对应的权重w不会很大。这从从效果上来说,与L2 regularization是类似的,都是对权重w进行“惩罚”,减小了w的值。&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-e3c80cb918ffbdfba60b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&651& data-rawheight=&299& class=&origin_image zh-lightbox-thumb& width=&651& data-original=&https://pic1.zhimg.com/v2-e3c80cb918ffbdfba60b_r.jpg&&&/figure&&p&&br&&/p&&p&总结一下,对于同一组训练数据,利用不同的神经网络训练之后,求其输出的平均值可以减少overfitting。Dropout就是利用这个原理,每次丢掉一定数量的隐藏层神经元,相当于在不同的神经网络上进行训练,这样就减少了神经元之间的依赖性,即每个神经元不能依赖于某几个其他的神经元(指层与层之间相连接的神经元),使神经网络更加能学习到与其他神经元之间的更加健壮robust的特征。&/p&&p&在使用dropout的时候,有几点需要注意。首先,不同隐藏层的dropout系数keep_prob可以不同。一般来说,神经元越多的隐藏层,keep_out可以设置得小一些.,例如0.5;神经元越少的隐藏层,keep_out可以设置的大一些,例如0.8,设置是1。另外,实际应用中,不建议对输入层进行dropout,如果输入层维度很大,例如图片,那么可以设置dropout,但keep_out应设置的大一些,例如0.8,0.9。总体来说,就是越容易出现overfitting的隐藏层,其keep_prob就设置的相对小一些。没有准确固定的做法,通常可以根据validation进行选择。&/p&&p&Dropout在电脑视觉CV领域应用比较广泛,因为输入层维度较大,而且没有足够多的样本数量。值得注意的是dropout是一种regularization技巧,用来防止过拟合的,最好只在需要regularization的时候使用dropout。&/p&&p&使用dropout的时候,可以通过绘制cost function来进行debug,看看dropout是否正确执行。一般做法是,将所有层的keep_prob全设置为1,再绘制cost function,即涵盖所有神经元,看J是否单调下降。下一次迭代训练时,再将keep_prob设置为其它值。&/p&&p&&br&&/p&&h2&&b&8. Other regularization methods&/b&&/h2&&p&除了L2 regularization和dropout regularization之外,还有其它减少过拟合的方法。&/p&&p&一种方法是增加训练样本数量。但是通常成本较高,难以获得额外的训练样本。但是,我们可以对已有的训练样本进行一些处理来“制造”出更多的样本,称为data augmentation。例如图片识别问题中,可以对已有的图片进行水平翻转、垂直翻转、任意角度旋转、缩放或扩大等等。如下图所示,这些处理都能“制造”出新的训练样本。虽然这些是基于原有样本的,但是对增大训练样本数量还是有很有帮助的,不需要增加额外成本,却能起到防止过拟合的效果。&/p&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-5f83ca9cb386ad3463e17fd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1108& data-rawheight=&164& class=&origin_image zh-lightbox-thumb& width=&1108& data-original=&https://pic2.zhimg.com/v2-5f83ca9cb386ad3463e17fd_r.jpg&&&/figure&&p&&br&&/p&&p&在数字识别中,也可以将原有的数字图片进行任意旋转或者扭曲,或者增加一些noise,如下图所示:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-208f48b47f36d86df403d737a01c135e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1211& data-rawheight=&386& class=&origin_image zh-lightbox-thumb& width=&1211& data-original=&https://pic1.zhimg.com/v2-208f48b47f36d86df403d737a01c135e_r.jpg&&&/figure&&p&&br&&/p&&p&还有另外一种防止过拟合的方法:early stopping。一个神经网络模型随着迭代训练次数增加,train set error一般是单调减小的,而dev set error 先减小,之后又增大。也就是说训练次数过多时,模型会对训练样本拟合的越来越好,但是对验证集拟合效果逐渐变差,即发生了过拟合。因此,迭代训练次数不是越多越好,可以通过train set error和dev set error随着迭代次数的变化趋势,选择合适的迭代次数,即early stopping。&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-0f6bb6b33a77faade4a38_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&590& data-rawheight=&433& class=&origin_image zh-lightbox-thumb& width=&590& data-original=&https://pic1.zhimg.com/v2-0f6bb6b33a77faade4a38_r.jpg&&&/figure&&p&&br&&/p&&p&然而,Early stopping有其自身缺点。通常来说,机器学习训练模型有两个目标:一是优化cost function,尽量减小J;二是防止过拟合。这两个目标彼此对立的,即减小J的同时可能会造成过拟合,反之亦然。我们把这二者之间的关系称为正交化orthogonalization。该节课开始部分就讲过,在深度学习中,我们可以同时减小Bias和Variance,构建最佳神经网络模型。但是,Early stopping的做法通过减少得带训练次数来防止过拟合,这样J就不会足够小。也就是说,early stopping将上述两个目标融合在一起,同时优化,但可能没有“分而治之”的效果好。&/p&&p&与early stopping相比,L2 regularization可以实现“分而治之”的效果:迭代训练足够多,减小J,而且也能有效防止过拟合。而L2 regularization的缺点之一是最优的正则化参数 &img src=&https://www.zhihu.com/equation?tex=%5Clambda& alt=&\lambda& eeimg=&1&& 的选择比较复杂。对这一点来说,early stopping比较简单。总的来说,L2 regularization更加常用一些。&/p&&p&&br&&/p&&h2&&b&9. Normalizing inputs&/b&&/h2&&p&在训练神经网络时,标准化输入可以提高训练的速度。标准化输入就是对训练数据集进行归一化的操作,即将原始数据减去其均值 &img src=&https://www.zhihu.com/equation?tex=%5Cmu& alt=&\mu& eeimg=&1&& 后,再除以其方差 &img src=&https://www.zhihu.com/equation?tex=%5Csigma%5E2& alt=&\sigma^2& eeimg=&1&& :&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Cmu%3D%5Cfrac1m%5Csum_%7Bi%3D1%7D%5EmX%5E%7B%28i%29%7D& alt=&\mu=\frac1m\sum_{i=1}^mX^{(i)}& eeimg=&1&&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Csigma%5E2%3D%5Cfrac1m%5Csum_%7Bi%3D1%7D%5Em%28X%5E%7B%28i%29%7D%29%5E2& alt=&\sigma^2=\frac1m\sum_{i=1}^m(X^{(i)})^2& eeimg=&1&&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=X%3A%3D%5Cfrac%7BX-%5Cmu%7D%7B%5Csigma%5E2%7D& alt=&X:=\frac{X-\mu}{\sigma^2}& eeimg=&1&&&/p&&p&&br&&/p&&p&以二维平面为例,下图展示了其归一化过程:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fd3ddee3b11ae4df8bea_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1070& data-rawheight=&342& class=&origin_image zh-lightbox-thumb& width=&1070& data-original=&https://pic1.zhimg.com/v2-fd3ddee3b11ae4df8bea_r.jpg&&&/figure&&p&&br&&/p&&p&值得注意的是,由于训练集进行了标准化处理,那么对于测试集或在实际应用时,应该使用同样的 &img src=&https://www.zhihu.com/equation?tex=%5Cmu& alt=&\mu& eeimg=&1&& 和 &img src=&https://www.zhihu.com/equation?tex=%5Csigma%5E2& alt=&\sigma^2& eeimg=&1&& 对其进行标准化处理。这样保证了训练集合测试集的标准化操作一致。&/p&&p&之所以要对输入进行标准化操作,主要是为了让所有输入归一化同样的尺度上,方便进行梯度下降算法时能够更快更准确地找到全局最优解。假如输入特征是二维的,且x1的范围是[1,1000],x2的范围是[0,1]。如果不进行标准化处理,x1与x2之间分布极不平衡,训练得到的w1和w2也会在数量级上差别很大。这样导致的结果是cost function与w和b的关系可能是一个非常细长的椭圆形碗。对其进行梯度下降算法时,由于w1和w2数值差异很大,只能选择很小的学习因子 &img src=&https://www.zhihu.com/equation?tex=%5Calpha& alt=&\alpha& eeimg=&1&& ,来避免J发生振荡。一旦 &img src=&https://www.zhihu.com/equation?tex=%5Calpha& alt=&\alpha& eeimg=&1&& 较大,必然发生振荡,J不再单调下降。如下左图所示。&/p&&p&然而,如果进行了标准化操作,x1与x2分布均匀,w1和w2数值差别不大,得到的cost function与w和b的关系是类似圆形碗。对其进行梯度下降算法时, &img src=&https://www.zhihu.com/equation?tex=%5Calpha& alt=&\alpha& eeimg=&1&& 可以选择相对大一些,且J一般不会发生振荡,保证了J是单调下降的。如下右图所示。&/p&&p&&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-6da2bcbfd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1115& data-rawheight=&564& class=&origin_image zh-lightbox-thumb& width=&1115& data-original=&https://pic3.zhimg.com/v2-6da2bcbfd_r.jpg&&&/figure&&p&&br&&/p&&p&另外一种情况,如果输入特征之间的范围本来就比较接近,那么不进行标准化操作也是没有太大影响的。但是,标准化处理在大多数场合下还是值得推荐的。&/p&&p&&br&&/p&&h2&&b&10. Vanishing and Exploding gradients&/b&&/h2&&p&在神经网络尤其是深度神经网络中存在可能存在这样一个问题:梯度消失和梯度爆炸。意思是当训练一个 层数非常多的神经网络时,计算得到的梯度可能非常小或非常大,甚至是指数级别的减小或增大。这样会让训练过程变得非常困难。&/p&&p&举个例子来说明,假设一个多层的每层只包含两个神经元的深度神经网络模型,如下图所示:&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-9dafebd2fcbf0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&998& data-rawheight=&151& class=&origin_image zh-lightbox-thumb& width=&998& data-original=&https://pic1.zhimg.com/v2-9dafebd2fcbf0_r.jpg&&&/figure&&p&&br&&/p&&p&为了简化复杂度,便于分析,我们令各层的激活函数为线性函数,即 &img src=&https://www.zhihu.com/equation?tex=g%28Z%29%3DZ& alt=&g(Z)=Z& eeimg=&1&& 。且忽略各层常数项b的影响,令b全部为零。那么,该网络的预测输出 &img src=&https://www.zhihu.com/equation?tex=%5Chat+Y& alt=&\hat Y& eeimg=&1&& 为:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Chat+Y%3DW%5E%7B%5BL%5D%7DW%5E%7B%5BL-1%5D%7DW%5E%7B%5BL-2%5D%7D%5Ccdots+W%5E%7B%5B3%5D%7DW%5E%7B%5B2%5D%7DW%5E%7B%5B1%5D%7DX& alt=&\hat Y=W^{[L]}W^{[L-1]}W^{[L-2]}\cdots W^{[3]}W^{[2]}W^{[1]}X& eeimg=&1&&&/p&&p&&br&&/p&&p&如果各层权重 &img src=&https://www.zhihu.com/equation?tex=W%5E%7B%5Bl%5D%7D& alt=&W^{[l]}& eeimg=&1&& 的元素都稍大于1,例如1.5,则预测输出 &img src=&https://www.zhihu.com/equation?tex=%5Chat+Y& alt=&\hat Y& eeimg=&1&& 将正比于 &img src=&https://www.zhihu.com/equation?tex=1.5%5EL& alt=&1.5^L& eeimg=&1&& 。L越大, &img src=&https://www.zhihu.com/equation?tex=%5Chat+Y& alt=&\hat Y& eeimg=&1&& 越大,且呈指数型增长。我们称之为数值爆炸。相反,如果各层权重 &img src=&https://www.zhihu.com/equation?tex=W%5E%7B%5Bl%5D%7D& alt=&W^{[l]}& eeimg=&1&& 的元素都稍小于1,例如0.5,则预测输出 &img src=&https://www.zhihu.com/equation?tex=%5Chat+Y& alt=&\hat Y& eeimg=&1&& 将正比于 &img src=&https://www.zhihu.com/equation?tex=0.5%5EL& alt=&0.5^L& eeimg=&1&& 。网络层数L越多, &img src=&https://www.zhihu.com/equation?tex=%5Chat+Y& alt=&\hat Y& eeimg=&1&& 呈指数型减小。我们称之为数值消失。&/p&&p&也就是说,如果各层权重 &img src=&https://www.zhihu.com/equation?tex=W%5E%7B%5Bl%5D%7D& alt=&W^{[l]}& eeimg=&1&& 都大于1或者都小于1,那么各层激活函数的输出将随着层数 &img src=&https://www.zhihu.com/equation?tex=l& alt=&l& eeimg=&1&& 的增加,呈指数型增大或减小。当层数很大时,出现数值爆炸或消失。同样,这种情况也会引起梯度呈现同样的指数型增大或减小的变化。L非常大时,例如L=150,则梯度会非常大或非常小,引起每次更新的步进长度过大或者过小,这让训练过程十分困难。&/p&&p&&br&&/p&&h2&&b&11. Weight Initialization for Deep Networks&/b&&/h2&&p&下面介绍如何改善Vanishing and Exploding gradients这类问题,方法是对权重w进行一些初始化处理。&/p&&p&深度神经网络模型中,以单个神经元为例,该层( &img src=&https://www.zhihu.com/equation?tex=l& alt=&l& eeimg=&1&& )的输入个数为n,其输出为:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=z%3Dw_1x_1%2Bw_2x_2%2B%5Ccdots%2Bw_nx_n& alt=&z=w_1x_1+w_2x_2+\cdots+w_nx_n& eeimg=&1&&&img src=&https://www.zhihu.com/equation?tex=z%3Dw_1x_1%2Bw_2x_2%2B%5Ccdots%2Bw_nx_n& alt=&z=w_1x_1+w_2x_2+\cdots+w_nx_n& eeimg=&1&&&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=a%3Dg%28z%29& alt=&a=g(z)& eeimg=&1&&&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-d848ca4f12febe8c3f356dd_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&587& data-rawheight=&312& class=&origin_image zh-lightbox-thumb& width=&587& data-original=&https://pic1.zhimg.com/v2-d848ca4f12febe8c3f356dd_r.jpg&&&/figure&&p&&br&&/p&&p&这里忽略了常数项b。为了让z不会过大或者过小,思路是让w与n有关,且n越大,w应该越小才好。这样能够保证z不会过大。一种方法是在初始化w时,令其方差为 &img src=&https://www.zhihu.com/equation?tex=%5Cfrac1n& alt=&\frac1n& eeimg=&1&& 。相应的python伪代码为:&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span&&/span&&span class=&n&&w&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&randn&/span&&span class=&p&&(&/span&&span class=&n&&n&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&p&&],&/span&&span class=&n&&n&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&&span class=&o&&*&/span&&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&sqrt&/span&&span class=&p&&(&/span&&span class=&mi&&1&/span&&span class=&o&&/&/span&&span class=&n&&n&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&如果激活函数是tanh,一般选择上面的初始化方法。&/p&&p&如果激活函数是ReLU,权重w的初始化一般令其方差为 &img src=&https://www.zhihu.com/equation?tex=%5Cfrac2n& alt=&\frac2n& eeimg=&1&& :&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span&&/span&&span class=&n&&w&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&randn&/span&&span class=&p&&(&/span&&span class=&n&&n&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&p&&],&/span&&span class=&n&&n&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&&span class=&o&&*&/span&&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&sqrt&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&o&&/&/span&&span class=&n&&n&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&除此之外,Yoshua Bengio提出了另外一种初始化w的方法,令其方差为 &img src=&https://www.zhihu.com/equation?tex=%5Cfrac%7B2%7D%7Bn%5E%7B%5Bl-1%5D%7Dn%5E%7B%5Bl%5D%7D%7D& alt=&\frac{2}{n^{[l-1]}n^{[l]}}& eeimg=&1&& :&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span&&/span&&span class=&n&&w&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&randn&/span&&span class=&p&&(&/span&&span class=&n&&n&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&p&&],&/span&&span class=&n&&n&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&&span class=&o&&*&/span&&span class=&n&&np&/span&&span class=&o&&.&/span&&span class=&n&&sqrt&/span&&span class=&p&&(&/span&&span class=&mi&&2&/span&&span class=&o&&/&/span&&span class=&n&&n&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span&&span class=&o&&*&/span&&span class=&n&&n&/span&&span class=&p&&[&/span&&span class=&n&&l&/span&&span class=&p&&])&/span&
&/code&&/pre&&/div&&p&&br&&/p&&p&至于选择哪种初始化方法因人而异,可以根据不同的激活函数选择不同方法。另外,我们可以对这些初始化方法中设置某些参数,作为超参数,通过验证集进行验证,得到最优参数,来优化神经网络。&/p&&p&&br&&/p&&h2&&b&12. Numerical approximation of gradients&/b&&/h2&&p&Back Propagation神经网络有一项重要的测试是梯度检查(gradient checking)。其目的是检查验证反向传播过程中梯度下降算法是否正确。该小节将先介绍如何近似求出梯度值。&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-3cfc688cf8_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&625& data-rawheight=&402& class=&origin_image zh-lightbox-thumb& width=&625& data-original=&https://pic4.zhimg.com/v2-3cfc688cf8_r.jpg&&&/figure&&p&&br&&/p&&p&利用微分思想,函数f在点 &img src=&https://www.zhihu.com/equation?tex=%5Ctheta& alt=&\theta& eeimg=&1&& 处的梯度可以表示成:&/p&&p&&br&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=g%28%5Ctheta%29%3D%5Cfrac%7Bf%28%5Ctheta%2B%5Cvarepsilon%29-f%28%5Ctheta-%5Cvarepsilon%29%7D%7B2%5Cvarepsilon%7D& alt=&g(\theta)=\frac{f(\theta+\varepsilon)-f(\theta-\varepsilon)}{2\varepsilon}& eeimg=&1&&&/p&&p&&br&&/p&&p&其中, &img src=&https://www.zhihu.com/equation?tex=%5Cvarepsilon%3E0& alt=&\varepsilon&0& eeimg=&1&& ,且足够小。&/p&&p&&br&&/p&&h2&&b&13. Gradient checking&/b&&/h2&&p&介绍完如何近似求出梯度值后,我们将介绍如何进行梯度检查,来验证训练过程中是否出现bugs。&/p&&p&梯度检查首先要做的是分别将 &img src=&https://www.zhihu.com/equation?tex=W%5E%7B%5B1%5D%7D%2Cb%5E%7B%5B1%5D%7D%2C%5Ccdots%2CW%5E%7B%5BL%5D%7D%2Cb%5E%7B%5BL%5D%7D& alt=&W^{[1]},b^{[1]},\cdots,W^{[L]},b^{[L]}& eeimg=&1&& 这些矩阵构造成一维向量,然后将这些一维向量组合起来构成一个更大的一维向量 &img src=&https://www.zhihu.com/equation?tex=%5Ctheta& alt=&\theta& eeimg=&1&& 。这样cost function &img src=&https://www.zhihu.com/equation?tex=J%28W%5E%7B%5B1%5D%7D%2Cb%5E%7B%5B1%5D%7D%2C%5Ccdots%2CW%5E%7B%5BL%5D%7D%2Cb%5E%7B%5BL%5D%7D%29& alt=&J(W^{[1]},b^{[1]},\cdots,W^{[L]},b^{[L]})& eeimg=&1&& 就可以表示成 &img src=&https://www.zhihu.com/equation?tex=J%28%5Ctheta%29& alt=&J(\theta)& eeimg=&1&& 。&/p&&p&然后将反向传播过程通过梯度下降算法得到的 &img src=&https://www.zhihu.com/equation?tex=dW%5E%7B%5B1%5D%7D%2Cdb%5E%

我要回帖

更多关于 揭示牧 的文章

 

随机推荐