首页 文章 精选 留言 我的

精选列表

搜索[工程师],共10000篇文章
优秀的个人博客,低调大师

面试总结——Java高级工程师

试前面也总结了一和二, 这第三篇可能更偏向于是内心的独白篇和面试技巧总结吧..... 一、独白 之前也面试别人,现在轮到自己找工作,怎么说呢,每个面试官的看法不一样,面试的方式就不一样,比如我面试别人我喜欢问项目中他用到了那些,然后针对用到的技术去问一些问题,或者说对于某些场景的一些技术实现方案是我特别喜欢问的,比如当你的接口服务数据被人截包了,你如何防止数据恶意提交? 相对来说,Java的底层和基础会问的少一点,当然问的少不是代表不问,而是说侧重点在于你的所做过的项目和你的设计思路如何。当然,懂基础和底层更好,这样能让你知其然,更知其所以然,写出来的代码和程序更具有健壮性和可维护性。所以说,基础还是很重要的。 现在轮到自己出去面试,怎么说呢,其实还是挺紧张的,原以为自己不会因此紧张或者焦虑,实际上,还是有的,在没找到合适的工作的时候,甚至晚上有点睡不着觉,总觉着有什么事压在心头,睡觉都不安心。既然睡不着,那还是看看资料吧,我有个习惯,睡前看点问题,第二天早上就能想到答案,睡前记点资料,第二天早上就能记得特别深刻,不说废话了,直接进入正题吧。 二、面试技巧 1、背熟你的简历 原因:面试的第一个问题,一般都是让你简单介绍下你自己,或者介绍一下你最近的项目,而一个面试者,如果连自己的简历都无法熟知,对里面提到的项目、技术都无法描述清楚的话,我想没有哪家公司会接受这样的,哪怕你是超级人才,你自我表述不行,估计也会为此头疼,所以,切记:一定要背好自己的简历,不要求你能全部记下,至少要熟记你最近所待过的两家公司,这两家公司里面你做过的项目,你负责的模块,项目里面用到的技术以及相对应的技术实现方案(这个尤为重要)。 2、深入了解并熟记部分java基础知识 原因:大部分公司无论面试初级还是高级,无论是笔试还是面试,都会问到一系列基础题,这些基础题大概涵括jvm、字符串、集合、线程等等,如果说每一个让你死记硬背你肯定记不住,那么就是理解中记忆了,拿jvm来说 ,如果让你谈谈你对jvm的理解, 那么你首先得知道JVM有哪些结构组成,每个结构用来做什么的,然后考虑一个Java对象从创建到回收,如何途径JVM这些结构的。如果你从这些方面来综合记忆,相信事半功倍,并且你理解的更透彻。 至于如果让你谈集合,举例List集合下面ArryList、LinkedList、Vector等集合的区别,那么同样的方法,你需要理解每一个的结构组成是什么,你才能知道他有什么作用,这样你在平时的用法上会更精炼,而且在面试过程中,也不至于哑口无言。 3、保持自信心和沉重冷静的心态 原因:面试过程中,自信是少不了的,相信你可以, 面试的路上可以自己对自己说一句: I belive I can ! 反正我就是这么做的,自我的心里暗示吧,其实面对面试官的时候,你自信的状态也会让面试官觉得你是个很有底气的人,至少从感觉上会给你打个高分。另外还有就是保持沉重冷静,如果是让你提供技术方案或者说说某个技术原理,没必要一紧张一咕噜的什么都说,你可以对面试官说:我先想想,然后自己组装记忆中的知识,组装下语言,有条理的说出来,这样能更好的表现你的才能,不是吗? 面试谁都会紧张,我也会紧张,有时候明明记得的知识点忘了,没关系,大胆的说忘了,或者直接说不知道。 要记住,有部分不知道没关系,如果全都知道,那你应该是CTO级别了(开个玩笑)。 4、尽量记住面试过程中你回答不出来或者回答存在不妥的问题 原因:面试失败了没关系,毕竟每个公司的要求不一样,问的问题和你擅长的方面可能有所出入,但是请记住一点:面试过程中那些你回答不出来问题,或者你自己感觉回答不太准确的问题,自己记下来,如果不会的,你可以当场问问面试官有没有好的解答,如果面试官不愿意告诉你(一般是基础方面面试官就懒得答你),那么你就自己回家慢慢查资料,如果是某些特定的技术,也可以自己写写案例什么的,毕竟知识点就那么多,问题百变,原理不变,面试也是一个学习知识的过程,让你了解大部分公司目前需要或者要求的技术。这次不知道,下次就知道了 5、去面试之前,最好先了解你要去面试公司的情况(包括产品、项目情况) 原因:俗话说,知己知彼,百战不殆,面试就是一场战斗,你需要了解你面试公司基本情况,包括岗位要求,这样你就能大概知道你需要面试的这家公司的技术要求情况。 为何让你去了解这家公司的主营产品和项目呢,就是让你大概了解这家公司的一个技术架构的情况,包括你可能对他们的一种实现方式提出质疑和疑惑,相信面试官很愿意帮你解答这些问题的。这样你既图了表现,也学到了知识,何乐而不为。 6、合理安排你的面试时间(如果有多家公司的面试机会,尽量把你想去的公司放到最后去面试) 原因:估计很多人都不理解这个,可能大部分的人对于如何安排面试时间比较迷茫,随意安排。可是这里有个技巧,如果同时有多个面试机会,你把你最想去的公司放到最末尾去面试,这样你经历过了前面的这些公司筛选,如果成功了是个机会,如果没成功,也是为最后做铺垫。 不过这里就需要考虑两点:1、你需要记住你投简历的公司和基本情况(这说明你不是海投的) 2、如果记不住,那么可以先应答一个时间,后续了解公司信息之后,通过邮件或者其他方式与其约定,调整面试时间。而且建议安排一天的面试公司不要超过两家,最好的是上午一家,下午一家,这样你能有充足的时间调整状态。 三、面试题基础总结 1、 JVM结构原理、GC工作机制详解 答:具体参照:JVM结构、GC工作机制详解,说到GC,记住两点:1、GC是负责回收所有无任何引用对象的内存空间。 注意:垃圾回收回收的是无任何引用的对象占据的内存空间而不是对象本身,2、GC回收机制的两种算法,a、引用计数法 b、可达性分析算法( 这里的可达性,大家可以看基础2 Java对象的什么周期),至于更详细的GC算法介绍,大家可以参考:Java GC机制算法 2、Java对象的生命周期 答:创建阶段 、 应用阶段 、不可见阶段 、不可达阶段 、收集阶段 、终结阶段、 对象空间重新分配阶段等等,具体参照:Java 对象的生命周期 3、Map或者HashMap的存储原理 答:HashMap是由数组+链表的一个结构组成,具体参照:HashMap的实现原理 4、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果) 答:看A、B两字段做组合索引的时候,谁在前面,谁在后面,如果A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,如果只是使用前面%,那么有索引效果,如果使用双%号匹配,那么则无索引效果 5、数据库存储日期格式时,如何考虑时区转换问题? 答:使用TimeStamp , 原因参照:java编程中遇到的时区转换问题 6、JavaObject类中有哪些方法? 答:Object有哪些方法 7、HTTP协议,GET和POST 的区别 答:浅谈HTTP中GET和POST的区别 四、线程、设计模式、缓存方面 1、SimpleDataFormat是非线程安全的,如何更好的使用而避免风险呢 答:关于SimpleDateFormat安全的时间格式化线程安全问题 2、如何看待设计模式,并简单说说你对观察者模式的理解 答:1、设计模式有神马用2、观察者模式类图及实现 3、集群环境中,session如何实现共享 答:1、Java集群之session共享2、session多服务器共享方案,还有一种方案就是使用一个固定的服务器专门保持session,其他服务器共享 4、分布式、集群环境中,缓存如何刷新,如何保持同步? 答:A、缓存如何刷新?1、定时刷新 2、主动刷新覆盖,每个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和 Ehcache举例, 他们都有自带的过期机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖即可 B、缓存如何保持同步? 这个redis有自带的集群同步机制,即复制功能,具体参考:基于Redis分布式缓存实现,Ehcache也有分布式缓存同步的配置,只需要配置不同服务器地址即可,参照:Ehcache分布式缓存同步 5、一条sql执行过长的时间,你如何优化,从哪些方面? 答:1、查看sql是否涉及多表的联表或者子查询,如果有,看是否能进行业务拆分,相关字段冗余或者合并成临时表(业务和算法的优化) 2、涉及链表的查询,是否能进行分表查询,单表查询之后的结果进行字段整合 3、如果以上两种都不能操作,非要链表查询,那么考虑对相对应的查询条件做索引。加快查询速度 4、针对数量大的表进行历史表分离(如交易流水表) 5、数据库主从分离,读写分离,降低读写针对同一表同时的压力,至于主从同步,MySQL有自带的binlog实现 主从同步 6、explain分析sql语句,查看执行计划,分析索引是否用上,分析扫描行数等等 7、查看mysql执行日志,看看是否有其他方面的问题 个人理解:从根本上来说,查询慢是占用mysql内存比较多,那么可以从这方面去酌手考虑 五、设计方案相关 面试还会问到一些关于设计方案相关的问题,比如 1、你的接口服务数据被人截包了,你如何防止数据恶意提交? 答:我们可以在接口传输参数里面设置一个业务编号,这个编号用来区分是否重复提交。这样即使数据被抓包了,对方也无法区分每个字段你的含义,这时,这个业务编号的作用就来了 2、假设服务器经常宕机,你从哪些方面去排查问题? 答:这个就留个各位看官补充了,可评论回复 总而言之该看的还是得看,还学的还是得学。再次强调,基础很重要!面试技巧同样很重要,还是那句话:祝愿各位看官都能找到心仪的工作吧~~ 另外,奉劝大家不要频繁跳槽,这些知识点能提升固然好,不要盲目跳槽,找工作很累的,而且没有哪家公司喜欢频繁跳槽的员工 java程序猿跳槽应该学哪些方面的技术 互联网产品、大型企业级项目常会用到的: 并发处理技术。具体到Java上通常是涉及java.util.concurrent、并发锁机制、NIO等方面,当然最近比较火爆的Netty框架也可以作为高并发处理的备选方案之一,这需要对Java的线程调度机制有着比较深的理解。不过这些可能会涉及并发控制的对象(比如reentrantlock等)只能存在于一个JVM里的问题,一旦系统规模大到需要部署多个JVM来处理并发的情况,则需要采用共享session的技术(比如spring-session),或者尽可能将系统后台设计为无状态的服务,这需要对RESTful有着较深的理解。 高可用、负载均衡技术。互联网产品、企业级应用通常要求一年里的Downtime控制在很小的范围内,这需要足够的高可用和负载均衡架构来支撑,这个一般和Java技术本身没太大关系,但却是一名初级程序员向高级程序员甚至是架构师CIO进阶的必备技术,因此可以适当了解一下Nginx、HAProxy等对这方面的支持。另外现在最“时髦”的做法是将应用docker化,配合ETCD、kubernetes等工具在容器的层面上实现高可用和负载均衡,当然这需要看实际的需求,最时髦的不见得是最适用的,要考虑构建成本。 缓存技术。缓存应该是大型系统中或高并发条件下提高响应速度的亘古不变的真理(虽然也看到过淘宝搜索商品功能采用的大数据处理技术实现的零缓存的文章,但能达到淘宝的体量和技术水平一般不太可能),这方面的工具太多了,ehcache、memcached、redis……从Java的角度来讲,需要了解的一是Java对这些工具的连接器,二是缓存技术背后的JSR-107标准,可以参考spring-cache的实现,阅读一下源码加深理解。 异步处理技术。这通常也是抵消高并发的处理手段之一,从Java的角度看最简单的异步处理就是新启动一个异步线程,这同样也需要对Java的线程调度有所了解,当然也可使用Spring中的@Async之类的也可以简单实现异步线程的处理。如果是非常消耗资源的业务处理,简单的异步线程是满足不了需求的,这就需要一些消息中间件来做这些异步处理了,消息中间件有很多,activemq、rabbitmq、kafka……需要了解的是Java对这些中间件的连接器。不过异步处理中最关键的是事务保证的问题,这可能需要对事务的两步提交有所了解。 在这里我有一个专门为跳槽java开发人员想要跳槽准备的一个线路图: 一共分为5大专题: 工程化专题: 源码分析: 分布式/高可用/高并发专题: 双十一架构: 性能优化: 工作一到五年的程序员朋友面对目前的技术无从下手,感到很迷茫可以加群744677563,里面有阿里Java高级大牛直播讲解知识点,分享知识,课程内容都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

优秀的个人博客,低调大师

NET工程师求职面试必杀技

一、.NET框架 开发人员应该熟悉.NET FrameWork体系结构和基本原理,熟悉CLR(公共语言运行时)和MSIL(中间语言),熟悉.NET框架中的委托、线程、序列化、集合、垃圾回收机制、反射等内容。 二、面向对象软件开发 开发人员应该熟悉面向对象软件开发(OOP)基本概念,熟悉面向对象软件开发中的类、继承、封装、多态等概念,具备良好的面向对象软件开发思想和设计原则。 不论是采用何种软件开发框架,还是使用不同的开发语言,面向对象软件开发在其中畅通无阻。 三、反射 通过反射技术可以得知类的详细信息,包括成员变量、属性、方法,可以实现动态加载技术(Java也有类似技术)。 四、正则表达式 用正则表达式可以轻松实现对数据的校验和修改、替换等,这个最先在Perl语言中的技术,现在已经各个编程语言广泛吸收了,在.Net中掌握了这门技术对文本操作也是轻松平常。 五、C# 开发人员应该熟练掌握C#这门面向对象编程语言,虽然.NET框架支持多种编程语言,但C#无疑是最简洁、使用者最广泛和功能最强大的一种。 C#是一门年轻的语言,它的出现,让更多的开发者爱上了C#,脱离了VB和ASP的阵营,造成离别。 六、ASP.NET 开发人员应该理解ASP.NET的页面生命周期、熟悉配置文件的格式、熟悉ASP.NET的各种服务器控件和数据控件、了解ASP.NET中的各种对象,了解ASP.NET2.0新特性。 七、数据库 开发人员需了解各种主流数据库,熟悉数据库的规范设计、精通SQL及存储过程、触发器的编写。 八、AJAX技术(JAVASCRIPT和XML) XML和JAVASCRIPT的跨平台特性,在实际软件开发中的运用越来越广泛,由于现代软件对用户界面和WEB前端的日益重视,集JAVASCRIPT和XML技术于大成的AJAX正在流行,特别是在基于WEB2.0的网站开发中。 JAVASCRIPT和XML技术已经出现多年,此前一直不痛不痒,但由于集JAVASCRIPT和XML于大成的AJAX技术的出现及其在互联网上的不断应用,又重新焕发出生命活力,将众多的开发者牢牢系住,在2006年红透了整个IT界,2007年AJAX技术将继续红火。 九、设计模式 有了IDE,懂一些基本语法就可以编写.Net程序了,再熟练一些就可以编写出高效率的程序了,如果想程序更灵活,将来更容易扩展和适应更多的需求变化,你就需要了解、掌握设计模式了。 十、软件体系架构(拳头) 优秀的软件离不开优秀的软件体系架构,作为开发人员,要想在IT行业更进一步,需要具备系统的、良好的软件体系架构思维,从而从更高层次决定软件的整体系统框架。 结束语:无论多可怕的武器,也比不上人类的信心。所以人类最厉害的武器。便是自己的信心。相信你自己,做最好的自己,你就会成功! 本文转自周金桥51CTO博客,原文链接:http://blog.51cto.com/zhoufoxcn/166980 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

高级Linux工程师常用软件清单

作为Linuxer,你一定很好奇别人在玩Linux的时候系统里面都装了什么软件,我曾经也是这样,今天为了打开这个脑洞的尴尬局面,我把我在ubuntu的使用过并觉得值得推荐的应用或工具推荐给你,当然如果你有更好的工具欢迎你留言。 目录 日常工具 系统工具 开发工具 终端工具 一、日常工具篇 1.1、Google Chrome Google Chrome是一个由Google公司开发的免费网页浏览器,其应用商店有众多出色的应用以及插件,此应用属于跨平台于Mac、Linux、Windows、Android等,因而数据的同步就okay了;此外它还拥有一个开源的兄弟Chromium。强烈推荐 方法一:在官网下载对应版本的deb后执行 sudodpkg-i*.deb&&sudoapt-getinstall-fy 方法二:包管理apt-get安装 sudoapt-getinstallgoogle-chrome-stable 刚说了Google Chrome有众多的出色的插件,那还是得说几个我常用的AdBlock:最受欢迎的Chrome扩展,拥有超过4000万用户!屏蔽整个互联网上的广告The QR Code Extension:允许当前页面生成QR码,并使用网络摄像头扫描QR码。Window Resizer:调节屏幕的分辨率,诸多时候用户开发Vimium:vim的分身Proxy SwitchyOmega:轻松快捷地管理和切换多个代理设置Wechat:微信马克飞象:使用印象笔记扩展程序一键保存精彩网页内容到印象笔记帐户惠惠购物助手:【网易出品】在您网购浏览商品的同时,自动对比其他优质电商同款商品价格,并提供商品价格历史,帮您轻松抄底,聪明网购不吃亏JSON-handle:顾名思义就是处理JSON数据的工具 ... ... 1.2、FirefoxFirefox即火狐浏览器,它是一个安全高效且体积小的浏览器,它具有速度快、隐私保护、不同设备之间同步数据、个性化定制等特性,对于我来说呢,Firefox具有众多的开发插件。 sudoapt-getinstallfirefox-y 1.3、Gparted GParted是一个分区工具,它可以用于创建、删除、移动分区,调整分区大小,检查、复制分区等操作。可以用于调整分区以安装新操作系统、备份特定分区到另一块硬盘等 sudoapt-getinstallgparted-y 1.4、搜狗输入法 搜狗输入法顾名思义,它就是一个输入法。 在官网下载deb后,执行 sudodpkg-i*.deb&&sudoapt-getinstall-fy 1.5、FileZilla FileZilla是一个免费开源的FTP软件,分为客户端版本和服务器版本,具备所有的FTP软件功能。可控性、有条理的界面和管理多站点的简化方式使得Filezilla客户端版成为一个方便高效的FTP客户端工具。 sudoapt-getinstallfilezilla 1.6、WPS WPS是由金山软件股份有限公司自主研发的一款办公软件套装,可以实现办公软件最常用的文字、表格、演示等多种功能。具有内存占用低、运行速度快、体积小巧、强大插件平台支持等特点。 在官网下载对应版本的deb后执行 sudodpkg-i*.deb&&sudoapt-getinstall-fy 顺便路过提提LibreOffice,它也是是一款功能强大的办公套件,默认在ubuntu自带,强迫症看起来不舒服不使用。 1.7、有道翻译 有道词典是由网易有道出品的全球首款基于搜索引擎技术的全能免费语言翻译软件,为全年龄段学习人群提供优质顺畅的查词翻译服务 #在官网下载对应版本的deb后执行 sudodpkg-i*.deb&&sudoapt-getinstall-fy 1.8、网易云音乐 网易云音乐是一款专注于发现与分享的音乐产品,依托专业音乐人、DJ、好友推荐及社交功能,为用户打造全新的音乐生活。 #在官网下载对应版本的deb后执行 sudodpkg-i*.deb&&sudoapt-getinstall-fy 网易云音乐最小化托盘问题 ,解决方案:把原来的Exec那行改为 Exec=env XDG_CURRENT_DESKTOP=Unity netease-cloud-music %U 1.9、VLC VLC是一款自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,以及 DVD、音频 CD、VCD 及各类流媒体协议。 sudoapt-getinstallvlc-y 附带暗转媒体解码框架 sudoapt-add-repositoryppa:mc3man/trusty-media sudoapt-getupdatesudoapt-getinstallUbuntu-restricted-extrasffmpeggstreamer0.10-plugins-uglylibavcodec-extra-54libvdpau-va-gl1libmad0mpg321gstreamer1.0-libav 1.10、Kazam Kazam是 Ubuntu 上一款简易的桌面屏幕录制工具,它只能录制整个屏幕,可以录制声音,并可以快速上传录制好的视频到 YouTube 及 VideoBin 视频分享网站上。 sudoadd-apt-repositoryppa:and471/kazam-daily-builds sudoapt-getupdate sudoapt-getinstallkazam 1.11、Silentcast Silentcast是一款专注于GIF录制工具。 sudoadd-apt-repositoryppa:sethj/silentcast sudoapt-getupdate sudoapt-getinstallsilentcast 1.12、Smplayer Smplayer是一款开源的跨平台软件,其在Linux、Windows系统中有重要地位,影音播放能力很强大。 sudoapt-getinstallsmplayer 1.13、Audience Audience是一款简洁而强大的视频播放器,怎么说呢:简洁到不能再简洁。它是ElementaryOS系统默认的视频播放器,强烈推荐! sudoapt-getinstallaudience 1.14、Gimp Gimp是一个图片编辑器,优雅地取代windows、mac下的另一个ps软件。 sudoadd-apt-repositoryppa:otto-kesselgulasch/gimp sudoapt-getinstallgimp 1.15、Krita Krita是一个位图形编辑软件,包含一个绘画程式和照片编辑器。Krita是开源软件软件,Krita和gimp是有很大区别的,一句通俗的言语来表名:gimp是编辑图像用的,krita是画画用的。 sudoadd-apt-repositoryppa:kubuntu-ppa/backports sudoapt-getinstallkdelibs-binkbuildsycoca4--noincrementalkrita-y 1.16、gedit gedit是一个基于GNOME桌面环境下兼容UTF-8的文本编辑器。它使用GTK+编写而成,因此它十分的简单易用,有良好的语法高亮,对中文支持很好,支持包括gb2312、gbk在内的多种字符编码。甚至你可以配置成用于开发的IDEA,我才不折腾这个呢。 sudoapt-getinstallgedit 我还是经常习惯使用ElementaryOS自带的scratch-text-editor编辑器,不过它在ElementaryOS中使用搜狗输入法有一个bug:就是在非root下不能输入中文。 解决方案: #将原来的 Exec=scratch-text-editor%U X-GNOME-Gettext-Domain=scratch-text-editor#改成如下 Exec=envGTK_IM_MODULE=ximscratch-text-editor%U X-GNOME-Gettext-Domain=envGTK_IM_MODULE=ximscratch-text-editor 既然讲到了文本编辑器,肯定少不了vim,接触过linux的几乎都认识这家伙,我也不多说。Vim最少必要知识 1.17、x11vnc客户端 x11vnc是一种 位图显示的 视窗系统 。它是在 Unix 和 类Unix 操作系统 ,以及 OpenVMS 上建立图形用户界面的标准工具包和协议。x11vnc服务端可以实现Windows远程Linux桌面系统。 sudoapt-getinstallx11vnc 1.18、Shadowsocks-qt5 Shadowsocks-qt5是一个科学上网利器工具。在天朝莫谈国情,说说Shadowsocks原理就好,它是将原来 ssh 创建的 Socks5 协议拆开成 Server 端和 Client 端,两个端分别安装在境外服务器和境内设备上。 sudoadd-apt-repositoryppa:hzwhuang/ss-qt5 sudoapt-getupdate sudoapt-getinstallshadowsocks-qt5-y 1.19、VirtualBox VirtualBox是一款由德国 Innotek 公司开发的开源虚拟机软件。号称是最强的免费虚拟机软件,它不仅具有丰富的特色以及轻量级的体积,而且性能也很优异!可虚拟的系统包括所有的Windows系统、Mac OS X、Linux、OpenBSD、Solaris、IBM OS2甚至Android等操作系统!为了完整地使用VirtualBox,尽量安装VirtualBox Extension Pack。 #在官网下载对应版本的deb后执行 sudodpkg-i*.deb&&sudoapt-getinstall-fy 1.20、Steam Steam是一个整合游戏下载平台,很少玩游戏也不多少了#_# sudoapt-getinstallsteam 1.21、electronic-wechat electronic-wechat是一个基于nodeJS开发的Linux系统微信。 gitclonehttps://github.com/geeeeeeeeek/electronic-wechat.git cdelectronic-wechat npminstall&&npmstart 1.22、Skype Skype 是一款即时通讯软件,具备视频聊天、多人语音会议、传送文件、文字聊天等功能。它允许用户进行跨平台的视频呼叫,可与使用电脑、手机、电视、PSV 等多种终端的 Skype 用户进行视频通话。 1.23、 Transmission Transmission 是一个 BitTorrent 客户端软件,它支持速度限制、制作种子、远程控制、磁力链接、数据加密、损坏修复、数据来源交换等功能。 sudoapt-getinstalltransmission 1.24、 thunderbird thunderbird是又是一个简洁易用的邮箱客户端。 sudoapt-getinstallthunderbird 1.25、XMind XMind是一款实用的思维导图软件,简单易用、美观、功能强大,拥有高效的可视化思维模式,具备可扩展、跨平台。但是对于稳定性和性能还是欠佳,在ubuntu上使用占用很大的CPU资源。 #在官网下载对应版本的deb后执行 sudodpkg-i*.deb&&sudoapt-getinstall-fy 1.26、Okular Okular 是一个 PDF 文档阅读软件,支持 PDF、TIFF、CHM、ODF、EPUB、mobi 等文档格式。 sudoaptinstallokular-y 1.27、FocusWriter FocusWriter 是一款写作软件,为了让您的写作空间尽可能的多且不受打扰,FocusWriter 将几乎所有的工具栏都自动隐藏在屏幕边缘。利用 FocusWriter 写作便利流畅,您还可以设置闹钟和每日任务,非常适合撰稿人、小说写手、剧本作家使用。左蓝推荐! sudoaptinstallfocuswriter 1.28、Typora Typora是极简的Markdown编辑器,合并了写作和预览。支持表格、代码编辑,拖拽插图等,非常好用;喜欢它的原因也就是:美观、免费。 sudoapt-keyadv--keyserverkeyserver.ubuntu.com--recv-keysBA300B7755AFCFAE sudoadd-apt-repository'debhttps://typora.iolinux/' sudoapt-getupdate sudoapt-getinstalltypora 1.29、OBS Studio OBS Studio是一款跨平台的,开源的视频录制和在线直播客户端软件。我觉得一点不好的体验就是不能刻录整个屏幕。ymengyue推荐 sudoapt-getinstallffmpeg sudoadd-apt-repositoryppa:obsproject/obs-studio sudoapt-getupdate&&sudoapt-getinstallobs-studio 其他系统安装查看 1.30、Pencil Pencil是一款开源的原型图绘制工具,手绘风格的,就像自己在纸上画的那样。还可以用来绘制各种架构图和流程图,同时还提供 Firefox 的插件。对于经常做设计的人来说是一个不错的软件,可谓是linux下的visio。 wget-chttp://pencil.evolus.vn/dl/V3.0.1/Pencil_3.0.1_i386.deb sudodpkg-iPencil_3.0.1_i386.deb 1.31、Remmina Remmina是一个用远程桌面软件,提供了RDP、VNC、XDMCP、SSH等远程连接协议的支持。这个客户端最大的优点在于界面清爽,方便易用,创建远程连接的界面与Windows自带的远程桌面十分相近。可以到Linux软件管理器中搜索下载安装,十分方便. sudoapt-getinstallremmina 1.32、Meld Meld是针对开发者的视觉差异和合并工具。MELD帮助您比较文件、目录和版本控制的项目。它提供了两个和三个比较的文件和目录,并支持许多流行的版本控制系统。既可以查看差异有可以同步! sudoapt-getinstallmeld 二、系统工具篇 2.1、deepin-scrot deepin-scrot是深度团队开发的一个截图工具。在deepin深度系统作为默认的截图软件,在debian系统安装需要在终端命令使用,为了方便推荐定义快捷键配合使用。强烈推荐! #安装wgethttp://packages.linuxdeepin.com/deepin/pool/main/d/deepin-scrot/deepin-scrot_2.0-0deepin_all.deb sudodpkg-ideepin-scrot_2.0-0deepin_all.deb sudoapt-getinstall-f#使用deepin-scrot 2.2、Albert Spotlight Albert Spotlight是 Ubuntu的一项快速、随打即找、系统支援的桌面搜寻特色。spotlight 被设计为可以找到任何位于电脑中广泛的项目,包含文件、图片、音乐、应用程式、系统喜好设定控制台,也可以是文件或是PDF中指定的字。优雅地取代了Mac中的mac Spotlight。 sudoadd-apt-repositoryppa:noobslab/macbuntu sudoapt-getupdate sudoapt-getinstallalbert 2.3、Guake Terminal Guake是一个下拉式的gnome桌面环境下的终端程序,因此你只需要按一个键就可以调用他,然后再按一次以便隐藏他。Guake支持快捷键、标签、背景透明等特性。一句话:GuakeTerminal是linux下完美帅气的终端! sudoadd-apt-repositoryppa:webupd8team/unstable sudoapt-getupdate sudoapt-getinstallguake 2.4、bleachbit bleachbit是系统ubuntu系统减肥的一门"中药",用于清理系统没用的垃圾文件。 sudoadd-apt-repositoryppa:n-muench/programs-ppa sudoapt-getupdate sudoapt-getinstallbleachbit-y 2.5、psensor psensor是监控系统硬件实时状况的一款软件,使用psensor可视化显示系统温度,需要基于lm-sensors和hddtemp等获得的数据。因此你需要在安装psensor的同时,一并安装这两款工具。 sudoadd-apt-repositoryppa:jfi/ppa sudoapt-getupdate sudoapt-getinstalllm-sensorshddtemppsensor-y 2.6、Indicator Netspeed Indicator Netspeed是一款基于Unity的用于显示软件上传和下载网络流量的软件。 sudoadd-apt-repositoryppa:nilarimogard/webupd8 sudoapt-getupdate sudoapt-getinstallindicator-netspeed 2.7、gnome-system-monitor gnome-system-monito是一款基于GNOME桌面的系统监视器软件。不过使用它有点占内存,我还是习惯终端处理。 sudoapt-getinstallgnome-system-monitor 2.8、catfish catfish简称文件搜索神器。 sudoapt-getinstalcatfish 2.9、docky dockey是一款一个号称花钱也买不到的菜单启动器。为什么这麽说的?很简单:它是开源的,很简洁更美观。就连Mac下的docky都是模仿它的,O(∩_∩)O哈哈~,不要傻了,开玩笑的。 sudoapt-getinstalldocky 2.10、TLP TLP 是一款Linux流行的电源工具软件。你可以使用TLP来调整系统电池,有助于有更好延长电池寿命。 sudoadd-apt-repositoryppa:linrunner/tlp sudoapt-getupdate sudoapt-getinstalltlptlp-rdw sudotlpstart 2.11、menulibre menulibre是一个简洁易用的菜单编辑器。 sudoadd-apt-repositoryppa:menulibre-dev/devel sudoapt-getupdate sudoapt-getinstallmenulibre 2.12、indicator-sysmonitor indicator-sysmonitor是一个系统动态信息监控工具。可以实时查看电脑的cpu,内存占用率,更可以查看网速,非常方便 sudoadd-apt-repositoryppa:fossfreedom/indicator-sysmonitor sudoapt-getupdate sudoapt-getinstallindicator-sysmonitor 三、开发工具篇 3.1、Jetbrains 全家桶 Jetbrains_IDEA全家桶基基于java语言开的一个工具套餐,而且基本覆盖了主流的开发编程语言,还包含了开发ios/macOS的工具。Jetbrains_IDEA包含了哪些工具呢,看图、手累截图! Jetbrains 全家桶 3.2、Brackets Brackets是一款使用 HTML,CSS,JavaScript 创建的开源的针对 Web 开发的编辑器。它具有什么优秀的特性的呢:实时预览,快速编辑,跨平台,可扩展,开源,Brackets是一款非常优秀的编辑器,但是我就是不用它O(∩_∩)O哈哈~。 #天朝问题,漫长的等待,推荐下载安装sudoadd-apt-repositoryppa:webupd8team/brackets sudoapt-getupdate sudoapt-getinstallbrackets sudoadd-apt-repository-rppa:webupd8team/brackets 3.3、Android Studio Android Studio是啥我也就不说了,怕挨揍(^o^)/~用来开发安卓的~~~ 顺手推荐几个网站 镜像源androiddevtools 开源库codekk 3.4、Sublime Text Sublime Text是一个轻量、简洁、高效、跨平台的编辑器。不能再多解释了,只能简单说说它的优点: 可以编辑诸多主流的编程语言 语法高亮、代码提示补全、代码折叠、自定义皮肤/配色方案、多便签 代码地图、多种界面布局与全屏免打扰模式 完全开放的用户自定义配置与神奇实用的编辑状态恢复功能 雷电般快速的文件切换 随心所欲的跳转:快速罗列与定位函数/HTML的元素、跳转到指定行 集所有功能于一身的命令面板 Package Contro扩展包管理器 3.5、Atom Atom是GitHub推出的一款基于Web技术开发的桌面端的编辑器,其主要的特点是现代, 易用, 可定制。被称为21世纪的黑客编辑器我就笑笑O(∩_∩)O哈哈~ sudoadd-apt-repositoryppa:webupd8team/atom sudoapt-getupdate sudoapt-getinstallatom 3.6、sqliteman sqliteman是一款小巧的图形化管理SQLite数据库的软件。轻量级、小巧、功能全面。为它点个赞,推荐! sudoapt-getinstallsqliteman 3.7、Git、GitG Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。简而言之就是代码管理工具,常用Git命令记录。既然提到了Git,那么也要说说它的朋友SVN,同样它俩的性质是一样的不必多说,SVN的安装与基本使用 sudoapt-getinstallgit gitg是一个用于查看Git版本控制系统的工具,基于Gnome桌面环境。我还是习惯在终端干这些活。 sudoapt-getinstallgitg 3.8、MySQL workbench MySQL workbench是一款专为MySQL设计的ER/数据库建模工具,但是在ElementaryOS还是存在不少的问题的。 #在官网下载对应版本的deb后执行 sudodpkg-i*.deb&&sudoapt-getinstall-fy 3.9、monodevelop MonoDevelop 是个适用于Linux、Mac和Windows的开放源代码集成开发环境,目前支持的语言有Python、Vala、C#、Java、BOO、Nemerle、Visual Basic .NET、CIL、C与C++。 sudoapt-getinstallmonodevelopg++xterm-y 3.9、Genymotion Genymotion是一套完整的工具,它提供了Android虚拟环境,支持Windows、Linux和Mac OS等操作系统,容易安装和使用。开发安卓选择Genymotion模拟器是最佳的选择,除非你使用真机,其实后来我就是选择真机的——笑:-D。 #在官网下载对应版本的deb后执行,需要注册后才能下载 sudodpkg-i*.deb&&sudoapt-getinstall-fy 3.10、Android Screen Monitor Android Screen Monitor简称ASM,是一款监视手机或者模拟器屏幕的工具。 时光机传送安装与使用教程 四、Terminal Tools 4.1、enca、iconv enca、iconv都是文件编码转换工具。 #安装sudoapt-getencaiconv 简单使用 #enca查看文件编码encafilename#iconv将一个GBK编码的文件转换成UTF-8编码enconv-Lzh_CN-xUTF-8filename 4.2、Figlet 一句话:Figlet是一个将字符串在终端生成一个logo的终端工具。 sudoapt-getinstallfiglet 4.3、oh-my-zsh oh-my-zsh是终极Shell,就这么一句话! sudoapt-getinstallgit-ywgethttps://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh-O-|sh zsh的配置文件位于用户目录/home/$USER/.zshrc,zsh主题,我的配置文件部分如下: #oh-my-zsh的安装路径exportZSH=/home/alic/.oh-my-zsh#主题设置ZSH_THEME="robbyrussell"#大小写是否敏感CASE_SENSITIVE="false"#连字符敏感HYPHEN_INSENSITIVE="true"#zsh是否自动不更新DISABLE_AUTO_UPDATE="true"plugins=(git) source$ZSH/oh-my-zsh.sh#语言环境exportLANG=en_US.UTF-8 4.4、Asciinema Asciinema是一个用 ClojureScript 编写的开源命令行录屏工具。对于详细的终端刻录工具可以查看Linux 终端录制工具。 sudoapt-add-repositoryppa:zanchey/asciinema sudoapt-getupdatesudoapt-getinstallasciinema 录制使用 asciinemarec 使用 exit 或者 Ctrl+D快捷键结束录制。它会在结束录制的时候提示,如果要上传的话,敲回车。上传之后,Asciinema 会给出一个网址。 #想嵌入网页<scripttype="text/javascript"src="https://asciinema.org/a/2xcuc0651qtirbj8dkmmtf2nf.js"id="asciicast-https://asciinema.org/a/2xcuc0651qtirbj8dkmmtf2nf"async></script> 4.5、Aria2 aria2是 Linux 下一个命令行下轻量级、多协议、多来源的高速下载工具。 sudoapt-getinstallaria2 使用说明 #简单使用:只需要加上下载链接即可aria2c${link}#分段下载aria2c-s2${link} Aria2 在百度云环境可以不限速下载,传送Aria2 - 可能是现在下载百度云资料速度最快的方式 4.6、Proxychains4 Proxychains4是一个终端挂代理的工具,可自由切换代理。使用简单只需要在命令前加上proxychains4即可! gitclonehttps://github.com/rofl0r/proxychains-ng.gitcdproxychains-ng sudo./configure–prefix=/usr–sysconfdir=/etc sudomake&&sudomakeinstall&&sudomakeinstall-configcd..&&rm-rfproxychains-ng 配置文件位于/usr/local/etc/proxychains.conf 将socks4 127.0.0.1 9095改为 socks5 127.0.0.1 ${port} {$user} ${pwd} 4.7、Ubuntu Make Ubuntu Make 原名 Ubuntu Developer Tools Center,是一款开源的命令行工具软件,主要是针对开发者,它可以安装大量的开发工具。 sudoadd-apt-repositoryppa:ubuntu-desktop/ubuntu-make sudoapt-getupdate sudoapt-getinstallubuntu-make 比如安装Webstorm sudoumakeidewebstorm 4.8、sshfs SSHFS最炫的地方在于可在本地安装的文件系统中,通过SSH获得所有加密的通信优势。sshfs 是基于 FUSE构建的 SSH 文件系统客户端程序,通过它远程主机的配置无需作任何改变,就可以透过 SSH 协议来挂载远程文件系统了,非常方便及安全。 sudo apt-getinstall sshfs 文章摘自运维派 微信 转载请注明出处 本文转自 ChinaUnicom110 51CTO博客,原文链接:http://blog.51cto.com/xingyue2011/1948651

优秀的个人博客,低调大师

百度工程师浅析强化学习

作者 |Jane 导读 本文主要介绍了强化学习(Reinforcement Learning,RL)的基本概念以及什么是RL。强化学习让智能体通过与环境的交互来学习如何做出决策,以获得最大的累积奖励。文章还介绍了策略梯度(Policy Gradient,PG)和近端策略优化(PPO)等强化学习算法。 全文7099字,预计阅读时间18分钟。 01 强化学习(Reinforcement Learning,RL) 1.1 基本概念&什么是RL 强化学习(reinforcement learning,RL)专注于让智能体(agent)通过与环境的交互来学习如何做出决策,以使其在不断变化且不确定的环境中获得最大的累积奖励。 这个过程可以用以下几个要素来描述: 智能体(Agent):智能体是执行动作并与环境进行交互的实体。它可以是一个机器人、一个虚拟角色、一个算法等。 环境(Environment):环境包括智能体所处的所有上下文,包括外部条件、状态变量和其他影响智能体的因素。 动作(Action):智能体可以在环境中执行的操作,这些操作可能会改变环境的状态。 状态(State):状态是描述环境的当前情况的信息。智能体的决策通常依赖于当前状态。 奖励(Reward):在每个时间步,智能体执行一个动作后会获得一个奖励信号,用于指示动作的好坏。目标是最大化累积奖励。 策略(Policy):策略定义了智能体如何根据当前状态选择动作。强化学习的目标之一是找到一个最优策略,使智能体能够获得最大的累积奖励。 价值函数(Value Function):价值函数衡量了在某个状态下执行某个策略能够获得的预期累积奖励。这个函数帮助智能体评估不同状态的重要性。 学习过程:强化学习的核心是智能体通过尝试不同的动作并观察奖励信号来学习适应性策略。它可以使用不同的算法,如Q-learning、Deep Q-Networks(DQN)、Policy Gradient等。 △图1 强化学习过程 其中状态(State)是对整个环境的完整描述,包括了所有对智能体的决策和行动有影响的信息。状态通常用来指导智能体的决策,因为它提供了有关环境当前状态的全部信息。 观测(Observation)则是对状态的一种抽象描述,它可能会忽略或省略一些状态信息。在实际问题中,有时候智能体无法直接观测到完整的状态,而只能获取到一部分信息,即观测。这可能是因为某些信息无法直接测量,或者因为为了简化问题而对状态进行了抽象。 因此,智能体基于它的观测来做出决策,而不是直接使用完整的状态。这就需要智能体具备从观测中学习有关状态的信息的能力,以便更好地进行决策和行动。 下面举一些可应用强化学习的示例: 1、在电子游戏中,摇杆是智能体,主机是环境,显示屏上的游戏画面(像素)是观测,击杀怪物得分则是奖励。 2、在阿法狗围棋对弈中,阿法狗是智能体,人类棋手是环境,棋局是观测,围棋的输赢则是奖励。 在强化学习中,智能体持续与环境进行交互,采取一系列的动作,从而形成一个状态和动作的序列,这个序列被称为轨迹(trajectory): 一个交互序列被称为一个回合(episode),在每个回合中,智能体根据当前状态选择动作,与环境互动,并根据奖励信号进行学习和策略优化,以获得最大化累积奖励。 这里需要注意的是,环境对我们来说是黑盒,是不可控的,它在当前状态下跳转到下一状态是服从一定的分布的,也就是说它是有一定的随机性的,那么它产出的奖励也具有了一定的随机性。我们可控的是actor的policy,即可以通过学习,让policy在面对状态 s 时采取一个能让他获得最大奖励的action。所以实际上我们的目标是最大化期望的累积奖励(expected cumulative reward)。 1.2RL和监督学习的区别 监督学习: 1. 数据独立同分布(i.i.d.):监督学习假设样本是从一个未知分布中独立地采样得到的,数据之间没有时序关联。 2. 标签信息:在监督学习中,每个样本都有正确的标签信息,即模型需要学习从输入到标签的映射关系。 3. 训练目标:监督学习的目标是使模型的预测尽可能地接近真实标签,通常通过最小化预测与真实标签之间的损失函数来实现。 4. 局限性:监督学习在需要大量标记数据、难以获取所有可能状态的标签信息或者数据之间存在时序关联的情况下可能受限。 强化学习: 1. 时序关联数据:强化学习中智能体的观测是时序关联的,当前的决策会影响未来的观测和奖励。 2. 延迟奖励:强化学习中智能体在做出决策后不会立即得到奖励,奖励可能在未来的时间步骤才会出现,这就需要智能体通过试错来学习哪些决策导致了最终的奖励。 3. 探索与学习:强化学习中智能体需要在探索和利用之间找到平衡,以发现能够最大化长期累积奖励的有效策略。 4. 超越人类表现:强化学习的一个优势在于它可以在某些情况下超越人类表现,因为智能体可以自主探索环境并发现人类难以想象的优化策略。 1.3 RL算法类型 按不同类型的智能体方法划分: 1.基于价值的智能体(Value-Based Agents):智能体显式地学习价值函数,然后从学习到的价值函数中隐式地推导出策略,例如Q-learning和Sarsa,这些算法在训练过程中更新状态-动作值函数(Q值),然后根据Q值选择最佳动作。 2.基于策略的智能体(Policy-Based Agents):智能体直接学习策略,即在给定状态下选择每个动作的概率分布。策略梯度(Policy Gradient)方法是一种常见的基于策略的强化学习方法,它通过梯度下降或其他优化算法来更新策略参数,以最大化累积奖励。 3.演员-评论员智能体(Actor-Critic Agents):这是一种综合了前两种方法的智能体。演员(Actor)负责学习策略,而评论员(Critic)负责学习价值函数。演员根据策略选择动作,评论员基于环境的反馈和学习的价值函数提供有关动作的评估。这种结合可以帮助解决价值和策略学习中的某些困难问题,并且在实际应用中表现出很好的性能。 按是否需要对环境建模来划分: 1.Model-Based 方法:需要对环境建模,包括状态转移函数(描述状态之间如何转换)和奖励函数(描述在每个状态下获得的奖励)。一旦模型被建立,智能体可以在模型中进行"心算",即通过模型进行推演,而无需真正地与环境进行交互。这使得智能体可以在模型上进行试错,寻找在真实环境中表现良好的策略。然而,这种方法的关键挑战在于如何准确地建立一个模型,因为环境可能非常复杂且不确定。 2.Model-Free 方法:不需要显式地构建环境模型,而是智能体直接与环境交互,通过尝试和观察来学习策略。这种方法通常需要更多的交互时间和数据,因为智能体需要通过实际的试验来逐步改进策略。Model-free 方法可以分为基于价值和基于策略的方法,前者关注学习状态或状态-动作的价值函数,后者则直接学习策略。 在实际应用中,"model-based"方法可能需要更少的交互次数来找到较优策略,因为它在模型上进行预测和规划。然而,这个模型的建立可能会面临挑战,尤其是在复杂和不确定的环境中。"model-free"方法则更加适用于无法准确建模的情况,但可能需要更多的实际交互来学习策略。选择使用哪种方法通常取决于问题的性质以及可用的数据和计算资源。 02 策略梯度(Policy Gradient,PG) 强化学习的3个核心组成部分:actor(policy、agent)、环境 和 奖励函数。环境和奖励函数不是我们可以控制的,我们能做的是调整Actor的策略,使得它获得最大的奖励。策略一般记作\(\pi\) ,如果使用深度学习来做强化学习,策略就是一个network,其参数记作\(\theta\)。其输入是观测(或states),输出是动作空间的一个概率分布 。(同一个states,同一个env,所采去的action也是可能不同的,所以这里是概率分布,action是具有一定的随机性的)。 △图2 神经网络作为策略 奖励的稀疏性和延迟性? 如果把玩一场游戏看做一个回合(episode),在一个episode里,actor不断与环境进行交互,即在s1时采取了action a1,并获得奖励r1,环境接收a1后跳转到s2,actor看到s2后采取了action a2,并获得奖励r3,...,直至达到某个条件结束游戏。这一个episode里,把环境输出 s 和actor输出 a 以及奖励输出 r 的序列组合起来,就形成了一个轨迹(trajactory): △图3 最大化奖励 计算某个轨迹发生的概率就是: 目标是通过调整actor的参数\(\theta\),最大化整个轨迹中获得的total奖励:\(R(\tau)=\sum_{t=1}^T r^t\) 但是由于采取action的随机性,环境输出states的随机性,得到的reward也是有随机性的,所以在计算中我们需要最大化的不是某个回合的奖励,而是最大化期望奖励。(直观上理解:平均意义上的奖励最大化了,那么某个具体的回合他的奖励也不会小到哪儿去),所以目标就是最大化\(R(\tau)\)的期望值 最大化问题,可以使用梯度上升(gradient ascent)来求解,使用梯度更新公式来更新参数,这就是策略梯度算法。(核心就是采样数据,更新参数,再采样数据,再更新参数。。。) 接下来就是计算\(\bar{R_{\theta}}\)的梯度 再看下\(\bar{R_{\theta}} =\sum_{\tau} R(\tau)p_{\theta}(\tau) = E_{\tau \sim p_{\theta}} [R(\tau)]\) 期望的这个公式的意义:从分布\(p_{\theta}(\tau)\)采样一个轨迹 \(\tau\),计算\(R(\tau)\)的期望值,就是期望奖励(expected reward)。我们要最大化期望奖励。即相当于我们穷举所有的轨迹,每个轨迹对应一个概率。但这个期望无法计算,因为没法穷举所有的轨迹。如何解决呢?=>大数定理:做N次采样,用平均代替期望。 注意, \(p(s_1)\)和\(p(s_{t+1}|s_t,a_t)\)来自环境,由环境决定,\(\theta\)与 无关,因此\(\nabla \log p(s_1)=0\),\(\nabla\sum_{t=1}^{T}\log p(s_{t+1}|s_t,a_t)=0\) 2.1 2个问题 接下来探讨2个问题: 1.如果采取每个action的奖励都是正的,只是有大有小,会出现什么问题? 2.整个episode里每个(s, a)pair都使用了同一个total reward合适吗?这样公平吗?一场游戏输了那里面的每个step的操作都是失败的吗?一场游戏赢了,中间就不会有失误吗? 如何解决这些问题? 解决问题1:增加baseline 如果采取每个action的奖励都是正的,只是有大有小,会出现什么问题? 例如如果所有的 r >= 10,那么r=10就相对来说是『负』的。也就是说在采样中,没有被采样到的动作的概率会被下降,但该动作不一定是不好的动作,因此奖励最好是有正有负的,这可以增加baselinse解决: 通过这种方法,当\(R(\tau)-b>0\)时即总奖励\(R(\tau)>b\),就让\((s,a)\)的概率上升;当\(R(\tau)<b\),即便\(R(\tau)\)是正的,但如果它值很小也是不好的,就让\((s,a)\)的概率下降。 \(b\)可通过对\(\tau\)值取期望来进行设置, 即计算\(\tau\)的平均值,令\(b \approx E[R(\tau)]\)。实践中把训练期间的\(R(\tau)\)的值不断记下来然后计算平均值,用来设置b。 解决问题2:分配合适的分数 1、reward-to-go:未来的总回报 把\(\nabla\log p_{\theta}(a_{t}^n|s_t^n)\)前面的\((R(\tau)-b)\)看作是它的权重,表征了动作a的好坏。这个权重原先是整个轨迹上奖励的总和,现在改成从某个时刻\(t\)开始,一直到游戏结束得到的所有奖励的总和。也就是说计算某个状态-动作对的奖励的时候,不再是把整场游戏得到的奖励全部加起来,而是只计算从这个动作执行以后得到的奖励。直观上也比较容易理解:因为这场游戏在执行这个动作之前发生的事情是与执行这个动作是没有关系的,所以在执行这个动作之前得到的奖励都不能算是这个动作的贡献。我们把执行这个动作以后发生的所有奖励加起来,才是这个动作真正的贡献。 2、discount有折扣的:衰减的回报 进一步,我们在未来的奖励中引入折扣因子。为什么要把未来的奖励做一个折扣呢?因为虽然在某一时刻,执行某一个动作,会影响接下来所有的结果(有可能在某一时刻执行的动作,接下来得到的奖励都是这个动作的功劳),但在一般的情况下,时间拖得越长,该动作的影响力就越小。 折扣因子\(\gamma \in [0,1]\),一般设置为0.9或0.99。其中\(G_t = r_t^n + \gamma r_{t+1}^n + \gamma^2 r_{t+2}^n + \gamma^3 r_{t+3}^n +...+ \gamma^{T_n-t} r_{T_n}^n =r_t^n+\gamma G_{t+1}\) 。从\(G_t\)的展开式可以看到未来的奖励在离t时刻越远时,折扣就越多,这样显然更合理。 2.2 重要性采样 策略梯度算法的缺点: 1.采样效率低:每次当前actor策略与环境交互收集到一批训练资料后,策略一更新,这批数据就不能再使用了,因为actor已经发生了变化,需要重新拿新的actor再次与环境与做交互,拿到新的一批训练资料。而与环境做交互是非常费时间的(相对于在GPU上作训练),整个过程可能大部分时间在做交互收集(采样)数据。 2.迭代步长过长,或步长/学习率难以确定,训练不稳定。 采样效率低的问题,考虑下能不能用另外一个策略\(\pi_{\theta‘}\)和一个actor\(\theta’\)与环境交互,用\(\theta’\)采样到的数据去训练\(\theta\),并且利用这些数据去让\(\theta\)多次执行梯度上升,多次更新参数, 这样就能大幅提升效率。 如何实现这个过程呢? 这个公式可以看做是先从\(q\)里面从采样\(x\),再计算\(f(x) \frac{p(x)}{q(x)}\),再取期望值。所以即便没法从\(p\)里面采样数据,但从\(q\)里面采样数据,我们依然可以通过这种变换来计算从采样\(p\)代入\(x\)以后的期望值。因为是从采样数据,所以我们从采样出来的每一笔数据,都需要乘一个\(\frac{p(x)}{q(x)}\)来修正这两个分布的差异,这个修正银子就叫做重要性权重(importance weight)。 对于用 actor\(\theta\)采样出\(s_t\)与\(a_t\)的状态-动作的对时,我们使用状态-动作对的优势(advantage):\(A_{\theta}(s_t,a_t)\), 来表示累积奖励减去基线这一项,这一项代表的是在状态\(s_t\)采取动作\(a_t\)的好坏(有没有优势)。如果\(A_{\theta}(s_t,a_t)\)是正的,就要增大概率;如果是负的,就要减小概率。 那么回到上面策略梯度的采样效率的问题,就可以考虑,由一个\(p_{\theta’}\)也就是另一个actor(其实就是需要更新的actor的一个副本)去和环境做交互然后收集采样数据,再用这个数据去多次更新\(p_{\theta}\)以提升采样效率。也就是说利用重要性采样,就可以把公式转化为: 上式第3行利用条件概率公式展开,最后去掉\(p_{\theta}(s_t)\)和\(p_{\theta‘}(s_t)\)得到最终的简化的结果。所以根据梯度公式我们可以写出目标函数: 重要性采样解决了采样效率的问题,但也可能会引入新问题。我们再来看下重要性采样的公式:\(E_{x\sim p}[f(x)]=E_{x\sim q}[f(x)\frac{p(x)}{q(x)}]\),虽然它们期望是相等的,但它们的方差如何呢?根据方差计算公式\({Var} [X]=E[X^2]-(E[X])^2\),分别计算出\(f(x)\)和\(f(x)\frac{p(x)}{q(x)}\)的方差: 可以看到2个方差的第一项是不同的,\(\operatorname{Var}_{x \sim q}\left[f(x) \frac{p(x)}{q(x)}\right]\)的第一项多乘了\(\frac{p(x)}{q(x)}\),如果\(\frac{p(x)}{q(x)}\)差距很大,\(p_{\theta}\left(a_{t} | s_{t}\right)\)的方差就会很大。也就是说如果\(p_{\theta}\left(a_{t} | s_{t}\right)\)与\(p_{\theta'}\left(a_{t} | s_{t}\right)\)相差太大,即这两个分布相差太多,重要性采样的结果就会不好。也就是说通过有限次的采样,如果\(p(x)\)和\(q(x)\)的差距过大,我们是无法保证这个期望的等式在采样数据上一定成立。 怎么避免它们相差太多呢?这就是TRPO和PPO要做的事情。 2.3 TRPO 信任区域策略优化(trust region policy optimization,TRPO)就是对\(\theta\)与\(\theta'\)进行一个约束,让它们的 KL 散度小于: 虽然TRPO解决了分布差距不会很大的问题,但计算有难度(引入约束项,使用拉格朗日的对偶法处理后,采用共轭梯度法进行优化),因此我们一般使用在实现上更容易但性能差不多的PPO。 03 近端策略优化(PPO) 3.1 PPO1(近端策略优化惩罚(PPO-penalty)) **PPO(ProximalPolicyOptimization)**解决TRPO计算量大的问题,不是把约束放在条件里,而是直接放到目标函数里: 其中惩罚项\(\beta \mathrm{KL}\left(\theta, \theta^{k}\right)\)称之为自适应KL散度(adaptive KL divergence),\(\beta\)可以动态调整,其调整策略为: 如果\(KL(\theta,\theta^k)>KL_{max}\),则增加\(\beta\) 如果\(KL(\theta,\theta^k)<KL_{min}\),则减小\(\beta\) 3.2 PPO2(近端策略优化裁剪(PPO-clip)) 如果我们觉得计算 KL 散度很复杂,那么还有一个PPO2算法,PPO2 即近端策略优化裁剪。近端策略优化裁剪的目标函数里面没有 KL 散度,其要最大化的目标函数为 裁剪(clip)函数,裁剪函数是指,在括号里面有3项,如果第一项小于第二项,那就输出\(1-\varepsilon\);第一项如果大于第三项,那就输出\(1+\varepsilon\)。 \(\varepsilon\)是一个超参数,是我们要调整的,可以设置成 0.1 或 0.2 。 为什么这个式子就可以做到\(p_{\theta}\)和\(p_{\theta'}\)差距不会太大呢? 如果\(A>0\),也就是某一个\((a_t,s_t)\)是好的,则我们希望增大这个状态-动作pair的概率。也就是想让\(p_{\theta}(a_t∣s_t)\)越大越好,但它与\(p_{\theta^k}(a_t∣s_t)\)的比值不能超过\(1+\varepsilon\); 如果\(A<0\),也就是某一个\((a_t,s_t)\)是不好的,那则我们希望把\(p_{\theta}(a_t∣s_t)\)减小,当减到比值是\(1-\varepsilon\)的时候停止。 通用这个clip的限制,我们不会让\(p_{\theta}(a_t∣s_t)\)和\(p_{\theta^k}(a_t∣s_t)\)差距太大,并且实现这个其实也很简单,如下: ratios = paddle.exp(cur_batch_log_probs - batch_log_probs.detach()) surr1 = ratios * A_k surr2 = paddle.clip(ratios, 1-self.clip, 1-self.clip) * A_k actor_loss = -paddle.minimum(surr1, surr2) # 负号,把最大化问题转化为最小化问题ratios = paddle.exp(cur_batch_log_probs - batch_log_probs.detach()) surr1 = ratios * A_k surr2 = paddle.clip(ratios, 1-self.clip, 1-self.clip) * A_k actor_loss = -paddle.minimum(surr1, surr2) # 负号,把最大化问题转化为最小化问题 04 总结 ——END—— 参考资料: [1]https://datawhalechina.github.io/easy-rl/#/ [2]https://speech.ee.ntu.edu.tw/~hylee/ml/2020-spring.php 推荐阅读: 浅谈统一权限管理服务的设计与开发 百度APP iOS端包体积50M优化实践(五) HEIC图片和无用类优化实践 百度知道上云与架构演进 百度APP iOS端包体积50M优化实践(四)代码优化 百度App启动性能优化实践篇

优秀的个人博客,低调大师

百度工程师带你了解Module Federation

作者 | 一贫 导读 本文介绍了Module Federation的概念、应用场景,并结合具体的代码示例帮助大家对Module Federation的模块共享,公共依赖加载有个初步的认识,方便后续更深入的学习相关内容,同时也给微前端的探索提供一种新的思路,定会给大家一定的提升和启发。 全文5405字,预计阅读时间14分钟。 01 什么是Module Federation(MF)? 普遍直译为『模块联邦』,我们看看官网是怎么说的? Motivation Multiple separate builds should form a single application. These separate builds should not have dependencies between each other, so they can be developed and deployed individually. This is often known as Micro-Frontends, but is not limited to that. 多个独立的构建可以形成一个应用程序。这些独立的构建不会相互依赖,因此可以单独开发和部署它们。 这通常被称为微前端,但并不仅限于此。 通俗点讲,即MF提供了能在当前应用中远程加载其他服务器上应用的能力。对此,可以引出下面两个概念: host:引用了其他应用的应用 remote:被其他应用所使用的应用 △图片来源于网络 它与我们普遍讨论的基座应用、微应用有所不同,它是去中心化的,相互之间是平等的,每个应用是单独部署在各自的服务器,每个应用都可以引用其他应用,也能被其他应用所引用,即每个应用可以充当host的角色,亦可以作为remote出现。 △图片来源于网络 02 应用场景 微前端:通过shared以及exposes可以将多个应用引入同一应用中进行管理。 资源复用,减少编译体积:可以将多个应用都用到的通用组件单独部署,通过MF的功能在runtime时引入到其他项目中,这样组件代码就不会编译到项目中,同时亦能满足多个项目同时使用的需求,一举两得。 03 如何使用 项目结构如下: module-home:首页,在layout展示一个字符串。 module-layout:布局,只包含一个html模板。 module-lib:暴露工具方法,共享lodash库。 3.1 相关配置参数一览 3.2 各应用的配置 // apps/module-lib/webpack.config.js plugins: [ new ModuleFederationPlugin({ name: 'lib', filename: 'remoteLib.js', library: { type: 'var', name: 'lib' }, exposes: { // 提供工具方法 './utils': './index.js', }, shared: ["lodash"] }) ] // apps/module-home/webpack.config.js plugins: [ new ModuleFederationPlugin({ name: 'home', filename: 'remoteHome.js', library: { type: 'var', name: 'home' }, exposes: { // 提供挂载方法 './mount': './index.js', }, shared: ["lodash"] }) ] // apps/module-layout/webpack.config.js plugins: [ new ModuleFederationPlugin({ name: 'main', filename: 'remoteMain.js', remotes: { 'lib': 'lib@http://localhost:3001/remoteLib.js', 'home': 'home@http://localhost:3003/remoteHome.js', }, shared: ['lodash'] }), new HtmlWebpackPlugin({ template: path.resolve(__dirname, './public/index.html'), inject: 'body' }) ] // apps/module-layout/boot.js import {getUid, setUid} from 'lib/utils' // 使用module-lib中暴露的方法 import {mount} from 'home/mount' // 使用module-home中暴露的挂载方法 import _ from 'lodash'; setUid(); setUid(); console.log(getUid()) console.log(_.get) mount() 如下图所示:在layout中展示了home挂载的节点,控制台也打印了调用lib中方法的log,同时lib分享的lodash也生效了(全程只加载了一个lodash)。 3.3 以remoteLib为例简要分析 // 定义全局变量 var lib; /******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "webpack/container/entry/lib": /*!***********************!*\ !*** container entry ***! \***********************/ /***/ ((__unused_webpack_module, exports, __webpack_require__) => { eval("var moduleMap = {\n\t\"./utils\": () => {\n\t\treturn __webpack_require__.e(\"index_js\").then(() => (() => ((__webpack_require__(/*! ./index.js */ \"./index.js\")))));\n\t}\n};\nvar get = (module, getScope) => {\n\t__webpack_require__.R = getScope;\n\tgetScope = (\n\t\t__webpack_require__.o(moduleMap, module)\n\t\t\t? moduleMap[module]()\n\t\t\t: Promise.resolve().then(() => {\n\t\t\t\tthrow new Error('Module \"' + module + '\" does not exist in container.');\n\t\t\t})\n\t);\n\t__webpack_require__.R = undefined;\n\treturn getScope;\n};\nvar init = (shareScope, initScope) => {\n\tif (!__webpack_require__.S) return;\n\tvar name = \"default\"\n\tvar oldScope = __webpack_require__.S[name];\n\tif(oldScope && oldScope !== shareScope) throw new Error(\"Container initialization failed as it has already been initialized with a different share scope\");\n\t__webpack_require__.S[name] = shareScope;\n\treturn __webpack_require__.I(name, initScope);\n};\n\n// This exports getters to disallow modifications\n__webpack_require__.d(exports, {\n\tget: () => (get),\n\tinit: () => (init)\n});\n\n//# sourceURL=webpack://module-lib/container_entry?"); /***/ }) 1、moduleMap:用来映射expose的模块 2、get方法:导出给host应用,用于获取remote expose的模块 3、init方法:导出给host应用,用于将remote模块注入 get方法中调用了__webpack_require__.e加载chunk /******/ // This file contains only the entry chunk. /******/ // The chunk loading function for additional chunks /******/ __webpack_require__.e = (chunkId) => { /******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => { /******/ __webpack_require__.f[key](chunkId, promises); /******/ return promises; /******/ }, [])); /******/ }; __webpack_require__.e调用__webpack_require__.f /******/ __webpack_require__.f.consumes = (chunkId, promises) => { /******/ if(__webpack_require__.o(chunkMapping, chunkId)) { /******/ chunkMapping[chunkId].forEach((id) => { // 如果host已经有则直接使用,否则去remote安装 /******/ if(__webpack_require__.o(installedModules, id)) return promises.push(installedModules[id]); /******/ var onFactory = (factory) => { /******/ installedModules[id] = 0; /******/ __webpack_require__.m[id] = (module) => { /******/ delete __webpack_require__.c[id]; /******/ module.exports = factory(); /******/ } /******/ }; /******/ var onError = (error) => { /******/ delete installedModules[id]; /******/ __webpack_require__.m[id] = (module) => { /******/ delete __webpack_require__.c[id]; /******/ throw error; /******/ } /******/ }; /******/ try { /******/ var promise = moduleToHandlerMapping[id](); /******/ if(promise.then) { /******/ promises.push(installedModules[id] = promise.then(onFactory)['catch'](onError)); /******/ } else onFactory(promise); /******/ } catch(e) { onError(e); } /******/ }); /******/ } /******/ } /******/ })(); host加载自己的bundle main.js,其中使用jsonp加载对应remote提供的remoteLib.js; 在remote中暴露了全局变量,host将remote注入后可以获取对应模块,其中的共享模块使用前会检查自身有没有,如果没有再去加载remote的内容。 04 拓展学习 可以学习开源项目:基于 Webpack 5 Module Federation,优雅且实用的微前端解决方案 https://github.com/yuzhanglong/mf-lite。 ——END—— 参考资料: [1]How to Build a Micro Frontend with Webpack's Module Federation Plugin [2]Webpack 新功能 Module Federation 深入解析 [3]基于 Webpack Module Federation,这可能是一个比较优雅的微前端解决方案 [4]探索 webpack5 新特性 Module federation 在腾讯文档的应用 [5]Module Federation原理剖析 推荐阅读: 巧用Golang泛型,简化代码编写 Go语言DDD实战初级篇 Diffie-Hellman密钥协商算法探究 贴吧低代码高性能规则引擎设计 浅谈权限系统在多利熊业务应用 分布式系统关键路径延迟分析实践

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册