《手机品牌销量排行榜》PC蛋蛋规律图商店有?——XY苹果助手怎样管理手机中的图片

真要从零开始做的话,最麻烦的在于USB底层协议的东西,specification动辄几十页还算少的。所以除非真心蛋疼,一般不会从零去做这部分。好在有大量的软、硬件解决方案,已经把这部分的heavy lifting给做了。&br&键盘是属于USB HID,所以是免驱的,插上就能正确使用(前提当然是你硬件端搞对)。所以软件部分,也没什么可做的。&br&&br&以我个人之前折腾过的几个项目来看,用AVR单片机是比较容易的,因为存在v-usb,LUFA这样的开源库:&br&&a href=&///?target=http%3A//www.obdev.at/products/vusb/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&V-USB - A Firmware-Only USB Driver for Atmel AVR Microcontrollers&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///LUFA.php& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&/L&/span&&span class=&invisible&&UFA.php&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&br&基于这两个框架还有port到Arduino的方案,那就是最最最简单的了,比如:&br&&a href=&///?target=https%3A///p/vusb-for-arduino/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&vusb-for-arduino -
Port of the V-USB project to run on the Arduino platform&i class=&icon-external&&&/i&&/a&&br&有单片机开发基础的人,1天搞个快速原型出来不是问题,&b&代码量也就几百行的样子&/b&。&br&这里有篇博文给了个实例:&br&&a href=&///?target=http%3A//mitchtech.net/arduino-usb-hid-keyboard/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Arduino USB HID Keyboard&i class=&icon-external&&&/i&&/a&&br&&br&总的来说,找对资料,搞个键盘这样简单的东西出来,就是严格按照cookbook来做就行了,没什么技术门槛。要注意的就是,一定要严格按照给的元件来,我最早一个原型就因为Zener管用的1/2W而非要求的1/4W就导致设备枚举失败;二是能打样PCB最好打样PCB,至少也得覆铜板热转印蚀刻,想用洞洞板焊出的电路把USB糊弄过去有的时候很难。&br&&br&下图是我最早做的一个原型,基于vusb for arduino的项目搞了一个Arduino Pro Mini的USB shield,插电脑上设备能枚举,也能用Arduino模拟按键,懂单片机的都知道,再多一步按键扫描就搞定了。不过后来我要做的那个项目改成了蓝牙无线方案,也就没继续弄USB了。&br&&img src=&/aa3a2966cde292959aec581a414ee054_b.jpg& data-rawwidth=&3552& data-rawheight=&2000& class=&origin_image zh-lightbox-thumb& width=&3552& data-original=&/aa3a2966cde292959aec581a414ee054_r.jpg&&
真要从零开始做的话,最麻烦的在于USB底层协议的东西,specification动辄几十页还算少的。所以除非真心蛋疼,一般不会从零去做这部分。好在有大量的软、硬件解决方案,已经把这部分的heavy lifting给做了。 键盘是属于USB HID,所以是免驱的,插上就能正确…
&img src=&/v2-901f7be0ffef20fe358bc2c3ba6349d8_b.jpg& data-rawwidth=&660& data-rawheight=&300& class=&origin_image zh-lightbox-thumb& width=&660& data-original=&/v2-901f7be0ffef20fe358bc2c3ba6349d8_r.jpg&&&p&先上两张桌面和开发环境见下图&/p&&img src=&/v2-aca80b3d704d4dfa5a9a2_b.png& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-aca80b3d704d4dfa5a9a2_r.png&&&img src=&/v2-08d8b148609ccfe53fda_b.png& data-rawwidth=&1920& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-08d8b148609ccfe53fda_r.png&&&h2&系统优化&/h2&&p&&b&更新源&/b&&/p&&p&更新前先设置源为aliyun的,国内访问速度快。&/p&&img src=&/v2-71ab8c5fcb07c63b9d0ea78_b.png& data-rawwidth=&659& data-rawheight=&524& class=&origin_image zh-lightbox-thumb& width=&659& data-original=&/v2-71ab8c5fcb07c63b9d0ea78_r.png&&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo apt-get update
sudo apt-get upgrade
&/code&&/pre&&/div&&p&&b&删除Amazon的链接&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo apt-get remove unity-webapps-common
&/code&&/pre&&/div&&h2&主题美化&/h2&&p&&b&先装 Unity 图形管理工具&/b&&/p&&img src=&/v2-dfdd379e2afd2f6c5065d59e_b.png& data-rawwidth=&642& data-rawheight=&721& class=&origin_image zh-lightbox-thumb& width=&642& data-original=&/v2-dfdd379e2afd2f6c5065d59e_r.png&&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo apt-get install unity-tweak-tool
&/code&&/pre&&/div&&p&然后安装 Flatabulous 主题&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo add-apt-repository ppa:noobslab/themes
sudo apt-get update
sudo apt-get install flatabulous-theme
&/code&&/pre&&/div&&p&和配套图标&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo add-apt-repository ppa:noobslab/icons
sudo apt-get update
sudo apt-get install ultra-flat-icons
&/code&&/pre&&/div&&p&更换操作如下图:&/p&&img src=&/v2-a33d3cd46b47aabcff36c8_b.png& data-rawwidth=&646& data-rawheight=&206& class=&origin_image zh-lightbox-thumb& width=&646& data-original=&/v2-a33d3cd46b47aabcff36c8_r.png&&&img src=&/v2-bf79cbb9d47bda4156204d_b.png& data-rawwidth=&644& data-rawheight=&486& class=&origin_image zh-lightbox-thumb& width=&644& data-original=&/v2-bf79cbb9d47bda4156204d_r.png&&&p&至此主题美化完成&/p&&p&&b&System Load Indicator(系统状态指示器)&/b&&/p&&img src=&/v2-78d0b81dee49aef436ce23c04df38c1d_b.png& data-rawwidth=&409& data-rawheight=&22& class=&content_image& width=&409&&&br&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo add-apt-repository ppa:indicator-multiload/stable-daily
sudo apt-get update
sudo apt-get install indicator-multiload
&/code&&/pre&&/div&&p&&b&微软雅黑&/b&&/p&&a href=&/?target=http%3A//www./wp-content/uploads/2015/07/YaHeiConsolas.tar.gz& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&字体下载&i class=&icon-external&&&/i&&/a&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&tar zxvf YaHeiConsolas.tar.gz
sudo mv YaHeiConsolas.ttf /usr/share/fonts
sudo chmod 755 /usr/share/fonts/YaHeiConsolas.ttf
&/code&&/pre&&/div&&p&&b&安装zsh&/b&&/p&&img src=&/v2-c19e92cb737a37ae3c468d4_b.png& data-rawwidth=&751& data-rawheight=&512& class=&origin_image zh-lightbox-thumb& width=&751& data-original=&/v2-c19e92cb737a37ae3c468d4_r.png&&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo apt-get install zsh
zsh --version
sudo chsh -s $(which zsh)
&/code&&/pre&&/div&&p&然后再重新注销登录就好了&/p&&h2&必装软件&/h2&&blockquote&下面介绍的软件有一部分是通过 deb 文件安装的,具体安装方式见 系统使用技巧。&/blockquote&&p&&b&系统软件&/b&&/p&&ul&&li&浏览器: Chrome&br&&/li&&li&搜狗输入法: sougoupinyin&br&&/li&&li&为知笔记: wiznote&br&&/li&&li&系统状态指示器: System Load Indicator&br&&/li&&li&SS你懂得: Shadowsocks-Qt5&br&&/li&&li&Unity图形管理工具: unity tweak tool&br&&/li&&li&图片编辑工具: gimp&br&&/li&&li&思维导图: xmind&br&&/li&&li&EPUB文件编辑: sigil&br&&/li&&li&Linux下的Dash: zeal&br&&/li&&li&Linux下Albert: albert&br&&/li&&li&网易云音乐播放器&br&&/li&&/ul&&br&&p&&b&数据库及工具&/b&&/p&&ul&&li&mysql&br&&/li&&li&mongodb&br&&/li&&li&redis&br&&/li&&li&MySQL Workbench&br&&/li&&/ul&&br&&p&&b&开发环境&/b&&/p&&ul&&li&Python IDE: Pycharm&br&&/li&&/ul&&br&&p&&b&命令行工具&/b&&/p&&ul&&li&zsh&br&&/li&&li&oh-my-zsh&br&&/li&&li&vim&br&&/li&&li&git&br&&/li&&/ul&&br&&h2&系统使用技巧&/h2&&p&&b&DEB软件安装&/b&&/p&&p&安装命令&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo dpkg -i xxx.deb
&/code&&/pre&&/div&&p&安装过程中可能会报缺少依赖的错,执行下面命令自动安装依赖&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo apt-get install -f
&/code&&/pre&&/div&&p&再次执行安装命令&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo dpkg -i xxx.deb
&/code&&/pre&&/div&&p&&b&卸载不再依赖的包 命令&/b&&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&sudo apt-get autoremove
&/code&&/pre&&/div&&br&&blockquote&个人博客地址:&a href=&/?target=http%3A//noogel.xyz& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&noogel.xyz&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&br&未完待续,欢迎大家发送你的优化点到我的邮箱 &/blockquote&
先上两张桌面和开发环境见下图系统优化更新源更新前先设置源为aliyun的,国内访问速度快。 sudo apt-get update
sudo apt-get upgrade删除Amazon的链接sudo apt-get remove unity-webapps-common主题美化先装 Unity 图形管理工具sudo apt-get install unit…
Tensorflow作为Google花大力构建维护的项目,拥有一套异常完善的Tutorial。对初学者来说,可能完善到让人不知道该从哪里下手,相信看过它的网站的同学们都能感觉得到。但既然是开源项目,要学习它肯定是从官方的Document下手,这里也感谢极客学院的大佬们细心翻译,方便了小白们入坑。&br&&br&首先,要想应用这种深度学习包,需要你对机器学习这方面有一个理论上的了解,完全不会ML、DL的纯小白也不可能看得懂这些文档和算法,文档里的介绍大部分都是在应用层面上的指导。我在这之前对ML和DL算有一定的基础,精看过几本书,乱看过几个系列的网课,刷了Ufldl,啃过一些经典的paper,看题主的提问水平相信基础知识也很扎实。&br&&br&考虑到,这个项目开源也没多久,所以也没有什么统一认可的学习方法。我自己开始是同时看极客学院和原版的文档,开始的MNIST肯定是要完全吃透的,这里边有两种代码,&a href=&///?target=http%3A//tensorflow.org/tutorials/mnist/pros/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Deep MNIST for Experts&i class=&icon-external&&&/i&&/a&是初级的(虽然是For Experts但确实很初级),比较好理解,简单实现了MNIST卷积神经网络,也没有模块化;这后面的一章&a href=&///?target=http%3A//www.tensorflow.org/tutorials/mnist/tf/index.md& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&TensorFlow Mechanics 101&i class=&icon-external&&&/i&&/a& 在之前一章的基础上实现了模块封装,算是一个稍微有模有样的代码。我当时把这一章的代码拿出来各种乱改,实现不同的功能,搞懂了这一块才基本算入门了。&br&&br&这之后硬啃下了CIFAR10的卷积实现的代码,这期间接触了不少新函数,不明白了就看文档的API或者上CSDN上看博客之类的,个人认为这是一个比较重要的时间段,对整个Tensorflow的架构有了一个更加系统的认识。说实话过程还是挺痛苦的,因为文档从这里开始不再细致的讲解,而是为学习者拓宽Tensorflow的使用方式。有时想吃透一些细节就必须耗很久。我个人非常建议在这个阶段多自己上手写程序,当然,我们可能还达不到完全自己写出来的水平,那就拆人家的轮子然后改,在自己写的过程中,会遇到一些经典的问题,最后发现人家的方法确实好,确实有这么做的道理。这个过程大概花了两周的时间,也算是在图像处理上有一些想法和阅历了。&br&&br&上一个阶段结束之后就开始有一些自己的想法,然后就决定自己上手写一个小程序。因为之前刚刚学过OpenCV,对里面人脸识别印象比较深刻,于是接受了ML前辈的意见,自己用Tensorflow写了一个输入照片判断性别的程序。这里面就要涉及到之前学过看过的所有知识,虽然很简单,但也编了整整一周,人脸数据集用的是IMDB WIKI的数据,这个数据集还可以做蛮多事情的,因为数据集里是带有年龄标记的,还可以写判断年龄的程序,是自己上手的不错选择。这同时开始看paper,边看轮子边拆轮子,有时间自己造一些轮子。然后就没有然后了,我也是刚刚走到这一步&br&&br&还可以看其他一些工具包的Document,比如Theano,caffe,虽然实现方法都不一样,但还是有很多相似之处的,具体帮助大不大我也说不上来,不妨试一试
Tensorflow作为Google花大力构建维护的项目,拥有一套异常完善的Tutorial。对初学者来说,可能完善到让人不知道该从哪里下手,相信看过它的网站的同学们都能感觉得到。但既然是开源项目,要学习它肯定是从官方的Document下手,这里也感谢极客学院的大佬们细…
&img src=&/v2-4f4ef1b223f8e49ab0e5_b.png& data-rawwidth=&1920& data-rawheight=&651& class=&origin_image zh-lightbox-thumb& width=&1920& data-original=&/v2-4f4ef1b223f8e49ab0e5_r.png&&&p&过去的一段时间在深度强化学习领域投入了不少精力,工作中也在应用DRL解决业务问题。子曰:温故而知新,在进一步深入研究和应用DRL前,阶段性的整理下相关知识点。本文集中在DRL的model-free方法的Value-based和Policy-base方法,详细介绍下RL的基本概念和Value-based DQN,Policy-based DDPG两个主要算法,对目前state-of-art的算法(A3C)详细介绍,其他前沿算法的详细理解留待后续展开。&/p&&p&&b&一、RL:a simple introduction&/b&&/p&&img src=&/v2-73b60f3a13ba0f23ba426b7b2f71acc1_b.png& data-rawwidth=&1816& data-rawheight=&736& class=&origin_image zh-lightbox-thumb& width=&1816& data-original=&/v2-73b60f3a13ba0f23ba426b7b2f71acc1_r.png&&&p&强化学习是机器学习的一个分支,相较于机器学习经典的有监督学习、无监督学习问题,强化学习最大的特点是在交互中学习(Learning from Interaction)。Agent在与环境的交互中根据获得的奖励或惩罚不断的学习知识,更加适应环境。RL学习的范式非常类似于我们人类学习知识的过程,也正因此,RL被视为实现通用AI重要途径。&/p&&br&&p&&b&1.1 强化学习问题的基本设定&/b&:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&&A, S, R, P&
Action space : A
State space : S
Reward: R : S × A × S → R
Transition : P :S × A → S
&/code&&/pre&&/div&&p&&A, S, R, P&就是RL中经典的四元组了。A代表的是Agent的所有动作;State是Agent所能感知的世界的状态;Reward是一个实数值,代表奖励或惩罚;P则是Agent所交互世界,也被称为model。基于此以下给出强化学习系统的几个重要概念:&/p&&ul&&li&&b&Policy&/b&: Policy是指Agent则是在状态s时,所要做出action的选择,定义为&img src=&/equation?tex=%5Cpi+& alt=&\pi & eeimg=&1&&,是RL中最核心的问题了。policy可以视为在Agent感知到环境后s后到动作a的一个mapping。如果策略是随机的,policy是根据每个动作概率&img src=&/equation?tex=%5Cpi%28a%7Cs%29& alt=&\pi(a|s)& eeimg=&1&&选择动作;如果策略是确定性的,policy则是直接根据状态s选择出动作&img src=&/equation?tex=a%3D%5Cpi+%28s%29& alt=&a=\pi (s)& eeimg=&1&&。&br&&/li&&/ul&&img src=&/equation?tex=stochasticPolicy%3A+++%5Csum_%7B%7D%5E%7B%7D%7B%5Cpi+%28a%7Cs%29%7D%3D1& alt=&stochasticPolicy:
\sum_{}^{}{\pi (a|s)}=1& eeimg=&1&&&br&&img src=&/equation?tex=deterministic+Policy%3A+%5Cpi%28s%29+%3A+S%5Crightarrow+A& alt=&deterministic Policy: \pi(s) : S\rightarrow A& eeimg=&1&&&br&&ul&&li&&b&Reward Signal&/b&:reward signal定义了Agent学习的目标。Agent每一次和环境交互,环境返回reward,告诉Agent刚刚的action是好的,还是不好的,可以理解为对agent的奖励和惩罚,agent与环境交互的序列流见下图。需要注意的是,&u&Reward&img src=&/equation?tex=%5Cne+& alt=&\ne & eeimg=&1&&Goal&/u&!即agent的目标并非当前reward最大,而是平均累计回报最大。&/li&&/ul&&img src=&/v2-4c11d459dc52cc_b.png& data-rawwidth=&2164& data-rawheight=&352& class=&origin_image zh-lightbox-thumb& width=&2164& data-original=&/v2-4c11d459dc52cc_r.png&&&ul&&li&&b&Value function&/b&:Reward Signal定义的是评判一次交互中的立即的(immediate sense)回报好坏。而Value function则定义的是从长期看action平均回报的好坏。比如象棋中,吃掉对方一个“车”的即时收益很大,但如果因为吃“车”,老“将”被对方吃掉,显然长期看吃“车”这个action是不好的。即一个状态s的value是其长期期望Reward的高低。定义&img src=&/equation?tex=V_%7B%5Cpi+%7D%28s%29& alt=&V_{\pi }(s)& eeimg=&1&&是策略&img src=&/equation?tex=%5Cpi+& alt=&\pi & eeimg=&1&&状态s长期期望收益,&img src=&/equation?tex=Q_%7B%5Cpi+%7D%28s%2Ca%29& alt=&Q_{\pi }(s,a)& eeimg=&1&&是策略&img src=&/equation?tex=%5Cpi+& alt=&\pi & eeimg=&1&&在状态s下,采取动作a的长期期望收益。&/li&&/ul&&p&
定义&img src=&/equation?tex=G_%7Bt%7D& alt=&G_{t}& eeimg=&1&&为长期回报期望(Return):&/p&&img src=&/equation?tex=G_%7Bt%7D++%3D+%5Csum_%7Bn%3D0%7D%5E%7BN%7D%7B%5Cgamma%5E%7Bn%7Dr_%7Bt%2Bn%7D+++%7D+& alt=&G_{t}
= \sum_{n=0}^{N}{\gamma^{n}r_{t+n}
} & eeimg=&1&&&p&
状态s的value为:&/p&&img src=&/equation?tex=V_%7B%5Cpi+%7D%28s%29%3DE_%7B%5Cpi+%7D%5BG_%7Bt%7D%7CS_%7Bt%7D%3Ds%5D& alt=&V_{\pi }(s)=E_{\pi }[G_{t}|S_{t}=s]& eeimg=&1&&&p&
状态s下采取动作a的Q值为:&/p&&img src=&/equation?tex=Q_%7B%5Cpi+%7D%28s%2Ca%29%3DE_%7B%5Cpi+%7D%5BG_%7Bt%7D%7CS_%7Bt%7D%3Ds%2C+A_%7Bt%7D%3Da%5D& alt=&Q_{\pi }(s,a)=E_{\pi }[G_{t}|S_{t}=s, A_{t}=a]& eeimg=&1&&&p&
其中&img src=&/equation?tex=0%3C+%5Cgamma+%3C1& alt=&0& \gamma &1& eeimg=&1&&是长期收益的折扣因子,类似于金融中的折现率。&/p&&ul&&li&&b&Model of the environment&/b&:model是对真实世界(environment)的模拟,model建模的是agent采样action后环境的反应。RL中,使用model和planning的方法被称为model-based,反之不使用model而是通过try-and-error学习policy的方法被称为model-free。本文范畴即是model-free。&br&&/li&&/ul&&p&&b&1.2 强化学习:一个MDP(Markov Decision Process)过程&/b&:&/p&&p&RL的重要基础是MDP了,其中Markov体现在:&/p&&img src=&/equation?tex=P%28S_%7Bt%2B1%7D%2CR_%7Bt%2B1%7D%7C+S_%7B0%7D%2CA_%7B0%7D%2CR_%7B1%7D%2C...S_%7Bt%7D%2C+A_%7Bt%7D%29%3DP%28S_%7Bt%2B1%7D%2CR_%7Bt%2B1%7D%7CS_%7Bt%7D%2CA_%7Bt%7D%29& alt=&P(S_{t+1},R_{t+1}| S_{0},A_{0},R_{1},...S_{t}, A_{t})=P(S_{t+1},R_{t+1}|S_{t},A_{t})& eeimg=&1&&&p&即在状态&img src=&/equation?tex=s_%7Bt%7D& alt=&s_{t}& eeimg=&1&&时,采取动作&img src=&/equation?tex=a_%7Bt%7D& alt=&a_{t}& eeimg=&1&&后的状态&img src=&/equation?tex=s_%7Bt%2B1%7D& alt=&s_{t+1}& eeimg=&1&&和收益&img src=&/equation?tex=r_%7Bt%2B1%7D& alt=&r_{t+1}& eeimg=&1&&只与当前状态和动作有关,与历史状态无关。(如果与“历史状态”相关,那么把这个状态封装到&img src=&/equation?tex=s_%7Bt%7D& alt=&s_{t}& eeimg=&1&&即可了)。而Decision则体现在在每一个状态s处,都是要进行决策采取什么行动,即policy了。&/p&&br&&img src=&/v2-4a93dc3e29fd_b.png& data-rawwidth=&1136& data-rawheight=&530& class=&origin_image zh-lightbox-thumb& width=&1136& data-original=&/v2-4a93dc3e29fd_r.png&&&p&&b&1.3 Bellman等式&/b&&/p&&br&&p&Bellman等式是RL最核心的公式了,虽然重要,但推导起来其实非常简单好理解,推导过程就省略了。&/p&&p&Bellman equation&/p&&img src=&/equation?tex=V_%7B%5Cpi+%7D%28s%29%3D%5Csum_%7B%7D%5E%7B%7D%7B%5Cpi+%28a%7Cs%29+E%5BR_%7Bt%2B1%7D%2B%5Cgamma+V%28s_%7Bt%2B1%7D%29%7CS_%7Bt%7D%3Ds%5D%7D& alt=&V_{\pi }(s)=\sum_{}^{}{\pi (a|s) E[R_{t+1}+\gamma V(s_{t+1})|S_{t}=s]}& eeimg=&1&&&br&&p&Bellman optimality equation&/p&&img src=&/equation?tex=V_%7B%2A%7D%28s%29%3DE%5BR_%7Bt%2B1%7D%2B%5Cgamma+max_%7B%5Cpi++%7D+V%28s_%7Bt%2B1%7D%29%7CS_%7Bt%7D%3Ds%5D& alt=&V_{*}(s)=E[R_{t+1}+\gamma max_{\pi
} V(s_{t+1})|S_{t}=s]& eeimg=&1&&&br&&img src=&/equation?tex=Q_%7B%2A%7D%28s%2Ca%29%3DE%5BR_%7Bt%2B1%7D%2B%5Cgamma+max_%7Ba%5E%7B%27%7D+%7D+Q%28s_%7Bt%2B1%7D%2C+a%5E%7B%27%7D+%29%7CS_%7Bt%7D%3Ds%2CA_%7Bt%7D%3Da%5D& alt=&Q_{*}(s,a)=E[R_{t+1}+\gamma max_{a^{'} } Q(s_{t+1}, a^{'} )|S_{t}=s,A_{t}=a]& eeimg=&1&&&br&&p&&b&1.4 MC、TD&/b&&/p&&br&&p&有关RL的基础,再简单介绍下 MC、TD方法,其他内容篇幅原因不再展开了。&/p&&p&Monte-Carlo method适用于“情节式任务”(情节任务序列有终点,与“情节式任务”相对应的是“连续型任务”)。Q(s,a)就是整个序列的期望回报。MC增量更新中的Monte-Carlo error:&/p&&p&&img src=&/v2-ce9ee443adf054e0176c3_b.png& data-rawwidth=&1756& data-rawheight=&168& class=&origin_image zh-lightbox-thumb& width=&1756& data-original=&/v2-ce9ee443adf054e0176c3_r.png&&TD(Time Difference) method,是Monte-Carlo和Dynamic Programming 方法的一个结合。相比MC方法,TD除了能够适用于连续任务外,和MC的差异从下图可以清楚看到。MC需要回退整个序列更新Q值,而TD只需要回退1步或n步更新Q值。因为MC需要等待序列结束才能训练,而TD没有这个限制,因此TD收敛速度明显比MC快,目前的主要算法都是基于TD。下图是TD和MC的回退图,很显然MC回退的更深。&/p&&img src=&/v2-951e5ec476e6f4865deee034d4792706_b.png& data-rawwidth=&1856& data-rawheight=&840& class=&origin_image zh-lightbox-thumb& width=&1856& data-original=&/v2-951e5ec476e6f4865deee034d4792706_r.png&&&p&直观理解MC error和TD error的差异,假设RL的任务要预估的是上班的&到公司时长&,状态是目前的位置,比如“刚出门”“到地铁了”“到国贸站了”...。MC方法需要等到真正开到公司才能校验“刚出门”状态时预估的正确性,得到MC error;而TD则可以利用“刚出门”和“到地铁了”两个状态预测的差异的1-step TD error来迭代。&br&&/p&&p&1-step TD error:&/p&&img src=&/v2-c6b74ceffc4_b.png& data-rawwidth=&1776& data-rawheight=&274& class=&origin_image zh-lightbox-thumb& width=&1776& data-original=&/v2-c6b74ceffc4_r.png&&&p&n-steps TD error:&/p&&img src=&/equation?tex=R%5E%7B%28n%29%7D%3Dr_%7Bt%2B1%7D%2B%5Cgamma+r_%7Bt%2B2%7D%2B...%2B%5Cgamma+%5E%7Bn-2%7Dr_%7Bt%2Bn-1%7D%2B%5Cgamma+%5E%7Bn-1%7DQ%28s_%7Bt%2Bn%7D%2C+a_%7Bt%2Bn%7D%29++& alt=&R^{(n)}=r_{t+1}+\gamma r_{t+2}+...+\gamma ^{n-2}r_{t+n-1}+\gamma ^{n-1}Q(s_{t+n}, a_{t+n})
& eeimg=&1&&&br&&p&&img src=&/equation?tex=TD%28%5Clambda+%29& alt=&TD(\lambda )& eeimg=&1&& error:&br&&/p&&img src=&/equation?tex=R%5E%7B%28%5Clambda+%29%7D%3D%281-%5Clambda+%29%5Csum_%7Bn%7D%5E%7Bi%3D1%7D%7B%5Clambda+%5E%7Bi%7DR%5E%7B%28i%29%7D%7D+& alt=&R^{(\lambda )}=(1-\lambda )\sum_{n}^{i=1}{\lambda ^{i}R^{(i)}} & eeimg=&1&&&br&&p&事实上,MC error可以视为一个情节任务的max-step TD error。另外,一般来说,在TD error中,n越大,用到的真实回报信息更多,收敛也会越快。&/p&&br&&br&&p&&b&二、DRL:from Q-learning to DQN&/b&&/p&&p&Q-learning一种TD方法,也是一种Value-based的方法。所谓Value-based方法,就是先评估每个action的Q值(Value),再根据Q值求最优策略&img src=&/equation?tex=%5Cpi+%28a%7Cs%29& alt=&\pi (a|s)& eeimg=&1&&的方法。强化学习的最终目标是求解policy,因此Value-based的方法是一种“曲线救国”。Q-learning算法的核心就是我们1.3中介绍的Bellman optimality equation,即:&/p&&br&&img src=&/equation?tex=Q_%7B%2A%7D%28s%2Ca%29%3DE%5BR_%7Bt%2B1%7D%2B%5Cgamma+max_%7Ba%5E%7B%27%7D+%7D+Q%28s_%7Bt%2B1%7D%2C+a%5E%7B%27%7D+%29%7CS_%7Bt%7D%3Ds%2CA_%7Bt%7D%3Da%5D& alt=&Q_{*}(s,a)=E[R_{t+1}+\gamma max_{a^{'} } Q(s_{t+1}, a^{'} )|S_{t}=s,A_{t}=a]& eeimg=&1&&&br&&p&Q-learning是RL的很经典的算法,但有个很大的问题在于它是一种表格方法,也就是说它非常的直来之前,就是根据过去出现过的状态,统计和迭代Q值。一方面Q-learning适用的状态和动作空间非常小;另一方面但如果一个状态从未出现过,Q-learning是无法处理的。也就是说&b&Q-learning压根没有预测能力,也就是没有泛化能力&/b&。&/p&&p&为了能使得Q的学习能够带有预测能力,熟悉机器学习的同学很容易想到这就是一个&b&回归问题&/b&啊!用函数拟合Q:&/p&&img src=&/v2-3a7ce29de32c34ad3f0348_b.png& data-rawwidth=&2102& data-rawheight=&136& class=&origin_image zh-lightbox-thumb& width=&2102& data-original=&/v2-3a7ce29de32c34ad3f0348_r.png&&&p&&img src=&/equation?tex=%5Ctheta+& alt=&\theta & eeimg=&1&&代表的是模型参数,&br&&/p&&p&模型有很多种选择,线性的或非线性的。传统的非深度学习的函数拟合更多是人工特征+线性模型拟合。这几年伴随着深度学习最近几年在监督学习领域的巨大成功,用&b&深度神经网络端到端的拟合Q值&/b&,也就是DQN,似乎是个必然了。&/p&&p&deepmind 在2013年的 &a href=&/?target=https%3A//arxiv.org/pdf/.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Playing Atari with Deep Reinforcement Learning&i class=&icon-external&&&/i&&/a& 提出的DQN算是DRL的一个重要起点了,也是理解DRL不可错过的经典模型了。网络结构设计方面,DQN之前有些网络是左图的方式,输入为S,A,输出Q值;DQN采用的右图的结构,即输入S,输出是离线的各个动作上的Q值。之所以这样,左图方案相对右图最大的缺点是对于每个state,需要计算&img src=&/equation?tex=%7CA%7C& alt=&|A|& eeimg=&1&&次前向计算,而右图则只需要一次前向计算即可,因此&b&左图的前向计算成本与action的数量成正比&/b&。&/p&&img src=&/v2-8d1fcb71062d79eeb4922_b.png& data-rawwidth=&2442& data-rawheight=&610& class=&origin_image zh-lightbox-thumb& width=&2442& data-original=&/v2-8d1fcb71062d79eeb4922_r.png&&&p&论文中,解决的问题是Atari游戏问题,&b&输入数据(状态S)就是&/b&&b&游戏&/b&&b&原始画面的像素点,动作空间&/b&&b&是摇杆方向等。&/b&这也是DNN带来的最大好处,有过特征工程经验的同学自然理解,不做特征工程想想都觉得轻松,更不要提效果还能提升了&/p&&br&&img src=&/v2-9c0c71b5ab1c4a999afd087ef3dc44a6_b.png& data-rawwidth=&1272& data-rawheight=&406& class=&origin_image zh-lightbox-thumb& width=&1272& data-original=&/v2-9c0c71b5ab1c4a999afd087ef3dc44a6_r.png&&&p&DQN具体的网络结构见下:实际输入是游戏的连续4帧画面,不只使用1帧画面为了感知环境的动态性,接两层CNN,两层FNN,输出各个动作的Q值。&/p&&img src=&/v2-67ef75bb7f5e67b2a4bf_b.png& data-rawwidth=&1242& data-rawheight=&728& class=&origin_image zh-lightbox-thumb& width=&1242& data-original=&/v2-67ef75bb7f5e67b2a4bf_r.png&&&p&因为DQN本身是个回归问题,模型的优化目标是最小化1-step TD error的平方loss,梯度的计算也很直接了,见下图。&/p&&img src=&/v2-d0bad0d8af7cc6b5e27bdb7_b.png& data-rawwidth=&2446& data-rawheight=&678& class=&origin_image zh-lightbox-thumb& width=&2446& data-original=&/v2-d0bad0d8af7cc6b5e27bdb7_r.png&&&p&DQN最终能够取得成功的一方面是采用了DNN网络进行Q值的函数拟合,end-to-end的模型训练。更重要的是引入了以下两个点:&/p&&br&&ul&&li&&b&Experience Replay&/b&:DeepLearning取得重大进展的监督学习中,样本间都是独立同分布的。而RL中的样本是有关联的,非静态的(highly correlated and non-stationary),训练的结果很容易难以收敛。Experience Replay机制解决这个问题思路其实很简单,构建一个存储把样本都存储下来,通过随机采样去除相关性。(当然没有天下免费的午餐,这种方法也有弊端,比如off-policy受到了限制,也不是真正的online-learning,具体在A3C部分会展开分析)&br&&/li&&li&&b&separate Target Network&/b&:原始的Q-learning中,在1-step TD return,样本标签y使用的是和训练的Q-network相同的网络。这样通常情况下,能够使得Q大的样本,y也会大,这样模型震荡和发散可能性变大。而构建一个独立的慢于当前Q-Network的target Q-Network来计算y,使得训练震荡发散可能性降低,更加稳定。&/li&&li&另外,TD-error也被clip到[-1,1]区间,增加模型的稳定性。部分思路和我们后续分享的的TRPO算法的置信区间相关。&br&&/li&&/ul&&p&详细的DQN算法:&/p&&img src=&/v2-85ba7b32ee1_b.png& data-rawwidth=&615& data-rawheight=&489& class=&origin_image zh-lightbox-thumb& width=&615& data-original=&/v2-85ba7b32ee1_r.png&&&p&附DQN15年发表在nature的文章 &a href=&/?target=https%3A///deepmind-media/dqn/DQNNaturePaper.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Human-level control through deep reinforcement learning&i class=&icon-external&&&/i&&/a&&/p&&br&&br&&p&后续关于DQN有三个主要改进点:&/p&&ul&&li&&b&Double Q-Network&/b&:思路并不新鲜,仿照Double Q-learning,一个Q网络用于选择动作,另一个Q网络用于评估动作,交替工作,解决upward-bias问题,效果不错。三个臭皮匠顶个诸葛亮么,就像工作中如果有double-check,犯错的概率就能平方级别下降。Silver15年论文&a href=&/?target=https%3A//arxiv.org/pdf/.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Deep Reinforcement Learning with Double Q-learning&i class=&icon-external&&&/i&&/a&&/li&&li&&b&Prioritized replay&/b&:基于优先级的replay机制,replay加速训练过程,变相增加样本,并且能独立于当前训练过程中状态的影响。这个replay权重还是和DQN error(下图)有关,Silver16年论文&a href=&/?target=https%3A//arxiv.org/pdf/.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PRIORITIZED EXPERIENCE REPLAY&i class=&icon-external&&&/i&&/a&。&/li&&/ul&&img src=&/v2-533ecd6e37b292e5656e_b.png& data-rawwidth=&1746& data-rawheight=&156& class=&origin_image zh-lightbox-thumb& width=&1746& data-original=&/v2-533ecd6e37b292e5656e_r.png&&&ul&&li&&b&Dueling network&/b&:在网络内部把Q(s,a) 分解成 V(s) + A(s, a),V(s)与动作无关,A(s, a)与动作相关,是a相对s平均回报的相对好坏,是优势,解决reward-bias问题。RL中真正关心的还是策略的好坏,更关系的是优势,另外在某些情况下,任何策略都不影响回报,显然需要剔除。ICML 2016 Best Paper:&a href=&/?target=https%3A//arxiv.org/pdf/v2.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&DUELING NETWORK ARCHITECTURES FOR DEEP REINFORCEMENT LEARNING&i class=&icon-external&&&/i&&/a& 。Dueling Network网络架构如下,Dueling Network把网络分成一个输出标量V(s)另一个输出动作上Advantage值两部分,最后合成Q值。非常巧妙的设计,当然还是end-to-end的,效果也是state-of-art。Advantage是一个比较有意思的问题,A3C中有一个A就是Advantage,计划后面把Advantage单独拉出来研究下单独分享。&/li&&/ul&&img src=&/v2-848adcd17e5dc_b.png& data-rawwidth=&1768& data-rawheight=&950& class=&origin_image zh-lightbox-thumb& width=&1768& data-original=&/v2-848adcd17e5dc_r.png&&&br&&p&&b&三、Policy-Based method:概率输出&连续动作空间&/b&&/p&&p&DQN虽然在Atari游戏问题中取得了巨大的成功,但适用范围还是在低维、离散动作空间。DQN是求每个action的&img src=&/equation?tex=max_%7Ba%7D+Q%28s%2Ca%29& alt=&max_{a} Q(s,a)& eeimg=&1&&,在连续空间就不适用了,原因如下:&/p&&br&&ol&&li&如果采用把连续动作空间离散化,动作空间则会过大,极难收敛。比如连续动作空间=10,每个动作划分成3个离散动作,动作空间将扩大到&img src=&/equation?tex=3%5E%7B10%7D%3D+59049+& alt=&3^{10}= 59049 & eeimg=&1&&。而且每个动作空间划分成3个离散动作无法做到fine-tuning,划分本身也带来了信息损失。&/li&&li&即便是有些DQN的变种如VAE能够给出连续动作的方案,DQN的第二个问题是只能给出一个确定性的action,无法给出概率值。而有些场景,比如围棋的开局,只有一种走法显然太死板了,更多例子不再介绍了。&/li&&/ol&&p&从另外一个角度看,DQN是Value-based方法,上一节讲到了Value-based的方法还是在间接求策略。一个自然的逻辑是为什么我们不直接求解Policy?这就是Policy Gradient方法了。&br&&/p&&p&&b&3.1 策略梯度&/b&&/p&&p&策略梯度方法中,参数化策略&img src=&/equation?tex=%5Cpi+& alt=&\pi & eeimg=&1&&为&img src=&/equation?tex=%5Cpi+_%7B%5Ctheta+%7D& alt=&\pi _{\theta }& eeimg=&1&&,然后计算得到动作上策略梯度,沿着梯度方法,一点点的调整动作,逐渐得到最优策略。&/p&&p&&img src=&/v2-229d07d4bc0ab5a81231c3_b.png& data-rawwidth=&1624& data-rawheight=&158& class=&origin_image zh-lightbox-thumb& width=&1624& data-original=&/v2-229d07d4bc0ab5a81231c3_r.png&&定义&img src=&/equation?tex=J%28%5Ctheta+%29& alt=&J(\theta )& eeimg=&1&&为整体的performance metrics。下图截取的PPT页很好的表达了PG的原理。&/p&&img src=&/v2-efe15e63d3558ccd0f6b1e9d1d92bd0b_b.png& data-rawwidth=&1810& data-rawheight=&1044& class=&origin_image zh-lightbox-thumb& width=&1810& data-original=&/v2-efe15e63d3558ccd0f6b1e9d1d92bd0b_r.png&&&p&&b&3.2 随机和确定性策略梯度&/b&&/p&&p&Sutton早在1999年就发表论文&a href=&/?target=http%3A//webdocs.cs.ualberta.ca/%7Esutton/papers/SMSM-NIPS99.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Policy Gradient Methods for Reinforcement Learning with Function Approximation&i class=&icon-external&&&/i&&/a&证明了随机策略梯度的计算公式:&br&&/p&&p&&img src=&/v2-12dd05b8be2ac95d292e_b.png& data-rawwidth=&1234& data-rawheight=&172& class=&origin_image zh-lightbox-thumb& width=&1234& data-original=&/v2-12dd05b8be2ac95d292e_r.png&&证明过程就不贴了,有兴趣读一下能加深下理解。也可以读读 REINFORCE算法(with or without Baseline)&a href=&/?target=http%3A//incompleteideas.net/sutton/williams-92.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Simple statistical gradient-following algorithms for connectionist reinforcement learning&i class=&icon-external&&&/i&&/a&,92年的文章了,略微老了些。&/p&&br&&p&David Silver在14年的论文&a href=&/?target=http%3A//jmlr.org/proceedings/papers/v32/silver14.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Deterministic Policy Gradient Algorithms&i class=&icon-external&&&/i&&/a&(DPG)证明了DPG的策略梯度公式,结论同样非常简洁:&/p&&p&&img src=&/v2-0f9edffeaecb_b.png& data-rawwidth=&1208& data-rawheight=&428& class=&origin_image zh-lightbox-thumb& width=&1208& data-original=&/v2-0f9edffeaecb_r.png&&太理论性的东西不多贴了,有两个点值得注意:&/p&&ul&&li&DPG和随机策略梯度SPG差异在于随机策略梯度中有一个log项,本质上源于随机策略需要重新加一层策略u的期望,导致策略网络u的梯度相对DPG需要除以策略u,数学转化成log(u)的倒数了。这个形式和交叉熵很接近,其实完全可以从概率角度去理解,有物理意义。&/li&&li&DPG中本质上式在max(Q),和DQN最终竟还是殊途同归,直观的去理解的话,&b&&u&Policy是按照Q值最大的方向调整policy的参数&/u&&/b&。&/li&&/ul&&br&&p&&b&3.3 深度确定性策略梯度&/b&&/p&&p&google的这篇DDPG论文&a href=&/?target=https%3A//arxiv.org/pdf/v2.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CONTINUOUS CONTROL WITH DEEP REINFORCEMENT LEARNING&i class=&icon-external&&&/i&&/a&结合了上文中DQN和DPG,把DRL推向了&b&连续动作空间控制&/b&。&/p&&ul&&li&&b&actor-critic&/b&:在介绍DDPG前,简单的介绍下 actor-critic算法。actor-critic算法是一种TD method。结合了value-based和policy-based方法。policy网络是actor(行动者),输出动作(action-selection)。value网络是critic(评价者),用来评价actor网络所选动作的好坏(action value estimated),并生成TD_error信号同时指导actor网络critic网络的更新。下图为actor-critic算法的一个架构图,DDPG就是这一类算法。&br&&/li&&/ul&&br&&br&&p&&img src=&/v2-49bcbd2eabdd2e14ce38b3ff_b.png& data-rawwidth=&1228& data-rawheight=&744& class=&origin_image zh-lightbox-thumb& width=&1228& data-original=&/v2-49bcbd2eabdd2e14ce38b3ff_r.png&&DDPG中,actor网络的输入时state,输出action,以DNN进行函数拟合,对于连续动作NN输出层可以用tanh或sigmod,离散动作以softmax作为输出层则达到概率输出的效果。critic网络输入为state和action,输出为Q值。本文介绍的是off-policy的 Deterministic Actor-Critic,on-policy的结构详见论文。&br&&/p&&ul&&li&&b&DPG&/b&:DPG中提供了确定性策略梯度的计算公式和证明。&/li&&li&&b&DQN&/b&:DDPG中借鉴了DQN的experience replay和target network。target network的具体实现与DQN略有不同,DDPG论文中的actor和critic的两个target network以小步长滞后更新,而非隔C步更新。都是为了解决模型训练稳定性问题,大同小异吧。&/li&&li&&b&Noise sample&/b&:连续动作空间的RL学习的一个困难时action的探索。DDPG中通过在action基础上增加Noise方式解决这个问题。&/li&&/ul&&br&&p&&img src=&/v2-22aa75e9b_b.png& data-rawwidth=&1066& data-rawheight=&74& class=&origin_image zh-lightbox-thumb& width=&1066& data-original=&/v2-22aa75e9b_r.png&&DDPG的算法训练过程:&/p&&img src=&/v2-0c2fdf2104efaabb28383_b.png& data-rawwidth=&764& data-rawheight=&555& class=&origin_image zh-lightbox-thumb& width=&764& data-original=&/v2-0c2fdf2104efaabb28383_r.png&&&br&&p&&b&四、some state-of-art papers&/b&&/p&&p&写到这整个文章有点太长了,这部分会拆分到后续单独开辟文章介绍。简单介绍下大名鼎鼎的A3C算法。&br&&/p&&p&&b&4.1 Asynchronous Advantage Actor-Critic (A3C) &/b&&/p&&p&因为后续还有计划A3C和Advantage结合在一起分享下。这里只是大体理一下A3C的主要思路。&/p&&ul&&li&&b&asynchronous&/b&:异步,对应的异步分布式RL框架。相对应的是15年google的Gorila平台&a href=&/?target=http%3A///s%3Fwd%3Dpaperuri%253A%acb9%2529%26filter%3Dsc_long_sign%26tn%3DSE_xueshusource_2kduw22v%26sc_vurl%3Dhttp%253A%252F%252Farxiv.org%252Fabs%252F%26ie%3Dutf-8%26sc_us%3D3493789& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Massively Parallel Methods for Deep Reinforcement Learning&i class=&icon-external&&&/i&&/a&,Gorilla采用的不同机器,同一个PS。而A3C中,则是同一台机器,多核CPU,降低了参数和梯度的传输成本,论文里验证迭代速度明显更快。并且更为重要的是,它是采用同机多线程的actor-learner对,每个线程对应不同的探索策略,总体上看样本间是低相关的,因此不再需要DQN中引入experience replay机制来进行训练。这样能够采用on-policy的方法进行训练。此外,训练中采用的是CPU而非GPU,原因是RL在训练过程中batch一般很小,GPU在等待新数据时空闲很多。附异步方法抽象的架构图见下:&br&&/li&&/ul&&img src=&/v2-44f4007daa45cae151ec56f_b.png& data-rawwidth=&1962& data-rawheight=&1170& class=&origin_image zh-lightbox-thumb& width=&1962& data-original=&/v2-44f4007daa45cae151ec56f_r.png&&&ul&&li&&b&Advantage Actor-Critic&/b&:和DDPG架构类似,actor网络的梯度:&br&&/li&&/ul&&p&&img src=&/v2-2bc3ac99e57dd29b8b627_b.png& data-rawwidth=&426& data-rawheight=&46& class=&origin_image zh-lightbox-thumb& width=&426& data-original=&/v2-2bc3ac99e57dd29b8b627_r.png&&与DDPG不同的是A3C利用的是max(Advantage)而非max(Q),其中&img src=&/equation?tex=A%28s_%7Bt%7D%2Ca_%7Bt%7D%3B%5Ctheta+%2C%5Ctheta+_%7Bv%7D%29& alt=&A(s_{t},a_{t};\theta ,\theta _{v})& eeimg=&1&&是利用n-steps TD error进行更新的,即:&/p&&p&&img src=&/v2-ea88bfcacc_b.png& data-rawwidth=&528& data-rawheight=&52& class=&origin_image zh-lightbox-thumb& width=&528& data-original=&/v2-ea88bfcacc_r.png&&具体过程见下图:&/p&&p&&img src=&/v2-e42e0418beb4b3d68b6a5_b.png& data-rawwidth=&1550& data-rawheight=&876& class=&origin_image zh-lightbox-thumb& width=&1550& data-original=&/v2-e42e0418beb4b3d68b6a5_r.png&&n-step Q-learning A3C算法训练过程:&/p&&img src=&/v2-066df3e49ee049b800077c_b.png& data-rawwidth=&711& data-rawheight=&522& class=&origin_image zh-lightbox-thumb& width=&711& data-original=&/v2-066df3e49ee049b800077c_r.png&&&p&&br&4.2 Trust Region Policy Optimization(TRPO)and action embedding and ...&/p&&br&&p&16年Berkeley大学的论文 &a href=&/?target=https%3A//arxiv.org/pdf/.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Trust Region Policy Optimization&i class=&icon-external&&&/i&&/a&,核心在于学习的可信度,提高模型稳定性。 &/p&&p&超大规模离散动作空间的action embedding的paper&a href=&/?target=https%3A//arxiv.org/pdf/.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Deep Reinforcement Learning in Large Discrete Action Spaces&i class=&icon-external&&&/i&&/a&。核心贡献是引入action embedding,具体做法是将离散动作embedding到连续的小空间中,设计很巧妙,读这篇论文前也有类似思路,可以用到搜索推荐这些领域。&/p&&p&其他前沿文章和专题,比如16年NIPS BestPaper &a href=&/?target=https%3A//arxiv.org/pdf/.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Value Iteration Networks&i class=&icon-external&&&/i&&/a&(&a href=&/p/& class=&internal&&安利下新朋友iker的分享:强化学习系列三- Value iteration Network&/a&)以及又是Silver大神16年的Fictitious Self-Play &a href=&/?target=http%3A//www0.cs.ucl.ac.uk/staff/d.silver/web/Applications_files/nfsp.pdf& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Deep Reinforcement Learning from Self-Play in Imperfect-Information Games&i class=&icon-external&&&/i&&/a&等,留待后面文章再仔细分解了。&/p&&br&&br&&br&&p&&b&五、some words&/b&&/p&&p&一点点感触,平时很少写文章,平时要学的东西很多项目也很busy,时间真心不多...但写到这里反而发现,能够把学习思考实践的内容通过写作呈现出来,还是有些不同于单独读paper做实验的收获,写作的过程会加深对细节的理解,也能从更系统更全面视角看待问题,后续会继续多po一些前沿专题和实现象,继续保持更新,各位看官多多支持哈。DRL是一个非常有意思的方向,欢迎多多交流指导,DRL领域的发展也是日新月异,生活在这样一个信息革命大变革时代也是我们的幸运。anyway,最重要的是开心,加油吧~&/p&&p&最后安利下我们team的招聘,对淘宝搜索排序感兴趣的同学欢迎邮件我 qingsong.,来淘宝,一起成长!&/p&
过去的一段时间在深度强化学习领域投入了不少精力,工作中也在应用DRL解决业务问题。子曰:温故而知新,在进一步深入研究和应用DRL前,阶段性的整理下相关知识点。本文集中在DRL的model-free方法的Value-based和Policy-base方法,详细介绍下RL的基本概念和V…
&img src=&/v2-5e0ff50dfbba4_b.jpg& data-rawwidth=&1080& data-rawheight=&600& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&/v2-5e0ff50dfbba4_r.jpg&&&blockquote&虽然这个时间点发布这样的文章有报复社会的嫌疑。不过我想这样的小技巧应该是每位学习编程的同学逢年过节必备的。&/blockquote&&p&既然发出祝福的人可以从网上复制一条段子,甚至可能是随手复制七大姑八大姨群发给TA自己的段子,然后在微信群发助手全选联系人,往里面一粘贴点击发送就成功地搞定了所有过去的一年里爱过帮助过鼓励过同舟共济过的亲朋好友们。&br&&/p&&p&那我为什么不可以用类似的方式去搞定企图用群发来搞定我的人呢?&/p&&p&不过我也不是批评群发祝福这种行为,敷衍确实是敷衍了一点,多少也算一份心意。&/p&&p&可是收到祝福的我就很尴尬了,假如我不回显得我不近人情,我要是手动回复了,很明显是我吃亏了,可能一整天的精力都要耗在回复祝福上。并且我也不愿意做那种群发祝福敷衍我的亲朋好友的那种人。&/p&&p&有没有既不浪费时间又能保持礼貌和客套的办法呢?&/p&&blockquote&人生苦短,我用Python&/blockquote&&p&好歹也算是学过两年编程的人,其实只需要12行Python代码,就可以让你的微信拥有自动回复功能了,并且还能够自动判断消息种类和内容,只回复新年祝福相关的消息。&/p&&p&首先确保你安装好了Python和Python的包管理工具pip&/p&&ul&&li&&a href=&/?target=https%3A//www.python.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Welcome to Python.org&i class=&icon-external&&&/i&&/a&&br&&/li&&li&&a href=&/?target=https%3A//pip.pypa.io/en/stable/installing/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Installation - pip 9.0.1 documentation&i class=&icon-external&&&/i&&/a&&br&&/li&&/ul&&br&&p&之后只需要再安装两个python库&/p&&div class=&highlight&&&pre&&code class=&language-bash&&&span&&/span&pip install itchat pillow
&/code&&/pre&&/div&&p&然后再随便写这么几行代码&/p&&p&&b&index.py&/b&&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&import&/span& &span class=&nn&&itchat&/span&&span class=&o&&,&/span& &span class=&nn&&time&/span&&span class=&o&&,&/span& &span class=&nn&&re&/span&
&span class=&kn&&from&/span& &span class=&nn&&itchat.content&/span& &span class=&kn&&import&/span& &span class=&o&&*&/span&
&span class=&nd&&@itchat.msg_register&/span&&span class=&p&&([&/span&&span class=&n&&TEXT&/span&&span class=&p&&])&/span&
&span class=&k&&def&/span& &span class=&nf&&text_reply&/span&&span class=&p&&(&/span&&span class=&n&&msg&/span&&span class=&p&&):&/span&
&span class=&n&&match&/span& &span class=&o&&=&/span& &span class=&n&&re&/span&&span class=&o&&.&/span&&span class=&n&&search&/span&&span class=&p&&(&/span&&span class=&s1&&'年'&/span&&span class=&p&&,&/span& &span class=&n&&msg&/span&&span class=&p&&[&/span&&span class=&s1&&'Text'&/span&&span class=&p&&])&/span&&span class=&o&&.&/span&&span class=&n&&span&/span&&span class=&p&&()&/span&
&span class=&k&&if&/span& &span class=&n&&match&/span&&span class=&p&&:&/span&
&span class=&n&&itchat&/span&&span class=&o&&.&/span&&span class=&n&&send&/span&&span class=&p&&((&/span&&span class=&s1&&'那我就祝你鸡年大吉吧'&/span&&span class=&p&&),&/span& &span class=&n&&msg&/span&&span class=&p&&[&/span&&span class=&s1&&'FromUserName'&/span&&span class=&p&&])&/span&
&span class=&nd&&@itchat.msg_register&/span&&span class=&p&&([&/span&&span class=&n&&PICTURE&/span&&span class=&p&&,&/span& &span class=&n&&RECORDING&/span&&span class=&p&&,&/span& &span class=&n&&VIDEO&/span&&span class=&p&&,&/span& &span class=&n&&SHARING&/span&&span class=&p&&])&/span&
&span class=&k&&def&/span& &span class=&nf&&other_reply&/span&&span class=&p&&(&/span&&span class=&n&&msg&/span&&span class=&p&&):&/span&
&span class=&n&&itchat&/span&&span class=&o&&.&/span&&span class=&n&&send&/span&&span class=&p&&((&/span&&span class=&s1&&'那我就祝你鸡年大吉吧'&/span&&span class=&p&&),&/span& &span class=&n&&msg&/span&&span class=&p&&[&/span&&span class=&s1&&'FromUserName'&/span&&span class=&p&&])&/span&
&span class=&n&&itchat&/span&&span class=&o&&.&/span&&span class=&n&&auto_login&/span&&span class=&p&&(&/span&&span class=&n&&enableCmdQR&/span&&span class=&o&&=&/span&&span class=&bp&&True&/span&&span class=&p&&,&/span&&span class=&n&&hotReload&/span&&span class=&o&&=&/span&&span class=&bp&&True&/span&&span class=&p&&)&/span&
&span class=&n&&itchat&/span&&span class=&o&&.&/span&&span class=&n&&run&/span&&span class=&p&&()&/span&
&/code&&/pre&&/div&&p&然后在命令行里运行&/p&&div class=&highlight&&&pre&&code class=&language-bash&&&span&&/span&python index.py
&/code&&/pre&&/div&&p&用你自己的微信号扫描二维码(不是扫下面这个,是扫描你自己在命令行里生成的)&/p&&img src=&/v2-e6ef9b6ca697e58c785c2_b.png& data-rawwidth=&478& data-rawheight=&509& class=&origin_image zh-lightbox-thumb& width=&478& data-original=&/v2-e6ef9b6ca697e58c785c2_r.png&&&p&登录成功后会有如下提示&/p&&img src=&/v2-47d6e949e4a62c647fd595b783b8738f_b.png& data-rawwidth=&205& data-rawheight=&70& class=&content_image& width=&205&&&p&然后就大功告成啦(本示例在Win10+Python3.5.1环境下运行)&/p&&img src=&/v2-d94fcfd7c52d122f4a130_b.jpg& data-rawwidth=&1242& data-rawheight=&1739& class=&origin_image zh-lightbox-thumb& width=&1242& data-original=&/v2-d94fcfd7c52d122f4a130_r.jpg&&&p&感谢知友们的支持,更新一个进阶版,可以自动获取好友的备注名,并且从祝福语API里随机抽取祝福词进行定制的回复,并且会记录回复过的好友,不会因为重复自动回复露馅。&/p&&p&&b&P.S.&/b&&a href=&/?target=http%3A//docs.python-requests.org/en/master/user/install/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&requests&i class=&icon-external&&&/i&&/a&库需要再安装一下&/p&&div class=&highlight&&&pre&&code class=&language-python&&&span&&/span&&span class=&kn&&import&/span& &span class=&nn&&itchat&/span&&span class=&o&&,&/span& &span class=&nn&&time&/span&&span class=&o&&,&/span& &span class=&nn&&requests&/span&&span class=&o&&,&/span& &span class=&nn&&random&/span&
&span class=&kn&&from&/span& &span class=&nn&&itchat.content&/span& &span class=&kn&&import&/span& &span class=&o&&*&/span&
&span class=&n&&replied&/span& &span class=&o&&=&/span& &span class=&p&&[]&/span&
&span class=&nd&&@itchat.msg_register&/span&&span class=&p&&([&/span&&span class=&n&&TEXT&/span&&span class=&p&&])&/span&
&span class=&k&&def&/span& &span class=&nf&&text_reply&/span&&span class=&p&&(&/span&&span class=&n&&msg&/span&&span class=&p&&):&/span&
&span class=&k&&if&/span& &span class=&s1&&'年'&/span& &span class=&ow&&in&/span& &span class=&n&&msg&/span&&span class=&p&&[&/span&&span class=&s1&&'Text'&/span&&span class=&p&&]&/span& &span class=&ow&&and&/span& &span class=&n&&msg&/span&&span class=&p&&[&/span&&span class=&s1&&'FromUserName'&/span&&span class=&p&&]&/span& &span class=&ow&&not&/span& &span class=&ow&&in&/span& &span class=&n&&replied&/span&&span class=&p&&:&/span&
&span class=&n&&sendGreeting&/span&&span class=&p&&(&/span&&span class=&n&&msg&/span&&span class=&p&&)&/span&
&span class=&nd&&@itchat.msg_register&/span&&span class=&p&&([&/span&&span class=&n&&PICTURE&/span&&span class=&p&&,&/span& &span class=&n&&RECORDING&/span&&span class=&p&&,&/span& &span class=&n&&VIDEO&/span&&span class=&p&&,&/span& &span class=&n&&SHARING&/span&&span class=&p&&])&/span&
&span class=&k&&def&/span& &span class=&nf&&other_reply&/span&&span class=&p&&(&/span&&span class=&n&&msg&/span&&span class=&p&&):&/span&
&span class=&k&&if&/span& &span class=&n&&msg&/span&&span class=&p&&[&/span&&span class=&s1&&'FromUserName'&/span&&span class=&p&&]&/span& &span class=&ow&&not&/span& &span class=&ow&&in&/span& &span class=&n&&replyed&/span&&span class=&p&&:&/span&
&span class=&n&&sendGreeting&/span&&span class=&p&&(&/span&&span class=&n&&msg&/span&&span class=&p&&)&/span&
&span class=&k&&def&/span& &span class=&nf&&sendGreeting&/span&&span class=&p&&(&/span&&span class=&n&&msg&/span&&span class=&p&&):&/span&
&span class=&k&&global&/span& &span class=&n&&replied&/span&
&span class=&n&&friend&/span& &span class=&o&&=&/span& &span class=&n&&itchat&/span&&span class=&o&&.&/span&&span class=&n&&search_friends&/span&&span class=&p&&(&/span&&span class=&n&&userName&/span&&span class=&o&&=&/span&&span class=&n&&msg&/span&&span class=&p&&[&/span&&span class=&s1&&'FromUserName'&/span&&span class=&p&&])&/span&
&span class=&n&&itchat&/span&&span class=&o&&.&/span&&span class=&n&&send&/span&&span class=&p&&((&/span&&span class=&n&&friend&/span&&span class=&p&&[&/span&&span class=&s1&&'RemarkName'&/span&&span class=&p&&]&/span&&span class=&o&&+&/span&&span class=&s1&&','&/span&&span class=&o&&+&/span&&span class=&n&&getRandomGreeting&/span&&span class=&p&&()),&/span& &span class=&n&&msg&/span&&span class=&p&&[&/span&&span class=&s1&&'FromUserName'&/span&&span class=&p&&])&/span&
&span class=&n&&replied&/span&&span class=&o&&.&/span&&span class=&n&&append&/span&&span class=&p&&(&/span&&span class=&n&&msg&/span&&span class=&p&&[&/span&&span class=&s1&&'FromUserName'&/span&&span class=&p&&])&/span&
&span class=&k&&def&/span& &span class=&nf&&getRandomGreeting&/span&&span class=&p&&():&/span&
&span class=&n&&response&/span& &span class=&o&&=&/span& &span class=&n&&requests&/span&&span class=&o&&.&/span&&span class=&n&&get&/span&&span class=&p&&(&/span&&span class=&s2&&&/api/life/greetings?festival=新年&page=10&&/span&&span class=&p&&,&/span& &span class=&n&&headers&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&&span class=&s1&&'apiKey'&/span&&span class=&p&&:&/span&&span class=&s1&&'sQS2ylErlfm9Ao2oNPqw6TqMYbJjbs4g'&/span&&span class=&p&&})&/span&
&span class=&n&&results&/span& &span class=&o&&=&/span& &span class=&n&&response&/span&&span class=&o&&.&/span&&span class=&n&&json&/span&&span class=&p&&()[&/span&&span class=&s1&&'result'&/span&&span class=&p&&]&/span&
&span class=&n&&greeting&/span& &span class=&o&&=&/span& &span class=&n&&results&/span&&span class=&p&&[&/span&&span class=&n&&random&/span&&span class=&o&&.&/span&&span class=&n&&randrange&/span&&span class=&p&&(&/span&&span class=&nb&&len&/span&&span class=&p&&(&/span&&span class=&n&&results&/span&&span class=&p&&))][&/span&&span class=&s1&&'words'&/span&&span class=&p&&]&/span&
&span class=&k&&return&/span& &span class=&n&&greeting&/span&
&span class=&n&&itchat&/span&&span class=&o&&.&/span&&span class=&n&&auto_login&/span&&span class=&p&&(&/span&&span class=&n&&enableCmdQR&/span&&span class=&o&&=&/span&&span class=&bp&&True&/span&&span class=&p&&,&/span&&span class=&n&&hotReload&/span&&span class=&o&&=&/span&&span class=&bp&&True&/span&&span class=&p&&)&/span&
&span class=&n&&itchat&/span&&span class=&o&&.&/span&&span class=&n&&run&/span&&span class=&p&&()&/span&
&/code&&/pre&&/div&&b&效果预览&/b&&img src=&/v2-f1bebfe10d9_b.jpg& data-rawwidth=&1242& data-rawheight=&767& class=&origin_image zh-lightbox-thumb& width=&1242& data-original=&/v2-f1bebfe10d9_r.jpg&&&p&做朋友最重要的是真诚,做人最重要的是厚道。&/p&&p&当然不管怎样,祝福终归是祝福,心意多少也算是一点心意。过年过节最重要的还是开心嘛~&/p&&p&最后的最后,余博伦还是在这里祝各位知友们鸡年大吉~新春愉快啦~&/p&&p&参考资料:&/p&&ul&&li&感谢来自@&a href=&/people/littlecoder-3/& class=&internal&&LittleCoder&/a&的&a href=&/?target=https%3A///littlecodersh/ItChat& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&littlecodersh/ItChat&i class=&icon-external&&&/i&&/a&&/li&&li&如果还是不能正常使用请查看&a href=&/?target=https%3A//itchat.readthedocs.io/zh/latest/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&官方文档&i class=&icon-external&&&/i&&/a&&/li&&/ul&
虽然这个时间点发布这样的文章有报复社会的嫌疑。不过我想这样的小技巧应该是每位学习编程的同学逢年过节必备的。既然发出祝福的人可以从网上复制一条段子,甚至可能是随手复制七大姑八大姨群发给TA自己的段子,然后在微信群发助手全选联系人,往里面一粘贴…
&p&说一个近年来神经网络方面澄清的一个误解。
BP算法自八十年代发明以来,一直是神经网络优化的最基本的方法。神经网络普遍都是很难优化的,尤其是当中间隐含层神经元的个数较多或者隐含层层数较多的时候。长期以来,人们普遍认为,这是因为较大的神经网络中包含很多局部极小值(local minima),使得算法容易陷入到其中某些点。这种看法持续二三十年,至少数万篇论文中持有这种说法。举个例子,如著名的Ackley函数 。对于基于梯度的算法,一旦陷入到其中某一个局部极值,就很难跳出来了。(图片来自网络,压缩有点严重。原图可见&a href=&///?target=http%3A///trac.fcgi/wiki/Documentation/Reference/Test%2520Functions& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Documentation/Reference/Test Functions - HeuristicLab&i class=&icon-external&&&/i&&/a&)。&/p&&img src=&/v2-94d15ee5fd659d606f52_b.png& data-rawwidth=&1076& data-rawheight=&665& class=&origin_image zh-lightbox-thumb& width=&1076& data-original=&/v2-94d15ee5fd659d606f52_r.png&&&br&&br&&p&到2014年,一篇论文《Identifying and attacking the saddle point problem in
high-dimensional non-convex optimization》&a href=&///?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&&v1.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&,指出高维优化问题中根本没有那么多局部极值。作者依据统计物理,随机矩阵理论和神经网络理论的分析,以及一些经验分析提出高维非凸优化问题之所以困难,是因为存在大量的鞍点(梯度为零并且Hessian矩阵特征值有正有负)而不是局部极值。&/p&&img src=&/v2-3bef6b393f375a838d4a8dac8770cc00_b.png& data-rawwidth=&869& data-rawheight=&599& class=&origin_image zh-lightbox-thumb& width=&869& data-original=&/v2-3bef6b393f375a838d4a8dac8770cc00_r.png&&&br&&p&鞍点(saddle point)如下图(来自wiki)。和局部极小值相同的是,在该点处的梯度都等于零,不同在于在鞍点附近Hessian矩阵有正的和负的特征值,即是不定的,而在局部极值附近的Hessian矩阵是正定的。&/p&&img src=&/v2-db6921ee4beedb3f9e669_b.png& data-rawwidth=&330& data-rawheight=&274& class=&content_image& width=&330&&&br&&p&在鞍点附近,基于梯度的优化算法(几乎目前所有的实际使用的优化算法都是基于梯度的)会遇到较为严重的问题,可能会长时间卡在该点附近。在鞍点数目极大的时候,这个问题会变得非常严重(下图来自上面论文)。&/p&&img src=&/v2-cc9d44f68cc831d3c2b4_b.png& data-rawwidth=&532& data-rawheight=&302& class=&origin_image zh-lightbox-thumb& width=&532& data-original=&/v2-cc9d44f68cc831d3c2b4_r.png&&&p&这个问题目前仍有讨论,不过大体上人们接受了这种观点,即造成神经网络难以优化的一个重要(乃至主要)原因是存在大量鞍点。造成局部极值这种误解的原因在于,人们把低维的直观认识直接推到高维的情况。在一维情况下,局部极值是仅有的造成优化困难的情形(Hessian矩阵只有一个特征值)。该如何处理这种情况,目前似乎没有特别有效的方法。(欢迎评论告知)&/p&&img src=&/v2-d9a376c9ae72c8f09ed3_b.png& data-rawwidth=&763& data-rawheight=&87& class=&origin_image zh-lightbox-thumb& width=&763& data-original=&/v2-d9a376c9ae72c8f09ed3_r.png&&&br&&p&多解释一点。
1. 鞍点也是驻点,鞍点处的梯度为零,在一定范围内沿梯度下降会沿着鞍点附近走,这个区域很平坦,梯度很小。
2. 优化过程不是卡在鞍点不动了(像人们以为的局部极值那样),而是在鞍点附近梯度很小,于是变动的幅度越来越小,loss看起来就像是卡住了。但是和local minima的差别在于,如果运行时间足够长,SGD一类的算法是可以走出鞍点附近的区域的(看下面的两个链接)。由于这需要很长时间,在loss上看来就像是卡在local minima了。然而,从一个鞍点附近走出来,很可能会很快就进入另一个鞍点附近了。
3. 直观来看增加一些扰动,从下降的路径上跳出去就能绕过鞍点。但在高维的情形,这个鞍点附近的平坦区域范围可能非常大。此外,即便从一个鞍点跳过,这个跳出来的部分很可能很快进入另一个鞍点的平坦区域—— 鞍点的数量(可能)是指数级的。&/p&&p&各种优化算法在鞍点附近形态的展示,可以看动态图&a href=&///?target=http%3A///optimizing-gradient-descent/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&An overview of gradient descent optimization algorithms&i class=&icon-external&&&/i&&/a& 最下面的部分,非常生动形象。中文可见&a href=&///?target=http%3A//ycszen.github.io//SGD%25EF%25BC%258CAdagrad%25EF%25BC%258CAdadelta%25EF%25BC%258CAdam%25E7%25AD%%25BC%%258C%%%25E6%25B3%%2580%25BB%25E7%25BB%%E6%25AF%%25BE%2583/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SGD,Adagrad,Adadelta,Adam等优化方法总结和比较&i class=&icon-external&&&/i&&/a&。
&/p&&p&-------第二次更新---------
有些评论提到了遗传算法和进化算法(EA),这里统一说一下。&/p&&p&先说优点,EA通常是不依赖于函数值的,而只依赖于点之间的大小关系,comparison-based,这样进行迭代的时候不会受到梯度太小的影响。看起来似乎是一个可行的路子?下面说一下缺点。&/p&&p&说说进化算法面对的一些普遍问题。&/p&&p&1. 先说CMA-ES, 这是效果最好最成功的进化算法之一,尤其是在ill-conditioned 问题和non-separable 问题上。CMA-ES (Covariance Matrix Adaptation-Evolution Strategy)和EDA (Estimation of Distribution Algorithm)的特点是 model-based,他们从一个正态分布采样产生一组新解,使用较好的一部分(一半)新解更新分布的参数(mean, cov或对应的Cholesky factor,对CMA-ES来说还有一个独立步长)。CMA-ES和EDA这样基于分布的算法大体上都能从information geometric optimization (IGO) 用natural gradient 得到。IGO流的收敛性和算法本身在一类问题上的收敛性都不是问题,Evolution path更是动量的类似。然而这些方法最大的问题在于,由于依赖随机采样,当维度很高的时候采样的空间极大,需要极多的样本来逐渐估计cov(&img src=&///equation?tex=O%28n%5E2%29& alt=&O(n^2)& eeimg=&1&& 量级),采样产生新解的时候的复杂度是(不低于)O(n^2)。EA的论文普遍只测试30,50-100维,500-1000维以上的极少,即便是各种large scale的变种也大多止步于1000。对于动辄&img src=&///equation?tex=10%5E5& alt=&10^5& eeimg=&1&& 量级的神经网络优化,基本是不可行的。&/p&&p&2. DE/PSO这类算法。特点是无模型,不实用概率分布采样的方法产生新解,使用多个点(称为一个种群,population)之间的相互(大小)关系来模拟一个下降方向。这种基于种群的方法对有较多局部极值的问题效果较好,但是对ill-conditioned 问题性能较差,在non-separable+ill-conditioned问题效果有限。更进一步的,这类算法为了维持种群多样性,通常只进行两两比较(两两比较的选择压力小于截断选择,即某些新解不比父本好,但是比种群中其他解好,这样的解被丢弃了),好的个体进入下一代。然而随着维度增加,新生个体比父代好的比例急剧下降,在ellipsoid函数上100维左右的时候就已经降低到5%以下。实验研究&a href=&///?target=http%3A///science/article/pii/S146X& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Differential Evolution algorithms applied to Neural Network training suffer from stagnation&i class=&icon-external&&&/i&&/a&&/p&&p&总体上,EA在连续优化问题上的主要问题就是搜索效率不高,相比基于梯度的算法要多&img src=&///equation?tex=O%28n%29& alt=&O(n)& eeimg=&1&& 倍的搜索。与此相似的实际上是坐标下降法(coordinate descent),同样不使用梯度,同样要求多&img src=&///equation?tex=O%28n%29& alt=&O(n)& eeimg=&1&& 倍的搜索。&/p&&br&&p&&b&3月14日补充&/b&:提一个较近的EA+NN的实验研究。用DE训练神经网络的研究,&a href=&///?target=http%3A///science/article/pii/S146X& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Differential Evolution algorithms applied to Neural Network training suffer from stagnation&i class=&icon-external&&&/i&&/a&,Applied Soft Computing,2014。所有的DE在训练神经网络的时候都失败了,失败并不是卡在局部最优(种群仍然具有多样性)。&/p&&br&&p&一个相关问题的回答:&a href=&/question//answer/& class=&internal&&神经网络的训练可以采用二阶优化方法吗(如Newton, Quasi Newton)?&/a&&/p&
说一个近年来神经网络方面澄清的一个误解。
BP算法自八十年代发明以来,一直是神经网络优化的最基本的方法。神经网络普遍都是很难优化的,尤其是当中间隐含层神经元的个数较多或者隐含层层数较多的时候。长期以来,人们普遍认为,这是因为较大的神经网络中…
我还没写你们就开始点赞了,有点过意不去啊……&br&题主说MATLAB,主要原因是大多数人本科阶段接触的都是MATLAB,所以希望之后研究SLAM也用它。&br&MATLAB确实有很多优点:语法简单,开发速度快,调试方便,功能丰富。然而,在SLAM领域,MATLAB缺点也很明显,主要是这两个:&br&&ul&&li&需要正版软件(你不能实机上也装个盗版MATLAB吧); &br&&/li&&li&运行效率不高;&/li&&li&需要一个巨大的安装包; &br&&/li&&/ul&&p&而相对的,C++的优势在于直接使用,有很高的运行效率,不过开发速度和调试方面慢于MATLAB。不过光运行效率这一条,就够许多SLAM方案选择C++作为开发语言了,因为运行效率真的很重要。同一个算法,拿MATLAB写出来实现不能实时,拿C++写的能实时,你说用哪个?&/p&&br&&p&当然MATLAB也有一些用武之地。我见过一些SLAM相关的公开课程,让学生用MATLAB做仿真,交作业,这没有问题,比如&a href=&///?target=http%3A//www.iri.upc.edu/people/jsola/JoanSola/eng/toolbox.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SLAM toolbox&i class=&icon-external&&&/i&&/a& 。同样的,比较类似于MATLAB的Python(以及octave)亦常被用于此道。它们在开发上的快捷带来了很多便利,当你想要验证一些数学理论、思想时,这些都是不错的工具。所谓技多不压身,题主掌握MATLAB和Python当然是很棒的。&/p&&br&&p&但是一牵涉到实用,你会发现几乎所有的方案都在用C++。 因为运行效率实在是太重要了。&br&&/p&&br&&p&那既然有心思学MATLAB,为什么不学好C++呢?&/p&&br&&p&---------------------分割线------------------&/p&&p&接下来说说C++大概要学到什么程度。用程序员的话说,C++语言比较特殊,你可以说自己精通了Java,但千万不要说自己精通了C++。C++非常之博大精深,有数不清的特性,而且随着时间还会不断变化更新。不过,大多数人都用不着学会所有的C++特性,因为许多东西一辈子都用不到。&/p&&br&&p&作为SLAM研究人员,我们面对的主要是算法层面的开发,所以更关心如何有效地实现各种相关的算法。而相对的,那些复杂的软件架构,设计模式,我个人认为在SLAM中倒是占次要地位的。毕竟您用SLAM的目的是计算一个位置以及建个地图,并不是要去写一套能够自动更新的、多人网上对战功能的机器人大战平台。您的主要精力可能会花在矩阵运算、分块、非线性优化的实现、图像处理上面;您可能对并发、指令集加速、GPU加速等话题感兴趣,也可以花点时间学习;你还可能想用模板来拓展你的算法,也不妨一试。相应的,很多功能性的东西,比如说UI、网络通信等等,当你用到的时候不妨接触一下,但专注于SLAM上时就不必专门去学习了。&/p&&br&&p&话虽如此,SLAM所需的C++水平,大抵要高于你在书本上看到的那些个示例代码。因为那些代码是作者用来向初学者介绍语法的,所以会尽量简单。而实际见到的代码往往结合了各种奇特的技巧,乍看起来会显得高深莫测。比方说你在教科书里看的大概是这样:&/p&&br&&div class=&highlight&&&pre&&code class=&language-text&&int main ( int argc, char** argv )
vector&string&
vec.push_back(&abc&);
for ( int i=0; i&vec.size(); i++ )
&/code&&/pre&&/div&&br&&p&你看了C++ Primer Plus,觉得C++也不过如此,并没有啥特别难以理解的地方。然而实际代码大概是这样的:&/p&&br&&p&嵌套的模板类(来自g2o的块求解器):&br&&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&BlockSolver&/span&&span class=&o&&&&/span& &span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&BlockSolverTraits&/span&&span class=&o&&&&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&o&&&&/span& &span class=&o&&&::&/span&&span class=&n&&LinearSolverType&/span&&span class=&o&&*&/span& &span class=&n&&linearSolver&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&LinearSolverDense&/span&&span class=&o&&&&/span&&span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&BlockSolver&/span&&span class=&o&&&&/span& &span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&BlockSolverTraits&/span&&span class=&o&&&&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&o&&&&/span& &span class=&o&&&::&/span&&span class=&n&&PoseMatrixType&/span&&span class=&o&&&&/span&&span class=&p&&();&/span&
&span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&BlockSolver&/span&&span class=&o&&&&/span& &span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&BlockSolverTraits&/span&&span class=&o&&&&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&o&&&&/span& &span class=&o&&&*&/span& &span class=&n&&solver_ptr&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&BlockSolver&/span&&span class=&o&&&&/span& &span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&BlockSolverTraits&/span&&span class=&o&&&&/span&&span class=&mi&&3&/span&&span class=&p&&,&/span&&span class=&mi&&1&/span&&span class=&o&&&&/span& &span class=&o&&&&/span&&span class=&p&&(&/span& &span class=&n&&linearSolver&/span& &span class=&p&&);&/span&
&span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&OptimizationAlgorithmLevenberg&/span&&span class=&o&&*&/span& &span class=&n&&solver&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&OptimizationAlgorithmLevenberg&/span&&span class=&p&&(&/span& &span class=&n&&solver_ptr&/span& &span class=&p&&);&/span&
&span class=&n&&g2o&/span&&span class=&o&&::&/span&&span class=&n&&SparseOptimizer&/span& &span class=&n&&optimizer&/span&&span class=&p&&;&/span&
&span class=&n&&optimizer&/span&&span class=&p&&.&/span&&span class=&n&&setAlgorithm&/span&&span class=&p&&(&/span& &span class=&n&&solver&/span& &span class=&p&&);&/span&
&/code&&/pre&&/div&&br&&p&模板元(来自ceres的自动求导):&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span class=&k&&virtual&/span& &span class=&kt&&bool&/span& &span class=&nf&&Evaluate&/span&&span class=&p&&(&/span&&span class=&kt&&double&/span& &span class=&k&&const&/span&&span class=&o&&*&/span& &span class=&k&&const&/span&&span class=&o&&*&/span& &span class=&n&&parameters&/span&&span class=&p&&,&/span&
&span class=&kt&&double&/span&&span class=&o&&*&/span& &span class=&n&&residuals&/span&&span class=&p&&,&/span&
&span class=&kt&&double&/span&&span class=&o&&**&/span& &span class=&n&&jacobians&/span&&span class=&p&&)&/span& &span class=&k&&const&/span& &span class=&p&&{&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&o&&!&/span&&span class=&n&&jacobians&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&n&&internal&/span&&span class=&o&&::&/span&&span class=&n&&VariadicEvaluate&/span&&span class=&o&&&&/span&
&span class=&n&&CostFunctor&/span&&span class=&p&&,&/span& &span class=&kt&&double&/span&&span class=&p&&,&/span& &span class=&n&&N0&/span&&span class=&p&&,&/span& &span class=&n&&N1&/span&&span class=&p&&,&/span& &span class=&n&&N2&/span&&span class=&p&&,&/span& &span class=&n&&N3&/span&&span class=&p&&,&/span& &span class=&n&&N4&/span&&span class=&p&&,&/span& &span class=&n&&N5&/span&&span class=&p&&,&/span& &span class=&n&&N6&/span&&span class=&p&&,&/span& &span class=&n&&N7&/span&&span class=&p&&,&/span& &span class=&n&&N8&/span&&span class=&p&&,&/span& &span class=&n&&N9&/span&&span class=&o&&&&/span&
&span class=&o&&::&/span&&span class=&n&&Call&/span&&span class=&p&&(&/span&&span class=&o&&*&/span&&span class=&n&&functor_&/span&&span class=&p&&,&/span& &span class=&n&&parameters&/span&&span class=&p&&,&/span& &span class=&n&&residuals&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&n&&internal&/span&&span class=&o&&::&/span&&span class=&n&&AutoDiff&/span&&span class=&o&&&&/span&&span class=&n&&CostFunctor&/span&&span class=&p&&,&/span& &span class=&kt&&double&/span&&span class=&p&&,&/span&
&span class=&n&&N0&/span&&span class=&p&&,&/span& &span class=&n&&N1&/span&&span class=&p&&,&/span& &span class=&n&&N2&/span&&span class=&p&&,&/span& &span class=&n&&N3&/span&&span class=&p&&,&/span& &span class=&n&&N4&/span&&span class=&p&&,&/span& &span class=&n&&N5&/span&&span class=&p&&,&/span& &span class=&n&&N6&/span&&span class=&p&&,&/span& &span class=&n&&N7&/span&&span class=&p&&,&/span& &span class=&n&&N8&/span&&span class=&p&&,&/span& &span class=&n&&N9&/span&&span class=&o&&&::&/span&&span class=&n&&Differentiate&/span&&span class=&p&&(&/span&
&span class=&o&&*&/span&&span class=&n&&functor_&/span&&span class=&p&&,&/span&
&span class=&n&&parameters&/span&&span class=&p&&,&/span&
&span class=&n&&SizedCostFunction&/span&&span class=&o&&&&/span&&span class=&n&&kNumResiduals&/span&&span class=&p&&,&/span&
&span class=&n&&N0&/span&&span class=&p&&,&/span& &span class=&n&&N1&/span&&span class=&p&&,&/span& &span class=&n&&N2&/span&&span class=&p&&,&/span& &span class=&n&&N3&/span&&span class=&p&&,&/span& &span class=&n&&N4&/span&&span class=&p&&,&/span&
&span class=&n&&N5&/span&&span class=&p&&,&/span& &span class=&n&&N6&/span&&span class=&p&&,&/span& &span class=&n&&N7&/span&&span class=&p&&,&/span& &span class=&n&&N8&/span&&span class=&p&&,&/span& &span class=&n&&N9&/span&&span class=&o&&&::&/span&&span class=&n&&num_residuals&/span&&span class=&p&&(),&/spa

我要回帖

更多关于 手机品牌 的文章

 

随机推荐