新書推薦:
《
《日本文学史序说》讲演录
》
售價:HK$
72.8
《
无尽的海洋:美国海事探险与大众文化(1815—1860)
》
售價:HK$
99.7
《
治盗之道:清代盗律的古今之辨
》
售價:HK$
122.1
《
甲骨文丛书·剑桥世界暴力史(第一卷):史前和古代世界(套装全2册)
》
售價:HK$
210.6
《
甲骨文丛书·中华早期帝国:秦汉史的重估
》
售價:HK$
300.2
《
欲望与家庭小说
》
售價:HK$
98.6
《
惜华年(全两册)
》
售價:HK$
70.3
《
甲骨文丛书·古代中国的军事文化
》
售價:HK$
99.7
編輯推薦:
《程序员2016精华本》为你记录这一年计算机技术发展,不只关注时下流行技术,也整理行业的历史与思考,不只在今天有意义,也希望对明天的你有价值。
2016技术关键词:人工智能、深度学习、VR(虚拟现实)、无人驾驶、视频直播、移动架构、开源大数据、物联网开发、容器技术《程序员2016精华本》用更广的视野、更审慎的态度精心讲述这些技术的现状与历史。
假如你入行不久,这本书将让你身临其境,感受行业中真实的一面。如果你已是摸爬滚打多年的老手,这本书不但能让你学到有效具体的技术方案,还能重现资深从业者的思考方式让你领略如果站在作者的角度上,会如何思考,怎样判断。
內容簡介:
《程序员2016精华本》是由程序员编辑部精心打造的,是对CSDN的《程序员》杂志2016年的全部优质内容再次进行了优化整合,内容更加聚焦,为你记录这一年计算机技术发展,不只关注时下流行技术,也整理行业的历史与思考。全书分为16大篇章、210篇文章,讲述成功产品背后的技术、人和事,聚焦技术实践、关注前沿热点、开发者年度必备。
關於作者:
程序员编辑部,是CSDN《程序员》的策划和编辑者,《程序员》是国内针对开发人员的专业技术*威刊物,一直秉承服务中国IT人员的思想积极发展,在中国开发人员中拥有较高的知名度。是广大开发者了解技术发展趋势、学习与提高的重要参考资料。
目錄 :
对话大师
我们需要一次解决所有问题
访wiki创造者 Ward Cunningham1
CaffeOnSpark解决了三大问题
对话雅虎机器学习平台负责人2
务实至上:PHP之父Rasmus Lerdorf访谈录4
科研的秘诀
对话微软研究院负责人 Peter Lee 5
无人机的背后
宾夕法尼亚大学工程学院院长VijayKumar专访6
Alan Kay和他的浪漫愿景10
Alan Kay谈OO和FP 12
Alan Kay谈读书14
百问Alan Kay17
Peter Norvig:人工智能将是软件工程的重要部分 28
MINIX 30年之经验教训谈31
2016技术盘点
盘点2016年的移动 Web发展36
2016年人工智能技术进展大盘点 38
2016数据库技术盘点 44
2016年OpenStack总结 49
VR技术这一年的发展要点与未来展望 51
2016年游戏行业年终盘点
逃离还是守望?市场破局的一年54
互联网应用面面观
小米网技术架构变迁实践57
途牛网站无线架构变迁实践 59
搜狗商业平台基础架构演化实践62
58同城高性能移动Push推送平台架构演进之路 66
QQ会员活动运营平台的架构设计实践 70
基于Spark的百度图搜变现系统架构 73
快的打车架构实践78
饿了么移动App的架构演进80
宅米网性能优化实践
初创互联网公司的野蛮成长82
深入理解自动化测试架构 85
电商系统的高并发设计和挑战88
淘宝大秒系统设计思路 92
百度分布式交互查询平台
PINGO 架构迭代95
高并发金融应用架构优化与平台创新98
阅文集团分布式文件系统的设计与实现101
从0到1,一号店通用推荐平台的搭建105
先进的银行反欺诈架构设计107
高可用性系统在大众点评的实践与经验109
VIPServer:阿里智能地址映射及环境管理 系统详解112
小米异步消息系统实践116
Motan:支撑微博千亿调用的轻量级RPC框架118
360云查杀服务从零到千亿级PV的核心架构变迁120
乐视商城抢购系统深度实践125
携程移动端架构演进与优化之路126
技术解析开源大数据构造
群雄逐鹿,看2015开源大数据框架迭代 133
Jaguar,一种基于 YARN 的长时服务自动扩展架134
HDFS EC:将纠删码技术融入HDFS136
基于SQL on Hadoop的数据仓库技术 140
Spark 多数据源计算实践及其在 GrowingIO的实践 144
Impala的信息仓库:解读TQueryExecRequest 结构147
Spark Streaming实践和优化152
分布式数据库挑战与分析 154
Apache Eagle :分布式实时大数据性能和安全 监控平台157
大数据驱动下的微博社会化推荐 161
物联网开发初探
风口的物联网技术 165
物联网开发中意想不到的那些坑 166
无人机的GPS欺骗及防护措施 169
11个热门物联网开发平台的比较 172
物联网大数据平台TIZA STAR架构解析 174
Spark核心技术与实践
Spark 学习指南 177
Streaming DataFrame:无限增长的表格 178
层次化存储:以高性价比终结Spark的IO瓶颈 179
Spark在美团的实践181
向Spark开炮:1.6版本问题总结与趟坑 185
Spark在蘑菇街的实践187
Spark MLlib 2.0前瞻 190
科大讯飞基于Spark的用户留存运营分析及技术实现192
Spark Streaming与Kafka集成分析 195
Spark Streaming在猎豹移动的实践198
Spark Streaming构建有状态的可靠流式处理应用200
Spark Streaming在腾讯广点通的应用204
Spark Streaming ES构建美团App 异常监控平台 210
基于Spark一栈式开发的通信运营商社交网络212
基于 Spark 的公安大数据实时运维技术实践218
在Apache Spark 2.0中使用
DataFrames 和SQL的第一步 221
在 Apache Spark 2.0 中使用
DataFrames 和 SQL 的第二步 226
走进VR开发世界
VR 开发从何入手 229
VR硬件演进与其游戏开发注意事项 229
VR语境下的人机交互 233
使用Cocos开发 一款简单的 3D VR 抓钱游戏235
制作3A级VR游戏的难点
专访焰火工坊 CTO 王明杨 237
并非只有游戏才是 VR
专访 VR 制作人、导演董宇辉239
走进VR游戏开发的世界 240
叙事、画面和音效:解析VR游戏设计要点 245
VR 和 AR 需要什么样的自然表达?248
使用Unity开发HoloLens应用 249
VR应用设计的8个建议252
用虚幻4开发搭积木的VR游戏255
人工智能60年,后深度学习时代关键技术进展
语音识别系统及科大讯飞最新实践259
使用深度学习打造智能聊天机器人 261
无人驾驶:人工智能三大应用造就 老司机 265
知人知面需知心
论人工智能技术在推荐系统中的应用269
流动的推荐系统
兴趣 Feed 技术架构与实现272
SLAM刚刚开始的未来277
运用增强学习算法提升推荐效果279
以性别预测为例谈数据挖掘分类问题282
FPGA:下一代机器人感知处理器285
Google AlphaGo 技术解读
MCTS DCNN 289
基于Spark的异构分布式深度学习平台294
拓扑数据分析在机器学习中的应用 298
揭秘深度强化学习 300
无中生有计算机视觉探奇 302
知识图谱如何让智能金融变魔术 305
机器码农:深度学习自动编程308
图计算系统进展和展望 311
ICML 2016精选论文 315
SIGIR 2016精选论文317
KDD 2016精选论文 318
NIPS 2016精选论文 320
容器技术经验谈
Docker 的谎言323
Kubernetes微服务架构应用实践 324
使用Docker实现丝般顺滑的持续集成 327
Mesos高可用解决方案剖析330
新型资源管理工具 Myriad 使用初探334
基于OpenStack和Kubernetes构建组合云平台
网络集成方案综述 335
超融合架构与容器超融合339
容器集群管理技术对比342
现实中的容器技术运用案例 343
展望Docker 1.10镜像新面貌346
谈谈 Unikernel348
关于Docker你不知道的事
Docker Machine 350
再谈容器与虚拟机的那S
內容試閱 :
助你拓展视野,保持怀疑
1965 年,犹他大学电子工程系迎来了一位计算机课程讲师 Robert S. Barton。每堂课,他都在摧毁学生们对计算机的信念他让每位学生了解前人的工作,却不让学生信仰任何一种理论,于是他们不得不学习一切计算机理念,继而又在他的质疑下将刚建立起的信念推倒。学期结束时,不再有学生会执迷于某项技术,因为他们对一切充满怀疑。
Google AlphaGo 技术解读 MCTS DCNN
文 李理
2016 年 1 月,Google DeepMind 的文章在《自然》杂志发表, AlphaGo击败欧洲围棋冠军樊麾并且将要在3月份挑战李世石。 围棋和深度学习再次大规模高热度地出现在世人眼前。
围棋的估值函数极不平滑,差一个子局面就可能大不相同, 同时状态空间大,也没有全局的结构。这使得计算机只能采用 穷举法并且因此进展缓慢。Google 的 AlphaGo 通过 MCTS 和深度 学习的结合实现了围棋人工智能的突破,已经击败人类职业选 手。本文分析这两种技术在围棋 AI 的应用以及 AlphaGo 的创新。
MCTS
MCTS(Monte Carlo Tree Search)和 UC TUpper Con?dence Bound for Trees
MCTS 算法就是从根节点(当前待评估局面)开始不断构建 搜索树的过程。具体可以分成 4 个步骤,如图 1 所示。
图 1 from A Survey of Monte Carlo Tree Search Methods
■ Selection
使用一种Policy从根节点开始,选择一个最紧急(urgent) 的需要展开(expand)可展开(expandable)的节点。可展开的 节点是非叶子节点(非游戏结束局面),而且至少还有一个孩 子没有搜索过。比如图1展示的选择过程,最终选择到的节点 不一定是叶子节点(只要它还有未搜索过的孩子就行)。
■ Expansion
选中节点的一个或者多个孩子展开并加入搜索树,图1的 Expansion 部分展示了展开一个孩子并加入搜索树的过程。
■ Simulation
从这个展开的孩子开始模拟对局到结束,模拟使用的策略 叫 Default Policy。
■游戏结束有个得分(胜负),这个得分从展开的孩子往 上回溯到根节点,更新这些节点的统计量,这些统计量会影响 下一次迭代算法的 Selection 和 Expansion。
经过足够多次迭代之后(或者时间用完),我们根据某种 策略选择根节点最好的一个孩子(比如访问次数最多,得分最 高等)。
上面的算法有两个 Policy:Tree Policy 和 Default Policy。 Tree Policy 决定怎么选择节点以及展开;而 Default Policy 用于 Simulation(也有文献叫 playout,就是玩下去直到游戏结束)。
MCTS 着重搜索更 urgent 的孩子,当然偶尔也要看看那些不那么 promising 的孩子,说不定是潜力股。这其实就是 exploit 和 explore 平衡的问题。另外,MCTS 直接 Simulation 到对局结束, 回避了局面评估的难题。
既然是 exploit 和 explore 的 问 题, 把 UCB 用 到 MCTS 就 是 UCT 算法(MCTS 是一族算法的统称,不同的 Tree Policy 和 Default Policy 就是不同的 MCTS 算法)。
UCT 算法
Selection 和 Expansion 的公式如上,和 UCB 很类似,只是 多了一个常量 Cp,用来平衡 exploit 和 explore。
每个节点v都有两个值, Nv和Qv,代表v访问过的次数(每 次迭代都是从 root 到结束状态的一条 Path,这条 Path 上的每个 点都被 visit 一次)和v的回报,如果这次 Simulation 己方获胜, 则Qv 1,否则Qv-1。(1、3、5... 层代表自己,2、4、6... 代 表对手,如果最终我方获胜,1、3、5都要加一而2、4、6都 要减一)。
具体的计算公式如上,每次选孩子时都用上面的公式计算 得分。第一项就是这个节点的平均回报(exploit term)和第二 项就是 explore term,访问次数少的节点更应该被 explore。当 Nv=0时第二项值为无穷大,所以如果某个节点有未展开的孩 子,总是优先展开,然后才可能重复展开回报高的孩子。
UCT 算法的特点
■ Aheuristic
不需要估值函数,因此也就不需要各种启发式规则、领域 知识,从而回避了围棋估值函数难的问题。
■ Anytime
可以任何时候结束,迭代的次数越多就越准确 。
■ Asymmetric
和人类的搜索类似,搜索树是不对称的,不是固定层次的, 而是重点搜索 promising 的子树。
UCT 在围棋领域的变种和改进
All Moves As First(AMAF)和 Rapid ActionValue Estimation(RAVE)
这是很多开源 MCTS 围棋使用的一个变种。
如图 2 我们首先通过 UCT 的 Tree Policy 选择了 C2 和 A1,然后 Default Policy 选择了 B1、A3、C3,最终黑棋获胜。
普通的 MCTS 会更新 C2 和 A1 的 Nv 和 Qv,而 AMAF 认为:既然在 Simulation 的过程中黑方选择了 B1 和 C3,在 root 节点时也可以选择 B1 和 C3,那么这次模拟其实也可以认为 B1 和C3对获胜是有帮助的,root节点的B1和C3也有贡献(标志为*),也应该更新统计量,让下次选择它的概率大一点。同理白棋在simulation的时候选择了A3,在C2也可以选择A3(有*的那个),那么 C2 对于白棋失败也是有责任的,那么下次在 C2 的时候白棋应该避免选择 A3。这样一次迭代就能多更新一些节点(那些没有直接 Selection 的也有一些统计量)。
图 2 AMAF
这个想法对于围棋似乎有些道理(因为不管哪个顺序很可能导致一样的局面,前提是没有吃子),而且实际效果也不错。但是在别的地方是否可以使用就需要看情况了。
这里有两类统计量:直接 selection 的节点统计量 A1,C2 和间接 selection 的节点 B1,C3,A3。这两种权重应该是不一样的。
所以比较直观的想法是给它们不同的权重 A 1-U,这就是 -AMAF。
这个权重 是固定的,RAVE 认为随着模拟次数的增加 应该减少才对(没有真的模拟是可以用这些间接的统计量,如果有了真的更准确的估计,这些间接的统计量就应该降低权重,这个想法也很自然)。
RAVE 使用上面的公式动态调整 ,随着 vn 的增加,的值不断下降。
Simulation 的改进
默认的 Default Policy 随机的选择走法模拟到结束,这在没有任何先验知识的时候是可以的。但是人类在探索未知局面时不是随机探索的,也是用一个估值函数指导的,去探索那些更 promising 的局面。
具体方法很多,比如 Contextual Monte Carlo Search,
Fill the Board 以及各种基于 Pattern 的方法。细节就不再展开讨论了。
MCTS 的并行搜索
Leaf Parallelisation
最简单的是 Leaf Parallelisation,一个叶子用多个线程进行多次 Simulation,完全不改变之前的算法,把原来一次 Simulation的统计量用多次来代替,这样理论上应该准确不少。但这种并行的问题是需要等待最慢的那个结束才能更新统计量,而且搜索的路径数没有增多。
Root Parallelisation
多个线程各自搜索各自的 UCT 树,最后投票。
Tree Parallelisation
这是真正的并行搜索,用多个线程同时搜索 UCT 树。当然统计量的更新需要考虑多线程的问题,比如要加锁。
另外一个问题就是多个线程很可能同时走一样的路径(因为大家都选择目前看起来 Promising 的孩子),一种方法就是临时的修改 virtual loss,比如线程 1 在搜索孩子 a,那么就给它的Qv 减一个很大的数,这样其他线程就不太可能选择它了。当然线程 1 搜索完了之后要记得改回来。
《A Lock-free Multithreaded Monte-Carlo Tree SearchAlgorithm》使用了一种 lock-free 的算法,这种方法比加锁的方法要快很多,AlphaGo 也用了这个方法。
Segal 研究了为什么多机的 MCTS 算法很难,并且实验得出结论使用 virtual loss 的多线程版本能比较完美地 scale 到 64个线程(当然这是单机一个进程的多线程程序)。这也将是AlphaGo 的 scalability 的瓶颈。
使用了UCT算法之后,计算机围棋能提高到KGS 2d的水平。
.......