安川伺服sgdm报警代码bm中文翻译

&figure&&img src=&https://pic2.zhimg.com/v2-9b0eff59d3f4de47b9f2f39a9f5053d9_b.jpg& data-rawwidth=&650& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&650& data-original=&https://pic2.zhimg.com/v2-9b0eff59d3f4de47b9f2f39a9f5053d9_r.jpg&&&/figure&&blockquote&简评:睡不着一点点看着天亮,怎么办?看看二战时期,美国为飞行员研发的入睡训练。也可以直接听&a href=&http://link.zhihu.com/?target=http%3A//music.163.com/%23/program///%3Fuserid%3D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&音频版(网易云)&/a&。&/blockquote&&p&你有过这种经历吗?&/p&&p&工作时间偷偷打盹,一旦休息时间,在椅子上或者在某个角落想要入睡,但一直是昏昏欲睡却醒着的状态。&/p&&p&尽管你很累,但就是睡不着,很快,休息时间过了。说起来很让人沮丧,不但没睡着,也没干任何事情;如果不打算睡觉还能做点别的事儿。&/p&&p&而总有那么些人,无论身边发生了什么,无论身处何地,用帽子遮住脸就能睡着。更不用说晚上一沾枕头就着。其实这些都是可以学习的。&/p&&p&&b&随时随地在两分钟或者更短的时间内入睡&/b&其实和其他技能一样,都是可以后天训练获得的。&/p&&p&第二次世界大战期间,美国为海军飞行员开发了这项技术。&/p&&hr&&h2&如何在两分钟或更短时间内入睡?&/h2&&p&在二战那几年,美军意识到了一个问题:由于空中作战的巨大压力,许多飞行员都存在着应激反应,这让他们身体虚弱,不堪负重。从而犯下一系列致命的错误,无意击中友军飞机或者自己的误操作而受伤。&/p&&p&为了阻止飞行员和飞机的损失,海军少尉 Bud Winter 开始研究测试一种可以训练的放松方法,以便飞行员能够减压,提高反应速度,增加注意力减少恐惧。&/p&&p&战前 Winter 是一个成功的大学橄榄球和田径教练,他与心理学教授一起合作,帮助运动员在高压下放松并取得更好的表现。&/p&&p&事实上 ,他将睡眠定义为「&b&身心放松的状态&/b&」。第一步是身体放松,第二步是心理放松。&/p&&hr&&h2&如何身体放松?&/h2&&p&在「Relax and Win」一书中,Winter 写到了为战斗飞行员开发的这套入睡技术,战后用于运动员身上也特别奏效,他列出明确的步骤,教运动员如何放松,这里我们稍微浓缩一下:&/p&&ul&&li&坐在你的椅子上,两脚放在地板上。膝盖分开,手在膝盖内侧无力耷拉着。现在,闭上眼睛,放下下巴,直到它落在你的胸前。&/li&&li&有规律地、缓慢地深呼吸。让额头的皱纹都出现再舒展开,放松你的头皮。放松脸部其余肌肉,放松你的舌头和嘴唇,就像你在河边看到的鳟鱼那样嘴一开一合,缓慢呼吸。&/li&&li&现在来处理一下眼部八块肌肉。闭眼的同时,眼睛在眼窝中随意翻动,没有什么重点,就是上下左右翻动就行,缓慢呼吸。&/li&&li&现在,把肩膀放的尽可能低,就算你认为很低了,但是让它们更低。感受脖子后面的肌肉,当你觉得已经很放松了,尝试着让它们再进一步。&/li&&li&现在放松你的胸部。深吸一口气,屏住,呼气并吹出你所有的紧张情绪。让你的胸部瘪下去,想象在椅子上,自己是一直笨重的水母。缓慢呼吸,呼气时,释放越来越多的紧张情绪。&/li&&li&现在关注手臂。放松右二头肌,右前臂也一样,然后右手,手指。然后在左臂重复,且保持缓慢呼吸。&/li&&li&你的上半身已经放松了,感觉温暖而愉快,感觉良好,幸福感侵入身体。&/li&&li&现在该下半身了,先右大腿肌肉,想象着肉挂在机构上,放松。然后是小腿肌肉,在之后是右脚踝和脚部肌肉。告诉自己,右腿没骨头。在左腿重复。感觉自己就是椅子上的一堆肉。&/li&&li&目前,我们身心放松,或者你觉得如此。为了保险,我们深呼吸三次,呼出最后的紧张,一次,呼~~两次,呼~~~三次,呼~~~~&/li&&/ul&&p&如果你无法感觉自己身体的松弛,以及水母般的感受,请尝试拉紧肌肉,然后使之放松。&/p&&p&如果遵从上述步骤,你可以达到一个很好地放松水平。Winter 建议,在任何压力大的时候尝试这个练习,可以很好的放松,减压,提高专注力,促成更好的决策。&/p&&p&这只是第一步,身体的放松,下一步精神的放松可以「跨越门槛进入深度、轻松的睡眠」。&/p&&hr&&h2&如何精神放松&/h2&&figure&&img src=&https://pic4.zhimg.com/v2-239176bcabbd1c7f396c9b53326fdaaf_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&465& data-rawheight=&594& class=&origin_image zh-lightbox-thumb& width=&465& data-original=&https://pic4.zhimg.com/v2-239176bcabbd1c7f396c9b53326fdaaf_r.jpg&&&/figure&&p&&b&Winter 认为,一旦你身体放松了,只要头脑十秒钟内没有任何活跃的想法,你就会睡着&/b&。快速入睡的关键就在于「停止你脑中奔腾的想法」,你必须停止反思当天的遗憾、忧虑、问题。&/p&&p&Winter 特别警告,&b&不要有任何运动的想法&/b&:通过将电极放在学员身上测试,当我们想到一项运动的时候,涉及到这项运动的肌肉也会实际收缩。现代研究证实了上述观察结果,只要我们在脑海中想象身体运动,实际上相关肌肉会处于激活状态。所以,当你试图入睡的时候,积极活跃的想法可能导致肌肉紧张并抑制睡眠。&/p&&p&所以,如果你想用最沉默的思考来填满你的脑袋,Winter 有三个建议,这里有任何一条都可以帮助你,只需要选一个就行,如果不行就选另一个:&/p&&ol&&li&幻想这是一个温暖的春日,而且你正躺在一个非常宁静的湖上独木舟的里。你正在仰望蓝天与云朵,浮动的云彩。不要有任何其他想法。只要专注于个画面十秒钟。&/li&&li&想象你正躺在一个黑色天鹅绒大床上,而且房子的其他地方全都是黑色的,专注这个画面十秒钟。&/li&&li&第三个窍门,在脑海中说「不要想、不要想、不要想。。。」,持续十秒钟,消除其他想法。&/li&&/ol&&hr&&h2&这些到底好使么?&/h2&&p&参加测试的飞行员分为两组:一组参加入睡训练,另一组作为对照组不训练。参加训练的组员在精神压力、训练和身体强化测试中,高于对照组。&/p&&p&经过六周的训练,96% 的飞行员能够在两分钟或者更短时间内,随时随地入睡。不仅如此,即使喝了咖啡,或者在枪炮的模拟背景音中,也是可以安然入睡的。&/p&&p&战争结束后,Winter 重新职教田径,成为了有史以来最伟大而短跑教练之一,他带过 102 位全美冠军和 27 位奥运选手,有一次他的运动员打破了短跑的十项世界纪录。&/p&&hr&&h2&你也可以&/h2&&p&Winter 强烈认为,他的训练帮助飞行员缓解了战争压力,帮助运动员缓解竞技压力。同样,这也适用于平民的日常生活,应对紧张和疲劳。&/p&&p&请记住,放松身心,把帽子盖脸上就睡着,这是一种技巧。就像所有的技能一样,不要期望前几次马上就会奏效,你必须反复练习,直到你越来越熟练地学会放松和平静。&/p&&p&&br&&/p&&blockquote&原文:&a href=&http://link.zhihu.com/?target=https%3A//www.artofmanliness.com//fall-asleep-fast/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How to Fall Asleep Fast - In Less Than 2 Minutes &/a&&/blockquote&&p&&br&&/p&&blockquote&相关阅读:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&教你美国海豹突击队作战呼吸法,让你在敲代码时快速冷静&/a&&/blockquote&&hr&&p&&b&园长:&/b& &a class=&member_mention& href=&http://www.zhihu.com/people/47b309da0de6beead0b6& data-hash=&47b309da0de6beead0b6& data-hovercard=&p$b$47b309da0de6beead0b6&&@快乐的小沫沫&/a& 听说你经常午睡睡不着,然后就到点了?&/p&&p&&br&&/p&&p&&b&极光日报,&a href=&http://link.zhihu.com/?target=http%3A//y0.cn/6AAFc& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&极光开发者&/a&旗下媒体。&/b&&/p&&p&&b&每天导读三篇英文技术文章。&/b&&/p&
简评:睡不着一点点看着天亮,怎么办?看看二战时期,美国为飞行员研发的入睡训练。也可以直接听。你有过这种经历吗?工作时间偷偷打盹,一旦休息时间,在椅子上或者在某个角落想要入睡,但一直是昏昏欲睡却醒着的状态。尽管你很累,但就是…
&figure&&img src=&https://pic3.zhimg.com/v2-ddbfccea469_b.jpg& data-rawwidth=&600& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic3.zhimg.com/v2-ddbfccea469_r.jpg&&&/figure&&p&在过去,我已经写过好几篇关于调试 / debug / 解 Bug 的文章,但都是从宏观的角度上去讲的,并没有针对哪种工具做具体深入的剖析。&/p&&p&工欲善其事,必先利其器,一个强大的调试工具可以帮助我们快速的发现问题、解决问题。而能不能很好的利用这些工具则是菜鸟程序员和高手程序员在工作方法上的一大区别。&/p&&p&所以,接下来,我打算从我最熟悉也是用户体量最大的 Visual Studio 开始入手,动手写关于 Debug 的系列教程。&/p&&p&虽说 MSDN 上已经啥都有了,但是赤裸裸的英文世界还是挡住了不少的开发者,这里我希望能用最平实易懂的语言让大家快速上手 VS 的调试功能。&/p&&p&它适用于 C#,C/C ++,Visual Basic,JavaScript 等大部分 VS 支持的编程语言。&/p&&p&说明一下,此教程主要参考 MSDN,但同时也添加了我自身在使用过程中积累的一些经验。&/p&&p&好了,废话不多说,进入主题。&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&本次教程将介绍 Visual Studio 入门阶段的一些 Debug 功能。&/b&&/p&&p&&br&&/p&&p&与大多数 IDE 一样,Visual Studio 有两个调试阶段:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&一是发现并解决 Build 过程中的项目和编译错误。
二是发现并解决 Run 过程中的动态错误。
&/code&&/pre&&/div&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e34cab2c74bb680ae7672cc95fda373c_b.jpg& data-rawwidth=&934& data-rawheight=&115& class=&origin_image zh-lightbox-thumb& width=&934& data-original=&https://pic4.zhimg.com/v2-e34cab2c74bb680ae7672cc95fda373c_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&h2&1 Build Solution&/h2&&p&Build 一个 Solution 先从配置开始。&/p&&p&Solution 的配置有两种基本类型: &b&Debug 和
Release。&/b&&/p&&p&它们的区别如下:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-573cab40b1e6a50edbfa6f_b.jpg& data-rawwidth=&933& data-rawheight=&210& class=&origin_image zh-lightbox-thumb& width=&933& data-original=&https://pic2.zhimg.com/v2-573cab40b1e6a50edbfa6f_r.jpg&&&/figure&&p&默认配置为 Debug。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6e4fef60def783dbc37e53d_b.jpg& data-rawwidth=&611& data-rawheight=&177& class=&origin_image zh-lightbox-thumb& width=&611& data-original=&https://pic4.zhimg.com/v2-6e4fef60def783dbc37e53d_r.jpg&&&/figure&&p&&br&&/p&&p&除此之外,还可以指定目标平台,如 x86(32 位 Intel CPU)、x64(64 位 Intel CPU)和 ARM(ARM CPU,仅支持某些应用类型)。&/p&&p&若要更改此值,请单击平台下拉列表,选择其他平台或「配置管理器...」&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ce19ab0a7f39deb7dd4b56_b.jpg& data-rawwidth=&598& data-rawheight=&236& class=&origin_image zh-lightbox-thumb& width=&598& data-original=&https://pic2.zhimg.com/v2-ce19ab0a7f39deb7dd4b56_r.jpg&&&/figure&&p&&br&&/p&&p&配置好工程之后,就可以开始 Build 了。&/p&&p&最简单的方法是按下 &b&F7,&/b&也可以在菜单中选择 Build Solution。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ab3be5e86a0b34bd_b.jpg& data-rawwidth=&555& data-rawheight=&122& class=&origin_image zh-lightbox-thumb& width=&555& data-original=&https://pic4.zhimg.com/v2-ab3be5e86a0b34bd_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&2 Output 窗口&/h2&&p&Build 过程及其结果将显示在 Output 窗口。&/p&&p&这里会显示原始编译器输出,如Error,Warning 等。可以单击 Error 或 Warning 转到对应的代码行。&/p&&p&这是一个 Build 成功的例子。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-cfc5eeeefe84a15161d69cca714f0c58_b.jpg& data-rawwidth=&675& data-rawheight=&118& class=&origin_image zh-lightbox-thumb& width=&675& data-original=&https://pic4.zhimg.com/v2-cfc5eeeefe84a15161d69cca714f0c58_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&3 Error List 窗口&/h2&&p&Build 过程中出现的 Error 和 Warning 的详细信息可以在 Error List 窗口中查看。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-fde9d_b.jpg& data-rawwidth=&629& data-rawheight=&169& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&https://pic3.zhimg.com/v2-fde9d_r.jpg&&&/figure&&p&&br&&/p&&p&单击某一项 Error 或者 Warning,可以转到对应的发生 Error 或者 Warning 的代码行。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-05ddaccad0d_b.jpg& data-rawwidth=&410& data-rawheight=&137& class=&content_image& width=&410&&&/figure&&p&&br&&/p&&p&如上图,&b&红色波浪线&/b&代表了 Error ,可以将鼠标悬停在上方获取出现此 Error 的详细信息。&br&&/p&&p&有的时候,并不是所有的 Error 你一眼就能看出其中的问题,可能会出现一些只对编译器才有意义的术语或者代码,例如:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&fatal error C1189: #error ...
&/code&&/pre&&/div&&p&此时,很多人的做法是把这段话复制粘贴到百度/谷歌搜索栏再去搜索。其实你未必要去做这样的重复劳动。&/p&&p&也许你不知道,VS 自带了搜索功能。&/p&&p&在相应的 Error 或者 Warning 条目上右击,会出现一个菜单,点击 Show Error Help,将自动执行该 Error 或者 Warning 的 Bing 搜索。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-436c919d11ae63b4a429eb1be65ace82_b.jpg& data-rawwidth=&675& data-rawheight=&222& class=&origin_image zh-lightbox-thumb& width=&675& data-original=&https://pic3.zhimg.com/v2-436c919d11ae63b4a429eb1be65ace82_r.jpg&&&/figure&&p&&br&&/p&&p&另外,也可以点击 Code 列中的错误代码超链接,如 CS1525,同样会执行该错误代码的 Bing 搜索。&/p&&p&一一查看并解决 Error List 中出现的所有的 Error,Rebuild Solution 直至成功生成解决方案。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&4 代码静态分析&/h2&&p&解决了 Build 过程中 Error List 出现的所有 Error 之后,可以尝试执行代码静态分析。代码静态分析会去分析代码中可能的导致运行时错误等问题,并给出 Warning。&/p&&p&不要觉得没 Erorr 了,Build 成功了,就万事大吉了,在一开始的时候,尽量解决代码中出现的 Warning,可以省去将来不必要的麻烦。&/p&&p&可以按快捷键 Alt+F11 也可以点击如下菜单,执行代码静态分析。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fcf11f8d1dcaa212badbe_b.jpg& data-rawwidth=&382& data-rawheight=&191& class=&content_image& width=&382&&&/figure&&p&&br&&/p&&p&Warning 同样出现在 Error List 窗口,点击 「 Warning」选项卡查看。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-8b4dededed146fdbe3e11b_b.jpg& data-rawwidth=&629& data-rawheight=&106& class=&origin_image zh-lightbox-thumb& width=&629& data-original=&https://pic3.zhimg.com/v2-8b4dededed146fdbe3e11b_r.jpg&&&/figure&&p&&br&&/p&&p&单击条目跳转至出现 Warning 的代码行。&b&绿色波浪线&/b&代表了 Warning,可将鼠标悬停在上方获取详细信息。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-eefbde92ea6be9b670c1f75_b.jpg& data-rawwidth=&581& data-rawheight=&142& class=&origin_image zh-lightbox-thumb& width=&581& data-original=&https://pic4.zhimg.com/v2-eefbde92ea6be9b670c1f75_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-e272da93ed5796cfd405bc61e4cdbbca_b.jpg& data-rawwidth=&933& data-rawheight=&111& class=&origin_image zh-lightbox-thumb& width=&933& data-original=&https://pic1.zhimg.com/v2-e272da93ed5796cfd405bc61e4cdbbca_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&h2&5 基本操作&/h2&&p&Build Solution 成功以后,按下 F5 执行,这将在 Debug 环境中启动程序。&/p&&p&此时默认出现两个窗口。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-6b7e4d2c1_b.jpg& data-rawwidth=&653& data-rawheight=&241& class=&origin_image zh-lightbox-thumb& width=&653& data-original=&https://pic3.zhimg.com/v2-6b7e4d2c1_r.jpg&&&/figure&&p&&br&&/p&&p&按下 Break 或 Stop 按钮来暂停或停止程序。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-a7e05ca6bfc321e1fd7d9e_b.jpg& data-rawwidth=&359& data-rawheight=&106& class=&content_image& width=&359&&&/figure&&p&&br&&/p&&p&按下 Continue 按钮继续执行程序。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-716fa75a9aa51a2fc75b3fd_b.jpg& data-rawwidth=&248& data-rawheight=&87& class=&content_image& width=&248&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&6 设置断点&/h2&&p&设置断点是 Debug 过程最最最常用的功能。&/p&&p&断点指示 VS 在执行到哪一行代码的时候挂起。程序挂起的时候,可以查看任意你想看的东西,如变量值,内存,代码执行分支等。&/p&&p&设置断点很简单,只要在编辑区的边缘单击一下或者在相应的代码行按下 F9,旁边就会出现一个红色圆点,这个红色圆点就代表了断点。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-a3f4b62e94de36c689442_b.jpg& data-rawwidth=&575& data-rawheight=&169& class=&origin_image zh-lightbox-thumb& width=&575& data-original=&https://pic1.zhimg.com/v2-a3f4b62e94de36c689442_r.jpg&&&/figure&&p&&br&&/p&&p&设置好断点,按下 F5,程序即会在断点处停下来。&/p&&p&动图在这里。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-fbc568cf83a11abea5e250_b.jpg& data-rawwidth=&738& data-rawheight=&511& data-thumbnail=&https://pic2.zhimg.com/v2-fbc568cf83a11abea5e250_b.jpg& class=&origin_image zh-lightbox-thumb& width=&738& data-original=&https://pic2.zhimg.com/v2-fbc568cf83a11abea5e250_r.jpg&&&/figure&&p&&br&&/p&&p&接下来,常用的几个操作是:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-ba468eea64d6ed5b0e61c6c_b.jpg& data-rawwidth=&1009& data-rawheight=&209& class=&origin_image zh-lightbox-thumb& width=&1009& data-original=&https://pic3.zhimg.com/v2-ba468eea64d6ed5b0e61c6c_r.jpg&&&/figure&&p&&br&&/p&&p&可以设置多个断点,在 F5,F10 等快捷键之间切换,转到不同的断点。&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&h2&7 查看变量&/h2&&p&程序执行到断点处,停下来的时候,可以查看代码中的变量,堆栈调用情况等,看下它们是不是在预期的范围内。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-1f85cc986a5e49a91cb3f_b.jpg& data-rawwidth=&537& data-rawheight=&79& class=&origin_image zh-lightbox-thumb& width=&537& data-original=&https://pic2.zhimg.com/v2-1f85cc986a5e49a91cb3f_r.jpg&&&/figure&&p&&br&&/p&&p&将鼠标悬停在变量上面,可以看到它此刻的值。&/p&&p&再放个动图,看的更清楚一点。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ceecf82d4b0_b.jpg& data-rawwidth=&757& data-rawheight=&316& data-thumbnail=&https://pic1.zhimg.com/v2-ceecf82d4b0_b.jpg& class=&origin_image zh-lightbox-thumb& width=&757& data-original=&https://pic1.zhimg.com/v2-ceecf82d4b0_r.jpg&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&==&/p&&p&只收藏不点赞的都是耍流氓
O(∩_∩)O~&/p&&p&&br&&/p&&p&&br&&/p&&p&&b&相关教程&/b&&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Visual Studio Debug 教程 之 窗口&/a&&/p&&p&&/p&&p&&/p&
在过去,我已经写过好几篇关于调试 / debug / 解 Bug 的文章,但都是从宏观的角度上去讲的,并没有针对哪种工具做具体深入的剖析。工欲善其事,必先利其器,一个强大的调试工具可以帮助我们快速的发现问题、解决问题。而能不能很好的利用这些工具则是菜鸟程…
&p&真巧,最近讲课的时候也反复强调了这个。&/p&&p&首先说结论,这个本质是类变量和实例变量之间的差别&/p&&hr&&p&正文:&/p&&p&首先什么是实例变量&/p&&p&先看这段代码&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span class=&k&&class&/span& &span class=&nc&&Cycle&/span&&span class=&p&&(&/span&&span class=&nb&&object&/span&&span class=&p&&):&/span&
&span class=&k&&def&/span& &span class=&nf&&__init__&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span&&span class=&n&&r&/span&&span class=&p&&):&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&pi&/span&&span class=&o&&=&/span&&span class=&mf&&3.1415926&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&r&/span&&span class=&o&&=&/span&&span class=&n&&r&/span&
&span class=&n&&a&/span&&span class=&o&&=&/span&&span class=&n&&Cycle&/span&&span class=&p&&(&/span&&span class=&mi&&10&/span&&span class=&p&&)&/span&
&span class=&n&&b&/span&&span class=&o&&=&/span&&span class=&n&&Cycle&/span&&span class=&p&&(&/span&&span class=&mi&&7&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&首先,你们经常看到这样一个情况,为什么,我们通常定义的方法,为什么第一个参数需要是 self ,其实很简单,用来和具体实例绑定的。&/p&&p&你看,我们这一段代码,将 Cycle 实例化了两次,最后你输出 a.r 和 b.r 彼此的值是不一样的。&/p&&p&那么实例变量的定义就很清晰了&/p&&blockquote&和实例绑定的变量,即实例变量,实例之间各自数据隔离,互不通用。&/blockquote&&p&好了,那么什么是类变量呢?&/p&&p&你看我们上面用 Cycle 这个类来描述一个圆。里面存在着一个变量 pi ,不同的圆,其 pi 值固定,那么我们可以将其抽象出来,诸多圆实例共享一个变量 pi&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span class=&k&&class&/span& &span class=&nc&&Cycle&/span&&span class=&p&&(&/span&&span class=&nb&&object&/span&&span class=&p&&):&/span&
&span class=&n&&pi&/span&&span class=&o&&=&/span&&span class=&mf&&3.1415926&/span&
&span class=&k&&def&/span& &span class=&nf&&__init__&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&,&/span&&span class=&n&&r&/span&&span class=&p&&):&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&r&/span&&span class=&o&&=&/span&&span class=&n&&r&/span&
&span class=&n&&a&/span&&span class=&o&&=&/span&&span class=&n&&Cycle&/span&&span class=&p&&(&/span&&span class=&mi&&10&/span&&span class=&p&&)&/span&
&span class=&n&&b&/span&&span class=&o&&=&/span&&span class=&n&&Cycle&/span&&span class=&p&&(&/span&&span class=&mi&&7&/span&&span class=&p&&)&/span&
&/code&&/pre&&/div&&p&好了,这里可以得到我们一个概念,什么是类变量呢?&/p&&blockquote&和类进行绑定的变量,该类的实例之间可以共享变量&/blockquote&&p&好了,我们又想问问题了,那么为什么实例可以访问类变量呢?&/p&&p&很简单,在我们调用具体变量的时候,遵循如下的查找规则&/p&&blockquote&1. 优先从实例中查找变量,如果没查找到执行 2&br&2. 从类中查找变量,如果没查找到执行 3&br&3. 按照继承链继续查找,直到找到或者到顶端没找到抛出异常为止&/blockquote&&p&好了,回答你现在的问题&/p&&p&首先你的代码是这样的&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span class=&k&&class&/span& &span class=&nc&&test&/span&&span class=&p&&:&/span&
&span class=&n&&a&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span&&span class=&o&&*&/span&&span class=&mi&&30&/span&
&span class=&n&&x&/span&&span class=&o&&=&/span&&span class=&n&&test&/span&&span class=&p&&()&/span&
&span class=&n&&x&/span&&span class=&o&&.&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span&&span class=&o&&=&/span&&span class=&mi&&100&/span&
&span class=&n&&y&/span&&span class=&o&&=&/span&&span class=&n&&test&/span&&span class=&p&&()&/span&
&span class=&nb&&print&/span&&span class=&p&&(&/span&&span class=&n&&y&/span&&span class=&o&&.&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&
&/code&&/pre&&/div&&p&我们来详细分析下&/p&&p&首先你声明了一个类变量 a ,值为 list 里面包含了30个元素&/p&&p&然后你实例化了一个实例 x&/p&&p&接着执行&b& x.a[1]=100&/b&&/p&&p&这一步发生了很多隐式的操作,我们慢慢讲&/p&&p&首先,根据我们前面说的变量查找规则,在实例中没有查找到 a 这个变量后,然后向上到类里查找,诶!查找到了 a 这个 list ,紧接着,调用 list 中的方法 &b&__setitem__ &/b&来设置 list 中的第 2 个元素的值为 100 。诶?发现没有,我们这里,还是对类变量中的值进行修改了。&/p&&p&好了重新复习下我们类变量的概念&/p&&blockquote&和类进行绑定的变量,该类的实例之间可以共享变量&/blockquote&&p&恩,你看,你在你前面对类变量值进行修改了。然后类变量是被实例共享的,所以你第二次实例化操作得到的实例 y 后,&b&y.a[1] &/b&得到的是不是我们修改后的值喵?&/p&&p&&br&&/p&&p&好了,再看你下一段代码&/p&&div class=&highlight&&&pre&&code class=&language-python3&&&span class=&k&&class&/span& &span class=&nc&&test&/span&&span class=&p&&:&/span&
&span class=&n&&a&/span&&span class=&o&&=&/span&&span class=&k&&None&/span&
&span class=&k&&def&/span& &span class=&nf&&__init__&/span&&span class=&p&&(&/span&&span class=&bp&&self&/span&&span class=&p&&):&/span&
&span class=&bp&&self&/span&&span class=&o&&.&/span&&span class=&n&&a&/span&&span class=&o&&=&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span&&span class=&o&&*&/span&&span class=&mi&&30&/span&
&span class=&n&&x&/span&&span class=&o&&=&/span&&span class=&n&&test&/span&&span class=&p&&()&/span&
&span class=&n&&x&/span&&span class=&o&&.&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&]&/span&&span class=&o&&=&/span&&span class=&mi&&100&/span&
&span class=&n&&y&/span&&span class=&o&&=&/span&&span class=&n&&test&/span&&span class=&p&&()&/span&
&span class=&nb&&print&/span&&span class=&p&&(&/span&&span class=&n&&y&/span&&span class=&o&&.&/span&&span class=&n&&a&/span&&span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&])&/span&
&/code&&/pre&&/div&&p&你看,在你 __init__ 方法中,是不是声明了一个实例变量 a ,复习下我们实例变量的概念&/p&&blockquote&和实例绑定的变量,即实例变量,实例之间各自数据隔离,互不通用。&/blockquote&&p&和实例绑定的变量,实例之间彼此数据隔离,互不通用。&/p&&p&那么你两个实例 x,y 不管怎么修改,是不是只修改了和实例绑定的变量值,并不会影响其余实例的表现。&/p&&p&&br&&/p&&p&恩,这样是不是差不多可以很方便的理解了?&/p&
真巧,最近讲课的时候也反复强调了这个。首先说结论,这个本质是类变量和实例变量之间的差别正文:首先什么是实例变量先看这段代码class Cycle(object):
def __init__(self,r):
self.pi=3.1415926
a=Cycle(10)
b=Cycle(7)首先,你们经常看到这…
先来说极小极大算法主要应用于什么样的游戏:&br&
1. 零和游戏(Zero-sum Game):意思就是你死我活,一方的胜利代表另一方的失败,比如,象棋,五子棋等。&br&
2. 完全信息(Perfect Information):玩家知道之前所有的步骤。象棋就是完全信息,因为玩家是交替着落子,且之前的步骤都能在棋盘上体现,但是石头剪子布就不是。&br&这样的游戏通常可以把他们看作一个树状图,把每一种可能性列出来。比如下面这个井字棋游戏,Max代表你自己,Min代表你的对手。&br&&figure&&img data-rawheight=&526& src=&https://pic4.zhimg.com/50/v2-4037bfaf414_b.jpg& data-rawwidth=&792& class=&origin_image zh-lightbox-thumb& width=&792& data-original=&https://pic4.zhimg.com/50/v2-4037bfaf414_r.jpg&&&/figure&这个时候我们需要给每一种结果一个分数,就是这里的Utility。这个分数是站在我自己(也就是Max)的角度评估的,比如上图中我赢了就是+1,输了是-1,平局时0。所以,我希望最大化这个分数,而我的对手希望最小化这个分数。(在游戏中,这个分数被称为static value。)这里要说一下,井字棋是个比较简单的游戏,所以可以列出所有可能的结果。但是,大部分游戏是不太可能把所有结果都列出来的。根据计算机运算量,我们可能只能往前推7,8步,所以这个时候分数就不只-1,1,0这么简单了,会有专门的算法来根据当前结果给不同的分数。&br&假设我们有如下图的游戏,我是先手,我应该如何利用Minmax算法来选出第一步怎么走呢?&br&&figure&&img data-rawheight=&842& src=&https://pic4.zhimg.com/50/v2-4bc20188baf14f03a169f0c466b640a9_b.jpg& data-rawwidth=&1446& class=&origin_image zh-lightbox-thumb& width=&1446& data-original=&https://pic4.zhimg.com/50/v2-4bc20188baf14f03a169f0c466b640a9_r.jpg&&&/figure&这个时候我们就要从结果看起,也就是第4步。图中标注第四步是我的对手下的,所以他要做的是最小化这个分数,于是对手根据结果可以反推出如下选择&br&&figure&&img data-rawheight=&736& src=&https://pic1.zhimg.com/50/v2-a49a799c917fa6b76196fcc_b.jpg& data-rawwidth=&1244& class=&origin_image zh-lightbox-thumb& width=&1244& data-original=&https://pic1.zhimg.com/50/v2-a49a799c917fa6b76196fcc_r.jpg&&&/figure&继续从后往前看到第3步,当我们知道了对手的选择以后,我们可以根据对手的结果反推出自己的选择,我们要做的是最大化这个分数,如图&br&&figure&&img data-rawheight=&712& src=&https://pic3.zhimg.com/50/v2-a605fbf72a4a9c55d9cd81a_b.jpg& data-rawwidth=&1244& class=&origin_image zh-lightbox-thumb& width=&1244& data-original=&https://pic3.zhimg.com/50/v2-a605fbf72a4a9c55d9cd81a_r.jpg&&&/figure&重复这个步骤,我们最终可以发现第一步的最优选择,如图&br&&figure&&img data-rawheight=&768& src=&https://pic2.zhimg.com/50/v2-dff08f702f27c3d_b.jpg& data-rawwidth=&1334& class=&origin_image zh-lightbox-thumb& width=&1334& data-original=&https://pic2.zhimg.com/50/v2-dff08f702f27c3d_r.jpg&&&/figure&以上就是极小极大算法(Minimax)。&br&&br&当然对于一个复杂的游戏来说,比如象棋,肯定是需要非常多步才能完成的。这就导致结果的数量是成几何增长的,也就是说,如果这个游戏每一步都有n个选择,那么在x步以后,将会有n^x个选择。这个时候,我们就需要采取剪枝算法(Alpha-Beta)来减少运算量。从剪枝算法这个名字我们就能看出,这个算法能让我们剪掉树状图中的一些分支,从而减少运算量。在这里也说一下剪枝算法,因为这并不是个不同于极小极大的算法,而是极小极大算法的升级版。&br&我们将游戏简化成如下图,使用Minimax算法,我们可以得出这样的结果&br&&figure&&img data-rawheight=&436& src=&https://pic3.zhimg.com/50/v2-af20acdf436c2704653eba_b.jpg& data-rawwidth=&1244& class=&origin_image zh-lightbox-thumb& width=&1244& data-original=&https://pic3.zhimg.com/50/v2-af20acdf436c2704653eba_r.jpg&&&/figure&但是,最后一步的分数其实也需要计算机来算(static evaluation),所以我们并不会一开始就有所有的数据,其实我们一开始是这样的&br&&figure&&img data-rawheight=&436& src=&https://pic4.zhimg.com/50/v2-1ec6f9f037a01c02a3186d59fbf820db_b.jpg& data-rawwidth=&1256& class=&origin_image zh-lightbox-thumb& width=&1256& data-original=&https://pic4.zhimg.com/50/v2-1ec6f9f037a01c02a3186d59fbf820db_r.jpg&&&/figure&然后,计算机给出了第一个分数&br&&figure&&img data-rawheight=&410& src=&https://pic2.zhimg.com/50/v2-9db71ea404506bdf1b8346103dca421b_b.jpg& data-rawwidth=&1268& class=&origin_image zh-lightbox-thumb& width=&1268& data-original=&https://pic2.zhimg.com/50/v2-9db71ea404506bdf1b8346103dca421b_r.jpg&&&/figure&当给出了这个分数的时候,我们站在步骤1看,无论另一分支的数字是多少,步骤1左边方框的数字不会超过2。因为第2步是我的对手下的,他希望分数尽可能的小,也就是这样的&br&&figure&&img data-rawheight=&408& src=&https://pic4.zhimg.com/50/v2-4b4cc86b1f_b.jpg& data-rawwidth=&1250& class=&origin_image zh-lightbox-thumb& width=&1250& data-original=&https://pic4.zhimg.com/50/v2-4b4cc86b1f_r.jpg&&&/figure&这个时候,电脑再计算另一分支的分数,也就是7。知道另一分数是7以后,也就知道步骤1的左边方框分数为2。这时,我们往前看一步(步骤0)。步骤0的分数是大于等于2,因为我要最大化分数。如图&br&&figure&&img data-rawheight=&414& src=&https://pic1.zhimg.com/50/v2-ebe6a71b330c5b31d0e4c_b.jpg& data-rawwidth=&1258& class=&origin_image zh-lightbox-thumb& width=&1258& data-original=&https://pic1.zhimg.com/50/v2-ebe6a71b330c5b31d0e4c_r.jpg&&&/figure&现在,再来计算右边分支的分数,得到了1。同理,我们站在步骤1来看,右边方框中的数不会超过1,如图&br&&figure&&img data-rawheight=&414& src=&https://pic1.zhimg.com/50/v2-1b37f806ddcc831f574a_b.jpg& data-rawwidth=&1238& class=&origin_image zh-lightbox-thumb& width=&1238& data-original=&https://pic1.zhimg.com/50/v2-1b37f806ddcc831f574a_r.jpg&&&/figure&在这个情况下,即使我不算最后一个数字,我也能知道在步骤0的结果为2,因为已知步骤1中的右边方框,数值不会超过1。所以我们就能直接知道结果,也就是&br&&figure&&img data-rawheight=&432& src=&https://pic3.zhimg.com/50/v2-da4ebf18e361f0259fe4f_b.jpg& data-rawwidth=&1244& class=&origin_image zh-lightbox-thumb& width=&1244& data-original=&https://pic3.zhimg.com/50/v2-da4ebf18e361f0259fe4f_r.jpg&&&/figure&&br&我们可以看到,加上剪枝算法,我们不仅得到了相同的结果,而且减少了计算量。在实际应用中,加上剪枝算法,计算机大约需要算2*n^(x/2)个结果,如果n为分支数,x为步数。相比于之前仅用极小极大算法的n^x,效率提高了很多。这也就意味着,如果在象棋比赛中,假设使用极小极大的算法,计算机能往前评估7步,加上剪枝算法,计算机能往前评估14步。极小极大和剪枝算法曾在IBM开发的国际象棋超级电脑,深蓝(Deep Blue)中被应用,并且两次打败当时的世界国际象棋冠军。
先来说极小极大算法主要应用于什么样的游戏: 1. 零和游戏(Zero-sum Game):意思就是你死我活,一方的胜利代表另一方的失败,比如,象棋,五子棋等。 2. 完全信息(Perfect Information):玩家知道之前所有的步骤。象棋就是完全信息,因为玩家是交替着落…
&p&机器学习界有一群炼丹师,他们每天的日常是:&/p&&p&&br&&/p&&p&拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了。&/p&&p&&br&&/p&&p&不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了,这出来的口味可是千差万别。火小了夹生,火大了易糊,火不匀则半生半糊。&/p&&p&&br&&/p&&p&机器学习也是一样,模型优化算法的选择直接关系到最终模型的性能。有时候效果不好,未必是特征的问题或者模型设计的问题,很可能就是优化算法的问题。&/p&&p&&br&&/p&&p&说到优化算法,入门级必从SGD学起,老司机则会告诉你更好的还有AdaGrad/AdaDelta,或者直接无脑用Adam。可是看看学术界的最新paper,却发现一众大神还在用着入门级的SGD,最多加个Moment或者Nesterov ,还经常会黑一下Adam。比如 UC Berkeley的一篇论文就在Conclusion中写道:&/p&&p&&br&&/p&&blockquote&Despite the fact that our experimental evidence demonstrates that adaptive
methods are not advantageous for machine learning, the Adam algorithm remains incredibly popular. We are not sure exactly as to why ……&/blockquote&&p&&br&&/p&&p&无奈与酸楚之情溢于言表。&/p&&p&&br&&/p&&p&这是为什么呢?难道平平淡淡才是真?&/p&&hr&&h2&一个框架回顾优化算法&/h2&&p&&br&&/p&&p&首先我们来回顾一下各类优化算法。&/p&&p&&br&&/p&&p&深度学习优化算法经历了 SGD -& SGDM -& NAG -&AdaGrad -& AdaDelta -& Adam -& Nadam 这样的发展历程。Google一下就可以看到很多的教程文章,详细告诉你这些算法是如何一步一步演变而来的。在这里,我们换一个思路,用一个框架来梳理所有的优化算法,做一个更加高屋建瓴的对比。&/p&&p&&br&&/p&&p&首先定义:待优化参数: &img src=&https://www.zhihu.com/equation?tex=w& alt=&w& eeimg=&1&& ,目标函数: &img src=&https://www.zhihu.com/equation?tex=f%28w%29& alt=&f(w)& eeimg=&1&& ,初始学习率 &img src=&https://www.zhihu.com/equation?tex=%5Calpha& alt=&\alpha& eeimg=&1&&。&/p&&p&而后,开始进行迭代优化。在每个epoch &img src=&https://www.zhihu.com/equation?tex=t& alt=&t& eeimg=&1&& :&/p&&ol&&li&计算目标函数关于当前参数的梯度: &img src=&https://www.zhihu.com/equation?tex=g_t%3D%5Cnabla+f%28w_t%29& alt=&g_t=\nabla f(w_t)& eeimg=&1&&&/li&&li&根据历史梯度计算一阶动量和二阶动量:&img src=&https://www.zhihu.com/equation?tex=m_t+%3D+%5Cphi%28g_1%2C+g_2%2C+%5Ccdots%2C+g_t%29%3B+V_t+%3D+%5Cpsi%28g_1%2C+g_2%2C+%5Ccdots%2C+g_t%29& alt=&m_t = \phi(g_1, g_2, \cdots, g_t); V_t = \psi(g_1, g_2, \cdots, g_t)& eeimg=&1&&,&/li&&li&计算当前时刻的下降梯度: &img src=&https://www.zhihu.com/equation?tex=%5Ceta_t+%3D+%5Calpha+%5Ccdot+m_t+%2F+%5Csqrt%7BV_t%7D& alt=&\eta_t = \alpha \cdot m_t / \sqrt{V_t}& eeimg=&1&&&/li&&li&根据下降梯度进行更新: &img src=&https://www.zhihu.com/equation?tex=w_%7Bt%2B1%7D+%3D+w_t+-+%5Ceta_t& alt=&w_{t+1} = w_t - \eta_t& eeimg=&1&&&/li&&/ol&&p&掌握了这个框架,你可以轻轻松松设计自己的优化算法。&/p&&p&&br&&/p&&p&我们拿着这个框架,来照一照各种玄乎其玄的优化算法的真身。步骤3、4对于各个算法都是一致的,主要的差别就体现在1和2上。&/p&&p&&br&&/p&&h2&SGD&/h2&&p&先来看SGD。SGD没有动量的概念,也就是说:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=m_t+%3D+g_t%3B+V_t+%3D+I%5E2& alt=&m_t = g_t; V_t = I^2& eeimg=&1&&&/p&&p&代入步骤3,可以看到下降梯度就是最简单的&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Ceta_t+%3D+%5Calpha+%5Ccdot+g_t+& alt=&\eta_t = \alpha \cdot g_t & eeimg=&1&&&/p&&p&SGD最大的缺点是下降速度慢,而且可能会在沟壑的两边持续震荡,停留在一个局部最优点。&/p&&p&&br&&/p&&h2&SGD with Momentum&/h2&&p&为了抑制SGD的震荡,SGDM认为梯度下降过程可以加入惯性。下坡的时候,如果发现是陡坡,那就利用惯性跑的快一些。SGDM全称是SGD with momentum,在SGD基础上引入了一阶动量:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=m_t+%3D+%5Cbeta_1+%5Ccdot+m_%7Bt-1%7D+%2B+%281-%5Cbeta_1%29%5Ccdot+g_t& alt=&m_t = \beta_1 \cdot m_{t-1} + (1-\beta_1)\cdot g_t& eeimg=&1&&&/p&&p&一阶动量是各个时刻梯度方向的指数移动平均值,约等于最近 &img src=&https://www.zhihu.com/equation?tex=1%2F%281-%5Cbeta_1%29& alt=&1/(1-\beta_1)& eeimg=&1&& 个时刻的梯度向量和的平均值。&/p&&p&&br&&/p&&p&也就是说,t时刻的下降方向,不仅由当前点的梯度方向决定,而且由此前累积的下降方向决定。 &img src=&https://www.zhihu.com/equation?tex=%5Cbeta_1& alt=&\beta_1& eeimg=&1&& 的经验值为0.9,这就意味着下降方向主要是此前累积的下降方向,并略微偏向当前时刻的下降方向。想象高速公路上汽车转弯,在高速向前的同时略微偏向,急转弯可是要出事的。&/p&&p&&br&&/p&&h2&SGD with Nesterov
Acceleration &/h2&&p&SGD 还有一个问题是困在局部最优的沟壑里面震荡。想象一下你走到一个盆地,四周都是略高的小山,你觉得没有下坡的方向,那就只能待在这里了。可是如果你爬上高地,就会发现外面的世界还很广阔。因此,我们不能停留在当前位置去观察未来的方向,而要向前一步、多看一步、看远一些。&/p&&p&&br&&/p&&p&NAG全称Nesterov
Accelerated Gradient,是在SGD、SGD-M的基础上的进一步改进,改进点在于步骤1。我们知道在时刻t的主要下降方向是由累积动量决定的,自己的梯度方向说了也不算,那与其看当前梯度方向,不如先看看如果跟着累积动量走了一步,那个时候再怎么走。因此,NAG在步骤1,不计算当前位置的梯度方向,而是计算如果按照累积动量走了一步,那个时候的下降方向:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=g_t%3D%5Cnabla+f%28w_t-%5Calpha+%5Ccdot+m_%7Bt-1%7D+%2F+%5Csqrt%7BV_%7Bt-1%7D%7D%29& alt=&g_t=\nabla f(w_t-\alpha \cdot m_{t-1} / \sqrt{V_{t-1}})& eeimg=&1&&&/p&&p&然后用下一个点的梯度方向,与历史累积动量相结合,计算步骤2中当前时刻的累积动量。&/p&&p&&br&&/p&&h2&AdaGrad&/h2&&p&此前我们都没有用到二阶动量。二阶动量的出现,才意味着“自适应学习率”优化算法时代的到来。SGD及其变种以同样的学习率更新每个参数,但深度神经网络往往包含大量的参数,这些参数并不是总会用得到(想想大规模的embedding)。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。&/p&&p&&br&&/p&&p&怎么样去度量历史更新频率呢?那就是二阶动量——该维度上,迄今为止所有梯度值的平方和:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=V_t+%3D+%5Csum_%7B%5Ctau%3D1%7D%5E%7Bt%7D+g_%5Ctau%5E2& alt=&V_t = \sum_{\tau=1}^{t} g_\tau^2& eeimg=&1&&&/p&&p&我们再回顾一下步骤3中的下降梯度:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Ceta_t+%3D+%5Calpha+%5Ccdot+m_t+%2F+%5Csqrt%7BV_t%7D& alt=&\eta_t = \alpha \cdot m_t / \sqrt{V_t}& eeimg=&1&&&/p&&p&可以看出,此时实质上的学习率由 &img src=&https://www.zhihu.com/equation?tex=+%5Calpha& alt=& \alpha& eeimg=&1&& 变成了 &img src=&https://www.zhihu.com/equation?tex=+%5Calpha+%2F+%5Csqrt%7BV_t%7D& alt=& \alpha / \sqrt{V_t}& eeimg=&1&& 。 一般为了避免分母为0,会在分母上加一个小的平滑项。因此&img src=&https://www.zhihu.com/equation?tex=%5Csqrt%7BV_t%7D& alt=&\sqrt{V_t}& eeimg=&1&& 是恒大于0的,而且参数更新越频繁,二阶动量越大,学习率就越小。&/p&&p&&br&&/p&&p&这一方法在稀疏数据场景下表现非常好。但也存在一些问题:因为&img src=&https://www.zhihu.com/equation?tex=%5Csqrt%7BV_t%7D& alt=&\sqrt{V_t}& eeimg=&1&& 是单调递增的,会使得学习率单调递减至0,可能会使得训练过程提前结束,即便后续还有数据也无法学到必要的知识。&/p&&p&&br&&/p&&h2&AdaDelta / RMSProp&/h2&&p&&br&&/p&&p&由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度。这也就是AdaDelta名称中Delta的来历。&/p&&p&&br&&/p&&p&修改的思路很简单。前面我们讲到,指数移动平均值大约就是过去一段时间的平均值,因此我们用这一方法来计算二阶累积动量:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=V_t+%3D+%5Cbeta_2+%2A+V_%7Bt-1%7D+%2B+%281-%5Cbeta_2%29+g_t%5E2& alt=&V_t = \beta_2 * V_{t-1} + (1-\beta_2) g_t^2& eeimg=&1&&&/p&&p&这就避免了二阶动量持续累积、导致训练过程提前结束的问题了。&/p&&p&&br&&/p&&h2&Adam&/h2&&p&&br&&/p&&p&谈到这里,Adam和Nadam的出现就很自然而然了——它们是前述方法的集大成者。我们看到,SGD-M在SGD基础上增加了一阶动量,AdaGrad和AdaDelta在SGD基础上增加了二阶动量。把一阶动量和二阶动量都用起来,就是Adam了——Adaptive + Momentum。&/p&&p&&br&&/p&&p&SGD的一阶动量:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=m_t+%3D+%5Cbeta_1+%5Ccdot+m_%7Bt-1%7D+%2B+%281-%5Cbeta_1%29%5Ccdot+g_t& alt=&m_t = \beta_1 \cdot m_{t-1} + (1-\beta_1)\cdot g_t& eeimg=&1&&&/p&&p&加上AdaDelta的二阶动量:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=V_t+%3D+%5Cbeta_2+%2A+V_%7Bt-1%7D+%2B+%281-%5Cbeta_2%29+g_t%5E2& alt=&V_t = \beta_2 * V_{t-1} + (1-\beta_2) g_t^2& eeimg=&1&&&/p&&p&&br&&/p&&p&优化算法里最常见的两个超参数 &img src=&https://www.zhihu.com/equation?tex=+%5Cbeta_1%2C+%5Cbeta_2& alt=& \beta_1, \beta_2& eeimg=&1&& 就都在这里了,前者控制一阶动量,后者控制二阶动量。&/p&&p&&br&&/p&&h2&Nadam&/h2&&p&&br&&/p&&p&最后是Nadam。我们说Adam是集大成者,但它居然遗漏了Nesterov,这还能忍?必须给它加上,按照NAG的步骤1:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=g_t%3D%5Cnabla+f%28w_t-%5Calpha+%5Ccdot+m_%7Bt-1%7D+%2F+%5Csqrt%7BV_t%7D%29& alt=&g_t=\nabla f(w_t-\alpha \cdot m_{t-1} / \sqrt{V_t})& eeimg=&1&&&/p&&p&这就是Nesterov + Adam = Nadam了。&/p&&p&&br&&/p&&p&说到这里,大概可以理解为什么j经常有人说 Adam / Nadam 目前最主流、最好用的优化算法了。新手上路,先拿来一试,收敛速度嗖嗖滴,效果也是杠杠滴。&/p&&p&&br&&/p&&p&那为什么Adam还老招人黑,被学术界一顿鄙夷?难道只是为了发paper灌水吗?&/p&&p&&br&&/p&&p&请继续阅读:&/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Adam那么棒,为什么还对SGD念念不忘 (2)—— Adam的两宗罪&/a& &/p&&p&&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略&/a&&/p&&p&&br&&/p&&p&————————————————————&/p&&h2&补充:指数移动平均值的偏差修正&/h2&&p&&br&&/p&&p&前面我们讲到,一阶动量和二阶动量都是按照指数移动平均值进行计算的:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=m_t+%3D+%5Cbeta_1+%5Ccdot+m_%7Bt-1%7D+%2B+%281-%5Cbeta_1%29%5Ccdot+g_t& alt=&m_t = \beta_1 \cdot m_{t-1} + (1-\beta_1)\cdot g_t& eeimg=&1&&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=V_t+%3D+%5Cbeta_2+%5Ccdot+V_%7Bt-1%7D+%2B+%281-%5Cbeta_2%29+%5Ccdot+g_t%5E2& alt=&V_t = \beta_2 \cdot V_{t-1} + (1-\beta_2) \cdot g_t^2& eeimg=&1&&&/p&&p&实际使用过程中,参数的经验值是&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Cbeta_1%3D0.9%2C+%5Cbeta_2%3D0.999& alt=&\beta_1=0.9, \beta_2=0.999& eeimg=&1&&&/p&&p&初始化:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=m_0%3D0%2C+V_0%3D0& alt=&m_0=0, V_0=0& eeimg=&1&&&/p&&p&这个时候我们看到,在初期, &img src=&https://www.zhihu.com/equation?tex=m_t%2C+V_t& alt=&m_t, V_t& eeimg=&1&& 都会接近于0,这个估计是有问题的。因此我们常常根据下式进行误差修正:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Ctilde%7Bm%7D_t+%3D+m_t+%2F+%281-%5Cbeta_1%5Et%29& alt=&\tilde{m}_t = m_t / (1-\beta_1^t)& eeimg=&1&&&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Ctilde%7BV%7D_t+%3D+V_t+%2F+%281-%5Cbeta_2%5Et%29& alt=&\tilde{V}_t = V_t / (1-\beta_2^t)& eeimg=&1&&&/p&&p&&br&&/p&&p&————————————————————&/p&&p&行有所思,学有所得,陋鄙之言,请多指教。&/p&&p&欢迎关注我的微信公众号 Julius-AI&/p&&p&&/p&&p&&/p&&p&&/p&
机器学习界有一群炼丹师,他们每天的日常是: 拿来药材(数据),架起八卦炉(模型),点着六味真火(优化算法),就摇着蒲扇等着丹药出炉了。 不过,当过厨子的都知道,同样的食材,同样的菜谱,但火候不一样了,这出来的口味可是千差万别。火小了夹生,火…
&figure&&img src=&https://pic3.zhimg.com/v2-cea136e251f4dcb25f517ad51d835fd5_b.jpg& data-rawwidth=&4266& data-rawheight=&3200& class=&origin_image zh-lightbox-thumb& width=&4266& data-original=&https://pic3.zhimg.com/v2-cea136e251f4dcb25f517ad51d835fd5_r.jpg&&&/figure&&h2&前言&/h2&&p&人工智能,一个令人熟悉但却始终倍感陌生的词汇。让人熟悉的是科幻作家艾萨克·阿西莫夫笔下的《机械公敌》和《机器管家》,令人陌生的却是到底如何让现有的机器人咿呀学语邯郸学步;让人熟悉的是计算机科学与人工智能之父图灵设想的“图灵测试”,令人陌生的却是如何使如此的高级智能在现实生活中不再子虚乌有;让人熟悉的是2016年初阿尔法狗与李世石的五番棋对决,令人陌生的却是阿尔法狗究竟如何打通了“任督二脉”……不可否认,人工智能就是人类为了满足自身强大好奇心而脑洞大开的产物,现在提及人工智能,就不得不提阿尔法狗,提起阿尔法狗就又不得不提到深度学习。深度学习究竟为何物?&/p&&p&本书从实用角度着重解析了深度学习中的一类神经网络模型——卷积神经网络,向读者剖析了卷积神经网络的基本部件与工作机理,更重要的是系统性的介绍了深度卷积神经网络在实践应用方面的细节配置与工程经验。笔者希望本书“小而精”,避免像某些国外相关书籍一样浅尝辄止的“大而空”。&/p&&p&写作本书的主因源自笔者曾于2015年10月在&a href=&https://link.zhihu.com/?target=http%3A//lamda.nju.edu.cn/weixs& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&个人主页&/a&上开放的一个英文深度学习学习资料“深度神经网络之必会技巧”(&i&&a href=&https://link.zhihu.com/?target=http%3A//lamda.nju.edu.cn/weixs/project/CNNTricks/CNNTricks.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Must Know Tips/Tricks in Deep Neural Networks&/a&&/i&)。该资料随后被转帖至新浪微博,颇受学术界和工业界朋友好评,至今已有逾31万的阅读量,后又被国际知名论坛&i&KDnuggets&/i&和&i&Data Science Central&/i&特邀转载。期间曾接收到不少国内外读过此学习资料的朋友微博私信或邮件来信表示感谢,其中不乏有人提到希望开放一个中文版本以方便国人阅读学习。另一方面,随着深度学习领域发展的日新月异,当时总结整理的学习资料现在看来已略显滞后,一些最新研究成果并未涵盖其中,同时加上国内至今尚无一本侧重实践的深度学习方面的中文书籍。因此,笔者笔耕不辍,希望将自己些许的所知所得所感及所悟汇总于本书中,分享给大家供学习和查阅。&/p&&p&这是一本面向中文读者轻量级、偏实用的深度学习工具书,本书内容侧重深度卷积神经网络的基础知识和实践应用。为了使更多不同技术背景的读者通过本书对卷积神经网络和深度学习有所了解,笔者试图尽可能少的使用晦涩的数学公式而尽可能多的使用具体的图表形象表达。本书的受众为对卷积神经网络和深度学习感兴趣的入门者,以及没有机器学习背景但希望能快速掌握该方面知识并将其应用于实际问题的各行从业者。为方便读者,本书附录给出了一些相关数学基础知识简介。&/p&&p&全书共14章,除“绪论”外可分为2个篇章:第一篇“基础理论篇”包括第1~4章,介绍卷积神经网络的基础知识、基本部件、经典结构和模型压缩等基础理论内容;第二篇“实践应用篇”包括第5~14章,介绍深度卷积神经网络自数据准备始,到模型参数初始化、不同网络部件的选择、网络配置、网络模型训练、不平衡数据处理,最终直到模型集成等实践应用技巧和经验。另外,本书基本在每章结束均有对应小结,读者在阅读完每章内容后不妨掩卷回忆,看是否完全掌握此章节重点。对卷积神经网络和深度学习感兴趣的读者可通读全书,做到“理论结合实践”;对于希望将深度卷积神经网络迅速应用来解决实际问题的读者,也可直接参考第二篇的有关内容,做到“有的放矢”。&/p&&p&本书写作过程得到笔者很多同学和学术界工业界朋友的支持和帮助,在此谨列出他们的姓名以致谢意(按姓氏拼音序):高斌斌,高如如,罗建豪,屈伟洋,谢晨伟,杨世才,张晨麟。感谢高斌斌和罗建豪帮助起草本书第3.2.4节和第4章的有关内容。此外,特别感谢南京大学、澳大利亚阿德莱德大学等高校的众多师长在笔者求学科研过程中不厌其烦细致入微的指导、教育和关怀。最后非常感谢笔者的父母,感谢他们的养育和一直以来的理解、体贴与照顾。写就本书,笔者自认才疏学浅,仅略知皮毛,更兼时间和精力有限,书中错谬之处在所难免,若蒙读者不弃还望不吝赐教,将不胜感激。&/p&&p&&br&&/p&&h2&严正声明&/h2&&ul&&li&&u&本书可免费用于学习和研究目的,可自由传播,但切勿擅自用于商业用途或私自引用,笔者保留著作权相关权利。&/u&&/li&&li&&u&本书勘误烦请发送邮件至weixs.。&/u&&/li&&li&&u&本书版本为17.05,成书于2017年五月。&/u&&/li&&/ul&&p&&br&&/p&&h2&下载资源&/h2&&p&&a href=&https://link.zhihu.com/?target=http%3A//lamda.nju.edu.cn/weixs/book/CNN_book.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《解析卷积神经网络-深度学习实践手册》&/a&&/p&&p&&br&&/p&&h2&目录&/h2&&figure&&img src=&https://pic3.zhimg.com/v2-6be38cb4e4fd85e4bcdad5e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&898& data-rawheight=&1134& class=&origin_image zh-lightbox-thumb& width=&898& data-original=&https://pic3.zhimg.com/v2-6be38cb4e4fd85e4bcdad5e_r.jpg&&&/figure&&figure&&img src=&https://pic3.zhimg.com/v2-e230d960d5a398c5f29b359_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&884& data-rawheight=&1344& class=&origin_image zh-lightbox-thumb& width=&884& data-original=&https://pic3.zhimg.com/v2-e230d960d5a398c5f29b359_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-f6b1dac9881bfbf3b170f8d7acad62ac_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&874& data-rawheight=&1342& class=&origin_image zh-lightbox-thumb& width=&874& data-original=&https://pic4.zhimg.com/v2-f6b1dac9881bfbf3b170f8d7acad62ac_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-ec206dcec7c7d69aee8fd91aa60b0644_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&896& data-rawheight=&1342& class=&origin_image zh-lightbox-thumb& width=&896& data-original=&https://pic2.zhimg.com/v2-ec206dcec7c7d69aee8fd91aa60b0644_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-ca7e410fc3f4fdef1f061bef50927fd7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&888& data-rawheight=&1330& class=&origin_image zh-lightbox-thumb& width=&888& data-original=&https://pic4.zhimg.com/v2-ca7e410fc3f4fdef1f061bef50927fd7_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/v2-82f7fbce2bb54e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&890& data-rawheight=&646& class=&origin_image zh-lightbox-thumb& width=&890& data-original=&https://pic1.zhimg.com/v2-82f7fbce2bb54e_r.jpg&&&/figure&&p&&/p&
前言人工智能,一个令人熟悉但却始终倍感陌生的词汇。让人熟悉的是科幻作家艾萨克·阿西莫夫笔下的《机械公敌》和《机器管家》,令人陌生的却是到底如何让现有的机器人咿呀学语邯郸学步;让人熟悉的是计算机科学与人工智能之父图灵设想的“图灵测试”,令人…
&p&Hinton, 这个深度学习的缔造者( 参考 &a href=&//link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzIzMjU1NTg3Ng%3D%3D%26mid%3D%26idx%3D1%26sn%3Dceddf7c848dd%26chksm%3De8925722dfe5de34b86f95cff9b4fa42ccca6fef1a3%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&攒说 Geoff Hinton&/a& ) , Jordan 当世概率图模型的集大成者(参考 “&a href=&//link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzIzMjU1NTg3Ng%3D%3D%26mid%3D%26idx%3D1%26sn%3D9bc88f800c3b7achksm%3De892515fdfe5decd896d6c291f1d7a9f45babcae3dd4%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&乔丹上海行&/a&”), 他们碰撞的领域就是EM算法!这个是PCA外的,另外一个&b&无监督学习的经典&/b&。&/p&&p&他们怎么认识的呢?Jordan的导师,就是著名的链接主义核心人物Rumelhart&br&&/p&&p&&b&为什么说EM算法是他们强强发力的领域呢?&/b&&/p&&p&这里我们讨论Hinton和统计大神Jordan的强强发力的领域。当Bayes网络发展到高级阶段, 概率图模型使得计算成为问题,由此开启了Variational Bayes领域。在“&a href=&//link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzIzMjU1NTg3Ng%3D%3D%26mid%3D%26idx%3D1%26sn%3D3dd62ca6d7c1aebb87349ce%26chksm%3De89251f6dfe5d8e0d14eca355d0f31afa627d94de8e328c4ae692e%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&变の贝叶斯&/a&”里面, 我们解释了研究Variational Bayes,&b&有3拨人&/b&。 第一拨人, 把物理的能量搬到了机器学习(参考 “&a href=&//link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzIzMjU1NTg3Ng%3D%3D%26mid%3D%26idx%3D1%26sn%3Ddff349cc%26chksm%3De89251fbdfe5d8ed47f3deed684f46ff668ce0ee062c1ade8scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&给能力以自由吧!&/a&”)。 第二拨人, 就是Hinton,他将VB和EM算法联系了起来,奠定了现在我们看到的VB的基础。 第三拨人,就是Jordan, 他重建了VB的框架ELBO的基础。所以说EM算法扩展的VBEM算法,就是Hinton和Jordan共同发力的部分。 &/p&&p&&br&&/p&&p&Hinton曾在采访中,不无感慨的说到, 他当时研究VB和EM算法的关系的时候, 主动去请教当时的EM算法的大佬们, 结果那些人说Hinton是异想天开,神经有问题。 但是最终, 他还是突破重围, 搞定了VBEM算法,打下了VB世界最闪光的那盏灯。老爷子真心不容易! 如果想切实深入到VB的世界, 我推荐Daphne Koller的神书“Probabilistic Graphical Models: Principles and Techniques”, 尤其其中的第8章:The Exponential Family 和第19章 Partially Observed Data。 这两章几乎是Hinton对VBEM算法研究的高度浓缩。 国内机器学习牛人王飞跃老师, 率领各路弟子花了5年时间翻译了这本神书!所以有中文版, 买了,反复阅读8、19章,要的!&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-29fa0eea9ebfd_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1298& data-rawheight=&632& class=&origin_image zh-lightbox-thumb& width=&1298& data-original=&https://pic2.zhimg.com/50/v2-29fa0eea9ebfd_r.jpg&&&/figure&&p&&b&为什么无监督深度学习突出成果都是Hinton和Jordan家的?&/b&&/p&&p&无监督深度学习,除了强化学习,主要包括BM、自动编码器AE和GAN领域。 1)这些领域中的DBN和DBM是Hinton搞的。2)AE中的经典,VAE是DP Kingma和M Welling搞得。 DP Kingma硕士导师是LeCun,LeCun的博士后导师是Hinton,并且Welling的博士后导师是Hinton。 3)而GAN是Ian Goodfellow和Yoshua Bengio的杰作, Goodfellow是Bengio的学生, 而Bengio的博士后导师是Jordan。 一句话, 无监督深度学习的经典模型几乎全是Hinton和Jordan家的。 为什么? 因为能彻底理解EM算法到深不见底的人非Hinton和Jordan莫属。 &/p&&p&你现在明白彻底理解EM算法的重要性了吧? 下面我浅薄的纵向理解(忽略EM的各种变种的横向)EM算法的9层境界,再回头反思一下Hinton和Jordan等会对EM算法的理解到何种程度, 简直叹而观止!&/p&&p&&b&EM算法理解的九层境界&/b&&/p&&ol&&li&&b&EM 就是 E + M&/b&&/li&&li&&b&EM 是一种局部下限构造&/b&&/li&&li&&b&K-Means是一种Hard EM算法&/b&&/li&&li&&b&从EM 到 广义EM&/b&&/li&&li&&b&广义EM的一个特例是VBEM&/b&&/li&&li&&b&广义EM的另一个特例是WS算法&/b&&/li&&li&&b&广义EM的再一个特例是Gibbs抽样算法&/b&&/li&&li&&b&WS算法是VAE和GAN组合的简化版&/b&&/li&&li&&b&KL距离的统一&br&&/b&&/li&&/ol&&p&&b&第一层境界, EM算法就是E 期望 + M 最大化&/b&&/p&&p&最经典的例子就是抛3个硬币,跑I硬币决定C1和C2,然后抛C1或者C2决定正反面,
然后估算3个硬币的正反面概率值。 &/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-4b710bbd48fb54a3e5d551_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&418& data-rawheight=&262& class=&content_image& width=&418&&&/figure&&p&这个例子为什么经典, 因为它告诉我们,当存在&b&隐变量I的时候&/b&, 直接的最大似然估计无法直接搞定。 &b&什么是隐变量?为什么要引入隐变量? 对隐变量的理解是理解EM算法的第一要义&/b&!Chuong B Do & Serafim Batzoglou的Tutorial论文“What is the expectation maximization algorithm?”对此有详细的例子进行分析。 &/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-0e9dfb95febcd6309405_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&916& data-rawheight=&1034& class=&origin_image zh-lightbox-thumb& width=&916& data-original=&https://pic4.zhimg.com/50/v2-0e9dfb95febcd6309405_r.jpg&&&/figure&&p&通过隐变量,我们第一次解读了EM算法的伟大!突破了直接MLE的限制(不详细解释了)。&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-a1fe5bf90aea_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&800& data-rawheight=&632& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&https://pic2.zhimg.com/50/v2-a1fe5bf90aea_r.jpg&&&/figure&&p&至此, 你理解了&b&EM算法的第一层境界,看山是山&/b&。 &/p&&p&&br&&/p&&p&&b&第二层境界, EM算法就一种局部下限构造&/b&&/p&&p&如果你再深入到基于隐变量的EM算法的收敛性证明, 基于log(x)函数的Jensen不等式构造, 我们很容易证明,EM算法是在&b&反复的构造新的下限,然后进一步求解&/b&。 &/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-a38bcb9bcd43b5ca435e5c6_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&788& data-rawheight=&880& class=&origin_image zh-lightbox-thumb& width=&788& data-original=&https://pic1.zhimg.com/50/v2-a38bcb9bcd43b5ca435e5c6_r.jpg&&&/figure&&p&所以,先固定当前参数, 计算得到当前隐变量分布的一个下届函数, 然后优化这个函数, 得到新的参数, 然后循环继续。 &/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-21baf3526bae725faad475b5cd75e324_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1044& data-rawheight=&1092& class=&origin_image zh-lightbox-thumb& width=&1044& data-original=&https://pic3.zhimg.com/50/v2-21baf3526bae725faad475b5cd75e324_r.jpg&&&/figure&&p&也正是这个不停的构造下限的思想未来和VB方法联系起来了。 如果你理解了这个, 恭喜你, 进入&b&理解EM算法的第二层境界,&/b& &b&看山看石&/b&。 &/p&&p&&br&&/p&&p&&b&第三层境界, K-均值方法是一种Hard EM算法&/b&&/p&&p&在第二层境界的基础上, 你就能随意傲游EM算法用到GMM和HMM模型中去了。 尤其是对GMM的深入理解之后, 对于有隐变量的联合概率,如果利用高斯分布代入之后: &/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-0dcd2fc1daf7f5af175c9c_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&692& data-rawheight=&204& class=&origin_image zh-lightbox-thumb& width=&692& data-original=&https://pic3.zhimg.com/50/v2-0dcd2fc1daf7f5af175c9c_r.jpg&&&/figure&&p&很容易就和均方距离建立联系:&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-0e237f8a914a732b87599a0dea0c8367_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&728& data-rawheight=&118& class=&origin_image zh-lightbox-thumb& width=&728& data-original=&https://pic3.zhimg.com/50/v2-0e237f8a914a732b87599a0dea0c8367_r.jpg&&&/figure&&p&但是,能不能说K-均值就是高斯分布的EM算法呢?不是, 这里虽然拓展到了相同的距离公式, 但是背后逻辑还是不一样, 不一样在哪里呢?&b&K-均值在讨论隐变量的决定时候,用的是dirac delta 分布, 这个分布是高斯分布的一种极限&/b&。 &/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-6f5e0d2cb5695dceb3cf_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&760& data-rawheight=&592& class=&origin_image zh-lightbox-thumb& width=&760& data-original=&https://pic2.zhimg.com/50/v2-6f5e0d2cb5695dceb3cf_r.jpg&&&/figure&&figure&&img src=&https://pic3.zhimg.com/50/v2-ae35ac6f94f86b8f94f1df05_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&200& data-rawheight=&335& class=&content_image& width=&200&&&/figure&&p&如果你觉得这个扩展不太好理解, 那么更为简单直观的就是, k-均值用的hard EM算法, 而我们说的EM算法是soft EM算法。 所谓hard 就是要么是,要么不是0-1抉择。 而Soft是0.7比例是c1,0.3比例是c2的情况。 &/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-1c1d5d2b658b4edf7b48_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1664& data-rawheight=&638& class=&origin_image zh-lightbox-thumb& width=&1664& data-original=&https://pic2.zhimg.com/50/v2-1c1d5d2b658b4edf7b48_r.jpg&&&/figure&&p&那么充分理解了k-均值和EM算法本身的演化和差异有什么帮助呢?&b&让你进一步理解到隐变量是存在一种分布的&/b&。 &/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-1cb36ffe3e6b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&576& data-rawheight=&214& class=&origin_image zh-lightbox-thumb& width=&576& data-original=&https://pic3.zhimg.com/50/v2-1cb36ffe3e6b_r.jpg&&&/figure&&p&如果你理解了这个, 恭喜你, 进入&b&理解EM算法的第三层境界, 看山看峰&/b&。 &/p&&p&&br&&/p&&p&&b&第四层境界,EM 是 广义EM的特例&/b&&/p&&p&通过前3层境界, 你对EM算法的理解要&b&跨过隐变量, 进入隐分布的境界&/b&。 如果我们把前面的EM收敛证明稍微重复一下,但是引入&b&隐分布&/b&。 &/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-866e11172dc0fba6daefa9f_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1830& data-rawheight=&826& class=&origin_image zh-lightbox-thumb& width=&1830& data-original=&https://pic4.zhimg.com/50/v2-866e11172dc0fba6daefa9f_r.jpg&&&/figure&&p&这样我们把Jensen不等收右边的部分定义为自由能(如果你对自由能有兴趣,请参考“&a href=&//link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzIzMjU1NTg3Ng%3D%3D%26mid%3D%26idx%3D1%26sn%3Ddff349cc%26chksm%3De89251fbdfe5d8ed47f3deed684f46ff668ce0ee062c1ade8scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&给能量以自由吧!&/a&”,如果没有兴趣, 你就视为一种命名)。 那么&b&E步骤是固定参数优化隐分布, M步骤是固定隐分布优化参数,这就是广义EM算法了&/b&。
&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-e3bd_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&966& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&966& data-original=&https://pic2.zhimg.com/50/v2-e3bd_r.jpg&&&/figure&&p&有了广义EM算法之后, 我们对自由能深入挖掘, 发现自由能和似然度和KL距离之间的关系:&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-47d2d736c98ab6bf95e56f_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1534& data-rawheight=&562& class=&origin_image zh-lightbox-thumb& width=&1534& data-original=&https://pic3.zhimg.com/50/v2-47d2d736c98ab6bf95e56f_r.jpg&&&/figure&&p&所以固定参数的情况下, 那么只能最优化KL距离了, 那么隐分布只能取如下分布:&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-28aa54c9fef_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&650& data-rawheight=&138& class=&origin_image zh-lightbox-thumb& width=&650& data-original=&https://pic1.zhimg.com/50/v2-28aa54c9fef_r.jpg&&&/figure&&p&而这个&b&在EM算法里面是直接给出的&/b&。 所以EM算法是广义EM算法的天然最优的隐分布情况。 &b&但是很多时候隐分布不是那么容易计算的!&/b&&/p&&p&前面的推理虽然很简单, 但是要理解到位真心不容易, 首先要&b&深入理解KL距离是如何被引入的?&/b&&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-5fbcb11e1a_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&726& data-rawheight=&468& class=&origin_image zh-lightbox-thumb& width=&726& data-original=&https://pic3.zhimg.com/50/v2-5fbcb11e1a_r.jpg&&&/figure&&p&其次要理解, 为什么传统的EM算法, &b&不存在第一个最优化&/b&?因为在&b&没有限制的隐分布(天然情况下)&/b&情况下, 第一个最优就是要求:&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-227eccdac8d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&304& data-rawheight=&44& class=&content_image& width=&304&&&/figure&&p&而这个隐分布, EM算法里面是直接给出的,而不是让你证明得到的。&/p&&figure&&img src=&https://pic2.zhimg.com/50/v2-6d32e6cd61ac7a6cdf2d_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1318& data-rawheight=&564& class=&origin_image zh-lightbox-thumb& width=&1318& data-original=&https://pic2.zhimg.com/50/v2-6d32e6cd61ac7a6cdf2d_r.jpg&&&/figure&&p&这样, 在广义EM算法中,你看到两个优化步骤,我们进入了两个优化步骤理解EM算法的境界了。 如果你理解了这个, 恭喜你, 进入&b&理解EM算法的第四层境界, 有水有山&/b&。&/p&&p&&b&第五层境界,广义EM的一个特例是VBEM&/b&&/p&&p&在隐分布没有限制的时候, 广义EM算法就是EM算法, 但是如果隐分布本身是有限制的呢?&b&譬如有个先验分布的限制, 譬如有计算的限制呢&/b&?&/p&&p&例如先验分布的限制:从pLSA到LDA就是增加了参数的先验分布!&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-a868b1d534f94ebcd8221_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1132& data-rawheight=&704& class=&origin_image zh-lightbox-thumb& width=&1132& data-original=&https://pic3.zhimg.com/50/v2-a868b1d534f94ebcd8221_r.jpg&&&/figure&&p&例如计算上的限制:mean-field计算简化的要求,分量独立。&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-76ce9f52d2056f07ebeecae6daefffc6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&594& data-rawheight=&388& class=&origin_image zh-lightbox-thumb& width=&594& data-original=&https://pic1.zhimg.com/50/v2-76ce9f52d2056f07ebeecae6daefffc6_r.jpg&&&/figure&&p&诸如此类限制, 都使得广义EM里面的&b&第一步E优化不可能达到无限制最优, 所以KL距离无法为0&/b&。 &/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-2cfbfad17bcda_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1340& data-rawheight=&606& class=&origin_image zh-lightbox-thumb& width=&1340& data-original=&https://pic4.zhimg.com/50/v2-2cfbfad17bcda_r.jpg&&&/figure&&p&&br&&/p&&p&基于&b&有限制的理解&/b&, 再引入&b&模型变分的思想&/b&, 根据模型m的变化, 对应参数和隐变量都有相应的分布:&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-61d3e0b57ce911dcd4e36_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&676& data-rawheight=&270& class=&origin_image zh-lightbox-thumb& width=&676& data-original=&https://pic3.zhimg.com/50/v2-61d3e0b57ce911dcd4e36_r.jpg&&&/figure&&p&并且满足分布独立性简化计算的假设:&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-1ce20565b6baec192a5fabdb3e3c2370_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&306& data-rawheight=&52& class=&content_image& width=&306&&&/figure&&p&在变分思想下, 自由能被改写了:&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-f9f283ed1adc265c6b54b5b7fd1dcbc1_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&824& data-rawheight=&96& class=&origin_image zh-lightbox-thumb& width=&824& data-original=&https://pic4.zhimg.com/50/v2-f9f283ed1adc265c6b54b5b7fd1dcbc1_r.jpg&&&/figure&&p&这样我们就得到了VBEM算法了:&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-d3ae8be76ce5f2e4f5bc7b85a926b0de_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1218& data-rawheight=&712& class=&origin_image zh-lightbox-thumb& width=&1218& data-original=&https://pic3.zhimg.com/50/v2-d3ae8be76ce5f2e4f5bc7b85a926b0de_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/50/v2-d2fe980eea74_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1304& data-rawheight=&562& class=&origin_image zh-lightbox-thumb& width=&1304& data-original=&https://pic1.zhimg.com/50/v2-d2fe980eea74_r.jpg&&&/figure&&p&如果你理解了这个, 恭喜你, 进入&b&理解EM算法的第五层境界, 水转山回&/b&。 &/p&&p&&br&&/p&&p&&b&第六层境界,广义EM的另一个特例是WS算法&/b&&/p&&p&Hinton老爷子搞定VBEM算法后, 并没有停滞, 他在研究DBN和DBM的Fine-Tuning的时候, 提出了Wake-Sleep算法。 我们知道在有监督的Fine-Tuning可以使用BP算法, 但是无监督的Fine-Tuning,使用的是Wake-Sleep算法。 &/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-286ffab01a0_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1196& data-rawheight=&532& class=&origin_image zh-lightbox-thumb& width=&1196& data-original=&https://pic1.zhimg.com/50/v2-286ffab01a0_r.jpg&&&/figure&&p&就是这个WS算法,也是广义EM算法的一种特例。 WS算法分为认知阶段和生成阶段。&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-3cedb136d8aa7808071ffccb0ae18217_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1300& data-rawheight=&726& class=&origin_image zh-lightbox-thumb& width=&1300& data-original=&https://pic4.zhimg.com/50/v2-3cedb136d8aa7808071ffccb0ae18217_r.jpg&&&/figure&&p&在前面自由能里面,我们将KL距离引入了, 这里刚好这&b&两个阶段分别优化了KL距离的两种形态。 固定P优化Q,和固定Q优化P&/b&。 &/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-ae5fcf55ed84ea43b8bc3b_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1310& data-rawheight=&1010& class=&origin_image zh-lightbox-thumb& width=&1310& data-original=&https://pic4.zhimg.com/50/v2-ae5fcf55ed84ea43b8bc3b_r.jpg&&&/figure&&p&所以当我们取代自由能理解, 全部切换到KL距离的理解, 广义EM算法的E步骤和M步骤就分别是E投影和M投影。 因为要求KL距离最优, 可以等价于垂直。 而这个投影, 可以&b&衍生到数据D的流形空间, 和模型M的流形空间&/b&。 &/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-468b515b4d26ebced1c3bf_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&464& data-rawheight=&406& class=&origin_image zh-lightbox-thumb& width=&464& data-original=&https://pic1.zhimg.com/50/v2-468b515b4d26ebced1c3bf_r.jpg&&&/figure&&p&所以你认同WS算法是一种广义EM算法(GEM)之后, 基于KL距离再认识GEM算法。 引入了数据流形和模型流形。 引入了E投影和M投影。
&/p&&p&不过要注意的wake识别阶段对应的是M步骤, 而sleep生成阶段对应的E步骤。 所以&b&WS算法对应的是广义ME算法&/b&。 如果你理解了这个, 恭喜你, 进入&b&理解EM算法的第六层境界, 山高水深&/b&。 &/p&&p&&br&&/p&&p&&b&第七层境界,广义EM的再一个特例是Gibbs Sampling&/b&&/p&&p&其实,前面基于KL距离的认知, 严格放到信息理论的领域, 对于前面E投影和M投影都有严格的定义。 &b&M投影的名称是类似的,但是具体是moment projection,但是E投影应该叫I投影,具体是information projection&/b&。 &/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-bb16f97e3b82fb113b8ba475b6e51164_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&666& data-rawheight=&448& class=&origin_image zh-lightbox-thumb& width=&666& data-original=&https://pic3.zhimg.com/50/v2-bb16f97e3b82fb113b8ba475b6e51164_r.jpg&&&/figure&&p&上面这种可能不太容易体会到M投影和I投影的差异, 如果再回到最小KL距离,有一个经典的比较。 可以体会M投影和I投影的差异。 &b&上面是I投影,只覆盖一个峰。 下面是M投影, 覆盖了两个峰。&/b& &/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-891a8c795fd5ed_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1316& data-rawheight=&780& class=&origin_image zh-lightbox-thumb& width=&1316& data-original=&https://pic4.zhimg.com/50/v2-891a8c795fd5ed_r.jpg&&&/figure&&p&当我们不是直接计算KL距离, 而是&b&基于蒙特卡洛抽样方法来估算KL距离&/b&。 &/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-6edd_b.jpg& data-caption=&& data-size=&small& data-rawwidth=&1012& data-rawheight=&716& class=&origin_image zh-lightbox-thumb& width=&1012& data-original=&https://pic4.zhimg.com/50/v2-6edd_r.jpg&&&/figure&&p

我要回帖

更多关于 sgdm10ada使用说明书 的文章

 

随机推荐