-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcontent.json
More file actions
1 lines (1 loc) · 801 KB
/
content.json
File metadata and controls
1 lines (1 loc) · 801 KB
1
{"posts":[{"title":"007 践行反思","text":"写这篇文章之前,查看了一下 007 公众号里面的数据,加入 83 班已经 134 天。但是自我感觉出了一些问题,借这次作业反思一下。 问题 主题。刚开始践行的时候,为了解决每周量产一篇文章的问题,自己想过每月文章主题的安排,但是现在更多地是随心所欲。 拖延。最近几次作业,虽然很早就知道要写什么内容,但是总拖到最后一天才打开会电脑开始写。 评论。说点题外话,由于自己一直有独立博客,所以认为评论数量是评价一个博客质量的标准。对上下楼文章的评论,也是 007er 每周作业中一个重要环节。其实每周对战友的评价很多时候是草草了事,蛮对不起战友的。 写作流。写作流属于工作流中的一个概念,工作流是一种规范化重复劳动的方法。刚开始有想过写作流,但也没有按照之前所写的实践。 1234567891011121314151617181920## 写作工作流1. 输入环节:通过阅读寻找灵感2. 加工整理:通过印象笔记里面的积累,来拓展思路3. 建立体系:搭建思考框架,通过回答 Why,What,How,How Good4. 写作输出 1. 快速输出草稿,使用录音宝App,口头费曼 2. 卡片式费曼,番茄工作法,幕布列出大纲 3. 文字素材迭代,文章中引入准确的数据、翔实的事例、有说服力的论述和观点 4. 图片素材及排版,复制html文本到简书中(图片设置居中) 5. 校对## 写作工作流 1. 收集资料2. 使用幕布列出大纲3. 按照大纲生成初稿4. 修改初稿5. 按照少数派稿件要求修改初稿并校对6. 以 html 格式复制到简书,在博客上发布7. 如果还发现错误,只修改博客上的文本 反思 针对上面发现的问题,自己想了一下解决的方案。 根据自己的特点,整理出四个主题。未来以月为单位,每周写其中的一个主题相关文章。主题如下: 月读:整理分享本月所读的一本书 卡片写作法:前几天加入的《笨方法学写作》课程,需要完成教练所提供的习题 数字生活:我的效率类软件实践。 机器之心:下一阶段学习的重点,机器学习入门的笔记。 关于拖延。每月确定这个月需要写的文章类型,在写作软件中搭好框架,争取每天写一点。更重要的,预留出一些文章作为备份,应对一些冲击。 关于评论。学习每个组长的方式,将自己对战友的点评整理成文章,发表在简书上。 最后,重新整理写作工作流。尝试按照少数派编辑部的写作方式,利用 todoist 管理选题,在 Mweb 中创作。 尾声 在反思之后,发现还有几个遗留的问题,先在这里罗列一下。 图片问题。很多文章需要配图,mac 有什么简单的软件可以压缩图片? 简书与个人博客的同步。一般而言,自己还是使用 Mweb 配合 Markdown 语法进行写作,但是复制到简书时会遇到问题,外部图床不能使用,每次都需要重新传一遍图片。如何解决这个麻烦?","link":"/post/007-aciton-reflection.html"},{"title":"007 不出局活动与我","text":"最初看到 007 活动是在申斌龙的公众号中,当时没有什么在意,也没有深入了解。之后,我在知乎上的一个专栏文章中,看到了这个活动的详细介绍。吸引我“冲动”消费加入这个社群的是“每7天写一篇文章,连续写7年。”这种运作方式。简单的计算了一下7年是2555天(简化问题,不计算闰年情况),一共需要写365篇文章才能坚持到最后。而且只需要花369元,相当于你每写一篇就能赚一块多。 除了上面的计算,选择加入007活动的另外一个原因是,战友之间的互相点评。从自己的情况来看,在网上消费了很多文章、视频,很少会去留言以及发弹幕。自己写博客3年多以来,也没有收到多少有价值的留言。所以,除了坚持写作,更需要外部的力量来推动自己进步。 最后一个原因是,我相信了解一个人,最有趣的方式是通过不断地阅读他的文字,见证他的成长历程。 在83班的班级群中,我发了下面的自我介绍,现在贴在这里再介绍一下我自己。 12345678910111213【编号】007-6253【姓名】 Ryen【城市】 杭州【职业】 学生【公众号】 简书:学涯湖畔 博客:xiang578.com【标签】 【爱好】 阅读、研究和分享软件【愿帮助大家】 分享基础的算法知识,推荐能促进生产力的工具,主流的个人博客搭建【愿得大家帮助】 分享各自的生活感悟【从哪里得知的007】知乎【加入007理由】 坚持持续写作,从写作中获得成长的力量【对83班的期望】共同成长【7年后想成为什么样的自己】体会到GTD理念中的心如止水 前几天阅读到一个有意思的文章社群十五问 - 笨方法学写作,今天也在这里分享一下我的回答。 你的名字、地区、职业、长时间持续做的一件事、博客/公众号/简书 是什么? Ryen,杭州,计算机科学与技术专业大四学生,即将踏入红尘。 大学阶段持续参加程序设计竞赛,博客上有一些相关的流水账:2017年上海 ACM/ICPC ECL-Final - ZenTalk、2017年西安区域赛 - ZenTalk、浙江省第十四届程序设计竞赛总结 - ZenTalk、2016年北京区域赛 - ZenTalk、第七届蓝桥杯决赛杂记 - ZenTalk 博客:ZenTalk 折腾WordPress、Hexo 算法博客:禅境花园 - CSDN博客 之间写的一些算法题解 简书:简书 - 学涯湖畔 如果你要讲一个让人记住你的小故事。你会讲什么? 写纸质日记4年(高一-大一),目前写电子日记。尝试过晨间日记、时间日志。 在中考前100天,我准备每天写一篇日记,最终只留下的30多篇。在高考前100天,又有了这个念头,最终留下了100篇日记。 如果你要问社群中所有人一个问题,你要问什么?可特别指定三个人回答,被指定的人可自愿回答。 你获取信息的途径,存储的方式,复习的方式,即你是如何管理知识的? 按照博客中的介绍,还需要补上价值观12问,但目前我还在重建价值观,所以以后有机会再来分享我的价值观12问回答。","link":"/post/007-and-me.html"},{"title":"2011","text":"已过 2011年早已过去二十多天。原本打算在元旦完成这篇,可谁知一拖就到了春节。从公历新年到了农历新年。写这些东西,也不完全是一时心血来潮的想法,而是希望留下一些关于2011的记录(毕竟记忆力这东西不牢靠),加上借此机会反思一下自己一年来的行为。 回忆起2011,有什么特别?卡扎菲之死?乔布斯之死?金正日之死?或者三国杀完结?斗破完结?姚明退役?一件件大事跃然纸上,仔细一看却都不是什么好事。更实际些,只剩下中考。此处的中考,不仅仅局限于考试的那几天,更应该包括中考之前的几个月以及中考之后几个月所带来的一系列的变化。 先从中考开始说吧,很可悲,因为中考,才制定了人生中第一个明确的、长远的计划。说白了就是考上一中,仅此而已。2011年初,《网络游戏秘笈》搞了一个活动,写给2012的一封信。看了之后,我也写了一封,不过不是给2012,而是给6个月之后。当然6个月之后,我把它撕了。其中内容也无非是关于高中,当时假设会考上一中。最后,我仅猜对了结果,没有猜对过程。无奈,为国家财政分担教育支出。不过正如一位老师对我说的,再差还是在一中。也就马马虎虎完成了目标。 1月 期末考之后,拥有很大决心,独自跑到新华书店买了十本书(5本天利38套,5本压轴题),准备在下半学期完成。最后,也只是每本写了一点。 接下来的几个月,就是昏天黑地的读书(实际上也没那么严重),只为考上高中。记忆在此处已经是一片空白。 中考之后的暑假,本着白日做梦精神,规划高中学习,前途一片光明。时至今日,我发现我还是继续睡吧。离梦想越来越远。 8月底 可恶的军训,无非是关于痛苦的记忆。印象最深的是一天晚上,全班男生被教官罚蹲(不知是谁发明的,遭天杀的!!!完全无视人身权利),忍受着自身重力所带来的痛苦,一直到那天晚上训练结束。至今不明原因。 9月 高中第一个月,一来就不适应。前几天,一到数学课就想睡,下课铃一响就来精神。还有一读就想睡的政治,不知所云的地理。总之,前几个星期做梦般度过。直到有一星期,一同学打电话问我一道数学题,我才发现几星期来什么也没学,于是开始改变自己。 10月 第一次月考和运动会。成绩也令人失望,也发现自身存在的问题。于是,从那以后,几乎每天晚上到学习室报到。运动会没我什么事,三天都是坐在看台上打酱油,只是被高二高三开幕式创意所震惊。 11月 第二次月考 明白了跟其他人一样的学习方法根本不会有所谓的成功,原来不想做的必须做。也发现每天晚上去学习室写作业只是浪费光阴,造成效率低下。当然也记得,无聊所搞的神棍节大联欢以及那天晚上男生寝室的疯狂 12月 又是一年末。一学期以来习惯越来越差,也有了星期一恐惧症。还有元旦晚会,主要以热闹为主,谁管你好不好看,一上台就鼓掌呐喊,热闹就好。晚上,同学开始在寝室玩阿鲁巴,暴力啊!那么鲁着鲁着就到了2012…… 1月 期末压力加剧,最后以远离计划的结果匆匆地结束了第一学期。 2011年大致就是如此,总结起来或许就是悲剧。然而却又无法否定悲剧所带来的改变。正所谓失败乃成功之母,一年以来各方面一直都在改变,世界观也越来越全面,思考越成熟。 2011年也认识了许多新朋友,虽然代价是与另群人见面更难。失去之后才懂得珍惜。走出去,才知道舞台的宽广。人生正是因为你们而精彩。 那么2011就结束吧! 对于2012,最先想到的是世界末日,主要归功于美国灾难大片《2012》的影响(只是听多了,却为曾看过)。世界将在2012年12月毁灭。当然,我也不想信1.听说玛雅人的预言水平与我的水平差不了都少。2.科学点,2012年只是玛雅文明新纪元的开始,就像我们从腊月廿九到龙年正月初一,只不过人家5000多年才新纪元,以及关于这之后没有预言(预言本质上看都是编的)3.世界上最公平的事,方舟不可能造出来,官二代富二代都与我们一样。 实际点,会考以及文理分班更值得担心。 当然对于2012,我充满信心。或者,我要活着看到2013年太阳的升起。 就是这一些吧。终于写完了!!!!!! 一万年太久,只争朝夕。 2012年1月23日 壬辰龙年正月初一 各位新年快乐一点吧!!!!!!去二十多天。原本打算在元旦完成这篇,可谁知一拖就到了春节。从公历新年到了农历新年。写这些东西,也不完全是一时心血来潮的想法,而是希望留下一些关于2011的记录(毕竟记忆力这东西不牢靠),加上借此机会反思一下自己一年来的行为。 回忆起2011,有什么特别?卡扎菲之死?乔布斯之死?金正日之死?或者三国杀完结?斗破完结?姚明退役?一件件大事跃然纸上,仔细一看却都不是什么好事。更实际些,只剩下中考。此处的中考,不仅仅局限于考试的那几天,更应该包括中考之前的几个月以及中考之后几个月所带来的一系列的变化。 先从中考开始说吧,很可悲,因为中考,才制定了人生中第一个明确的、长远的计划。说白了就是考上一中,仅此而已。2011年初,《网络游戏秘笈》搞了一个活动,写给2012的一封信。看了之后,我也写了一封,不过不是给2012,而是给6个月之后。当然6个月之后,我把它撕了。其中内容也无非是关于高中,当时假设会考上一中。最后,我仅猜对了结果,没有猜对过程。无奈,为国家财政分担教育支出。不过正如一位老师对我说的,再差还是在一中。也就马马虎虎完成了目标。 1月 期末考之后,拥有很大决心,独自跑到新华书店买了十本书(5本天利38套,5本压轴题),准备在下半学期完成。最后,也只是每本写了一点。 接下来的几个月,就是昏天黑地的读书(实际上也没那么严重),只为考上高中。记忆在此处已经是一片空白。 中考之后的暑假,本着白日做梦精神,规划高中学习,前途一片光明。时至今日,我发现我还是继续睡吧。离梦想越来越远。 8月底 可恶的军训,无非是关于痛苦的记忆。印象最深的是一天晚上,全班男生被教官罚蹲(不知是谁发明的,遭天杀的!!!完全无视人身权利),忍受着自身重力所带来的痛苦,一直到那天晚上训练结束。至今不明原因。 9月 高中第一个月,一来就不适应。前几天,一到数学课就想睡,下课铃一响就来精神。还有一读就想睡的政治,不知所云的地理。总之,前几个星期做梦般度过。直到有一星期,一同学打电话问我一道数学题,我才发现几星期来什么也没学,于是开始改变自己。 10月 第一次月考和运动会。成绩也令人失望,也发现自身存在的问题。于是,从那以后,几乎每天晚上到学习室报到。运动会没我什么事,三天都是坐在看台上打酱油,只是被高二高三开幕式创意所震惊。 11月 第二次月考 明白了跟其他人一样的学习方法根本不会有所谓的成功,原来不想做的必须做。也发现每天晚上去学习室写作业只是浪费光阴,造成效率低下。当然也记得,无聊所搞的神棍节大联欢以及那天晚上男生寝室的疯狂 12月 又是一年末。一学期以来习惯越来越差,也有了星期一恐惧症。还有元旦晚会,主要以热闹为主,谁管你好不好看,一上台就鼓掌呐喊,热闹就好。晚上,同学开始在寝室玩阿鲁巴,暴力啊!那么鲁着鲁着就到了2012…… 1月 期末压力加剧,最后以远离计划的结果匆匆地结束了第一学期。 2011年大致就是如此,总结起来或许就是悲剧。然而却又无法否定悲剧所带来的改变。正所谓失败乃成功之母,一年以来各方面一直都在改变,世界观也越来越全面,思考越成熟。 2011年也认识了许多新朋友,虽然代价是与另群人见面更难。失去之后才懂得珍惜。走出去,才知道舞台的宽广。人生正是因为你们而精彩。 那么2011就结束吧! 对于2012,最先想到的是世界末日,主要归功于美国灾难大片《2012》的影响(只是听多了,却为曾看过)。世界将在2012年12月毁灭。当然,我也不想信1.听说玛雅人的预言水平与我的水平差不了都少。2.科学点,2012年只是玛雅文明新纪元的开始,就像我们从腊月廿九到龙年正月初一,只不过人家5000多年才新纪元,以及关于这之后没有预言(预言本质上看都是编的)3.世界上最公平的事,方舟不可能造出来,官二代富二代都与我们一样。 实际点,会考以及文理分班更值得担心。 当然对于2012,我充满信心。或者,我要活着看到2013年太阳的升起。 就是这一些吧。终于写完了!!!!!! 一万年太久,只争朝夕。 2012年1月23日 壬辰龙年正月初一 各位新年快乐一点吧!!!!!!","link":"/post/2011.html"},{"title":"2015 总结","text":"在成为自己讨厌人的路上加速前进。只写四句吧。这是第三句。写完了。","link":"/post/2015.html"},{"title":"2017 迷茫","text":"每年年底,都有很多人在各种地方发表这样的总结,看得我煞是羡慕。去年也想学习2016 无限大中这位大佬这样好好搞一番。最终的结果是,写了一些之后,就放弃了,然后现在草稿都找不到了。今天,终于鼓起勇气,准备在图书馆好好总结一下2017年经历过的事情。那么多年以来,感觉今年经历的事情最多也最复杂,很多事情到现在都没有讲明白。 上半年大三,现在大四,今年在学校上的课实际上是很少的。上半年自己选的只有python入门和软件工程,不知道为什么,对学校的教育是彻底的失望了。MOOC方面,不知道托了多少个月,换了几个班,终于把吴恩达的机器学习给看完了。这样匆忙下来,所学的东西到今天基本也忘得差不多了。前几周,又决定去听一下《机器学习基石》和《机器学习技法》,希望可以坚持下去。另外,还看了一下候老的《深入浅出STL》,收获很大。 应该是寒假的时候,没有多少思考,在陈老师的鼓动之下,又给自己的ACM生涯续了一年左右。队友实在是太给力了,以致于前几天陈老师还说出,我们几个人好好训练,还有机会打进总决赛。抱大腿之下,成绩倒是不错,省赛金、邀请赛金、区域赛金、ecl银,但这和我没有多的的关系。印证了陈老师的一句话,带着功利的目的参加ACM比赛没有好的结果。人家的没有好的结果指的是获不了奖,我的没有好结果是人生的迷茫。 由于没有去考研的原因,也把自己推向了就业,但我都没有准备好。打击在找实习的时候就来了,上一届的学长推荐,很早就面阿里,发挥的很不好,毫无疑问的挂了。自己后知后觉,春招快结束了,都没有找到好一点的公司。幸运地是,在差不多接受去一家杭州本地的游戏公司实习时,突然接到滴滴北京的offer,终于拯救了一下自己。 6月到8月这3个月的时间,自己都在北京实习。这一段小结准备了好久都没有写完,这里简单的介绍一下。那边的部门是路径规划小组,所以我的主要工作就是写最短路……这三个月时间对我来说,最主要的是体验,感受了互联网公司的氛围,认识了很多优秀友善的同事,他们也教了我很多工作上的技能。最重要的是,我也发现自己的不足,工程能力太弱,学历太低等等。三个月的时间很快,还没有在那边做太多的项目就结束了。另外一方面,在北京也去过很多地方体验,文化之都名不虚传,这个也等有机会再写。 回来之后,又是一番秋招。抱着在杭州找一份工作的信念,我面试了很多,贴出9月和10月的日历来留念一下。 最终由于自己的实力问题,结果不是很乐观。这么多面试,唯一想记一下的就是微软面试,有一刻我彻彻底底地感受到了自己的不足,英语水平太差,思维定势。接下来的两个月,就只好老老实实地待在学校,每天不是在寝室就是在图书馆度过。 另外,寒假的时候,突然有兴致想学围棋,又是报live,又是买书、又是买围棋。坚持了几个月之后,发现真的不是时候,没有了太多空闲时间来培养兴趣,也许早个一两年,可以培养出这个兴趣。现在感觉,可惜这些冲动而买下的东西。说回来,这一年空闲的时间大多花在网上,看视屏、看直播、刷论坛,明知很多事情没有意义,却又控制不住自己。 所以,又开始关注个人管理。最大的投入是换了一台Mac,终于不用再忍受原来低配thinkpad的卡顿。这几个月里面,倒是每天都抱着在用,感觉生命都得到加速。不过,现在感觉自己的电子设备有点多,选择什么设备干什么成了新的问题。2017年也是知识付费地兴起的元年(这个是我一直追求的,如果觉得我的哪篇文章把你逗笑了,打开about页面,扫一下二维码支持一下)。在这方面的投入主要是知乎live,由于冲动,也交过一些智商税。比如下面图中知乎最有名的"智商税"之一: 其他的还有如何自学计算机专业课程?,道理都懂,不知道自己当时为什么要买这个东西……当然也有不错的比如围棋相关的从入门到入段,这个live最大的优点是配套服务完善。上面也讲了,自己没坚持,才没有学会围棋。前几天买少数派的效率大礼包,还送了一个什么live私家课,又是一个坑……其实我一直很反感知乎live的形式,语音不能检索,聊天信息流的形式不适合深度讨论,最重要的一点,网页端功能太弱,完全想直接喷。有过这些教训之后,应该把知识获取的重心放在课堂以及书本中。在网络上的另一笔花销就是购买软件服务。目前自己周期购买的包括为知笔记会员、滴答清单会员、蓝灯会员、腾讯云服务器以及域名。对于这些还是比较满意。换到Mac之后,自己也购买了一些软件。遗憾的是由种种原因,偶尔还用通过不正常手段获得的软件。 由于这一年感触比较多,也捡起了原来写日记的习惯,毕竟自己忘的实在是太快。之前尝试过很多写日记的方法,比如晨间日记、九宫格日记,或者是纸笔记录,都没有满意的方案。目前搞的一种笔记式的方法再探索。 大致思路是为知笔记上面按每一个月创建一个文件夹,每天创建一篇笔记。在笔记里面可以写东西,贴照片,传附件,保证自由很多样性。然后第二年同一天打开这篇笔记,可以去年今日,再写下新的感悟。更重要的是,通过这种方法可以将之前写的日记整合进去。家中的初中和高中日记本也有机会处理了。 最后,就是关于博客的折腾。年初的时候自己把博客改成了wordpress,但是一年都没有坚持下来,又回到了hexo怀抱,真是呼吸不止,折腾不息。但不应该忘记,博客的本质是分享,现在自己差不多是舍本逐末吧。所以,定一个小目标,新的一年里面更新博客频率不低于每周一篇。 于浙财图书馆。 阅读 上半年基本上没有看完什么书,大部分都是下半年从北京回来之后看的,所幸都有一些简短的记录,特地复制过来记录一下。 编码:顾名思义,这本书讲解的是计算机内部编码的原理。书中主要包括两部分 ,一是编码的理论基础,用多种方式表示字符或者操作指令,二是编码的硬件基础,如何设计硬件处理各种编码以实现相应的功能。 尽在双11:阿里巴巴技术演进与超越:听名字就知道这本书很厉害,结果可想而知。本书讲解的是阿里一些架构演变的历史,里面有太多技术相关的名词,水平太差根本看不懂这些东西,希望有一天能恍然大悟。 程序员修炼之道:看不懂,有缘再读。 腾讯传:之前在知乎查评价时,很多人不是很推荐。这本书主要记录一些腾讯发展过程中重要的里程碑,比如OICQ、QQ秀、QQ空间、微信等等。没有读出这些事件背后深刻的意义。书中另外一个重点是对马化腾的大夸特夸……有种天不生化腾,万古如长夜的感觉。作者号称写这书花了五年时间,实在没有找出什么重磅的料啊。 大学之路:大学生活马上就要结束了,才想起来看这本书。最近深刻体会到高等教育额的价值,对比吴军博士在书中所写的各式各样的美国大学,我们国内的大部分学校除了校名不同,就没有什么其他差别了。最后,吴军博士本人也很励志,从进入清华开始到博士毕业花了18年,真是终生学习的典范。 人类简史 : 从动物到上帝:这本书大概读了五分之一,很多观点比较深刻,但是提不起我的兴趣,所以就选着了放下。另外一方面反映我的人文社科阅读能力实在是太差了。 出梁庄记:这本书和上一本,都是我在三联奋韬书店里看的。有点区别的是,这一本我看完了……作者通过采访生活在各地的梁庄人,反映了生活的不易。当时正是北漂,引起了共鸣 高频交易员:没有仔细看,现在回想起来,自己记住的就是,通过信息传输的时间差来获利,以此来抨击美国金融市场的不公平。 盖洛普优势识别器2.0:这本是最重要的就是配套的测试吧,图书馆借的书没有测试码,所以也很无聊了。 毛泽东选集(第1卷):这本书里面,其实我只挑了《湖南农民运动考察报告》来看。这篇报告的特点是逻辑清晰,和现在的报告对比,缺少数据分析。 编程之美:为了准备微软面试而读,最后发现没有用到 剑指offer和剑指Offer:名企面试官精讲典型编程题(第2版):第一版是在软件工程课上读完的,由于之前参加过算法竞赛,所以很多题目都是秒杀的。第二版是在去苏州的火车上看完的,比第一版多了一些题目,质量也不错。确实很多面试都是从这本书里面找的题目。 程序员代码面试指南:IT名企算法与数据结构题目最优解:之前一直黑左神,但他这本书还不错。有一次笔试,我有一道题目没有写出来,听人家一说是这里面的,龙与地下城。去微软面试之前,准备看一下这本书里面的大数据相关题目,但是时间匆忙没有机会了。后来发现面试的时候就问了一道里面的大数据题目,最后gg了。在百度和拼多多面试时,也被问道里面相关的题目。 技术之瞳——阿里巴巴技术笔试心得:为了准备阿里笔试而借的书,说句实话不推荐。书很薄,但是很贵。知识总结也很少,所谓的笔试真题,也只有答案。借用一句话,对于没有解析的书,自己答案印错了都不知道。纯属阿里巴巴骗钱之作。最后吐槽一下,阿里笔试是要招全栈工程师吗?什么问题都有。 淘宝技术这十年:听学长讲座后借的书,由于不是很懂里面的故事,所以我就当成故事书来看了。印象最深的一个多隆的大神,技术伴随着淘宝发展的成长,前几周看到,好像他成了阿里的合伙人。 王道程序员求职宝典:又是一本为了面试而看的书,对于我这种基础不是很扎实的,感觉看起来很不错。王道论坛在计算机考研的口碑应该也是挺好的。 深入理解计算机系统(原书第3版):五星推荐,串联起了我学过的知识。 C++ Primer 中文版(第 5 版):这也不错。 围棋入门:围棋入门挺不错的书,上半年想学围棋时而读的。不过目前已经绝版了,我也是买的淘宝复印版。 观影 这一年来看了不少的电影和记录片。不过我用的形式是优酷ViP区的电源以及B站上面的记录片。 Jia Jiang: What I learned from 100 days of rejection:蛮有意思的一个TED演讲,但是我没有勇气去实践。 Professional-职业人的作风 围棋棋士 井山裕太: 这部记录片主要介绍日本围棋史上首位获得国内全部头衔的棋士井山裕太的生活以及一些比赛。 纪实72小时 沉浸在围棋的魔力中: 记录日本的一个围棋茶馆72小时,看完之后感觉也只有在日本才会有这样的茶馆,很多人会在店中待上一个周末。在围棋当中,忘记自己的一切,只有黑与白之间的交锋。对其中的两句话印象深刻,第一句是提问武宫正树儿子有关职业围棋的问题,他回答到,下这盘棋的时候我们的出场费是一样的,如果我输了,我就没有了机会。第二句是提问一位下棋的人为什么这么长时间都待在这里,回答我没有家。原来只是听说日本老年化社会,看完这个视频才对这个问题有感触。接下来,我又看了很多这个系列的记录片,感受到了日本的温度,这是我们所缺失的。 白日梦想家: 有过很多想法,最终却成了空想,每次半夜的激情,醒来之后还有多少? 现代生活的秘密规则:算法 The Secret Rules of Modern Living: Algorithms: 里面的很多算法自己都接触过,但看这部纪录片又有了很多新的感悟. 人民的名义:这是我这几年第一部看完的国产剧吧,喜欢他的原因是讲了很多我原来都没有关注过的反腐问题。 战狼2:今年最火的电源,主题也很深刻,不过现实还是很残酷的。 硅谷四季:一部讲述美国geek创业的故事,很励志,但我却没有一颗创业的心。 华尔街之狼:我觉得看的很爽。 雷神1、2:去年把漫威宇宙中的电源都找出来看了一遍,唯独没有雷神系列,最终补上了。我最喜欢的一个设定是,雷神在远古中出现,但由于时间太久,人类选择认为是神话。这里,我想起了易中天在《中华史》里面提到过的一个观点,也是神话是真的存在过,只是我们后来的记录夸张了那些,比如那时候人很少,而且有足够的水果当成是食物,所以人们不用劳动就能生活。 盗火者:中国教育改革调查:大一的时候听高数老师讲起过,一群不合主流的中国教育者故事。 奇异博士:漫威宇宙中的新作,反正是无脑看的。 西部世界:很烧脑的美剧,反正我是靠知乎剧透才看懂的,还有很多谜题都没有解决,不知道什么时候有新的一季。 权力的游戏:从大一开始就听过这部美剧和书,然后到大四才开始看。到目前为止,看了4季,资源太难获取,就不看了。看他的原因是,讲述了低魔世界的传奇。 如何实现你的儿时梦想:蛮有名的演讲,少年可期。 超级工程:这也属于很早就听过名字,但是没有机会看的。很多东西确实震撼,但是自己没有机会参与其中。 人生七年:已经快60年的社会学实验,看下来很多结论是很残酷的。 我更关心的是怎么样不做事 老树画画:做一个梦:这也有感动。 B站的历史记录有限,很多看过的记录片很遗憾没有记录下来。 暴走大世界:之前很喜欢的一个综艺节目,但是最近却脱粉了。理由很简单,王尼玛居然是一个符号。我确实没有仔细的思考这个问题,当人家爆出来的时候,我也很震惊! 旗门镖局:阿瓦隆的汉化版,很有意思的逻辑综艺节目。","link":"/post/2017.html"},{"title":"2018 年消费指南","text":"去年在总结中提到了一些知识付费的内容,今年将内容扩展,和大家分享我在这一年购买的实物以及虚拟产品。 实体购物 工作之后,感觉自己每个月留不下多少钱,很大一部分用来购买一些号称提高工作效率有关的物件。现在毕竟钱都花出去了,至少要装模作样地总结它们给我带来的提升。 键鼠 入职之后,地主只给我提供了一把锄头(Macbook Pro 13 with touchbar),长时间在蝴蝶键盘上敲击不是很愉悦的感觉。所以自己产生了购买键盘和鼠标的念头。 众所周知,机械键盘是码农的标配,用手指在键盘上噼里啪啦快速敲击,想想就有画面感。之前在上学的时候,我拥有一把 IKBC G87 的青轴键盘。IKBC 的优点在于价格便宜,不过和同学的 Filco 圣手对比,手感不是那么的清脆。而且本着一步到位的想法,这次准备购买的键盘可以贵一些。再加上一些其他的条件,将自己的选择限定在了 Filco 和 HHKB 上。众所周知,HHKB 的价格差不多可以买两个 Filco。最后是遇到了少数派的优惠活动,才痛下决心买了一个 HHKB Professional BT(其实是多送了少数派的贴纸而已)。 评价 HHKB 最好的方式是引用其创始人和田英一下面这一段话: 美国西部的牛仔们,会将死去的马儿留在原地,但是仍然会扛着马鞍长途跋涉,穿越一望无垠的沙漠。因为马儿是消耗品,而马鞍却是与人体融合在一起的“知己”。我们要有这样的观念:现在,电脑是消耗品,键盘却是传递情感,陪伴我们一生的“挚友”。 HHKB 给人最大的感觉就是与众不同,一共只有 60 个按键。整个键盘长度和一张 A4 纸相当。看下面的布局图不难发现: 没有 F1-F12 功能按键 没有方向键 Caps 键的位置上是 Control 键 咋一看,很难满足一般的工作需求。但是经过对工作方式的一些调整,可以很好的完成日程任务,而且键盘的手感不错(从 v2 上看到的形容是少女酥胸的手感,具体是不是我也没有体验过),长时间敲击没有疲劳感。我的编程主要在服务器上用 vim 完成,所以 hjkl 才是我的方向键,而且我也在 Jetbrain 的编辑器中安装了 vim 插件。对于其他情况下,使用 Karabiner Elements 对键盘进行一些改造(按住 Control 开启 vi 模式,hjkl 变成方向键),最后还可以用 Mac 系统自带的一些文本编辑相关的快就键。 有了键盘之后,不能没有鼠标。其实这里面也有两个选择:罗技 的 MX Master 2 和苹果的触摸板。不得不说, mnp 自带的触摸板用起来非常的爽快,但是单独购买触摸板价格也很感人,提前退出了购买范围。趁着双十一,在京东买下了 MX Master 2。 看上面的图片可以知道,这是一款人体工程学的鼠标,而且有一些按键可以编程(配合软件)。支持蓝牙以及接受器连接,可以记忆三个设备。据说,还实现了在一台电脑上复制,再另外一台电脑上粘贴。总体用下来也是中规中矩,除了中间的滚轮阻尼感有点差之外(侧边的滚轮手感很好,但是不能修改成上下滚动的效果),也没有太多缺点。 Bose QC 35 二代 购买降噪耳机多少是出于无奈,离开学校的图书馆之后,很少能找到一个安静的地方,让自己静下心来干一些事情。特别是在开放的办公室中,不仅有其他同事的讨论声,还有空调的噪音。带上降噪耳机,在放上一曲喜欢的音乐,就感觉来到了另外一个世界。之前在知乎上看到的一个评价正好能形容这种感觉: 有多安静我来描述一下,孩子数学成绩不好,你在银行做经理,维护客户关系,不上不下,有房贷和车贷,每月按揭五千。你老婆在市人民医院做护士,她妈有尿毒症透析多年,她不爱你。你年轻的时候觉得能成一番事业,但现在也就这样,朋友们混的都比你好,你下班在车库停稳车,关掉引擎,呜一声安静了下来。太安静了,你生命中少有这么安静的时刻,你打算发十分钟呆再上楼吃饭。 以上就是 BOSE QC 35 的降噪效果测评。 所以充分证明,现在的耳机评测多么注重编故事的能力。说回来,带上耳机之后,空调之类的噪音基本上会被隔绝,其他人声只是轻微的减弱,就像他们在远处处聊天。总体来说,这副耳机达到了我的预期,也算是一笔合理消费。 米家宇宙 用这里来调侃一下,小米出的那么多智能家电。自己入手了米家台灯和小饭煲,搭配米家的 APP ,可以实现晚上当你拖着身体回来时有一盏灯为你亮起,清晨又有一锅粥等你去品尝。最近,米家 APP 通过捷径配合 Siri 使用,大大扩展了便利程度。未来真的快要来了。 年度虚拟产品 与上面提到的实体产品相反的,就是虚拟产品,比如软件、文章、教程、视频等。用虚拟产品更好的总结这些消费的特点。其实很多人会觉得这些东西不值得花钱,网上找盗版的即可。但自己赞同一个观点,给优秀的内容付费,才能激励作者分享更多的知识。 订阅服务 在这一年中持续付费的产品有滴答清单、印象笔记、SetApp。滴答清单是最早购买的 GTD 软件,对于初学者来说,这是一个大而全的软件,从清单、日历到番茄时间应有尽有。不过,我没有打算继续在新的一年为它付费,我对 GTD 软件的要求是有强大的过滤功能,而不是那一些花里胡哨的噱头功能。印象笔记是自己选择的主力笔记软件,之前使用为知笔记,但是他在 Mac 上的功能很少,也很久没有大的更新了,而印象笔记特别是在中国区独立之后,有很多大的动静。 Setapp 是一个软件集中订阅服务,简单来说,你订阅了这个服务,可以使用很多需要购买的 Mac App。自己目前常用的有 Moneywiz(记账软件,mac 和 ios 都可以使用)、Timing(自动记录 Mac 上软件使用时间,可以看成是一个统计工作效率的软件)、Bartender(隐藏状态栏,看起来更加清爽)、iStat Menus(在状态栏显示网速、cpu使用率等系统状态)、MarginNote(比较强大的 PDF 阅读软件)、Ulysses(Markdown 写作软件)。除此之外,SetApp 还提供了 100 多款软件,总的来说是超值的服务。 买断服务 相比起付费服务,直接买断的软件就显得有点少。其中的原因有很多,最重要的是很多国外软件一次性买断价格是参考国外的物价,也许对于他们来说是一顿饭的价格,对应到国内就是好几百。 MacOS 上购买了 MWeb 3,也就是现在使用的 Markdown 软件。从二代开始入手使用,用来写一些文章的草稿。另外一点,用来管理博客文档也比较方便,可以一键将文章中出现的本地图片上传到图床。不过,上面提到 SetApp 中提供了更强的 Ulysses,也许明年的总结我会用 Ulysses 完成。 iOS 中,主要购买的是一些工具。Cloud Speed,测试不同国外云服务商的不同机房的速度,买了之后没有想象中的那么好。Taskmator,搭配 Mac 上的 Taskpaper 使用,之前想用他来做任务管理,不过后来放弃了。MoneyWiz 2,超值的记账软件,帮我养成了记账的习惯。之前用过网易有钱,无法忍受他的理财社区而卸载了。无相,一款神奇的浏览器,你可以指定一些其他网站的 CSS 样式(软件中有一个商店可以下载 CSS 文件),从而提升阅读体验,间接实现去除页面上的广告…… 知识付费 罗振宇在 2016 年提出知识付费元年,可从我的角度来说,2018 才是我的知识付费元年。今年主要在两大平台进行内容消费,闲鱼以及少数派。 对的,你没有看错,闲鱼是我上半年的一个主要消费场所。有一句话,评价一个知识付费好不好,看它在闲鱼上有没有买就可以了。闲鱼上有很多倒卖的人,很可能是 N 道贩子,主要是通过百度云进行交易。比起原生的,体验是非常差的(得到的文章是长图片形式),胜在价格便宜(一两块到十几块不等)。可以用来简单判断一下内容,再决定是否需要去原网站购买。回过头来看,自己购买的绝大部分课程内容还静静地躺在百度云中……但也发现了一个精品课程,小能熊——陈华伟的《知识管理训练营》,这里面讲了很多老师自己使用 Mac 和 iPhone 进行知识管理的方法和体会。对于不是高阶的用户很是值得一看,原价是 99 元非常值得(可以在印象笔记公众号中找到)。我也做了一些笔记,一直比较忙,没有时间整理分享。搜索了一个其他人的笔记,大家可以看一下了解 21天知识管理训练营总结【笔记版1.0】 - 简书 至于在少数派中,就花了很多钱够买其中的专栏。少数派是我看了好几年的一个数字资讯网站,他们的口号是「少数派致力于更好地运用数字产品或科学方法,帮助用户提升工作效率和生活品质」。自己购买了他们的会员通讯 Power+ 1.0 以及还在持续更新中的 Power+ 2.0,具体的内容介绍可以查看这两个网页。如果你也是那种喜欢折腾软件的人,这个东西非常超值。任务管理系列(用 OmniFocus 3 搭建任务管理系统、用更现代的方式做任务管理、TaskPaper 使用指南),其实购买这三个完全是没有必要,你喜欢哪一个软件做 GTD,直接购买对应的教程就好了。最后也很推荐的是 从零开始做好个人记账,教你使用 Moneywiz 记一手明白账(原理通用,也可以使用其他软件。)","link":"/post/2018-consumer-report.html"},{"title":"2018 探索","text":"全文混乱。拖了 4 个月之后,强行完结。 毕业 2018 最大的一件是自己终于艰难地从学校毕业。本来在学校属于 easy 模式,原本以为毕业很轻松。不过出于一些原因,比其他人多待一个月才拿到毕业证书,给我不太美好的大学生涯又多添几份痛苦。本来还准备写篇文章来总结一下大学生涯,拖到现在毕业都快一周年,也只能当成是毕业一周年的回忆文章。 工作 毕业之后,用我外婆说的一句话“一个人拉着两个行李箱就去工作了”。误打误撞和机器学习挂上一些关系。每天属于虽然工作很开心,但是好像没有干什么事情的状态。更多地吐槽也准备写在工作一周年的文章中。 自我管理 这个概念是年初感觉自己太混乱时提出来的,如果成为更好的自己。一年来有过很多想法和实践,但是现在还探索出来完整的系统。有机会再写。 年度阅读 说来惭愧,今年没有读多少本书,而且绝大部分都是在没有毕业时候读的。工作之后,完整看完地也只有一本《九败一胜》。这本书讲的是王兴的创业故事,总的感受是创业维艰。感觉王兴是为了创业而生的人,有知识基础,又有经济基础。在多次创业之后,培养了商业上的灵敏,管理上的艺术。最终能在千团大战中走出来,成就今天的美团帝国。可惜这个冬天,美团有些艰难,脉脉上给予他裁团(裁员,特别是应届生)、C团(绩效打 C,逼你走)的名声。比起王兴的故事,我更感兴趣的是程维创立滴滴的故事,不知道什么时候可以读到。 说回来在读过的书中,最推荐 软技能,之前也写过简单的介绍。用时髦的话来说,这本书教你成为一个斜杠青年。在基础的工资外,还有通过其他渠道有第二职业的收入,最后是睡后收入(表名上说的是睡觉时候获得的收入,第二层含义是一次生产,可以多次贩卖)。后来想想,自己可以二次出售什么?无法是什么时间管理、知识管理、理财、读书、写作之类的烂大街的东西。所以,自己还是需要加强抗击职业风险的能力,尽快找到自己的第二职业收入。 另外,自己也进行了一些主题阅读。年初的时候,对时间管理和知识管理感兴趣。读过Evernote 100个做笔记的好方法、Evernote超效率数字笔记术、印象笔记留给你的空间、有道云笔记:记录,成为更好的自己、你的知识需要管理,看完这些书多少有些收获,但也没有完全解答我的疑问,说回来,也不太推荐你们去看。不过,时间管理方面的两本书,小强升职记和搞定Ⅰ,却是五星推荐,看一看,多少能提高一些工作效率。 年度观影 今年看过的电影倒是比书多一些。不过,其中好多都是漫威的超级英雄片。自己感觉漫威伟大的地方在于创造了一个包括神话、物理、外星文明的电影宇宙,这个宇宙也许会成为我们这一代人的回忆。 说回来,今年看过的片子中,最推荐的是无问西东。这部片子讲述了不同时期 4 个不同年代清华学子关于选择的故事,也许是因为没有他们这样的大学经历才会嫉妒。看完片子后,还抄录一些台词,大概能更加清晰的表达电影对我的影响。 吴岭澜(文科很好,理科很差)面对梅校长时候询问为什么不去读文科时的回答。 因为最好的学生都读实科 我只知道,不管我将来做什么 在这个年纪,读书,学习都是对的 我何用管我学什么? 每天把自己交给书本,就有种踏实 吴岭澜重新找到自己的目标之后,成为了清华大学的一名教授。在西南联大给学生上课时回忆自己的大学时光: 当我在你们这个年纪,有段时间,我远离人群,独自思索,我的人生到底应该怎样度过?某日,我偶然去图书馆,听到泰戈尔的演讲,而陪同在泰戈尔身边的人,是当时最卓越的一群人,这些人站在那里,自信而笃定,那种从容让我十分羡慕。而泰戈尔,正在讲“对自己的真实”有多么重要,那一刻,我从思索生命意义的羞耻感中,释放出来。原来这些卓越的人物,也认为花时间思考这些,谈论这些,是重要的。今天,我把泰戈尔的诗介绍给你们,希望你们在今后的岁月里,不要放弃对生命的思索,对自己的真实。 对吴岭澜的总结: 梅校长说:“人把自己置身于忙碌当中,有一种麻木的踏实,但丧失了真实,你的青春也不过只有这些日子。” 什么是真实? 你看到什么,听到什么,做什么,和谁在一起 有一种,从心灵深处,满溢出来的不懊悔,也不羞耻的平和与喜悦 后来吴岭澜领悟到了: 看到和听到的,经常令你们沮丧,世俗是这样强大,强大到生不出改变它们的念头。可是如果有机会提前了解了你们的人生,知道青春也不过只有这些日子,不知你们是否还会在意的,那些世俗让你们在意的事情,比如占有多少,才更荣耀,拥有什么,才能被爱。 等你们长大,你们因绿芽冒出土地而喜悦,会对出生的朝阳欢呼雀跃,也会给别人善意和温暖,但是却会在赞美别的生命的同时,常常,甚至永远忘了自己的珍贵。愿你在被打击的时,记起你的珍贵,抵抗恶意;愿你在迷茫时,坚信你的珍贵,爱你所爱,行你所行,听从你心,无问西东。 富家子弟沈光耀放弃学业,决定参加飞行队时,母亲不远万里来联大劝他。 “当初你离家千里,来到这个地方读书,你父亲和我都没有反对过,因为,是我们想你,能享受到人生的乐趣,比如读万卷书行万里路,比如同你喜欢的女孩子结婚生子。注意不是给我增添子孙,而是你自己,能够享受为人父母的乐趣,你一生所要追求的功名利禄,没有什么是你的祖上没经历过的,那些只不过是人生的幻光。我怕,你还没想好怎么过这一生,你的命就没了啊!” 同学在他牺牲后,去看望沈母时,屏幕上展现出一幅对联:三代五将护国定疆青史留正气,六韬三略擅用筹边御旨赞英豪。 这部电影的彩蛋标题是致敬时代的风骨,快速回顾在电影中出现过的时代名人。可惜自己没有认出多少个,真是悲哀。 后记 这篇文章写的有点杂,我只是看着 MWeb 中的存稿有点多,趁着这次机会消灭一些,来年有机会写些新的东西。 于北京回龙观 其他文章: 2017 迷茫","link":"/post/2018.html"},{"title":"2019 年软硬件指北","text":"呼吸不止,折腾不停。记录在过去的一年,自己选择的软件和硬件。去年写指南并不能指南,所以今年直接写成指北。 硬件更新 iPhone XR 和 Apple Watch Series 4 iPhone XR 刚出来的时候,一直被吐槽是大边框。不过随着在电商网站上不断降价,越来越被当成是无边框手机……在忍受不了使用多年 iPhone 6 的卡顿,以及很难脱离 iOS 生态的现实。终于在苏宁上下单 (Product)read(Product)^{read}(Product)read 版的 XR。经过半年多的使用,这部手机实用但是不出彩。 购买 Apple Watch Series 4(AW) 理由很简单:在去公司健身房锻炼的时候,希望有一个可以记录运动数据的设备。事实 AW 自带的运动软件很不错,可以满足我的运动记录需求。但是例如 Keep 之类的第三方 App 适配不好。另外,AW 很好扩展 iPhone 和 Mac 的使用,比如可以解锁 Mac、查看 iPhone 上的信息等等。到头来,AW 还只是一块需要一天一充的电子表。 Nintendo Switch Nintendo Switch(NS) 是任天堂在 2017 年推出的,集掌机和主机于一体的游戏机。买 NS 的理由也很简单,Mac 上游戏太少,我需要一个设备玩游戏。更深层次的来说,感觉自己的反应太慢,想通过玩游戏来锻炼快速决策能力。 简单统计一下,我在 NS 上花费的时间大概有 200 多小时,购入游戏也花费上千元……反应能力不知道有没有上去,但是享受到游戏的快乐。 Nintendo Switch 目前可以选的有 Nintendo Switch、Nintendo Switch 续航版、Nintendo Switch Lite。 Kindle Oasis 2 大概是 5 月末,通过公司内部闲置群出了使用 5 年多的 Kindle PaperWhite 2 后,从淘宝上购入美版 Kindle Oasis 2 。可惜的是,1 个月不到的时间,亚马逊推出 Kindle Oasis 3 …… 和 KPW2 相比,KO2 主要带来一下几个方面的提升: 7寸屏幕,更高的分辨率。看的更多,看的更清晰,更加逼近纸书的感觉。 不对称设计,电池集中在一边,握持比较舒服。 金属机身。前几代 kindle 都是亚马逊祖传的类肤质塑料机身,很容易沾上油脂,这一代采用金属机身,看起来更加富有科技感。毕竟当年小米用上金属边框的时候,都敢去吹一块钢板的艺术之旅。 两个翻页实体按键,按起来比较有安全感。 上面说这么多,kindle 主要功能还是看书。这几年,很多 kindle 电子书分享站都由于版权问题陆续关闭,优质的资源比较难下载。不过,去年自己办信用卡时,领了一年的 Kinle U 会员(今年又领到一年的会员),在中亚上借阅很多本小说。从体验上来说,KU 会员不能实现全场自由借,而且大部分书籍都只是滥竽充数。一对比微信读书会员就是十分实惠,多期待微信读书可以出电子书阅读器吧。 软件实践 18 年开始,着手准备构建自己的数字化系统。19 年在前面的基础上,进行了很多迁移。 信息管理 11 月份看到一句话:input 做的越多,知识管理越差。这个很好形容我之前的状态,在印象笔记中囤积待看的剪藏、OF 里面有很多想写的主题、MWeb 遗留大量没有写完的文章。 年中的时候,想把自己写的一些笔记更好的管理起来。最初想到的是搭建 wiki ,实现知识的网状化连接。不过市面上常用的一些个人 wiki 方案都不是很满意。最终选择 hexo 搭配一个 wiki 主题 Wikitten。另外,后来了解到有一种基于纯文本的知识管理方案:zettelkasten。感兴趣的可以去看一下。 写日记是这么多年以来坚持的一件小事情。之前一直是在笔记本上写,后来慢慢的尝试通过印象笔记来写。2月份,订阅 Day One ,开始尝试迁移到它上面去。作为一个专业的软件,体验真的比之前的方式不知道好多少。Day One 上也有很多数据统计,多少可以拿来得瑟用。另外,自己干的一件事情就是把印象笔记中的日记慢慢转移到 Day one 。写在笔记本上的日记,也被我拍成一张又一张的照片,只不过这个迁移起来比较麻烦。 任务管理 这个问题一直是一个大坑,花费很多时间在多个软件中试来试去。在现在这个时间点,自己开始选择混合使用 OmniFocus 和 Org mode。具体怎么搭配使用,等再坚持几个月再出来分享。不过说回来,任务管理的关键不在于软件,而在于执行。 其他实践 下面这一些今年自己做的选择,都有一个共同的特点:从商业软件到开源项目。很多人选着使用的开源项目的出发点在于害怕商业公司无休止的使用个人隐私数据,而吸引我的主要是自由软件自由开放的精神。 从 MoneyWiz 到 Beancount MoneyWiz 是在少数派上了解到记账软件,Setapp 中可以免费使用。和国内那些整天搞社区和卖理财的记账软件相比,只是纯粹的一个记账软件。Beancount 是无意中从BYvoid文章中了解的一款纯文本记账软件。最大的优点是扩展性强。在使用过程中,搭配一些简单的脚本,可以实现每月底花一个小时就能把这个月的开销记录明白。 从 1Password 到 KeePass 之前看过一个结论:密码破解的难度主要在于长度而不是复杂度。所以借助密码软件辅助记忆密码是不二之选。1Password 是在去年感恩节活动中获得的长达一年的免费体验。快要到期前,没有选择转向订阅(今年感恩节活动依然是新用户 长度一年的免费使用),反而是选择开源的 KeePass。KeePass 在不同的平台上有多个客户端可以选择,目前我主要用的是 MacPass 和奇密。KeePass 中所有的密码数据都保存在一个文件中,跨平台使用只需要简单同步这个文件。 从搜狗输入法到鼠须管 网上关于搜狗输入法的声讨一直不绝于耳,我也长时间忍受搜狗动不动给你跳出来的斗图功能提示。在花费一番力气,配置鼠须管后,彻底删除搜狗,详见 「Rime 鼠须管」小鹤双拼配置指南 | 算法花园。另外 Mac 上自带的输入法的体验也没有那么差。 博客上和这个主题相关的文章: Best of iPhone 2019 软件清单 | 算法花园 2018 年消费指南 | 算法花园 iPhone软件清单 | 算法花园 Mac软件清单 | 算法花园","link":"/post/2019-consumer-report.html"},{"title":"2019 起步","text":"受 Free Mind 的影响按这种形式写年度总结 年初的时候看到一句话:「 2019 是过去十年中最差的一年,也是未来十年中最好的一年」。和其他人一样,我害怕不确定性,不过生活除了鼓起勇气前进,还有什么其他选择。 工作 完整在滴滴工作一年,自己没有太多变化,可是环境却变了很多。从年初内部会议上 Will 优化员工开始,很多同事陆续离开,从而我都快要成为团队元老…… 做为食物链低端的算法工程师,工作中杂七杂八的事情干了很多。洗数据、跑模型、改工程代码、测试、上线、实验各个方面都干过。 说回来,算法还是自己的主要工具。今年用的最多的是 FM 和 GBDT,这些都是几年前的技术,但是架不住效果好,性能要求小。自己也写了一些相关的文章,可以供大家参考。 (FM) Factorization Machines | 算法花园 (FTRL) Follow The Regularized Leader | 算法花园 All About GBDT (1) | 算法花园 Practical Lessons from Predicting Clicks on Ads at Facebook(gbdt + lr) | 算法花园 关于深度学习,在我入职前模型就基本迭代完成,今年主要探索个性化场景的解决以及模型性能优化。很遗憾,这两方面的工作目前还没有什么可以写成博客分享的。最后,自己没有参与到组内强化学习的项目中,不过还是通过李宏毅老师的相关课程了解初步的概念,争取 20 年内做一些相关的事情。 9月份开始,leader突然让我准备一些编程题目,开始去面试实习生。通过牛客网以及北邮人论坛大概收到简历60多份,我面试10多个候选人,最终通过的大概五六人,不过过来实习的也就 2 个。印证自己之前的想法,一家已经不是快速发展的公司,很难招到即懂机器学习又会做编程题的实习生。 另外想写的一点是是匿名交流。内部论坛之前有一个匿名区,后来由于一件比较有名的事情,匿名喷得太厉害,被某位海归高管以提高交流效率减少戾气所关闭(目前这位已经离职,有人开玩笑期待干掉他新公司的匿名论坛)。所幸脉脉还有职言(匿名)以及公司圈。在上面混了一年之后,越来越理解匿名交流的必要,说事。比如今年发生的延迟发年终奖,快手可以直接在内部匿名区引起宿华回复。我们的公司圈一堆人才自嗨。本质是国内环境下很难公开交流一些话题。 之前看过[一篇文章]中介绍 Google 的 TGIF: TGIF是Larry和Sergey在公司早期就创立的,一个全公司范围的周会。在这个周会上高管们会透露公司新项目的进展,也安排有答疑环节,员工可以询问两位创始人任何问题。TGIF毫无疑问是为了提高公司内部的透明度,但它在增强员工凝聚力的同时也对公司文化提出了挑战,最直接的就是保密问题。比如Chrome项目在公司内部的公开就是在一次TGIF上发生的,那时离Chrome的正式对外宣布早了一年多的时间。 阅读 今年读过 33 本书,阅读量和前几年基本持平。年底发现自己的一个坏习惯:很多书读了一半就放在那里,导致开的坑很多。应对方法也很简单:一段时间内只读一本书。而且为了提高阅读的质量,将自己读完一本书的定义从读到最后一页改成完成对这本书内容的整理。 阅读的主要工具是 kindle 和微信阅读(iPhone)。kindle 是这么多年一直使用的阅读介质,从前几年的找破解图书到现在的完全中亚购买(以目前看书的频率还不至于承受不住),长时间看电子水墨屏能减轻一些疲劳。微信阅读的特点是白领无限卡后就能全场免费读,实在是太香了。理想状态下用这两个工具读不类型的材料,微信阅读读小说以及人物传记,kindle 看需要大量抄记的书。对于需要反复阅读的内容,实体书则是最佳的选择。 分享读完觉得不错的几本书: 经济学通识/薛兆丰经济学讲义:薛兆丰目前看起来风评不是很好,这两本也不是什么严肃的经济学读物。前一本书是作者专栏文章的合集,后一本是得到专栏的文字版,两本书大量的内容是重复的。书中通过现实中的例子来讲解背后的经济学原理,很适合看完之后做为饭后谈资。反正我运用书中的一些原理,给同事分析好久公司的停车场应该怎么分配车位。 银河帝国:这一套书有很多本,只看完前三本。概括起来,这本小说是以太空为背景讲政治故事,以谢顿的预言为主线,讲述基地对抗各种危机的挑战。另外书中提到看起来有多少分像统计学的心理史学,谢顿一直用这种方法预测未来,而且信徒们一直强调,预测结果不会因为个人而改变。第三本书,围绕寻找第二基地展开,把所有读者能猜的地方都写了出来,选择了一种情理之中,意料之外的结局。 人类简史/未来简史:尤瓦尔·赫拉利是前几年很火的一个历史学家。人类简史主要是按他的框架回顾从原始人类到现代人类的文明发展历程。对于我这种没有系统接受过历史学教育的人,完全是一种震撼。未来简史讨论的是人类未来的发展方向,成神。 房思琪的初戀樂園:讲述一个小女孩被文明所不齿的方式杀死的故事,最让人痛心的这女孩就是作者本人……引用最近很流行的一句话:地狱空荡荡,魔鬼在人间。 基督山伯爵:看完《了不起的盖茨比》后,老板强力推荐的爽文小说。快意恩仇,永远不要丧失对生活的期望。 临高启明:工科党神书,死于历史空无主义,最后放上来缅怀一下。 2020 年开始使用 Notion 记录读书过程,点击 看书也就图一乐 查看。 观影 和去年一样,看电影比起看书来更加容易,豆瓣上轻松标记 60 部。想想原因,打开一个视频放在那里,不用怎么理它就能结束。按类别推荐一下自己觉得不错的影视: 小丑/蝙蝠侠三部曲:去年在观影中大力推荐漫威宇宙,今年看完 DC 这 4 部电影,刷新对超级英雄片的认知。蝙蝠侠:黑暗骑士在是在超级英雄的框架下对人性进行探讨。小丑展示出社会如何逼一个人成为恶魔。 黑客帝国三部曲:经典的电影,赛博朋克风格。之前的神话描述神创造了世界,在这部片子里面,这个神就变成了机器人。多少算是人工智能行业的从业者,强人工智能离我们看起来还是很远。 人生七年9:这应该是拍摄时间最慢长的纪录片,也给我们机会在几十个小时时间里面见证这些主人公 60 多年岁月。很大一个感受,除了 Nick 之外,其他人不过是重复父辈的道路,阶级跃迁又是谈何容易。 哪吒之魔童降世:即大鱼海棠之后,第二部在电影院看的动画电影。之前想过一个问题:为什么一些小说要隔一段时间就翻拍一次?简单的认为要赋予时代主题。这部片子中最喜欢的一个设定:龙族也是妖怪,镇守龙宫,其实也是镇住自己。 邪不压正:电影看到一半的时候,我就觉得自己看不懂。说回来,看这部电影有一种酣畅淋漓的感觉,节奏很快,比《一步之遥》和《让子弹飞》更快。半夜在知乎上看了很多回答之后渐渐地懂得其中的情节,蓝先生的爱国情怀,李的复仇梦想。在历史的框架下演绎,始终无法逃离历史的结果,日本人还会按照发展进入北京城。一句“异父异母的亲兄弟”就值得一看。 游戏 今年新增的一个板块,自从购入 Switch 之后,开始重新接触一些游戏。 隐形守护者:抗战背景下面,一个特工面对选择的游戏。所有的场景都是真实拍摄出来的,比绝大部分国内的抗战剧精美。游戏有很多个结局,当然只有符合社会主义核心价值观的才算善终。最印象深刻是第二号突然的一句:什么都是马尔可夫链。 有氧拳击/健身环大冒险:NS 上的铁人三项之二,充分发挥体感的优势,晚上下班之后健身用。不过从目前的使用频率来看,大概率和买健身卡一个性质。 塞尔达传说:旷野之息:决定买 Switch 很大程度上源于少数派中一篇关于这个游戏的介绍,大意是没有传统的等级增长,只有你真正掌握一个技巧,林克才能使用出来。这款游戏的给我带来看似无限大的空间,但也有一点遗憾,有时候遇到下雨不好攀岩时,我想让林克坐下等雨停,然后发现没有坐下的选项…… 超级马力欧创作家2:大学的时候,经常看超级小桀玩这个游戏。对于我这种连普通的马里奥都要靠无敌才能通关的来说,大部分自制的地图还是有点难的。说回来,买这个游戏就是买一个青春。只可惜物是人非。 暗黑破坏神3:永恒之战版 :Switch 上的冷饭,自己瞎玩了很久,看完所有的剧情。最终在咸鱼上买了很多强力的装备后,速通 150 层大秘境后索然无味。所以玩游戏还是不要作弊。 未来 世界变化太快,未来可期。 于浙江临海 2017 迷茫 >> 2018 探索","link":"/post/2019.html"},{"title":"2020 挑战","text":"2020 年最后一天下午,坐在工位上想着「今年有什么遗憾?」想到最大遗憾:这个世界变不回原来的样子。超级黑天鹅「Covid 2019」或多或少改变我们生活,新时代就这样拉开大幕。在这个背景下,承受来自各个方面的压力,各种「挑战」也随之而来。在这一篇总结中,我会通过关键字回顾自己过去一年。 一 工作 没有太多变化,还是选择留在滴滴。年初获得机会参与「晋升」答辩,在老板和同事的帮助下,异常艰难地升到下一个级别。两点感悟:需要做有价值的事情以及有把做过的事情说清楚的能力。之后参与内部一个比较大的探索项目,费了很大力气上线后,12 月底开始和同事一起写相关的论文,希望能中 KDD 2021。 晋升之后,日常工作中会接触到更多的人,如何与其他人进行有效的沟通成为自己新的挑战。后来也有机会指导实习生,不过没有多久就离开了。简单总结自己变化:做人家分配的事情,到自己思考如何做事情,再到分配事情给其他人做。这些变化中,我经历长时间不适应的感受。大学参与编程比赛培养的是靠外部刺激和目标驱动,工作中需要的是你不断拓展边界,打破旧的认知和规则。 二 技术能力 分成两个部分:尝试一些工程的开发,改线上代码差不多和呼吸一样自然。但是觉得自己总体上来说写的东西还是偏向简单,没有太多的设计和思考在里面。下半年很多时候是在修自己上半年的 bug……算法学习差不多是跟随业务需求进行,看得大部分还是 CTR 相关内容。另外也在 b站看了一半统计机器学习的内容。做的业务不像 CTR、NLP 这样有明确的界限,所以也没有机会去深入一个方向去实践,大部分时候浅尝辄止。 三 程序设计 不知道告别多久之后,下半年尝试想把这个东西捡起来。说回来,我之间问一个进过 world final 的候选人,工作中有没有用过相关的算法,他也是摇头。按自己目前的水平,每周日上午写 LeetCode 周赛是很奇妙的体验。每次都是一场孤独的挑战,只有调整好自己的思维方式,才能把自己从苦海中解脱出来。做这件事情的意义大概是山就在那里。多少年之后,我也体会到当年没有拼尽全力的遗憾。 9 月份,在周神的组织下,我们组成一个队伍参加 Leetcode 举办的秋季编程大赛。刚开始我们都是信心满满地,比赛开始之后就是无尽的折磨,最后就是以三题结束比赛。原来他们这么久不训练也不会写题目……希望等自己学校举办区域赛的时候还能打星参与一次。 四 生活 11 月份遇到房东卖房,从原来住的房子里面搬出来,跑到回龙观和同事一起合租。最大变化是通勤时间的变长,挤过几天地铁后,立马决定打拼车上班,另外忍受几次下班后打车的痛苦,也开始 20:30 自费打车。所以多了很多坐车的时光,一般早上都会带一个阅读器去看书。有一次堵在后厂村路上,看着《禅与摩托车维修艺术》,恨自己没有摩托车。晚上回来的时候,大概率是听播客。似乎比之前把节省下来的时间拿去冲浪好很一些。 五 知识管理 投入在 Input 上的时间越多,知识管理越差。 这个差不多是这几年一直在思考的话题(时间管理方法,我看清 GTD 本质之后,就不太纠结)。去年年末开始关注 Zettelkasten,当时还是在借助 sublime_zk 进行折腾。2 月份的时候,了解到一个工具 Roam Research,开始慢慢把自己的笔记迁移过去。几个月之后,Zettelkasten 和双向链接笔记在国内火了起来。给我最大的两点改变是: 区分自己写的笔记和收藏的文章(印象笔记就是因为剪藏太多变成垃圾堆)。 思考不同内容之间的关系。 很遗憾,这一年很大一部分精力停留在把之前散落在不同软件中的笔记汇聚到 Roam 中。新的一年尝试把更多的内容分享出来。 另外一方面,真正记住内容还需要不断回忆(给你选择记忆的机会),比较知名的软件就是 anki。有一段时间经常制作卡片,但是没能融入自己的系统,也没有把这个习惯坚持下来。 六 分享 从访问数据上来看,比起去年博客的流量快增加超过 5 倍。统计数据中,流量大概是 8 月中旬开始的,最大的原因是完成百度和 Google 对博客的收录。大部分流量来自于一篇文章(已被自己手动删除)。不过得到启示,某一些小众的关键字,如果能做到百度的前几名,获得的流量还是很可观的。 今年没有写多少正经的东西,最大的亮点是差不多用8个月的时间尝试摸索分享每个月阅读相关的总结「Never Reading」。这些文章内容来自 Roam Reasearch 阅读笔记。最终被自己停掉的原因是,形式上并不优美,可能阅读时,都只是一些没有上下文的关键词或短句。最好的形式还是自己将阅读的内容按主题写成文章进行分享。 放弃写每月的阅读总结后,自己觉得笔记-博客文章中应该还有一个中介介质。用现在时髦的话来说,是数字花园。苦于目前还没有发现如何快速将部分 Roam 笔记公开展示出来,9 月份的时候模仿 Meme of LinOnetwo — 林一二的模因和想法也搭建一个 算法花园・Xanadu — 吾辈心中亦有惑,坐!,想着分享一些读书和读论文的笔记。大概过一个多月,差不多就放弃这个网站……目前还是等待更高效导出 Roam 笔记制作站点的方案出现。 最后,也开始在 Twitter Ryen Xiang(@xiang578)进行分享。很遗憾,之前和人交流太少,写的东西除了错别字多以外,没有太强的逻辑性,可能很难理解………这一些都是在新的一年中需要克服的。 七 阅读 阅读的挑战是:为了什么而读?思考如何去做阅读笔记?主力阅读软件是微信读书,不仅仅是无限会员全场畅读,更重要的是导出的笔记格式都比 kindle 方便整理。全年读过 36 本书,平均下来一个月 3 本书,和年初计划每周一本书,还是有很大的差距。推荐几本 5 星的图书: 把自己作为方法:项飙的三场访谈录,一次感受知识分子可爱以及真诚的机会。 像哲学家一样生活:介绍哲学流派斯多葛的书,一种人间哲学。 会饮篇:苏格拉底等人关于爱的讨论。 穷查理宝典:查理芒格 11 篇演讲的合集。 为什么:因果推理入门科普书,不过没有机会应用到业务中。 深度学习推荐系统:介绍深度学习在推荐系统的的应用,大而全。 红楼梦脂评汇校本:市面上口碑比较好的红楼梦版本。 2021 年的阅读目标还是每周一本书,然后每月挑一本书写出读书笔记在博客中发表。 八 观影 今年在豆瓣上标记看过电影只有 40 个条目,仅是去年的 2/3。可能现在把更多空闲时间花费在看 B 站各种 UP 主的视频中,仔细想想还是需要去欣赏艺术。 沉默的真相/隐秘的角落:不错的故事和拍摄,但是紫金陈的原著一言难尽。 窃听风暴 (豆瓣):从一个简单的故事告诉你为什么某些制度不行。有一种听不懂德语的遗憾。 头脑特工队 (豆瓣):今日简史中推荐反传统科幻片。 完全是五星,迪斯尼实在是太有创意了。 阿尔法围棋 (豆瓣):尝试调研 MCTS 时补充看的纪录片,当年的旁观者,再回头已经成为参与者。 寄生虫 (豆瓣):小孩子早已经看穿一切。剧情安排真实精彩。 九 游戏 动物森友会:上半年最火的游戏。曾经的QQ农场爱好者,不可避免在同事的带领下,成为一名光荣的岛主。100 多个小时候之后,就没有重新上过岛…… Ingress:一款手机端的 LBS 游戏,你扮演一名特工,完成游戏中的任务探索现实世界。自己最初希望通过这款游戏多出去走走。11 月和 12 月,为了做任务,多次出去暴走 20+ 公里!不过,已经变成匆匆寻找关键打卡地点,很多时候错过旁边的风景。 Celeste:IGN 满分作品,号称是治疗抑郁的。横版平台跳跃游戏,和马里奥相比多了一个冲刺键。最大优点是死亡之后复活特别快,第一关还没有通过,我差不多就死了 1k 次。 十 消费指北 克制自己的消费,不单独写一篇文章。 ErgoDox EZ:红轴,分体人体工程学键盘,反正看到的同事都觉得很酷。 Inkpad X:为了用微信读书,买的10寸安卓平板。分辨率只有 200 ppi,字体调大一些没有太大影响。不过没有实体翻页键还是挺难受的。微信阅读也没有怎么对这个设备优化。最近小米又出一个 pro 阅读器,也可以考虑。 DEVONthink pro:增强型文件管理器,主要用来替代印象笔记。虽然贵,但是好用。 Offscreen: 记录手机屏幕时间、打开次数等,不断提醒你今天沉迷手机多久。 产品沉思录:邮件组,有关互联网、科技和人文,提供不错的信息来源。可以先从精选集判断是否值得入手。 尾声 在迈入 2021 之际,给自己留下一些 New Year Challenge: 认识你自己 变得勇敢 成为生产者 于北京回龙观 2017 迷茫 >> 2018 探索 >> 2019 起步","link":"/post/2020.html"},{"title":"2021 迷茫","text":"迷迷糊糊中渡过一年,回头想想似乎什么都不记得。 贴一下去年的博客访问量做一个留念: 尾声 2022 New Year Challenge 只有一个:和她走到一起。 2017 迷茫 >> 2018 探索 >> 2019 起步 >> 2020 挑战","link":"/post/2021.html"},{"title":"解决 OmniFocus 中 Applescrpit 脚本输出文件中文乱码问题","text":"在学习OmniFocus 入门与进阶 - 少数派教程中,了解到了一个 Applescript 脚本 Weekly project report generator(周报生成器)。这个脚本可以将 OmniFocus 中前七天活跃的项目以及完成的动作导出成为一个.md文件。这样子,可以大大减轻周回顾时回忆本周完成任务的压力,也可以将生成的文本粘贴到周报中使用。 但是当我第一次运行这个脚本时,生成的文件中所有的中文字符都变成了问号。 由于,之前没有接触过中文显示为问号的问题。所以,与少数派教程的作者联系,他很快给我回复了一份邮件,并给出两个建议。 按照邮件中的建议,我进行了下面三个尝试。 Sublime Text中安装转化编码方式的插件ConvertToUTF8,最终发现无法识别出生成文件的默认编码。 使用系统自带的文本编辑打开时,还是显示编码错误。 利用homebrew安装了enca软件,使用enca -L zh_CN file无法检测出文件的编码方式。 无奈这些方式都没有找出问题的所在,只好打开脚本编辑器,查看这个脚本是怎么写的。 如下图所示,该脚本将需要输出的字符串指定为Unicode text 格式,用 write 将这个字符串写进文本中。 根据之前的编程经验,输出文本一般都能指定编码方式。所以又用 Dash 来查看 AppleScript 中 Write 的相关语法。 最终,找到 as 可以用来指定编码方式,成功解决乱码问题。","link":"/post/AppleScript-encode-error.html"},{"title":"C#聊天软件实现","text":"前几天面试,被问如何实现一个类似微信的聊天软件。当时说了一个大概的想法,面试官没有怎么评价,只是最后建议我有空多做一些项目。正好最近不怎么忙,就实现一下。写了一个简易的模型,在这个过程中应用了很多原来学过的东西,当然还有很多问题没有解决。 这个软件选择C/S架构,所以写了一个服务器端程序和一个客户端程序,然后通信使用的是TCP协议。 利用socket完成通信,大致的过程如下图所示。 3. 服务器上开两个线程threadListenConnect和threadReceivePacket。服务器上的socket利用bind绑定服务器的ip和端口号。第一个线程死循环监听端口,是否有新的connect请求,并将新的连接socket保存到list中。再利用第二个线程接受客户端发来的数据包,并拆包执行进行相关功能。服务器之后,按照包中的内容判断是否需要发送到其他特定的客户端还是广播消息。 客户端中开一个线程threadReceivePacket。先和服务器连接,然后利用这个线程接受服务器发过来的数据包。这里也实现了发送给某个特定的客户端和广播。发包和拆包过程和服务器上差不多。 数据包主要包括发送方ip、端口和接收方ip、端口,以及操作代码。不同的数据段用‘|’分割,接收方也按这样拆包就可以了。 TCP是面向连接的协议,拥有缓存窗口,所以可能会有粘包现象,可能将程序一次产生的命令,分成多次发送。所以数据包里面还要标记一下,我用了’\\a’做新的包开始标记,用’\\t’做结束标记,如果聊天内容里面有相同的标记的,可以强行转化一下。 这个程序还可以加上数据库搞出注册以及保存聊天消息,然后自己也没有去写消息的排序以及私聊功能,待做。 最后相关代码放在github上面 服务器端: 客户端1: 客户端2:","link":"/post/Csharp-chat-softwave.html"},{"title":"Github Publisher","text":"原来一直用 Logseq 写笔记,等了好久也没有等到一个可以把笔记导出成 md 文章的插件。昨天晚上看其他人博客的时,发现 Obsidian 插件 Gihub Publisher,可以通过内建的命令把笔记上传到指定的 github 仓库,从而实现使用 Obsidian 管理 blog 文章。 Share key 把 share 改成 public,实现和 logseq 兼容 Contents - Internals links 将 wiki link 转换成内部链接,但是 hexo 好像不支持解析内部链接。 一些问题: 笔记改名后 publish,会新增加一篇文章,但是不会删除旧的笔记。 Ref ObsidianPublisher/obsidian-github-publisher: Github Publisher helps you to publish your notes on a preconfigured GitHub repository from your Obsidian Vault, for free, and more! 最近折腾Obsidian及hexo - 天一生水 (jiangyu.org) 用 dataview 生成读书页面","link":"/note/github-publisher.html"},{"title":"字体的重要性","text":"字体的重要性 最近开始工作,基本上都和终端打交道,碰到几个误认字符的尴尬场面,记录一下。 第一个遇到的问题发生在输入账户密码时,公司发的小册子上写的密码大概形式如xxxxxi|6xxx。由于打印密码的字体是黑体,难免产生疑问 | 到底是 I 还是 l?观察到的细节是 | 这个字符下面比其他的字符长,不过由于之前很少在密码中使用过这个字符,所以以为这个细节是区分I 和 l 的。在密码错误 n 次后,眼光扫到键盘才发现回车键上面的 | 键。 第二个遇到的问题是在终端中,公司的堡垒机登陆比较复杂,一般都会写脚本来快速登陆。写完之后,运行指令的格式为 jump ip 'auth' 其中的 'auth' 部分为调用另外一个脚本生成一个二次验证的并作为 jump 命令的参数。其中这个 ' 符号被我认为是引号,后来查阅相关的 shell 命令(相关文章参考linux下命令执行结果作为其他命令输入参数 - CSDN博客),才明白为反引号(一般位于ESC 的下方)。 说完这两个问题,回到主题,每天和字母打交到,选着一款合适的字体是非常重要的。推荐一款我在几年前就使用的编程字体——Hack: A typeface designed for source code。 上图就是这款字体的示意,最喜欢的点是 0 中间有一个小竖点,非常的传神。 以至于现在 IDE 中的 0 不是想上面这样处理,我都感觉不会编程了。","link":"/post/ImportanceOffont.html"},{"title":"【Never Reading】 202007 互联网商业模式","text":"不知不觉中每月分享已经进行半年,不过前 6 期都没有想到取什么名字。上期的标题「Never Reading」来自稍后读列表名称,仔细一想不正好成为每月分享的名字吗?而且还有致敬「Λ-Reading」的成分。 互联网商业模式 在 202006 Never Reading 中摘录过「即刻半月刊」的一段内容: 所谓“商业模式”其实指的是这家公司的“价值创造模式”,即用什么样的模型创造了更多价值。 世界上现存所有的商业模式无非三种,一是[[边际效应]](规模效应/协同效应),二是[[双边效应]],三是梅特卡夫[[网络效应]]。不同的价值创造模型,带来不同的增长动力,继而带来不同的货币化方法。 滴滴是什么模型? 当时没有找到上面这一段内容的解释,只是觉得有点神奇就记录下来。这个月收听「三五环」中刘飞和少楠关于交易平台两期内容(14、17),其中提到许小年教授的一本书「商业的本质和互联网」。在书中详细的介绍商业平台的效应,感兴趣的可以找来详细的阅读。 [[规模效应]]:[[边际成本]]越低和边际收益越高 [[协同效应]]:依赖于品种增加带来的 1+1 > 2 百货公司拥有协同效应 #problem 协同效应失败的例子? [[双边市场效应]] 双边供需的进入,都会有正外部性。公式:V=kmn 电商平台的效应弱:需要平台来管控质量,即变成了单边的;滴滴的效应强:司机和乘客的增加,都会带来正向效应(但边际收益未必持续提升)。 [[梅特卡夫效应]] 一个网络的价值与用户量的平方成正比。与常见网络效应的概念基本相同。任何用户的进入,都会有正外部性。 社交网络 曾李青定律:V=k*n²/r²(r 受 T、S、I、C 影响)。 读完之后,滴滴是什么模型这个问题就迎刃而解。这个月 有一个比较火视频 复盘出行大战:被BAT选中的滴滴,如何完成垄断霸业_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili,介绍滴滴创业的故事。做为一名内部人士,也被里面的内容给震撼到。之前沈南鹏在吴海波的采访中说过一句话「未来十年看滴滴」。记录自己看到的三个细节: 滴滴接受腾讯投资后,程维和王刚彻底关上和阿里的联系。 和快的补贴大战中:马化腾建议每次补贴金额在 12-20 中间的一个随机数 和 uber 大战中:腾讯封禁 uber 在微信上的微信号 有一个梦想是能看到程维的传记,之前特意查过他的花名 —— 常遇春。知乎热榜这个月出现过一个奇怪的问题,里面有一段引用: 王保保这个“奇男子”的称号,是朱元璋给的,评价较帝国双壁之一常遇春更高,含金量十足:朱元璋曾大会诸将,问道:“天下奇男子谁也?”诸将都说:“[[常遇春]]将不过万人,横行无敌,真奇男子。”明太祖笑曰:“遇春虽人杰,吾得而臣之。吾不能臣王保保,其人奇男子也。”(《明史》-《扩廓帖木儿传》) 商业 阿里很强调价值观,但[[阿里巴巴]]首先是一家商业组织。 上学时,[[黄峥]]就意识到了机会可贵:“我在上学时就意识到几个事:一是寒门出贵子是小概率事件,大部分富二代,尤其是官二代非常优秀。二是田忌赛马,在整体资源劣势的情况下可以创造出局部优势,进而有机会获得整个战役的胜利。基于此,平凡人可以成就不凡事。第三是钱是工具,不是目的。” 趣头条本质上是一款游戏产品,只不过披着内容信息流的外衣。 不过这一些信息流产品只有学习用户兴趣,真正的影响用户行为还是要靠基于强化学习开发的游戏。 字节系广告变现涉及4个角色:内容消费者,内容生产者,平台,广告主;阿里系广告变现涉及3个角色:消费者,商家,平台;所以阿里的广告变现链条更短,一定程度上也是效率更高的原因。多一个角色,多一份成本,最终效果要多乘一个参数。 Apple’s Relentless Strategy, Execution, and Point of View | by Steven Sinofsky | Jun, 2020 | Learning By Shipping Steven Sinofsky 是前微软 Windows 业务部门的总裁评价苹果架构迁移。 其实没有仔细看这一篇文章。震惊到我的是,这位兄弟管理过 20000 人的工程团队?不知道现在国内有哪一些公司的 CTO 能管理这么多的人。 从苹果的系统更新,理解设计中的「控制」与「自由」 - 少数派 雪城大学建筑学教授理查德·洛萨(Rhichard Rosa)认为**“设计的本质即是在于控制与自由。”**这句话非常简洁但直接地介入了设计的核心——设计行为为混乱与无序赋予秩序,使之得以承载可控的人类行为;但设计也一定不是绝对的控制,它一定要为使用者预留一些自由。 设计师对美学的自信会落脚在对细节的强制:贝聿铭设计京都东郊的美秀美术馆,下雨天需要领取相应颜色的雨伞才能进入。 有些人说:“消费者想要什么就给他们什么。” 人们不知道想要什么,直到你把它摆在他们面前 设计一定需要控制,但一定不是绝对的控制。平台的搭建者需要预留一些自由给开发者以及用户,对秩序的全盘接手最终会导致自下而上民意的反弹。 [[设计的哲学]],设计的背后是不是需要有哲学?一味满足用户需求的软件是不是会变得十分的复杂?比如 Emacs 之类自由度高的软件? 顶级PM的产品观:王慧文看行业-合集 - 简书 互联网 AB 面:A类是供给和履约在线上,B类是供给和履约在线下。 B类又可以分为:以SKU为中心的供给B1和以Location为中心的服务B2。 A 类能力体现在产品设计领域,体现在用户理解上,体现在对于通讯、社交以及内容把握上。 B1里面,主要体现在对于品类的理解,对于供应链的理解,对于定价的理解。 B2里面,如果你们去盘点一下B2的公司,他们总体来说有一个比较共有的特征,大规模的线下团队。 是否有大规模的线下团队是B1和B2一个很大的差别。 在LBS的方向上,中国和美国的企业这样的差距是怎么样发生的?大概有四个因素决定:人力成本、人口密度、人口规模、代际竞争。 阅读 理解世界的一个有效方法是,在人生的某个阶段,把任何之前视为理所当然的事情全都重新研究与思考一遍,并弄清楚它们运行的真正起源与机理。在这个过程中,自问的问题越基础、越显得不需要去质疑,收获往往就会越多——人为什么要每天吃三顿饭、买东西为什么要花钱、书籍和文章为什么会存在——真理通常就藏在这些大多数人想都不会想的事情里。[[张潇雨]] 「银河系漫游指」里面有一句:任何在我出生时已经有的科技都是稀松平常的世界本来秩序的一部分。 什么是第一原理? [[亚里士多德]] 在[[形而上学]]中提出这个哲学概念,指「公理:无法再分、无法证明且不证自明的命题。」 “第一原理”本身并不是什么原理,它只是个简称。准确地说,应该叫做“从第一原理推理”(reasoning by first principle),是分析问题,找出其不可继续拆分的根本原因,即第一原理,再从第一原理反推出解决方案的思考方式。 第一原理是先验 算法 面试官:会玩牌吧?给我讲讲洗牌算法和应用场景吧! | 唐磊的个人博客 [[洗牌算法]] 之前的分享中写房租分配 每周分享第 9 期:拼多多 | 算法花园 保证每次的概率是相同 #[[problem]]实现以下算法:一组数,每次不放回抽样,得到一个随机序列。白板编程。分析时间空间复杂度。 follow up:能否时间O(n)完成,能否空间O(1)完成。 Stanford CS230: Deep Learning | Autumn 2018 | Lecture 8 - Career Advice / Reading Research Papers - YouTube:Ag 在课程中介绍如何阅读论文,又一次感受到大佬的真诚。 主题阅读 收集资料 列出一个 list ,标注阅读进度。挑选有价值的论文阅读。 5-20 初步了解 50-100 很好理解前沿工作 如何阅读论文 多遍阅读 第一遍:标题,摘要,图片 第二遍:简介、结论、图片相关材料 第三遍:进入论文主体部分,但是可以跳过数学,明白每个参数的含义。 第四遍:阅读整篇文章,跳过没意义的部分(内容过时,没有火起来过)。 阅读时思考的问题 作者试图解决什么问题? 研究方法的关键是什么?(最具有开创性) 哪些东西可以为你所用? 有哪些参考文献可以继续跟进? 最后发现一篇相关实践文章: How You Should Read Research Papers According To Andrew Ng (Stanford Deep Learning Lectures) | by Richmond Alake | Jul, 2020 | Towards Data Science 另外一篇和论文阅读有关的文章:沈向洋、华刚:读科研论文的三个层次、四个阶段与十个问题 - 知乎 三个层次:速度、精读与研读 四个阶段:Passive Reading、Active Reading、Critical Reading、Creative Reading 这就是本期的 「Never-Reading」,我们下个月再见。","link":"/post/Never-Reading-202007.html"},{"title":"【Never Reading】 202008 选择记忆","text":"某一刻突然意识到可以选择自己的记忆,我顿悟了。 Roam CN 聚会 8 月 29 日参与由 Jessie@FG发起一次北京 RoamCN 微信群聚会,其他到场的还有 pimgeek、Flynn 等 7 位群友。聚会中大家讨论和知识管理、Roam Research 相关的内容。记录一些给我灵感的内容: Anki 做为一个知识管理爱好者,很难没有听说过 Anki。这一次线下的相关内容讨论,给我留下的最大感受就是本期标题的由来「选择记忆」。Flynn 介绍在 Michael Nielsen 的 Augmenting Long-term Memory ,一直坚持使用 Anki,他举的例子是「可以记住全部的正则匹配」。和绝大部分人一样,我记忆内容的方式就是看一遍,然后等到要用的时候,再去查相关的内容。Anki 可以自己制作需要记忆内容的卡片,这个过程不就是选择自己的记忆吗?其实几年前也看过 Michael Nielsen 的文章,可能是当时境界太低,没有理解选择记忆对自己的重要性。现在觉得有几点很重要: 自己制作卡片,网上下载的卡片没有灵魂。 卡片尽量原子化,使用 QA 形式。原子化保证没一张可以快速过去,QA 形式费曼技巧,防止假懂。 坚持使用。 等到自制卡片能到达 1k 张,再来具体分享自己的体验。 Michael Nielsen 的文章实在是太长了,先分享第一部分的摘录: 之前看过中文翻译但是没有实践 【三万字长文】量子物理学家是如何使用 Anki 的? - 知乎 Solomon Shereshevsky 以超级记忆力闻名 memex 外部记忆机器,汇总全部个人资料 [[Douglas Engelbart]] augmentation of human intelligence [[Ted Nelson]] [[Project Xanadu]] Tim Berners-Lee world wide web Anki makes memory a choice, rather than a haphazard event, to be left to chance. But, as we shall see, there are already powerful ideas about personal memory systems based solely on the structuring and presentation of information. 从信息组织和展示的角度入手。 Anki 卡片之间的复习间隔时间 一张卡片在 20 年间需要花费 4-7 分钟去记忆 制作卡片的标准,Anki make memory a choice:你可以选择自己记忆的内容 if memorizing a fact seems worth 10 minutes of my time in the future, then I do it superseding the first, if a fact seems striking then into Anki it goes, regardless of whether it seems worth 10 minutes of my future time or not. 尝试使用 Anki 很不容易,通过学习 Unix 命令掌握需要的技巧。可以把之前 [[Vim 实用技巧]] 拆解到 Anki 中。 用 QA 的形式来使用 Anki Using Anki to thoroughly read a research paper in an unfamiliar field [[AlphaGo]]还记得多少? 举例的问题 “What’s the size of a Go board?”; “Who plays first in Go?”; “How many human game positions did AlphaGo learn from?”; “Where did AlphaGo get its training data?”; “What were the names of the two main types of neural network AlphaGo used?” 多轮记录问题 通过一年之后阅读 [[AlphaGo Zero]] 检验记忆效果 I find Anki works much better when used in service to some personal creative project. 为了一个明确目标去设置 Anki 的问题,没有温度。 when I’m reading in support of some creative project, I ask much better Anki questions. Using Anki to do shallow reads of papers [[how to read a paper]](10 to 60 minutes Ankifying a paper) 基于主题去阅读论文,读重要的论文。 选择性阅读,记录关键。I’ll add to Anki questions about the core claims, core questions, and core ideas of the paper. 一篇论文 5 到 20 个问题。 避免 Anki 化有误导性的条目,仔细选择提问的方法。 “What does Jones 2011 claim is the average age at which physics Nobelists made their prizewinning discovery, over 1980-2011?” (Answer: 48). “Which paper claimed that physics Nobelists made their prizewinning discovery at average age 48, over the period 1980-2011?” (Answer: Jones 2011). Ankifying figures:知道某张图存在,然后参考。 曲线大概走向? 图表细节 Syntopic reading using Anki 从 key paper 出发,best 5-10 paper,普通的论文也有助于认识整个领域。 Anki 从设计上不是为了创造性工作而生。 Anki 创造理解新领域的机会。 More patterns of Anki use Effective learning: Twenty rules of formulating knowledge 原子化 Make most Anki questions and answers as atomic as possible How to create a soft link from linkname to filename? ln -s filename linkname 根据答案分解成两部分。 回答错原子化问题,能更清楚在哪一方面不足。 追求大师级使用 Anki use is best thought of as a virtuoso skill, to be developed: 软件简单,但是功能强大。 你就是创造者。 一个卡组 Use one big deck 不同知识混合在一起,会产生意想不到的结果。 避免临时感兴趣的话题 Avoid orphan questions 95% of Anki’s value comes from 5% of the features Using Anki for APIs, books, videos, seminars, conversations, the web, events, and places 研讨会记录 3 个左右高质量的问题。 有选择记忆 unmindfully Ankifying everything in sight is a bad habit Ankify things that serve your long-term goals Anki 之前读过的书或者论文 避免判断题 创造性工作需要内化理解部分知识。 知识的流畅度 Fluency matters in thinking。 为什么 Anki 不火?If personal memory systems are so great, why aren’t they more widely used? 人们更喜欢临时报佛脚。In experimental research on memory, people consistently underestimate the gains that come from distributing their study in a manner similar to Anki. Instead, they prefer last-minute cramming, and believe it produces better results, though many studies show it does not. 理想难度原理 The psychologist Robert Bjork has suggested the “principle of desirable difficulty”, the idea that memories are maximally strengthened if tested when we’re on the verge of forgetting them. This suggests that an efficient memory system will intrinsically be somewhat difficult to use. Human beings have a complex relationship to difficult activities, and often dislike performing them, unless strongly motivated (in which case they may become pleasurable). 用好很难。Systems such as Anki are challenging to use well, and easy to use poorly. 最后,Michael Nielsen 在文章中提到 AlphaGo,分享一个这个相关的例子: RyenX 算法花园 在 Twitter: “几周前和大老板开会,他突然问我们一个问题,总结一下就是知识层次。 第一层:alpha go 和 alpha zero 的策略网络是如何训练的?(go 学习获胜的下法,zero 学习分布) 第二层:为什么会产出这样的区别? 第三层:那么这和我们的业务中什么类似?” / Twitter Zettelkasten 最近中文圈比较火的概念,我也多次在 「Never Reading」分享相关的内容。Flynn 在聚会中也分享自己之前写过的一篇文章 拆解Zettelkasten | 卡片盒知识管理体系实践反思 - Flynn,摘录相关的内容: 工作流和笔记方式 Zettelkasten 认可思考的非线性特征,给出了一种脱离现有顺序框架的方式。 本来就没有一个完整的知识管理工作流。 如何判断 是否在各种情景下都可以使用有效方式捕捉素材? 是否对待读材料有合适的管理方式?是否能够不定期清空待读材料? 是否建立了自己的关注领域清单,并且建立对应的项目? 是否知道如何为任何项目快速建立下一步行动? 是否有种合理的方式检验自己对知识的理解? 是否确认现有正在执行系统/习惯能可以长期执行? 是否确定现有系统在遭遇中断甚至奔溃之后可以很快恢复? [[Evergreen Note]] 比 Permanent Notes 更合适 以能够直接公布为目的逻辑完备的小文章,并且需要不停的更新他们之间的可能存在的逻辑关系,共同点,冲突点。 笔记可以直接公开,比如 [[Andy Matuschak]] 写作当做最重要的事情 引用 [[Simon Eskildsen]] How to Make Yourself Into a Learning Machine - Superorganizers 以及 notes.andymatuschak.org 从他的理解来看,[[Obsidian]] 比 [[Roam]] 更合适,以及在 RoamCN 聚会时提到的,需要对文字数量进行限制。[[Progressive Summarization]] 和 [[Evergreen Note]] 的生长概念类似。 有限与无限的游戏 有本书对我蛮有影响的——叫做《有限与无限的游戏》。有限游戏在边界内玩,无限游戏却是在和边界,也就是和“规则”玩,探索改变边界本身。实际上只有一个无限游戏,那就是你的人生,死亡是不可逾越的边界。与之相比,其他的边界并不是那么重要了。 人人网、美团网、饭否网创始人王兴 有限游戏有明确的游戏结束目标,无限游戏的目标是让游戏一直进行下去。生活中的很多方面更多接近于无限游戏。比如工作之后的学习,没有明确的目标引导,更多是去保持这个习惯。 本期中脱不花的四个面试题中的驱动力也和这两个游戏有关。文章中介绍到谷歌之前从编程比赛中寻找程序员(回想到自己大学参加 ACM 经历),这些人习惯与在边界内做事情(外部刺激和目标)。而谷歌希望的人更多能根据自己的兴趣不断地拓展边界,打破旧有规则。结合到自己的工作中,很多任务没有之前编程时那么明确的目标,更多时候是依赖自己去寻找问题和解决问题。 另外 谁在驱动滴滴发动机? 中也提到张博最近在看 《有限与无限的游戏》,互联网下半场可能各个大佬更希望自己的企业基业长青。 其他 还有部分提及的内容还没有时间看,记录一下关键字和大家分享:active recall、spaced repetition、learn how to learn、nstigation habit、Atomic Habits、Mini Habits。 阅读 「个人成长」,知乎上最神奇的「专业领域」 厉害的标准 在一个职级体系中通过竞争的手段达到了高位。 留下传世的精品 让足够多的人改善自己的生活 [[产品沉思录]] Product Thinking】Vol.20200816:[[把自己作为方法]] 他用「蜂鸟般悬浮」来描述当下中国人焦虑的现状 反而对这种「温州乡绅式」的做事方式 他还提到了一种温柔而坚定地力量 —— 认命不认输 所以关键是要把自己所在的社会位置想透。在这个现实下如何去超脱自己的角色,和强大的社会和历史力量持续的较劲,不认输的较劲。 Temporary Social Media 事实证明我还是想的肤浅了、Snap 这两篇文章,是从现有社交网络的设计模式出发,从中寻找被忽略掉的边缘行为,然后反思为何社交网络会的「默认值」会被设计为「记录一切」,而这背后会带来什么样的代价。 铭记每一刻,但也带来各种挖坟的效果。 所有的事情都能被记录的时候,往往意味着什么事情都不重要。 所以 Snap 看似用有限的时间和形式,反而促进你能更好的记住某个故事和感觉,而不是像档案馆一样收集你所有的,几乎不会回溯的过往。 温故知新:如何巧妙地达到你沟通的目的? 文中关于沟通的定义值得着重记录 —— Ronald B. Adler与Russell F. Proctor将沟通定义为:“(沟通是)一种交流的过程,参与者经由交换信息而建立关系。” 不过另一个有趣的地方是关于沟通深度的,即不是两个人在一起聊得越多越好,而是聊得是否是对自己意义重大的事件,或者是极为隐私的事件。 回顾我学心理学的这8年经历 - Discovery - Hi!PDA Hi!PDA #[[fatdragoncat]] 沙盘游戏展示个人心理状态 为了改变这个现状,我用了一个最简单粗暴的办法,就是你不理我,那我就去跟随你,参加你参加的一切活动 我一改过去记者生涯养成的晚上到处约饭的习惯,下班准点回家,周末绝不加班,而且开始主动参加老婆的各种活动,有时是到公园一群妈妈带娃的聚会,有时是做蛋糕,有时是去不同妈妈家聚餐,我本身是极端内向的人,而且前面也说过,我其实是有社交恐惧症的,所以参加这些活动每次都会迅速让我极端疲劳 移情(transference)来访者对分析者产生的一种强烈的情感,将自己过去对生活中某些重要人物的情感会太多投射到分析者身上的过程。 反移情(counter-transference)移情是咨询师把对生活中某个重要人物的情感、态度和属性转移到了来访者身上。 从那时起我就知道了,自己真正渴望的就是一个温暖的家,我想服务的客户,也是渴望家的温暖的人,而不是只想疗愈自己,而不顾伴侣死活的人。 我不想再听一帮只是花钱找人诉苦,却不肯承担家庭责任的人说废话了 我的心理咨询工作终结了,我的婚姻也over了,我以为往后的岁月,就是漂泊江湖,四海为家了。 于是我开始研究,怎么才能背一个双肩背,就能一边工作,一边生活,然后就撞上了知识付费时代的来临。 心理咨询教练很难,但是保持自己的心理健康可能很容易。 【观点】得到CEO脱不花:面试一个人,你只问ta这四个问题就够了 ! [[面试]] 后来 HR 和 Mentor 告诉我日常要,多积累一些面试相关的题目,这样进去之前就知道,通过什么问题考核什么方面。从此收集一些面试题就成了习惯,而在这个过程中关注点也从对专业内容的考核,变成了对人本身的考核,也变成了对自己的向内思索:这些问题,自己会如何回答呢? [[少楠]] 的面试题 有哪些事情是别人做起来觉得很难很无趣,但是你自己却乐此不彼的坚持了很久。 最近半年有什么观点改变了你的认知或者行为方式,为什么? 你迄今为止做过的,最让你有成就感的一件事是什么? [[脱不花]] 面试题 **驱动力:**如果你突然有半个月的带薪休假,只有一个条件,就是必须研究一个事儿,你会研究什么? 主要考察的是内驱力,擅长比赛的要靠外部刺激和目标(原文中举例谷歌从编程比赛中寻找程序员),在边界内做事。 所以我对工作的不适应,除了不了解机器学习,另外一方面来自于大学靠的是外部刺激和目标。现在需要尝试的是突破业务理解? 而内驱力更能适应变化,他们能根据自己的兴趣不断地拓展边界,打破旧有规则 和最终在谷歌成功概率相关的问题:你几岁开始拥有自己的电脑? 谷歌的这两条经验,本质上都指向一个问题:一个人的驱动力是从哪里来的?是来自他自己的兴趣或者对自己的要求,还是来自外界什么人给他设定的标准? 瞬间反应和回答问题的思路。研究的标的、怎么使用这些时间、达到什么目标? 因为了解个人的内驱力高低,基本上就能判断出来这个人未来应对变化的能力。当环境对他提出新的要求时,他的抗压性强不强,能不能主动适应变化,就能从这个问题中反映出来了。 **期望值:**你正在做的事,行业里最顶尖的人或公司是谁,他们是怎么做的? 主要是看眼界如何,视野开阔与否。能不能把内驱力转化为行动力 对自己领域的理解 对高手的定义决定了他的认知,定义的过程能看到研究的过程及人脉情况 关键是如何定义和标杆的差异,以及差异如何形成及缩短方式。 人际:你在此之前的人生经历中,做过什么重要的取舍? 如果你做重要取舍都是一个人,是不是验证你是一个孤独的人? 核心是看决策机制的形成,了解进退感和分寸,是否有清晰的边界意识。 为什么做出这种选择?出发点是什么?为什么这个时候做?你能不能清晰地界定选择的代价是什么?在你做出这些选择的前后都发生了什么,分别怎么解决的? 重大决策都会有一两个关键人的影响,关注是否有其他相关人被提及,以及这些人在决策中的角色,来判断他的关系网络 啰嗦的人无法带大队伍,因为边界不清晰 **反思:**针对你刚才提到过的这件事,如果你有机会能重新做一遍,会有哪些地方不一样? 反思能力,自己经历过的事情是否有清醒的觉察,评估他对待机会的敏感度。 对过往是否有总结和复盘,以及对机会的敏感度。颗粒度越细,反思越深。 面试中很难靠一面之词分清哪些是团队的水平,哪些是个人的贡献。通过反思,根据提到的颗粒度,能够判断,他在项目中究竟起到了多大的作用。 对一个人的内驱力、关系建立能力、目标感和反思能力都有充分的了解能更好帮助做出准确的判断。 很幽默以及不温和 最后推荐了 [[奈飞文化手册]] 商业 谁在驱动滴滴发动机? 平台治理 [[有限与无限的游戏]] 叶杰平来滴滴的两道面试题: “一道题目,跟出行里抢单、派单相关,问我能不能抽象成数学问题。” 能不能把抢单到派单问题,具体建立成一套算法模型? 纪念一下人已经走了。 失去字节技术中台支持的 TikTok,还会是曾经那个 TikTok 吗? [[The Information]] 美国政府:威胁国家安全和违反数据隐私。 国内以什么理由封杀部分软件?美国是实行对等的权力吗?中国和美国之间的战争一部分,没有一个人是无辜的。另外,没有看到国内政府在这一件事情上发表任何的声明? 联系一下,这件事情对滴滴的国际化会产生什么样的影响?滴滴会不会被更加宽容的处理?还是不要抱有幻想? 从监管层到潜在买家,试图改写 TikTok 未来的角色变多了[[The Information]] 算法 这个月看起来,看得论文和文章比较少。ai-labs 单机 93w QPS 的模型承保我好几点的笑点。 滴滴KDD2020论文(六) | 滴滴公开ETA新系统,线上推理速度进入微秒时代 [[CompactETA]] #ETA 之前写过他们原来的 ETA 模型文章: (WDR) Learning to Estimate the Travel Time | 算法花园。 数据稀疏 空间稀疏:link 历史数据少 基于路况分布来度量不同 link 的相似性,利用 metric learning 进行训练 时间稀疏:相邻时段的 embedding 设置共享参数,使得相邻时段的 embedding 更加相似 如何解决线上预测耗时? [[GAN]] 替代 [[LSTM]],link 之间的依赖关系通过学习路网的拓扑结构来建立 位置编码:保持序列信息 查表 + g 然后过 MLP 算法工程师技术路线图 - 知乎 [[Python]]:[[Learn Python the Hard Way]] [[流畅的 Python]] 能读懂 panads、sklearn 等包的源代码 [[Scala]] Spark快速大数据分析 [[Scala函数式编程]] [[冒号课堂]] [[cpp]] 能够读懂[[LightGBM]]里对于tweedie loss的相关定义代码。 常用设计模式有哪些? Embedding 技术的非端到端学习方法 - 知乎 下载记录变成一个 session 随机游走扩充数据 #Airbnb 全局 context [[Real-time Personalization using Embeddings for Search Ranking at Airbnb]] 同一个类别的随机负样本,分类成本不高。","link":"/post/Never-Reading-202008.html"},{"title":"月读 | 睡眠革命","text":"前一段时间作息混乱,晚上躺在床上睡不着,然后玩手机,导致更加睡不着。第二天下午又很困,只好趴着睡一会儿。从而导致晚上睡不着又玩手机的恶性循环。当时一度觉得自己都不能从这个圈里面走出来了。不过,想起来之前在少数派看到过一篇文章,推荐过一本和睡眠相关的书——睡眠革命,抱着死马当活马医的心态看了一下。 书中作者主要介绍昼夜节律、睡眠类型、睡眠周期、睡前醒后、日间小睡、睡眠环境等多个方面的内容,我将自己在阅读时候记录的笔记整理一下,与大家分享。 核心收获 读完这本书最大的几个收获: 人的睡眠类型有两种:早睡类型和晚睡类型。 失眠是过度清醒造成的,过度清醒又是担心自己会失眠所产生的。 昼夜节律 昼夜节律是生命体24小时的内循环,受我们的内置生物钟的管理。我们大脑中的这一生物钟,24小时调节着我们的多个内部系统,包括睡眠和饮食习惯、激素的分泌、体温、灵敏度、情绪和消化,使其与地球的自转相一致。我们的生物钟是根据一些外部线索而设定的,其中最主要的是日光,此外还包括温度、进食时间等其他因素。 上面是书中的一张插图和一段文字。核心思想是,人的一天活动受自然规律控制,所以要在正确的时间干正确的事情。如同我最开始描述的状态一样,人体内也有一种正常的循环状态。在晚上褪黑素产生的时候,开始准备睡觉,我们会在2~3点时进入一个高效的睡眠阶段,从而在早晨可以按时起床,那么晚上对于睡眠的需求又会达到峰值,为我们再一次提供最佳的入睡时机。 睡眠类型 一直以来,我们的文化都提倡一点:早睡早起。但是在现实中,我们很多人却很喜欢睡懒觉。作者在书中指出,从基因上来看,人的睡眠分成两类:早睡早起类型 和 晚睡晚起类型。不应该强制两类人在相同的时间躺下和起床,而是寻找最合适他们的睡眠规律,如果昼夜节律图中描述的内容一样。当然,作者强调需要严格遵守自己的睡眠规律,不要轻易的打破,比如周末睡懒觉之类的。 睡眠类型:智慧睡眠的7个要点 1.了解你和你的亲朋好友属于哪种睡眠类型。如果你不能确定,可以使用慕尼黑大学的问卷调查表。 2.巧妙规划好你一天的日程,在你状态最佳时做最重要的工作。 3.把咖啡因当成高效的表现增强剂使用,而不是出于习惯去喝咖啡,并且一天的咖啡因摄入量不要超过400毫克。 4.晚睡星人——如果你想要克服社交时差,就不要在周末睡懒觉。 5.在会议室、办公室和办公桌配置日光灯,提高员工的灵敏度、工作效率,并改善他们的工作情绪。 6.知道何时该上前、何时该退后。如果你是一个早起型的人,那么你该不该自告奋勇地在深夜比赛中参加点球大战呢? 7.如果你和你的伴侣属于不同的睡眠类型,你们应该学会彼此协调、彼此适应。 睡眠周期 在我们的常识中,一直有一个8小时的推荐睡眠时间。作者澄清,8小时是每晚人均睡眠时间,一味追求8小时的睡眠会造成巨大的压力,反而对我们的睡眠起着破坏性极强的反作用,让我们无法获得真正需要的、因人而异的睡眠时间。 作者提倡一种新的睡眠时间方法: “R90”指的是以90分钟为一个周期,获得身体修复。“90”这个数字,并不是我从1—100中随意选择的。从临床上说,90分钟是一个人经历各个睡眠阶段所需的时间。这些睡眠阶段组成了一个睡眠周期。 我们的睡眠周期由4个(有时是5个)不同的睡眠阶段组成。你可以把度过不同的睡眠阶段、完成一个睡眠周期的过程,想象成走下几段楼梯、完成一段行程。当我们关灯上床、准备睡觉时,就像站在这几段楼梯之上,而想要得到的深睡眠,就像走到了这几段楼梯之下。 实践这个 R90 睡眠方法的关键是,对睡眠进行统计。以周为统计周期,争取每周达到 35 个睡眠周期。然后根据自己的工作性质,确定一个固定的起床时间,反向推导出你应该在什么时候入睡。 睡前醒后 一般而言,我们只关心什么时候睡觉,而忽视了睡眠前以及醒来后的90分钟。从作者观点来看,应该利用好这一段时间,提高睡眠的质量。 睡眠前后的例行程序:智慧睡眠的7个要点 1.睡眠前后的例行程序将直接影响你睡眠的质量,以及你清醒的一天:如果予以重视,整个白天和整个晚上就会更加高效。 2.在日间偶尔脱离电子设备,将此作为一种犒劳,并通过这种方式训练你的身体和心灵。 3.对于晚睡星人来说,睡眠后例行程序至关重要,如果他们不想输给早起星人的话。不要因为青睐于止闹按钮,而轻易放弃这些睡眠后例行程序。 4.不要在头脑不清醒的时候发送消息!先让自己清醒一点,再去拿手机。 5.让你的身体感受从温暖到凉爽的变化,有利于带来自然的体温下降。快速洗个温水浴,然后选择较凉爽的睡眠环境,能帮助你达到目的。 6.在上床前整理你的卧室,放空你的大脑,“下载”你的一天,就不会在该睡觉的时候想东想西、难以入眠。 7.执行睡眠前例行程序,是为了结束过去的一天——用鼻子呼吸、放松心情、实现从明亮到昏暗的过渡。执行睡眠后例行程序,是为了开启不匆不忙的新一天。这两段时间都只属于你,不属于别人。 日间小睡 日间小睡分成两个部分:午睡以及傍晚的小憩。这一部分的睡眠的作用是对夜晚睡眠周期的补充,一般而言30分钟的小睡可以媲美晚上的一整个睡眠周期。 书中引用到美国国家航空航天局的一项调查专门研究了日间小睡的功效,在对执行长途飞行的飞行员进行调查后,他们得出结论:“日间小睡有助于维持或改善随后的表现,提高生理和心理的灵敏度,并能有效改善情绪。” 日间小睡:智慧睡眠的7个要点 1.利用午后休憩时机(下午1—3点)给自己安排一个可控修复期,是弥补夜间睡眠周期的完美方法,这也与你的昼夜节律彼此协调。 2.黄昏(下午5—7点)是次优的休憩时机,因为此时人的睡眠需求极高。但这一时段的日间小睡应控制在30分钟之内,这样才不会影响晚上的睡眠。 3.白天睡不着?没关系。只要花30分钟放松一会儿,暂时脱离周围的世界片刻。 4.至少每隔90分钟休息一会儿,消除大脑的疲劳,提高注意力的集中水平。在休息时不要使用电子设备,你无需让自己自始至终地受到电子设备的控制。 5.不要受到你所在的企业文化的影响,切莫先入为主地给那些白天睡觉的人贴上“懒惰”的标签,而应着手构建一种接受日间小睡和休憩的企业文化——你若不打盹儿,就会输得很惨。 6.使用冥想或正念应用软件,或者把玩某个珍爱的私人物品,暂时脱离当前的环境。 7.如果你真的无法脱身,那就巧妙地安排一天的工作。在午后倦怠期,不要让自己困于太费神的工作 睡眠环境 上面讲了那么多,都是一些比较虚的东西,最后分享一些作者对于睡眠环境的建议。首先一点,作者提倡在卧室中尽量只睡觉,不干其他活动。其次,作者提倡采用像婴儿一样的侧卧睡眠方式,要点包括:膝盖自然弯曲、两条手臂放在身前,并轻轻交叠在一起,颈部、脊柱和臀部形成一条平滑的直线。 最后,是一些关于寝具套装选择的建议: 1.学会以胎儿姿势睡眠,躺向非主要的身体一侧(惯用左手的人向右侧睡,惯用右手的人向左侧睡)。 2.检测床垫,了解什么样的床垫对你来说软硬适中。让你的伴侣也这样做。 3.循序渐进:7年间分两次各花500英镑在你的床垫上,而不是一次花1000英镑。可以考虑购买能够经常换洗的床垫。 4.使用低过敏性、透气舒适的床上用品,无论你是否属于过敏体质。避免潜在的睡眠障碍因素,并注意调节好温度。 5.床的尺寸很重要——能买多大,就买多大。特大号床垫是值得一对儿夫妇考虑的最小型号(只要卧室中放得下)。双人床是给一个人睡的。 6.不要盲目购置寝具!可以根据销售人员的介绍,了解你能买到什么样的寝具。但在做出最后决定时,记得运用你在本章中学到的知识。 7.记住床垫和床架重要性比率:你可以把100%的预算全部花在购置床垫上,因为床架主要是装饰性的","link":"/post/Sleep.html"},{"title":"【随想集】01 我讲不清楚事情怎么办?","text":"重新定期写一些阅读分享,暂时命名为「随想集」。 我讲不清楚事情,怎么办? · 语雀 这是一篇关于职场沟通的文章,如何把事情说清楚是一项很重要的技能。作者给了三点建议: 说人话,要用比喻的方式,把复杂的概念讲清楚。 定调子,我讲的第一句话,一定很重要,如果能用通俗的概念开场,才会有兴趣听下去。 看反馈,不要只顾着讲,或者担心有留白会尴尬,所以一直拼命讲。 结合自己的经历,讲事情的时候还要考虑听众的背景,对其他 RD 说的就不能和 PM 一样。最后,高情商可以时不时问一下:我说清楚了吗?低情商可以问:你听明白了吗? 请不要神化双链笔记 - 少数派 Zettelkasten、双链这些概念差不多火了一年多的时间,作者对目前的现象进行思考和批评。 首先分析大部分介绍双链笔记文章的逻辑: 卢曼自下而上地生成卡片 卢曼重视在笔记之间建立联系 现在的双向链接就是卢曼卡片盒笔记法的软件实现 得益于卡片盒笔记法,卢曼从公务员成为德国当代重要的社会学家,因此这种扁平化的组织形式是十分有效的。 看起来是很完备的逻辑论证扁平化的双链笔记如何有用的过程,但是却忽视了最基础的类比可能并不成立的前提。作者提出的观点是:Zettelkasten 这样的信息组织形式是为了消除笔记内容和搜索的不确定性而努力。你需要先积累一定程度的笔记到,然后再去设计更细粒度的、结构化的笔记结构。最终才能明确笔记原则,理清自身期许 。 为什么有些人总被人评价逻辑性很强?而有些人被评价逻辑弱鸡? - 即刻App 作者将分成三个层次来说:没逻辑,有体系以及逻辑链。由于认知能力有限,没太明白后面两部分的关系。 没逻辑这个部分,作者给出的例子很形象:有些人的思考路径是,嗯,我觉得1很重要,2也很重要,对,还有3和4,我想想,对,还有5,嗯5比2重要一点。更糟的是,过两个小时,你再问他这个问题,他会回答235,丢掉了14,可能又多了一个67。所以如何才能避免? 在做算法工程师的道路上,你掌握了什么概念或技术使你感觉自我提升突飞猛进? - 知乎 以及 工作之后,顶会还重要吗? - 知乎 算法是一个残酷的竞技场。比起软件工程师,淘汰更加残酷,被击败,主动离队。 顶会论文是跨越公司、跨越国家、跨越年龄的硬通货。 (希望年前写的论文能中 KDD) (20210609: 被 Reject,等 AAAI) 《换脑游戏》试播集:) 我当时的评论:很喜欢这一期播客。整体听完,对小约翰老师的印象变成了「吾道不孤」,好像知识星球都不能加入了……主播提的那么多问题,引发自己思考的是你有哪一种焦虑?john 的善于利用自己的焦虑提供了一种新的思路。最后,john 提到英语老师讲题目的就只有一个人举手的场景,我也遇到过,可能当时真的想知道问题答案驱动我去举手吧。","link":"/post/Thinking-01.html"},{"title":"【随想集】02 我曾刻意远离人群","text":"开始之前推荐一首歌 3055 - Ólafur Arnalds。 1. 我曾刻意远离人群 五一前,遭受打击,开始陷入自我怀疑中。想起吴岭南在「无闻西东」中的一段台词: 当我在你们这个年纪,有段时间,我远离人群,独自思索,我的人生到底应该怎样度过?某日,我偶然去图书馆,听到泰戈尔的演讲,而陪同在泰戈尔身边的人,是当时最卓越的一群人,这些人站在那里,自信而笃定,那种从容让我十分羡慕。而泰戈尔,正在讲“对自己的真实”有多么重要,那一刻,我从思索生命意义的羞耻感中,释放出来。原来这些卓越的人物,也认为花时间思考这些,谈论这些,是重要的。今天,我把泰戈尔的诗介绍给你们,希望你们在今后的岁月里,不要放弃对生命的思索,对自己的真实。 请给我五月 以及 逃离韩料店 Hayami,拼多多 PM(写出这个多少怀疑自己是时间太多从而导致什么都不想干),一直觉得她的文字很温暖。这两篇文章分别是她在 23 岁以及 24 岁生日所写,有时候读其他人的记录相当于给自己照镜子。5 月我也很长时间怀疑人生没有意义,甚至读到哲学史中的「所有形而上学的问题都没有答案」时还有一些激动。后来渐渐明白,自己更大的问题是不知道如何做到自己认为的人生意义。阅读不是解决孤独的方法,创造才是,所以才鼓起勇气重新写下这篇随想集。 用创作来「抵抗」惯性、「抵抗」生活日复一日的琐屑: 当你觉得什么事情都提不起兴趣的时候,不要让惯性吞没了自己,去做点什么吧,至少做点什么事情。 洛克菲勒的信中说,克服绝望的方式只有一种,那就是持续(用自己的行动和努力)创造出各种可能性以跨越障碍。 如果想去建立自己的社会关系,想去结识丰满有趣的人类,最有效的方法就是成为他们想要认识的人。而成为他们想要认识的人,就是要去创作。 豆瓣上有个很热门的广播提问—「大家生活的支点究竟是什么呢?(换句话说,究竟是因为什么东西所以愿意承受和忍耐生活中无穷无尽的困难和苦难呢?)」 排名分先后:想象力,创作,爱。简言之,是自己信仰的价值体系,包括超越性的审美和智性的情感。 2. 我到了参加葬礼的年纪 外公在 4 月 30 日选择离开我们,对他的印象永远停留今年春节。5 月 10 日葬礼前,一直在家里休假,特地去看一些和死亡相关的内容。 寻梦环游记 人的一生,要死去三次: 第一次,当你的心跳停止,呼吸消逝,你在生物学上被宣告了死亡; 第二次,当你下葬,人们穿着黑衣出席你的葬礼,他们宣告,你在这个社会上不复存在,你悄然离去; 第三次,是这个世界上最后一个记得你的人,把你忘记,于是,你就真正的死去,整个宇宙都不再和你有关。 人生总有一刻,我们会开始思考死亡 - 知乎 于是我发现,面对死亡最终可能只有两种方法: 一种是将自己与一些更宏大的东西联系起来:一个数学定理、一本文学著作、一件艺术作品或一种恒久的信仰。马尔克斯与康德靠《百年孤独》与《[[纯粹理性批判]]》遗世独立,米开朗基罗把《创世纪》和《最后的审判》印刻在西斯廷大教堂里,供千万后朝拜——他们肉身虽灭,但精神不朽——反正建筑是永远戳在那儿的。 还有一种就是,生活在当下的每个瞬间里,不烦扰过去、不担忧将来。 Lambda-Reading 这里蕴涵着世界和灵魂的救赎以及关于死亡的读书笔记 临终者的五大遗憾、《天堂的证据》、《陪伴生命》(我从临终病人眼中看到的幸福)、《与神对话》、《耶鲁大学公开课:死亡》、《死亡如此多情》(百位临床医生口述的临终事件)、《向死而生》 People Die, but Long Live GitHub - laike9m’s blog 目前来看,我认为 GitHub 是在百年尺度上存储信息并让其能被访问的唯一途径。 Joe’s Blog — a non-linear personal web notebook 临终前把博客文章用 TiddlyWiki 保存在 Github,并且写到「I hope the blog will be readable in 100+ years time.」也许 Github 是我们这个时代的数字公墓(不老阁)。 城堡 17:很高兴遇见你…… · 语雀 (yuque.com) 我和解的方式是,也曾经让外公在某些时刻高兴过。 【迪拜孝子】 郭麒麟 阎鹤祥_哔哩哔哩_bilibili 郭麒麟在《欢乐戏剧人》一个相声的链接,这个节目改编自传统相声《福寿全》。大概情节是,一个人用钱忽悠另外一个人穿麻带孝,给号称死去的老富翁当孝子。现在想起来,这是我第一次关于葬礼的练习。","link":"/post/Thinking-02.html"},{"title":"Today I Learned","text":"本周从 howie serious 的文章 TIL笔记|你嘛时候终身学习啊? 学到一个工作方法:Today I Learned,今天我学到。简单来说就是把自己每天学到的东西写下来,在网上公开发表。 这个概念最早的发起人是 Josh Branchau,他差不多从 2015 年开始执行,公开库 jbranchaud/til: 📝 Today I Learned (github.com) 中已经包含 1400+ 的笔记,笔记按主题分类且大部分和编程相关。他在文章 How I Built a Learning Machine - DEV Community 中提到过三个心得: 每篇文章限制在 200 字或更少 每天花 10 到 15 分钟 在工作中学习,工作时间写 对自己来说,希望能借助这种形式,将更多的笔记公开到网络上,同时让博客获得更多的访问量。 另外提一句,开头提到 howie serious 是小能熊的创始人,相当于是一位效率教练。18 年左右看过他的知识管理训练营,当时还按里面的思路用 wikipedie 性质分类+杜威十进制分类在 evernote 上进行知识管理。重新看到他的文章,有一种多年老朋友重新相逢的感觉。 Ref Simon Willison: TIL howie serious 的 todayilearned 笔记 以及 📚 today i read 阅读笔记","link":"/note/today-i-learned.html"},{"title":"为博客添加返回顶部按钮","text":"适用于WordPress 由于主题没有自带的返回顶部按钮,所以我一直在寻找一种解决方案。之前使用的是wordpress插件提供的返回顶部按钮,后来在网上乱逛,发现有Xnces – 衔铁部落的返回顶部按钮非常的酷炫,正是我要寻找的。于是,我在那个博客下留言询问制作方法。 前几天,看到那个博客上出现了一篇文章-本博客的返回顶部效果。 按照上面的方法,折腾一会儿,我也制作出来了,特地记录一下。 首先,先加载一下环境。在后台functions.php中找到ms_scripts()函数,添加wp_enqueue_script( 'jquery' );调用wordpress默认的JQuery文件。 我将这个效果有关的js代码放在了主题目录下新建的themes.js文件中。所以在上面的函数中添加下面两句话导入这个文件wp_register_script( 'themes_js', THEMEPATH . '/themes.js',array());和wp_enqueue_script( 'themes_js' ); CSS代码我直接加在了主题style.css中。 重新打开网站就能看到效果了。 themes.js文件中代码如下 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768var bigfa_scroll = { drawCircle: function(id, percentage, color) { var width = jQuery(id).width(); var height = jQuery(id).height(); var radius = parseInt(width / 2.20); var position = width; var positionBy2 = position / 2; var bg = jQuery(id)[0]; id = id.split("#"); var ctx = bg.getContext("2d"); var imd = null; var circ = Math.PI * 2; var quart = Math.PI / 2; ctx.clearRect(0, 0, width, height); ctx.beginPath(); ctx.strokeStyle = color; ctx.lineCap = "square"; ctx.closePath(); ctx.fill(); ctx.lineWidth = 3; imd = ctx.getImageData(0, 0, position, position); var draw = function(current, ctxPass) { ctxPass.putImageData(imd, 0, 0); ctxPass.beginPath(); ctxPass.arc(positionBy2, positionBy2, radius, -(quart), ((circ) * current) - quart, false); ctxPass.stroke(); } draw(percentage / 100, ctx); }, backToTop: function($this) { $this.click(function() { jQuery("body,html").animate({ scrollTop: 0 }, 800); return false; }); }, scrollHook: function($this, color) { color = color ? color: "#000000"; $this.scroll(function() { var docHeight = (jQuery(document).height() - jQuery(window).height()), $windowObj = $this, $per = jQuery(".per"), percentage = 0; defaultScroll = $windowObj.scrollTop(); percentage = parseInt((defaultScroll / docHeight) * 100); var backToTop = jQuery("#backtoTop"); if (backToTop.length > 0) { if ($windowObj.scrollTop() > 200) { backToTop.addClass("button--show"); } else { backToTop.removeClass("button--show"); } $per.attr("data-percent", percentage); bigfa_scroll.drawCircle("#backtoTopCanvas", percentage, color); } }); }}jQuery(document).ready(function() { jQuery("body").append('<div id="backtoTop" data-action="gototop"><canvas id="backtoTopCanvas" width="48" height="48"></canvas><div class="per"></div></div>'); var T = bigfa_scroll; T.backToTop(jQuery("#backtoTop")); T.scrollHook(jQuery(window), "#555555");}); CSS文件要添加的代码 1234567891011121314151617181920212223242526272829303132#backtoTop{ background-color:#eee; border-radius:100%; bottom:10%;height:48px; position:fixed; right:-100px; width:48px; transition:0.5s; -webkit-transition:0.5s}#backtoTop.button--show{ right:10px}.per{ font-size:16px; height:48px; line-height:48px; position:absolute; text-align:center; top:0; width:48px; color:#555; cursor:pointer}.per:before{ content:attr(data-percent)}.per:hover:before{ content:"↑";font-size:20px}","link":"/post/add-return-button-to-blog.html"},{"title":"ImageNet Classification with Deep Convolutional Neural Networks(AlexNet)","text":"作者以及相关性 Alex Krizhevsky Ilya Sutskever Geoffrey E. Hinton 本文被认为是这一轮深度学习浪潮的开端 主题 将 CNN 技术最先应用到图像识别领域,利用 CNN 参数共享的特性,减少网络的规模 解决深度网络难训练(速度慢)以及容易过拟合问题(更多数据或者网络技巧) 数据集与指标 ImageNet LSVRC-2010 contest: 图片 1000 分类 top-1 和 top-5 错误率为指标 模型/实验/结论 模型 由于当时的 GPU 显存限制,无法将所有的数据加载到单独 GPU 中,作者使用两个 GPU 并行训练。 整个模型如下图所示,由 5 个卷积层以及 3 个全连接层组成。其中在 CONV3、FC1、FC2、FC3 层进行两个 GPU 的数据交互。 [227, 227, 3] INPUT: 原始论文中 224 为笔误。 [55, 55, 96] CONV1: (11*11*3,96) filters, Stride 4, pad 0 [27, 27, 96] MAX POOL1: (3*3) filters, Stride 2 [27, 27, 96] NORM1: Normalization layer [27, 27, 256] CONV2: (5*5,256) filters, Stride 1, pad 2 [13, 13, 256] MAX POOL2: (3*3) filters, Stride 2 [13, 13, 256] NORM2: Normalization layer [13, 13, 384] CONV3: (3*3,384) filters, Stride 1, pad 1 [13, 13, 384] CONV4: (3*3,384) filters, Stride 1, pad 1 [13, 13, 384] CONV5: (3*3,256) filters, Stride 1, pad 1 [6, 6, 256] MAX POOL3: (3*3) filters, Stride 2 [4096] FC1: 两个 GPU 中的 CONV 层结果进行全连接 [4096] FC2: FC1 进行全连接 [1000] FC3: FC2 进行全连接,最后输出分类结果 参数数量 60 million 使用 ReLU 作为激活函数:比 tanh 计算开销小,以及收敛速度快。根据问题的特点选择激活函数(大模型、大数据集) Local Response Normalization(Norm Layers):局部响应归一化层,后来很少使用。 在经过 ReLU 作用之后,对相同空间位置上(bx,y{b_{x,y}}bx,y)的相邻深度(bj{b^j}bj )的卷积结果做归一化。n 指定相邻卷积核数目,N 为该层所有卷积的数目。k,n,α,β{k, n, \\alpha, \\beta}k,n,α,β 都是超参数。本文使用 k=2,n=5,α=10−4,β=0.75{k=2, n=5, \\alpha=10^{-4}, \\beta = 0.75}k=2,n=5,α=10−4,β=0.75, 分别降低 top-1 和 top-5 错误 1.4% 和 1.2% bx,yi=ax,yi/(k+α∑j=max(0,i−n/2)min(N−1,i+n/2)(ax,yj)2)βb_{x, y}^{i}=a_{x, y}^{i} /\\left(k+\\alpha \\sum_{j=\\max (0, i-n / 2)}^{\\min (N-1, i+n / 2)}\\left(a_{x, y}^{j}\\right)^{2}\\right)^{\\beta} bx,yi=ax,yi/⎝⎛k+αj=max(0,i−n/2)∑min(N−1,i+n/2)(ax,yj)2⎠⎞β Pooling:s=2 < z=3,有部分重叠,作者通过实验发现这种方法可以更好地避免过拟合。 data augmentation: 对图像进行裁剪以及翻转,扩大数据。这种策略对测试带来影响,测试时裁剪出图片四个角落以及中间部分,得到 5 张图片,另外翻转得到 5 张图片,最后分类结果又这 10 图片的平均得分确定。 利用 PCA 改变 RGB 通道的强度。 Dropout:每次训练的时候,从模型中 sample 出一个小的模型,减少过拟合。 实验 参数:dropout 0.5,batch size 128, SGD Momentum 0.9, Learning rate 1e-2 reduce by 10,L2 weight decay 5e-4 测试集上结果 取出 CONV1 相关的 filters卷积侧重点不同,GPU1 颜色无关,GPU2 颜色相关。多次实验发现都存在这种现象,说明使用多个 GPU 训练是必要的,模型可以捕捉更多信息。 取所有最后一个隐层向量,找到与测试图片欧拉距离最小的训练图片(下图中第一列为测试图片,之后几列是欧拉距离最小的训练集中图片)。肉眼可以发现,同一分类的图片有很大关联性。证明模型能学习图片之间的关系。 结论 通过移除 AlexNet 网络中的某几层发现错误率均有提高,这个网络时必要以及有效的。 文章中作者通过大量的实验确定模型的细节问题,值得我们学习。 当时的 GPU 限制作者的想象力……","link":"/post/alexnet.html"},{"title":"Alfred 使用记录","text":"昨天晚上在看MacTalk时,发现一篇文章神兵利器——Alfred,随后将里面提到的软件下载下来.接触不到一天的时间,就感觉到这个软件的强大.下面就记录一些我用到的功能以及插件. 原生功能 terminal 最近在公司工作,都要求连接到服务器上去写代码,所以对terminal的需求很大.目前自己用的是iTerm2+zsh的组合,还有类似于powerline的状态栏,工作效率杠杠的.Alfred可以使用一个字符触发terminal,默认的是>以及打开Mac自带的终端. 由于>这个字符比较难打,我将Prefix修改为;,而且也将修改terminal为iTerm2(参考这个链接最下面提到的Alfred Support). 网页搜索 给定关键字打开浏览器在特定的网页搜索,例如下图 实现起来也比较简单,在Feature->Web Search中添加类似于下面的即可. 计算器 输入表达式通过Alfred计算 WorkFlows 这个是我觉得Alfred最强大功能,毕竟编程改变一切,下面推荐几个插件. Markdown img 这个插件的功能是直接将系统的剪贴板里面的图片上传到七牛图床,并把图片链接复制到当前的编辑器和剪贴板.这篇文章的截图就是通过这个插件完成的,终于不用像之前一样苦逼的一张张上传图片.下载地址 Workflow Searcher 通过Alfred来搜索workflow并且跳转到下载页面 v2ex 快速浏览v2ex的帖子. Douban 查看豆瓣的电影,音乐,图书等信息 Wunderlist 可以连接奇妙清单,正好符合我这种轻量级用户. 有道翻译加强版 满足查字典的需求,虽然mac原生的也很强大,但这个能翻译啊 百度搜索 虽然国内口碑不好,但我还是觉得百度更懂中国人… 最后吐槽几句,垃圾为知笔记,mac版就没有多少功能,发个博客都没有,可惜我剩下三年的vip,这篇文章还是靠 Mweb 发布的.","link":"/post/alfred-lists.html"},{"title":"深入浅出 BERT 源代码之 BertModel 类","text":"国庆节前突然对如何计算 BERT 的参数量感兴趣,不过一直看不明白网上的计算过程,索性下载 BERT 源代码阅读一番。这篇文章记录阅读 BertModel 类(核心代码实现)时写的一些笔记,反正我也是纸上谈兵,所以不需要太关注数据处理和 Finetune 相关部分,最后附上计算 BERT 参数量的过程仅供参考。 代码地址:bert/modeling.py at master · google-research/bert BertConfig 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950class BertConfig(object): """Configuration for `BertModel`.""" def __init__(self, vocab_size, hidden_size=768, num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072, hidden_act="gelu", hidden_dropout_prob=0.1, attention_probs_dropout_prob=0.1, max_position_embeddings=512, type_vocab_size=16, initializer_range=0.02): self.vocab_size = vocab_size self.hidden_size = hidden_size self.num_hidden_layers = num_hidden_layers self.num_attention_heads = num_attention_heads self.hidden_act = hidden_act self.intermediate_size = intermediate_size self.hidden_dropout_prob = hidden_dropout_prob self.attention_probs_dropout_prob = attention_probs_dropout_prob self.max_position_embeddings = max_position_embeddings self.type_vocab_size = type_vocab_size self.initializer_range = initializer_range @classmethod def from_dict(cls, json_object): """Constructs a `BertConfig` from a Python dictionary of parameters.""" config = BertConfig(vocab_size=None) for (key, value) in six.iteritems(json_object): config.__dict__[key] = value return config @classmethod def from_json_file(cls, json_file): """Constructs a `BertConfig` from a json file of parameters.""" with tf.gfile.GFile(json_file, "r") as reader: text = reader.read() return cls.from_dict(json.loads(text)) def to_dict(self): """Serializes this instance to a Python dictionary.""" output = copy.deepcopy(self.__dict__) return output def to_json_string(self): """Serializes this instance to a JSON string.""" return json.dumps(self.to_dict(), indent=2, sort_keys=True) + "\\n" BertConfig 类包含模型参数、几个读取和存储参数的方法。 @classmethod 代表类方法,不需要实例化就可以调用类中的方法。参考其他的文件可以发现它的使用是: 1bert_config = modeling.BertConfig.from_json_file(FLAGS.bert_config_file) 主要参数有: vocab_size: 词表大小 hidden_size: Size of the encoder layers and the pooler layer. 词向量 embedding 大小 num_hidden_layers: Number of hidden layers in the Transformer encoder. 层数 num_attention_heads: Number of attention heads for each attention layer in the Transformer encoder. 多头数量 intermediate_size: The size of the “intermediate” (i.e., feed-forward) layer in the Transformer encoder. FFN 中间层的大小 hidden_act: The non-linear activation function (function or string) in the encoder and pooler. 激活函数 hidden_dropout_prob: The dropout probability for all fully connected layers in the embeddings, encoder, and pooler. dropout 参数 attention_probs_dropout_prob: The dropout ratio for the attention probabilities. max_position_embeddings: position embedding 的最大值 (e.g., 512 or 1024 or 2048). type_vocab_size: next sentence prediction 中的 Segment A 和 Segment B,默认大小是 2 initializer_range: The stdev of the truncated_normal_initializer for initializing all weight matrices. “”" embedding_lookup 根据 input_ids 生成词向量 embedding table 以及对应的 input_id_embeddings。简单一点理解就是向量从 [batch_size, seq_size] 到 [batch_size, seq_size,embedding_size]。 1234567891011121314151617181920212223242526272829303132333435363738394041424344def embedding_lookup(input_ids, vocab_size, embedding_size=128, initializer_range=0.02, word_embedding_name="word_embeddings", use_one_hot_embeddings=False): """Looks up words embeddings for id tensor. Args: input_ids: int32 Tensor of shape [batch_size, seq_length] containing word ids. vocab_size: int. Size of the embedding vocabulary. embedding_size: int. Width of the word embeddings. initializer_range: float. Embedding initialization range. word_embedding_name: string. Name of the embedding table. use_one_hot_embeddings: bool. If True, use one-hot method for word embeddings. If False, use `tf.gather()`. Returns: float Tensor of shape [batch_size, seq_length, embedding_size]. """ # This function assumes that the input is of shape [batch_size, seq_length, # num_inputs]. # # If the input is a 2D tensor of shape [batch_size, seq_length], we # reshape to [batch_size, seq_length, 1]. if input_ids.shape.ndims == 2: input_ids = tf.expand_dims(input_ids, axis=[-1]) embedding_table = tf.get_variable( name=word_embedding_name, shape=[vocab_size, embedding_size], initializer=create_initializer(initializer_range)) flat_input_ids = tf.reshape(input_ids, [-1]) if use_one_hot_embeddings: one_hot_input_ids = tf.one_hot(flat_input_ids, depth=vocab_size) output = tf.matmul(one_hot_input_ids, embedding_table) else: output = tf.gather(embedding_table, flat_input_ids) input_shape = get_shape_list(input_ids) output = tf.reshape(output, input_shape[0:-1] + [input_shape[-1] * embedding_size]) return (output, embedding_table) 从 embedding_table 取 input_ids 对应的 embedding 有两种方法: 矩阵乘法:先通过 input_ids 构造出 one_hot 矩阵,然后和 embedding_table 相乘得到结果。 tf.gather 根据 input_ids 取 embedding_table 对应行的结果。和 tf.nn.embedding_lookup 方法类似。具体原理可以参考 python - What does tf.nn.embedding_lookup function do? - Stack Overflow 看网上的解释,定义两种方法主要是不同设备(CPU、GPU、TPU)运算速度导致的。 embedding_postprocessor embedding_postprocessor 将 token embeddings segmentation embeddings position embeddings 三个向量相加得到最终的输入向量。 token embeddings 对应单词 embedding segmentation embeddings 代表单词来自哪个句子,在 Next Sentence Prediction 任务中使用。 position embeddings 位置 embedding。在「Attention is all your need」论文中,Google 生成 position embedding 的方法是一个花里胡哨 cos/sin 公式,这一次换成训练 position embedding。猜测在之前的论文中,输入的 seq len 可能长短不一,导致部分 position embedding 训练不充分。BERT 中强行定死 seq len。 最后直接将三个 embedding 相加,可能对新人来说也有点迷惑。我自己的理解是,物理中多个不同波长的波叠加,是可以通过方法区分的。所以三个 embedding 相加,模型也能学到差异。 知乎这个问题为什么 Bert 的三个 Embedding 可以进行相加可以提供更加严谨的理由。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394def embedding_postprocessor(input_tensor, use_token_type=False, token_type_ids=None, token_type_vocab_size=16, token_type_embedding_name="token_type_embeddings", use_position_embeddings=True, position_embedding_name="position_embeddings", initializer_range=0.02, max_position_embeddings=512, dropout_prob=0.1): """Performs various post-processing on a word embedding tensor. Args: input_tensor: float Tensor of shape [batch_size, seq_length, embedding_size]. use_token_type: bool. Whether to add embeddings for `token_type_ids`. token_type_ids: (optional) int32 Tensor of shape [batch_size, seq_length]. Must be specified if `use_token_type` is True. token_type_vocab_size: int. The vocabulary size of `token_type_ids`. token_type_embedding_name: string. The name of the embedding table variable for token type ids. use_position_embeddings: bool. Whether to add position embeddings for the position of each token in the sequence. position_embedding_name: string. The name of the embedding table variable for positional embeddings. initializer_range: float. Range of the weight initialization. max_position_embeddings: int. Maximum sequence length that might ever be used with this model. This can be longer than the sequence length of input_tensor, but cannot be shorter. dropout_prob: float. Dropout probability applied to the final output tensor. Returns: float tensor with same shape as `input_tensor`. Raises: ValueError: One of the tensor shapes or input values is invalid. """ input_shape = get_shape_list(input_tensor, expected_rank=3) batch_size = input_shape[0] seq_length = input_shape[1] width = input_shape[2] output = input_tensor # 是否使用有 segmentation embeddings if use_token_type: if token_type_ids is None: raise ValueError("`token_type_ids` must be specified if" "`use_token_type` is True.") token_type_table = tf.get_variable( name=token_type_embedding_name, shape=[token_type_vocab_size, width], initializer=create_initializer(initializer_range)) # segmentation vocab 大小一般是 2,所以使用 one-hot 速度比较快 flat_token_type_ids = tf.reshape(token_type_ids, [-1]) one_hot_ids = tf.one_hot(flat_token_type_ids, depth=token_type_vocab_size) token_type_embeddings = tf.matmul(one_hot_ids, token_type_table) token_type_embeddings = tf.reshape(token_type_embeddings, [batch_size, seq_length, width]) output += token_type_embeddings if use_position_embeddings: assert_op = tf.assert_less_equal(seq_length, max_position_embeddings) with tf.control_dependencies([assert_op]): full_position_embeddings = tf.get_variable( name=position_embedding_name, shape=[max_position_embeddings, width], initializer=create_initializer(initializer_range)) # Since the position embedding table is a learned variable, we create it # using a (long) sequence length `max_position_embeddings`. The actual # sequence length might be shorter than this, for faster training of # tasks that do not have long sequences. # # So `full_position_embeddings` is effectively an embedding table # for position [0, 1, 2, ..., max_position_embeddings-1], and the current # sequence has positions [0, 1, 2, ... seq_length-1], so we can just # perform a slice. # position embedding 可以通过学习得到,然后可能输入句子的长度没有到达 512。使用 tf.slice 取对应的向量速度比较快。大小是[seq_length, width] position_embeddings = tf.slice(full_position_embeddings, [0, 0], [seq_length, -1]) num_dims = len(output.shape.as_list()) # Only the last two dimensions are relevant (`seq_length` and `width`), so # we broadcast among the first dimensions, which is typically just # the batch size. # word embedding 的大小是 [batch_size, seq_length, width],上一步取出的 position embedding 大小是 [seq_length, width],需要对后面一个矩阵进行广播。 position_broadcast_shape = [] for _ in range(num_dims - 2): position_broadcast_shape.append(1) position_broadcast_shape.extend([seq_length, width]) # 大小为 [1, seq_length, width] position_embeddings = tf.reshape(position_embeddings, position_broadcast_shape) # 通过 broadcast 相加 output += position_embeddings output = layer_norm_and_dropout(output, dropout_prob) return output 三个 embedding 向量相加后,还会过一个 layer_norm_and_dropout 层,都是标准的,没有什么特殊。 123456789101112131415161718192021222324252627def dropout(input_tensor, dropout_prob): """Perform dropout. Args: input_tensor: float Tensor. dropout_prob: Python float. The probability of dropping out a value (NOT of *keeping* a dimension as in `tf.nn.dropout`). Returns: A version of `input_tensor` with dropout applied. """ if dropout_prob is None or dropout_prob == 0.0: return input_tensor output = tf.nn.dropout(input_tensor, 1.0 - dropout_prob) return outputdef layer_norm(input_tensor, name=None): """Run layer normalization on the last dimension of the tensor.""" return tf.contrib.layers.layer_norm( inputs=input_tensor, begin_norm_axis=-1, begin_params_axis=-1, scope=name)def layer_norm_and_dropout(input_tensor, dropout_prob, name=None): """Runs layer normalization followed by dropout.""" output_tensor = layer_norm(input_tensor, name) output_tensor = dropout(output_tensor, dropout_prob) return output_tensor create_attention_mask_from_input_mask create_attention_mask_from_input_mask 用来构造 attention 时的 mask 矩阵(padding 的单词不参与计算 attention socre)。输入向量 [batch_size, from_seq_length, ...] 和 [batch_size, to_seq_length] 输出向量 [batch_size, from_seq_length, to_seq_length]。 偷个例子来举: 12345678910111213from_tensor = tf.constant([[1,2,3,0,0], [1,3,5,6,1]]) # 中间的 0 代表 padding 的结果to_mask = tf.constant([[1,1,1,0,0], [1,1,1,1,1]]) # 和 from_tensor 对应。如果 1 代表对应位置有词,如果 0 代表对应位置是 padding 的。to_mask = tf.cast(tf.reshape(to_mask, [2, 1, 5]), tf.float32)# print(to_mask_2)broadcast_ones = tf.ones( shape=[2, 5, 1], dtype=tf.float32)mask = broadcast_ones * to_maskinit = tf.global_variables_initializer()with tf.Session() as sess: # print(sess.run(to_mask)) print(sess.run(mask)) 最后的结果是 1234567891011[[[1. 1. 1. 0. 0.] #第一个词可以和前三个词计算 attention [1. 1. 1. 0. 0.] [1. 1. 1. 0. 0.] [1. 1. 1. 0. 0.] [1. 1. 1. 0. 0.]] [[1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.] [1. 1. 1. 1. 1.]]] 12345678910111213141516171819202122232425262728293031def create_attention_mask_from_input_mask(from_tensor, to_mask): """Create 3D attention mask from a 2D tensor mask. Args: from_tensor: 2D or 3D Tensor of shape [batch_size, from_seq_length, ...]. to_mask: int32 Tensor of shape [batch_size, to_seq_length]. Returns: float Tensor of shape [batch_size, from_seq_length, to_seq_length]. """ from_shape = get_shape_list(from_tensor, expected_rank=[2, 3]) batch_size = from_shape[0] from_seq_length = from_shape[1] to_shape = get_shape_list(to_mask, expected_rank=2) to_seq_length = to_shape[1] to_mask = tf.cast( tf.reshape(to_mask, [batch_size, 1, to_seq_length]), tf.float32) # We don't assume that `from_tensor` is a mask (although it could be). We # don't actually care if we attend *from* padding tokens (only *to* padding) # tokens so we create a tensor of all ones. # # `broadcast_ones` = [batch_size, from_seq_length, 1] broadcast_ones = tf.ones( shape=[batch_size, from_seq_length, 1], dtype=tf.float32) # Here we broadcast along two dimensions to create the mask. # 广播得到最后的 mask 矩阵 [batch_size, from_seq_length, to_seq_length] mask = broadcast_ones * to_mask return mask transformer_model 顾名思议 BERT 最核心的 Multi-headed, multi-layer Transformer 实现过程。Attention is all you need 中的实现在 链接 一个 Transformer 的示意图: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144def transformer_model(input_tensor, attention_mask=None, hidden_size=768, num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072, intermediate_act_fn=gelu, hidden_dropout_prob=0.1, attention_probs_dropout_prob=0.1, initializer_range=0.02, do_return_all_layers=False): """Multi-headed, multi-layer Transformer from "Attention is All You Need". This is almost an exact implementation of the original Transformer encoder. See the original paper: https://arxiv.org/abs/1706.03762 Also see: https://github.com/tensorflow/tensor2tensor/blob/master/tensor2tensor/models/transformer.py Args: input_tensor: float Tensor of shape [batch_size, seq_length, hidden_size]. attention_mask: (optional) int32 Tensor of shape [batch_size, seq_length, seq_length], with 1 for positions that can be attended to and 0 in positions that should not be. 就是前面 create_attention_mask_from_input_mask 产出的结果 hidden_size: int. Hidden size of the Transformer. num_hidden_layers: int. Number of layers (blocks) in the Transformer. num_attention_heads: int. Number of attention heads in the Transformer. intermediate_size: int. The size of the "intermediate" (a.k.a., feed forward) layer. intermediate_act_fn: function. The non-linear activation function to apply to the output of the intermediate/feed-forward layer. hidden_dropout_prob: float. Dropout probability for the hidden layers. attention_probs_dropout_prob: float. Dropout probability of the attention probabilities. initializer_range: float. Range of the initializer (stddev of truncated normal). do_return_all_layers: Whether to also return all layers or just the final layer. Returns: float Tensor of shape [batch_size, seq_length, hidden_size], the final hidden layer of the Transformer. Raises: ValueError: A Tensor shape or parameter is invalid. """ # 最终输出的 hidden_size 能被 num_attention_heads 整除 if hidden_size % num_attention_heads != 0: raise ValueError( "The hidden size (%d) is not a multiple of the number of attention " "heads (%d)" % (hidden_size, num_attention_heads)) # 定义 attention 每个输出的头的大小 # 最后结果 concat 之后和原始输入大小相同。 attention_head_size = int(hidden_size / num_attention_heads) input_shape = get_shape_list(input_tensor, expected_rank=3) batch_size = input_shape[0] seq_length = input_shape[1] input_width = input_shape[2] # The Transformer performs sum residuals on all layers so the input needs # to be the same as the hidden size. # Transformer 中有残差连接,所以输入和输出 embedding size 要相同 if input_width != hidden_size: raise ValueError("The width of the input tensor (%d) != hidden size (%d)" % (input_width, hidden_size)) # We keep the representation as a 2D tensor to avoid re-shaping it back and # forth from a 3D tensor to a 2D tensor. Re-shapes are normally free on # the GPU/CPU but may not be free on the TPU, so we want to minimize them to # help the optimizer. # TPU 不擅长 reshape 操作,所以把所有的 3D tensor 变成 2D tensor prev_output = reshape_to_matrix(input_tensor) all_layer_outputs = [] # 遍历多层 for layer_idx in range(num_hidden_layers): with tf.variable_scope("layer_%d" % layer_idx): layer_input = prev_output with tf.variable_scope("attention"): attention_heads = [] with tf.variable_scope("self"): attention_head = attention_layer( from_tensor=layer_input, to_tensor=layer_input, attention_mask=attention_mask, num_attention_heads=num_attention_heads, size_per_head=attention_head_size, attention_probs_dropout_prob=attention_probs_dropout_prob, initializer_range=initializer_range, do_return_2d_tensor=True, batch_size=batch_size, from_seq_length=seq_length, to_seq_length=seq_length) attention_heads.append(attention_head) attention_output = None if len(attention_heads) == 1: attention_output = attention_heads[0] else: # In the case where we have other sequences, we just concatenate # them to the self-attention head before the projection. # concat 多头的结果 attention_output = tf.concat(attention_heads, axis=-1) # Run a linear projection of `hidden_size` then add a residual # with `layer_input`. 加上残差 with tf.variable_scope("output"): attention_output = tf.layers.dense( attention_output, hidden_size, kernel_initializer=create_initializer(initializer_range)) # dropout 和 layer_norm attention_output = dropout(attention_output, hidden_dropout_prob) attention_output = layer_norm(attention_output + layer_input) # 全连接层 # The activation is only applied to the "intermediate" hidden layer. with tf.variable_scope("intermediate"): intermediate_output = tf.layers.dense( attention_output, intermediate_size, activation=intermediate_act_fn, kernel_initializer=create_initializer(initializer_range)) # 变回原来的大小,才能加上残差 # Down-project back to `hidden_size` then add the residual. with tf.variable_scope("output"): layer_output = tf.layers.dense( intermediate_output, hidden_size, kernel_initializer=create_initializer(initializer_range)) layer_output = dropout(layer_output, hidden_dropout_prob) layer_output = layer_norm(layer_output + attention_output) prev_output = layer_output all_layer_outputs.append(layer_output) # 是不是要输出中间结果 if do_return_all_layers: final_outputs = [] for layer_output in all_layer_outputs: final_output = reshape_from_matrix(layer_output, input_shape) final_outputs.append(final_output) return final_outputs else: final_output = reshape_from_matrix(prev_output, input_shape) return final_output attention_layer attention_layer 中实现 self-attention 和 multi-head,细节在 「Attention is all your need」里面有。query_layer 由 from_tensor 得到,key_layer 和 value_layer 由 to_tensor 得到。由于是 self-attention-encoder,from_tensor 和 to_tensor 相同。 示意图: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190def attention_layer(from_tensor, to_tensor, attention_mask=None, num_attention_heads=1, size_per_head=512, query_act=None, key_act=None, value_act=None, attention_probs_dropout_prob=0.0, initializer_range=0.02, do_return_2d_tensor=False, batch_size=None, from_seq_length=None, to_seq_length=None): """Performs multi-headed attention from `from_tensor` to `to_tensor`. This is an implementation of multi-headed attention based on "Attention is all you Need". If `from_tensor` and `to_tensor` are the same, then this is self-attention. Each timestep in `from_tensor` attends to the corresponding sequence in `to_tensor`, and returns a fixed-with vector. This function first projects `from_tensor` into a "query" tensor and `to_tensor` into "key" and "value" tensors. These are (effectively) a list of tensors of length `num_attention_heads`, where each tensor is of shape [batch_size, seq_length, size_per_head]. Then, the query and key tensors are dot-producted and scaled. These are softmaxed to obtain attention probabilities. The value tensors are then interpolated by these probabilities, then concatenated back to a single tensor and returned. In practice, the multi-headed attention are done with transposes and reshapes rather than actual separate tensors. Args: from_tensor: float Tensor of shape [batch_size, from_seq_length, from_width]. to_tensor: float Tensor of shape [batch_size, to_seq_length, to_width]. attention_mask: (optional) int32 Tensor of shape [batch_size, from_seq_length, to_seq_length]. The values should be 1 or 0. The attention scores will effectively be set to -infinity for any positions in the mask that are 0, and will be unchanged for positions that are 1. num_attention_heads: int. Number of attention heads. size_per_head: int. Size of each attention head. query_act: (optional) Activation function for the query transform. key_act: (optional) Activation function for the key transform. value_act: (optional) Activation function for the value transform. attention_probs_dropout_prob: (optional) float. Dropout probability of the attention probabilities. initializer_range: float. Range of the weight initializer. do_return_2d_tensor: bool. If True, the output will be of shape [batch_size * from_seq_length, num_attention_heads * size_per_head]. If False, the output will be of shape [batch_size, from_seq_length, num_attention_heads * size_per_head]. batch_size: (Optional) int. If the input is 2D, this might be the batch size of the 3D version of the `from_tensor` and `to_tensor`. from_seq_length: (Optional) If the input is 2D, this might be the seq length of the 3D version of the `from_tensor`. to_seq_length: (Optional) If the input is 2D, this might be the seq length of the 3D version of the `to_tensor`. Returns: float Tensor of shape [batch_size, from_seq_length, num_attention_heads * size_per_head]. (If `do_return_2d_tensor` is true, this will be of shape [batch_size * from_seq_length, num_attention_heads * size_per_head]). Raises: ValueError: Any of the arguments or tensor shapes are invalid. """ def transpose_for_scores(input_tensor, batch_size, num_attention_heads, seq_length, width): output_tensor = tf.reshape( input_tensor, [batch_size, seq_length, num_attention_heads, width]) output_tensor = tf.transpose(output_tensor, [0, 2, 1, 3]) #[batch_size, num_attention_heads, seq_length, width] return output_tensor from_shape = get_shape_list(from_tensor, expected_rank=[2, 3]) to_shape = get_shape_list(to_tensor, expected_rank=[2, 3]) if len(from_shape) != len(to_shape): raise ValueError( "The rank of `from_tensor` must match the rank of `to_tensor`.") if len(from_shape) == 3: batch_size = from_shape[0] from_seq_length = from_shape[1] to_seq_length = to_shape[1] elif len(from_shape) == 2: if (batch_size is None or from_seq_length is None or to_seq_length is None): raise ValueError( "When passing in rank 2 tensors to attention_layer, the values " "for `batch_size`, `from_seq_length`, and `to_seq_length` " "must all be specified.") # Scalar dimensions referenced here: # B = batch size (number of sequences) # F = `from_tensor` sequence length 输入单词长度 # T = `to_tensor` sequence length 输出单词长度 # N = `num_attention_heads` # H = `size_per_head` from_tensor_2d = reshape_to_matrix(from_tensor) # [B*F,hidden_size=N*H] to_tensor_2d = reshape_to_matrix(to_tensor) # [B*T,head_size=N*H] # `query_layer` = [B*F, N*H] 从 from_tensor 得到 query_layer query_layer = tf.layers.dense( from_tensor_2d, num_attention_heads * size_per_head, activation=query_act, name="query", kernel_initializer=create_initializer(initializer_range)) # `key_layer` = [B*T, N*H] key_layer = tf.layers.dense( to_tensor_2d, num_attention_heads * size_per_head, activation=key_act, name="key", kernel_initializer=create_initializer(initializer_range)) # `value_layer` = [B*T, N*H] value_layer = tf.layers.dense( to_tensor_2d, num_attention_heads * size_per_head, activation=value_act, name="value", kernel_initializer=create_initializer(initializer_range)) # 计算多头调整 tensor shape,都是为了方便计算.变成 [batch_size, num_attention_heads, seq_length, width] # `query_layer` = [B, N, F, H] query_layer = transpose_for_scores(query_layer, batch_size, num_attention_heads, from_seq_length, size_per_head) # `key_layer` = [B, N, T, H] key_layer = transpose_for_scores(key_layer, batch_size, num_attention_heads, to_seq_length, size_per_head) # Take the dot product between "query" and "key" to get the raw # attention scores. # `attention_scores` = [B, N, F, T] => [F, H] * [H, T] = [F, T] attention_scores = tf.matmul(query_layer, key_layer, transpose_b=True) attention_scores = tf.multiply(attention_scores, 1.0 / math.sqrt(float(size_per_head))) # 经典缩小 scroe 值,防止落到 softmask 梯度饱和区 # 处理 padding 部分的 score 值, padding 为 0 的在对应的位置上加上 -10000.0, 这样求 exp 之后就是一个接近于 0 的值 if attention_mask is not None: # `attention_mask` = [B, 1, F, T] attention_mask = tf.expand_dims(attention_mask, axis=[1]) # Since attention_mask is 1.0 for positions we want to attend and 0.0 for # masked positions, this operation will create a tensor which is 0.0 for # positions we want to attend and -10000.0 for masked positions. adder = (1.0 - tf.cast(attention_mask, tf.float32)) * -10000.0 # Since we are adding it to the raw scores before the softmax, this is # effectively the same as removing these entirely. attention_scores += adder # Normalize the attention scores to probabilities. # `attention_probs` = [B, N, F, T] attention_probs = tf.nn.softmax(attention_scores) # This is actually dropping out entire tokens to attend to, which might # seem a bit unusual, but is taken from the original Transformer paper. attention_probs = dropout(attention_probs, attention_probs_dropout_prob) # `value_layer` = [B, T, N, H] value_layer = tf.reshape( value_layer, [batch_size, to_seq_length, num_attention_heads, size_per_head]) # `value_layer` = [B, N, T, H] value_layer = tf.transpose(value_layer, [0, 2, 1, 3]) # attention 之后的结果 # `context_layer` = [B, N, F, H] context_layer = tf.matmul(attention_probs, value_layer) # `context_layer` = [B, F, N, H] context_layer = tf.transpose(context_layer, [0, 2, 1, 3]) if do_return_2d_tensor: # `context_layer` = [B*F, N*H] context_layer = tf.reshape( context_layer, [batch_size * from_seq_length, num_attention_heads * size_per_head]) else: # `context_layer` = [B, F, N*H] context_layer = tf.reshape( context_layer, [batch_size, from_seq_length, num_attention_heads * size_per_head]) return context_layer BertModel 构造类 init 方法就是将上面的内容串联起来。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101def __init__(self, config, is_training, input_ids, input_mask=None, token_type_ids=None, use_one_hot_embeddings=False, scope=None): """Constructor for BertModel. Args: config: `BertConfig` instance. is_training: bool. true for training model, false for eval model. Controls whether dropout will be applied. input_ids: int32 Tensor of shape [batch_size, seq_length]. input_mask: (optional) int32 Tensor of shape [batch_size, seq_length]. token_type_ids: (optional) int32 Tensor of shape [batch_size, seq_length]. use_one_hot_embeddings: (optional) bool. Whether to use one-hot word embeddings or tf.embedding_lookup() for the word embeddings. scope: (optional) variable scope. Defaults to "bert". Raises: ValueError: The config is invalid or one of the input tensor shapes is invalid. """ config = copy.deepcopy(config) if not is_training: config.hidden_dropout_prob = 0.0 config.attention_probs_dropout_prob = 0.0 input_shape = get_shape_list(input_ids, expected_rank=2) batch_size = input_shape[0] seq_length = input_shape[1] if input_mask is None: input_mask = tf.ones(shape=[batch_size, seq_length], dtype=tf.int32) # 处理 embedding if token_type_ids is None: token_type_ids = tf.zeros(shape=[batch_size, seq_length], dtype=tf.int32) with tf.variable_scope(scope, default_name="bert"): with tf.variable_scope("embeddings"): # Perform embedding lookup on the word ids. (self.embedding_output, self.embedding_table) = embedding_lookup( input_ids=input_ids, vocab_size=config.vocab_size, embedding_size=config.hidden_size, initializer_range=config.initializer_range, word_embedding_name="word_embeddings", use_one_hot_embeddings=use_one_hot_embeddings) # Add positional embeddings and token type embeddings, then layer # normalize and perform dropout. self.embedding_output = embedding_postprocessor( input_tensor=self.embedding_output, use_token_type=True, token_type_ids=token_type_ids, token_type_vocab_size=config.type_vocab_size, token_type_embedding_name="token_type_embeddings", use_position_embeddings=True, position_embedding_name="position_embeddings", initializer_range=config.initializer_range, max_position_embeddings=config.max_position_embeddings, dropout_prob=config.hidden_dropout_prob) with tf.variable_scope("encoder"): # This converts a 2D mask of shape [batch_size, seq_length] to a 3D # mask of shape [batch_size, seq_length, seq_length] which is used # for the attention scores. 获得 attention_mask attention_mask = create_attention_mask_from_input_mask( input_ids, input_mask) # Run the stacked transformer. 计算 transformer 的结果 # `sequence_output` shape = [batch_size, seq_length, hidden_size]. self.all_encoder_layers = transformer_model( input_tensor=self.embedding_output, attention_mask=attention_mask, hidden_size=config.hidden_size, num_hidden_layers=config.num_hidden_layers, num_attention_heads=config.num_attention_heads, intermediate_size=config.intermediate_size, intermediate_act_fn=get_activation(config.hidden_act), hidden_dropout_prob=config.hidden_dropout_prob, attention_probs_dropout_prob=config.attention_probs_dropout_prob, initializer_range=config.initializer_range, do_return_all_layers=True) self.sequence_output = self.all_encoder_layers[-1] # The "pooler" converts the encoded sequence tensor of shape # [batch_size, seq_length, hidden_size] to a tensor of shape # [batch_size, hidden_size]. This is necessary for segment-level # (or segment-pair-level) classification tasks where we need a fixed # dimensional representation of the segment. # 分类任务取第一个 [CLS] 对应的 embedding 值 with tf.variable_scope("pooler"): # We "pool" the model by simply taking the hidden state corresponding # to the first token. We assume that this has been pre-trained first_token_tensor = tf.squeeze(self.sequence_output[:, 0:1, :], axis=1) self.pooled_output = tf.layers.dense( first_token_tensor, config.hidden_size, activation=tf.tanh, kernel_initializer=create_initializer(config.initializer_range)) 模型使用 123456789101112131415# Already been converted into WordPiece token idsinput_ids = tf.constant([[31, 51, 99], [15, 5, 0]])input_mask = tf.constant([[1, 1, 1], [1, 1, 0]])token_type_ids = tf.constant([[0, 0, 1], [0, 2, 0]])config = modeling.BertConfig(vocab_size=32000, hidden_size=512, num_hidden_layers=8, num_attention_heads=6, intermediate_size=1024)# 调用模型model = modeling.BertModel(config=config, is_training=True, input_ids=input_ids, input_mask=input_mask, token_type_ids=token_type_ids)label_embeddings = tf.get_variable(...)pooled_output = model.get_pooled_output()logits = tf.matmul(pooled_output, label_embeddings)... Bert 参数量计算 回到写这篇文章的起点,最后通过计算 BERTBASEBERT_{BASE}BERTBASE 的参数量,加深对模型的理解。论文介绍 Layer = 12,Hidden Size = 768,multi head = 12,参数量是 110M 左右。 总的计算公式为 (30522 + 512 + 2)*768 + 768*2 + (3*768*64*12 + 3*64*12 + 64*768*12 + 768 + 768 + 768 + 768*3072 + 3072 + 3072*768 + 768 + 768 + 768) * 12 = 108891648 embedding 部分 (30522 + 512 + 2)*768 + 768*2 embedding size = 768 单词数仅有 30522,比起 CTR 几千万的物品还是少很多。 position size = 512 sentence size = 2 三个 embedding 相加后 Norm 的参数 2 multi attention 部分 (3*768*64*12 + 3*64*12 + 64*768*12 + 768 + 768 + 768 + 768*3072 + 3072 + 3072*768 + 768 + 768 + 768) * 12 一共是 12 层,对应 12 个 Transformer 3*768*64*12 + 3*64*12 12 个 multi-head 对应的 Q K V 参数 64*768*12 + 768 + 768 + 768 multi-head 结果 concat 之后接的全连接层参数以及后面的 norm 768*3072 + 3072 + 3072*768 + 768 + 768 + 768 FFN 以及 norm 的参数 Ref BERT代码阅读 - 李理的博客 BERT encoder参数量计算 | 417’s blog BERT源码分析PART I - 知乎","link":"/post/all-about-bert-code.html"},{"title":"【时间序列预测】Are Transformers Effective for Time Series Forecasting?","text":"香港中文大学曾爱玲文章,在长时间序列预测问题上使用线性模型打败基于 Transformer 的模型,并对已有模型的能力进行实验分析(灵魂7问,强烈推荐好好读一下!)。 核心贡献 质疑基于 Transformer 的序列预测模型在长时间序列预测任务(LTSF,long-term time series forecasting) 的有效性 大部分模型无法从长序列中抽取时序信息(实验中预测误差并没有随着历史窗口增大而减少) 大部分模型相对于 baseline(rnn类)的提升是将预测方法从 IMS 替换成 DMS 得到的。 提出只有 one-layer linear model: LTSF-Linear,通过 DMS 方式预测效果超过之前模型。 对已有模型的能力进行实验分析(建模长输入的能力、对时间顺序的敏感性、位置编码、子序列 embdding 影响、模型性能) 核心问题 时间序列预测问题主要形式是:已知前 t 时间的特征,然后预测未来一段时间的结果。如果需要预测的时间很长,被称之为长时间序列预测。 IMS iterated multi-step (IMS) forecasting,每次预测一个结果,迭代多次得到对未来一段时间的预测结果(自回归)。结果方差比较小,但是预测过程中误差会累积。 DMS direct multistep (DMS) forecasting,一步得到对于未来一段时间的预测结果。常在需要预测未来时间很长或者很难训练无偏单步预测模型时使用。 Transformer 前提假设是成对元素之间有语义相关性,self-attention 机制本质是元素置换不变,建模时序关系能力很大程度上取决于与输入标记相关联的位置编码。 时序数据基本上没有点对点的语义相关性,需要模型能提取连续点之间的时序关系。Time Series Transformer 通过位置编码以及序列编码提供部分顺序信息,但是由于置换不变自注意力机制的存在必然存在时序信息丢失问题。 相关工作 Time Series Transformer 框架 Time series decomposition 对输入序列进行分解,后续更好预测。 Autoformer 在 seasonal-trend decomposition 中通过 moving average 建模 trend 趋势项。 FEDformer 通过 MoE 策略将移动平均提取的趋势和各种大小核进行混合。 对输入特征的 emebdding 策略: 原始时间序列的顺序 local positional information 全局时间信息,比如hierarchical timestamps (week, month, year) 和 agnostic timestamps(holidays and events) injecting several embeddings, like a fixed positional encoding, a channel projection embedding, and learnable temporal embeddings into the input sequence. temporal embeddings with a temporal convolution layer or learnable timestamps are introduced self-attention schemes 让 attention 矩阵计算尽可能稀疏 Decoders 改进原始 Transformer 的自回归模式。 解决方案 LTSF-Linear 通过一层神经网对过去信息加权得到未来预测结果。 不同变量间共享参数并且不对 spatial correlations 建模 DLinear D 对应 Decomposition scheme,将输入数据分解成 trend 和 remaninder 两部分 trend 通过移动平均核得到 remaninder 是输入数据减去 trend 结果得到 在数据集有明显趋势性的时候该方法能提升预测效果 NLinear 部分数据集的训练数据和测试数据存在分布偏移(下图中 b),无法使用训练集的均值和方差进行归一化。NLinear 将输入序列每一个值减去该序列最后一个值,然后输入序列过完线性层后加回被减去的值得到最后预测结果。 实验结论 Repeat* 指用输入序列最后一个特征做为未来一段时间的预测,模型如果效果比这个查,说明模型错误预测了趋势…… NLiner 和 DLinear 的结果比 Linear 好,说明处理分布偏移和分解趋势-周期特征的重要性。 FEDformer 相比其他 Transformer 方法好,是因为它采用经典的时间序列分析技术,不太依赖自注意力机制。 定性分析 过去 96 预测未来 336 时,下图 a 和 c,部分 Tranformer 模型根本无法预测未来数据的取值范围和偏差。 在非周期数据(图b,汇率)Tranformer 模型几乎无法预测适当的趋势。 Transformer 类模型进一步分析(灵魂七问) 能否从长序列中提取时序信息? 历史窗口(look-back window) 越长(输入信息越多),预测效果应该越好。 下图 x 轴对应不同历史窗口长度,可以看到随着输入信息变多,LTSF-Linear 方法预测结果越来越准,但是大部分 Transformer 模型 mse 并没有太多变化,作者猜测可能模型过拟合噪音而不能获得时序信息。 能从长序列预测可以学到什么? 历史窗口中的动态时间会显著影响短期预测的精度,而长期预测仅依赖模型是否很好捕捉趋势和周期性。即预测时间跨度越长,历史窗口本身影响越小。 预测未来 720 步,下面两种取历史窗口方法: Close 前 96 步输入 Far 前 192 步到 前 97 步输入 fedformer 和 autoformer 在两种方法下预测效果几乎相同,说明模型只能从相邻时间序列中捕获到类似的时序信息。 self-attention scheme 是否有效? 对 Informer 结构进行消融实验,下表从左到右网络结构越来越简单,然后效果基本上逐步提升。看起来注意力机制和其他复杂模块在 LTSF 上没有正向效果。 Att.-Linear 用 linear layer 替换 self-attention layer Embed+Linear 再去除其他模块 模型可以保留时序信息吗? self-attention 本质上不考虑空间关系(无视元素的位置信息) permutation-invariant,通过 positional and temporal embedding 模型还是丢失时间信息。 三种数据处理方式 Shuf 输入数据顺序全部打乱 Half-ex 输入数据分成前后两部分,交换这两部分的顺序。 两个实验表明 Transformers 不能很好保留时序信息 在 Exchange 汇率数据集,三个 Tranformer 模型在这三种数据处理方式下,预测结果的 mse 基本上都都接近,可能仅保留有限的时间关系,但是最终过拟合了。Linear 模型自然建模顺序并且使用更少的参数避免过度拟合。 在 ETH1 数据集,FEDformer 建模时考虑时间序列偏差,提出了数据中明显的时间信息,所以在 shuf 组 mse 下降非常快。Informer 根本没有建模这方面信息。 不同 embedding 策略的作用? 依次删除模型中的 Position embedding、global time stamp embedding 和同时删除这两个 temebdding。 Informer的预测误差在没有位置嵌入(wo/Pos.)的情况下大幅增加。在没有时间戳嵌入(wo/Temp.)的情况下,随着预测长度的增加,Informer的性能将逐渐受损。 论文中给的原因没有看懂:Informer uses a single time step for each token, it is necessary to introduce temporal information in tokens. Autoformer 和 FEDformer 通过一系列时间戳去编码时间信息,所以删除 pos 后效果可能变得更好。 Autoformer 去除时间 embedding 后效果明显变差。 FEDformer 通过 frequency-enhanced module 使模型有 temporal inductive bias,删除 pos 和 temp 影响不是很大。 训练数据大小是现在模型的限制因素? 问题:是不是训练数据量太少导致 Transformer 类模型表现差? 在交通数据上用 Ori 17544*0.7 hour 数据和 Short 365*24=8760 hour 数据对比: 基本上是训练数据小的时候,预测误差小。证明训练数据不是限制 Transformer 类模型表现的原因。 导致这种现象的原因可能是 short 对应全年数据,有更清晰的时间特征趋势。 性能真的是长时间预测任务中优先级最高的事情吗? 两个问题:Transformer 模型的推理时间和内存消耗是否增加?现在的 GPU 显存能否满足任务和模型需求。 下图可以看到大部分 Transformer 模型参数量和原始 Tranformer 没有太大区别,但是推理时间可能超过原来…… 另外在通过 96 步预测 720 步任务上,原始 Tranformer 的参数 GPU 也放得下…… 可解释性 附录中简单写了一些,由于模型是线性模型,不同输入位置的权重可以直接用来解释模型如何生效以及反应特点。 金融数据可以观察到越靠近未来时刻的特征权重越大,代表它们对预测值的贡献更大。 交通数据能观察到明显的周期性。 读后总结 灵魂七问提供了很好设计对比实验的思路 读论文需要更加仔细思考,之前根本没有想过 informer 这种点注意力其实在时间序列预测上的有效性。 transformer 在时序预测的应用还是值得进一步思考! Ref Are Transformers Effective for Time Series Forecasting? - 知乎 (zhihu.com) Transformer对时序预测真的有效吗? | AAAI’23 Oral_哔哩哔哩_bilibili Transformer用于时间序列预测任务真的有效吗? - 知乎 (zhihu.com) Are Transformers Effective for Time Series Forecasting?-论文阅读讨论-ReadPaper CTR率预测One Epoch现象 / LTSF场景质疑Transformer - 知乎 (zhihu.com) DLinear:Are Transformers Effective for Time Series Forecasting? - 知乎 (zhihu.com)","link":"/post/are-transformers-effective-for-time-series-forecasting.html"},{"title":"我常用的自动化流程","text":"什么是自动化 日常工作学习中,我们需要使用不同的工具来应对各种各样的任务。比如,用印象笔记收集网页,利用图库管理博客中的图片。但是,由于大部分工具不是同一家公司发布的,彼此之间很难进行简单的协作。如果你有编程能力,可以利用很多工具提供的 API(应用程序接口),让信息在不同的软件中流动。 对于普通人而言,目前市面上也有很多 App 提供这种功能,可以解决少部分的问题。我对这些功能的定义就是自动化流程,通过使用这些功能,可以减少一些重复机械的工作,使我们更好的享受生活。老罗在吹锤子系统时,提到过「One Step」,在我心目中也是自动化的一种。自动化流程指的是我自己在实践中,配置的一些软件使用流程。 Workflow Workflow (新手入门请看iOS 效率神器 Workflow 怎么用?跟着这篇入门指南从零开始 | 新手问号)是 iOS 上的一款自动化软件。似乎是去年被苹果收购,现在在 App Store 中可以免费下载。前一段时间的 WWDC 上,也公布了进行版本,能利用 Siri 的「捷径」App。 在 iPhone 上,我最常用的 workflow 动作是碎片知识摘记,实现利用 iPhone 阅读时,将值得多次阅读的内容,集中保存到印象笔记中。有关这个动作更多的介绍可以查看 Workflow + 印象笔记,定制高效碎片知识管理工作流 | Matrix 精选 - 少数派。 《奇特的一生》在时间管理领域如雷贯耳,很多人都按照柳比歇夫的那种方法进行时间。如果你希望可以使用 Workflow 来记录时间,可以进一步阅读少数派中 想学柳比歇夫?用这个Workflow来帮你一把。 最后,授人以鱼不如授人以渔,少数派的 Workflow Gallery 提供很多相关的工作下载,可以自行前往挑选。 Aflred Aflred 是 Mac 上的一款效率工具。之前我在自己的博客中也有分享过,Alfred 使用记录 - RyenX。这里,我就补充介绍几个自己目前在用的功能。 由于我平时是使用 Markdown 进行写作的,难免会遇到需要插入很多链接的时候,比如现在正在写的这一篇文章。Afled 中有一个 workflows 「fallroot/copy-url-for-alfred」,通过这个动作可以将 Chrome 或者 Safari 中的当前正在浏览的网页的标题以及网址以 Anchor 、URL、Title、Markdown 等多种形式复制到当前的输入框或者是剪贴板。 ngreenstein/alfred-process-killer: An Alfred 2 workflow that makes it easy to kill misbehaving processes. It is, in essence, a way to easily find processes by name and kill them using kill -9.:快速结束 Mac 中的某些进程。 IFTTT Workflow 和 Aflred 需要在自己的 iPhone 或者 Mac 上才可以运行,说起来多少还有些不自动。我经常使用的另外一个自动化服务「IFTTT」就可以解决这个问题。IFTTT 是什么?它是英文 IF This Then That 的首字母缩写,它是一个提供自动化服务的网站。它的功能可以从字面猜测出来大概,完整地解释是「如果A完成事件1,那么就让B完成事件2」。简单来说,你可以通过设置一些规则,让它帮你自动完成一些重复工作。比如设置规则实现当你发布一条微博后,IFTTT 自动将微博同步到印象笔记中。所以,IFTTT 对我的意义是将不同的应用连接在了一下,方便我造各种工作流。 与上面的形式相同,继续介绍一下我目前在使用的规则。 碎片阅读 互联网的发展,使每个人有更多表达自己的机会,越来越多的人开始通过文字展示自己。碎片阅读指的正是阅读这些散落在不同平台上的文章。对于我而言,一般是先将在网上看到的想要阅读的文章放到稍后读软件 Pocket 中。之后在自己空闲时,打开 Pocket 网站阅读。比起直接阅读这样的好处有二: 不是每一个网站或者平台都有良好的阅读环境,比如很多广告、字体字号。 Pocket 提供丰富的 API 接口,通过 IFTTT 可以很好的和 Evernote、Airtable 等软件写作。 If New favorite item, then Append to a note in Evernote - IFTTT:古语「不动笔墨不读书」,很多文章有值得记录地方,而且也希望可以将自己所做的笔记集中在一处。针对这个问题,很多人会复杂,并且再粘贴到某一个文档中。这种方法做起来简单粗暴,却打断了阅读的连续性。通过我这个动作,可以将在 Pocket 中高亮的句子,直接添加到印象笔记的一条特定笔记中。 If item archived , then create record in airtable:这一个动作是实现阅读数据的统计,当我在 Pocket 中归档一篇文章之后,会在 Airatble 指定的表单里添加一条相关的阅读记录。 任务管理 Github issues assigned to me Todoist:这个规则可以实现,在 Github 中有人分配给我 issue 时,自动在 Todoist 中创建相关任务。 Log completed Todoist Tasks to Airtable:记录所有完成的任务到 Airtable 中。 If Todoist task with label is completed, create new task - IFTTT:实现 Todoist 中的任务循环。 创意 IFTTT 中有一个与 RSS 相关的触发器,而且如下图所示,提供了对文章进行关键字匹配的选项。 前一阵子是 618 年中大促,正好我想购买一个 QC35 的耳机。为了追求优惠,大部分人会不停的查看想购买商品的页面,看看有没有什么新的变化。而我利用 IFTTT 搞了一个监控 QC35 全网优惠的监控。具体思路如下:什么值得买中有一个精选好价的频道,很多人会在上面爆料商品的优惠信息。幸运的是,这个频道提供 RSS 订阅链接。所以,配合上面提到的 RSS 相关触发器,我写了 If new feed item matches ‘qc35’ from http://faxian.smzdm.com/feed, then send me an email at xiang578@foxmail.com - IFTTT 以及 If new feed item matches ‘QC35’ from http://feed.smzdm.com, then send me an email at xiang578@foxmail.com - IFTTT 两个规则。从而实现,有人爆料 QC35 相关的价格优惠时,我会收到一条由 IFTTT 发送的邮件。 Reference 玩转 IFTTT,互联网自动化也可以很简单 - 少数派 Changelog 20180707:完成初稿","link":"/post/auto-workflow.html"},{"title":"钱塘江的风","text":"几年前读到过,前方纵然山花烂漫,诺是跃不过眼前窄窄的独木桥,就无法扑向那芬芳绽放的原野,眺望美景只能深深叹息。现在,已经过了。 高考前,路是黑的,只有前方亮着一盏灯,于是你只能坚定的朝那个方向走,而高考后,周围忽然亮了,很多条路在你面前,你反而不知道该往哪儿走了。我想起了罗伯特弗罗斯特的《未选择的路the road not taken》,以前是感叹选择的艰难,现在是体验艰难的选择。也只能和他一样选择了其中的一条路,余下的去回忆,或者遗憾。大概你选什么都会后悔的。就像关于高考完去旅行好还是买 iPhone好的回答,如果你去旅行,上了大学你会后悔没有买iphone。如果你买了iphone,大学毕业后你会后悔没有去旅行。 三个月来,多次翻看一位知友的话,高考最迷人的地方在于其阴差阳错,多一分少一分都有可能让你生活在完全不同的环境,认识完全不同的人,难道想一想这没有让你觉得激动和庆幸吗?无论上哪一所大学,都会让你失望,每一个新生都会骂他的学校。这是因为理想和现实永远存在差距。 听到要去学校的名字,钱塘江女子体育专修学校。大概就可以知道其特点,体育方面要求轻松超过清华(大一男子12分钟跑满分要求3000米,清华3000米满分要求12分钟20秒),清华称一流,我们就是超一流;女子就不用解释……再加上专业,总有一种NIKE还造钢笔的感觉。暑假中多次通过专业的工具考察学校地理位置,更是欣喜地发现这是一个适合读书的地方。当然要体验更丰富的大学生活还是要去综合性大学,一说起本校历史社团是归数学与统计学院,就可以知道大概了吧,或者我见识浅薄,他们是用全新的角度去诠释历史。总体上来讲,背靠下沙区,眺望萧山区,还可以称是杭州。按某位学长所讲,在学校边缘还会收到XX移动欢迎您的提示。旁边还有条江,就是题目中风的来源。更庆幸的是以后我从寝室出来,进入杭城另一所大学比去本校方便。这是不是一份花费,两份体验。 关于大学,现在无法去说它,也无必要。有学校在其新生手册中告诫学生,大部分学校本科教育不是濒临崩溃就是已经崩溃。也有复旦英语老师看到那么多大学开设英语专业时说,复旦这些学校可以凭名声再多挣扎一会儿,大部分学校却没有太大意义。大概就是这样了。某些学校还是不要叫大学为好,毁人不倦,希望我是错的。上大学,多半还是因为这条路通关人生的几率更大,直白点再混几年,什么促进人类文明进步,探索未知领域就太远、太广、太泛。初去时的欣喜可以持续多久,是开了又开?当你身临其中,也没有勇气再去赞同原深圳大学校长章必功关于某些东西的评论。毕竟人家是名校,你的是校名。征途,还会是星辰大海吗? 生活,没有已知条件。在这之前,又有多少人可以猜对归宿?多少人在仓促中选择,面对结果却只能接受。正是有些东西科学无法解释,世界才更有趣。或者仅仅是失败的安慰,不作就不会死。这个十几天内,我们中间有的去了北京,有的去了南京,或是留在了杭州的某一个遥远的角落,你又会在哪里入眠?有些要一年,有些要四年,有些要余生。某些冒险,唯一的作用就是让你明白自己是可以掌握自己的命运的,哪怕只是一点点。 不知道校园内可不可以吹到钱塘江的风,吹到了又是什么感觉?也不知道这是什么样的选择? 不管愿不愿意,新的生活已经开始了。谁知道又会发生什么? 谢谢你,看到这一行。 很高兴认识你,或许再也不见了。 2014年8月29日夜,于临海 PS:前几天独立、客观、第三方的在学校贴吧发的贴子都被删……","link":"/post/before-go-to-univisity.html"},{"title":"Best of iPhone 2019 软件清单","text":"一直想做一个推荐软件的系列文章,不过完成 2017 年的iPhone软件清单 后就没有动力……很多时候在思考,自己为什么一定要使用 iPhone?iOS 中的软件正是最好的答案,让每一个人享受科技带来的快乐。 这一篇文章和 2017 年的形式一样,删除常用的软件,推荐一些我认为有趣的软件。自从 iOS 12 中引入屏幕时间,今年的推荐顺序就按照屏幕时间中的排序。 目前使用设备:iPhone XR & Apple Watch Series 4 Inoreader:RSS 订阅服务商以及 RSS 阅读器。随着这两年对推荐算法相关的新闻阅读器批判,RSS 大有一股复新之势。可惜的是在去年年底左右,inoreader 中每个免费帐号只能关注 150 个订阅源。目前,我通过使用多个帐号来临时解决。 脉脉:职场社交软件。有匿名区以及公司圈,定期查看公司内部的吐槽和爆料。用 Leader 的话来说,整天操 M6 的心。 Keep/Nike Running/健身记录:锻炼相关 App 集合。Keep 和 Apple Watch 的配合太差,很多数据不能同步。自带的健身记录展示数据不够详细。Nike Running 不太用。 Overcast:免费且功能强大的播客软件,良心到只有少量的播客相关广告。喜欢智能播放和人声增强功能。最近,也支持章节播放功能。 AutoSleep:配合 Apple Watch 实现睡眠监控功能。原来大致为读取 Apple Watch 写入健康中的数据判断是否入睡以及睡眠质量。由于硬件的限制,很多时候还是不太准确。不过我也和网上说的一样,每天起来需要看这软件中的评分,判断昨天睡的如何…… Kindle:管它微信阅读如何火爆,不忘初心依旧选择 Kindle。配合 Kindle Unlimted,可以阅读很多好书。 Google 相册:免费强大的照片管理软件,允许谷歌优化照片质量的后,可以无限存储。 Quantumult:梯子软件,美区下载,比小火箭好用。 OmniFoucs:GTD 软件,居然使用的正版…… Anki:多年之后,我的摘抄终于有了存放之地。 Day One:日记软件,喜欢里面的去年今天功能,陆续把日记导入中。 Pocket:稍后读。 1 Password:密码软件,全平台通用。 熊猫吃短信:垃圾短信过滤,可以自己配置规则把公司的报警短信给屏蔽了。 Ulysses:Markdown 软件,iOS 版也包含在 SetApp 订阅。 在与 2017 版相比,有两个趋势:1. 减少很多与学习强相关的软件。 2. 越来越多的付费或者订阅制软件。期待明年。","link":"/post/best-of-iphone-2019.html"},{"title":"博客折腾记","text":"记录博客修修补补的故事 210123: 博客进入 beta 0.3 时代 我也想学习微信不写更新日志 beta 0.3 换到 Github Action 构建 换到木子修改的 hexo-themes-next 主题 beta 0.2 长达 9 个月闲置之后,终于迎来一轮对博客的更新。 本着闭环的原则,将评论系统从 Disqus 替换为基于 Github Issues 的 Gitalk。不过,依旧没有多少留言量。 博客主题从 Next 切换到 fi3ework/hexo-theme-archer: 🏹 A smart and modern theme for Hexo. 添加一个新的固定栏目 「每月分享」,目前正在持续探索具体形式中。 除继续使用百度统计之外,加上 Google Analytics 进行数据分析。 beta 0.1 开始使用版本号来记录博客更新。从 beta 0.1 开始,预计完成博客发布会的计划后(参见:博客发布会 · Issue #23,切换到正式版本。 本次更新带来最大的变化是在博客中加入豆瓣个人阅读和观影记录。感谢 hexo-douban: A simple plugin for hexo that helps us generate pages for douban books ,movies and games. 提供技术支持。 beta 0 早期对博客进行的相关修改有: 从零开始利用 hexo + Github/Coding 搭建个人博客 为博客添加返回顶部按钮:WordPress 博客折腾记:使用 Travis CI 自动部署博客 博客折腾记:修复七牛云测试域名失效问题 博客折腾记:主题更新、迁移博客到腾讯云COS以及解决百度收录 博客折腾记:hexo-leancloud-counter-security 与标题中的引号冲突 博客专栏 【每周分享】:每周六更新,记录过去一周,我看到值得分享的内容 【月读】:每月更新,推荐本月我阅读的一本书 【数字生活】:我的数字生活实践 【博客公告】:分享与这个博客维护相关的内容 博客记录 本博客采用hexo搭建,使用Even主题 托管:Coding Pages 域名:腾讯云 评论:Disqus 统计:百度统计 图床:七牛 20151006:恢复订阅功能 20160303:开启分类和请我喝一杯咖啡 20160623:重新开启评论和百度统计,与自己和解 20160624:更换主题大道至简Maupassant,增加favicon和apple-touch-icon 20170104:放弃github+hexo,投入vps+wordpress怀抱,依旧使用maupassant主题 20170722:主机系统升级失败,从备份中恢复博客,并采用 Twenty Twelve 主题 20171005:重新投入hexo怀抱,并托管于Coding Pages 20180101:开启功德箱 20180501:PV: 657 | UV: 242 20180528:使用 Travis CI 自动部署 除虫记录 Error: Cannot find module ‘node-sass-magic-importer’ ERROR in Cannot find module ‘node-sass’(已解决) - line - CSDN博客 1cnpm install node-sass@latest","link":"/post/blog-log.html"},{"title":"算法花园写作风格清单","text":"李如一在 写作风格手册 中提到写作风格的作用是 「保持机构和组织内部的文体统一,提高沟通效率。」 本清单会持续更新,如果有相关的建议,可以在留言中告诉我。 算法花园定位为个人博客,也是我和这个世界沟通的窗口。为提高读者阅读体验,参考相关文章后,推出该清单统一网站文章的基础风格。 写作 减少形容词使用,尽可能删除 「的」和「了」。 给出引用图片及引文来源。 文章如果发布后大幅度修改,在末尾给出版本信息。 写完文章后,整体阅读一遍。 排版 中文、英文、数字中间加空格,数字与单位之间无需增加空格,全角标点与其他字符之间不加空格。链接前后增加空格用以区分。 不重复使用标点符号。 中文使用直角引号 「」以及『 』。 使用全角中文标点,数字使用半角字符。中文中出现英文部分,仍然使用中文标点。 遇到完整的英文整句、特殊名词,其內容使用半角标点。 专有名词使用正确的大小写,使用公认的缩写。 todo 如何处理图片排版和命名。 使用英文命名文档,使用 - 来连接。为保证搜索引擎效果,尽量不要修改文档名称。 每篇文章开头添加简单介绍 <!--more-->。 发布后,在网页中确认格式是否符合预期、链接能否点击以及图片能否展示。 ChangeLog 20191103: 第一版 参考 写作风格手册_设计词典_好奇心日报 中文文案排版指北(简体中文版) — 码志 简体中文文本排版指南 - 知乎 少数派写作排版指南 - 少数派 城堡制作检查清单 0.1 版 - 简书","link":"/post/blog-writing-checklist.html"},{"title":"构建之法 第 0 次个人作业","text":"最近重新看邹欣写的构建之法,发现他的第一章课后作业很有意思,所以决定自己也来写一下。有关的作业说明在2017BUAA软工助教 第0次个人作业 - ChildishChange - 博客园中。 结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答) 计算机是你喜欢的领域吗?是你擅长的领域吗? 你热爱这一专业吗?你对计算机的热爱是怎样的?仅仅是口头的吗? 与大部分人差不多,在高考前我也没有对规划未来。考的也不是很好,没有太多的选择。所幸自认为还是有学习的劲头,想着大学找机会去转专业一波。当时也没有太在意专业的填报,最后机缘巧合来到了财经读计算机。大一下时,确实得到了转专业的机会。在面试时,突然感觉自己对转过去的专业也没有太多的好感,就和面试我的老师说放弃转专业,他们只能口头上鼓励我,男生学计算机也不错。大概就是这样子,就在计算机专业混到了大四。 比起这些博主来说,我没有他们那么强的主观能动性吧,能自觉地了解学习计算机各个领域的知识。而我从除了学校内的课程安排之外,自己了解其他知识都是浅尝而止。从大一开始差不多就点弯了天赋树,基本上课余时间都在写算法题目,参加各种各样的算法竞赛。幸运地拿了一些大大小小的奖,但是这也导致在知识面上和企业认为的计算机专业学生有很大的区别。目前来说,正在通过自己的努力,加强学习基础知识,希望能补齐自己的短板。 记得之前有一句话说,「数学是神造学科,计算机是人造学科」。在三年多的学习中,无时无刻不感受到前人思维的巧妙与严谨。比如 CPU 中的加法器,能通过简单的元器件和门电路搭配实现二进制加法以及进位。另外,计算机专业也能及激发最深处的好奇心。当你查阅相关的文档,实现软件的某些功能时,是否能想起童年某个午后拼成的模型? 在计算机系学习 你对你的大学生活有什么想要吐槽的地方吗?你理想的大学教育应该是什么样子的?跟学校给你的有什么区别?比较你在中国大学的经历,你的老师和学校能做到和国外那样吗?如果不能,请分析一下为什么。(必答) (8.26修改) 迄今为止,你写了多少代码,描述你做的最复杂的软件项目/作业。(必答)(8.24修改) 科班出身和北大青鸟有什么区别? 速成的培训班和打基础的大学教育还有mooc之间有区别吗? 学线性代数和概率论的时候,你是否有过这样的疑问「我们为什么要学这么多数学,这和我们的计算机有关系吗」,你现在是否还有这样的疑问?对这个问题,你有自己的解答了吗?那么其他学科呢? 对于专业来说,我记得辅导员曾经在年级会议上讲过这样一段话:「有些人和我说,为什么高等数学这么难?这些书都是在大学没有扩招前编的,以你们的成绩当时都可能上不了大学。而且,我们学校搞计算机系,只是发现有很多教计算机基础的老师才开设的。」所以,也可以知道这个专业在学校的尴尬地位。 托尔斯泰说「幸福的家庭总是相似的,不幸的家庭却各有各的不幸」。反而对于计算机专业来说,感觉「普通学校的问题总是相似的,强势学校的优点却各有不同」。蒋宇东在梦断计院 为梦前行中写道他自己的学校计院有三大问题:1.学生基础薄弱 2.学风不正,溃散成性 3. 实践环节薄弱,人才位置错放。之前,我也一直在想一件事情:是老师水平太差学生懒得学还是学生水平太差还是老师懒得教?看到上面的三个问题才明白,冰冻三尺非一日之寒,事物发展都是相辅相成的。学生大部分都是过来享受大学美好生活的,对于有挑战的专业基础课比如编译原理、离散数学等都会用脚投票让他离开课程表。有幸能勉强开下去的课程,也会被改成能突击几天通过的样子。 记得大二导师前往台湾进修前找我谈过一次话。他希望我能自己养成一些良好的学习习惯,多去钻研计算机专业知识。并且还说,学院每年毕业的学生中,没有超过十个学生明白计算机是怎么一回事?三年多的时间里,我也接触过网上的一些 Mooc,不过差不多完全听完的只有浙江大学陈越教授的数据结构和吴恩达教授的机器学习。能坚持学习完这两门课,背后都是兴趣使然。数据结构是 ACM 比赛中很重要的一个知识点,当时自己学校还没有开设这门课,而且看书自学也不是很懂,所以就花大半学期的时间在网上去学习。机器学习则是希望未来能从事机器学习相关方面的工作才了解的。 陈越教授放在网上的数据结构课程相对于浙大内部来说,最大的变化是将教学语言从英文变成了中文,而且也适当的删除了部分内容(不是很确定?)。之前也在知乎上看到浙大计算机专业的课程安排,主干课程选用外国原版教材,以及使用英文授课。另外陈老师在讲解相关算法时,只介绍原理和思想。相关的实践需要你课后花时间进行,并且要求提交程序设计平台上进行黑箱测试。对比后来在自己学校开设的数据结构课程中,直接给你展示代码,也不强求你写的代码能正确运行,只要粘贴在实验报告中提交即可。《机器学习》的课程展示了美国教育的特点,每一周的课程都会包含一个小 quiz ,以及在课程中插入适量的编程大作业,学习的困难程度也就可想而知。 这些授课方式的不同,我认为是不同大学对于教育的理解不同。对于浙大之类的重点大学来说,所给予学生的是精英教育,侧重于培养学生的计算机科学基础。而下面的学校更多是大学教育成为通识教育的产物,本应该培养专业型人才,传授计算机技术,却由于种种原因没有这样开展。Mooc 的出现,打破了原有的时间、空间的限制,让我这样的普通学习接触到了国内外顶尖大学的教育资源,有利于教育公平。但失败之处也在于它的灵活性,不得不承认需要很强的自我约束能力才能完整地学习完网上的课程,不知你还记不记得那个当时看得热血沸腾的课程时,被你遗忘在哪个角落了? 最后,我觉得 Mooc 还缺少的同辈压力。吴军博士在《大学之路》中写道「当许多聪明、求知欲强、具有同情心而又目光敏锐的年轻人聚到一起时,即使没有人教,他们也能互相学习。他们互相交流,了解到新的思想和看法、看到新鲜事物并且掌握独到的行为判断力。」这大概就是学什么不重要,重要的是和谁一起学吧。一些 Mooc 虽然提供在线社区交流,但还是没有线下那种碰出火花的感觉。 对比完这些,计算机专业学生的另外一个主题不可能忽视——“自学”。最开始的作业说明给出的很多参考博文也说明了这一点。我印象最深的一个方法是徐宥在掉进读书的兔子洞中写道的「一字不漏敲入一本书的程序成了我推荐别人学习语言的最好办法」。古语读书百遍其义自见,计算机是一门实践的学科,只有在实践中才会学习到技术的本义。目前,自己在看《机器学习实战》时(相关代码和读书笔记见参考链接5 ),也差不多用的是这个方法,将书中提到的机器学习算法一个字符一个字符地敲进编辑器,一次又一次地调试运行直到出现满意的结果。 在这样的学习中,我也可以回答这一部分的最后一个问题,我们为什么要学这么多数学,这和我们的计算机有关系吗?对于机器学习来说,本身是建立在概率论和线性代数的基础上,毕竟解释机器为什么能学习都需要用到霍夫丁不等式等相关知识。数学是一种工具,通过数学能将很多的计算机实践经验理论化,以此得到更好的发展。对比功力性很强的培训机构来说,接受科班教育的结果是有机会受到严格的数理化训练,这也能间接决定你在这个行业从事工作的层次和上限。 未来规划 对于你未来在IT行业的发展,你有什么样的梦想或者未来想从事什么样的工作?你准备怎样来规划你技术道路,职业道路和社会道路?(必答) 你对于实现自己的梦想已经做了或者计划做什么样的准备? 你们马上就要面临实习了,你打算在企业内实习还是在实验室实习? 实习经验究竟有多重要?是否需要马上开始积累实习经验? 前文也提到了,以我的目前的情况来看,大学中接受的教育和自己所学的技能都是和市场脱节的。所以,前一段时间也很迷茫,自己能做什么。所幸看到之前公司的同事所写的知乎专栏文章「谈“圈外”在校生如何更靠谱的拿到大厂算法/ML实习机会」(不知道为什么被删除了,所以无法提供链接),大意就是可以曲线救国,先就业再择业。 所以,我还是推荐出去实习的。不仅是走出象牙塔,感受一下工业界的需求。更重要的是大一点的企业都会安排专人对实习生进行相应的指导,使其能更快地朝工程师方向发展。 参考 现代软件工程 第一章 【概论】练习与讨论 - SoftwareTeacher - 博客园 2017BUAA软工助教 第0次个人作业 - ChildishChange - 博客园 蒋宇东:梦断计院 为梦前行 徐宥:掉进读书的兔子洞 xiang578/MachineLearningAction: 《机器学习实战》","link":"/post/build-to-win-homework-0x00.html"},{"title":"构建之法读书笔记","text":"偶然发现之前在博客园写过这篇读书笔记,顺手贴过来。 应该是从上周六开始看这本书,起因是其他人发布一张书中内容截图。作者讲到技能的反面中的总结部分——如何考察一个人是否精通魔方: 给面试者一个各面打乱颜色的魔方; 要求他把六面还原; 如果还原了,要求他把魔方恢复成我最初给他的那个混乱的局面,必须一模一样。 看到这些,最近自己也在思考这个问题,自己学习一样东西如何才是真正的掌握了?本书作者是微软员工,也是一名经验丰富的程序员,这种检测是否精通魔方的方法给我耳目一新,接下来的学习中可以这样去思考问题。 本书名叫《构建之法》,其实是讲述软件工程课程的教材。自己应该在大三也会有这一门课,不知道会上成什么样……前面几个章节看的比较仔细,团队运作模式之类的只是翻过一遍而已。现在对于这些不是很感兴趣。 总体来说,收获还是比较大的,也更新了自己的某些观念。比如作者在书中提出1/N的打分体系,第一档满分,第二档的一半,第三档得三分之一。 可以让想学习的学生知道如何努力,想混的也知道怎样才能混过去,不想上的也会知难而退。现在学校的打分体系确实差劲,很需要往这方面靠近。更重要的是给学生Natural critical learning environment,当然对自己学校来讲,要求有点过了。还有评价人的三种层次:行为和后果、习惯和动机、本质和固有性。 接下来是对编程的一些帮助,最重要的是“代码写出来是给人看的,而不是机器”。所以有了代码风格规范和代码设计规范。对于我自己来讲,体现在编程时的格式和变量名,格式可以靠自动对齐,和将复杂的功能用函数来实现,变量名可以采用英文缩写之类的,最重要不要出现什么拼音缩写。代码设计规范怎是考验编程能力了,这需要多写。最后是注释的原则,解释程序做什么和为什么这样做以及特别注意的地方。当然错误的注释比没有注释更麻烦。 最后是团队模式,现在自己学校里要求团队合作时,真心觉得还是自己一个人做方便,很难找到已经合适的人,自己又不喜欢协调沟通。不过书中讲的那么多规则,映象最深的是团队合作项目转组活动,这点目前没有经历过。其次是修改或维护前几届项目的原则,现在自己的作业,很多连样例都没有给你展示,更别说修改了,每次都要自己重新开始做。这也无可厚非吧。书中还讲到,结对编程,自己目前的体会是,几个人交流可以相互学习和传递经验,分享知识,不过某种程度也减少了探索的乐趣。书中补充了,带来更多满足感,更好的设计质量和代码质量之类的优势。 彩蛋:It’s not a bug .it’s a feature. 本书适合高年级之后,再来仔细研读。 2018 年重新阅读写的 构建之法 第 0 次个人作业","link":"/post/build-to-win.html"},{"title":"计算机基础:计算机网络","text":"电路交换与分组交换的区别? 优劣对比。 OSI有哪几层,知道主要几层的各自作用。 物理层:定义通信与传输借口硬件的机械、电气、功能和过程特性,实现比特流的透明传输。 数据链路层:无差别传送以帧为单位的数据。 网络层:选择合适的路由和交换结点,分组或者包。 运输层:端到端、或者进程到进程的无差别传送。 会话层:对数据传输的同步进行管理 表示层:信息加密和解密,正文压缩和还原 应用层: TCP/IP有哪几层,会画出来,知道所有层数的作用,会列举各层主要的协议名称。 网络接口层:x.25 网际层:IP 运输层:TCP和UDP 应用层:HTTP、FTP等 硬件(MAC)地址的概念及作用。 媒体访问控制子层:前6位16进制IETF分配。 区分不同的硬件 ARP协议的用途 及算法、在哪一层上会使用 ARP ? 地址解析协议:IP地址到MAC地址的映射 网络层 知道各个层使用的是哪个数据交换设备。(交换机、路由器、网关) 物理层:中继器、集线器 数据链路层:网桥或者交换机 网络层中继系统:路由器 网络层以上:网关 IP报文的格式,格式的各个字段的含义要理解。 MTU的概念,啥叫路径MTU? MTU发现机制,TraceRoute(了解)。 RIP协议的概念 及算法。 ICMP协议的主要功能。 网际控制报文协议,提高IP数据报成功交付的机会,报告差错和异常情况。 组播和多播的概念,IGMP的用途。 Ping协议的实现原理,ping 命令格式。 应用层,使用网络层的ICMP协议 子网划分的概念,子网掩码。 A类子网掩码:255.0.0.0,划分:8位+子网X位+主机24-X位 IP地址的分类,如何划分的,及会计算各类地址支持的主机数。 DNS的概念,用途,DNS查询的实现算法。 TCP与UDP的概念,相互的区别及优劣。 TCP和UDP是OSI模型中的运输层中的协议。TCP提供可靠的通信传输,而UDP则常被用于让广播和细节控制交给应用的通信传输。 TCP面向连接,UDP面向非连接即发送数据前不需要建立链接 TCP提供可靠的服务(数据传输),UDP无法保证 TCP面向字节流,UDP面向报文 TCP数据传输慢,UDP数据传输快 UDP报文的格式,字段的意义。 TCP 报文的格式,字段的意义。 TCP通过哪些措施,保证传输可靠? 三次握手,四次断开过程。 客户端向服务器发送一个SYN j 服务器向客户端响应一个SYN k,并对SYN j进行确认 ACK j+1 客户端向服务器发送一个ACK k+1 一端发送一个FIN 另一端接收到这个FIN分节后,执行被动关闭,对这个FIN进行确认,继续传输数据。 发送数据之后,发送一个FIN 接受到FIN,结束传输。 TIME_WAIT状态的概念及意义。 滑动窗口协议 与 停止等待协议的区别。 TCP的流量控制和拥塞控制实现原理(会画拥塞控制的典型图)。 TCP的快速重传与快速恢复算法。 TFTP 与 FTP的区别。 阻塞方式和非阻塞方式,阻塞connect与非阻塞connect。(比较难,有兴趣可以了解) HTTP基本格式。(java程序员必须掌握)","link":"/post/computer-base-network.html"},{"title":"Standford CS231n 2017 课程部分总结","text":"去年学习这门做的部分笔记,现在分享出来。 笔记格式有些问题,持续整理中。 大量内容参考 mbadry1/CS231n-2017-Summary Table of contents Table of contents Course Info 01. Introduction to CNN for visual recognition 02. Image classification 03. Loss function and optimization 04. Introduction to Neural network 05. Convolutional neural networks (CNNs) 06. Training neural networks I 07. Training neural networks II 09. CNN architectures Reference Course Info 主页: http://cs231n.stanford.edu/ 视频:斯坦福深度学习课程CS231N 2017中文字幕版+全部作业参考_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 大纲:Syllabus | CS 231N 课件:Index of /slides/2017 笔记:贺完结!CS231n官方笔记授权翻译总集篇发布 作业仓库:MachineLearning/CS231n at master · xiang578/MachineLearning 总课时: 16 01. Introduction to CNN for visual recognition 视觉地出现促进了物种竞争。 ImageNet 是由李飞飞维护的一个大型图像数据集。 自从 2012 年 CNN 出现之后,图像分类的错误率大幅度下降。 神经网络的深度也从 7 层增加到 2015 年的 152 层。截止到目前,机器分类准确率已经超过人类,所以 ImageNet 也不再举办相关比赛。 CNN 在 1998 年就被提出,但是这几年才流行开来。主要原因有:1) 硬件发展,并行计算速度提到 2)大规模带标签的数据集。 Gola: Understand how to write from scratch, debug and train convolutional neural networks. 02. Image classification 图像由一大堆没有规律的数字组成,无法直观的进行分类,所以存在语义鸿沟。分类的挑战有:视角变化、大小变化、形变、遮挡、光照条件、背景干扰、类内差异。 Data-Driven Approach Collect a dataset of images and labels Use Machine Learning to train a classifier Evaluate the classifier on new images 图像分类流程:输入、学习、评估 图像分类数据集:CIFAR-10,这个数据集包含了60000张32X32的小图像。每张图像都有10种分类标签中的一种。这60000张图像被分为包含50000张图像的训练集和包含10000张图像的测试集。 一种直观的图像分类算法:K-nearest neighbor(knn) 为每一张需要预测的图片找到距离最近的 k 张训练集中的图片,然后选着在这 k 张图片中出现次数最多的标签做为预测图片的标签(多数表决)。 训练过程:记录所有的数据和标签 O(1){O(1)}O(1) 预测过程:预测给定图片的标签 O(n){O(n)}O(n) Hyperparameters:k and the distance Metric Distance Metric L1 distance(Manhattan Distance) L2 distance(Euclidean Distance) knn 缺点 Very slow at test time Distance metrics on pixels are not informative 反例:下面四张图片的 L2 距离相同 Hyperparameters: choices about the algorithm that we set ranther than learn 留一法 Setting Hyperparameters by Cross-validation: 将数据划分为 f 个集合以及一个 test 集合,数据划分中药保证数据集的分布一致。 给定超参数,利用 f-1 个集合对算法进行训练,在剩下的一个集合中测试训练效果,重复这一个过程,直到所有的集合都当过测试集。 选择在训练集中平均表现最好的超参数。 Linear classification: Y = wX + b b 为 bias,调节模型对结果的偏好 通过最小化损失函数来,来确定 w 和 b 的值。 Linear SVM: classifier is an option for solving the image classification problem, but the curse of dimensions makes it stop improving at some point. @todo Logistics Regression: 无法解决非线性的图像数据 03. Loss function and optimization 通过 Loss function 评估参数质量 比如 $$L=\\frac{1}{N}\\sum_iL_i\\left(f\\left(x_i,W\\right),y_i\\right)$$ Multiclass SVM loss 多分类支持向量机损失函数 Li=∑j≠yjmax(0,sj−syi+1)L_i=\\sum_{j \\neq y_j}\\max\\left(0,s_j-s_{y_i}+1\\right) Li=j=yj∑max(0,sj−syi+1) 这种损失函数被称为合页损失 Hinge loss SVM 的损失函数要求正确类别的分类分数要比其他类别的高出一个边界值。 L2-SVM 中使用平方折叶损失函数$$\\max(0,-)^2$$能更强烈地惩罚过界的边界值。但是选择使用哪一个损失函数需要通过实验结果来判断。 举例 根据上面的公式计算:$$L = \\max(0,437.9-(-96.8)) + \\max(0,61.95-(-96.8))=695.45$$ 猫的分类得分在三个类别中不是最高得,所以我们需要继续优化。 Suppose that we found a W such that L = 0. Is this W unique? No! 2W is also has L = 0! Regularization: 正则化,向某一些特定的权值 W 添加惩罚,防止权值过大,减轻模型的复杂度,提高泛化能力,也避免在数据集中过拟合现象。 L=1N∑iLi(f(xi,W),yi)+λR(W)L=\\frac{1}{N}\\sum_iL_i\\left(f\\left(x_i,W\\right),y_i\\right) + \\lambda R(W) L=N1i∑Li(f(xi,W),yi)+λR(W) R 正则项 $$\\lambda$$ 正则化参数 常用正则化方法 L2$$\\begin{matrix} R(W)=\\sum_{k}\\sum_l W^2_{k,l} \\end{matrix}$$ L1$$\\begin{matrix} R(W)=\\sum_{k}\\sum_l \\left\\vert W_{k,l} \\right\\vert \\end{matrix}$$ Elastic net(L1 + L2): $$\\begin{matrix} R(W)=\\sum_{k}\\sum_l \\beta W^2_{k,l} + \\left\\vert W_{k,l} \\right\\vert \\end{matrix}$$ Dropout Batch normalization etc L2 惩罚倾向于更小更分散的权重向量,L1 倾向于稀疏项。 Softmax function: fj(z)=esi∑esjf_j(z)=\\frac{e^{s_i}}{\\sum e^{s_j}} fj(z)=∑esjesi 该分类器将输出向量 f 中的评分值解释为没有归一化的对数概率,通过归一化之后,所有概率之和为1。 Loss 也称交叉熵损失 cross-entropy loss $$L_i = - \\log\\left(\\frac{e^{s_i}}{\\sum e^{s_j}}\\right)$$ 12345f = np.array([123, 456, 789]) # 例子中有3个分类,每个评分的数值都很大p = np.exp(f) / np.sum(np.exp(f)) # 不妙:数值问题,可能导致数值爆炸# 那么将f中的值平移到最大值为0:f -= np.max(f) # f becomes [-666, -333, 0]p = np.exp(f) / np.sum(np.exp(f)) # 现在OK了,将给出正确结果 SVM 和 Softmax 比较 评分,SVM 的损失函数鼓励正确的分类的分值比其他分类的分值高出一个边界值。 对数概率,Softmax 鼓励正确的分类归一化后的对数概率提高。 Softmax 永远不会满意,SVM 超过边界值就满意了。 Optimization:最优化过程 Follow the slope 梯度是函数的斜率的一般化表达,它不是一个值,而是一个向量,它是各个维度的斜率组成的向量。 Numerical gradient: Approximate, slow, easy to write. (But its useful in debugging.) Analytic gradient: Exact, Fast, Error-prone. (Always used in practice) 实际应用中使用分析梯度法,但可以用数值梯度法去检查分析梯度法的正确性。 利用梯度优化参数的过程:W = W - learning_rate * W_grad learning_rate 被称为是学习率,是一个比较重要的超参数 Stochastic Gradient Descent SGD 随机梯度下降法 每次使用一小部分的数据进行梯度计算,这样可以加快计算的速度。 每个批量中只有1个数据样本,则被称为随机梯度下降(在线梯度下降) 图像分类任务中三大关键部分: 评分函数 损失函数:量化某个具体参数 W{W}W 的质量 最优化:寻找能使得损失函数值最小化的参数 W{W}W 的过程 04. Introduction to Neural network 反向传播:在已知损失函数 L{L}L 的基础上,如何计算导数∇WL{\\nabla _WL}∇WL? 计算图 由于计算神经网络中某些函数的梯度很困难,所以引入计算图的概念简化运算。 在计算图中,对应函数所有的变量转换成为计算图的输入,运算符号变成图中的一个节点(门单元)。 反向传播:从尾部开始,根据链式法则递归地向前计算梯度,一直到网络的输入端。 绿色是正向传播,红色是反向传播。 对于计算图中的每一个节点,我们需要计算这个节点上的局部梯度,之后根据链式法则反向传递梯度。 Sigmoid 函数:f(w,x)=11+e−(w0x0+w1x1+w2){f(w,x)=\\frac{1}{1+e^{-(w_0x_0+w_1x_1+w_2)}}}f(w,x)=1+e−(w0x0+w1x1+w2)1 对于门单元 1x{\\frac{1}{x}}x1,求导的结果是 −1x2{-\\frac{1}{x^2}}−x21,输入为 1.37,梯度返回值为 1.00,所以这一步中的梯度是 (−11.372)∗1.00=−0.53{(\\frac{-1}{1.37^2})*1.00=-0.53}(1.372−1)∗1.00=−0.53。 模块化思想:对 σ(x)=11+e−x{\\sigma(x)=\\frac{1}{1+e^{-x}}}σ(x)=1+e−x1 求导的结果是 (1−σ(x))σ(x){(1-\\sigma(x))\\sigma(x)}(1−σ(x))σ(x)。如果 sigmoid 表达式输入值为 1.0 时,则前向传播中的结果是 0.73。根据求导结果计算可得局部梯度是 (1−0.73)∗0.73=0.2{(1-0.73)*0.73=0.2}(1−0.73)∗0.73=0.2。 Modularized implementation: forward/backwar API 1234567891011121314class MultuplyGate(object): """ x,y are scalars """ def forward(x,y): z = x*y self.x = x # Cache self.y = y # Cache # We cache x and y because we know that the derivatives contains them. return z def backward(dz): dx = self.y * dz #self.y is dx dy = self.x * dz return [dx, dy] 深度学习框架中会实现的门单元:Multiplication、Max、Plus、Minus、Sigmoid、Convolution 常用计算单元 **加法门单元:**把输出的梯度相等地分发给它所有的输入,这一行为与输入值在前向传播时的值无关。 **取最大值门单元:**将梯度转给前向传播中值最大的那个输入,其余输入的值为0。 **乘法门单元:**等值缩放。局部梯度就是输入值,但是需要相互交换,然后根据链式法则乘以输出值得梯度。 Neural NetWorks (Before) Linear score function $$f = Wx$$ (Now) 2-layer Neural NetWork $$f=W_2\\max(0,W_1x)$$ ReLU $$\\max(0,x)$$ 是激活函数,如果不使用激活函数,神经网络只是线性模型的组合,无法拟合非线性情况。 神经网络是更复杂的模型的基础组件 05. Convolutional neural networks (CNNs) 这一轮浪潮的开端:AlxNet 卷积神经网络 Fully Connected Layer 全连接层:这一层中所有的神经元链接在一起。 Convolution Layer: 通过参数共享来控制参数的数量。Parameter sharing Sparsity of connections 卷积神经网络能学习到不同层次的输入信息 常见的神经网络结构:INPUT -> [[CONV -> RELU]*N -> POOL?]*M -> [FC -> RELU]*K -> FC 使用小的卷积核大小的优点:多个卷积层与非线性的激活层交替的结构,比单一卷积层的结构更能提取出深层的更好地特征。而且使用的参数也会更少 计算卷积层输出 stride 是卷积核在移动时的步长 通用公式 (N-F)/stride + 1 stride 1 => (7-3)/1 + 1 = 5 stride 2 => (7-3)/2 + 1 = 3 stride 3 => (7-3)/3 + 1 = 2.33 Zero pad the border: 用零填充所有的边界,保证输入输出图像大小相同,保留图像边缘信息,提高算法性能 步长为 1 时,需要填充的边界计算公式:(F-1)/2 F = 3 => zero pad with 1 F = 5 => zero pad with 2 F = 7 => zero pad with 3 计算例子 输入大小 32*32*3 卷积大小 10 5*5 stride 1 pad 2 output 32*32*10 每个 filter 的参数数量:5*5*3+1 =76 bias 全部参数数量 76*10=760 卷积常用超参数设置 卷积使用小尺寸滤波器 卷积核数量 K 一般为 2 的次方倍 卷积核的空间尺寸 F 步长 S 零填充数量 P Pooling layer 降维,减少参数数量。在卷积层中不对数据做降采样 卷积特征往往对应某个局部的特征,通过池化聚合这些局部特征为全局特征 Max pooling 2*2 stride 2 避免区域重叠 Average pooling 06. Training neural networks I Activation functions 激活函数 不使用激活函数,最后的输出会是输入的线性组合。利用激活函数对数据进行修正。 Sigmoid 限制输出在 [0,1]区间内 firing rate 二分类输出层激活函数 Problem 梯度消失:x很大或者很小时,梯度很小,接近于0(考虑图像中的斜率。无法得到梯度反馈。 输出不是 0 均值的数据,梯度更新效率低 exp is a bit compute expensive tanh 输出范围 [-1, 1] 0 均值 x 很大时,依然没有梯度 f(x)=ez−e−zez+e−z{f(x)=\\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}}f(x)=ez+e−zez−e−z 1−(tanh(x))2{1-(tanh(x))^2}1−(tanh(x))2 RELU rectified linear unit 线性修正单元 一半空间梯度不会饱和,计算速度快,对结果又有精确的计算 不是 0 均值 Leaky RELU leaky_RELU(x) = max(0.01x, x) 梯度不会消失 需要学习参数 ELU 比 ReLU 好用 反激活机制 Maxout maxout(x) = max(w1.Tx + b1, w2.Tx + b2) 梯度不会消失 增大参数数量 激活函数选取经验 使用 ReLU ,但要仔细选取学习率 尝试使用 Leaky ReLU Maxout ELU 使用 tanh 时,不要抱有太大的期望 不要使用 sigmoid 数据预处理 Data Preprocessing 均值减法:对数据中每个独立特征减去平均值,从几何上来看是将数据云的中心都迁移到原点。 归一化:将数据中的所有维度都归一化,使数值范围近似相等。但是在图像处理中,像素的数值范围几乎一致,所以不需要额外处理。 12X -= np.mean(X, axis = 1)X /= np.std(X, axis =1) 图像归一化 Subtract the mean image AlexNet mean image 32,32,3 Subtract per-channel mean VGGNet mean along each channel = 3 numbers 如果需要进行均值减法时,均值应该是从训练集中的图片平均值,然后训练集、验证集、测试集中的图像再减去这个平均值。 Weight Initialization 全零初始化 网络中的每个神经元都计算出相同的输出,然后它们就会在反向传播中计算出相同的梯度。神经元之间会从源头上对称。 Small random numbers 初始化权值要非常接近 0 又不能等于 0。将权重初始化为很小的数值,以此来打破对称性 randn 函数是基于零均值和标准差的高斯分布的随机函数 W = 0.01 * np.random.rand(D,H) 问题:一个神经网络的层中的权重值很小,那么在反向传播的时候就会计算出非常小的梯度。会减小反向传播中的“梯度信号”,在深度网络中就会出现问题。 Xavier initialization W = np.random.rand(in, out) / np.sqrt(in) 校准方差,解决输入数据量增长,随机初始化的神经元输出数据的分布中的方差也增大问题。 He initialization W = np.random.rand(in, out) / np.sqrt(in/2) Batch normalization 保证输入到神经网络中的数据服从标准的高斯分布 通过批量归一化可以加快训练的速度 步骤 首先计算每个特征的平均值和平方差 通过减去平局值和除以方差对数据进行归一化 Result = gamma * normalizedX + beta 对数据进行线性变换,相当于对数据分布进行一次移动,可以恢复数据之前的分布特征 BN 的好处 加快训练速度 可以使用更快的而学习率 减少数据对初始化权值的敏感程度 相当于进行一次正则化 BN 适用于卷积神经网络和常规的 DNN,在 RNN 和增强学习中表现不是很好 Babysitting the Learning Provess Hyperparameter Optimization Cross-validation 策略训练 小范围内随机搜索 07. Training neural networks II Optimization Algorithms: SGD 的问题 x += - learning_rate * dx 梯度在某一个方向下降速度快,在其他方向下降缓慢 遇到局部最小值点,鞍点 mini-batches GD Shuffling and Partitioning are the two steps required to build mini-batches Powers of two are often chosen to be the mini-batch size, e.g., 16, 32, 64, 128. SGD + Momentun 动量更新:从物理学角度启发最优化问题 V[t+1] = rho * v[t] + dx; x[t+1] = x[t] - learningRate * V[t+1] rho 被看做是动量,其物理意义与摩擦系数想类似,常取 0.9 或0.99 和 momentun 项更新方向相同的可以快速更新。 在 dx 中改变梯度方向后, rho 可以减少更新。momentun 能在相关方向加速 SGD,抑制震荡,加快收敛。 Nestrov momentum v_prev = v; v = mu * v - learning_rate * dx; x += -mu * v_prev + (1 + mu) * v AdaGrad nt=nt−1+gt2n_t=n_{t-1}+g^2_tnt=nt−1+gt2 Δθt=−ηnt+ϵ\\Delta \\theta _t = -\\frac{\\eta}{\\sqrt{n_t+\\epsilon}}Δθt=−nt+ϵη 下面根号中会递推形成一个约束项。前期这一项比较大,能够放大梯度。后期这一项比较小,能约束梯度。 gt 的平方累积会使梯度趋向于 0 RMSProp RMS 均方根 自适应学习率方法 求梯度的平方和平均数:cache = decay_rate * cache + (1 - decay_rate) * dx**2 x += - learning_rate * dx / (sqrt(cache) + eps) 依赖全局学习率 Adam RMSProp + Momentum It calculates an exponentially weighted average of past gradients, and stores it in variables vvv (before bias correction) and vcorrectedv^{corrected}vcorrected (with bias correction). It calculates an exponentially weighted average of the squares of the past gradients, and stores it in variables sss (before bias correction) and scorrecteds^{corrected}scorrected (with bias correction). 一阶到导数累积,二阶导数累积 It updates parameters in a direction based on combining information from “1” and “2”. The update rule is, for l=1,...,Ll = 1, ..., Ll=1,...,L: {vdW[l]=β1vdW[l]+(1−β1)∂J∂W[l]vdW[l]corrected=vdW[l]1−(β1)tsdW[l]=β2sdW[l]+(1−β2)(∂J∂W[l])2sdW[l]corrected=sdW[l]1−(β1)tW[l]=W[l]−αvdW[l]correctedsdW[l]corrected+ε\\begin{cases} v_{dW^{[l]}} = \\beta_1 v_{dW^{[l]}} + (1 - \\beta_1) \\frac{\\partial \\mathcal{J} }{ \\partial W^{[l]} } \\\\ v^{corrected}_{dW^{[l]}} = \\frac{v_{dW^{[l]}}}{1 - (\\beta_1)^t} \\\\ s_{dW^{[l]}} = \\beta_2 s_{dW^{[l]}} + (1 - \\beta_2) (\\frac{\\partial \\mathcal{J} }{\\partial W^{[l]} })^2 \\\\ s^{corrected}_{dW^{[l]}} = \\frac{s_{dW^{[l]}}}{1 - (\\beta_1)^t} \\\\ W^{[l]} = W^{[l]} - \\alpha \\frac{v^{corrected}_{dW^{[l]}}}{\\sqrt{s^{corrected}_{dW^{[l]}}} + \\varepsilon} \\end{cases}⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧vdW[l]=β1vdW[l]+(1−β1)∂W[l]∂JvdW[l]corrected=1−(β1)tvdW[l]sdW[l]=β2sdW[l]+(1−β2)(∂W[l]∂J)2sdW[l]corrected=1−(β1)tsdW[l]W[l]=W[l]−αsdW[l]corrected+εvdW[l]corrected where: t counts the number of steps taken of Adam L is the number of layers β1\\beta_1β1 and β2\\beta_2β2 are hyperparameters that control the two exponentially weighted averages. α\\alphaα is the learning rate ε\\varepsilonε is a very small number to avoid dividing by zero 特点: 适用于大数据集和高维空间。 对不同的参数计算不同的自适应学习率。 Learning decay 学习率随着训练变化,比如每一轮在前一轮的基础上减少一半。 防止学习停止 Second order optimization Regularization Dropout 每一轮中随机使部分神经元失活,减少模型对神经元的依赖,增强模型的鲁棒性。 Transfer learning CNN 中的人脸识别,可以在大型的模型基础上利用少量的相关图像进行继续训练。 09. CNN architectures 研究模型的方法:搞清楚每一层的输入和输出的大小关系。 LeNet - 5 [1998] 60k 参数 深度加深,图片大小减少,通道数量增加 ac: Sigmod/tanh AlexNet [2012] (227,227,3) (原文错误) 60M 参数 LRN:局部响应归一化,之后很少使用 VGG - 16 [2015] 138 M 结构不复杂,相对一致,图像缩小比例和通道增加数量有规律 ZFNet [2013] 在 AlexNet 的基础上修改 CONV1: change from (11 x 11 stride 4) to (7 x 7 stride 2) CONV3,4,5: instead of 384, 384, 256 filters use 512, 1024, 512 VGG [2014] 模型中只使用 3*3 conv:与 77 卷积有相同的感受野,而且可以将网络做得更深。比如每一层可以获取到原始图像的范围:第一层 33,第二层 55,第三层 77。 前面的卷积层参数量很少,模型中大部分参数属于底部的全连接层。 GoogLeNet 引入 Inception module design a good local network topology (network within a network) and then stack these modules on top of each other 该模块可以并行计算 conv 和 pool 层进行 padding,最后将结果 concat 在一起 ResNet 目标:深层模型表现不应该差于浅层模型,解决随着网络加深,准确率下降的问题。 Y = (W2* RELU(W1x+b1) + b2) + X 如果网络已经达到最优,继续加深网络,residual mapping会被设置为 0,一直保存网络最优的情况。 Reference 深度学习最全优化方法总结比较(SGD,Adagrad,Adadelta,Adam,Adamax,Nadam) - 知乎","link":"/post/cs231n-summary.html"},{"title":"【Uber ETA】DeeprETA An ETA Post-processing System at Scale","text":"本篇文章充满工业界风格,介绍 Uber 如何构建基于深度学习的 ETA 系统。在 Uber App 中,ETA 主要服务网约车和外卖两大业务,基于业务发展产生出一些细分场景的 ETA 需求(pick-up、drop-off)。技术挑战在于偏航(系统预估路线和司机真实路线不同)、不同场景数据分布不同、不同场景对 ETA 诉求不同,所以他们主要目标是构建高效以及泛用的 ETA 系统。 背景介绍 为了更充分了解相关背景知识,也可以看看我之前写的滴滴 ETA 论文解读 (WDR) Learning to Estimate the Travel Time) ETA (Estimated Time of Arrival,预估到达时间):给定时刻下,预估从一个起点到终点所需要的时间。ATA (Actual Time Of Arrival,真实到达时间):给定时刻下,真实从一个起点到终点花费的时间。ETA 任务的目标是最小化 ETA 和 ATA 的差距,一般用 MAPE 或 MAE 来衡量。 上图是 Uber ETA Posting-processing System,主要包括四部分: Maps & Traffic: Map 指将整个真实世界用图数据(点和边)来建模。在给定起点和终点的情况下,路径规划系统规划的路线可以用一系列边来表示。Traffic 指交通状态,路况团队会根据前一段时间收集到的 gps 信号,预计后面一段时间内真实世界中道路的拥堵程度和通行速度。 Routing Engine:根据路径规划系统规划的路线以及路况发布的道路通行速度计算出一个规则 ETA(Routing Engine ETA, RE-ETA) ML Model:本文介绍的深度学习 DeeprETA 模型,该模型预估 RE-ETA 和 ATA 的残差。 Routing APIs:通过 api 接口给其他业务提供 ETA 服务 DeeprETA 遵循 More Embeddings, Fewer Layers 原则,设计预测效率更高的模型,主要包括 embdding module 和 2-Layer Module 两个模块。 Embedding module 模型特征主要分成三类:Continuous Features、Categorical Features 以及 Geospatial Features,具体特征如下: Categorical Features 所有类别特征都 embedding 化 Continuous Features 数值特征先分桶离散化,然后转成 embeddine。作者他们尝试发现 quantile buckets(等频分桶,比如每 20% 样本分一个同) 比 equal-width buckets(等距分桶)效果更好,猜测其可能原因是等频分桶更有效保留信息(We suspect that quantile buckets perform well because they maximize entropy: for any fixed number of buckets, quantile buckets convey the most information (in bits) about the original feature value compared to any other bucketing scheme.)。 Geospatial Features Geospatial Features 主要指终点和起点的经纬度坐标,通过 geo hashing + multiple feature hashing 转换成 embdding。 通过 Geohash 将经纬度转换成固定长度的字符串 将 lat, lng 转换成 [0,1] 范围内浮点数 放大上一步得到的浮点数到 [0, 2e32] 转换成 32 位整数 将 lat 和 lng 对应的两个 32 整数合并成一个 64 位整数 利用 base32 对 64 位整数进行编码得到一个长度为 5u bits 的字符串 通过 Feature hasing 将字符串转换成 index Exact indexing 每个字符串转成单独 embdding。geohash 精度越高,该方法内存消耗越大。 Multiple feature hashing feature hashing 将多个字符串转换成一个 index。考虑到hash冲突以及格子内订单的热度,同一个字符串使用多个 hash 函数处理得到多个 index。 2-layer Module 2-layer Module 分别是 Interaction layer 和 Calibration layer。模型 ETA 可以表示成: r^ij=f^2(f^(Xiemb))+b^j(Xitype)\\hat{r}_{\\mathrm{ij}}=\\hat{f}_2\\left(\\hat{f}\\left(X_{i_{\\mathrm{emb}}}\\right)\\right)+\\hat{b}_j\\left(X_{i_{\\mathrm{type}}}\\right) r^ij=f^2(f^(Xiemb))+b^j(Xitype) 其中 f 代表 Interaction layer,f2 代表全连层,bjb_jbj 代表 Calibration layer (第 j 种类型 ETA 的偏置)。 Interaction layer 所有特征在经过 Embedding module 后。都被转换成相同长度的 embdding,然后经过 Interaction layer 进行特征交叉。尝试过主流的网络结构后,作者选择的是 self-attention 结构,更进一步引入 Linear self-attention 解决 attention 矩阵计算速度慢的问题。 Calibration layer 针对不同业务数据分布特点,Calibration layer 根据ETA请求类型(网约车/配送、pickup/dropoff、长短单)使用全连接层对上一步模型结果进行校准(对预测结果进行整体偏移)。另外,作者也提到这一层也可以设计成 MMoE 结构。 Asymmetric Huber loss function 不同类型 ETA 任务需要用不同的指标来评估,比如预估价格需要 ETA mean erros,配送 ETA 利用类似于 95th 更加合理。所以作者设计出一种非对称的 Huber Loss Fucntion: L(ω,δ,Θ;(q,y0),y)={ωL(δ,Θ;(q,y0),y),y<y^(1−ω)L(δ,Θ;(q,y0),y),y≥y^\\mathcal{L}\\left(\\omega, \\delta, \\Theta ;\\left(\\boldsymbol{q}, y_0\\right), y\\right)= \\begin{cases}\\omega \\mathcal{L}\\left(\\delta, \\Theta ;\\left(\\boldsymbol{q}, y_0\\right), y\\right), & y<\\hat{y} \\\\ (1-\\omega) \\mathcal{L}\\left(\\delta, \\Theta ;\\left(\\boldsymbol{q}, y_0\\right), y\\right), & y \\geq \\hat{y}\\end{cases} L(ω,δ,Θ;(q,y0),y)={ωL(δ,Θ;(q,y0),y),(1−ω)L(δ,Θ;(q,y0),y),y<y^y≥y^ L(δ,Θ;(q,y0),y)={12(y−y^)2,∣y−y^∣<δδ∣y−y^∣−12δ2,∣y−y^∣≥δ\\mathcal{L}\\left(\\delta, \\Theta ;\\left(\\boldsymbol{q}, y_0\\right), y\\right)= \\begin{cases}\\frac{1}{2}(y-\\hat{y})^2, & |y-\\hat{y}|<\\delta \\\\ \\delta|y-\\hat{y}|-\\frac{1}{2} \\delta^2, & |y-\\hat{y}| \\geq \\delta\\end{cases} L(δ,Θ;(q,y0),y)={21(y−y^)2,δ∣y−y^∣−21δ2,∣y−y^∣<δ∣y−y^∣≥δ Θ\\ThetaΘ 代表模型参数,ω∈[0,1]\\omega \\in[0,1]ω∈[0,1] 控制模型对高低估倾向(比如准时赔场景,如果模型低估严重会带来大量投诉), δ>0\\delta>0δ>0 控制异常值的容忍程度,值越大对异常值越不敏感。 Train 每周训练模型 Adam Relative cosine annealing learning rate scheduler 实验效果 评估指标 主要有 mean absolute error (MAE), 50th percentile absolute error (p50 error) and 95th percentile absolute error (p95 error)。实验结果都是计算三个指标相对于 RE-ETA 的提升。比如 MAE 的计算方式改成: 1n∑i=1n∣yi−y^0i∣−1n∑i=1n∣yi−y^∣1n∑i=1n∣yi−y^0i∣.\\frac{\\frac{1}{n} \\sum_{i=1}^n\\left|y_i-\\hat{y}_{0 i}\\right|-\\frac{1}{n} \\sum_{i=1}^n\\left|y_i-\\hat{y}\\right|}{\\frac{1}{n} \\sum_{i=1}^n\\left|y_i-\\hat{y}_{0 i}\\right|} . n1∑i=1n∣yi−y^0i∣n1∑i=1n∣yi−y^0i∣−n1∑i=1n∣yi−y^∣. 结果 DeeprETANet 比 XGBoost ResNet HammockNet 等方法都有明显的效果提升。 在 p95 指标上 DeeprETANet 和无 feature hashing DeeprETANet 提升相类似,可能说明 geospatial embeddings 能在 type case 上有提升,但是不能改善极端错误的情况。 Embedding Analysis 这一部分作者用 t-SNE (将 embedding 降维到 2维)对 geospatial embeddings 和 temporal embedding 进行分析。 temporal embedding 两幅图分别是配送和网约车的 embedding 分布,深色代表 weekend,浅色代表 weekday,从图上看有局部连续性,但是没有明确的周末或工作日效应(深色和浅色没有明显聚集) geospatial embeddings geospatial embeddings 有局部聚集性,猜测是相邻的位置有相似的表示。配送和网约车学习到的 embedding 不同。 参考 How Uber Predicts Arrival Times - Xinyu Hu and Olcay Cirit | Stanford MLSys #64 - YouTube DeepETA: How Uber Predicts Arrival Times Using Deep Learning | Uber Blog Day 17 Uber 要如何估計司機和外送的抵達時間?(上)- Self attention 介紹:简单讲了 self-attention 的计算过程 Day 18 Uber 要如何估計司機和外送的抵達時間?(下)- DeeprETANet","link":"/post/deepreta.html"},{"title":"道长写作每日一句01-20","text":"行百里者半九十。 200906:可惜这件事情也没有坚持下去。 1 People respectively choose jogging, playing basketball, swimming, skating, climbing or riding as their regular exercises because exercises never fail to make us stronger and more energetic. 人们分别将慢跑、打篮球、游泳、滑雪、爬山或者骑自行车做为自己的日常运动。这其中的原因在于有规律运动会使我们变得更加强壮和精力充沛。 参考译文:人们分别选择慢跑、打篮球、游泳、滑冰、爬山或骑车作为日常锻炼,这是因为这些运动总是使我们更强壮和精力充沛。 2 City residents suffer a great deal from public hazards, such as noise and air pollution, while in the country, far away from numerous exciting activities, one may feel isolated or bored. 城市居民忍受着例如噪音和空气污染之类的公共问题,然而居住在乡村中,却又有远离大量有趣活动导致的孤独感和无聊感。 参考译文:城市居民饱受噪音和空气污染等公共问题的困扰。而在乡村,人们无法参加众多精彩的活动,可能会感到孤独和无聊。 3 We often hear frustrating parents complain that their children are behaving unreasonably while many a child would so often say that his or her parents are just hopelessly old-fashioned. 我们经常听到沮丧的父母报怨他们子女的表现不可理解,与此同时,孩子们也经常说父母太过于守旧。 参考译文:我们经常听到父母抱怨孩子们的行为难以理解,而很多孩子们总是说父母们不可救药地落伍了。 4 Covering all kinds of topics from daily life to political issues, from individual thoughts to world events, Microblogs offer readers anything they might be interested in. 覆盖从日常生活到政治议题,从个人思想到世界大事的所有的主题 ,微博提供使用者任何他们也许感兴趣的事情。 参考译文:微博涉及各种话题,从日常生活到政治热点,从个人思想到世界大事,为读者提供他们可能感兴趣的任何内容 5 Over the course of thousands of years, the Chinese people have created their own unique customs and traditions, and passed them on from one generation to the next. 在上千年的历史进程中,中国人创造了独一无二的风俗与传统,并将此一代代的传承下去。 参考译文:在几千年的历程中,我国人民创造了自己独特的风俗和传统,并把它们一代代传给后人。 6 A lonely heart tends to regard genuine love from other people as the greatest happiness, and a man confined to a wheelchair will have no other wish than to walk like a normal person. 孤独的人会将他人真诚的爱作为最大的幸福,坐轮椅的人没有比像正常人一样行走更大的愿望。 参考译文:一个孤独的人往往把其他人给予的真爱视为最大的幸福,而一个坐轮椅的人除了希望能像普通人一样走路之外别无他求。 7 Today, whether in Bangkok, Beijing or Berlin, the roads of the world’s most populous cities are more crowded with motor vehicles than at any other time in history. 如今无论在曼谷、北京还是柏林,这些世界上人口众多城市的道路因为机动车问题而堵塞超过历史时期。 参考译文:如今,无论在曼谷、北京还是柏林,这些世界上人口最稠密的城市的道路上挤满了机动车,数量比历史上任何时候都要多。 8 In the case of a blotched operation, the patient could end up with an unsightly appearance, or at least one that is worse than his or her pre-op appearance. 在一个手术之后,病人会以一个难看的外表结束,或者至少比他之前的外貌更糟。 参考译文:在手术失败的情况下,患者可能会变得难看,或者至少比手术前丑。 9 An advantage of online shopping is that it allows people to find the cheapest price with a flick of the mouse. 网上购物的一个优势是人们通过鼠标的点击可以买到最便宜的东西。 参考译文:网上购物的一个优势就是让人们只需轻按鼠标就能找到最便宜的价格。 10 Internet technology is becoming increasingly advanced and its development is indeed eye-catching. 网络技术变得越来越高级,它的发展也十分的吸引眼球。 参考译文:因特网技术越来越先进,它的发展确实引人注目。 11 We can get a better understanding of the flora and fauna as well as local customs and practices of the country we are visiting. 当在一个国家旅行时,我们会更的观察当地动植物和体验风土人情。 参考译文:我们可以更好地了解所游览国家的动植物资源以及当地的风土人情。 12 Shoddy products would expose the consumers to health and safety risks. 假冒伪劣产品会给消费者带来健康和安全的风险。 劣质产品会使消费者面临健康和安全风险。 13 China’s lower mortality rate, when combined with the one-child policy, has resulted in a rapid aging of China’s population, which will lead to a pension problem for the Chinese government. 中国的低死亡率和独生子女政策加速了人口的老龄化,这些将给政府带来在养老金方面的问题。 参考译文:我国较低的死亡率以及独生子女政策造成了我国人口的迅速老龄化,这将给我国政府带来养老金问题。 14 There is a growing recognition that people with a master’s degree will have a competitive advantage over those with only a bachelor’s degree. 现在越来越多的人认为那些具有硕士学历的人比只有本科学历的更加有竞争优势。 参考译文:越来越多的人认识到,和那些只有学士学位的人相比,拥有硕士学位的人将具有竞争优势。 **15 On the one hand, there is no denying that the Internet is currently one of the most efficient media for interpersonal communication. ** 在另一个方面,互联网毫无疑问的成为了当前个人之间交流最有效的方式。 参考译文:一方面,不可否认因特网目前是人际交流使用的最高效媒介之一。 16 Although physical education is a part of adolescent education, a good many students go through their formative years without developing a lasting interest in sports. 尽管体育教育是青少年教育中重要的一个组成部分,但是大量的学生在生长发育时期没有养成一个持续的体育爱好。 参考译文:虽然体育教育是青少年教育的一部分,但是许多学生在他的的性格形成时期并没有培养起来对体育运动的长期兴趣。 17 Mental illness is often difficult to recognize and even more difficult to treat if a person isn’t aware of his or her illness. 精神疾病通常更难被识别,当本人对自己的病情不关心时就更加难被治愈了。 参考译文:心理疾病一般很难发现,而且如果人们不知道自己有心理问题,那么治疗起来更是难上加难。 18 A large number of people consider university education as a springboard for good jobs and high salaries. 大量的人们认为大学教育是满意工作和高薪的跳板。 很多人把大学教育视为找到好工作、拿高薪的起点。 19 Although spending 10 to 15 hours a week in a fast-food restaurant doesn’t seem to take up too much time, it still reduces the time that should otherwise be spent studying. 尽管一周在快餐店花费10到15小时看起来不是很多,但是这仍然减少了本应该用来学习的时间。 参考译文:虽然每周在快餐店工作10到15个小时似乎并不占太多时间,但这仍然减少了学生本应用在学习上的时间。 **20 While self-reliance is a crucial quality that everyone should strive to develop, it is also vital that we learn how to accept other’s help. ** 参考译文:虽然自立是每个人都应该努力培养的重要品质,学会如何接受他人的帮助也是非常重要的。 21 Unemployment causes young people to suffer from an unstable income as well as the psychological stress of not knowing when they will get their next paycheck. 失业除了导致年轻人没有稳定的收入,还给他们增加了不知道下次什么时候获得薪水的压力。 参考译文:失业使年轻人收入不稳定,并承受不知何时才能再次领到薪水的心理压力。 22 The craze for government posts has become a phenomenon that cannot be ignored, and has stirred a heated debate. government posts 公务员 对公务员狂热的已经成为一种不可以忽视的现象,这引起了公众热烈的讨论。 参考译文:公务员热已经成为一种不能忽视的现象,引发了人们热烈的讨论。 23 The media could play an active role in encouraging energy-efficient measures. 媒体可以在鼓励节能上发挥出重要的作用。 参考译文:媒体在鼓励节能举措方面可以发挥积极的作用。 24 Another harmful human activity is our over-utilization of the limited farmland without allowing land the time it takes to replenish nutrients. 其他有害的人类活动还有对有限的土地的过度使用,导致它们没有时间恢复养分。 参考译文:人类进行的另一种有害活动是我们对有限农田的过度使用,而不给土地所需的补充营养的时间。 25 Urbanization has some negative effects on society as large concentrations of people compete for limited resources. 城市化对社会也有许多消极的影响,比如高度集中的人口争夺有限的资源。 城市化对社会有一些负面的影响,因为大量集中的人口要争夺有限的资源。 26 As a green lifestyle, a low-carbon life advocates low energy consumption, thereby reducing CO2 emissions. 与绿色生活类似,低碳生活提倡减少能源消耗,以此减少二氧化碳排放 作为一种绿色的生活方式,低碳生活提倡低能耗,由此减少了二氧化碳的排放量。","link":"/post/english-writing-01.html"},{"title":"「只言片语」| 2018/03/07","text":"多年之前阅读《读者》时,最喜欢杂志中的语丝栏目。所以准备向其致敬,收集每周我在阅读中收获的只言片语。 1. 学习 “当我在你们这个年纪,有段时间,远离人群,独自思索,我的人生到底应该怎样度过。某日,我偶然去图书馆,听到泰戈尔的演讲,而陪同在泰戈尔身边的人,是当时最出名的学者。那些人站在那里,自信而笃定,那种从容让我十分羡慕,而泰戈尔正在讲对自己的真实有多么重要,那一刻我从思索生命意义的羞耻感中释放出来,原来这些卓越的人物也会花时间思考这些,他们也觉得这些是重要的。” 语出《无问西东》的吴岭澜给学生介绍泰戈尔时。“自信而笃定”,简单五个字,回味无穷。 凡是机器或者人工智能能够代替的能力,就是不值得花时间去训练的能力;凡是不能迁移到其他领域的能力,也是不重要的能力。 机器学习的火热带来思考,如何才能避免自己在未来被替代。 只要你停下来认真思考一下就会明白,投资比特币简直愚蠢至极。这是不安好心的坏人们鼓吹的疯狂泡沫,引诱人们追求不劳而获、一夜暴富的妄梦…… 你知道,黄金之所以具备流通价值,是因为人类根本无法轻易地得到黄金,因此黄金才显得稀有。相信我,人类完全有能力创造出更多的比特币——尽管他们会告诉你由于种种限制无法这么做。千万不要相信这些鬼话,当好处足够多的时候,坏事就会发生。 根据所学为数不多知识判定,比特币之类的数字货币已经成为24小时不断线的赌场 2. 理性 总体来说,给我的感悟就是老罗成长了,做实事才是真正锻炼人的,相比罗振宇哪个挤眉弄眼心高气傲的样子,罗永浩讲起来自己的产品那种娓娓道来朴实坦诚的样子让我能容易喜欢。 语出知乎网友评价罗振宇对罗永浩的专访。记得有一段时间,疯狂地看罗永浩的演讲视频,完全被他的行为所喜迎,记得印象最深的一句是通过干干净净的赚钱,让人相信干干净净的赚钱是可能的。可不知道为什么不喜欢看《罗辑思维》,现在找到答案了。 对熟人宽容大度,对陌生人零容忍。 有另外一种印象:坏人远在天边,好人都近在眼前。 罗辑思维搞了四年,知乎上大家骂了四年。四年中罗辑思维从最初一个靠打赏的小书童,成长为一个创业者,继而成长成一个做平台的知识服务提供商,甚至邀请了一众精英在主流媒体和新媒体上大搞跨年演讲,钱赚得盆满钵满,影响力也是一日千里。而那些罗辑思维的黑粉,四年来又收获了什么?罗胖的一句话,黑粉真的可以好好琢磨琢磨,原话忘了,大概的意思是:我不会再否定一个人,因为否定他,是关闭了我自己观察世界的一扇门。 知乎网友对得到的评价。因为这个,开始接触一些自己之前无名抵触的东西,还是有收获的。 毕业20年之后,去参加一下同学聚会,不是要你去攀比人生成就,也不是要你去利用同学资源,而是看看人生20年长跑之后,决胜千里的东西究竟是什么,输掉人生长跑的东西又是什么? 我想不起来有什么真正的机会是稍纵即逝,追悔莫及的,我想不明白为什么人们非得那么迫不及待,惶惶不可终日。错过了成为 Netscape、Yahoo 的机会,你可以成为 Google ;错过了成为 Google 的机会,你可以成为 Facebook ;错过了成为 Facebook 的机会,你可以成为微信,成为滴滴,成为 ofo。如果区块链真的是一个大机会,它怎么可能会是一个手慢无的机会?况且,有哪个真正的大机会,从一开始就孕育出了空前绝后的大项目?有哪项有前景的伟大技术,不是慢慢成就它的伟大? 区块链或者数字货币火热的反思 3. 欢喜 世界于你而言,无意义无目的,却又充满随心所欲的幻想,但又有谁知,也许就在这闷热令人疲倦的正午,那个陌生人,提着满篮奇妙的货物,路过你的门前,他响亮地叫卖着,你就会从朦胧中惊醒,走出房门,迎接命运的安排。 泰戈尔《爱者之殆》,可能现实中叫醒你的就是你自己。 好看的皮囊是确实好看,有趣的灵魂是自以为有趣。 取“好看的皮囊千篇一律,有趣的灵魂独一无二”之反 4. 番外 Timetrack:计时软件,点击图标就能开始计时,配合 URL Scheme 直接跳转到你预设的 App 中。","link":"/post/excerpt-2018-03-07.html"},{"title":"博客折腾记:修复七牛云测试域名失效问题","text":"毕业之后开始工作快要 5 个月了,然后也快有 3 个月没有更新博客。其实文本编辑器中还有很多的草稿,但是一直没有力量驱动自己完结他们,并且分享出来。另外,这一段时间也不是完全没有分享。在这个页面的上方有一个 Tech 的标签,可以连接到我新搭的博客。受限于当前使用的 hexo 主题无法配置 latex 数学公式,所幸新开博客分享算法学习的笔记。大家感兴趣的可以访问一下,不过也没有太多的内容。 这次在博客公告中要告诉大家的确是另外一件事情。屋漏偏风连夜雨,不知道从什么时候开始,七牛云开始图片使用测试域名,毫无疑问这个博客的图片都挂了。自己也一直没有动力修复,让这一段时间访问我博客的小伙伴受累了。 今天研究了一下如何修复这个图床问题。官方有一个帮助页面如何配置域名的 CNAME - 七牛开发者中心,大概就是你的存储空间之前有一个测试域名(比如我的是 7xkpe5.com1.z0.glb.clouddn.com),现在不允许通过测试域名访问图片,需要绑定一个备案过的域名才可以。所以我们需要两个步骤完成改造:首先,给空间绑定一个域名(比如现在使用的是 media.xiang578.com );最后,在域名解析平台添加一个 CNAME,将你指定的域名转发到七牛的记录上。 完成上一步后,图片还是不能正常显示。因为之前的文章中,图片的链接都是以测试域名开头的,比如7xkpe5.com1.z0.glb.clouddn.com/15283589946007.jpg ,现在我们要将它改成 下面的形式 media.xiang578.com/15283589946007.jpg。简单的方法是打开文本编辑软件,然后使用查找替换功能,一个一个文件处理。显然这很无聊,而且进入 source/_posts 目录下利用 grep 7xkpe5 *.md | wc 统计了一个,我大概需要修改的有 142 处。 幸运地是 linux 系统下有两大文本处理利器 sed 和 awk。我们使用 sed 可以将一个字符串转换为另外一个字符串。网上搜索了一下用法,很快写了出来 1sed -i -r "s/7xkpe5\\.com1\\.z0\\.glb\\.clouddn\\.com/media\\.xiang578\\.com/g" *.md 这条命令中原始形态可以表示为 sed 's/原字符串/替换字符串/g'。其中参数 -i 代表替换文件中的所有匹配项,-r 代表批量替换支持扩展表达式。在原字符串和替换字符串中都出现了 \\.,应为 . 在 sed 命令中代表匹配任意单个字符,加上转移字符后可以代表它本身。最后 *md 代表对目录下的 md 文件进行处理。 运行完成之后,我们在统计一下测试域名和正式域名的数量,可以发现完美的解决了这个问题,图片又能正常显示。 所以,写下今天这一篇博客一切都是因为贫穷。如果有钱直接在主机上放置图片,有带宽提供出来访问,也就不会依赖七牛云了…… 2019.11.09 为了减少博客依赖服务,参考 图床从七牛云迁移到腾讯COS折腾笔记 | 思想就是武器 将所有的图片全部从七牛上下载,利用 COS 存储。","link":"/post/fix-qiniu-test-url-error.html"},{"title":"(FM) Factorization Machines","text":"Factorization Machines(FM) 由日本 Osaka University 的 Steffen Rendle [1] 在 2010 年提出,是一种常用的因子机模型。 FM 假设现在有一个电影评分的任务,给定如下如所示的特征向量 x(包括用户名、当前在看的电影、已经打分的电影、时间特征、之前看的电影),预测用户对当前观看电影的评分。 作者在线性回归模型的基础上,添加交叉项部分,用来自动组合二阶特征。 y^(x):=w0+∑i=1nwixi+∑i=1n∑j=i+1n⟨vi,vj⟩xixj\\hat y(x):= w_0 + \\sum_{i=1}^{n} w_ix_i + \\sum_{i=1}^n \\sum_{j=i+1}^n \\left \\langle v_i,v_j \\right \\rangle x_ix_j y^(x):=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj 其中交叉特征的权重由两个向量的点积得到,可以解决没有在模型中出现的特征组合权重问题,以及减少参数数量。 Wi,j=⟨vi,vj⟩=∑f=1kvi,f⋅vj,fW_{i,j}=\\left \\langle v_i,v_j \\right \\rangle = \\sum_{f=1}^kv_{i,f} \\cdot v_{j,f} Wi,j=⟨vi,vj⟩=f=1∑kvi,f⋅vj,f 通过下面的方法来化简交叉项权重计算,算法复杂度降到线性。 ∑i=1n∑j=i+1n⟨vi,vj⟩xiyi=12∑f=1k((∑i=1nvi,fxi)2−∑i=1nvi,f2xi2)\\sum_{i=1}^n \\sum_{j=i+1}^n \\left \\langle v_i,v_j \\right \\rangle x_iy_i = \\frac{1}{2}\\sum^k_{f=1} \\left( \\left(\\sum_{i=1}^nv_{i,f}x_i \\right)^2 - \\sum^n_{i=1} v^2_{i,f} x_i^2 \\right) i=1∑nj=i+1∑n⟨vi,vj⟩xiyi=21f=1∑k⎝⎛(i=1∑nvi,fxi)2−i=1∑nvi,f2xi2⎠⎞ 对交叉项部分的求导: ∂∂θy^(x)={1, if θ is w0xi, if θ is wixi∑j=1nvj,fxj−vi,fxi2,if θ is vi,f\\frac{\\partial}{\\partial \\theta} \\hat y \\left( x \\right) = \\begin{cases} 1, & \\text{ if $\\theta$ is $w_0$} \\\\ x_i, & \\text{ if $\\theta$ is ${w_i}$} \\\\ x_i\\sum^n_{j=1} v_{j,f}x_j - v_{i,f}x_i^2, &\\text{if $\\theta$ is ${v_{i,f}}$} \\end{cases}∂θ∂y^(x)=⎩⎪⎪⎨⎪⎪⎧1,xi,xi∑j=1nvj,fxj−vi,fxi2, if θ is w0 if θ is wiif θ is vi,f 其中 ∑j=1nvj,fxj{\\sum^n_{j=1} v_{j,f}x_j}∑j=1nvj,fxj 与 xi{x_i}xi 无关,可以在计算导数前预处理出来。 FM vs SVM 对于经典的特征组合问题,不难想到使用 SVM 求解。Steffen 在论文中也多次将 FM 和 SVM 做对比。 在考虑 SVM 的 Polynomial kernel 为 K(x,z):=(⟨x,z⟩+1)2{K(\\mathbf{x}, \\mathbf{z}) :=(\\langle\\mathbf{x}, \\mathbf{z}\\rangle+ 1)^{2}}K(x,z):=(⟨x,z⟩+1)2,映射 ϕ(x):=(1,2x1,…,2xn,x12,…,xn22x1x2,…,2x1xn,2x2x3,…,2xn−1xn)\\begin{array}{l}{\\phi(\\mathbf{x}) :=\\left(1, \\sqrt{2} x_{1}, \\ldots, \\sqrt{2} x_{n}, x_{1}^{2}, \\ldots, x_{n}^{2}\\right.} {\\sqrt{2} x_{1} x_{2}, \\ldots, \\sqrt{2} x_{1} x_{n}, \\sqrt{2} x_{2} x_{3}, \\ldots, \\sqrt{2} x_{n-1} x_{n} )}\\end{array} ϕ(x):=(1,2x1,…,2xn,x12,…,xn22x1x2,…,2x1xn,2x2x3,…,2xn−1xn) SVM 的公式可以转化为: y^(x)=w0+2∑i=1nwixi+∑i=1nwi,i(2)xi2+2∑i=1n∑j=i+1nwi,j(2)xixj\\begin{aligned} \\hat{y}(\\mathbf{x})=w_{0}+\\sqrt{2} \\sum_{i=1}^{n} w_{i} x_{i}+\\sum_{i=1}^{n} w_{i, i}^{(2)} x_{i}^{2} &+\\sqrt{2} \\sum_{i=1}^{n} \\sum_{j=i+1}^{n} w_{i, j}^{(2)} x_{i} x_{j} \\end{aligned} y^(x)=w0+2i=1∑nwixi+i=1∑nwi,i(2)xi2+2i=1∑nj=i+1∑nwi,j(2)xixj 论文中提到一句上面的公式中 wi{w_{i}}wi 和 wi,i{w_{i,i}}wi,i 表达能力类似,我猜这也是为什么 FM 中没有自身交叉项的原因吧。 FM 相比于 SVM 有下面三个特点: SVM 中虽然也有特征交叉项,但是只能在样本中含有相对应的特征交叉数据时才能学习。但是 FM 能在数据稀疏的时候学习到交叉项的参数。 SVM 问题无法直接求解,常用的方法是根据拉格朗日对偶性将原始问题转化为对偶问题。 在使用模型预测时,SVM 依赖部分训练数据(支持向量),FM 模型则没有这种依赖。 Rank FM 用来做回归和分类都很好理解,简单写一下如何应用到排序任务中。以 pairwise 为例。假设排序结果有两个文档 xi{x_i}xi 和 xj{x_j}xj,显然用户点击文档有先后顺序,如果先点击 xi{x_i}xi,记 label yij=1{y_{ij}=1}yij=1,反之点击 xj{x_j}xj,label yij=0{y_{ij}=0}yij=0。模型需要去预测 y^ij=sigmoid(y^i−y^j){\\hat y_{ij} = sigmoid(\\hat y_i - \\hat y_j)}y^ij=sigmoid(y^i−y^j)。 参考逻辑回归,用最大似然对参数进行估计,得到损失函数为 L=log(1+exp(−(y^(xi)−y^(xj)){L=\\log(1+\\exp(-(\\hat y(x_i)-\\hat y(x_j))}L=log(1+exp(−(y^(xi)−y^(xj))。优化过程和前面提到类似。 NFM NFM 和 AFM 两篇论文是同一个作者写的,所以文章的结构很相近。 FM 模型由于复杂度问题,一般只使用特征二阶交叉的形式,缺少对 higher-order 以及 non-liner 特征的交叉能力。NFM 尝试通过引入 NN 来解决这个问题。 NFM 的结构如下:第一项和第二项是线性回归,第三项是神经网络。神经网络中利用 FM 模型的二阶特征交叉结果做为输入,学习数据之间的高阶特征。与直接使用高阶 FM 模型相比,可以降低模型的训练复杂度,加快训练速度。 y^NFM(x)=w0+∑i=1nwixi+f(x)\\hat{y}_{N F M}(\\mathbf{x})=w_{0}+\\sum_{i=1}^{n} w_{i} x_{i}+f(\\mathbf{x}) y^NFM(x)=w0+i=1∑nwixi+f(x) NFM 的神经网络部分包含 4 层,分别是 Embedding Layer、Bi-Interaction Layer、Hidden Layers、Prediction Score。 Embedding Layer 层对输入的稀疏数据进行 Embedding 操作。最常见的 Embedding 操作是在一张权值表中进行 lookup ,论文中作者强调他们这一步会将 Input Feture Vector 中的值与 Embedding 向量相乘。 Bi-Interaction Layer 层是这篇论文的创新,对 embedding 之后的特征两两之间做 element-wise product,并将结果相加得到一个 k 维(Embeding 大小)向量。这一步相当于对特征的二阶交叉,与 FM 类似,这个公式也能进行化简: fBI(Vx)=∑i=1n∑j=i+1nxivi⊙xjvj=12[(∑i=1nxivi)2−∑i=1n(xivi)2]f_{B I}\\left(\\mathcal{V}_{x}\\right)=\\sum_{i=1}^{n} \\sum_{j=i+1}^{n} x_{i} \\mathbf{v}_{i} \\odot x_{j} \\mathbf{v}_{j} =\\frac{1}{2}\\left[\\left(\\sum_{i=1}^{n} x_{i} \\mathbf{v}_{i}\\right)^{2}-\\sum_{i=1}^{n}\\left(x_{i} \\mathbf{v}_{i}\\right)^{2}\\right] fBI(Vx)=i=1∑nj=i+1∑nxivi⊙xjvj=21⎣⎢⎡(i=1∑nxivi)2−i=1∑n(xivi)2⎦⎥⎤ Hidden Layers 层利用常规的 DNN 学习高阶特征交叉 Prdiction Layer 层输出最终的结果: y^NFM(x)=w0+∑i=1nwixi+hTσL(WL(…σ1(W1fBI(Vx)+b1)…)+bL)\\begin{aligned} \\hat{y}_{N F M}(\\mathbf{x}) &=w_{0}+\\sum_{i=1}^{n} w_{i} x_{i} +\\mathbf{h}^{T} \\sigma_{L}\\left(\\mathbf{W}_{L}\\left(\\ldots \\sigma_{1}\\left(\\mathbf{W}_{1} f_{B I}\\left(\\mathcal{V}_{x}\\right)+\\mathbf{b}_{1}\\right) \\ldots\\right)+\\mathbf{b}_{L}\\right) \\end{aligned} y^NFM(x)=w0+i=1∑nwixi+hTσL(WL(…σ1(W1fBI(Vx)+b1)…)+bL) 实验结果: AFM AFM(Attentional Factorization Machine), 在 FM 的基础上将 Attention 机制引入到交叉项部分,用来区分不同特征组合的权重。 y^AFM(x)=w0+∑i=1nwixi+pT∑i=1n∑j=i+1naij(vi⊙vj)xixj\\hat{y}_{A F M}(\\mathbf{x})=w_{0}+\\sum_{i=1}^{n} w_{i} x_{i}+\\mathbf{p}^{T} \\sum_{i=1}^{n} \\sum_{j=i+1}^{n} a_{i j}\\left(\\mathbf{v}_{i} \\odot \\mathbf{v}_{j}\\right) x_{i} x_{j} y^AFM(x)=w0+i=1∑nwixi+pTi=1∑nj=i+1∑naij(vi⊙vj)xixj 单独看上面公式中的第三项结构: Embedding Layer 与 NFM 里面的作用一样,转化特征。 Pair-wise Interaction Layer 是将特征两两交叉,如果对这一步的结果求和就是 FM 中的交叉项。 Attention 机制在 Attention-based Pooling 层引入。将 Pair-wise Interaction Layer 中的结果输入到 Attention Net 中,得到特征组合的 score aij′{a_{i j}^{\\prime} }aij′,然后利用 softmax 得到权重矩阵 aij{a_{ij}}aij。 aij′=hTReLU(W(vi⊙vj)xixj+b)aij=exp(aij′)∑(i,j)∈Rxexp(aij′)\\begin{aligned} a_{i j}^{\\prime} &=\\mathbf{h}^{T} \\operatorname{Re} L U\\left(\\mathbf{W}\\left(\\mathbf{v}_{i} \\odot \\mathbf{v}_{j}\\right) x_{i} x_{j}+\\mathbf{b}\\right) \\\\ a_{i j} &=\\frac{\\exp \\left(a_{i j}^{\\prime}\\right)}{\\sum_{(i, j) \\in \\mathcal{R}_{x}} \\exp \\left(a_{i j}^{\\prime}\\right)} \\end{aligned} aij′aij=hTReLU(W(vi⊙vj)xixj+b)=∑(i,j)∈Rxexp(aij′)exp(aij′) 最后将 Pair-wise Interaction Layer 中的二阶交叉结果和权重矩阵对应相乘求和得到 AFM 的交叉项。 和前一节的实验结果对比,AFM 效果比 NFM 要差一些。这大概就能说明为什么论文中提到 NFM,但是最后没有把 NFM 的结果贴出来,实在是机智。又回到,发论文是需要方法有创新,还是一味追求 state-of-the-art。 参考资料 深入浅出Factorization Machines系列 | Kubi Code’Blog FM模型在LTR类问题中的应用 - 知乎","link":"/post/fm.html"},{"title":"(FTRL) Follow The Regularized Leader","text":"FTRL 是 Google 提出的一种优化算法。常规的优化方法例如梯度下降、牛顿法等属于批处理算法,每次更新需要对 batch 内的训练样本重新训练一遍。在线学习场景下,我们希望模型迭代速度越快越好。例如用户发生一次点击行为后,模型就能快速进行调整。FTRL 在这个场景中能求解出稀疏化的模型。 基础知识 L1 正则比 L2 正则可以产生更稀疏的解。 次梯度:对于 L1 正则在 x=0x=0x=0 处不可导的情况,使用次梯度下降来解决。次梯度对应一个集合 {v:v(x−xt)≤f(x)−f(xt)}\\{v: v(x-x_t) \\le f(x)-f(x_t)\\}{v:v(x−xt)≤f(x)−f(xt)},集合中的任意一个元素都能被当成次梯度。以 L1 正则为例,非零处梯度是 1 或 -1,所以 x=0x=0x=0 处的次梯度可以取 [−1,1][-1, 1][−1,1] 之内任意一个值。 FTL FTL(Follow The Leader) 算法:每次找到让之前所有损失函数之和最小的参数。 W=argminW∑i=1tFi(W)W=argmin_W \\sum^t_{i=1}F_i(W) W=argminWi=1∑tFi(W) FTRL 中的 R 是 Regularized,可以很容易猜出来在 FTL 的基础上加正则项。 W=argminW∑i=1tFi(W)+R(W)W=argmin_W \\sum^t_{i=1}F_i(W) + R(W) W=argminWi=1∑tFi(W)+R(W) 代理函数 FTRL 的损失函数直接很难求解,一般需要引入一个代理损失函数 h(w)h(w)h(w)。代理损失函数常选择比较容易求解析解以及求出来的解和优化原函数得到的解差距不能太大。 我们通过两个解之间的距离 Regret 来衡量效果: wt=argminwht−1(w)Regrett=∑t=1Tft(wt)−∑t=1Tft(w∗)\\begin{array}{c}{w_{t}=\\operatorname{argmin}_{w} h_{t-1}(w)} \\\\ {\\text {Regret}_{t}=\\sum_{t=1}^{T} f_{t}\\left(w_{t}\\right)-\\sum_{t=1}^{T} f_{t}\\left(w^{*}\\right)}\\end{array} wt=argminwht−1(w)Regrett=∑t=1Tft(wt)−∑t=1Tft(w∗) 其中 w∗w^{*}w∗ 是直接优化 FTRL 算法得到的参数。当距离满足 limt→∞Regrettt=0\\lim _{t \\rightarrow \\infty} \\frac{\\text {Regret}_{t}}{t}=0limt→∞tRegrett=0,损失函数认为是有效的。其物理意义是,随着训练样本的增加,两个优化目标优化出来的参数效果越接近。 推导过程 参数 wt+1w_{t+1}wt+1 的迭代公式: wt+1=argminw{g(1:t)w+12∑s=1tσs∥w−ws∥2+λ1∥W∥1+12λ2∥W∥2}{w_{t+1}=argmin_w\\{ g_{(1:t)}w + \\frac{1}{2} \\sum_{s=1}^t \\sigma_s \\lVert w - w_s \\rVert ^2 + \\lambda_1 \\lVert W \\rVert_1 + \\frac{1}{2} \\lambda_2 \\lVert W \\rVert^2 \\}} wt+1=argminw{g(1:t)w+21s=1∑tσs∥w−ws∥2+λ1∥W∥1+21λ2∥W∥2} 其中 g(1:t)=∑s=1tgsg_{(1:t)}=\\sum^{t}_{s=1}g_sg(1:t)=∑s=1tgs,gsg_sgs 为 f(ws)f(w_s)f(ws) 的次梯度。参数 ∑s=1tσs=1ηt\\sum^t_{s=1}\\sigma_s=\\frac{1}{\\eta _t}∑s=1tσs=ηt1,学习率 ηt=1t\\eta _t = \\frac{1}{\\sqrt{t}}ηt=t1,随着迭代轮数增加而减少。 展开迭代公式 F(w)=g(1:t)w+12∑s=1tσs∥w−ws∥2+λ1∥W∥1+12λ2∥W∥2{F(w)= g_{(1:t)}w + \\frac{1}{2} \\sum_{s=1}^t \\sigma_s \\lVert w - w_s \\rVert ^2 + \\lambda_1 \\lVert W \\rVert_1 + \\frac{1}{2} \\lambda_2 \\lVert W \\rVert^2 } F(w)=g(1:t)w+21s=1∑tσs∥w−ws∥2+λ1∥W∥1+21λ2∥W∥2 F(w)=g(1:t)w+12∑s=1tσs(wTw−2wTws+wsTws)+λ1∥W∥1+12λ2∥W∥2{F(w)= g_{(1:t)}w + \\frac{1}{2} \\sum_{s=1}^t \\sigma_s ( w^Tw - 2w^Tw_s + w_s^Tw_s) + \\lambda_1 \\lVert W \\rVert_1 + \\frac{1}{2} \\lambda_2 \\lVert W \\rVert^2 } F(w)=g(1:t)w+21s=1∑tσs(wTw−2wTws+wsTws)+λ1∥W∥1+21λ2∥W∥2 F(w)=(g(1:t)−∑s=1tσsws)w+12(∑s=1tσs+λ2)wTw+λ1∥W∥1+const{F(w)= (g_{(1:t)} - \\sum_{s=1}^t \\sigma_s w_s)w + \\frac{1}{2} (\\sum_{s=1}^t \\sigma_s + \\lambda_2) w^Tw + \\lambda_1 \\lVert W \\rVert_1 + const } F(w)=(g(1:t)−s=1∑tσsws)w+21(s=1∑tσs+λ2)wTw+λ1∥W∥1+const F(w)=ztTw+12(1ηt+λ2)wTw+λ1∥W∥1+const{F(w)= z_t^Tw + \\frac{1}{2} (\\frac{1}{\\eta _t} + \\lambda_2) w^Tw + \\lambda_1 \\lVert W \\rVert_1 + const } F(w)=ztTw+21(ηt1+λ2)wTw+λ1∥W∥1+const 其中 zt−1=g(1:t−1)−∑s=1t−1σsws{z_{t-1}=g^{(1:t-1)} - \\sum_{s=1}^{t-1} \\sigma_s w_s}zt−1=g(1:t−1)−∑s=1t−1σsws。 对 F(w)F(w)F(w) 求偏导得到: zt+(1ηt+λ2)w+λ1∂∣W∣=0{z_t + (\\frac{1}{\\eta _t} + \\lambda_2) w + \\lambda_1 \\partial \\lvert W \\rvert = 0} zt+(ηt1+λ2)w+λ1∂∣W∣=0 www 和 zzz 异号时,等式成立。 根据基础知识里面提到的对于 L1 正则利用偏导数代替无法求解的情况,得到: ∂∣W∣={0, if −1<w<11, if w>1−1, if w<−1\\partial|W|=\\left\\{\\begin{array}{ll}{0,} & {\\text { if }-1<w<1} \\\\ {1,} & {\\text { if } w>1} \\\\ {-1,} & {\\text { if } w<-1}\\end{array}\\right. ∂∣W∣=⎩⎪⎨⎪⎧0,1,−1, if −1<w<1 if w>1 if w<−1 当 zt>λ1{ z_t > \\lambda_1}zt>λ1 时,wi<0{w_i < 0}wi<0 , wi=−zt+λ11ηt+λ2{w_i = \\frac{- z_t + \\lambda_1 }{\\frac{1}{\\eta _t} + \\lambda_2 }}wi=ηt1+λ2−zt+λ1 当 zt<−λ1{ z_t < - \\lambda_1}zt<−λ1 时,wi>0{w_i > 0}wi>0 , wi=−zt−λ11ηt+λ2{w_i = \\frac{- z_t - \\lambda_1 }{\\frac{1}{\\eta _t} + \\lambda_2 }}wi=ηt1+λ2−zt−λ1 当 ∣zt∣<λ1{ \\lvert z_t \\rvert < \\lambda_1}∣zt∣<λ1 时,当且仅当 wi=0{w_i=0}wi=0 成立 因此可得: wi={0, if ∣zi∣≤λ1−(zi−sgn(zi)λ1)ηt+λ2, if others w_{i}=\\left\\{\\begin{array}{ll}{0,} & {\\text { if }\\left|z_{i}\\right| \\leq \\lambda_{1}} \\\\ {\\frac{-\\left(z_{i}-\\text sgn(z_i) \\lambda_{1}\\right)}{\\eta_{t}+\\lambda_{2}},} & {\\text { if others }}\\end{array}\\right. wi={0,ηt+λ2−(zi−sgn(zi)λ1), if ∣zi∣≤λ1 if others FTRL 和 SGD 的关系 将 SGD 的迭代公式写成:Wt+1=Wt−ηtgt{W^{t+1}=W^t - \\eta _tg_t}Wt+1=Wt−ηtgt FTRL 迭代公式为:Wt+1=argminw{G(1:t)W+λ1∥W∥1+λ212∥W∥}{W^{t+1}=argmin_w\\{ G^{(1:t)}W + \\lambda_1 \\lVert W \\rVert_1 +\\lambda_2 \\frac{1}{2} \\lVert W \\rVert \\}}Wt+1=argminw{G(1:t)W+λ1∥W∥1+λ221∥W∥} 代入 ∑s=1tσs=1ηt{\\sum^t_{s=1}\\sigma _s= \\frac{1}{\\eta _t}}∑s=1tσs=ηt1 到上面的公式中,得到 Wt+1=argminw{∑ts=1gsW+12∑s=1tσs∥W−Ws∥22}{W^{t+1}=argmin_w\\{ \\sum_t^{s=1}g_sW + \\frac{1}{2} \\sum^t_{s=1}\\sigma _s\\lVert W - W_s \\rVert_2^2 \\}}Wt+1=argminw{∑ts=1gsW+21∑s=1tσs∥W−Ws∥22} 求偏导得到 ∂f(w)∂w=∑s=1tgs+∑s=1tσs(W−Ws){\\frac{\\partial f(w)}{\\partial w} = \\sum^t_{s=1}g_s + \\sum^t_{s=1}\\sigma _s( W - W_s )}∂w∂f(w)=∑s=1tgs+∑s=1tσs(W−Ws) 令偏导等于 0 :∑s=1tgs+∑s=1tσs(Wt+1−Ws)=0{\\sum^t_{s=1}g_s + \\sum^t_{s=1}\\sigma _s( W^{t+1} - W_s ) = 0}∑s=1tgs+∑s=1tσs(Wt+1−Ws)=0 化简得到:(∑s=1tσs)Wt+1=∑s=1tσsWs−∑s=1tgs{(\\sum^t_{s=1}\\sigma _s) W^{t+1} = \\sum^t_{s=1}\\sigma _s W^{s} - \\sum^t_{s=1}g_s}(∑s=1tσs)Wt+1=∑s=1tσsWs−∑s=1tgs 代入 σ\\sigmaσ:1ηtWt+1=∑s=1tσsWs−∑s=1tgs{\\frac{1}{\\eta _t} W^{t+1} = \\sum^t_{s=1}\\sigma _s W^{s} - \\sum^t_{s=1}g_s}ηt1Wt+1=∑s=1tσsWs−∑s=1tgs 根据上一个公式得出上一轮的迭代公式:1ηt−1Wt=∑s=1t−1σsWs−∑s=1t−1gs{\\frac{1}{\\eta _{t-1}} W^{t} = \\sum^{t-1}_{s=1}\\sigma _s W^{s} - \\sum^{t-1}_{s=1}g_s}ηt−11Wt=∑s=1t−1σsWs−∑s=1t−1gs 两式相减:1ηtWt+1−1ηt−1Wt=(1ηt−1ηt−1)Wt−gt{\\frac{1}{\\eta _t} W^{t+1} - \\frac{1}{\\eta _{t-1}} W^{t} = (\\frac{1}{\\eta _t} - \\frac{1}{\\eta _{t-1}}) W_t - g_t}ηt1Wt+1−ηt−11Wt=(ηt1−ηt−11)Wt−gt 最终化简得到和 SGD 迭代公式相同的公式:Wt+1=Wt−ηtgt{W_{t+1} = W_t - \\eta_t g_t}Wt+1=Wt−ηtgt FTRL 工程化伪代码 引用自论文 Ad Click Prediction: a View from the Trenches 下面的伪代码中学习率和前面公式推导时使用的一些不一样: ηti=αβ+∑s=1tgsi2\\eta_{t_{i}}=\\frac{\\alpha}{\\beta+\\sqrt{\\sum_{s=1}^{t} g_{s_{i}}^{2}}}ηti=β+∑s=1tgsi2α。Facebook 在 GBDT + LR 的论文中研究过不同的学习率影响,具体可以参看博文 Practical Lessons from Predicting Clicks on Ads at Facebook(gbdt + lr) | 算法花园。 例:FM 使用 FTRL 优化 FM 是工业界常用的机器学习算法,在之前博文 (FM)Factorization Machines 中有简单的介绍。内部的 FTRL+FM 代码没有开源,所以也不好分析。从 FM+FTRL算法原理以及工程化实现 - 知乎 中找了一张 FTRL+FM 的伪代码图片。 Reference Online Learning算法理论与实践 - 美团技术团队 FTRL公式推导 - 知乎 每周一文】Ad Click Prediction: a View from the Trenches(2013)_机器学习,CTR,online_fangqingan_java的专栏-CSDN博客","link":"/post/ftrl.html"},{"title":"All About GBDT (1)","text":"GBDT(Gradient Boosting Decision Tree) 从名字上理解包含三个部分:提升、梯度和树。它最早由 Freidman 在 greedy function approximation :a gradient boosting machine 中提出。很多公司线上模型是基于 GBDT+FM 开发的,我们 Leader 甚至认为 GBDT 是传统的机器学习集大成者。断断续续使用 GBDT 一年多后,大胆写一篇有关的文章和大家分享。 朴素的想法 假设有一个游戏:给定数据集 (x1,y1),(x2,y2),...,(xn,yn){(x_1,y_1),(x_2,y_2),...,(x_n,y_n)}(x1,y1),(x2,y2),...,(xn,yn),寻找一个模型y^=F(xi){\\hat y=F(x_i)}y^=F(xi),使得平方损失函数 ∑12(y^i−yi)2{\\sum \\frac{1}{2}(\\hat y_i - y_i)^2}∑21(y^i−yi)2 最小。 如果你的朋友提供一个可以使用但是不完美的模型,比如 F(x1)=0.8,y1=0.9F(x_1)=0.8,y_1=0.9 F(x1)=0.8,y1=0.9 F(x2)=1.4,y2=1.3F(x_2)=1.4,y_2=1.3 F(x2)=1.4,y2=1.3 在如何不修改这个模型的参数情况下,提高模型效果? 一个简单的思路是:重新训练一个模型实现 F(x1)+h(x1)=y1F(x_1)+h(x_1)=y_1 F(x1)+h(x1)=y1 F(x2)+h(x2)=y2F(x_2)+h(x_2)=y_2 F(x2)+h(x2)=y2 ...... ... F(xn)+h(xn)=ynF(x_n)+h(x_n)=y_n F(xn)+h(xn)=yn 换一个角度是用模型学习数据 (x1,y1−F(x1)),(x2,y2−F(x2)),...,(xn,yn−F(xn)){(x_1,y_1-F(x_1)),(x_2,y_2-F(x_2)),...,(x_n,y_n-F(x_n))}(x1,y1−F(x1)),(x2,y2−F(x2)),...,(xn,yn−F(xn))。得到新的模型 y^=F(xi)+h(xi){\\hat y=F(x_i)+h(x_i)}y^=F(xi)+h(xi)。 其中 yi−F(xi){y_i-F(x_i)}yi−F(xi) 的部分被我们称之为残差,即之前的模型没有学习到的部分。重新训练模型 h(x){h(x)}h(x)正是学习残差。如果多次执行上面的步骤,可以将流程描述成: F0(x){F_0(x)} F0(x) F1(x)=F0(x)+h1(x){F_1(x)=F_0(x)+h_1(x)} F1(x)=F0(x)+h1(x) F2(x)=F1(x)+h2(x){F_2(x)=F_1(x)+h_2(x)} F2(x)=F1(x)+h2(x) ...{...} ... Ft(x)=Ft−1(x)+ht(x){F_t(x)=F_t-1(x)+h_t(x)} Ft(x)=Ft−1(x)+ht(x) 即 F(x;w)=∑t=1Tht(x;w){F(x;w)=\\sum^T_{t=1}h_t(x;w)}F(x;w)=∑t=1Tht(x;w),这也就是 GBDT 。 如何理解 Gradient Boosting Decision Tree ? Gradient Boosting Decision Tree 简称 GBDT,最早由 Friedman 在论文《Greedy function approximation: a gradient boosting machine》中提出。简单从题目中理解包含三个部分内容:Gradient Descent、Boosting、Decision Tree。 Decision Tree 即决策树,利用超平面对特征空间划分来预测和分类,根据处理的任务不同分成两种:分类树和回归树。在 GBDT 算法中,用到的是 CART 即分类回归树。用数学语言来描述为 F={f(x)=wq(x)}{F=\\{f(x)=w_{q(x)}\\}}F={f(x)=wq(x)},完成样本 x{x}x 到决策树叶子节点 q(x){q(x)}q(x) 的映射,并将该叶子节点的权重 wq(x){w_{q(x)}}wq(x) 赋给样本。CART 中每次通过计算 gain 值贪心来进行二分裂。 Boosting 是一种常用的集成学习方法(另外一种是 Bagging)。利用弱学习算法,反复学习,得到一系列弱分类器(留一个问题,为什么不用线性回归做为弱分类器)。然后组合这些弱分类器,构成一个强分类器。上面提到的模型 F(x;w)=∑t=1Tht(x){F(x;w)=\\sum^T_{t=1}h_t(x)}F(x;w)=∑t=1Tht(x) 即是一种 boosting 思路,依次训练多个 CART 树 hi{h_i}hi,并通过累加这些树得到一个强分类器 F(x;w){F(x;w)}F(x;w)。 为什么 GBDT 可行? 在 2 中我提到 GBDT 包括三个部分并且讲述了 Boosting 和 Decison Tree。唯独没有提到 Gradient Descent,GBDT 的理论依据却恰恰和它相关。 回忆一下,Gradient Descent 是一种常用的最小化损失函数 L(θ){L(\\theta)}L(θ) 的迭代方法。 给定初始值 θ0{\\theta_0}θ0 迭代公式:θt=θt−1+Δθ{\\theta ^t = \\theta ^{t-1} + \\Delta \\theta}θt=θt−1+Δθ 将 L(θt){L(\\theta ^t)}L(θt) 在 θt−1{\\theta ^{t-1}}θt−1 处进行一阶泰勒展开:L(θt)=L(θt−1+Δθ)≈L(θt−1)+L′(θt−1)Δθ{L(\\theta ^t)=L(\\theta ^{t-1} + \\Delta \\theta) \\approx L(\\theta ^{t-1}) + L^\\prime(\\theta ^{t-1})\\Delta \\theta}L(θt)=L(θt−1+Δθ)≈L(θt−1)+L′(θt−1)Δθ 要使 L(θt)<L(θt−1){L(\\theta ^t) < L(\\theta ^{t-1}) }L(θt)<L(θt−1),取 Δθ=−αL′(θt−1){\\Delta \\theta = -\\alpha L^\\prime(\\theta ^{t-1})}Δθ=−αL′(θt−1) 其中 α{\\alpha}α 是步长,可以通过 line search 确定,但一般直接赋一个很小的数。 在 1 中提到的问题中,损失函数是 MSE L(y,F(x))=12(yi−f(xi))2{L(y, F(x))=\\frac{1}{2}(y_i - f(x_i))^2}L(y,F(x))=21(yi−f(xi))2。 我们的任务是通过调整 F(x1),F(x2),...,F(xn){F(x_1), F(x_2), ..., F(x_n)}F(x1),F(x2),...,F(xn) 最小化 J=∑iL(yi,F(xi)){J=\\sum_i L(y_i, F(x_i))}J=∑iL(yi,F(xi))。 如果将 F(xi){F(x_i)}F(xi) 当成是参数,并对损失函数求导得到 ∂J∂F(xi)=∂∑iL(yi,F(xi))∂F(xi)=∂L(yi,F(xi))∂F(xi)=F(xi)−yi{ \\frac{\\partial J}{\\partial F(x_i)} = \\frac{\\partial \\sum_i L(y_i, F(x_i))}{\\partial F(x_i)} = \\frac{\\partial L(y_i, F(x_i))}{\\partial F(x_i)} = F(x_i)-y_i}∂F(xi)∂J=∂F(xi)∂∑iL(yi,F(xi))=∂F(xi)∂L(yi,F(xi))=F(xi)−yi。 可以发现,在 1 中提到的模型 h(x){h(x)}h(x) 学习的残差 yi−F(xi){y_i-F(x_i)}yi−F(xi)正好等于负梯度,即 yi−F(xi)=−∂J∂F(xi){y_i-F(x_i)=-\\frac{\\partial J}{\\partial F(x_i)}}yi−F(xi)=−∂F(xi)∂J。 所以,参数的梯度下降和函数的梯度下降原理上是一致的: Ft+1(xi)=Ft(xi)+h(xi)=F(xi)+yi−F(xi)=Ft(xi)−1∂J∂F(xi){F_{t+1}(x_i)=F_t(x_i)+h(x_i)=F(x_i)+y_i-F(x_i)=F_t(x_i)-1\\frac{\\partial J}{\\partial F(x_i)}}Ft+1(xi)=Ft(xi)+h(xi)=F(xi)+yi−F(xi)=Ft(xi)−1∂F(xi)∂J θt=θt−1+αL′(θt−1){\\theta ^t = \\theta ^{t-1} + \\alpha L^\\prime(\\theta ^{t-1})}θt=θt−1+αL′(θt−1) GBDT 算法流程 模型 F 定义为加法模型: F(x;w)=∑m=1Mαmhm(x;wm)=∑m=1Mft(x;wt){F(x;w)=\\sum^{M}_{m=1} \\alpha_m h_m(x;w_m) = \\sum^{M}_{m=1}f_t(x;w_t)} F(x;w)=m=1∑Mαmhm(x;wm)=m=1∑Mft(x;wt) 其中,x 为输入样本,h 为分类回归树,w 是分类回归树的参数,α{\\alpha}α 是每棵树的权重。 通过最小化损失函数求解最优模型:F∗=argminF∑i=1NL(yi,F(xi)){F^* = argmin_F \\sum^N_{i=1}L(y_i, F(x_i))}F∗=argminF∑i=1NL(yi,F(xi)) 输入: (xi,yi),T,L{(x_i,y_i),T,L}(xi,yi),T,L 初始化:f0(x){f_0(x)}f0(x) 对于 t=1toT{t = 1 to T}t=1toT : 计算负梯度(伪残差): yi~=−[∂L(yi,F(xi))∂F(x)]F(x)=Fm−1(x),i=1,2,...,N{ \\tilde{y_i} = -[\\frac{\\partial L(y_i, F(x_i))}{\\partial F(x)}]_{F(x)=F_{m-1}(x)} ,i=1,2,...,N}yi~=−[∂F(x)∂L(yi,F(xi))]F(x)=Fm−1(x),i=1,2,...,N 根据 yi~{\\tilde{y_i}}yi~ 学习第 m 棵树: w∗=argminw∑i=1N(yi~−ht(xi;w))2{w^*=argmin_{w} \\sum_{i=1}^N(\\tilde{y_i} - h_t(x_i;w))^2}w∗=argminw∑i=1N(yi~−ht(xi;w))2 line searcher 找步长:ρ∗=argminρ∑i=1NL(yi,Ft−1(xi)+ρht(xi;w∗)){\\rho^* = argmin_\\rho \\sum_{i=1}^{N}L(y_i, F_{t-1}(x_i)+\\rho h_t(x_i;w^*))}ρ∗=argminρ∑i=1NL(yi,Ft−1(xi)+ρht(xi;w∗)) 令 ft=ρ∗ht(x;w∗){f_t=\\rho^*h_t(x;w*)}ft=ρ∗ht(x;w∗),更新模型:Ft=Ft−1+ft{F_t=F_{t-1}+f_t}Ft=Ft−1+ft 输出 FT{F_T}FT 说明: 初始化 f0{f_0}f0 方法 求解损失函数最小 随机初始化 训练样本的充分统计量 每一轮拟合负梯度,而不是拟合残差,是为方便之后扩展到其他损失函数。 最小化问题中,如果有解析解,直接带入。否则,利用泰勒二阶展开,Newton Step 得到近似解。 这一篇就先到这里,之后还会分享 GBDT 常用损失函数推导以及 XGboost 相关内容。如果有任何想法,都可以在留言区和我交流。 Reference 李航, 《统计学习方法》8.4 提升树 Freidman,greedy function approximation :a gradient boosting machine 【19年ML思考笔记】GBDT碎碎念(1)谈回归树的分裂准则 - 知乎 机器学习-一文理解GBDT的原理-20171001 - 知乎 GBDT入门详解 - Scorpio.Lu|Blog python - Why Gradient Boosting not working in Linear Regression? - Stack Overflow GBDT基本原理及算法描述 - Y学习使我快乐V的博客 - CSDN博客 GBDT的那些事儿 - 知乎","link":"/post/gbdt.html"},{"title":"Practical Lessons from Predicting Clicks on Ads at Facebook(gbdt + lr)","text":"**主题:**Facebook 2014 年发表的广告点击预测文章。最主要是提出经典 GBDT+LR 模型,可以自动实现特征工程,效果好比于人肉搜索。另外,文章中还给出一个 online learning 的工程框架。 问题: GBDT 如何处理大量 id 类特征 广告类对于 user id 的处理:利用出现的频率以及转化率来代替 id 特征放在 lr 中处理。 GBDT+LR 和 RF+LR 的区别 选出能明显区分正负样本的特征的变换方式,转换成 one hot 有意义 RF + LR 可以并行训练,但是 RF 中得到的区分度不高 收获: 数据支撑去做决策,收获和实验数量成正比。 CTR click through rate,点击率 评价指标: Normalized Entropy:越小模型越好 Calibration:预测点击数除以真实点击数 AUC 正样本出现在负样本前面的概率。 数据新鲜度:模型天级训练比周级训练在 NE 下降 1%。 GBDT 和 LR 模型采用不同的更新频率,解决训练耗时不同。但是 GBDT 重新训练之后,LR 必须要重新训练。 网络: GBDT + LR 利用 GBDT 模型进行自动特征组合和筛选,然后根据样本落在哪棵树哪个叶子生成一个 feature vector 输入到 LR 模型中。这种方法的有点在于两个模型在训练过程从是独立,不需要进行联合训练。 GBDT 由多棵 CART 树组成,每一个节点按贪心分裂。最终生成的树包含多层,相当于一个特征组合的过程。根据规则,样本一定会落在一个叶子节点上,将这个叶子节点记为1,其他节点设为0,得到一个向量。比如下图中有两棵树,第一棵树有三个叶子节点,第二棵树有两个叶子节点。如果一个样本落在第一棵树的第二个叶子,将它编码成 [0, 1, 0]。在第二棵树落到第一个叶子,编码成 [1, 0]。所以,输入到 LR 模型中的向量就是 [0, 1, 0, 1, 0] Online Learning 文章中提到的 Online Learning 包括三个部分: Joiner 将每次广告展示结果(特征)是否用户点击(标签) join 在一起形成一个完成的训练数据; Trainer 定时根据一个 small batch 的数据训练一个模型; Ranker 利用上一个模块得到模型预测用户点击。 注意的点: waiting window time:给用户展示广告之后,我们只能知道用户点击的广告,也就是模型中的正样本。负样本需要设置一个等待时间来判断,即超过某一个时间没有观测到用户点击某一个广告,就认为这是一个负样本。另外设置这个时间也是一个技术活,时间过短导致click没有及时join到样本上,时间太长数据实时性差以及有存储的压力。最后,无论如何都会有一些数据缺失,为了避免累积误差,需要定期重新训练整个模型。 request ID:人家的模型是分布式架构的,需要使用 request ID 来匹配每次展示给用户的结果以及click。为了实现快速匹配,使用 HashQueue 来保存结果。 监控:避免发生意向不到的结果,导致业务损失。我们的实时模型也在上线前空跑了好久。 实验: 有无 GBDT 特征对比 训练两个 LR 模型,一个模型输入样本经过 GBDT 得到的特征,另外一个不输入。混合模型比单独 LR 或 Tree 学习率选择 5 种学习率,前三个每一个特征设置一个学习率,最后两种全局学习率。 结果:应该给每一个特征设置一个不同的学习率,而且学习率应该随着轮次缓慢衰减。 GBDT 参数相关实验 前面的树会带来大量的收益,但是树越多训练越慢。 特征重要程度,累加不同树上某个特征的得分减少贡献。 两种特征: 上下文,冷启动的时候比较重要,与数据新鲜度有关。 历史史特征,权重比较大,关键在于长时间积累。 采样 训练数据大多,需要进行采样。 uniform subsampling :无差别采样。使用 10 % 的样本,NE 减少 1 % negative down subsampling :对负样本进行下采样。但不是负采样率越低越好,比如下面的图中0.0250就可能是解决了正负样本不平衡问题。最后的CTR指标结果需要重新进行一次映射。 Reference 回顾Facebook经典CTR预估模型 - 知乎","link":"/post/gbdt_lr.html"},{"title":"git pull 报错 MERGE_HEAD exists","text":"git pull 时,出现如下报错信息: 123error: You have not concluded your merge (MERGE_HEAD exists). hint: Please, commit your changes before merging. fatal: Exiting because of unfinished merge. 产生这个错误的原因可能是:以前 pull 下来的代码自动合并失败。解决方法: 方法一:放弃本地修改,直接覆盖。git reset --hard 以及 git pull 方法二:先 commit 然后再 pull 或 merge。","link":"/note/202404111048.html"},{"title":"GTD 实践 1 个月心得","text":"不知不觉混到大四,突然感觉有一堆事情把我压的喘不过气来。所以就想学习一种任务管理方法。GTD 正好在这个时候重新进入我的视线中。根据 wikipedia 上的介绍:GTD,全称 Getting Things Done ,中文一般翻译为搞定,是一种行为管理的方法,也是戴维·艾伦写的一本书的书名。GTD 的方法根据一个理念,大脑是用来思考的,好比计算机中的 CPU。所以,我们需要把要做的事情从大脑中移除,放在一个可靠的外部系统中,这就是 GTD 系统。 根据网上的教程,学习 GTD 第一步是阅读戴维·艾伦的书《搞定I:无压力工作的艺术》(读书笔记链接)。这本书,其实我在大一就借来看过,但是由于翻译的实在是太差了,所以没有看完就还回去了。所以这一次重新学习时,我选择从阅读《小强升职记》(读书笔记链接)开始,这一本书通过讲述一个职场新人小强的虚拟故事,介绍了很多任务管理、项目管理、个人心智成长的方法。最后,还阅读前人实践的心得。貌似 GTD 这几年不是很热门,很多文章都很旧了,没有太多的实际意义。我只推荐两个系列文章,第一个是申龙斌的博客园博客搞定GTD - 随笔分类 ,他践行 GTD 五年多的时间,写下很多心得体会,是很不错的参考资料,目前他选择在微信公众号(申龙斌的程序人生)中更新为主。最关键的一点,他也是一名007er。第二个是滴答清单与GTD时间管理知乎专栏,从名字中可以看出这个系列的特点。不要因为你不用滴答清单而错过里面的内容,毕竟 gtd 方法是通用的。 开始打造 gtd 系统之前,还需要挑选一些工具。《搞定》书中是介绍的是利用纸笔和篮子来完成gtd,这是一个不错的方法。但是,结合实际,我没有太多的实体材料,所以选择使用软件。前几年,我也使用过很多任务管理软件,有 2Do、奇妙清单和滴答清单等。考虑到目前使用的组合是 iPhone + MacBook Pro,所以我选择了 OmniFocus 。第一次打开这个软件简直让我头皮发麻,功能很强大,但是需要深度学习才能运用自如。我是跟着这一个教程OmniFocus 入门与进阶 - 少数派,才掌握初步的使用方法。OmniFocus 吸引我的是任务过滤功能,也就是透视。简单来说,通过定义一些规则,来展现你的任务。 介绍 gtd 时,我将结合下面这张图,来讲讲我是怎么做的。一般来说,gtd包括 5 个步骤:收集、厘清、组织、回顾和执行。 (一) 收集 对应图中开始的一步,将材料放入系统的工作篮(inbox)。这里的材料是一个很广泛的概念,可以是你要做的事、想读的一本书或者是要学的技能等等。根据最开始的介绍,成为一个可靠的系统,需要将你所有的材料都放进这个inbox。所以,你在打造系统前,需要找个空闲的时间(书中说是2天)和过去做一个告别,好好的把任务整理出来。 在第一次收集前,我利用幕布把自己的材料来源整理了一下,主要分布在手机和电脑的一些软件中。根据这张大纲的顺序,最后整理完成时大概有300多件。完成这一次整理后,再有要做的任务记录到inbox中,自己定时清空就完成这一步了。 (二)厘清 在完成上一步收集后,我们需要开始第一次过滤这些事情。从inbox的顶端开始一件件评估我们收集的事情,对于每一件事情,考虑这件事件需要现阶段去做吗?对于不需要去做的事情,我们需要将他们分成三类:垃圾(没有任何价值,直接抛弃)、将来/也许(以后有机会做,放在一个专门的列表中)、参考资料(需要时再来参考)。 (三)组织 这是GTD中最复杂的一步。我们把需要现阶段去做的事情继续分类:第一类是行动,只需要一步完成的任务,第二类是项目,需要执行多个步骤才能完成的任务。首先是项目,书中提供了一种分析项目的方法:自然项目分析法,通过这个方法可以有效的把项目搞明白。当然,对于我们这样的新手,虽然有了这个强力的武器,但还是不容易一开始就将项目拆解的明明白白。这时候,我们只需要考虑一个问题:下一步行动是什么?比如说,如果你看了我的文章,也想要学习 GTD ,这时候就有了一个项目:学习 GTD。由于你更本不知道这是什么东西,所以无法分析项目,所以只能考虑下一步行动:利用搜索引擎来搜索 GTD 相关的介绍。完成这个行动之后,下一步行动就可能变成去买几本书了。通过这种每次思考一步的方法,来完成大的项目。说完项目,接下来就是动作。这里又诞生了一个很厉害的方法:两分钟原则。如果在组织的时候,这个动作可以在两分钟之内完成,那就直接去完成它,不用下面的步骤,特别声明这里的两分钟指一种很短的时间。对于其他动作,你还要考虑是否可以由其他人完成,如果是直接去委托他人完成。对于有时间限制的事情,比如明天下午开一个会之类的,就要写进日程表来提醒了。如果都不是,那么就放进你的文件夹中,等待后续执行。 (四)回顾 可能有些奇诡,事情还没有执行,怎么就开始回顾了。是的,书中就是这么安排的。这里的回顾是指,看看你做了什么,有什么需要反思的。主要用两种方式,第一种:完成项目之后回顾;第二种:定时回顾,可以是日回顾、周回顾、月回顾以及年回顾。目前,我主要做的是日回顾和周回顾,日回顾主要是简单看一下做了什么,周回顾有专门的检查清单,以及会写回顾记录。 (五)执行 这里就要认识到任务管理的本质是管理任务,而不是帮你完成任务。所以,还是需要你去执行。GTD 提供的只是一种简单的挑选方法。当你没有空闲时,考虑当前的情景(在什么户外还是家中,有手机还是电脑),有多少时间可以用,当前精力(精力旺盛还是昏昏欲睡)以及有没有重要的事情需要做。综合这些情况,找出需要做的事情,然后去做吧。 最后,根据一些人的说法。GTD 执行一年之后,才能算是懂了,上面就是我这个执行一个月的菜鸟的见解。由于时间有限,GTD 的六个层次、三个原则、自然分析法都没有写到。更关键的是,也没有结合 OmniFocus 来写我是具体怎么执行的。总结一下,这一个多月来,我第一次认识到要做的事情居然有这么多,真是时不我待。用原来的方法确实能做很多事情,但是接触 GTD 之后,我开始关注目标制定以及回顾方面的实践。","link":"/post/gtd-one-month.html"},{"title":"杭电OJ AC200题","text":"有很多出去的学长学姐都是不知道把红宝书背了多少遍,又一次和XX聊天,他说我打赌你背的有些单词,你一辈子都不会用上,但是尽管如此,很多人都背下来,这就是毅力,就是韧性。有的人放弃了,有的人却坚持下来,不得不承认,只有耐得住寂寞的人最后才会成功。学习是一项孤独而崇高的事业。","link":"/post/hdu200.html"},{"title":"杭电OJ AC300题","text":"距离上次AC200题,过去了89天。 有很多出去的学长学姐都是不知道把红宝书背了多少遍,又一次和XX聊天,他说我打赌你背的有些单词,你一辈子都不会用上,但是尽管如此,很多人都背下来,这就是毅力,就是韧性。有的人放弃了,有的人却坚持下来,不得不承认,只有耐得住寂寞的人最后才会成功。学习是一项孤独而崇高的事业。","link":"/post/hdu300.html"},{"title":"杭电OJ AC400题","text":"距离上次AC300题,过去了106天。 有很多出去的学长学姐都是不知道把红宝书背了多少遍,又一次和XX聊天,他说我打赌你背的有些单词,你一辈子都不会用上,但是尽管如此,很多人都背下来,这就是毅力,就是韧性。有的人放弃了,有的人却坚持下来,不得不承认,只有耐得住寂寞的人最后才会成功。学习是一项孤独而崇高的事业。","link":"/post/hdu400.html"},{"title":"杭电OJ AC500题","text":"距离AC400题,过去了135天。 有很多出去的学长学姐都是不知道把红宝书背了多少遍,又一次和XX聊天,他说我打赌你背的有些单词,你一辈子都不会用上,但是尽管如此,很多人都背下来,这就是毅力,就是韧性。有的人放弃了,有的人却坚持下来,不得不承认,只有耐得住寂寞的人最后才会成功。学习是一项孤独而崇高的事业。","link":"/post/hdu500.html"},{"title":"hello world!","text":"由于与 hexo-leancloud-counter-security 软件冲突,将标题从 System.out.println("hello world!"); 修改成 hello world!。具体问题分析见 博客折腾记:hexo-leancloud-counter-security 与标题中的引号冲突。 除去前几篇为了测试hexo博客的各项功能所发的博文,这是为新博客所写的第一篇文章。标题取自刚开始学习编程语言时输出的字符串,“hello world!” 。 之前,在QQ空间、博客园、csdn上都开过博客,但是结果都不尽如人意。毕竟免费用人家的东西,也不能奢求什么都朝着自己的意愿改变,情怀本身就敌不过他们的kpi。除此之外,也可以自己购买服务器和域名架设博客。可受限于现阶段经济实力,上面的方法也无法实现。所幸github+hexo架设博客的方式,给了我创造一片自由空间的机会。 另外,学习编程之后,觉得可编程的才有安全感。就好像越来越排斥word格式的难控,转向markdown书写的轻盈。hexo是一种实现静态网页的方式,不过自己目前没有专门学习过网页编程,所以大体上采用人家的现成解决方案,再通过网上的文章对站点进行一些小的改造。 开通这个博客的目的在于发一些自己写的文章,以此记录自己的大学生活、学习过程。 于杭州。","link":"/post/hello-world.html"},{"title":"【滴滴 HierETA】Interpreting Trajectories from Multiple Views A Hierarchical Self-Attention Network for Estimating the Time of Arrival","text":"滴滴和华南理工在 2022 年 KDD 上发表的 ETA 论文,从多个视角解释轨迹,引入 Hierarchical Self-Attention Network 方法进行建模,最终在滴滴内部数据集上获得指标提升。 关键信息 论文地址:Interpreting Trajectories from Multiple Views: A Hierarchical Self-Attention Network for Estimating the Time of Arrival | Proceedings of the 28th ACM SIGKDD Conference on Knowledge Discovery and Data Mining 关键字:网约车 ETA、轨迹挖掘、Self-Attention 背景信息 下图是一个行程的轨迹(trajectory)示意图,任务是预测整个行程的到达时间。作者提出三种视图: Intersection-view 对应现实世界中的路口,其属性包括:红绿灯等待时间、交通灯数量、历史车通过流量。 link-view 连接两个路口的路,其静态属性包括:是否收费、道路宽度、道路等级。 segment-view 人工将 link 打断成多个小段,用来表示细粒度的局部交通情况(红绿灯前一条路可能不是全部拥堵,用segment来表示比link来表示更合理),但是在表征道路网络结构方面并不完全。 核心问题 传统 ETA 方法采用分治策略,将一个轨迹拆分成多个小段(segment-view),然后累加每个小段预测结果得到最终 ETA(实验结果中的 Route-ETA),显然这种策略会导致较大的累积误差。 多视图(Intersection、link、segment)建模困难,常规方法使用 segment 建模,不考虑 link,没有对同一个 link 多个段之间的一致性进行建模。 link 和 Intersection 的属性不一致,很难使用同一个网络去建模。 相关工作 文章中引用的相关工作主要包括三个方面:交通流预估(traffic flow prediction)、到达时间预估(travel time estimation)、自注意力机制。 GMAN:基于图的多注意力机制来预测交通状况 图学习通常会受到不相关的空间领域的负面影响(关注的区域越大月明显),并且这种影响会在训练过程中传播。 图建模被限制在很小的区域范围,在大规模城市系统中存在不足 DeepTTE:原始 GPS 轨迹序列 + geo convolutional network + LSTM (WDR) Learning to Estimate the Travel Time:Wide & Deep & RNN ConSTGAT 和 CompactETA 图建模 ETA DeepGTT: 深度生成模型学习 ETA 分布 HetETA :multi-relational network 学习时空数据表示 TTPNet:利用张量分解和图 embedding 从历史轨迹中学习速度和 emebdding 核心贡献 利用三个视图的层次关系对道路底层结构进行建模 分层自自注意力网络 Hierarchical Self-Attention Network 自适应自注意力网络 Adaptive Self-Attention Network 解决方案 模型结构分成三部分:Segment Encoder、Joint Link-Intersection Encoder 和 Hierachy-Aware Attention Decoder Segment Encoder 这个编码器主要作用是对同一个 link 的 sgement 进行时空建模: segment 特征是 [xjs[x^s_j[xjs,全局特征是 xr]x_r]xr] 利用 BiLSTM 处理 [xjs∣xr][x^s_j|x_r][xjs∣xr],正向和反向结果 concat 成 segment 的表示 HjsH^s_jHjs。 同一个 link 内 segement 记作 Hs=[H1s,…,Hns]∈Rn×dsH^s=\\left[H_1^s, \\ldots, H_n^s\\right] \\in \\mathbb{R}^{n \\times d_s}Hs=[H1s,…,Hns]∈Rn×ds 计算 j-th segment 和 link 内其他 segment 的全局相似度 GPj=QjKTdsG P_j=\\frac{Q_j K^T}{\\sqrt{d}_s}GPj=dsQjKT 计算 j-th segment 相邻 ω\\omegaω 个 segment 计算局部相似度 local sematic pattern ,这一步是捕获局部 segment 的依然,对拥堵转移进行建模。 LPj(k)={GPj(k),∣j−k∣≤ω−∞, otherwise L P_j(k)= \\begin{cases}G P_j(k), & |j-k| \\leq \\omega \\\\ -\\infty, & \\text { otherwise }\\end{cases}LPj(k)={GPj(k),−∞,∣j−k∣≤ω otherwise 用门控机制平衡全局和局部相似度的结果 Fjs=(1−zj)⊙Att(GPj)+zj⊙Att(LPj)F_j^s=\\left(1-z_j\\right) \\odot \\operatorname{Att}\\left(G P_j\\right)+z_j \\odot \\operatorname{Att}\\left(L P_j\\right)Fjs=(1−zj)⊙Att(GPj)+zj⊙Att(LPj) 控制参数通过 zj=σ(WhHjs+WgAtt(GPj)+WlAtt(LPj)+bz)z_j=\\sigma\\left(W_h H_j^s+W_g A t t\\left(G P_j\\right)+W_l A t t\\left(L P_j\\right)+b_z\\right)zj=σ(WhHjs+WgAtt(GPj)+WlAtt(LPj)+bz) 学习 所有 link 的 encoder 参数共享以及并行计算 Joint Link-Intersection Encoder 上一个解码器主要在 segment-view 上建模,缺少对 link 之间一致性建模,Joint Link-Intersection Encoder 考虑 link 和 intersection 交替出现的特点(一条路连接两个路口),同时在 link-view 和 intersection-view 维度建模,实现通过 segment-view 捕捉局部交通信息, link-intersection context 捕捉道路属性: 加权融合 segment 表示得到 link 表示 xil=∑j=1nγijhijsx_i^l=\\sum_{j=1}^n \\gamma_{i j} h_{i j}^sxil=∑j=1nγijhijs 权重计算方法 [[Attention]] γij=softmaxj(Wγhijs+bγ)\\gamma_{i j}=\\operatorname{softmax}_j\\left(W_\\gamma h_{i j}^s+b_\\gamma\\right)γij=softmaxj(Wγhijs+bγ) 得到 link 和 intersections 的表示后,分别用两个不同的 BiLSTM 编码(主要让两个向量长度相同)得到 Hil{H^l_i}Hil 和 Hic{H^c_i}Hic,concat 在一起得到 H^il=[Hil∣Hic]\\hat{H}_i^l=\\left[H_i^l \\mid H_i^c\\right]H^il=[Hil∣Hic] H^il=[Hil∣Hic]\\hat{H}_i^l=\\left[H_i^l \\mid H_i^c\\right]H^il=[Hil∣Hic] 经过 self-attention layer + resnet + ln 得到 {hil}i=1m\\left\\{h_i^l\\right\\}_{i=1}^m{hil}i=1m 考虑到相邻 link 之间的交通影响更加弱和稀疏,作者没有计算不同 link 之间的 local pattern,从而避免过拟合。 Hierachy-Aware Attention Decoder 层次感知注意力解码器 一个行程中不同的 sub-route 对于 eta 贡献是不一样的(比如拥堵的路口和道路对时间预估影响更大),引入层次感知注意力来计算最终 ETA: R=(1−λ)∑i=1m∑j=1nαijhijs+λ∑i=1mβihil\\mathcal{R}=(1-\\lambda) \\sum_{i=1}^m \\sum_{j=1}^n \\alpha_{i j} h_{i j}^s+\\lambda \\sum_{i=1}^m \\beta_i h_i^l R=(1−λ)i=1∑mj=1∑nαijhijs+λi=1∑mβihil hsh^shs 和 hlh^lhl 分别是 segment 和 link-intersection 的表示 link 的注意力 βi=softmaxi(fl(hil,xr))\\beta_i=\\underset{i}{\\operatorname{softmax}}\\left(f^l\\left(h_i^l, x^r\\right)\\right)βi=isoftmax(fl(hil,xr)),且 fl(hil,xr)=vTtanh(w1hil+w2xr+b)f^l\\left(h_i^l, x^r\\right)=v^T \\tanh \\left(w_1 h_i^l+w_2 x^r+b\\right)fl(hil,xr)=vTtanh(w1hil+w2xr+b) (xr 是全局特征) 计算 segment 之间注意力 αij=softmax(i,j)(βifs(hijs,xr))\\alpha_{i j}=\\underset{(i, j)}{\\operatorname{softmax}}\\left(\\beta_i f^s\\left(h_{i j}^s, x^r\\right)\\right)αij=(i,j)softmax(βifs(hijs,xr)),其中 β\\betaβ 是 link 重要性,实现在计算 segement 之间的重要性时,模型也能参考 link 重要性。 Hierachy-Aware Attention Decoder 让整个模型自适应选择不同表示粒度中最相关的特征(可以是几个 link 权重大,还是几个) 实验结论 从北京的 mae 上来看比其他方法好 5s 以上,更进一步分析,里程比较长的单提升效果更明显。 消融实验方法:有无 local 和 global 特征、有无路况信息、由于层次化结构等。mae 超过 1s 可以认为变化很大。 读后总结 层次化建模然后在利用 link 的 attention 对 segment 的 attention score 进行调整挺有意思的 遗憾没有线上实验结果,以及没有开放相关数据集,感觉 ETA 任务各家都有自己的数据集,然后不同方法之间没有太强横向可比性","link":"/post/hiereta.html"},{"title":"从零开始利用 hexo + Github/Coding 搭建个人博客","text":"更新历史 2015年8月15日:完成初稿 2017年10月05日:添加新主题 Even 相关内容 2017年10月11日:文章阅读次数统计 2018年1月19日:修改页脚 2018年3月26日:双更新 20220226: 首页隐藏指定文章 前几天自己在电脑上装Linux时,不小心把博客的数据文件夹给删了。无奈重新安装,同时写下这篇备忘录以防万一。当然,经历这个失误,看来也要利用网盘对博客的一些文件进行备份。 安装 git 和 Node.js 就是正常的在他们官网上下载最新版本,然后再点几下鼠标安装到你的电脑。不过,也许后面安装hexo时要设置node.js的环境变量,具体过程也可以百度到。 安装 hexo 打开gitbash(可能需要以管理员身份运行),利用npm命令安装。 1$ npm install -g hexo 安装成功后大概会在shell中出现下面这样的信息 部署hexo 比如我要安装在E盘hexo文件夹内,可以在gitbash中使用下面命令进行。如果你想明白这些命令是什么意思,可以百度cmd指令。(如无特殊说明,下面有的命令都在/E/hexo中使用gitbash完成) 12$ cd /E/hexo$ npm install hexo init 安装成功后大概会在shell中出现下面这样的信息 安装依赖包 基础功能包,采用下面的命令安装 1$ npm install deploy git功能相关插件,网上发布时用的…… 1$ npm install hexo-deployer-git --save 附加功能有sitemap和feed插件,如果你不懂这些也没有必要安装 12$ npm install hexo-generator-sitemap$ npm install hexo-generator-feed 第一次本地查看博客 执行以下命令,然后到浏览器输入localhost:4000查看。 12$ hexo g$ hexo s 默认大概是下面的样子 github相关部署和ssh设置 我的这些功能还可以用,所以没有重新设置。故不能详细论述,你可从下面参考链接中获得方法。 发布功能部署 编辑站点的_config.yml文件。你在部署时,要把下面的xiang578都换成你的账号名。 1234deploy: type: gitrepository: https://github.com/xiang578/xiang578.github.io.gitbranch: master 执行下列指令即可完成部署,中间需要输入github用户名和密码。 1hexo generate hexo deploy 安装主题(以NexT为例) 使用gitbash输入下面指令 12$ cd your-hexo-site$ git clone https://github.com/iissnan/hexo-theme-next themes/next 启用主题 修改Hexo目录下的config.yml配置文件中的theme属性,将其设置为next。运行hexo g和hexo s,并访问 http://localhost:4000,确保站点正确运行。 主题优化 参考相关主题的说明文档进行优化,或者访问使用相同主题的博客,查看博主相关文章。或者速成css和html自己改造。 next主题404页面改造 E:\\hexo\\public中创建404.html文件,复制下面代码,并保存,在配置文件中启用相关功能。 1234567891011121314<!DOCTYPE HTML><html><head> <title>404 - arao'blog</title> <meta name="description" content="404错误,页面不存在!"> <meta http-equiv="content-type" content="text/html;charset=utf-8;"/> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta name="robots" content="all" /> <meta name="robots" content="index,follow"/></head><body> <script type="text/javascript" src="http://qzonestyle.gtimg.cn/qzone_v6/lostchild/search_children.js" charset="utf-8"></script></body></html> 效果如下: 多说评论改造 参考 动动手指,给你的Hexo站点添加最近访客(多说篇) 效果如下: 域名绑定 域名可以在万网上购买,大体上流程和淘宝购物差不多。现在大部分域名第一年价格比较便宜,续费也可以接受。当然如果你非要买.集团这种上万的域名,那么请联系我,土豪做个朋友吧!域名是有兴趣可以选择购买,采用默认的github.io也不错。 首先在E:hexo\\public文件夹下创建名为CNAME文件(不要扩展名)接着输入你的域名。比如: 12xiang578.topwww.xiang578.top 接着在万网的域名控制台增加如下图所示的两个解析 为 next 主题添加分类 参考知乎hexo下新建页面下如何放多个文章? 去除 Coding Pages 等待跳转页面 根据常识,只需要修改主题下面跟页脚相关的代码即可。比如 Even 主题中相关的代码在 themes/even/layout/_partial/footer.swig。 然后在这个文件中添加如下的代码即可。 123<span class="hosted-by-coding-pages"> Hosted by <a href="https://pages.coding.me" style="font-weight: bold">Coding Pages</a> </span> 最后,在项目的 Pages 服务中勾选已放置 Hosted by Coding Pages,等待审核通过就去除等待跳转页面。 修改Even主题的首页 不知道为什么,我不是很喜欢首页那种标题和文章摘要的形式。所以,决定把首页改造成归档页面的形式。 这步改造的思路是将生成归档页面相关的代码复制到生成首页的模板上去。在 themes/even/layout 文件夹里面修改index.swig,具体如下: 12345678910111213141516171819202122232425262728293031323334353637383940414243{% extends "_layout.swig" %}{% import '_macro/post.swig' as post_template %}{% block title %} {{ config.title }} {% endblock %}{% block content %} <section id="posts" class="posts"> <section id="archive" class="archive"> {% if not page.prev %} <div class="archive-title"> <span class="archive-post-counter"> {{ _p("counter.archives", site.posts.length) }} </span> </div> {% endif %} {% for post in page.posts %} {% set year %} {% set post.year = date(post.date, 'YYYY') %} {% if post.year !== year %} {% set year = post.year %} <div class="collection-title"> <h2 class="archive-year">{{ year }}</h2> </div> {% endif %} <div class="archive-post"> <span class="archive-post-time"> {{ date(post.date, 'MM-DD') }} </span> <span class="archive-post-title"> <a href="{{ url_for(post.path) }}" class="archive-post-link"> {{ post.title }} </a> </span> </div> {% endfor %} </section> </section> {% include "_partial/pagination.swig" %}{% endblock %} 如果需要在首页显示所有的文章,可以参考 如何设置页面文章的篇数? 安装需要的插件,将 per_page 设置为0即可解决。 添加文章统计 参考 添加文章访问量统计以及 leanCloud,实现文章阅读量统计 自己使用时发现一个问题:每篇文章只有第一次打开时才显示阅读次数,而且计数都为1 参考Hexo搭建博客系列:(五)Hexo添加不蒜子和LeanCloud统计无标题文章中提到的创建 class 需要 数据条目的默认 ACL 权限 中选择无限制 修改页脚 未修改之前的页脚相关代码(themes/even/layout/_partial/footer.swig) 123456789101112131415161718192021222324<div class="copyright"> <span class="hosted-by-coding-pages"> Hosted by <a href="https://pages.coding.me" style="font-weight: bold">Coding Pages</a> </span> <span class="division">|</span> <span class="theme-info"> {{ __('footer.theme') }} - <a class="theme-link" href="https://github.com/ahonn/hexo-theme-even">Even</a> </span> <span class="copyright-year"> {% set current = date(Date.now(), "YYYY") %} &copy; {% if theme.since and theme.since != current %} {{ theme.since }} - {% endif %} {{ current }} <span class="heart"> <i class="iconfont icon-heart"></i> </span> <span class="author">{{ config.author }}</span> </span></div> 未修改之前的效果 双更新 同时在 github 和 coding 上更新,然后根据访问时的 ip 地址跳转到不同的服务上。 下图框中的 a 和 b 为两个库的地址。 github 项目中相关的地址修改 最后,域名解析服务中添加如下的解析方式。 自动备份博客相关的源文件 参考博文自动备份Hexo博客源文件 | Jolson’s Blog 设置首页隐藏指定文章 参考 Hexo 设置首页隐藏指定文章 - 简书 文档 YAML 中增加一个参数 notshow: 控制是否展示 修改主题 index.swig 123{% for post in page.posts %} {{ post_template.render(post, true) }}{% endif %} 改成 1234{% for post in page.posts %} {% if post.notshow != true %} {{ post_template.render(post, true) }}{% endif %} 大概这样就完成一个博客的安装和部署,接下来你就可以快乐的写博客。 参考文章 献给写作者的 Markdown 新手指南 hexo系列教程:(二)搭建hexo博客 hexo官方网站 Hexo 使用中遇到的问题总结 如何搭建一个独立博客——简明Github Pages与Hexo教程 动动手指,NexT主题与Hexo更搭哦(基础篇) 从零开始制作 Hexo 主题 Hexo 主题开发指南","link":"/post/how-to-build-a-hexo-blog.html"},{"title":"使用 TaskPaper 实现 3 Things","text":"这几个月,一直在尝试 GTD 方法。有没有改善生活不知道,反正是软件尝试了一个又一个。前几天,又接触到了一款纯文本任务管理软件——Taskpaper。简单的尝试了一下,发现可以将这款软件结合进入 3 things 体系。 3 Things 看过很多时间管理的方法之后,才明白时间是不可以管理的。一个人独处的时候,明知道有很重要的考试需要准备,但还是会不知不觉地打开手机刷微信。很多时候,需要管理的不是时间,而是欲望。所以,在自我控制力很弱时,时间管理会加重你的疲劳感。 说到底,一个人的精力优先,能做的事情也很少。有一个很有名的原则叫做“二八原则”,套入到这里来就是,我们的生活是由 20% 的关键任务 + 80% 的普通任务组成。在理想的状况下,我们应该将 80% 的时间投入到那些 20% 的重要任务中。如何安排这 20% 的任务时,3 Things 的体系就孕育而生了。3 Things 指的是每天优先挑选出最关键的三件事情,优先处理。这三件事情的选择,需要结合你自身的目前情况、长久目标而决定。对于这个选择,你可以问自己,如果完成了其他事情,没有完成这三件事情,这一天不合格吗?如果完成了这三件事情,而没有完成其他事情,这一天合格吗? Taskpaper 如同前文所说,Taskpaper 是一款纯文本软件,所以界面非常的简洁。下图右侧就是他的主界面,和大家经常使用的文本编辑器没有太大的区别。软件通过一些语法来实现任务管理,比如 : 实现一个项目,用 - 实现一条任务,再使用 @开头实现标签。软件更强大的地方在于,可以自定义 CSS 文件,所以可以很轻松地将一些标签搞上不同的颜色。 有点遗憾的是,TaskPaper 只用 macOS 版本,其他平台只能通过文本编辑器+插件的方式实现,比如 Sublime Text 中有一个能实现类似功能的插件 aziz/PlainTasks: An opinionated todo-list plugin for Sublime Text editor (version 2 and 3)。 系统工作流 其实,能想起来用 Taskpaper 做三件事情,是受到了《18分钟》:如何用18分钟变身效率达人?| 狗熊月读64影响。视频中,大狗熊老师介绍了一个习惯,会每天在文本文档中,列出5项需要完成的任务(对的,比三件事情多出了两项),而且会对事情进行估计,包括四象限中的位置、预计完成时间以及和自己人生的那个目标有关。 四象限法则是时间管理中的一个重要理论,它将我们需要处理的事情分成了下图显示的四类,并且指导在日常生活中应该关注重要但是不紧急的事情,也就是第二象限。 一般的 GUI 任务管理软件,列出事情还算比较方便,但是做评论却没有那么便利。TaskPaper 比起在文本文档中直接写,体现出强大的整合能力。比如,我可以选定 MachineLerninginAction 的标签,可以快速的将我之前安排过的相关任务整合到一起。 所以,每天晚上睡觉前的 10 分钟,我会回顾一下今天完成的事情,并给第二天安排需要做的 3 Things。确保第二天醒来,我可以直接开始做当天的重点。达到从头到尾、逐一处理、不避不拖、一次一事的 GTD 执行境界。 参考 纯文本任务管理思考 · Issue #11 · xiang578/xiang578.github.io 重回纯文本,兼谈电子化时代 GUI 工具的弊端与反思 GTD · Issue #288 · JimmyLv/jimmylv.github.io TaskPaper 使用指南的所有文章 - 少数派","link":"/post/how-to-use-taskpaper-to-do-3-thigns.html"},{"title":"2016年北京区域赛","text":"今年,一队发挥出色,拿到全部赛区的名额,而且大三也没有多少队伍。所以我们这种弱队还有机会去参加第二场比赛。 作为第三次去北大,流程都是非常熟悉的。周四下午坐Z10出发,第二天上午到达北京。周五下午我一个人去了前两次来北京都没有机会参观的故宫。 故宫之旅并不是很好,主要是游客太多,紫禁城失去了往日的威严。不过,另外加收门票的钟表馆很棒,皇室的藏品居然如此花哨。有些钟表的滴答声一百多年之后依旧飘荡在场馆之内。出了故宫之后,走了半个小时才找到一个地铁站,这个设计非常的愚蠢吧,之后就动身前往北大。 周六下午热身赛,我们出来的比较早,在体育馆的看台上做了一会儿,看着下面排列整齐的两百多台电脑,心中生出一丝感动。之后就是进入场馆搞事情,电脑是五位数的戴尔移动工作站,外接了鼠标、键盘、和显示器。和我自己在寝室里面干的差不多。海巨表示显示器大看着爽,不过也发现键盘上有日文符号,这就比较影响我的发挥了。然后是例行看一下 周围的队伍,前面是北师、后面是北航、右上方有杭电一队,感觉压力又好大,虽然他们根本不会在乎我们。 比赛开始之前,队友想起在大连时,我讲了一句热身赛只要看一下AC是什么颜色就好了,最后被我成功奶死,全部是WA,所以告诫我不要乱说话。拿到题目之后,我们看了一下,发现题目是前几年北大出的区域赛和网络赛的。其中B题还是我们前几周训练过的题目,我拿起键盘表示这次终于有机会拿个一血了,马上写了起来,队友还是表示不相信。当我写完提交后,邪恶战胜了正义,果真发挥了一个WA,此时其他有一个队伍拿到这题的一血,彻底骨折。所幸改了一下还是过了,之后C题也是原来写过的,上去写了一下就过了。之后就讨论了一会儿A题,不过没有得出什么答案,感觉暴力上去肯定会超时,D题也不会写,最后上去让海巨测了一下机器和各种返回就去吃饭了。晚上回去才发现A题比我们想的还要暴力,没有勇气啊。 由于我们知道不会来北大吃太多餐,所以晚饭比较丰盛。一遍吃一遍感叹北大的伙食真好,早知道原来好好读书了。回到宾馆后,海巨在找题目写,翔哥想着阴阳师靠他的符偷渡欧洲,我看着炉石直播学习技术。又是一天。 周日,因为经费紧张,住的宾馆离北大比较远,我们三个7点就出发了,8点半左右到达北大赛场,然后等待比赛的开始。 9点比赛正式开始,开场顺利的写完了两道签到题,然后我们看了一下一道搜索题,我感觉可以写了,另外两个人去看了一下I题。我写差不多后,海巨上来写了I,也很快的写完并提交了,不过返回了WA。换我上去继续写搜索题,很快我写的超时了,只好改的优雅一点,翔哥也指出海巨理解错了题目,他们两想了一下决定帮我一起改搜索题,小改了一些东西之后,又提交了两次,返回两个WA。当时我们很紧张了,不过没有办法,海巨在看代码,我在写最暴力的准备对拍,翔哥在那里构造数据。最后,翔哥构造出了一组强力的数据,成功把我的代码hack了,我发现改掉一点就会对,不过没有想明白怎么回事,就改了一下记录答案的方式,最后自信的提交返回AC。然后我们将目光聚集到了K题,这个破题,题目就看了好久才明白,不过数据范围居然有10的100次方,我们搞了好久才都没有想出来,我感叹了已经上次在大连也是死在这种恶心的题目上,还是要想,我们写了一个10的9次以内的暴力程序打表,神奇的发现最大符合要求的个数只有样例给的83个,然后他们开始推规律,我在那里划水。想着写不出来,只要让海巨上去写一个只要83个答案表的程序,赌一发梦想。虽然感觉北大不会蠢到把最后一个答案告诉你,海巨还是写了,不过交上去还是WA。之后就陷入了江局,封榜后一会儿,我算了一下发现15位数随便填的情况下1就有10的16次左右个了,果断抢来电脑,不知道是什么力量让我点开海巨WA的代码,我看了一下差点吐血,找一个最大不超过n的值被写成立找一个最小超过n的值,我问了一下海巨,他还不知道,我直接改了一下就交上去,再赌一个梦想,然后就AC。我们马上点开排名,不过只能现实封板前的排名103,这题交了应该会前进一些,但是北大只有93个奖牌。海巨表示把I题写了才能稳,我看了一下I题,果断表明我不会数学题,只能靠你们了。然后实力分析一波之后,感觉要ntt操作,找了一下发现没有带这个模版,只好告诉海巨要么你想个其他的方法,要么自己创造一个ntt算法。我也没有找到其他组说的图论题是哪一个,只好提前选择死亡,吃起了发的午餐,果真像赛前说的一样吃东西就等于放弃了,最后还有10分钟结束的时候,我们三个人都愉快的吃起了午餐,把自己的命运交给其他小笨蛋来掌握。边吃边感叹这是第一次在正赛封榜后过题以及终于不是什么题数靠前的队伍了。 比赛结束之后,不知道结果怎么样,我们只好在那里等待,这要是在之前可以直接会师火车站了。北大搞了一堆事情,才开始滚榜,判完我们题目的时候好像跳到了81名去了,他们两个开始统计超过我们的人,又过了一会儿,发现最后名次固定在了85名,然后三个人都好高兴。滚完铜牌区之后,开始颁奖,我也有幸登上北大的领奖台。之后,那些也和我们没有什么关系了,反正两年多的努力有了回报就可以。 从北大出来,直奔麦当劳买了一下晚餐就去火车站了。我特地点了一杯拿铁,稳如拿铁。还是要相信科学。","link":"/post/icpc-beijing-2016.html"},{"title":"2017年上海 ACM/ICPC ECL-Final","text":"前几周和教练申请,愿意自费出去比赛,所以才有了这一次机会。这也是3年多以来第一次自费出来。 今年的比赛时间安排不是很好,可能是区域赛安排到了12月初的原因。由于周六要参加六级考试,我是那天晚上坐高铁前往上海的,幸亏这些都是轻车熟路。唯一值得记一下的是,我从场中路地铁站出来后,周围比较冷清,只好用滴滴打车去宾馆,这一次司机直接开到推荐上车点来接到我,没有使用电话沟通。前几个月在北京实习时,弦哥经常在内部说这个功能的重要性,可以给滴滴剩下近千万的虚拟号码开销。现在终于享受到了这个好处。 来到宾馆之后,找队友拿了队员证以及衣服。惊喜的是今年谷歌送的小礼品是 Google Cardboard ,平民级别的 VR 眼镜,记得之前内核恐慌里面听 Rio 他们提起过。拿到之后研究了一下,确实蛮有意思的。 由于前几个月在学校内修仙比较严重,睡得比较晚,导致第二天8点10多分,听到外面有人的动静才起来。匆匆的洗漱了一下,就和同学一起前往上海大学。 到达比赛现场之后,惊奇地发现,他们已经把午餐给发下来了,所以直接开始吃零食…… 刚开始都比较正常,我也在那里简单地看看题目。然后,看都L题,题目比较简单,看起来像是一道博弈题,由于没有上机的机会,所以我知道简单的推一下,大概推了10以内的情况,我认为自己找到了规律,所以上去写,不过第一次没有通过。下来之后,我再推了一下16的情况,明天自己刚才错在哪里,所以就重新上去写了一下。在111分钟的时候,我们通过了这一题。最后半小时内,我和老王一起写H题,凭借着他强大的逻辑能力,在289分钟的时候通过了。最后由于人多人会写的J题,我们没有通过,所以只有以7题遗憾结束。 算上打星队伍的排名大概是73名,获得银奖。 最后在等待领证书的时候,一个志愿者突然跑过来,问我们要一包零食,说上午到现在都没有吃东西。我拿出一包豆腐干给了他,祝福每一个努力拼搏的人。ACM生涯在续费一年之后,就结束了。 照片不知道为什么不能调整方向,就放在这里治疗颈椎病吧","link":"/post/icpc-ecl-shanghai-2017.html"},{"title":"2017年西安区域赛","text":"怎么开头呢? 10月20多号的时候,教练通知我们,一定要在赛前训练一场。仔细一想,上次训练在5个月前……整容倒是没有太大变化,周神(通过微软、腾讯、今日头条、京东和拼多多面试)和God王(曾经在阿里实习过),三个人暑假都在外面实习,回到学校之后也没有心情训练。10月25日(周三),我们拉了一场貌似是印度那边的区域赛,打了一下,感觉手感还行。周四就带着学弟学妹们坐火车前往西安,这也是我校继2015年EC-final之后,再一次派出多支队伍去打区域赛。 周五上午抵达西安站,由于一些情况,果断卖掉学弟学妹,我和队友3个人提前打车去了酒店。到达之后,发现他们离酒店还远,就在旁边找了一家饭店吃法。点了几个菜,到现在都觉得手撕羊肉不错,毕竟60多一斤。然后,就是常规的办理入住手续。上半年过来的时候和其他学校一起住在别墅,还能泡温泉,美滋滋。这次人来太多,经费紧张,就只能让我们住在标间。虽然环境还是可以吐槽的,但至少有wifi可以用了…… 晚上,一群人又出去吃了一顿火锅,西安的物价真便宜,最后剩下好多蔬菜没有吃…… day1 热身赛 早上起来之后,发现喉咙有点痛,和队友表达了明天可能会失声的担忧,并且表示不想去医院看,看好了多尴尬。10点左右集结队伍徒步前往西北工业大学。 这次比赛的地点和上一次不一样,终于搬到了体育馆。不过确实大,都能放下350+队伍,多年之后会不会有学校租个鸟巢打比赛?领完衣服,拍了照片。我们就高兴的去了食堂吃饭。吃完之后,我和周神一起去校园逛了一下,果真是强校,实在是太大了。 下午3点左右,抵达比赛场地,准备热身赛。老王让我上去打一些头文件,我感觉,如果今天一道题目都不会写,不是就白打了吗?队友想了一下,只能无奈地看着我…… 比赛开始之后 我快速地看完A题,说了一下题意,队友就开始写了。在决定猜什么数字的时候,周神强烈要猜2017,我说了一句傻子才会猜2017,然后他们就Yes了,我无法可说…… B题,简单模拟题,周神搞了一下就通过了。 最后就是C题,三个人一起看了好久,没有什么想法。我开始自告奋勇地说要写一个暴力,他们奇迹般的同意了我的方案。于是就获得了上机的机会,写到一半时,后面的队伍就欢呼通过了C题。综合他们一系列的反应来看,绝对是暴力过的,我的心也就放下了。由于好久没有写题目,所以用几分钟调试。通过这题之后发现,排名居然是第三,而且和第一名才差1分钟。毫无疑问,队友对我展开批判,痛失热身赛冠军…… 之后的时间就是学习其他人大佬,一顿乱试。时间还有多,队友上机打了一个表,验证一个猜想,就想出了C题的标算。最后,实在没有什么可以干了,决定提前半小时离场吃饭……路上队友怕今天把明天的人品败光,我告诉他,正真的共产主义者是无所畏惧的。这样我们高高兴兴地吃完了晚饭,然后搭车回到了秦龙。 晚上,一个队友在网上认识的河南农业大学大佬请他吃烧烤,我又跟过去混了一顿。和他们聊了一下子,我说了一句,你们一定会成功的。果不其然,青岛赛区他们获得了银奖…… day2 正赛 参加过这么多场比赛,第一次遇到口号是“安全第一”的赛区,周神的祖传行李箱不让带,所以他去寄存。我抱着一大堆书籍和打印的资料走进了体育场,路上还听到有人议论。从赛后来看,这些东西都没有用到…… 比赛开始后,一切都比较顺利。老王单人ACB题,周神一秒钟猜出了F的公式,然后我就鼓励他们不用想其他样例就把猜想给交了。85分钟地时候,老王不动声色的AC了G。看完H题意之后,我和周神说这个贪心地取就好了。他想了一下,决定用线段树。然后在他快要写完的时候,我看有那么多人都过了,感觉不是很像,后来出来一问,暴力也能通过…… 之后做的是L题,有关lol的题目。前一天翔哥还和我吹周神是财经faker,但我发现他居然不知道banpick,于是乎解释了好久。看完第一个样例的后,我决定自己算一下。这时候,突然弹出一个公告,告诉我们怎么计算样例,就这样完全明白了题意。然后队友就给了一个任务,让我去把第二组样例打出来……500个01组成的字符串,我机智的想到去讨论版提问,能不能发送一份样例过来,毫无疑问的no response……所幸老王想出了4个for循环的暴力,复杂度高达10*1e8,出于对西安赛区判题机的信任,他就开始写了。然后,懒得输入样例,膨胀到在写完之后就交。果不其然wa了,多组输入忘记数组清空,改。又是一发wa,看了一下有操作逻辑写反了,再改,AC。接下来就是自我安慰把这40分钟当成输入样例的时间…… 之后我们就陷入长达1个小时的僵局,三个人看着A题感叹世界真是神奇……后来老王不得不放弃这一题,从而转战K题,想了半个多小时,就开始上机码。写完的东西神奇的re了,然后派出换上周神上去改。不知道后来发生了什么,折腾到269分钟AC。之后就是估计排名时间,根据封榜前的排名估计了一下我们大概在32名左右,感觉有点悬……又开始对A题进行一顿乱搞,在最后几分钟里面提交了好多次,但是都没有返回结果…… 离场前气球合影,可惜最后一小时过的题目不发气球。 所以带着最后的悬念来到了颁奖典礼,在等待的过程中,发现学弟遗憾的只是铜首……滚动46名时,发现我们飘到32名。再加上看到下图是,我在学校的群里说了一句最差34名,就这样获得了自己的第一块区域赛金牌,学校acm史上的第二金。 最终排名也是32名,这个世界真是神奇。 然后又是我上台高高兴兴地领奖。 三人合影留念 搞完这些之后,坐着校车来到了韦曲南站。我带头冲向上半年吃过的烧烤店,后来发现,老王没有一个能吃的,真是尴尬,其他人也没有什么兴致,最后就当我请客了……然后在旁边找了一家宾馆就睡下了…… day3 归来 12点左右,在火车站附近开了一间房,把我们的行李都放下了。然后,在周神的带领下,前往回民街。逛了好久,没有太多意思。19点火车返程杭州。西安区域赛就这样结束了…… 最后还要感叹一下,周神和老王还真厉害,带着我都能获金奖,不过说回来还是喜欢去年自己在北京拿的铜。自己的贡献是一场比一场小……如果没有ec-fianl的话,acm生涯到这里就结束了吧,也留下一些遗憾,如果有来生,我也愿意信来生,再见……","link":"/post/icpc-xian-2017.html"},{"title":"如果,高一","text":"1序 受《如果,宅》影响下编出来的东西,博君一笑。 2某星期三下午 学术报告厅内听校长讲座 校长:“同学们要根据自己未来的职业选择来读文理科。” 主任:“我要当领导,选什么?” 我:“退学!” 过了一会…… 我:“先去泰国做手术,再找个干爸爸……” 主任:…… 3语文课讲《烛之武退秦师》 老师:“烛之武为什么要这样讲,我们先看一下当时的中国地图。” 我纳闷了,没电脑,没插图,怎么看? 只见老师麻利地檫干净了黑板,化画了三个圈,分别写上秦晋郑。 老师:“当时秦国在这里,晋国夹在秦郑中间。” 4某天听力训练 主任写的不耐烦了,大叫并伴灿烂的笑容:“信B叔,得永生。” 于是写下了B B C 翻开答案一看:B C C 我:“B叔还是太年轻了。” 5 政治课前 我拿出政治书:“翻开政治,一想起国家尚未统一,世界尚未和平,我就没心思读了。” 主任:“建国前,刘少奇说:‘国家尚未统一,选毛主席。’朱德说:‘国家尚未统一,选毛主席。’邓小平说:‘国家尚未统一,选毛主席。’最后就有了毛主席。” 6 中考之后 瓜子:“伯形女儿考了这么好应该请吃饭。” 我:“多吃几张试卷还是有的。” HG:“函数大餐,三角点心,向量甜品。” 7化学课,讲蛋白质,烧了蛋白质物品后 老师:“想要闻一下味道的,自己回去烧一下头发。” 我:“烧一把也没用。” 昏君淡定地笑了。 8数学课上课之后,化学老师还在 伯形:“大家先看一下上面的题目。” 化学老师看着自定义题目说:“这是什么符号。” 众人大笑。 伯形:“化学符号……” 9化学课 教写A2B,AB2型电子式。 老师:“都懂了吗?” 我:“过氧化钠怎么写?” 主任:“HClO怎么写?” …… 10 4月1日数学课 伯形照例抽人上去默写。 伯形:“41号” 我无奈地走了上去。 伯形拿着粉笔笑咪咪地对我说:“今天是你的节日……” 我…… 实际上都是本地老狐狸,装什么聊斋…… 11期中考试后,数学课 伯形:“你们江山一片红,几乎全是三十几分。” 我:“终于全班几十分了。” 12期中考之后,某一下午 伯形在教室叫了几个人默写后。 伯形:“这样查了,如果你们期末还没考好,我就去跳楼。” 在教室的人欢呼雀跃。 伯形:“有什么好激动的,我从一楼跳四楼,从楼梯上跳就好了。” 于是,期末考试数学再创新低。 13 音乐课 老师:“你们站到后面去排练一下。” 主任:“沈XX坏我大事,数学作业写不成了。” 我:“对啊!好几节音乐课没上,我的睡眠规律都被打乱了。” 14语文课,找人上去演讲《我有一个梦想》 王木高票推荐上台。 王木:“今天,我有一个梦想。” 众人:“好!” 某些人:“不是今日吗?” 众人:“哈哈……” 15物理课 老师:“我比较喜欢画V-T图像解题。” HG:“我比较喜欢A-V图像。” …… 16默写完《雨霖铃》之后 老师:“有一位同学,错的很离谱,‘兰舟催发’写成了‘兰州催发’,兰舟就是小船,你写兰州干什么?” 主任:“贴吧玩多了。” 我:“人才!” 某人:“不去贴吧可惜了!” 二默中涌现出更多人才…… 17政治课 讲宗教问题 老师:“清华北大是我国最高学府,大学生研究生出来,用科学思想武装自己,还是宗教思想,你们出来干什么?” 主任:“卖猪肉!” …… 18瓜子生日 主任HG准备好好庆祝一下!!!为新高一奉献一场精彩的表演。 晚读时 主任:“我已经等不到下课了。” 下课之后,我好像没有听到大动静。 主任从外面回来之后:“太爽了,没抬到楼下,在厕所门口就解决了。” 我:“有人帮你们吗?” 主任:“我和HG叫了一声阿鲁巴,一群七班的叫着:‘生活需要激情!’ 帮忙抬起了瓜子,最后瓜子裤子破了,才停。” 回到寝室 我:“晚上咋么样?” HG:“一群七班的大叫:‘生活需要激情!’……” 看来被压抑太久了…… 19 WCG取消PC项目,看完游戏风云专题回顾后 主任:“WCG也欠我一个冠军!” 我:“……没关系,让HG去打鸟赢一个冠军回来。” 20 校园改造,拆除护网后 我:“全拆了。” HG:“不,全都换上了无线网,看不见了,效果依旧。” 我:“一中也要打造无线校园了啊。” 21准备音乐考试 我:“有没有什么歌,整首只有一句歌词,一个调的?” A:“祝你生日快乐~~~~~” 我:“是不是还有英文歌 happy birthday to you?” A:“对的!” 22看着旁边一男的穿了一白背心 我“他穿背心了。” 主任摸了一下他背:“你穿吊带了啊!” 那人:“你神经病啊!” 23继续吊带 我:“今天他有没有穿?” 主任一摸:“穿了。” H:“有什么好笑的,温jianbao也这么穿。” 我:“你怎么知道?” H:“他深入下乡时不是都这样穿得吗?” 24继续 我:“今天领导有没有下乡。” 主任:“有。” H…… 25多日之后 我:“领导好久没下乡了!” 26某星期一早晨第一节课 班主任看着主任位子上没人对我说:“他还没来?” 我:“没有来?” 班主任正准备打电话,主任推开门进来 老师:“怎么这么晚才来?” 主任:“有原因的。” 老师:“起晚了?” 主任:“闹钟没响。” 27主任坐下后 我:“这么晚来都没事的啊?” 主任:“迟到一两分钟门卫会记你的,再晚一点他们不会管你的,所以我在外面逛了好久才进来。” 我:“原来你是为了班级荣誉才来那么晚的啊!” 主任笑了。 28 历史课,讲文学类型 老师:“路漫漫其修远兮,吾将上下而求索。有其他班同学讲漫漫没有三点水。” 众人:“语文书上没有。” 老师:“可能版本不同吧 ?” 我:“语文课上讲,写三点水的没文化。” 老师:…… 29 期中考前一中午 教室后面又要进行阿鲁巴。一群人围住了一女生。 我:“是强奸吗?” 主任:“不,是轮奸。” 抬起时,伯形从外面晃进来。 众人迅速散去。 伯形:“你们只会欺负她一个人。” 伯形:“你们中午不学习,不要吵,去休息。搞的跟国际文武学校一样。” 说完就离开了。 主任:“风气都被七班带坏了。” 我:“又被救一个。” 30浙大学子回访时 在广播台做节目 主持人:“听说浙大美女很多?” 学长:“这么跟你说吧,我们一共有六幢宿舍,一女五男。” 事后一想,不正是一对情侣,两对基。 31期中考前 地理课 由于地理老师没讲清楚,大部分人不知到导引写哪里。 老师看见一个人用手挡住作业本:“不用挡了,我看见你没写了。” 老师继续看其他人。 看见我将作业大开地放在桌子上:“你怎么没写也不挡一下?” 无奈只好用手挡一下…… 32 A:“化学实验手册明天交不交。” 我:“可以期中考后交。” 主任:“也可以不交。” 我:“丢了就好,主任经常丢的。” 主任:“我什么时候干过?” 我:“对,你是忘带了,放在枕头下面。” 33主任经常丢物理作业之后 主任:“我物理书丢了,怎么办?” 我:“再接再厉,帮我们把物理老师丢了。” 主任…… 34未上课前 老师:“把地理试卷拿出来给我看看。” 我:“我先去趟厕所。” 当我在洗手时,又陆续来了一些人…… 我:“大家都来了。” 周哥:“你那边已经检查过了,可以回去了。” …… 35分析2012浙江英语高考作文,读例文时 老周:“Take Abraham Lincoln, for example.” 我:“我可不可以Take my father Li Gang, for example.” 主任:“我爸是李刚,吓坏老师。” 我:“实际上,我爸是李刚,老师你懂的。” 36英语讲单词时 老周指着黑板上的 admire the moon 说:“实际上这moon换成girl更好。” 某人:“beauty!” 老周:“对!” 37 数学课用Word讲题 由于式子太小 伯形:“放大点,给你们看清楚。书没读好,各个都是高度近视。” 众人无语。 伯形:“虽然我书没读好,但眼睛还是好的。没有1.5,至少1.2。” …… 其实我们不关心你视力多少,更想知道书没读好眼睛没坏,到底花时间干什么去了…… 38 去烈士陵园路上 HG:“早知道带副扑克去了。” 主任:“早知道带三国杀去了。” 我:“你们这帮人,战争年代,革命烈士抛头颅洒热血,才换来今天的幸福生活……” 此时,伯形从傍边经过,然后盯着我…… 39 老周不在,14班老师代课 下课之后 昏君:“你们听懂了吗?” 我:“一整节课下来,我只听懂了一样东西,对于这个我也只能回答 I don’t know !” 主任:“都是you know? you know? you know? you know?” 40 继续 教室另一边 A:“有100多遍you know?” B:“130多好吗?我很仔细记了!” 接下来的一周里,课堂上听的都是you know? you know? you know? you know? 41英语课讲二模改错时 讲到一个单词 梳头 老周:“一般女孩子都会带梳子和镜子 ,可以整理一下。” 主任:“HG也有!!!” 42还在讲改错 老周读了一个长句子后,问哪里错了 主任:“这么长的句子,一个标点都没有,肯定有问题。” …… 老周又读完一个句子 主任:“这么长的句子,一个标点都没有,肯定有问题。” 43健力宝在超市门口搞活动 于是我们过去每人买了一瓶准备抽一把雨伞 无奈只抽到一些圆珠笔和餐巾纸 老板:“实际上,你们抽到都赚了。这些东西价格都在一元以上。不是在乡下,餐巾纸都要一元吧。” 我指着大一中超市:“这里面就卖五毛。” 老板…… 44 老板继续:“你们吃完饭后,可以擦嘴。” 他把手放在嘴前做擦嘴动作。 老板:“上完厕所后……” 双手放下…… 然后…… 我们走了…… 45 大合唱排练时 我们在体育馆台阶上练习时 HG指着其他一个班:“那是美女与野兽吗?” 主任:“不,是野兽与野兽。” 我:“不,是禽兽与野兽。” 46大合唱前,男的穿粉红色短袖,女的穿蓝色短袖 我:“等一下,他们以为八班男生都剪短发。” 昏君:“应该是八班男生好矮。” L:“八班男生好多。” 我:“八班女的像男的。” …… 47 午休 英语考试前 老周:“小考小信心,大考大信心。” 主任:“小考小打击,大考大打击……” 48数学课 伯形指着黑板上的a=xb+yc说:“看到这些想起了什么?” 众人沉默 伯形:“苹果?如果想起苹果,那你完蛋了?” 之后 伯形:“想起了什么?” 主任:“苹果。” 我:“蓝莓。” 49数学课 已知P点是三条中线交点。 伯形:“P点是三角形的什么心?” 主任:“内心?” …… 主任外:“外心?” …… 伯形:“没良心……” 50某星期四早读 伯形进来后,语文课代表在讲台上查语文作业 伯形:“实际上,作业不用每天查。一次查到没做乘以五就好了。” 我:“这都什么?” 伯形:“你没学过抽样统计?” 计算着要抄的语文课文数(=1+2+3+4+5) 我:“好残忍!” 伯形:“谁让你犯贱!” 51主任杭州漫展回来后 买了桌游《宿命》,我翻着说明书 主任:“你现在跟我比宿命英雄技能谁知道的多!” 我:“比三国杀,爆你到日本。” 52英语听力时 广播:“衬衫的价格是九磅十五便士。” 老周:“物价上涨,只有衬衫的价格不涨!” 53物理课 老师:“重力做功与路线无关。什么力做功与路线有关?” 我:“摩擦力!” 老师:“对!” 于是在黑板上画了一个大圈。 老师:“从1 2 3走,摩擦力做功不同。” 主任:“老徐生动形像的解释了2b青年 文艺青年 普通青年。” 54 数学课讲练习 我:“又是观察猜想法!” 伯形:“也许你还不会!” 我:“全部填空题我就对这一道容易吗?” 55开学不久后的数学课 伯形指着一个复杂的等式:“会解吗?” 伯形:“不要看见就怕了哦!” 无人理…… 伯形:“跟我在七班说的一样,你们这帮人,只能去造鸡蛋。造原子弹早就把自己炸死了!” 56数学课教求导公式时 伯形:“高斯的老师给学生一道题目1+2+3+…+100 有人从1加到100。 如果是你会怎么算?“ 伯形:“十岁的高斯有个很好的方法。” 我:“首项加末项……” 伯形:“那你还行?” 我:“七岁老师就教过了!” 伯形…… 57期中考 考完政治之后才知道和其他人的差距。 我考完试回来,有人吃完饭回来。 我:“你有没有吃完饭?” 主任:“想出来,出不来。” 我:“为什么?” 主任:“伯形监考。” 我:“脸皮厚一点就好了。” 主任:“有个十九班的要出去,被伯形留了下来。” 我…… 地理考试中,伯形抓住一打小抄作弊者,我们感慨:“真乃电子狗伯形!” 58 某星期一下午 语文课看电影,下课后,伯形进来看。 过来一会儿,语文老师带着电脑走了。 伯形:“其实电影看多了,不好,人会变笨的。” …… 59 期中考完历史后 有一道题目,让你写毛泽东井冈山时期写的文章。 C:“《井冈山的故事》” 其他人:“《井冈山的斗争》” A:“什么故事?” C:“爱…情…故…事…” 60期中考后讲数学试卷 伯形叫了几个人上去写题目,自己在教室里转。 伯形:“你们这些人都是臭鸡蛋!” 众人不解。 伯形:“21题平均分0.9分,不是臭鸡蛋还是什么?” 我:“原来我是两个臭鸡蛋!”(21题 8分) 61 分析数学试卷时 伯形:“你们脑子坏了,用硫酸都融化不了,” 众人:“用王水。” 伯形:“什么王水,硝酸都不行。” 我:“王水酸性比硝酸强!” 62期中考后历史课 老师:“我把选择题答案报一下。” 众人:“写一下吧。” 老师:“写出都不环保。” 我:“讲出来有噪音污染。” 老师:“啊,写出来浪费粉笔。” 我:“高考前禁噪。” 老师…… 63数学课将习题 伯形:“到底记住没有?没记住的都吃一点皮猪肉。” 伯形:“吃皮猪肉会增强记忆力,少吃鸡蛋。” 我:“那你吃了几头?” …… 64 期中考后 梁:“HG,我们政治都一样4X,班长8X,不是人。” 梁:“我们这种人,国家最放心,班长,国家不放心。” 65 英语课分析报纸 我指着试卷上的“go ahead”问主任什么意思。 主任:“去个头。” …… 从此以后再也不问主任…… 66数学课 伯形“现在你们要好好学习,考上大学。以后出去,没大学文凭,人家会看不起你。” 伯形:“为什么现在哪么多老板会不惜几十万买一个文凭,摆出来看。我原来在读硕士,有老板花几万找人上学,再花一二万,找人写论文,一个博士文凭7万!!!” 主任:“才七万。” 我:“不读了吗?” 67化学课 要用酒精灯时 老师:“怎么实验员老是不给我火柴。” 众人大笑 老师:“幸亏我有打火机,呵呵!” 68化学课 老师:“好我们开始上课。” 我:“还有十分钟能讲什么新课?” 主任:“下课还有三十分钟。” 69王木回家喝喜酒回来后 我:“为什么不叫我们过去?” 王木:“……” 某人:“你家朋友多不多?” 王木:“没几个。” 我:“叫我们过去人就多了,等一下,你家亲戚会发现,你的人缘真好,认识的男的多,女的更多。” 70继续 HG:“对啊,天哥过去,会认为是高二升高三,yjn初三的,gx初一的。” …… 71历史课 老师:“这星期作业为导引必修一部分,星期日交。你们每天要写一点。不要以为是星期六晚上的作业。” 主任:“没关系,对于我是星期日早上的作业。” 72物理课——重力势能 老师:“可能这个例子不太好,有一个同学从四楼跳下去,我们来研究这个问题。” 众人:“@#¥%##@¥%……&*¥#%!” 老师:“没什么问题吗?” 我:“思想问题,自杀是犯法的。” 老师:“我没说他往外面跳,他往里面跳。” 我…… 73化学课 老师:“乙炔与乙烯是同系物吗?” 众人:“不是。” 老师:“大学中化学系与物理系不一样。” 我:“魔兽世界与魔兽争霸听着差不多,玩起来会一样吗?” 主任:“这就听懂了。” 74开学不久后 吃完早饭,回寝室中 主任看见有人边走边玩iphone。 主任:“其实不交钱,我也可以买iphone。” 我:“其实我们交了1代到4代外加ipod1 ipod2的钱。” 75数学课上午第一节课 伯形:“前几天,我看了一个电视。说你周六写作业,第一样写了1小时,第二样写了半小时,第三样写了二十分钟。最后你没写完。专家说你睡一觉,觉得时间没了会写完全部作业。” 某人:“那我们先睡半小时在上数学课。” 伯形:…… 我:“难道高考先睡一个半小时,最后半小时,发愤图强将压轴题也秒杀了吗?” 76伯形理完发后,回来上课 站在讲台上扫视一周后 伯形:“后面一排干什么投降,个个低着头。” 我:“被你帅气的发型吓怕了……” 主任笑而不语 77物理课 老师:“第二题写错的同学没有看清两个字:匀加速。” 众人:“不是三个字吗?” 我拿起手指数了一下说:“我该补数学还是语文?” 78期中考前 发下一张物理答题卷 昏君看着选择题 、填空题的横线,找不到题目:“这叫人怎么写?” 主任:“这主要训练考前蒙题能力的,让你结合题号、上下题选项来蒙。” 混君:“填空题怎么办?” 主任:“结合生辰八字、考号、考场位置来蒙。” …… 79地理课其他老师代课 老师:“李老师讲过可持续发展三大原则吗?” 主任:“没有。” 老师:“公平性原则……” 主任:“有。” 回想起他的听课,我:“你懂?” 主任:“……” 80地理课,继续代课老师 老师:“我国黑土地分布在哪里?” 我对主任说:“QQ农场。” 老师:“你们有没有讲过紫色土壤。” 主任:“QQ农场还没出。” 我:“腾讯高级机密……” 81政治课 讲中央机构产生过程 A:“为什么都只有一个候选人?” B:“如果有两个,一个没选上,关系不搞僵了,大家都认识……” 82不知团委书记找老周写什么东西。 老周:“笑话,让我一个英语老师写中文。” 主任对我说:“那我们中国人学什么英文……” 83自修课 看着前面XX与XX在XX 主任对我说:“只允许XX,不允许学习。” 我:“等到老了的时候,有人问你干了什么,你学习了,他们XXX。” 84某天语文课 老师:“现在同志都变味了,要是在以前,一声同志多么亲切,革命友谊。” 众人:“现在什么意思?” 老师:“我不告诉你,自己去查。” 于是,某人掏出手机…… 没有然后了…… 85数学课讲练习 伯形:“大家看看,做选择题就要不择手段,做出来就好了!” 众人大惊 伯形仔细一想,又补充了一句:“当然,作弊除外。你想一下,你把你旁边的人试卷看了,他比你更笨,你把自己正确的答案改了,怎么办?”","link":"/post/if.html"},{"title":"采访一则","text":"前一整子学院内有关部门对我进行的采访,正好放在这里记录一下。【】这个内部是我现在补充的内容。 Q1:在大学学习的这几年里,可有一事令你感触颇深,对你影响巨大?能否与大家分享一下? 【没有回答,现在很难被一件事情所影响】 Q2:很少有人在人生的道路上总是一帆风顺,你可曾遇到过难以解决的挫折?你是怎样克服它的? 【没有回答,向前看,不回头】 Q3:学长一直以来都是成绩优异,然而大学生活必定不能只有学习,学长是如何合理安排自己的时间的呢? 最简单的方法是善于利用日历软件。每学期将自己的课表以及固定时间要做的事情(比如每周二、四下午都要训练)输入到软件里面,作为已经分配的时间。每周、每天将必须要完成的任务找到一个截止日期前的时间块填入。复杂一点可以去尝试学习 GTD。 【比起和安排时间,更重要的是控制欲望】 Q4:作为信工学子,大家都知道你的代码十分厉害,能否跟学弟学妹透露一下学习的妙招? 平时多写算法题目或者是多做项目。刚开始可以从书籍、博文、mooc等渠道找到自己喜欢的内容模仿,然后自己在这个基础上尝试添加的代码。 【上一篇博文中有过类似的感叹,其实我的基础也很不扎实】 Q5:学长曾经参加过许多国家级乃至国际的竞赛,初次参加大型竞赛时可会紧张?你是如何克服这些心态上的问题的呢? 一般来说,编程比赛时间比较长,相对来说是比较自由的。紧张时可以尝试先趴着睡一觉,然后等到心情平复之后,再发挥出自己的正常水平就好了。不要有太多成绩上的压力或者是幻想。 【刚开始以为自己参加比赛能有奇迹发生,后来开始期待队友能 Carry。最后发现只能做自己,顺其自然。】 Q6:学长刚毕业就接到滴滴出行的offer,令人羡慕不已,每个人都想变得优秀,学长可不可以分享一下努力的过程? 凡事预则立不预则废。 很多时候,我们想要做的事情都是有前人做过的,所以可以从网上收集大量的资料。对于找工作来说,很多人会在博客或者论坛上分享面经,通过收集这些,看一下企业一般会考察本科生哪些方面知识,以及什么样的经历会给自己加分。然后朝着这些方向去努力。 【这些话是我自己经历找工作痛苦之后,才总结出来。人生就是一张信息战。】 Q7:图书馆是许多同学经常待的地方,你最喜欢哪一类的书籍?对哪本书印象最为深刻? 好像没有特别喜欢的一类书,大概什么类型的书都看,一般是了解到某一本感兴趣的书,就会去图书馆找一下。另外,我大部分时候去图书馆都是看报纸和杂志。 这么多时间下来,看完之后收获最大的书是《搞定I:无压工作的艺术》。这本书是 GTD( Getting things done) 的入门读物,主要介绍了一套个人任务管理的方法。如果你感觉生活杂乱无章,可以尝试学习这套方法来规划生活。 【不知道为什么,我一直想给身边的人推广 GTD 的原则。】 Q8:在学习与代码之余,你有什么十分热爱的东西,并为它坚持不懈吗?能否与大家分享一二? 写日记。这个爱好从高中开始,最初是写在笔记本上,由于不会搞手账之类的东西,日记的形式很单调。后来受到《晨间日记的奇迹》启发,开始使用为知笔记来记日记,可以同时记录今天拍摄的照片或者是视频。另外,每个日期开一篇笔记,每年都在同一篇笔记上更新,可以手动实现去年今日功能。 【记日记可以发现自己吧】 Q9:每个人都拥有属于自己的生活习惯,学长有哪些良好的生活习惯能与学弟学妹分享一下吗? 充分挖掘手机或者电脑的功能来体验数字化生活。推荐一些我自己使用的软件给大家吧。 个人任务管理:OmniFocus 笔记软件:Evernote、Wiznote 时间记录:Toggl、Forest 记账:MoneyWiz 如果想要具体了解这些软件如何提高工学学习效率,推荐大家去少数派上找相关文章阅读。 【其实我想说的是一个「数字游民」的概念,通过使用这些优秀的软件,记录自己的成长以及提高自己的效率。】 Q10:最后,请学长给学弟学妹们分享一段寄语,鼓励一下大家吧! 大学时光是短暂的,希望你们能早点找到自己想做的事情,并为之奋斗。 新闻稿的链接 查看更多我的随笔,请点击 ZenTalk","link":"/post/interview.html"},{"title":"iPhone软件清单","text":"本来打算双十二买一部小米6,谁知道当天没有优惠,转而买了一部mix2。当时准备写一篇文章来纪念一下我的第一部智能手机。可谁知道,拿到的mix2品控太差,一周不到前置摄像头就进灰了,果断退货。 目前在用的手机是高中毕业之后买的,当时记得是4500块送1000块话费而买下的。8G的存储空间,对于我这种不拍照的来说也还可以接受。不过最大的问题是电池,实在是太不经用了,而且还有天冷关机的问题。所以,退了手机之后,就在京东上买了一块品胜的电池和线下装机服务。用了大概一周,目前还比较满意。前几天,Apple终于为电量低降频的事情道歉了,而且将换电池的价格从五百多降到了两百多一点。我感觉之后,苹果换电池就很划算了。可惜下一部不想买iPHone了。 QQ、微信、支付宝之类的不写,记录一下,我自己在用,但比较小众的软件。 inoreader:免费里面比较好用的RSS软件,不使用其他服务,墙外的博客都可抓下来,不过图片有很大的问题……几个月之前在国内AppStore被下架了,所以目前绝版,网页版很早就被墙了。 Castro:播客软件,我认为最大的优点是界面优美,从破解版用到它免费,目前还有Castro 2可以选择。 欧路词典 Pro:最大的优势是可以自己装字典,配合网上的盗版资源非常的棒,而且价格也很便宜。 每日英语听力:偶尔听听 诗词之美:有时候掏出来,抄一篇之前背过的诗词。之前这个App还叫西窗烛,后来那个软件加上了很多社交功能,就单独出了一个只能看看诗词的版本。 白描:ocr软件,买少数派效率大礼包时候送的。 熊猫吃短信:通过iOS 11新机制,使用机器学习过滤短信。 Battery Life:查看电池寿命 Scanner Pro:扫描软件,Reedle出品,质量保证。 LastPase:密码软件和chrome上的插件配合使用 Authenticator:两步验证,部分网站支持,在实习时必备。 AppZpp:可以订阅App更新和价格变动 网易有钱:记账,最大的优点是可以同步支付宝的账单。 Forest:集中注意力?可以在手机上种树? 滴答清单:清单+日历 kindle:阅读 脉脉:查看程序员八卦,行业内人员变动消息传的早,公司内部撕逼等等","link":"/post/iphone5s.html"},{"title":"只是为了好玩——Linux之父林纳斯自传","text":"这个是我为了学习Linux操作系统,而从图书馆精心挑选的书。 林纳斯眼中的人生意义:生存、社会秩序和娱乐。 Linux起源于林纳斯对于Minx的不满足,壮大于开源运动。 Linux也是世界上最大的开源协作项目。 内容和题目一样,不过也没有太多有趣的故事。 林纳斯的思想朴实情切,不高深。 至少读完之后,你会了解到没有他那样的基础和机遇去创造新的操作系统。 书中出现了例如微内核、分页管理等计算机组成原理中的名词。 现在已经不能说出这些具体含义了。 希望有一天可以去看Linux源代码。","link":"/post/just-for-fun.html"},{"title":"第七届蓝桥杯决赛杂记","text":"反正最近不想干什么正经事,回忆一下这些东西也好。 总的来说,这是我第二次去北京参加蓝桥杯决赛。去年获得了优秀奖,换句话来说就是重在参与。不过,今年成绩比去年好一点。 (订的宾馆一如既往的温馨就不说了)首先,今年我的比赛地点是在北京建筑大学(西城校区)。顾名思义就知道这所学校的建筑系比较有名,不过这和我没有什么关系。这学校位于北京市内,又由于建的比较早,所以进去之后发现植被非常的茂盛,另一方面就是校园建筑看起比较破旧,或者是有历史感。比较有意思的是,他们的计算中心是位于地下的,所以比赛的时候我就是在地下编程了…… 决赛从周六上午9点开始到下午1点结束,一共4个小时。题目有6道,两道填空题,一道代码填空题,和三道编程题。第一题,就是解一个二元一次方程x+y的最小值。第二题,是一个大暴力题,自己想了好久才想出一种方法,不幸的是最后和别人对答案的时候,发现自己想错了。第三题,我模拟了一下正确的转换方式和题目中代码给的转换方式对比想出填入的代码。第四题,枚举了一个每一行第一个字母暴力解出来。第五题是一道计算几何的题目,好像是外国比赛的原题,反正我连凸包都不会。第六题是什么生成树计数,本来想写一个暴力绝杀的,但是在最后还有10分钟的时候发现自己写了40分钟的代码是错的,多么绝望。其实后来发现,这后面两道题目的区分度几乎为0,周神都只写了暴力的上去,不知道理工的final选手有没有完全写出来。 周六下午我就开始干来北京的正事了,和周神坐地铁来到天安门。参观了天安门广场、中国国家博物馆、并且还登上了天安门城楼。最后,还是感觉中国国家博物馆有意思,很多原来在课堂上见过的藏品都亲眼所见了,不过自己上的艺术课程还是太少了,对于很多东西没有鉴赏能力。不过也有遗憾,毛主席纪念馆是每天上午8点到12点开放,没有去成,故宫是从天安门后面的午门进入,不过每天4点停止售票,也没有去成。 周日就是到北大领取小礼品和参加颁奖典礼,虽然我们三个人都是观众。由于去的比较早,我们在未名湖边坐了一会儿。对岸的未名湖石碑人来人往,感觉能看一整天。坐着那里才会明白,为什么那么多人向往着北大。我们在学校中只是生存,他们却是生活,鸟语花香,春意盎然。 颁奖典礼在邱德拔体育馆举行,这也是2008年奥运会乒乓球场馆,里面到现在为止还保留着奥运元素。典礼是一个奖项颁奖加一个或两个节目交叉进行的。也请了一些小明星过来唱歌,其中映象比较深刻的是《明天的烦恼交给明天》的mv。自己觉得拍的很有创意,两名歌手一个来自北大的历史专业,另一个来自考古专业。其他的就是看着理工的三个人拿着四架无人机回去,都可以玩无人机编队了…… 当天晚上和其他三个人一起去了全聚德前门起源店。到达后,发现人比较多,取了号后等了一会儿。 之后就是普通的点菜,一只优秀的鸭子比普通的鸭子才贵30块,不过其他菜还是比较贵的。 厨师切好拼盘后,服务员还不忘提醒我们拍照发朋友圈。我和老王纷纷表示,没有周神,怎么可能吃这么高档的东西。 最后,周一下午做火车回到杭州,结束了北京之旅。","link":"/post/lanqiaobei-2016.html"},{"title":"Mac软件清单","text":"最近痛下血本买了一台Mac,这里记录一下我装的软件。 君子生非异也,善假于物也。 更新 2017年9月20日:Anaconda 2017年9月21日:lantern、Dash、Xcode 2017年12月10日:虚拟机相关 Clion C++ IDE Pycharm Python IDE Alfred 3 替换默认的搜索工具 搭配workflow使用效果更佳 MWeb MacOS 下面最喜欢的Markdown编辑器 常用的高级功能有发布WordPress博客和自动将图片上传到图床 Wiznote 用官方的话来讲Mac功能少是小而美 如果不是会员到2020年结束,我一定会转到Evernote上去 iina 视频播放软件 ShadowsocksX-NG 看名字就知道干什么的 突然发现自己买不起服务器,转向蓝灯 Parallels Desktop 虚拟机软件 Sublime Text 3 性感的编辑器? 处理小文本时使用,写题目还是喜欢vim iTerm2 用来替换默认的Terminal 推荐主题:solarized-dark 推荐字体:Hack Homebrew Terminal内下载软件 使用:brew update;brew install vim 查看软件信息:brew info vim 临时替换:export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles 清华大学镜像地址 中国科学技术大学源地址 tmux 增强终端功能 配置文件:.tmux 更新配置文件:tmux source ~/.tmux.conf 常用快捷键 prefix s 查看/切换sessoin prefix d 离开session prefix $ 重命名当前session prefix c 新建窗口 prefix space 切换到上一个活动的窗口 prefix & 关闭一个窗口 prefix 窗口号 使用窗口号切换 prefix o 切换到下一个窗格 prefix q 查看所有窗格的编号 prefix “ 垂直拆分出一个新窗格 prefix % 水平拆分出一个新窗格 prefix z 暂时把一个窗体放到最大 Oh My ZSH! 用zsh来替换默认的shell 推荐主题:agnoster 最喜欢的是对git的增加以及git相关快捷键的缩写 常用快捷键 gaa: git add . gb: git branch gcm: git checkout master gcmsg: git commit -m gst: git status vim 配置文件:spf3,已经不想折腾这些东西 常用快捷键 dd: 删除当前行,并把删除的行存在剪贴板里面 *#: 匹配当前光标所在的单词移动到下一个或者上一个匹配的单词 %: 匹配括号移动 :set number: 显示绝对行号 :set relativenumber: 显示相对行号 r: 将光标所在的字符替换掉 <<: 将当前行向左移动一个偏移宽度 >>: 将当前行向右移动一个偏移宽度 Powerline fonts vim中的状态栏以及zsh某些主题正确显示的核心 iStat Menus 系统增强工具 在状态栏显示当前网速、CPU占用以及温度等信息 Jietu 腾讯为数不多的良心之作,截图软件 坚果云 良心同步软件,每个月上传流量不多,但是够用 iCloud默认空间实在是太少 Anaconda python 科学计算包? 最主要使用是jupyter notebook 根据之前在公司安装时得到的经验,完成安装之后还需要更新zsh相关的配置,否者在iTerm中依旧无法使用 在 .zshrc 中添加一条记录:export PATH="/Users/xiangrunye/anaconda3/bin:$PATH" 注意这里需要写绝对地址 更新配置文件:source ~/.zshrc Lantern 捍卫互联网自由? Dash 快速查阅各种语法的文档 配合Alfred食用更佳,建议将 keyword 改为 ds Xcode 感觉自己可以转ios开发 下这东西才知道,国内连AppStore网络有多差 Parallels Desktop win镜像获取 Chrome 看中的是插件多的特点 MacOS设置为英文的环境下,Chrome里面下载时经常出现文件名乱码,找到了这个网页 Mac OS X 下修改 Google Chrome 显示语言的方法 参考链接 MacTalk:Alfred Tmux 速成教程:技巧和调整 vim 学习卡 vim 帮助和配置 从零开始学习Alfred markdown.wordflow","link":"/post/mac-software.html"},{"title":"《机器学习》 第 1 章 绪论 读书笔记","text":"西瓜书 周志华 2016 年 12 月第 14 次印刷 1.1 引言 机器学习:利用经验来决策 1.2 基本术语 根据数据是否拥有标记信息分类: 监督学习 supervised learning 分类 classification 回归 regression 无监督学习 unsupervised learning 聚类 clustering 1.3 假设空间 假设空间指的是所有跟问题相关的假设所组成的空间,学习过程是从假设空间中进行搜索,目标是找到与训练集「匹配」(fit)的假设。 在这么多的假设中,可能存在一些假设,得出的结果和训练集一致,这些假设组成的空间叫做「版本空间」(version space)。 1.4 归纳偏好 对于数据集中没有出现过的情况,算法可能会按照自己的偏好来预测结果,这种情况称为「归纳偏好」。为算法选取偏好时,可以使用「奥卡姆剃刀」原则,即有多个假设与观察一致,则选最简单的那个。但是什么是最简单的也需要仔细思考。 没有免费的午餐定理(No Free Lunch Theorem, NFL) 在所有问题出现的机会相同时,所有的算法的期望性能相同。 任何一个算法都有表现好的问题,也有表现差的问题。 针对具体的学习问题研究算法。脱离具体问题,研究什么算法更好毫无意义。 1.7 阅读材料 其他科学研究中采用的假设选择原则 古希腊哲学家伊壁鸠鲁 「多释原则」:保留与经验观察一致的原则。","link":"/post/machine-learning-ch-01.html"},{"title":"《机器学习》 第 3 章 线性模型 读书笔记","text":"西瓜书 周志华 2016 年 12 月第 14 次印刷 3.1 基本形式 线性模型的预测函数为: f(x)=w1x1+w2x2+...+wdxd+b{f(x)=w_1x_1+w_2x_2+...+w_dx_d+b} f(x)=w1x1+w2x2+...+wdxd+b 写成向量模式得到: f(x)=wTx+b{f(x)=w^Tx+b} f(x)=wTx+b 3.2 线性回归 线性回归能在给定数据集 D={(x1,y1),(x2,y2),...,(xm,ym)}{D=\\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\\}}D={(x1,y1),(x2,y2),...,(xm,ym)},其中 xi={xi1;xi2;...;xid},yi∈R{x_i =\\{x_{i1};x_{i2};...;x_{id}\\},y_i\\in\\mathbb{R}}xi={xi1;xi2;...;xid},yi∈R学到一个线性模型从而进行预测。 考虑最简单情况,当 xi{x_i}xi 为一维时,问题转换为求下式: f(xi)=wxi+b{f(x_i)=wx_i+b} f(xi)=wxi+b 使得 f(xi)≃yi{f(x_i)\\simeq y_i} f(xi)≃yi 使用平方损失函数作为衡量线性规划模型性能的指标,f(x){f(x)}f(x) 与 y{y}y 越接近,代表平方损失函数越小。即得到:","link":"/post/machine-learning-ch-03.html"},{"title":"博客折腾记:hexo-leancloud-counter-security 与标题中的引号冲突","text":"昨天按照 hexo-theme-next/LEANCLOUD-COUNTER-SECURITY.md at master · theme-next/hexo-theme-next 这个文档配置博客阅读次数时,遇到 hexo-leancloud-counter-security 插件的一个冲突。 完成配置使用 hexo -d 时,终端中出现下面的错误提示: 12345678910111213 ATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.htmlSyntaxError: Unexpected token h in JSON at position 30 at JSON.parse (<anonymous>) at /Users/didi/Documents/personal/xiang578.github.io/node_modules/hexo-leancloud-counter-security/index.js:92:42 at arrayEach (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_lodash@4.17.11@lodash/lodash.js:516:11) at Function.forEach (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_lodash@4.17.11@lodash/lodash.js:9344:14) at Hexo._callee$ (/Users/didi/Documents/personal/xiang578.github.io/node_modules/hexo-leancloud-counter-security/index.js:83:27) at tryCatch (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:62:40) at Generator.invoke [as _invoke] (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:296:22) at Generator.prototype.(anonymous function) [as next] (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:114:21) at step (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_babel-runtime@6.26.0@babel-runtime/helpers/asyncToGenerator.js:17:30) at /Users/didi/Documents/personal/xiang578.github.io/node_modules/_babel-runtime@6.26.0@babel-runtime/helpers/asyncToGenerator.js:28:13 at process._tickCallback (internal/process/next_tick.js:68:7) 看提示貌似是利用 Json 解析字符串的时候出现问题。打开 node_modules/hexo-leancloud-counter-security/index.js:92,对应出现一个解析 JSON的: 1y = JSON.parse(memoData[memoIdx].substring(0, memoData[memoIdx].length - 1)); js 没有怎么接触过,不知道能不能单步调试之类的,只好祭出输出调试大法,加上两个输出: 123console.log(memoIdx)console.log(memoData[memoIdx])y = JSON.parse(memoData[memoIdx].substring(0,memoData[memoIdx].length - 1)); 然后再执行 hexo -d 命令,命令行输出为: 12345678910111213141528{"title":"System.out.println("hello world!");","url":"/post/hello-world.html"},FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.htmlSyntaxError: Unexpected token h in JSON at position 30 at JSON.parse (<anonymous>) at /Users/didi/Documents/personal/xiang578.github.io/node_modules/hexo-leancloud-counter-security/index.js:92:42 at arrayEach (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_lodash@4.17.11@lodash/lodash.js:516:11) at Function.forEach (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_lodash@4.17.11@lodash/lodash.js:9344:14) at Hexo._callee$ (/Users/didi/Documents/personal/xiang578.github.io/node_modules/hexo-leancloud-counter-security/index.js:83:27) at tryCatch (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:62:40) at Generator.invoke [as _invoke] (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:296:22) at Generator.prototype.(anonymous function) [as next] (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_regenerator-runtime@0.11.1@regenerator-runtime/runtime.js:114:21) at step (/Users/didi/Documents/personal/xiang578.github.io/node_modules/_babel-runtime@6.26.0@babel-runtime/helpers/asyncToGenerator.js:17:30) at /Users/didi/Documents/personal/xiang578.github.io/node_modules/_babel-runtime@6.26.0@babel-runtime/helpers/asyncToGenerator.js:28:13 at process._tickCallback (internal/process/next_tick.js:68:7) JSON 在解析字符串{"title":"System.out.println("hello world!");","url":"/post/hello-world.html"} 时出现错误。对应的正是之前写的一篇名为 System.out.println("hello world!"); 的文章,由于 JSON 格式中字符串是需要用"" 修饰,导致JSON 中出现了一个 "title":"System.out.println("hello world!");" key-value 组合。然而实际上 JSON 只会将 "System.out.println("h 解析成 value,之后出现的 h 被当成非法字符报错。 定位问题之后,暂时修改文章的标题为 hello world! | 算法花园,绕过部署失败。","link":"/post/meet-leancloud-counter-security-problem.html"},{"title":"【每月分享】 201912","text":"[TOC] 这里记录过去一个月,我看到、想到值得分享的东西,每周六滚动更新。 0x02. Org-mode Workflow 国外一名 CS 学生的 org mode workflow 教程,包括 GTD 和 Zettelkasten 两个主要的部分,分别对应时间管理和知识管理,是一份很好的参考资料。 0x01. HHKB 更新 改めてとなりますが今回新しく登場したHHKBは3機種になります。それぞれの特徴をまとめたものがこちらになります。#HHKBミートアップ pic.twitter.com/GVVxNI6H72— HHKB OFFICIAL (@PFU_HHKB) December 10, 2019 HHKB 好久之后终于更新了!不过价格也变得更贵……还是很喜欢自己 18 年买的 HHKB BT 版。不过在使用 Emacs 之后,出现没有方向键的烦恼。之前通过映射 Ctrl + HJKL 替代方向键,然后和 Emacs 的一些快捷键冲突……等买一个新的机械键盘。 0x00. My GTD Workflow (2019 ver.) - Yiming Chen #gtd 很少看到国人用英文写的 GTD 相关文章,年初自己也想按 Workflow 这种形式写一篇,不过一直拖到现在都没有完成。 对任务设置优先级:A B C 如何设置任务优先级,对目标进行分解 每年一月份设定年度目标 每月一号根据年度目标设定月度目标 每周日根据月度目标设定每周目标 每天早上设定当天目标 任务安排优先级和截止日期后,可以使用四象限法则。 回顾技巧 追求 100% 完成,可以接受 70%。 一个任务多次延迟之后,考虑是否还是重要。 如果任务还是重要,对任务进行拆分。","link":"/post/monthly-issue-201912.html"},{"title":"【每月分享】 202001 Fine-Tune Your Days","text":"[TOC] 这里记录过去一个月,我看到、想到值得分享的东西,每周六滚动更新。 0x04 你见过哪些让你目瞪口呆、脑洞大开的骗局? - SME情报员的回答 - 知乎 推荐其中的吉普赛读心术,当成脑筋急转弯来看。 首先任选一个两位数,在心里默默记住,然后用这个两位数再依次减去它的十位和个位,最后用得数查表,找到对应的怪符号。 比如67,相应的计算就是67-6-7=54, 现在,在表中找到你心中数字经过计算后所对应的符号。 最后的答案都会是 0x03 Deep Neural Networks for YouTube Recommendations #paper #ml Youtube 几年前的论文,最近拿过来看一下。工业界的论文最大的价值是提到的一些 tick,比如这篇论文中分析到用户对新视频的偏好,引入 example age 代表视频的上传到预测时的时间。再比如,给用户推荐视频时,考虑用户看过这个视频相关频道次数以及这个视频在用户实现中出现的次数。所以,做算法实现需要深入理解自己所处的场景。 推荐知乎上一些关于这篇论文的解读: Deep Neural Network for YouTube Recommendation论文精读 - 知乎 重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文 - 知乎 YouTube深度学习推荐系统的十大工程问题 - 知乎 揭开YouTube深度推荐系统模型Serving之谜 - 知乎 0x02 Fine-Tune Your Days with the Scientific Method 这个小标题出自 Make Time,翻译成中文是利用科学的方法每天微调你的习惯。 0x01 2020 阅读看板 参考部分网友 Notion 的用法,搭建一个自己的阅读看板 看书也就图一乐。目前挑选出来的书远远超过前两年的阅读量,加油一起读书。 Notion 这种一个数据库 + 可选的 View 很接近我心目中任务管理软件的极限。 0x00 大佬们的年度总结 新的一年开始时,最期待翻看大佬们的年度总结,罗列一些我觉得有总结。 Growing a Result-Driven Mindset - Yiming Chen:英文总结,Yiming 的博客给我带来学习英语并且用之来表达的动力。 2019 总结与 2020 计划 | 小土刀 2.0:从不同角度回顾自己的 2019 年。 2019 时光小偷:这位博主每年总结的标题都是一首歌,也是几年前看他的总结才开始尝试写自己的总结。 致敬时间的价值:一品十年 - 知乎:和这个主题没有太大的关系,看一下其他人十年的总结,也能很好的指导自己的生活。 2019年:下个十年路口,Farewell | Crossairplane的博客:读这篇文章的时候突然想到一点,之后再看年终总结时,留言一句「新年快乐」。 Create vs. Consume - ends 2019 then starts 2020 - Ziting Li:真诚的思考。 我的千书阅读计划 - 意欲蔓延 - Hi!PDA Hi!PDA:fatdragoncat 13 年在 Hi!PDA 上立下愿望,这么多年过去,不知道数量上有没有达到,但是读书的收获已经改变他的生活。难得可贵这篇帖子展示他的变化过程。","link":"/post/monthly-issue-202001.html"},{"title":"【每月分享】 202002 「山川异域,风月同天」","text":"现在看来,又有多少人预测到这一次超级黑天鹅事件。 这里记录过去一个月,我看到、想到值得分享的东西。 0x03 How Instapaper Changed My Kindle Life For the Better 利用 Instapaper 定时将稍后读文章发送到 kindle 上。 0x02 这是我为武汉雷神山、火神山医院设计的品牌形象标志logo - 步行街主干道 - 虎扑社区 0x01 “山川异域,风月同天” @扎宝:日本汉语水平考试HSK事务所捐赠给武湖北的物资,20000个口罩和一批红外体温计。 标签上写着“山川异域,风月同天”,感动[泪][泪] 求一个英文译文! p.s. 据记载鉴真事迹的历史典籍《东征传》记载:日本长屋亲王在赠送大唐的千件袈裟上绣“山川异域,风月同天,寄诸佛子,共结来缘”偈。鉴真大师被此偈打动,决心东渡弘法。 @文冤阁大学士:We are created to share Nature and love. 扫了下原博评转,翻得都差我好几座唐招提寺。嘻嘻。 0x00 XGBoost 春节在家,重新把这些经典的内容再拿出来多读几遍。网上写的那些总结感觉都不是很好,还是要回去看论文。说句实话,纸上谈兵这么久,居然没有跑过 xgb 的包……","link":"/post/monthly-issue-202002.html"},{"title":"【每月分享】 202003","text":"读书 呼吸 (豆瓣):这是一本由 Byte.Coffee 主播 MilkShake 🐑 推荐的一本科幻小说集(前几天看其他东西的时候学会科幻小说的英文 sci-fi)。之前看到过,小说的价值在于作者用一个故事告诉你一个道理。最喜欢的是《商人和炼金术士之门》这篇:在传统的穿越小说无法改变未来和过去的基础上,论证穿越能更深刻理解生活。书中其他探讨的几个问题也很有价值,值得一读。 我看 徐大sao的个人空间 - 哔哩哔哩 ( ゜- ゜)つロ 乾杯~ Bilibili:最近挑着看完大 sao 做饭视频,被他展示的生活激情所吸引。 文章 Seeking the Productive Life: Some Details of My Personal Infrastructure—Stephen Wolfram Writings:这篇超长的文章是 Stephen Wolfram (Mathematica CEO) 介绍自己几十年在家办公的经验,包括如何搭建一个适合自己的工作环境、如何管理文件和个人数据等等。不过这次疫情期间在家办公,大部分同事反应最大的问题是沟通效率降低。另外想想,或许是我们在这方面的思考不够。总之,互联网行业居家办公才是光明的未来。 Naval Ravikant: The Angel Philosopher:AngelList 的 CEO Naval Ravikant 的播客访谈,Naval 的公司投资 Uber Twitter 等 100 多家科技公司。主要介绍 Naval 的一些哲学,文字版在 Naval-Ravikant-TKP.pdf 利用 Kindle 阅读,遇到喜欢的书,购买实体书收藏。对比书的价格,从书中学到可以改变自己人生的内容更重要。 发现一个新的博客后,会在 Archived 页面挑选几篇仔细阅读。读书时也可以使用这个技巧。 How to Make Yourself Into a Learning Machine - Superorganizers:一位高中毕业后离开丹麦来到加拿大创业公司工作人的自我学习之路。 自我定位 T 型人才。 兴趣面广,主题阅读。 高亮关键内容,使用 anki 记忆,相关的想法用 zettelkasten 记录。 zettelkasten 使用纯文本 + 脚本实现。(如果只记录英文 vim 和 emacs 真的是很强大的软件) 利用谷歌检索的数量判断单词的重要性 The PARA Method: A Universal System for Organizing Digital Information - Forte Labs:介绍 PARA 这种数字信息整理方法。 The Best Books and Articles I Read in 2019 – The Blog of Author Tim Ferriss:一篇 2019 年阅读总结文章。对作者介绍的阅读流程比较感兴趣: Evernote 搭配 web clipper 收集文章。 利用 *** 以及高亮在文章中做笔记,方便之后进行快速回顾。 阅读 Kindle 格式的电子书,定期从亚马逊官网导出高亮笔记(国内不支持)。 利用 Readwise 回顾之前提到的高亮。 阅读实体书时,写简单的索引卡片,然后将卡片拍照导入 Evernote 中。 机器学习 为什么有些深度学习网络要加入Product层? - 知乎:解释为什么 MLP 只包含特征累加而有学习特征交叉的能力,后面展开讲了一些提高模型特征交叉能力的方法。 详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解_网络_nebulaf91的博客-CSDN博客:看过讲 MLE 和 MAP 比较清晰的文章。刚看开头的时候,想到自己大学上过《概率论和统计》居然没有考虑过概率和统计有什么区别……","link":"/post/monthly-issue-202003.html"},{"title":"【每月分享】 202004 新的尝试","text":"不知不觉又到更新每月分享的时间。 想写一下我为什么做这件事情?分享自己平时看到有意思的内容,现实世界认识的人,很少对我关注的内容感兴趣,所幸能借助博客超越时间和空间限制的分享。 另外一点,我希望自己能将这个系列当成一个产品去迭代,每一期都有形式和内容上的进步。这件事看起来很简单,但却需要耗费很大的精力。其实在网上看到很多人通过这种形式分享,到头来还在坚持的大概也没有多少人(比如阮一峰的科技爱好者周刊)。 Zettelkasten 以及 Roam Research Zettlekasten 是一个德语单词,意思是卡片盒。现在主要指一种记笔记的思路。Roam Research 是目前国外很火的一个笔记软件,最大的特点是实现不同笔记之间的双向链接。好几个月前就开始尝试 Zettlekasten 的方法,4 月开始才使用 Roam Research。这里先分享一些我看过的文章。 Roam Research 入门指南(thread) 用 Roam Research 来打草稿 - Dongyang Vic - Medium Roam Fu Part I: My plan for using @RoamResearch for a thesis Part II: Using Twitter as an inter-brain zettelkasten Part III: Beyond the Empire 阅读 中文互联网中“讨论”的消亡 | 机核 GCORES:从产品设计角度分析国内主流网站如何限制用户讨论,互联网缩短人与人之间的距离,但我们用来互喷。 互联网是人类历史的一段弯路吗?-虎嗅网:又一篇深度长文,很多观点可以背下来出去装B。 ByteDance程序员生存指南 - 知乎 有些年轻人,在结束一整天的工作后,拖着疲惫不堪的肉体回到出租屋,这时候只想躺着啥都不想干,躺在好几周没有换过的床单上点开了抖音,不一会儿就刷到了凌晨,第二天再拖着疲惫不堪的肉体上班。到了周末也没有任何心力出去玩,只能睡到中午然后随便吃点东西看看剧。没有生活,没有朋友,一晃就单身了四五年,长此以往不仅仅是肉体在亚健康和崩溃的边缘,心理健康更是会出现问题。 孤独、焦虑、易怒等等情绪时刻伴随着一个人。 每个月仅仅只有收到工资短信时可以高兴几分钟。但这笔钱并不敢轻易花出去,因为都是血汗积攒而来,付出的多自然不敢随意花出去。 构建优雅的知识创造系统 [[阳志平]] [[卡片写作法]] 利用电子卡片后,如何量化每天的产出?是不是可以换算成 github 更新多少字? 卡片是自己看的,不需要分享:在卡片层级最大的误区是:分享。不少人误将卡片、文件和项目三个层级混为一谈,喜欢在卡片层级搞分享。这样每次撰写卡片时就增加了一个选择项:这张卡片我是该分享还是该存着自己看?增加的认知操作加大了认知负荷,从简单反应时变为选择反应时。所以尽可能在卡片层级少做分享。 一周、一月、一年、十年与数十年,进行自己的实践。 所有人问俞军 [[金字塔原理]] 和 [[学会提问]] 优秀的思维方式以及对人性和世界的底层理解 我不是说人工智能不好,而是我自己只关心我能想明白一两年内能给创造什么用户价值的产品(或技术等),如果我想不明白这东西马上能给用户创造什么价值,我就毫无兴趣。 看《搜索研究院》页首页尾的那句话,“我们若能更妥善地搜寻资料,实在已经改变世界。” 前百度首席科学家吴恩达谈学习 如果你学习,两天后的周一,你不会很快的就在工作中出彩,你的老板也不会知道你花了整天的时间学习,更不会夸奖你什么。你几乎找不到任何东西可以证明你在努力学习。 再谈个人知识管理:革新我的笔记系统 | 吕立青的博客 好久没有看到立青写文章 不同软件之间,单条笔记的迁移相当于一次对知识进行提炼的过程。 关于动物之森的三则 – 苔原带 以前玩家渴望在游戏里杀死巨龙,飞向人马座,击败外星侵入者。而现在我们只需要在游戏里“正常”的生活就乐呵呵了。和朋友一起野餐,请朋友到家里来玩,一个人傻乎乎做开心的事情在现实世界中已经有这么高的门槛了么?又或者只是因为在游戏里做这些事情的成本足够低,多巴胺回报足够快? 机器学习 内部开始尝试 MCTS 相关的项目。正好接这个机会看一下 DeeepMind 前几年的论文 Mastering the game of Go with deep neural networks and tree search 以及 Mastering the game of Go without human knowledge。推荐去看一下田渊栋在知乎上 AlphaGo的分析 ,当时他在 Facebook 参与类似围棋相关的项目。另外就是木遥的 关于 AlphaGo 论文的阅读笔记 有更多关于现实的思考。最后推荐 阿尔法围棋,记录从 DeepMind 开发 AlphaGo 到战胜李世石的全过程。有一个疑问第四局之后,他们有没有增加使用的 GPU 和 CPU? 在你做推荐系统的过程中都遇到过什么坑? - 知乎 [[CTR]] 没有明确的指标:CTR,staytime,read/unread 精准推荐以及兴趣探索 线下auc涨,线上 ctr 跌 从谷歌到阿里,谈谈工业界推荐系统多目标预估的两种范式 - 知乎[[机器学习实践]][[多任务学习]] 范式一:[[MMOE]] 替换 hard parameter sharing [[Recommending what video to watch next: a multitask ranking system]] 范式二:任务序列依赖关系建模 [[ESMM]] 模型负采样,存在 CTR 漂移问题 U5Jvma3de 放弃的事情:Emacs 写作软件中积累一些文章的草稿,不过由于我的兴趣变化太快,很多文章还没有完成就已经被我放弃。借这个机会,展示一些有意思的东西。 程序员圈子中编辑器战争一直是一个绕不过去的话题。自己日常的工作中会使用多种编辑器: Sublime Text 简单处理文本 IDEA 处理 Scala Spark 相关的代码 PyCharm 连接 GPU 服务器处理 python 相关的代码 VS Code 本机上写 python、shell、cpp、sql 等脚本 Vim 服务器上修改文件 不论选择什么编辑器,都推荐大家去看陈斌的 一年成为Emacs高手 (像神一样使用编辑器) 。 去年底的时候,由于想尝试 org-mode 做任务管理(下个月再分享相关的内容),开始尝试使用 Emacs。Emacs 最大的有点是基于 Elisp 开发,软件中的每一个功能都对应一个函数,一个快捷键对应一个按键和函数的 map。修改功能和配置非常的方法。比如有人完全将 Vim 在文本操作上的功能迁移过来做成 evil 这个插件(号称所有和 Vim 中表现不同的情况都是 bug)。 Emacs 需要大量时间调教才能用起来舒心,对于初学者推荐去网上找一些成熟的配置直接使用。目前比较流行的有 Spacemacs 和 Doom emacs,这些配置维护以及使用的人很多,方便解决你遇到的各种问题。另外那些某些大佬个人分享的配置,如果你和大佬的技术栈不同,没有必要强行 clone。把它当成是一个学习素材,更好的理解 Emacs 背后的哲学。再这些基础上,成为高效的程序员的第一步,就是打造属于你自己的专门的配置文件。 使用好的编辑器是为了更快的工作。那如何更快的工作? 在加快敲击键盘的速度 减少敲击键盘的次数 减少鼠标和键盘之间的切换 关于 2,我在之前的文章中提到过一点,改变中文的输入方式(从全拼切换到小鹤双拼)。另外一点就是多使用快捷功能,比如 vim 里面的行号跳转。大部分软件的快捷键都是开发商配置好的,不过每一人主要使用的功能其实是完全不一样的。Emacs 中所有的快捷键可以查到定义的文件,从而进行修改。想象一种情况,为了减少我们按快捷键的次数以及难度。我们统计一段时间内使用 Emacs 各个功能的次数(插件 keyfreq),然后重新定义对应的快捷键。 由于我自己之前主要使用的是 vim,所以也给 vim 用户一个相对于合理的替换过程: 当成普通的 vim 使用 逐步接触 org-mode 相关的功能 使用 emacs 其他的特性","link":"/post/monthly-issue-202004.html"},{"title":"【每月分享】 202005 Newsletter","text":"Newsletter 从去年开始给我一种 RSS 复兴的感觉,这个月尝试使用 Newsletter。对于创作者来说,RSS 不仅无法统计数据,也很难开展会员模式。Newsletter 通过邮箱订阅的的手段,完美解决这两个问题,国外开始有一站式的解决方案,可能几个月之后也会在国内火起来。推荐自己订阅的一些邮件组给大家。 PRODUCT THINKING · 产品沉思录精选:第一个付费订阅的邮件周刊,目前的价格是 199 元/年。根据少楠自己写的介绍,内容包括但不限于产品设计,服务设计,数据分析,互联网技术,经济学,心理学,社会学,决策学,自然科学,城市规划,零售,团队管理等内容。每周会推荐几篇网上比较好的文章,偶尔也翻译一些英语文章。挑选几篇我觉得不错的公开内容: 原子笔记法:Zettelkasten 如何管理信息:P.A.R.A. 是什么及在 Notion中的应用 Λ-Reading 阅读相关分享,作者的读书笔记网站也值得一看 — Read the Word,Read the World.。推荐内容: 路径依赖和困扰计算机的简单问题 - Λ-Reading 号外:知识管理工具 - Λ-Reading 中文为数不多关于 TiddlyWiki 的介绍。 透明盒子计划 深度阅读分享,盒子对应 Zettelkasten。 透明盒子计划 - 透明盒子计划 Superorganizers 对国外人士的采访,有关于效率、数字生活等。目前只看他的免费内容…… How to Make Yourself Into a Learning Machine - Superorganizers:对一名高中辍学的小哥的采访,介绍来一些自我教育的方法。 阅读 How to take smart notes,方法及工具 - 少数派:Zettelkasten 这种做笔记方法慢慢开始要在国内流行起来,自己已经关注差不多超过半年的时间,接下来也在计划写一篇相关的博客文章。 Human Programming Interface 简单看来一下,利用 py 包和 Emacs 管理所有相关的个人数据,挺疯狂的。 上古论坛差不多十年前的帖子, 我的千书阅读计划 - 意欲蔓延 - Hi!PDA Hi!PDA fatdragoncat 通过阅读成为一名自由职业者。帖子中介绍大量篇幅介绍如何高效阅读、锻炼、自我管理等等。在印象笔记中找到几年前自己写的笔记,现在重新整理一下相关的内容,并分享给大家。 AndyMatuschak - Making sense of Design Unbound vs. prior theories of collaborative design work - Twitch [[Evergreen notes]]的创始人公开展示写作的过程。通过这个视频可以发现他使用的笔记软件是 [[Bear]],看起来 Reference 和 Backlink 都是手动输入的,不过这样也符合 [[Zettelkasten]] 的原则。只是 [[Roam Research]] 这样的软件让我们变懒。 莫言获得诺贝尔文学奖发表的演讲中有一个故事:到了荒滩上,我把牛羊放开,让它们自己吃草。蓝天如海,草地一望无际,周围看不到一个人影,没有人的声音,只有鸟儿在天上鸣叫。我感到很孤独,很寂寞,心里空空荡荡。有时候,我躺在草地上,望着天上懒洋洋地飘动着的白云,脑海里便浮现出许多莫名其妙的幻象。我们那地方流传着许多狐狸变成美女的故事,我幻想着能有一个狐狸变成美女与我来作伴放牛,但她始终没有出现。但有一次,一只火红色的狐狸从我面前的草丛中跳出来时,我被吓得一屁股蹲在地上。狐狸跑没了踪影,我还在那里颤抖。有时候我会蹲在牛的身旁,看着湛蓝的牛眼和牛眼中的我的倒影。有时候我会模仿着鸟儿的叫声试图与天上的鸟儿对话,有时候我会对一棵树诉说心声。但鸟儿不理我,树也不理我。许多年后,当我成为一个小说家,当年的许多幻想,都被我写进了小说。很多人夸我想象力丰富,有一些文学爱好者,希望我能告诉他们培养想象力的秘诀,对此,我只能报以苦笑。 机器学习 谈谈推荐系统中的用户行为序列建模 - 知乎 一篇关于用户行为序列建模的文章,基本上常用的方法都介绍了。 和上一次 “从谷歌到阿里,谈谈工业界推荐系统多目标预估的两种范式 - 知乎[[机器学习实践]][[MTL]]” 属于同一个作者 目前主流推荐系统框架 [[Deep Neural Networks for YouTube Recommendations]] 中的 Matching 和 Ranking。另外可能还有规则模块。 pooling-based architecture 范式,用户行为是无序集合,使用 sum/max pooling 或各种 attention [[Deep Neural Networks for YouTube Recommendations]] 中将用户观看过的视频序列取到 embedding 后,做一个 mean pooling 作为用户历史兴趣的表达 Ranking 阶段:[[DIN]] target item 和行为序列的 item 做一个 attention,得到一个 weight,然后加权求和。 结合 [[Transformer]] 做 self-attention 并行的建模长序列依赖,除去用户行为序列中的噪声:[[Behavior Sequence Transformer for E-commerce Recommendation in Alibaba]] sequential-modeling architecture 范式,用户行为当成一个具有时间属性的序列,使用 RNN、LSTM、GRU 等 [[Perceive Your Users in Depth: Learning Universal User Representations from Multiple E-commerce Tasks]] Property Gated LSTM 推荐中的序列化建模:Session-based neural recommendation - 知乎 上面两种方法都是将用户行为经过 pooling/attention/rnn 的处理,聚合成用户行为序列的 embedding,再和其他的特征 concat 在一起,经过 mlp 后接 sigmod/softmax 抽取聚类出用户多峰兴趣,Capsule 阿里 [[MIND]] 胶囊网络 辅助损失函数 [[DIEN]] 兴趣提取和兴趣演化,以最后一个 hidden state 做为用户兴趣的表达。兴趣提取模块,使用隐状态和下一件商品预测做二分类。不加入辅助loss,GRU 的隐变量完全受限于最终点击的 label,加入后能约束 GRU 每个隐状态表示其本身的兴趣。 提升用户序列长度,可以带来可观的 auc 提升。[[MIMN]] Applying Deep Learning To Airbnb Search:一篇关于从 GBDT 模型迁移到深度模型的工业实践记录 paper。对于我这种没有经历过这种技术迭代的人来说,工业级的深度模型上线比想象中的要困难。作者们针对自己遇到的比如 listing embedding 训练不充分、如何判断 feature 的重要性等问题设计实验去验证以及给出解释。严谨的精神值得吾辈学习。 其他 出于对 Roam Research 开发者的不放心,已将全部文档迁移到 Obsidian。目前还在探索新的工作流,5 月分享不可避免产生拖延。另外还在寻找一种建立 Digital Garden 的方法。","link":"/post/monthly-issue-202005.html"},{"title":"【每月分享】 202006 Never Reading","text":"这一份 6 月的阅读总结来的有一点晚。前几年一直断断续续在实践 GTD,人的拖延症超乎想象,学到的一个经验是 「Now or Never」。所以,这个月将自己的阅读列表取名为「Never Reading」。 笔记方法精进 Roam Research 引起现在这一波 Backlink 笔记软件浪潮,本月依然阅读一些和笔记方法相关的文章。 我的 Zettelkasten 卡片盒笔记法实践 | 吕立青的博客 文章链接 上个月介绍过,自己已经从 Roam Research 迁移到 Obsidian,然后就看到吕立青这一篇基于 Obsidian 的 Zettelkasten 实践。文章中将卡片盒笔记分拆分成四步: 1️⃣ 第一步:必须用自己的话写笔记卡片,以确保你将来能够理解。 2️⃣ 第二步:无论何时添加新笔记,主动查找可链接到的已有笔记。 3️⃣ 第三步:通过添加新记录并联系起来,延续这一系列的连续思考。 4️⃣ 第四步:使用 Anki 间隔重复加深记忆,主动由大脑触发远程联想。 搞笑地是,在他写出这篇文章没有多久之后,已经开始尝试往 Roam Research 上迁移……另外,为了更好在国内推广,他参与发起 roam/cn 组织,从英文世界翻译一些推特、视频以及分享一些个人的案例。 Zettelkasten note-taking in 10 minutes 两条原则: Don’t try to get this method perfect from the get go. The advanced practices are useful only when you’ve got close to 1000 notes My productivity app for the past 12 years has been a single .txt file 12 年间使用一个 txt 进行任务管理方法分享。作者提到 to do list 变成 what done list 的过程,每天晚上将日历中第二天的代办事项整理到 txt 中,第二天顺手记录任务相关的信息(比如讨论出的结论,或者得到的信息)。结合自己使用经历,OmniFocus 是一个 to do list,基于纯文本的任务管理方式(org-mode 或 taskpaper)更容易成为 what done list。 商业 滴滴重踩油门_详细解读_最新资讯_热点事件_36氪 不开玩笑地说,看完这里面的分析,我才理解公司很多的战略。 淘宝宣战拼多多的前夜:吕晋杰、陈琪、徐易容和葛永昌的至暗时刻 和很多同学聊天,17 年找工作的时候低估了拼多多的潜力。 淘宝 PC 转移动互联网时,流量入口从网页短 300 个减少到手淘 app 48 个。是不是能解释淘宝这几年涌现出那么多的推荐系统相关的问题。 电视广告投放策略以及如何理解流量暴涨,拼多多上一直很火爆的「百亿补贴」 任何人都可以成为英雄,哪怕是做了一件不起眼的事情。 快手的普通,抖音的美好,算法的价值观 - 知乎 算法没有价值观,算法只会实现设计者的意图。 主动降低算法效率,是为了实现某些短期无法衡量的业务目标。 抖音将流量集中在头部。 快手整体的点击率被牺牲,普通人的流量被保证。 抖音说记录美好生活,快手说记录世界记录你。 阅读 人生总有一刻,我们会开始思考死亡 茨威格在《人类的群星闪耀时》所说的那种幸运是什么 —— 「最大的幸运,莫过于在年富力强的时候,发现了自己的使命」 人生总有一刻,我们会开始思考死亡 - 知乎 [[张潇雨]] 于是我发现,面对死亡最终可能只有两种方法。 一种是将自己与一些更宏大的东西联系起来:一个数学定理、一本文学著作、一件艺术作品或一种恒久的信仰。马尔克斯与康德靠《百年孤独》与《纯粹理性批判》遗世独立,米开朗基罗把《创世纪》和《最后的审判》印刻在西斯廷大教堂里,供千万后朝拜——他们肉身虽灭,但精神不朽——反正建筑是永远戳在那儿的。 还有一种就是,生活在当下的每个瞬间里,不烦扰过去、不担忧将来。 即刻半月刊 6.18?即刻重新开放,之前对这个社区没有太多印象,尝试关注一些人之后,信息流的质量也不错。「即刻半月刊」是某些爱好者挑选的一些即友发言集合。摘录一些我觉得有意思的内容。 老罗带货首卖小米的中性笔:数量太少。之前看到过一个分析,抖音自己做电商最大的困难点在于没有用户的物流地址。简单想一下,用户可能在填写地址这一步流失。 @Rey_L 我在判断哪家公司的产品会换灰色皮肤的时候,基本都猜对了hhh,滴滴头条一定会做,京东会做,淘宝也许会做,拼多多肯定不做。 微信小程序减少 App Store 在国内的下载量。不过大部分巨头的小程序还是想要从微信中引流的。 底下有回复cite了一个working paper,大意说的是名校(elite education,这里用的是211高校与非211高校的断点回归)能够给学生带来的起薪上 30-45% 的提升,其原因在于名校当中的social network,elite的peer普遍家庭条件更好,成绩也更好。上网课带来不了这种social connection…所以说不单只是知识改变命运,环境也很重要 所谓“商业模式”其实指的是这家公司的“价值创造模式”,即用什么样的模型创造了更多价值。 世界上现存所有的商业模式无非三种,一是[[边际效应]](规模效应/协同效应),二是[[双边效应]],三是梅特卡夫[[网络效应]]。不同的价值创造模型,带来不同的增长动力,继而带来不同的货币化方法。 滴滴是什么模型? A/B test只能做模型的小优化,但找不到大的绝对的增长点,所以除了推荐系统里的参数,即刻的很多产品决策希望尽量远离A/B test 张小龙的饭否,张一鸣的微博,黄峥的微信公众号,很可惜这几个都成了过去形态。现在只剩下王兴的饭否了。 一个反向小思考:兴趣社交刚需归刚需,社交app的本质还是信息分发。RSS订阅20周年,分发的有效性也不是什么相似推荐,^而是真正提供专注力的阅读^。因为个性推荐的本质就是专注力。信息廉价甩卖的今天,打开微博广场/抖音主页/朋友圈(广告),用户最需要的不是新鲜事而是减少噪音的阅读器,人永远看到自己想看到的,产品顺水推舟不也是更讨巧,所以需要设计者克制。沟通永远是双向的,当用户感到一个舒适被接纳的舆论场所,也会更加有表达欲。 芒果系这么多年都在做一件事,就是把握这个时代的情绪。[[乘风破浪的姐姐们]] 机器学习 本月 KDD 2020 的文章应该已经放出,推荐阅读 Airbnb 深度模型实践相关的文章 Managing Diversity in Airbnb Search 以及 Improving Deep Learning For Airbnb Search。 7 月份希望能写一篇博客分享自己的阅读笔记。 神经网络中对需要concat的特征进行线性变换然后相加是否好于直接concat? - 知乎 [[机器学习]] concat 没有信息融合,也没有信息缺失 add 不同向量之间的权重相同,会导致信息缺失。待融合的特征具有相同分布,或特征属于同一类,直接相加才有可能提升模型性能。 concat + MLP 能够自动学习不同 channel 的权重,MLP 能引入非线性。利于通道间的信息融合,计算量大。 【机器学习】Bootstrap详解 - 知乎:随机森林里面用到的数据重采样方法,老板要求训练两个有差异模型时给我推荐的方法。 BERT 可解释性-从"头"说起 - 知乎:蛮有意思的对 BERT 组件效果分析,这位作者举的例子有些蹭热点。 都9102年了,别再用Adam + L2 regularization了 - 知乎:说明为什么要用 AdamW。另外推荐一下,之前一位同事写的 AdamW 实现:L2正则=Weight Decay?并不是这样 - 知乎","link":"/post/monthly-issue-202006.html"},{"title":"iPad Pro 开箱","text":"好久没有更新博客,差不多都忘记 hexo 的指令了。 上周六在苹果官网订了 9.7 英寸 iPad Pro WLAN 32GB - 金色 ,前几天刚好到了,所以写一篇庆祝一下。 自己买一个刻字版的Ipad,发货速度比正常的慢了3天左右。Ipad是从四川那边用顺风次日达发过来的,难道苹果工厂往内陆迁了? 外包装就是一个普通的纸盒,蛮干净的,所以路上没有遭遇暴力投递。 封口处有一个小箭头提示,从那里轻轻一拉,就打开了包装。 跟一般的包裹不同,里面没有填充其他减震物。 然后就是精心包装的iPad。 迫不及待的打开盒子,新鲜的“苹果味”扑面而来。 取出iPad,里面还附赠充电器和Lightning的数据线,只不过没有耳机。 撕掉iPad的保护膜,翻到背面,就能看见刻的字。本来打算刻两行头文件,却被提示刻字内容不能包含有尖括号或者双引号。最终选择下面这两句符合要求的话。 最后,按照提示一路设置iPad,然后就有一台价值4000+的游戏机。下次有空再来 记录一下自己都装了什么App。","link":"/post/newipad.html"},{"title":"那些年听过的播客","text":"前几天在刷微博时,突然发现 Checked 休更。蛮震惊的,于是在他下面留了言。 后来仔细一想,接触播客也快四年多了。刚开始疯狂地时候,走路的时候也带着耳机在听。不过现在胆子越来越小,主要在跑步的时候通过无线耳机收听节目。四年多的时间里面,有播客听过,有播客开始,也有些播客半死不活。正好借这个机会分享一下我听过的播客。 播客是什么?其实有两种解释:一是一种数字广播,制作方将节目以音频的形式放在指定网站上,用户可以将节目下载到自己喜欢的硬件中收听。二是特指 iOS 中的一个软件——Podcast,通过这个软件能订阅以及收听音频节目。 科技 IT 公论 说起中文播客,就不得不提 IPN 播客网络,他们旗下有很多的博客节目,IT 公论正是其中的一个。由李如一和 Rio 主持,主要探讨科技和人文的关系,由于主播的限制,更多关心 Apple 生态下的新闻。可惜的是于 2106 年停播,不过早期的一些节目还是值得一听。 Checked 本文最开始提到的节目,有文刀汉三、千千、Hum三个人主持,主要讨论如何使用 App 进行数字化生活。比较经典的有#1: 日历/待办事项/GTD、#2: 如何记一手明白账、#49: 访谈「也谈钱」: 你的钱是可以给你赚钱的,也可以说是我听过后实践最多的节目。 生活 太医来了 一档医生谈话类节目。之前很喜欢的节目,高考之前也有学医的想法,听三位太医讲他们大学生活以及医院工作都有一种触动。更关键地是,这个节目也是很好的获得一些基础医学常识的渠道。比如其中有一期节目讲解了医生的字,听完之后才了解到龙飞凤舞的字迹主要是不希望患者看明白。 狗熊有话说 主播大狗熊,注重分享设计、生活、运动、阅读等方面的知识。更重要的是,通过收听这么长的节目,可以看见狗熊的成长轨迹。从当初的云南昆明,如何通过自己的规划,最终全家移民新西兰。 Byte.Coffee 比较杂的节目,主播 MilkShake 羊,斯坦福博后,目前在南京一所大学任教。 在北大不吐槽会死 三名北大学生的吐槽会,取材也是方方面面,从他们的大学生活到现在毕业之后对工作的感悟。内容有些时候比较脏。 纽约文化沙龙 在美国留学的学生主办,每期会邀请一些嘉宾,讲述特定主题的内容。我知道的类似组织还有安城文化沙龙,不过他们只分享视频。 蒋勋细说红楼梦 蒋勋的红楼梦应该是很有名的节目,某一位粉丝通过播客形式将这些音频分享出来。其实之前我也搞过这方面的内容,WordPress 有专门的播客插件,从技术角度来说发布播客还是很简单的。 编程 内核恐慌 这是另外一档由 Rio 主持的节目,听名字就很硬派。讨论过程序员的方方面面,比如编辑器、字体、键盘、自由职业等等。可惜目前保持半年更新的频率。 Teahour.fm 以及代码时间 这两个都是访谈类节目,邀请过各种各样的程序员都有。对于立志投身于软件产业的人具有一定的参考价值。 工具 收听播客大概有两种主要的工具,第一种是专用的软件,比如喜马拉雅、蜻蜓 FM等,能直接在软件内部搜索你想听的节目收听,而且我在上面的介绍的节目大多都会在这些平台发布。但是,我更推荐第二种方法,使用泛用性客户端收听节目。在 iOS 中,系统自带播客软件,也可以去下载如Overcast或者Castro Podcasts等第三方软件。目前我自己常用的是 Overcast,比起系统自带的,提供了人声增强(能解决部分播客音质太差问题)以及智能变速(自动调整速度)等功能。在 Android 中,推荐 360 Podcast ,老周的公司出品的良心应用,良心到国内都没有推广过…… 最后,对于一些只有在喜马拉雅等地方可以收听的节目,可以使用播客 RSS Feed这个网站获得订阅链接。","link":"/post/podcast-list.html"},{"title":"小学十周年同学聚会","text":"不知不觉中,小学毕业快要十年了(2008-2018)。前几个月,就有同学开始策划组织聚会。就这样把我的思绪拉回十年前的。 看上面的图可以知道,学校的名字叫做——晓村小学。值得注意地是,晓村不是地名。根据一般的套路,这样取名都是有故事的。查阅百科可以看到下面的介绍:「晓村小学位于沿海的椒北平原,创办于1929年2月26日,当年,中共地下党员、著名教育家林迪生、地下党的外围组织—“乙丑读书社”社员陈鹤亭,留日学生陈诗斋,当地豪绅陈孔彰等发起创办了这所红色的学校。当年他们效法南京晓庄师范“教学做”合一的模式创办,故把把学校取名为晓村小学。随后,陈叔亮、徐明清等一大批地下党员相继来晓村任教,宣传马克思主义,传播革命真理,创造了晓村校歌,颁布了晓村校训,办学方向十分明确。大革命时期,他们以学校作为地下党活动场所,曾先后有十多位地下党员驻足晓村小学,从事革命活动并创造了许多惊天动地。可歌可泣的辉煌业绩,被誉为“荒原里的灯塔”,享誉椒江南北两岸。」所以,这是一所有革命传统的学校。目前来说,学校以及异址重建,和百度百科中的介绍还有关系的只有校名和校歌。 如果让我来评价的话,说到底是一所农村学校。记得我自己当时的时候,教育水平是很差的,不知这么多年过去了有没有提高。当年的校舍也很朴素,但是前几年,也进行了现代化改造,总的来说比我们当年的条件不知道好到哪里去。 聚会定于大年初五举行,下午一点的时候我就差不多达到了学校。找到原来班级的时候,也有很多人在里面了,很多同学我们都十年没有见过了,却发现还能叫出他的名字。和各位老板聊到了3点左右,才开始活动。 翻出下面的老照片,后面一排的左边罗伟迪大佬已经出国工作。中间的陈子翔同学没有来参加聚会,也不知道近况如何。右边就是我。前面一排左边的是陈凌超,右边是罗飞。见到他们,发现他们是越来越强壮。说起来,我还和陈哥一起演过小品。陈哥当时演的角色,用现在来说就是女装大佬。演完之后,我还听见当时有人说“原来这个是男的”。可见我陈哥功力深厚。罗哥是我同桌,被我坑过很多次。 教室里大概来了三十多位同学以及三位老师。在班长的提一下,我们首先进行了自我介绍,然后三位老师讲了一些话。 第一位是六年级那年教数学的郑必君老师。还记得当年最后一节数学课时,老师讲起自己的小学同学,很多人到那时候都没有再见过面了。谁知道,再次见到他也是十年后了。他又讲了自己的其他故事,82年高中毕业,高考失败之后,顶替老爸过来教书,很多同学进行高复,现在都当了官。自己由于有了工作,便没有继续去高考了,安心从事小学教育工作。当有同学和他联系举办同学会时,非常高兴,特地找出毕业时拍的照片。 第二位是教过我最多的数学陈平芬老师。最早是在二年级的时候,当时教我的数学老师怀孕了,然后她过来代课。之后一直到五年级时,她自己怀孕了,由其他老师代课,就再也没有教过我们了。陈老师回忆自己刚开始教书时,就像我们现在这么大。没有太多想法,只想着怎么把我们教好。印象最深的是,有一次找我上去写题目,写完之后,看见我最后算错了答案,说了一句“太粗心了,昨天的试卷也这样算错了”。不知道,当时如果改正了这个错误,现在会在哪里…… 最后一位是四到六年的教授语文同时也是班主任的陈菊红老师。印象中,听写没有通过,我还抄过50遍的课后词组。 完成介绍之后,班长开始播放精心制作的十周年会议视频。视频播放的时候,点点停停,给我们介绍老照片中的每一个人。十年光阴,弹指一挥间就过去了。 最后,在小雨中留下了一张合影。很可惜,许多同学由于种种原因,没有机会过来合影。也不知道剩下的时光。还可以留下多少张这样合影。 晚餐选在了一家海鲜餐厅,不过大家有些拘束,酒准备好了,都没有讲故事的人。反倒是吃完饭之后的抢红包调动了全场的气氛,微信群中出现的红包之后,伴随着激动和叹息,可惜我自己抢到了很多0分的红包。天下无不散的宴席,最终我们散了。下次再赴十年之约。 在这次聚会之前,我看到了下面的两段话。 毕业十年的同学聚会,大概是最“丑陋”的同学会。此时,人生的分水岭已清晰可见。同学已完全褪去学生时代的单纯。每个人都变得居心叵测,面目狰狞。华丽的包厢里全是人生的演员,华丽的衣服里全是生活的褶皱。同学们言语之间未必是炫耀,但我们会以为他在炫耀;同学之间未必没真情,但我们已经扭曲了真情。因为人到中年,纯真已经退却,人生尚未悟透;危机四伏,刀光剑影。 毕业20年之后,去参加一下同学聚会,不是要你去攀比人生成就,也不是要你去利用同学资源,而是看看人生20年长跑之后,决胜千里的东西究竟是什么,输掉人生长跑的东西又是什么? 显然,这两段话是对于大学毕业来说的。但让我下定决心去参加聚会的,正是这“看一下决胜千里的东西究竟是什么?”十年间,很多人事业有成,很多人娶妻生子,还有一些像我这样还没有走出校园,如同新华字典中所说,我们都有光明的前途。现在回想起来,小学真是无忧无虑,每天上课听讲,写作业,老师的有些教育方法很野蛮,但也学到了知识。放学后,和同学去附近采桑叶养蚕,去池塘边钓龙虾,周末一起玩游戏王。回忆是美好的,可人终究要去看看世界有多大。","link":"/post/primary-school-classmate-10th-anniversary-party.html"},{"title":"重构笔记本系统","text":"几天前在手机上使用为知笔记时,发现已经完成创建1000条笔记的成就。记不太清楚这个账号是什么时候开始使用的,但是笔记的数量确实吓自己跳。原来已经这么多了,说句实话,很多内容也只是简单的收藏了一下,之后都再没有碰过,而且自己的笔记本分类很混乱,借这个机会准备重构笔记本系统。 知乎上面关于笔记本系统或者体系的讨论有很多,之前就是参考相关回答的,但都没有坚持搞下去。所以,这次的重构我找的是其他的参考资料,最主要的是陈华伟的知识管理训练营的第五、六两讲。说来也巧,陈华伟几年前在知乎上也分享过他构建笔记本系统的思路,当时我也看过,收藏了,但是到今天都没有按照他说的实践。 这里分享我在他知识管理训练营里面学习到的方法。 搭建笔记本系统分成三个步骤: 第一步,利用思维导图梳理自己的知识体系,明确知识获取的途径。 第二步,在笔记软件中建立相应的文件夹,将获取的知识存储到笔记本软件中。 第三步,在实践中不停的迭代思维导图以及文件夹,这一步是最重要的,因为没有人可以一步到位,完成一个完美的笔记本系统。 然后,我认为这个课程最有价值的部分在于如何给笔记软件中的文件夹命名。陈老师提出了一种综合杜威十进制分类以及Wikipedia分类的方法。将一个文件夹的名字分成三个部分,即 数字编号 - 四大分类 | 具体名称。其中数字编号是从杜威十进制(美国图书馆图书分类方法)中学习得到,通过数字编号,笔记软件可以自动对文件夹进行排序。这是我最佩服的一点,经常在图书馆学习借书,却没有想到学习这种方法来分类笔记本。四大分类是参考Wikipedia,将所以的文件夹分成工作、学习、生活、兴趣四个维度。最后具体名称就是文件夹内放的笔记相关的命名了,我想大部分人之前也才做到这一步吧。 通过这种方法之后,我快速的整理出了新的笔记本系统。 如果你也想学习这种方法,建议去找上文提到的课程学习一下。 本文写作过程中,使用幕布搭建框架。幕布是一个简洁、高效的大纲软件。你可以通过我的邀请链接注册,并将免费获赠15天幕布高级版。","link":"/post/rebuild-notebook-system.html"},{"title":"李宏毅强化学习课程笔记 Actor Critic","text":"我的笔记汇总: Policy Gradient、PPO: Proximal Policy Optimization、Q-Learning Actor Critic Sparse Reward Imitation Learning Actor Critic policy gradient 给定在某个 state 采取某个 action 的概率。 baseline b 的作用是保证 reward 大的样本有更大的概率被采样到。 从当前时间点累加 reward,并且当前 action 对后面的 reward 影响很小,添加折扣系数。 PG 效果受到采样数量和质量影响。 Q-learning 状态价值函数 Vπ(s)V^{\\pi}(s)Vπ(s) 状态行动价值函数 Qπ(s,a)Q^{\\pi}(s,a)Qπ(s,a) Actor-Critic 用 V 和 Q 替换 PG 中的累积 reward 和 baseline。新的模型需要训练两个网络,比较困难。 Advantage Actor-Critic 用 V 去替代 Q,能降低模型整体方差(MC 到 TD)。最下面两个公式转化是由实验得到。 训练过程: tip: actor 和 critic 具有相同的输入 s,可以共享部分网络结构。 output entropy 作为 pi 的正则项,entropy 越大采样效果越好。 Asynchronous Advantage Acotr-Critic A3C 利用多个 worker 去训练。 每个 worker 复制主模型的参数。 每个模型单独采样,并且计算梯度。 更新全局参数。 Pathwise derivative policy gradient 该网络不仅仅告诉 actor 某一个 action 的好坏,还告诉 actor 应该返回哪一个 action。 将这个 actor 返回的 action 和 state 一起输入到一个固定的 Q,利用梯度上升更新 actor。 完整的训练过程和 conditional GAN 类似, actor 是 generator,Q 是 discriminator。 算法: action 由训练的 actor 决定 利用 s 和 a 更新 Q GAN 和 AC 方法对比","link":"/post/reinforce-learnning-basic-actor-critic.html"},{"title":"李宏毅强化学习课程笔记 Imitation Learning","text":"我的笔记汇总: Policy Gradient、PPO: Proximal Policy Optimization、Q-Learning Actor Critic Sparse Reward Imitation Learning apprenticeship learning 无法从环境中获得 reward。 某些任务中很难定义 reward。 人为设计的奖励可能导致意外的行为。 学习专家的行为。 Behavior Cloning 监督学习,但是样本有限。 Dataset Aggregation 通过行为克隆得到 actor π1\\pi_1π1 利用 π1\\pi_1π1 和环境交互得到一些新的样本 由专家对上一步采样得到的样本进行标注 利用新得到的样本训练 π2\\pi_2π2 如果机器的学习能力有限,可能复制专家多余无用的动作。监督学习无法区分哪些是需要学习、哪些是需要忽视的行为。 Miss match 监督学习中,我们假设训练数据和测试数据有相同的分布。Behavior Cloning 中可能分布不同。 Inverse Reinfofcement Learning 反向强化学习 没有 reward 函数,通过专家和环境互动学到一个 reward function,然后再训练 actor。 类似于 GAN 的训练方法(actor 换成 generator,reward function 换成 discriminator)。 学到 actor 的 pi 后,调整 reward function,保证专家的行为得分大于学到的行为。","link":"/post/reinforce-learnning-basic-imitation-learning.html"},{"title":"李宏毅强化学习课程笔记 Sparse Reward","text":"我的笔记汇总: Policy Gradient、PPO: Proximal Policy Optimization、Q-Learning Actor Critic Sparse Reward Imitation Learning Reward Shaping 如果 reward 分布非常稀疏的时候,actor 会很难学习,所以刻意设计 reward 引导模型学习。 Curiosity Intrinsic Curiosity module (ICM) 在原来 Reward 函数的基础上,引入 ICM 函数。ICM 鼓励模型去探索新的动作。最后 ICM 和 Reward 和越大越好。 鼓励探索新动作之后,会导致系统风险变大。对比预测的下一个状态和真正的状态的差异程度进行抑制。 Feature Ext 对状态进行抽取,过滤没有意义的内容。 Network 1 预测下一个状态,然后再和真实状态计算 diff 程度。 Network 2 预测 action,和真实的 action 进行对比。如果两个 action 接近,说明 f 可以进行特征提取。重要程度计算。 Curriculum Learning 规划学习路线,从简单任务学习。 Reverse Curriculum Generation Hierarchical Reinforcement Learning 对 agent 分层,高层负责定目标,分配给底层 agent 执行。如果低一层的agent没法达到目标,那么高一层的agent会受到惩罚(高层agent将自己的愿景传达给底层agent)。 如果一个agent到了一个错误的目标,那就假设最初的目标本来就是一个错误的目标(保证已经实现的成果不被浪费)","link":"/post/reinforce-learnning-basic-sparse-reward.html"},{"title":"李宏毅强化学习课程笔记 PG PPO Q-Learing","text":"Info 课件下载:Hung-yi Lee - Deep Reinforcement Learning 课程视频:DRL Lecture 1: Policy Gradient (Review) - YouTube Change Log 20191226: 整理 PPO 相关资料 20191227: 整理 Q-Learning 相关资料 20200906: 拖延半年多没有整理笔记,将剩下的内容整理到单独的笔记中。 我的笔记汇总: Policy Gradient、PPO: Proximal Policy Optimization、Q-Learning Actor Critic Sparse Reward Imitation Learning RL 基础 强化学习基本定义: Actor:可以感知环境中的状态,通过执行不同的动作得到反馈的奖励,在此基础上进行学习优化。 Environment:指除 Actor 之外的所有事务,受 Actor 动作影响而改变其状态,并给 Actor 对应的奖励。 on-policy 和 off-policy 的区别在于 Actor 和 Environment 交互的策略和它自身在学习的策略是否是同一个。 一些符号: State s 是对环境的描述,其状态空间是 S。 Action a 是 Actore 的行为描述,其动作空间是 A。 Policy π(a∣s)=P[At=a∣St=s]\\pi(a|s)=P[A_t=a|S_t=s]π(a∣s)=P[At=a∣St=s] 代表在给定环境状态 s 下 动作 a 的分布。 Reward r(s,a,s′){r(s,a,s^{\\prime})}r(s,a,s′) 在状态 s 下执行动作 a 后,Env 给出的打分。 Policy Gradient Policy Network 最后输出的是概率。 目标:调整 actor 中神经网络 policy π(θ)\\pi(\\theta)π(θ),得到 a=π(s,θ)a=\\pi(s, \\theta)a=π(s,θ),最大化 reward。 trajectory τ\\tauτ 由一系列的状态和动作组成,出现这种组合的概率是 pθ(τ)p_{\\theta}(\\tau)pθ(τ) 。 pθ(τ)=p(s1)pθ(a1∣s1)p(s2∣s1,a1)pθ(a2∣s2)p(s3∣s2,a2)⋯=p(s1)∏l=1Tpθ(at∣st)p(st+1∣st,at)\\begin{array}{l}{p_{\\theta}(\\tau)} \\\\ {\\quad=p\\left(s_{1}\\right) p_{\\theta}\\left(a_{1} | s_{1}\\right) p\\left(s_{2} | s_{1}, a_{1}\\right) p_{\\theta}\\left(a_{2} | s_{2}\\right) p\\left(s_{3} | s_{2}, a_{2}\\right) \\cdots} \\\\ {\\quad=p\\left(s_{1}\\right) \\prod_{l=1}^{T} p_{\\theta}\\left(a_{t} | s_{t}\\right) p\\left(s_{t+1} | s_{t}, a_{t}\\right)}\\end{array} pθ(τ)=p(s1)pθ(a1∣s1)p(s2∣s1,a1)pθ(a2∣s2)p(s3∣s2,a2)⋯=p(s1)∏l=1Tpθ(at∣st)p(st+1∣st,at) reward :根据 s 和 a 计算得分 r,求和得到 R。在围棋等部分任务中,无法获得中间的 r(下完完整的一盘棋后能得到输赢的结果)。 需要计算 R 的期望 Rˉθ\\bar{R}_{\\theta}Rˉθ,形式和 GAN 类似。如果一个动作得到 reward 多,那么就增大这个动作出现的概率。最终达到 agent 所做 policy 的 reward 一直都比较高。 Rˉθ=∑τR(τ)pθ(τ)\\bar{R}_{\\theta}=\\sum_{\\tau} R(\\tau) p_{\\theta}(\\tau) Rˉθ=τ∑R(τ)pθ(τ) 强化学习中,没有 label。需要从环境中采样得到 τ\\tauτ 和 R,根据下面的公式去优化 agent。相当于去求一个 likelihood。 ∇f(x)=f(x)∇f(x)f(x)=f(x)∇logf(x)\\nabla f(x) = f(x) \\frac{\\nabla f(x)}{f(x)}= f(x) \\nabla \\log f(x)∇f(x)=f(x)f(x)∇f(x)=f(x)∇logf(x) ,这一步中用到对 log 函数进行链式求导。 ∇Rˉθ=∑τR(τ)∇pθ(τ)\\nabla \\bar{R}_{\\theta}=\\sum_{\\tau} R(\\tau) \\nabla p_{\\theta}(\\tau) ∇Rˉθ=τ∑R(τ)∇pθ(τ) =Eτ∼pθ(τ)[R(τ)]logpθ(τ)]≈1N∑n=1NR(τn)∇logpθ(τn)=1N∑n=1N∑t=1TnR(τn)∇logpθ(atn∣stn)\\begin{array}{l}{=E_{\\left.\\tau \\sim p_{\\theta}(\\tau)[R(\\tau)] \\log p_{\\theta}(\\tau)\\right]} \\approx \\frac{1}{N} \\sum_{n=1}^{N} R\\left(\\tau^{n}\\right) \\nabla \\log p_{\\theta}\\left(\\tau^{n}\\right)} \\\\ {=\\frac{1}{N} \\sum_{n=1}^{N} \\sum_{t=1}^{T_{n}} R\\left(\\tau^{n}\\right) \\nabla \\log p_{\\theta}\\left(a_{t}^{n} | s_{t}^{n}\\right)}\\end{array} =Eτ∼pθ(τ)[R(τ)]logpθ(τ)]≈N1∑n=1NR(τn)∇logpθ(τn)=N1∑n=1N∑t=1TnR(τn)∇logpθ(atn∣stn) 参数更新方法: 在环境中进行采样,得到一系列的轨迹和回报。 利用状态求梯度,更新模型。如果 R 为正,增大概率 pθ(at∣st)p_{\\theta}(a_t|s_t)pθ(at∣st), 否则减少概率。 重复上面的流程。 PG 的例子 训练 actor 的过程看成是分类任务:输入 state ,输出 action。 最下面公式分别是反向传播梯度计算和 PG 的反向梯度计算,PG 中要乘以整个轨迹的 R。 tip 1: add a baseline 强化学习的优化和样本质量有关,避免采样不充分。Reawrd 函数变成 R-b,代表回报小于 b 的都被我们当成负样本,这样模型能去学习得分更高的动作。b 一般可以使用 R 的均值。 tip 2: assign suitable credit 一场游戏中,不论动作好坏,总会乘上相同的权重 R,这种方法是不合理的,希望每个 action 的权重不同。 引入一个 discount rate,对 t 之后的动作 r 进行降权重。 利用 Advantage Function 评价状态 s 下动作 a 的好坏 critic。 PPO: Proximal Policy Optimization importance sampling 假设需要估计期望 Ex p[f(x)]E_{x~p[f(x)]}Ex p[f(x)],x 符合 p 分布,将期望写成积分的形式。由于在 P 分布下面很难采样,把问题转化到已知 q 分布上,得到在 p 分布下计算期望公式。 上面方法得到 p 和 q 期望接近,但是方差可能相差很大,且和 p(x)q(x)\\frac{p(x)}{q(x)}q(x)p(x) 有关。 原分布的方差: Varx−p[f(x)]=Ex−p[f(x)2]−(Ex−q[f(x)])2\\operatorname{Var}_{x-p}[f(x)]=E_{x-p}\\left[f(x)^{2}\\right]-\\left(E_{x-q}[f(x)]\\right)^{2} Varx−p[f(x)]=Ex−p[f(x)2]−(Ex−q[f(x)])2 新分布的方差: Varx∼p[f(x)]=Ex∼p[f(x)2]−(Ex∼p[f(x)])2Varx∼q[f(x)p(x)q(x)]=Ex∼q[(f(x)p(x)q(x))2]−(Ex∼q[f(x)p(x)q(x)])2=Ex∼p[f(x)2p(x)q(x)]−(Ex∼p[f(x)])2\\begin{array}{l}{\\operatorname{Var}_{x \\sim p}[f(x)]=E_{x \\sim p}\\left[f(x)^{2}\\right]-\\left(E_{x \\sim p}[f(x)]\\right)^{2}} \\\\ {\\operatorname{Var}_{x \\sim q}\\left[f(x) \\frac{p(x)}{q(x)}\\right]=E_{x \\sim q}\\left[\\left(f(x) \\frac{p(x)}{q(x)}\\right)^{2}\\right]-\\left(E_{x \\sim q}\\left[f(x) \\frac{p(x)}{q(x)}\\right]\\right)^{2}} \\\\ {=E_{x \\sim p}\\left[f(x)^{2} \\frac{p(x)}{q(x)}\\right]-\\left(E_{x \\sim p}[f(x)]\\right)^{2}}\\end{array} Varx∼p[f(x)]=Ex∼p[f(x)2]−(Ex∼p[f(x)])2Varx∼q[f(x)q(x)p(x)]=Ex∼q[(f(x)q(x)p(x))2]−(Ex∼q[f(x)q(x)p(x)])2=Ex∼p[f(x)2q(x)p(x)]−(Ex∼p[f(x)])2 在 p 和 q 分布不一致时,且采样不充分时,可能会带来比较大的误差。 从 On-policy 到 Off-policy on-policy 时,PG 每次参数更新完成后,actor 就改变了,不能使用之前的数据,必须和环境重新互动收集数据。引入 pθ′p_{\\theta \\prime}pθ′ 进行采样,就能将 PG 转为 off-ploicy。 和之前相比,相当于引入重要性采样,所以也有前一节中提到的重要性采样不足问题。 Jθ′(θ)=E(st,at)∼πθ′[pθ(at∣st)pθ′(at∣st)Aθ′(st,at)]J^{\\theta^{\\prime}}(\\theta)=E_{\\left(s_{t}, a_{t}\\right) \\sim \\pi_{\\theta^{\\prime}}}\\left[\\frac{p_{\\theta}\\left(a_{t} | s_{t}\\right)}{p_{\\theta^{\\prime}}\\left(a_{t} | s_{t}\\right)} A^{\\theta^{\\prime}}\\left(s_{t}, a_{t}\\right)\\right] Jθ′(θ)=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)] PPO/TRPO 为了克服采样的分布与原分布差距过大的不足,PPO 引入 KL 散度进行约束。KL 散度用来衡量两个分布的接近程度。 JPPOθ′(θ)=Jθ′(θ)−βKL(θ,θ′)J_{P P O}^{\\theta^{\\prime}}(\\theta)=J^{\\theta^{\\prime}}(\\theta)-\\beta K L\\left(\\theta, \\theta^{\\prime}\\right) JPPOθ′(θ)=Jθ′(θ)−βKL(θ,θ′) TRPO(Trust Region Policy Optimization),要求 KL(θ,θ′)<δK L\\left(\\theta, \\theta^{\\prime}\\right)<\\deltaKL(θ,θ′)<δ。 JTRPOθ′(θ)=E(st,at)∼πθ′[pθ(at∣st)pθ′(at∣st)Aθ′(st,at)]J_{T R P O}^{\\theta^{\\prime}}(\\theta)=E_{\\left(s_{t}, a_{t}\\right) \\sim \\pi_{\\theta^{\\prime}}}\\left[\\frac{p_{\\theta}\\left(a_{t} | s_{t}\\right)}{p_{\\theta^{\\prime}}\\left(a_{t} | s_{t}\\right)} A^{\\theta^{\\prime}}\\left(s_{t}, a_{t}\\right)\\right] JTRPOθ′(θ)=E(st,at)∼πθ′[pθ′(at∣st)pθ(at∣st)Aθ′(st,at)] KL 散度可能比较难计算,在实际中常使用 PPO2。 A>0,代表当前策虑表现好。需要增大 π(θ)\\pi( \\theta )π(θ),通过 clip 增加一个上限,防止 π(θ)\\pi( \\theta )π(θ) 和旧分布变化太大。 A<0,代表当前策虑表现差,不限制新旧分布的差异程度,只需要大幅度改变 π(θ)\\pi( \\theta )π(θ)。 参考 【点滴】策略梯度之PPO - 知乎 PPO algorithm 系数 β\\betaβ 在迭代的过程中需要进行动态调整。引入 KLmaxKLminKL_{max} KL_{min}KLmaxKLmin,KL > KLmax,说明 penalty 没有发挥作用,增大 β\\betaβ。 Q-Learning value-base 方法,利用 critic 网络评价 actor 。通过状态价值函数 Vπ(s)V^{\\pi}(s)Vπ(s) 来衡量预期的期望。V 和 pi、s 相关。 Monte-Carlo MC: 训练网络使预测的 Vπ(sa)V^{\\pi}(s_a)Vπ(sa) 和实际完整游戏 reward GaG_aGa 接近。 Temporal-difference TD: 训练网络尽量满足 Vπ(st)=Vπ(st+1)+rtV^{\\pi}(s_t)=V^{\\pi}(s_{t+1}) + r_tVπ(st)=Vπ(st+1)+rt 等式,两个状态之间的收益差。 MC: 根据策虑 π\\piπ 进行游戏得到最后的 G(a)G(a)G(a),最终存在方差大的问题。Var[kX]=k2Var[X]\\operatorname{Var}[k X]=k^{2} \\operatorname{Var}[X]Var[kX]=k2Var[X] TD: r 的方差比较小,Vπ(st+1)V^{\\pi}(s_{t+1})Vπ(st+1) 在采样不充分的情况下,可能不准确。 Another Critic State-action value function Qπ(s,a)Q^{\\pi}(s, a)Qπ(s,a):预测在 pi 策略下,pair(s, a) 的值。相当于假设 state 情况下强制采取 action a。 对于非分类的方法: Q-Learning 初始 actor π\\piπ 与环境互动 学习该 actor 对应的 Q function 找一个比 π\\piπ 好的策虑:π′\\pi \\primeπ′,满足 Vπ′(s,a)≥Vπ(s,a)V^{\\pi \\prime}(s,a) \\ge V^{\\pi}(s,a)Vπ′(s,a)≥Vπ(s,a), π′(s)=argmaxaQπ(s,a)\\pi^{\\prime}(s)=\\arg \\max _{a} Q^{\\pi}(s, a)π′(s)=argmaxaQπ(s,a) 在给定 state 下,分别代入 action,取函数值最大的 a,作为后面对该 state 时采取的 action。 证明新的策虑存在: Target NetWork 左右两边的网络相同,如果同时训练比较困难。简单的想法是固定右边的网络进行训练,一定次数后再拷贝左边的网络。 Exploration Q function 导致 actor 每次都会选择具有更大值的 action,无法准确估计某一些动作,对于收集数据而言是一个弊端。 Epsilon Greedy 小概率进行损失采样 Boltzmann Exploration 利用 softmax 计算选取动作的概率,然后进行采样 Replay buffer 采样之后的 (st,at,rt,st+1)(s_t, a_t, r_t, s_{t+1})(st,at,rt,st+1) 保存在一个 buffer 里面(可能是不同策虑下采样得到的),每次训练从 buffer 中 sample 一个 batch。 结果:训练方法变成 off-policy。减少 RL 重复采样,充分利用数据。 Typical Q-Learning Algorithm Q-Learning 流程: Double DQN DDQN Q value 容易高估:目标值 rt+maxQ(st+1,a)r_t + maxQ(s_{t+1}, a)rt+maxQ(st+1,a) 倾向于选择被高估的 action,导致 target 很大。 选动作的 Q’ 和计算 value 的 Q(target network) 不同。Q 中高估 a,Q’ 可能会准确估计 V 值。Q’ 中高估 a ,可能不会被 Q 选中。 Dueling DQN 改 network 架构。V(s) 代表 s 所具有的价值,不同的 action 共享。 A(s,a) advantage function 代表在 s 下执行 a 的价值。最后 Q(s,a)=A(s,a)+V(s)Q(s, a) = A(s, a) + V(s)Q(s,a)=A(s,a)+V(s)。 为了让网络倾向于使用 V(能训练这个网络),得到 A 后,要对 A 做 normalize。 Prioritized Reply 在训练过程中,对于经验 buffer 里面的样本,TD error 比较大的样本有更大的概率被采样,即难训练的数据增大被采样的概率。 Multi-step 综合 MC 和 TD 的优点,训练样本按一定步长 N 进行采样。MC 准确方差大,TD 方差小,估计不准。 Noisy Net Noise on Action:在相同状态下,可能会采取不同的动作。 Noise on Parameters:开始时加入噪声。同一个 episode 内,参数不会改变。相同状态下,动作相同。 更好探索环境。 Distributional Q-function Q 是累积收益的期望,实际上在 s 采取 a 时,最终所有得到的 reward 为一个分布 reward distribution。部分时候分布不同,可能期望相同,所以用期望来代替 reward 会损失一些信息。 Distributional Q-function 直接输出分布,均值相同时,采取方差小的方案。这种方法不会产生高估 q 值的情况。 Rainbow rainbow 是各种策略的混合体。 DDQN 影响不大。 Continuous Actions action 是一个连续的向量,Q-learning 不是一个很好的方法。 a=argmaxaQ(s,a)a=\\arg \\max _{a} Q(s, a) a=argamaxQ(s,a) 从 a 中采样出一批动作,看哪个行动 Q 值最大。 使用 gradient ascent 解决最优化问题。 设计一个网络来化简过程。 ∑\\sum∑ 和 μ\\muμ 是高斯分布的方差和均值,保证矩阵一定是正定。 最小化下面的函数,需要最小化 a−μa - \\mua−μ。 Reference 强化学习基础知识 - 知乎","link":"/post/reinforce-learnning-basic.html"},{"title":"使用 BackWPup 恢复 WordPress","text":"昨天晚上手贱点了升级服务器上的 Ubuntu 版本,然后发现 WordPress 不能用了…删了nginx装上 Apache 才解决,之后发现主题有问题,一激动就提交工单把服务器重装了… 接下来就是 WordPress 重装的过程,自己一直使用BackWPup 每周备份 WordPress ,所以本以为重装会很轻松. 早上起来将 WordPress 以及 BackWPup 装好.然后就在 BackWPup 里面翻了好久都没有发现怎么还原的按钮…又用百度谷歌搜了一下,也没有教程… 没有办法,只好硬着头皮去看插件的官网,找到 How to restore a WordPress backup? – BackWPup Docs,按照这篇文章的提示成功恢复 WordPress. 恢复数据库 由于我用的是phpmyadmin,所以登录到服务器的phpmyadmin管理页面.选择数据库 WordPress,点击导入,上传BackWPup备份压缩文件中的.sql文件,点击执行,这样数据库中的内容就还原了. 恢复 WordPress文件 这一步只需要将备份文件里面的文件上传到服务器新的网站目录下覆盖就可以了.由于我用的是iTerm2,所以可以在本地使用scp命令 尾声 zz插件,连个一键还原都没有…","link":"/post/restore-wordpress-from-backWPup.html"},{"title":"「Rime 鼠须管」小鹤双拼配置指南","text":"引言 如何将汉字输入到计算机中是一个编码有关的问题,目前市面上主流的方案包括音码、形码、音形码。和大多数人一样,之前我一直使用全拼,而且得益于 NLP 技术发展,使用搜狗输入法搭配云词库,输入效率可以媲美五笔输入法。 但是今天要和大家分享,是从年初开始使用的全新音码输入方案——小鹤双拼。最初关于双拼的概念来自李笑来《把时间当作朋友》: 在很长的一段时间里,我常言之凿凿地对同学们说“练习打字完全是浪费时间。”我当时的逻辑是这样的。首先,我认为王码五笔字型输入法是给打字员用的。为什么要学它?难道你将来想要当个打字员?我总觉得五笔字型知识一种抄写输入法,因为用他输入时只能边看边打。而对真正创造内容的人来说,先用纸和笔写出来再录入电脑,还有比这更荒诞的事情吗?学习拆字学法已经很累人了,还要练什么指法,见鬼。更不用说这种所谓的输入法对思考的干扰——不仅要把字拆开再输入,还要按照莫名其妙的方法拆字。其次,盲打。我现在不是盲打,只是两根手指输入速度就已经很快了(至少比手写快)。 这样看来,我还有必要学习什么五笔字型和盲打吗? 在我有了这些定见很久之后,发生了一件事情。 那是在1997年,我25岁。当时互联网除了聊天室和论坛,几乎没有什么实际的应用。适逢windows捆绑了哈尔滨工业大学开发的“微软拼音输入法1.0”,某天下午,当我在网上和一位永远都不会知道是谁的女生放肆地聊了两个小时之后,突然发现自己竟已无师自通地学会了所谓的“盲打”了!在这之后的一段时间里,我身边甚至很多人羡慕我打字的速度。为了让自己的打字速度再快一点,我索性花了差不多20分钟,把原本默认的“全拼输入”改成了“”双拼输入“。而这还远远不够。后来,我增设了”慢放模糊音“(不区分z/zh、c/ch、s⇧),又把打字速度提高了一些。这时我第一次意识到‘有些认识,哪怕是简单的常识,也需要亲身经历后才能真正体会”。只有拥有无与伦比的打字速度,才会体会打字速度快的好处。 打字速度提升后,我发现自己不再讨厌在读书的时候做笔记了,因为在键盘上敲字相对于笔写字来说轻松太多。我开始大段地纪录感悟,有时甚至干脆整篇摘抄原文! 李笑来思考的问题正是如何利用最小的代价快速的输入文字。这里代价包括两个方面,输入方案的学习成本以及输入文字的速度。简单分析一下,主流输入法需要用户在键盘上敲击一些字符,然后映射到汉字。就是说输入文字的速度和两个因数有关:敲击键盘的次数(对应计算机中的码长)以及重码的字符数量(对于拼音输入法来说,这里指的是每个拼音对应多少的字)。 从这两个指标来说,五笔应该是接近输入法的极限,五次敲击键盘肯定能选定你需要的汉字。但是学习五笔需要记忆大量的说是有序其实没有太多规律的字根,学习曲线不是一般的陡峭。几年前,自己尝试跟着网上的视频教程学习,最后还是太复杂而放弃。 这时候要介绍一下双拼输入法,它是一种基于全拼的激进改良版拼音输入法。简单来说,它将一个汉字的拼音分成声母和韵母两个部分,输入一个拼音只需要按两个键(减少键盘的敲击次数但是没有减少重码率)。比如对于“拼音”两个字来说,全拼需要输入 pinyin 六个字符,换成是双拼,只需要输入 4 个字符 pbyb。具体介绍可以看 做少数派中的少数派:双拼输入快速入门。 由于双拼有声母和韵母,需要先从键盘上进行一次映射,所以有很多的输入方案。我自己入门使用的是小鹤双拼,也推荐大家使用这个方案。主要原因有两点:声母和韵母全部放在字母键上(微软双拼中要用到 ; 键,以及 iOS12 和 MacOS 中自带的输入法都支持这个方案(国内那几个流氓输入法更不用提)。 下图是一张小鹤双拼的输入法键位图,其中黑色的字符代表是键盘上的什么键,棕色的代表这个键表示声母时是什么,蓝色的代表这个键表示韵母时是什么。学习双拼的过程也很简单,拼音本身就会,无非是熟悉键位。从我自己的角度来说,每天抽出几分看一下键位图,再在 双拼练习 @ BlueSky (相关的介绍可以看:快速上手双拼,可以尝试这个练习平台 - 少数派)网站上练习 5 分钟,一周后可以完全脱离键位图来打字,之后就是孰能生巧的过程。 说回来当你学习了这么强大的内功之后,自然需要神兵来辅助你输入。在饱受国内的流氓输入法侵害之后(比如输入到一半给你跳一个什么斗图功能提示),我遇到今天的主角 RIME | 中州韻輸入法引擎,它是由佛振开发的一种开源输入框架,业内人士称之为「神级输入法」。上一个有类似拉风的称号的软件还是「神级编辑器」—— Vim。Rime 有趣的一点是在不同的平台上有不同的名字,包括 Linux 上的「中州韵」,Win 上的「小狼毫」以及 Mac 上的「鼠须管」。稍微有文化的人可以反应过来,后面两个正是两种不同的毛笔名字。 简单总结一下为什么要使用鼠须管:一是安全,不会出现什么输入法读取你个人信息更甚者是密码发送到服务器,也不知道他们用来机器学习什么;二是配置全平台同步,解决多台设备的输入法配置问题;三是快,不会出现输入法跟不上我的打字速度而导致思路中断的情况。 安装 在 下載及安裝 | RIME | 中州韻輸入法引擎 主页,你可以找到对应不同平台的安装方法。 对于 MacOS 来说,最简单的方式莫过于在终端中输入 brew cask install squirrel 安装软件本体。如何你想使用 rime/plum: 東風破可以在终端中输入 curl -fsSL https://git.io/rime-install | bash -s -- :preset double-pinyin 。其中 preset double-pinyin 指定下载时默认包括小鹤双拼输入方案。 配置 防止配置时候出现各种意想不到的情况,首先推荐阅读官方文档 CustomizationGuide · rime/home Wiki。 Rime 的配置文件默认放在 ~/Library/Rime,而且是一种扩展 yaml 文件。默认的文件名为 .schema.yaml,比如小鹤双拼相关的默认配置在 double_pinyin_flpy.schema.yaml 中。如果我们自己想添加一些设置,推荐写在以.custom.yaml 结尾的新文件中,比如 double_pinyin_flypy.custom.yaml default.custom.yaml 这个文件写一些全局的配置。 123456789101112131415161718192021222324252627282930patch: switcher: caption: 〔方案选单〕 hotkeys: Control+grave # 候选词数量 menu: page_size: 9 # 使用的输入方案 schema_list: - schema: luna_pinyin_simp - schema: luna_pinyin - schema: double_pinyin_flypy # 输入法中英文状态快捷键 ascii_composer/switch_key: Caps_Lock: commit_code Control_L: noop Control_R: noop # 按下左 shift 英文字符直接上屏,不需要再次回车,输入法保持英文状态 Shift_L: noop Shift_R: noop # 在一些软件中默认使用英文输入状态 app_options: com.apple.finder: &a ascii_mode: true no_inline: true com.googlecode.iterm2: *a com.alfredapp.Alfred: *a com.runningwithcrayons.Alfred-2: *a org.vim.MacVim: *a com.apple.Terminal: *a 最后在修改配置时,可以查阅 Rime_collections/Rime_description.md at master · LEOYoon-Tsaw/Rime_collections 寻找相关信息。 installation.yaml 配置文件多平台同步相关文件,sync_dir 指定同步文件夹的位置,配合例如坚果云之类的软件实现备份同步。 12345678distribution_code_name: Squirreldistribution_name: "鼠鬚管"distribution_version: 0.11.0install_time: "Sun Dec 23 23:42:01 2018"installation_id: "mac_didi"sync_dir: "/Users/didi/Documents/rime_sync"rime_version: 1.4.0update_time: "Mon Jun 3 07:18:30 2019" 从 自由输入法RIME简明配置指南 - 少数派 中了解到,rime 个人词典双向同步,用户配置单向同步。另外需要把配置文件上传到 git 中,方便不同设备使用。 double_pinyin_flypy.custom.yaml 小鹤双拼相关的自用配置 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849patch: # 引用 `symbols.custom` 文件里面的符号 # 'punctuator/import_preset': symbols.custom 'recognizer/patterns/punct': "^/([a-z]+|[0-9])$" # 載入朙月拼音擴充詞庫 "translator/dictionary": ryen # 更改‘西文’为‘英文’,‘增广’为‘扩展集’ punctuator: import_preset: symbols.custom half_shape: "#": "#" "`": "`" "~": "~" "@": "@" "=": "=" "/": ["/", "÷"] '\\': ["、", '\\'] "'": {pair: ["「", "」"]} "[": ["【", "["] "]": ["】", "]"] "$": ["¥", "$", "€", "£", "¢", "¤"] "<": ["《", "〈", "«", "<"] ">": ["》", "〉", "»", ">"] switches: - name: ascii_mode reset: 0 states: ["中文", "英文"] - name: full_shape states: ["半角", "全角"] - name: zh_simp reset: 1 states: ["漢字","汉字"] - name: ascii_punct states: [",。", ",."] - name: extended_charset #生僻字开关 states: ["通用", "扩展集"] - name: show_emoji # 该项为表情输入,具体内容可见下文中 [关于表情输入] 部分 reset: 1 states: [ "🈚️️\\uFE0E", "🈶️️\\uFE0F" ] # 输入双拼码的时候不转化为全拼码 translator/preedit_format: {} simplifier: option_name: zh_simp # 分号上屏二候选词;引号上屏三候选词 "key_binder/bindings": - { when: has_menu, accept: semicolon, send: 2 } - { when: has_menu, accept: apostrophe, send: 3 } - { when: paging, accept: bracketleft, send: Page_Up } - { when: has_menu, accept: bracketright, send: Page_Down } squirrel.custom.yaml 自定义皮肤相关文件 1234567891011patch: style: color_scheme: psionics horizontal: true inline_preedit: true candidate_format: "%c\\u2005%@ \\u2005" # 用 1/6 em 空格 U+2005 来控制编号 %c 和候选词 %@ 前后的空间。 font_point: 16 # 候选文字大小 label_font_point: 14 # 候选编号大小 corner_radius: 5 # 候选条圆角 border_height: 0 # 窗口边界高度,大于圆角半径才生效 border_width: 0 # 窗口边界宽度,大于圆角半径才生效 最后,我的配置在 xiang578/rime 同步。 调试 Debug 是折腾 rime 不得不面对的一步,主要方式是查看 rime 部署的时产生的 log 文件。对于鼠鬚管而言, log 文件保存在 $TMPDIR/rime.squirrel.* 中。 在命令行中输入 echo $TMPDIR 获得路径 将地址输入到 「访达-前往-前往文件夹…」中跳转 右键点击 rime.squirrel.WARNING 文件,选择显示原身,并使用文本编辑器打开 文件格式类似于下面: 123456789101112131415161718Log file created at: 2019/06/07 23:31:54Running on machine: didideMiBook-Pro.localLog line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msgW0607 23:31:54.549346 162086912 config_compiler.cc:391] inaccessible node: punctuation.custom:/patchW0607 23:31:54.554167 162086912 config_compiler.cc:391] inaccessible node: key_bindings.custom:/patchW0607 23:31:54.560144 162086912 deployment_tasks.cc:179] schema list not defined.W0607 23:36:13.133517 161013760 config_compiler.cc:391] inaccessible node: punctuation.custom:/patchW0607 23:36:13.135843 161013760 config_compiler.cc:391] inaccessible node: key_bindings.custom:/patchW0607 23:36:13.149406 161013760 config_data.cc:62] nonexistent config file '/Users/didi/Library/Rime/luna_pinyin_simp.custom.yaml'.W0607 23:36:13.154920 161013760 config_compiler.cc:391] inaccessible node: punctuation.custom:/patchW0607 23:36:13.156643 161013760 config_compiler.cc:391] inaccessible node: key_bindings.custom:/patchW0607 23:36:13.331344 161013760 config_compiler.cc:391] inaccessible node: key_bindings.custom:/patchW0607 23:36:13.333066 161013760 config_compiler.cc:391] inaccessible node: punctuation.custom:/patchW0607 23:36:13.668072 161013760 config_data.cc:62] nonexistent config file '/Users/didi/Library/Rime/stroke.custom.yaml'.W0607 23:36:13.670761 161013760 config_compiler.cc:391] inaccessible node: key_bindings.custom:/patchW0607 23:36:13.672724 161013760 config_compiler.cc:391] inaccessible node: punctuation.custom:/patchW0607 23:36:14.281919 161013760 config_compiler.cc:391] inaccessible node: punctuation.custom:/patchW0607 23:36:14.283246 161013760 config_compiler.cc:391] inaccessible node: key_bindings.custom:/patch 按右 shift 切换输入法 之前使用搜狗输入法时,特别喜欢的一个功能:按右 shift 切换输入法的输入状态,实现暂时切换到英文状态。Rime 作者在 使用 Control 鍵切換中西文,上屏已輸入的編碼;令 Caps Lock 改變字母的大小寫 中提到一种方案。例如下面: 12345678patch: ascii_composer/good_old_caps_lock: true ascii_composer/switch_key: Caps_Lock: commit_code Shift_L: noop Shift_R: commit_code Control_L: commit_code Control_R: commit_code 然而这样修改完成之后,不论按哪个 Shift 键,都会切换到英文输入状态。看前面那个网页下面作者与其他人的讨论中发现,鼠须管无法区分 Shift 键。 网上查了一下,简单实现的方法是通过 karabiner 软件来改键。详细步骤可以参考 禁用 Squirrel 英文模式,使用左侧 Shift 切换中英 · rime/squirrel Wiki。 Reference 双拼 · Issue #37 · xiang578/xiang578.github.io 基于Rime的鼠须管输入法配置记录 Rime 输入法配置记录 Mac 下调校 Rime - 漠然的博客 | mritd Blog 最新版 Rime 输入法使用 - jdhao’s blog 「鼠须管」的调教笔记 「鼠须管」输入方案的添加 RIME输入法在Finder中自动切换成英文 @ Why & How 鼠须管配置 2019 禁用 Squirrel 英文模式,使用左侧 Shift 切换中英 · rime/squirrel Wiki rime-aca/dictionaries: Rime詞庫","link":"/post/rime.html"},{"title":"月读|软技能——代码之外的生存指南","text":"本月推荐的书是 John Z. Sonmez 写的《软技能——代码之外的生存指南》。本书作者之前是一名程序员,目前更多的是充当程序员的人生导师角色,通过博客、播客、vlog等多种形式介绍自己的软技能,借此希望能推动其他人事业进步,过上更充实的生活。 本书总共分成七大篇: 职业篇,介绍了程序员从公司选择、面试、工作、辞职、创业等职业相关的方方面面内容 自我营销篇,从博客开始,打造自己的个人品牌 学习篇,作者自己领悟的「十步学习法」学习新的知识 生产力篇,自由职业者的自我管理方法 理财篇,探讨收入、投资、债务以及退休等问题 健身篇,下面的图片就是作者本人,和一般的程序员形象有很大的区别 精神篇,心灵、情感等问题探讨 从上面的介绍可以看出,这本书基本上把一个程序员可以面对的所有问题,都给囊括了。从形式上来看,这本书像是各种主题的博文合集,有些散乱。总的来说都是关注于「更好地经营生活」。 自我营销 这一个主题是书中我最感兴趣的内容。知识付费的兴起,朋友圈中经常能看到有人分享付费课程的图片,图片中的老师各种头衔酷炫狂霸叼咋天,自我营销的成本真的是已经低到一种程度。万物互联,每一个人都有一次成名的机会。 本书中的自我营销,介绍了一系列的过程,作者推荐个人品牌的建立从博客开始。对于程序员来说,维护一个自建博客是很轻松的事情,而且可以分享的内容也很广泛,工作中的技能学习、遇到的问题分析。将博客当成自己的名片,从而实现让更多的人认识你,认可你。 书中介绍维护一个博客,要从两个方面入手,一是内容质量,二是更新计划。之前,自己的博客都是随心所欲的更新。重新思考一下,给博客增加了几个栏目: 【每周分享】:每周六不定时更新,记录过去一周,我看到值得分享的内容 【月读】:每月不定时更新,推荐本月我阅读的一本书 【数字生活】:我的数字生活实践 【博客公告】:分享与这个博客维护相关的内容 另外一方面,对于我这样的博客来说,最主要的流量来源是搜索引擎,所以花时间进行了一些 SEO 优化。通过在百度搜索和谷歌搜索相关页面提交网站,实现文章更快的收入。除此之外,需要在社交账号中更多的绑定博客,寻求其他的主动点击。 生产力 这个主题,是我大半年以来一直感兴趣的。之前没有注意到,像作者这样的自由职业者更应该是效率大师。其实各种效率方法流程大致相同,更多的是细节的实现。作者在做周计划时,倾向于利用看板来展示任务,这个给我一个新的启示。我考虑过利用 Github + Zenhub 来管理一些大的项目,不过平时没有什么动力打开 Github 网站。 所以,需要一种更加简单地方法。网上查找了一下,发现一个网站 Kanbanist | The Missing Kanban Board for Todoist。Kanbanist 最大的优势是能直接读取 Todoist 的数据,用起来会更加方便吧。不过,如何融合进入日常工作流中,又值得我自己仔细思考一下。 总结 读这本书,最大的感受是读到很多点的时候,我都打开了电脑进行实践。功利地说,这是一本实用的书,推荐大家有空都来挑选自己感兴趣的内容阅读。","link":"/post/soft-skills.html"},{"title":"毕业杂感","text":"毕业杂感 三年前,我以为会骄傲的走出一中,下午又是怀着初次走进时的心情,三年仿佛一场梦,现在又回到了起点。 下午,唯一的期待只有排队上去领毕业证书,一中唯数不多的尊重个体的存在,最后的感动。其他的节目也可以无视了。之后,向学长讲的一样,信心满满的准备再来一次七圈半。挣扎完一圈后,获得与原来跑完七圈半一样的感觉,或者我也跑不动了。腰上的肉只是增加了体重。难怪其他人知道我长的这么凶猛,还欺负我。散步才是未来胖子的选择。 晚上吃饭时,压抑许久的东西爆发了。往日平静的人都拼命的喝起酒来,拿着麦克风歇斯底里的大叫。更有勇者,宣布了早已被他人看出的东西,不知后来有没有收到这个季节最合适的回答-------哪凉快哪呆着去,希望是我。我和其他两个人与两个老师退到了窗前,后面是喧闹与灯火通明,前面是寂静。冷风吹久了才明白,凤凰山庄真高档。听着已退休的化学老师感叹退休后真闲。也发现教了三年物理老师一只眼睛已经看不见。原因居然是书看太多…… 与他人约定的雪碧大战啤酒,也在我喝完两杯雪碧后放弃了,幸亏他们又一次放过了我,no zuo,no die。我还是太年轻了,聚会还是喝酒好。在期待中,我们等来了最喜欢的数学老师。带着数学都是谁教的迷惑,我们勇敢的抬起了老师,毕竟五年来最难。每个人都在那里发疯,我也无聊的把啤酒摆成了12两个字。最后数学老师直接拿起了一瓶啤酒喝了起来,为什么没有人叫白酒。 离别时,有人对我说崇拜了我两年,愉快地说。小朋友真诚实。可却不知道,三模后我也开始嫉妒她。或者我是书看的太少,想的太多。想起其他人捡到的一本上届学长高三日记,原本以为他的经历我只能膜拜,到后来我也做到了。见证了他梦想从浙大到南大,最后留下作文跑题的遗憾,而我会有什么?我也没有勇气在自选考完之后,对着学霸讲出:你的时代已经结束了!虽然也只是我认识他,他不认识我。而我,也仅仅是俞敏洪演讲所提到的,有时候不是因为我坚强继续,只是别无选择,所以才全力以赴去做某些事。 此刻不得不提高考,去年6月承受着巨大的压力,有时中午是想起这东西而惊醒。这一年却又是平静。到头来,很少有人可以改变自己。就像六年来,没有发现我认为有巨大改变的人。该干什么,还是干什么。不该干什么,也许也会干。在考场上你才会发现,这就是高考,你已无能为力。打败你的不是试卷,而是你自己。放弃的自己。多数人也再无机会,唯一的选择只是直面惨淡的人生。无论什么结果,生活还要继续。现在才明白,高考不是淘汰,而是磨平一部分人的心。我们有过豪言壮志,非XX不上,再随手吓死看不起自己的人。到今天,更多的是正常水平就好,XX也好。毕竟是等待,为什么不多安排几个人改呢?自此,安逸才是奢求。想看过海韵上的文章所讲一样,8点钟睡觉。不由回想起小学时被逼8点钟睡,而不得已去拨慢时钟,最后在慢了半小时后被发现。真是罪过。现实下,哲学与诗歌终究太过单薄,宗教才是人类心灵之火的栖息地。像语文老师讲过的,信教真幸福。愿意余生在佛与GOD中度过。初中同学的突然生病离开,我才发现在生命面前,高考已无那么重要。有什么事再不做就没有以后了。 高考前觉得干什么都有用,家里人问我为什么看那么多与历史有关的书,我也可以骄傲地回答,可以用来写作文。高考之后换成了看什么都没有用,再看见那些书,只有祈祷,如果有来生,我也愿意信来生,再见面。 又回到自己,究竟是什么?自己认为的失败者。晚上还有人说我很有趣,老师告诉我够了。或者去年运动会时,某高二听了我的解说,认为我像周立波。都是不同,选择的不同。我很难与大多数人竞争,所以经常去干人少的事。就像3000m,实际上到了才发现人更多,所以又一直期待校运会上有5000m。实际上我更认可疯狂,像苹果早年广告所讲的一样,只有疯狂到自己能改变世界的人,才能真正改变世界。毕竟这也是曾经的梦想。 再回来,发现还有许多事情没有干。不提破解教室里的饮水机,踩死操场上所有的小草这些小事。总觉得走的太匆忙,解析几何还是不会,最后一题也仅是看看。达不到数学老师140分免暑假作业的要求。人生就是这样遗憾。 下午听到不是在最美的时光遇见你们,而是因为遇见你们才有了最美的时光。说白了也只是适应环境。去年来12班回访的学长讲到,如果高考考好一点,就可以去浙江财经大学,半年来发现杭电也不错。呆久了就会好的。三年的一切都在脑海里翻转,等待着我去忘记。原以为记录是最好的回忆,现在才明白遗忘才使过去日久弥新。就像教育的本质是那些你几年后还记着的东西。五毒书记张二江出狱后感叹过,关进去前几年,情人还来看过,原来整天称兄道弟官场上朋友,早不见踪影。只有大学同学,不管他是书记也好,囚徒也罢,还过来看看他。这就是北大EMBA招生广告中所宣称的28万让柳传志叫你一声老同学的意义吧。 浮生着甚苦奔忙,盛席华筵终散场。悲喜千般同幻渺,古今一梦尽荒唐。曹雪芹用这样的诗句来表明写红楼梦的内心,我们又何尝不是,三年来,在情感和分数里煎熬,吃的猪狗食,学的数理化,被囚禁的野兽是不会感谢笼子的。欢乐的时光总是短暂的,没有了下期再见。我们也终将忘记高考,终将忘记一中,终将忘记彼此。我也无法否认生命因你们而精彩。 我爱这个世界。 谢谢你看到这一行。 本文仅是午夜梦话,所写一切均可看成虚构,与我无关。 6.10 00:01 于椒江 6.11 00:38修改 6.20 10:05修改","link":"/post/something-about-high-school.html"},{"title":"【读书记 258】柏拉图 《会饮篇》","text":"《会饮篇》记录阿伽通获得酒神节悲剧比赛第一名后,苏格拉底等人在庆祝宴会中「赞美爱神」的比赛过程。实际上记录与会人七种不同的爱情观。最后,酒神狄奥尼索斯决定出当晚的获胜者。 裴卓:勇气之爱 讲述者被人们视为弱小的被爱之人,美少年裴卓 Phaedrus,爱可以给我们勇气! 为人们要想过美好正当的生活,必须终生遵循一个指导原则,这并不能完全依靠血统,也不能靠威望、财富,只有靠爱才能办到。这原则是什么呢?就是:厌恶丑恶的,爱慕美好的。 如果一个情人在准备做一件丢人的坏事,或者在受人凌辱而怯懦不敢抵抗,这时他被人看见了就会觉得羞耻,但是被父亲、朋友或其他人看见还远远不如被爱人看见那样羞到无地自容。爱人被情人发现他做坏事,情形也是如此。 阿喀琉斯为情人复仇。母亲叮嘱他,杀死仇人赫格多尔之后自己也会死。最后还是奋不顾身杀死仇人,自己被射中脚踵而死。 “最爱的人心中对我们的期望。「目标的意义」” 包萨尼亚:精神之爱 讲述者是一个成年的同性恋,阿伽通的情人包萨尼亚 Pausanias,被人们视为追求肉欲的人。爱神爱有天地之分,天之爱是精神之爱,是崇高的爱,只有男男之间才有,是美好的追求;地之爱是肉体之爱,是普遍的低级的爱,也就是大多数人的爱,只有肉欲的爱。 凡间阿莆若狄德引起的爱神确实也是凡俗的,它不分皂白地奔赴它的目的。这种爱情只限于下等人。它的对象可以是娈童,也可以是女子;它所眷恋的是肉体而不是灵魂;最后,它只选择愚蠢的对象,因为它只贪图达到目的,不管达到目的的方式美丑。 至于天上的那位的出身却与女的无关,只是由男子生的,所以其爱情对象只是少年男子。其次,她的年纪较大,所以不至于荒淫放荡。她只鼓舞人们把爱情专注在男性对象上,因为这种对象生来就比较坚强,比较聪明。 他们说,与其暗爱,不如明爱,所爱的人应当在门第和品德上都很高尚,美还在其次。人们对情人都给予极大的鼓励,不认为他在做不体面的事;人们把追求爱情的胜利看成光荣,把这方面的失败看成羞耻。为了争取胜利,他可以做出种种离奇的事。 这种少年男子一定要显现理性,也就是腮帮上长胡须的时候,才能成为爱的对象。我想情人之所以要等爱人达到这种年龄之后才钟爱他,是由于存心要和他终生相守,不是要利用他的年幼无知来哄骗他,碰到另外一个可以宠爱的对象时就把他扔掉。 当时社会能接受:年长男性(智慧,情人)和少年男孩(12-17,肉体,爱人)之间的恋爱关系。包萨尼亚和阿伽通年纪都大了。 我认为道理是这样:这件事并不是十分单纯的,像我开头说的那样。单就它本身来看,它无所谓美,也无所谓丑;做的方式美它就美,做的方式丑它就丑。丑的方式就是拿卑鄙的方式来对付卑鄙的对象,美的方式就是拿高尚的方式来对付高尚的对象。所谓卑鄙的对象就是上面说的凡俗的情人,爱肉体过于爱灵魂的。他所爱的东西不是始终不变的,所以他的爱情也不能始终不变。一旦肉体的颜色衰败了,他就远走高飞,毁弃从前的一切信誓。然而钟爱优美品德的情人却不然,他的爱情是始终不变的,因为他所爱的东西也是始终不变的。 我们的习俗定了两条规矩,头一条是:迅速接受情人是可耻的,应该经过一段时间,因为时间对于许多事物常常是最好的考验;第二条是:受金钱引诱或政治威胁而委身于人是可耻的,无论是不敢抵抗威胁而投降,还是贪图财产和地位,全都一样。因为这些势力、名位和金钱都不是持久不变的,高尚的友谊当然不能由此产生。 按照我们这里的规矩,如果一个人肯侍候另外一个人,目的在于得到那个人的帮助在爱智或其他品德上更进一步,这种卑躬屈节并不卑鄙,也不能指为谄媚。 这里有两条规矩,一条是关于少年男子的爱情,一条是关于学问道德的追求,应该合而为一;如果合而为一,爱人眷恋情人就是一件美事。所以,情人和爱人来往,就各有各的指导原则。情人的原则是爱人对自己既然表现殷勤,自己就应该在一切方面为他效劳;爱人的原则是情人既然使自己在学问道德方面有长进,自己就应该尽量拿恩情来报答。一方面乐于拿学问道德来施教,一方面乐于在这些方面受益,只有在这两条原则合而为一时,爱人眷恋情人才是一件美事,如若不然,它就不美。如果是为了增进学问道德,纵然完全失败也没有什么可耻;如果是为了其他的目的,不管失败与否都是可耻的。假如一个少年男子以为他的情人很富,为了贪财就去眷恋他,后来发现自己看错了,其实他很穷,无利可图。其眷恋还是很可耻的,因为这种行为揭穿了他的性格,证明他这个人为了金钱可以侍候任何人、做出任何事来,这当然是很不光彩的。 我们谈爱情的时候,事实上,我们讨论的正是真实的自己。 鄂吕克锡马柯:功利之爱 讲述者是医生鄂吕克锡马柯,理性大于感性,是技术主义的代表。爱情是和谐的,是有规律的,是有用的,我们可以通过其中的规律得到爱情,也可以通过爱情得到别的有用的东西。 爱情克制论 阿里斯多芬:缺憾之爱 讲述者是喜剧家阿里斯多芬,而喜剧总是悲剧的内核。最初有三种人,男男人、女女人和男女人,像球一样。因为得罪宙斯,人被劈成两半,天生就该追求自己的另一半。不论肉体还是精神,我们都应该追求自己的另一半,以此互补,否则我们孤独,有缺点,不完美。 所以我们每人都是人的一半,是一种合起来才成为全体的东西。所以每个人都经常在寻求自己的另一半。全人类只有一条幸福之路,就是实现自己的爱,找到恰好和自己配合的爱人,总之,还原到自己的本来面目。 对爱情最浪漫的解释。 阿伽通:完美之爱 讲述者是悲剧诗人阿伽通,是十分优秀的人。我们要追求完美,爱神就是完美的,爱情也是完美的,所以我们要追求爱,而且爱是有益于他人的,是可以从满溢之处流向匮乏之处的(对应开头评价苏格拉底的智慧),可以让大家一起变的完美。 前面的人赞美爱神,其实都是在赞美其索给予的幸福,而不是真正地赞美爱神本身。 苏格拉底:朝圣之爱 讲述者是苏格拉底,从狄欧蒂玛口中听到的爱。爱神不是完美的,介于不死的神和会死的人之间的精灵,介于美和丑之间,介于无知和有知之间。追求爱不是为了爱本身,是为了爱延伸的东西,是在追求爱情过程中得到的美好、是追求到以后收获的智慧和快乐,美好和永恒。 和阿伽通的对话 爱神不仅公正,而且审慎。大家公认审慎是节制快感和情欲的力量。世界上没有一种快感比爱情本身还要强烈。一切快感都比不上爱情,就是因为它们都受爱神节制,而爱神是它们的统治者。爱神既然统治着快感和情欲,岂不是最审慎的吗? 爱不也是这样:一个人既然爱一件东西,就是还没有那样东西;他盼望它,就是盼望他现在有它,或者将来有它。是不是?” 所以总起来说,在这种和其他情况下,一个盼望的人所盼望的是他缺少的、还没有到手的,总之是他所没有的,是本身不存在的,不在他那里的;只有这样的东西才是他所盼望的、他所爱的。 爱神首先是对某某东西的爱,其次是对他所欠缺的东西的爱。是不是? 正确的意见而说不出所以然来,就不是有知识(因为没有根据的不能算知识),却也不是无知(因为有正确内容的不能叫无知)。所以很明显,正确的意见就是介于智慧和无知之间的东西。 她说:「说来话长,我还是给你说说吧。当初阿莆若狄德诞生的时候,诸神举行宴会,出席的有智谋女神梅蒂的儿子丰饶神波若。他们宴饮结束时,匮乏神贝尼娅来向他们作节日例行的行乞,站在门口。波若多喝了几杯琼浆(因为那时还没有酒),就走进宙斯的花园,昏昏沉沉地睡着了。贝尼娅由于贫乏,很想和波若生个孩子,于是和他睡在一起,怀下了爱若。爱若也成了阿莆若狄德的随从和仆人,因为他是在阿莆若狄德的生日投的胎,生性爱美的东西,而阿莆若狄德是很美的。」 她说:‘这正是我要启发你的第二点,苏格拉底。爱神就是这个样子,就是这样产生的。他是奔赴美的东西的,像你说的那样。假如有人问我们:爱者从美的东西得到什么呢,苏格拉底和狄欧蒂玛?或者问得更明确一点:那盼望美的东西的是盼望什么呢?你怎么回答?’ 那我给你说清楚点。苏格拉底啊,所有的人都会生育,凭借身体或灵魂生育,到了一定的年龄,就为本性所推动,迫不及待地要求生育。可是他们不能在丑的东西里、只能在美的东西里生育。男人和女人结合就是生育。怀胎、生育是一件神圣的事,是会死的凡夫身上的不朽的因素。但是这件事不可能在不协调的情况下实现,丑的东西与神圣的事情不协调,只有美的东西才与它协调。所以美是引导和帮助生育的女神和决定命运的女神。因为这个缘故,那生育能力旺盛的一遇到美的对象就立刻欢欣鼓舞,精神焕发,同它交配生子;如果遇到丑的,就垂头丧气,毫无兴趣,避开它不去生育,宁愿把沉重的包袱背下去。因此那充满生育的种子和欲望的一遇到美的对象就欣喜若狂,是由于它可以结束他的巨大痛苦。 你就不会觉得奇怪了。因为和上面说的完全一样,那会死的东西也是力求能够永远存在和不朽。要达到不朽,全凭生殖,以新的代替旧的。每一个个体的生物,虽然我们说它一生之中始终是同一个东西。 美者,这时,就只有大愚不解的人才会不明白一切形体中的美是同一个美了。明白了这一点,他就成了爱一切美好形体的人,把他的热情从专注于某一形体推广到一切,因为他把那种专注一点看成渺小的、微不足道的。再则,他必须把灵魂的美看得大大优于形体的美,如果有一个人灵魂值得称赞,即便形貌较次,那也足够了,他也应该对这个人表示爱慕之情,加以照顾,他心里想出来发表的那些美好的话语可以使青年奋发向上,他这样做也使他自己遍览人们各种行动中以及各种风俗习惯中的美,从而见到美是到处贯通的,就把形体的美看成甚为微末的了。可是他必须从各种行动向前更进一步,达到知识,这样就见到知识的美。 至于爱的方面,情形也是这样。一般说来,凡属对于好东西、对于幸福的企盼,都是每个人心中最大的、强烈的爱。然而其余的那些在某一个方面有所追求的,无论是谋求获利的,喜爱体育的,还是爱智慧的,我们都不说他们在爱,不说他们是钟爱者;只有那些以某种方式发挥作用的喜好者,才占有全体的名称,我们说他们在爱,称他们为情人或钟爱者。 一个人如果一直接受爱的教育,按照这样的次序一一观察各种美的东西,直到这门爱的学问的结尾,就会突然发现一种无比奇妙的美者,即美本身。 爱其实就是寻找真正的美的过程。 苏格拉底的颂辞是全篇三大段的中段,也是全篇精义所在。它本身分两部分:和阿伽通的对话以及和狄欧蒂玛的对话。 在和阿伽通的对话里,他说明了: (一)爱情必有对象; (二)钟爱者还没有得到所爱的对象; (三)爱情就是想占有所爱对象那一个欲望; (四)爱情的对象既然是美,如阿伽通所说的,它就还缺乏美,“爱神是美的”一说不能成立; (五)美善同一,所以爱神也不是善的。 这样苏格拉底就把阿伽通的一篇大文章完全推翻了。接着他说他的爱情学问是从女巫狄欧蒂玛那里领教来的。他原来和阿伽通一般见解,她纠正了他。她使他明白: (一)爱神是介乎美丑、善恶、有知与无知、神与人之间的一种精灵,是丰富和贫乏的统一,总之,就是一个哲学家; (二)爱情就是想凡是美的善的永远归自己所有那一个欲望; (三)爱情的目的是在美的对象中传播种子,凭它孕育生殖,达到凡人所能享有的不朽:生殖就是以新代旧,种族与个体都时时刻刻在生灭流转中。这种生殖可以是身体的,也可以是心灵的。诗人、立法者、教育者以及一切创造者都是心灵方面的生殖者; (四)爱情的深密教,也就是达到哲学极境的四大步骤。 阿尔基比亚德:畸形之爱 醉酒阿尔基比亚德(对应开头提到的酒神)的胡言,他爱着苏格拉底却又自惭形秽。爱情的美好没有让他变美好,反而让他与美好背道而驰,离爱越来越远,他矛盾而纠结,爱在折磨着他。 尾声 柏拉图的爱情观:爱是阶梯式的,肉体之爱会让精神之爱更崇高,二者不能单一存在,否则偏向肉体则堕落,偏向精神则虚渺。(寻找本源的行为。) Ref 会饮篇 - 维基百科,自由的百科全书 如何理解柏拉图的《会饮篇》? - 知乎 我希望你的目的地是星辰大海 【罗翔老师直播课堂】共读柏拉图的《会饮篇》_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 我们所有的学习都是在回忆 阿尔基比亚德在看到苏格拉底身上看到他原初的美好,现在的匮乏,将来的美好。 “人最大的痛苦是无法跨越知道和做到的鸿沟” 最终在战争中背叛了雅典 有追求者介于有知和无知之间,神有知,所以不需要追求,愚人无知,所以不知道要去追求,只有介于二者之间的人才会去追求知识追求美好,这就是追求者,每一个为梦想努力的人就是这样的人。 爱他人就是爱自己。因为爱他人时,你爱上的那些优点和美好,其实都印证了自身。也许过去自己拥有这些美好如今失去了,所以我们爱;也许现在我们正拥有这些美好,我们惺惺相惜所以爱;也许我们看到了将来的自己,自己想要成为的样子,想要拥有的特质,所以我们爱。自恋所恋,其实是恋着自身过去、现在、将来的美好。 所以上次在读书会的时候我给学生说了这样一段话: 我说很少有那个词会像爱一样被庸俗对待,但是爱是可以承载真正的严肃和祟高,我们爱因为我们匮乏,我们爱因为我们希望超越每日的锱铢必较,在爱中我们放弃了自我,我们发现了自我,我们希望重塑我们的自我。 所以整个会饮篇,他提醒我们肉体的爱当然是有意义的,但人不要沉迷于肉体的爱,人要扶级而上,去追求灵魂的爱,去追求更好的爱。因为我们要回忆起我们失落的美好,我们就可以告别,我们当下的平庸苟且,我们要攀登美善的阶梯,一步一步往上爬。 这样,我们才能够达到一种爱的升华,我们才能在一个具体的人中,去发现我们,对于所有人美好的期待,就是这种抽象的爱。因为具体的人,我们在他身上看到了,我们想看到的样子,我们希望变得美好,当我们变得美好的时候,我们又会和具体的人,在具体的人身上,我们又会经营我们的美好。","link":"/post/symposium.html"},{"title":"月读 | 数学之美","text":"其实从《数学之美》这书名上看就可以知道,这是一本科普类的图书。这本书收集吴军博士早期发布在谷歌黑板报上解释搜索相关的数学原理的文章。吴军博士之前在谷歌和腾讯都从事搜索相关领域的研究,自然而然的有很多独特见解。除了这本书之外,他还有《浪潮之巅》、《大学之光》等科普图书,也是值得一读。 虽然是科普类读物,但是本书还是有一些阅读门槛的。大二的时候也看过这本书,当时的数理基础不够,囫囵吞枣翻完后。事后大概只记得自然语言处理、马尔科夫链等等的名词。这一段时间正好自己也在做文本搜索相关的工作,所以又从图书馆中借来一读。 本书大概介绍了 Google 整个搜索引擎的基本框架,包括资料获取、分词、索引、排名、分类、相似度计算等知识。这一次读完之后,印象最深刻的是关于从通信模型推导出语言翻译模型的转变。这里和大家分享一下我的简单见解,如果想要更加深入的理解可以阅读《数学之美》的第 5 章 隐含马尔可夫模型。 大二的时候上过《通信原理》这门课,其中讲解如下图所示的简单通信系统。一般包括五个最基础的要输,分别是信源、变换器、信道、反变换器、信宿。从字面上很难理解这些东西是,所以简单的解释一下。通信系统是对通信过程的抽象概括,比如你和其他人发微信时,你就是信源,信息的发送方。变换器的作用是编码,计算机只能处理 0 和 1,所以需要将你的消息通过一定的方法(协议)转化成为由 0 和 1 组成的序列。之后的信道指的是信息发送的通道,可以理解为发送微信时需要有网。反变换器顾名思义作用和变换器相反,从一个二进制序列还原成和你聊天的人(信宿,和你聊天的人)可以理解的消息。 当时学到这里的时候,没有去发散思维,思考这个模型在其他领域的应用。《数学之美》书中,讲到统计语言模型时,将它衍生到机器翻译的过程中。在日常生活中,我们和其他人交流的时,一般是在脑子中有一个想法(信源),然后在说出来(编码),声音在空气中传播(信道),最后被另外的人(信宿)听到,并且在脑子中思考理解(解码)做出相应的回应。对于翻译问题,可能我说出来的是中文,如果听到的是美国人,他需要将你说的转化为英文。所以产生的一个问题是,如何实现将中文与英文对应起来,也就是翻译问题了。为了解决这个问题,科学奖们运用了贝叶斯概率、隐含马尔科夫模型、大数定理等数学知识来处理。 这只是书中的一个简单例子,吴军博士在自然语言处理与搜索领域的经历令人难以望其项背,书中关于这两个领域在近代的发展的小故事比比皆是,作者更是和这些人谈笑风声。所以,我推荐所有对数学有爱好的人,都可以看一下这本书,感受一下数学原理的力量。","link":"/post/the-beauty-of-math.html"},{"title":"【随想集】03 你当像鸟飞往你的山","text":"本期的标题取自《圣经》,当然大部分人可能更熟悉这个名字是 Educated:A Memoir 中文版的书名。这本书主要讲的是一个大山女孩克服各种困难成为一名博士的故事,虽然我还没有看过,但还是推荐大家去读一读…… 教育 如果没有记错,明天又是一年一度高考的日子。一个神奇的现象,大部分人都觉得自己考差了。几年前我的想法是,高考前有无限的可能,高考后几乎没有什么选择。当然这些也只是我的牢骚,说回来,至少高考提供意义上的公平。借这个机会写一写教育。 一群穷孩子的人生实验 中国版罗森塔尔实验,十几年前,几个老师在北京务工人员的子女中挑选出一批差不多上小学的孩子组成青云班,参考类似八中少年班的方式,希望能培养成「品行高尚、具有国际视野、富有人文与创新精神的精英人才」。 不知道在户籍更加宽松的地方会不会有不一样的结果? 第一届青云班最终的成绩就是这样了:有北京户口的孩子顺利地上了北大或出了国,剩下的一部分去了西澳大学,还有几位磕磕绊绊,最终在国内上了本科或专科,极少的人只读到高中或没了下落。 优质教育是一个昂贵的商品。这个项目坚持十多年,最后的投入资金远超 5000 万。 直到他们高中毕业后,孙文华与几位第一届青云班的同学吃饭,喝了一些酒,才讲出了平时他不该说的话。他说随着孩子们慢慢长大,他不再像最开始那样希望他们出人头地,对社会做很大贡献,他的要求在逐渐降低,希望他们首先是作为一个人,一个积极的人,然后还能过得幸福快乐,就足够了——项目逐渐往前走,他发现教育确实是一件吃力不讨好的事情,花钱、耗时间,而且也许并不会有一个让别人很满意的结果。 罗森塔尔在 1966 年得出结论:教师对学生积极的态度,会让他们朝着正确的方向改进。很高兴,我在初三也体会过这种感觉。 孩子们高中毕业时,刘正奎告诉了他们故事的另一个真相——当年选拔他们时的智商测试并不严格,是「矮子里拔高个儿」。青云班孩子们的智商大概在120左右,比普通人稍高,但与北京八中少儿班人均130的智商水平,还是有很大差距,「哪里有那么多超常的孩子?」但他接着说,让人欣慰的是,当被告知有天分时,孩子们就真的可以做到很不错的程度。而学生们听了这话,并不真正感到失望,而是开起了玩笑:「校长你忽悠我们!」 实际上,他们早已在漫长过程里修正了对自我的认识。他们确实度过过一个「被选中」的阶段,觉得可以通过努力,成为伟大的、和别人都不一样的人。但后来慢慢发现,大家本来都是不一样的,伟大和成功也没有确切标准,而且——外部环境对一个人的影响太大了。 这是其中一个孩子对这个项目的评价。我也挺喜欢这种人生突然被某样东西改变的故事。 从外界看,这可能是一个非常失败的投资,是一个不太成功的教育案例。但我觉得它是成功的,它教会了我们,如何做一个向上的人、一个正直的人。 Inspire a generation 这个是 2012 年伦敦奥运会的口号,中文是「激励一代人」。之前读过一篇文章 为何我要辞职读研 | cf020031308.github.io,其中写到两段: 写这文章时,女儿一岁半,预计她小学时会参加我的毕业礼。我希望用包括这几年在内的自己的行动,教会她终生学习、终生奋斗的道理。我很遗憾相比我继续工作,她这些年能获得的教育资源一定更差,但我仍认为将这股精神给到她会是更加宝贵的。 前面提到我生自县城,也提到我曾经的没志气、没见识、没规划,很遗憾这可能是大多数小城青年的通病。三十岁了还去读书,虽然只是为了自己与自己的小家,但终究会在家族中树立起一个标杆,拓宽后辈的眼界,动摇长辈的成见,多多少少算是对我们既定命运的一点反抗吧。 对于大部分人来说,教育是一个人的事情,而是几代人的希望。我可能无法激励其他人,但是能给家族里面年轻一代一些关于求学路上的思考。不过从目前来看,每次回家看见几个表弟在疯狂打「王者荣耀」之类的游戏,我都无动于衷。还是希望有一天,能像 教育对人的改变有多大? 这个故事中主人公那样帮助弟弟考上大学吧。 最后,其实有空也可以观察身边的同事。 就拿互联网公司来说,外部看到的一些粉丝很多的人顶多是中层级别的,然后这些人离顶端的扎克伯克,马云之间有着大量的资深总监,vp之类的人物,他们不算出名,但是却有着极高的身价,大量时间投入在解决实在问题,这些人的经验基本上只会在熟人圈子里传播,亲戚的孩子之类的。 平行世界 小径分岔的花园,间谍小说,剧情很巧妙。我们生活的世界就像小径分岔的花园,每到一个岔入口,你走上不同的路,就失去走进其他未来的可能。 彗星来的那一夜,低成本科幻片。如果多个平行世界之间相互干涉,似乎找不到完美解,不可避免落入黑森林法则? 笛卡尔的哲学中有一句,我们的世界是众多可能的世界之中最好的一个。 职场人如何系统做好知识管理 少楠老师前一段时间线上分享,大部分理念都在之前提到过。这个讲座是一个很好的实例,产品总监关于「知识管理」应该有怎么样的认知? 知识管理的定义:知识是⽤于⽣产的信息(有意义的信息)。管理就是制定决策。知识管理是获取、分配和有效利⽤知识的过程。 知识管理四个过程: 获取:明确自己的母题(关注什么领域),形成知识的复利。 这一点自己其实做的挺差的。之前有人和我说,感觉你什么都懂。可能后面半句「但是什么东西都只懂一些」顾及我的面子没有明说。 记录:保持一定的输入难度。也推崇 Zettelkasten 的理念,每天练习写原子化的卡片。 整理:不进行传统意义上的分类,让知识进行生长。然后建立索引(Zettelkasten 中的大纲笔记)让知识结构涌现出来。 输出:输出是做出正确的决策。输出不是为了关注,而是为了得到反馈。 需要通过自己的尝试形成一套知识管理的系统。 最后少楠老师答疑时,抛出一个问题:离开一家公司你带走的是什么? 重铸荣光 前一段时间 MSI 比赛,LCK DWG 中单选手 showmaker 在 S10 宣传视频中说的文案反复在论坛上被引用: 那一年的决赛,是SSG对阵SKT,最终比分3-0。当时我看见FAKER颓坐在椅子上泣不成声,这个画面我永生难忘。 那一刻我在想,如果我能成为一名职业选手,我一定要赢下所有。如今奖杯就在眼前,我必须考虑这会不会是我此生仅有的机会。 我相信LCK能有过去的霸主地位,FAKER功不可没。重铸LCK的荣光,我辈义不容辞! 尾巴 我在内部 IM 给一位离职同事发的最后一条消息也是 「你当像鸟飞往你的山」。","link":"/post/thinking-03.html"},{"title":"【随想集】04 曾经我也想过一了百了","text":"开始前先推荐一首日文歌曲 中岛美嘉 - 曾经我也想过一了百了 以及中文填词 【小宁子】曾经我也想过一了百了》中文版 feat. 绝之望的马沙 (僕が死のうと思ったのは)。第一个链接的视频里,中岛美嘉在接近于失聪的状态唱这一首歌。可以注意细节,有时候她的脚在跺地板找节奏。 差不多两个月时间没有写随想集,自己又折腾出一个网站 Hi - 算法花园・笔记,用来分享一些不成熟的想法。 图论 - 算法花园・笔记 实习的时候做过将CH中的搜索模块从双向 Dijikstra 改成双向 A*,很大一部分精力是在尝试启发函数。后来去面试时,有人给了一个启发函数,问为什么不行? 最近听专门做图论同事分享时,他提到一句所有图论新算法结果需要和dijkstra一致,可能这就是答案。 之前做题目时,喜欢的最短路算法是 SPFA 。前几天为了面试一个候选人,特地去 oi wiki 上回顾了一下其他最短路算法,spfa的优势在于使用队列模拟优先队列,一般出题人不特殊构造图,基本上会比 Dijikstra 快。可惜当时没有改一版试试。 说回来,工业界看起来只有几家公司有图论方面的需求,但也能让一些人做到极致。 我眼中的技术深度 前几天听陶文老师参与录制播客Ep 29. 架构设计与 12fallacy(上) - 捕蛇者说,想起他之前在内网写的文章。作为一名中台部门的算法工程师,其实面临的问题和业务部门的软件工程师挺类似的。 他将工程师的主要工作是定义成:构建一个可持续运行的 solution 去解决用户的一个 problem。深度来自:运营维护这个 solution 如何降低成本以及洞察到 problem 的 new solution。你的竞争力来自: 为什么在这个点上,我做过的工作证明了比其他同事要更强。 为什么这个能力是当前公司需要的,也就是所谓的收益。 Ise Grand Shrine 很难想象核心模型的训练代码,是一个 10 多人修修补补,长达1 千行的 py 文件(驼峰命名、匈牙利命名、下划线命名混合,多行类似的代码以最后一行生效等)。忍受三年之后,感觉自己有能力去重构一把。特意将分支命名为 ise_gradn_shrine,致敬之前听到的伊势神社(每一代工人之间为传递知识,二十年原地重建一次神社)。并将下面这一段话放到 README 中。 Japan’s Ise Grand Shrine is an extraordinary example in that genre. Every 20 years, caretakers completely tear down the shrine and build it anew. The wooden shrine has been rebuilt again and again for 1,200 years. Locals want to make sure that they don’t ever forget the production knowledge that goes into constructing the shrine. There’s a very clear sense that the older generation wants to teach the building techniques to the younger generation: “I will leave these duties to you next time.” 「旧文重发」:2017 WF感想的校内版本 - 知乎 (zhihu.com) 这两个月一直在强迫自己参加 LeetCode 的双周赛、周赛,现在的水平大概勉强能写出 3 题。赛后会去看一下其他人的题解,很多方法自己是绝对想不到的。机缘巧合看到戴老师的文章,自己之前也没有好好参加 rating 比赛,缺少一份面对真实的勇气。有时候点开 LeetCode 比赛在想,如果这场我一题都不会怎么办?可能唯一的选择是在电脑前坐满两个小时。最后文章里面提到要培养思维,还在上学时被人家评价「只会暴力」,这也是我欠缺的,所以现在打完比赛都会进行简单复盘,自己我感觉挺有收获的,极端方法应该是录屏分析。程序设计竞赛对于我意味着什么?可能山就在那里。 个人实力保证队伍下限,队伍配合决定队伍的上限。 有趣的是,可能是受我之前的错误观念的影响,我们学校这么些年来真正高分 rating 选手确实是少之又少,很多 final 选手甚至不爱打线上比赛(例如 luyi 学长)。即使参加比赛,也总是喜欢开小号,开黑,而不是认认真真的一路做到底。开小号有个什么坏处呢?赢了是我吊,输了不丢人,这种心态就不是个正常打比赛的心态,等到了关键时候,不能开小号了,心理就可能承受不住压力崩溃。 所以做一道题,如果做不出来,看题解不丢人,但要仔细想想:为什么自己想不出来?解题的切入点应该怎么分析出来?以后遇到类似思路、类似条件的题目应该出哪里下手?要及早建立自己的规范的思维方式和体系,这样无论是在竞赛中,还是在以后的学习、工作中,都能发挥重要的作用。 电影《心灵捕手》 西恩关于真实感 你只是个孩子,你根本不晓得你在说什麽。 问你艺术,你可能会提出艺术书籍中的粗浅论调,有关米开朗基罗,你知道很多,他的满腔政治热情,他与教皇相交莫逆,和他的耽于性爱,你对他很清楚吧?但你知道西斯汀教堂的气味吗?你没试过站在那儿,昂首眺望天花板上的名画吧?你肯定未见过吧? 如何阅读? 读书是否是唯一重要的事? | Verne in GitHub (einverne.github.io):读书与实践的关系。 到底要如何有效读书呢 - 2021年读书计划, 最多只读50本 (zhuoxi.me) 尾巴 推特上冲浪时看到一个问题「数学是发明还是发现?」","link":"/post/thinking-04.html"},{"title":"【随想集】05 重新使用 Logseq","text":"新年快乐!不知不觉距离上次写博客过去 4 个多月,去年的年终总结还不知道如何动笔,先尝试写一篇简单的随想集热热身。 这两年新的笔记软件层出不穷,目前全部私人笔记使用 Roam Research 记录,但是 Roam 过去一年没有什么大更新,更别提移动端。另外为了搭建数字花园,使用 Obsidian 管理部分可以公开的笔记,再通过 MkDocs 生成 html 文件发布(谁让 Obsidian Publish 每月费用高达 8 刀)。 前几天听 Tienson Qin 采访 跟 Logseq 的创造者天生聊聊 Logseq 的故事 - ByteTalk | 小宇宙 后,重新对 Logseq 产生兴趣(刚出的时候体验过,开源+弱化版Roam)。Logseq 支持直接导入 Roam json 文件,我大概有 2k+ 笔记,大小在 6 MB 左右。直接迁移过去有一些细节问题,以至于我发了 Issue #3684:导入 roam json 数据后部分 blockref 无法正确显示,在开发者(不知道是不是)帮助下完美解决。不过体验几个小时后,总感觉 0.5.6 版本很卡,随便进行点击操作,需要 5s 以上才会有反馈……无奈只好放弃迁移。 这次体验过程中 logseq 插件 debanjandhar12/logseq-anki-sync: An Logseq to Anki Flashcards integration plugin. 给我留下深刻的印象,只需点击插件 icon 就可以通过 Anki Connect 将笔记中的卡片同步到 Anki 中(单向更新)。使用 Roam 时,我都是将需要制卡的笔记统一整理到一个文档中,然后使用 shiqi-lu/roam2anki 转换成csv 文件,最后手动导入 Anki。可见本地客户端想象空间更加强大! Logseq 本身有 Publish 功能,可以配置将全部或有 public:: true 属性的笔记一起导出成单个 html 文件,然后借助静态网站托管工具发布。每次都进行这样的操作也挺麻烦的,幸好前几天看到有人发布 pengx17/logseq-publish: Logseq Publish Action ,从而实现笔记数据推送到 github 后,自动编译 html 文件并发布。不过笔记数据存在 private repo 中,而我没有购买 Github Pro 服务(这回不是钱的问题,只是找不到理由说服我自己),所以无法直接使用 Github Pages 功能。退而求其次,借助 Vercel 发布导出的网页。如果你对我公开笔记感兴趣,可以访问:算法花园・笔记。 这周也看了一些 Supermemo 相关的文章和视频,等再深入体验一下和大家分享。 最后,推荐一些这两周我看过觉得不错的文章: 【ML专栏】谈一种复用CART训练中丢弃信息的改进方案 - 知乎:之前一位同事的文章,对 GBDT 分裂过程的小改进。 时光痕迹:2021 年总结 | Reimu’s blog 2021 世界终结前一天:pluskid 的年终总结,他已经坚持写了十多年。去年也进行过推荐 2021 总结与 2022 计划 | 小土刀 2.0 saveweb/review-2021: 今年,你写年终总结了吗?:年终总结大合集,一次看到爽! 工程化你的习惯:介绍三个习惯记录系统,自己会在今年尝试复刻 Ali Yahya 的 walrOS。","link":"/post/thinking-05.html"},{"title":"【随想集】06 一元复始,重新出发","text":"距离上一次写随想集已经过去一年……趁现在是的一年开始,重新捡起这个习惯来写点东西。 生活 自从去年国内放开后,大家陆续感染了新冠。随着最近一段时间开始去公司上班,我也不可避免的中招: 周四(0105),喉咙开始痛。 周五(0106),喉咙还是痛,体温也到 37.5 摄氏度,晃一下脑袋都能感觉到头晕,然后整天基本上都是躺在床上发呆或者睡觉,不过测抗原还没有事。 周六(0107),喉咙痛好一些,开始咳嗽,吃了一些 999 强力琵琶露。 周日(0108),测出抗原阳了,然后其他症状基本上消失。 阅读 翦商:殷周之变与华夏新生 前一段时间挺火的历史小说,讲得是夏商周的历史。上古史的参考文献很少,作者亮点在于结合这几十年的考古成果(二里头、殷墟、周原等等)进行创造。翦商出自诗经「后稷之孙,实维太王,居岐之阳,实始翦商。」,意思是周灭商。为什么周要消灭商?商代遗址挖掘发现和甲骨文破译,商人生活中使用大量的人牲进行祭祀(比如房屋用人奠基,墓葬用人陪葬……),而且随着时间推移,祭祀规模越来越大,手段越来越残酷。作者推测周族可能长时间从事给商人捕捉祭祀用的人牲工作,随着周文王被拘和伯邑考被杀,周商矛盾激化,周武王开始伐商。周公旦在武王驾崩后,辅佐成王,创建礼乐制度。后世流传的文献没有直接记录商朝活人祭祀,可能是周公毁掉相关的档案,改写历史。 读库 2105:垄断的困境 评论尸去年写的长文,围绕互联网相关垄断进行讨论。首先,定义有效垄断(建立在可行的商业模式上)以及无效垄断(任何在短期和长期均无法赚钱的垄断,都应破视为商业上的无效垄断)。一言蔽之,企业垄断的目的是赚钱。 无效垄断的例子正是我现在的东家:滴滴,占有网约车市场绝大部分份额却还一直在亏损,产生这种情况更多是竞争对手不想竞争,而不是不能与其竞争。 有效垄断的例子则是当年的淘宝屏蔽百度对商品详情页面的抓取,淘宝的推荐位一直是阿里重要的收入来源,其他公司也开始学着屏蔽百度爬虫,互联网变得更加割裂。 产生大量无效垄断的根因是资本的无序扩张。 通过计算垄断的成本收益来衡量互联网企业的垄断是否合理。 最后作者还是举例了 多抓鱼,元气森林,shenin 等例子来讨论如何在巨头垄断的局面下进行创新。 利器 Logseq 去年 9 月份开始,觉得 Roam Research 更新速度太慢,又迁移到 Logseq。为了使用同步功能,也一直是 Backers 用户( 5$ 每月)。 Readwise 高亮管理服务,用来复习 kindle,微信读书,简悦等服务上的高亮。另外也开始用它家的 Readwise Reader 阅读 epub 和 newsletter。","link":"/post/thinking-06.html"},{"title":"【随想集】07 新年快乐","text":"距离上次分享已经快一个月了,这段时间我度过了长达两周的春节假期,现在是时候写点东西了! 卷首语:决定自己人生的那些重要时刻,并没有风雨交加电闪雷鸣。上天从来不屑给于凡人征兆,这些时刻平凡普通,仿佛就和过去无数个日日夜夜一样无聊而烦闷。 阅读 本周读了一篇 Uber 关于 ETA 的论文,简单整理文章中主要内容写成博客:DeeprETA: An ETA Post-processing System at Scale。希望今年能养成读论文,写公开的笔记的习惯。 这个月在读一本效率类工具书 最有生產力的一年 (豆瓣) (douban.com),作者用 1 年时间进行一系列的实验,记录和探讨什么方法可以提升自己的生产力。有一些方法其实自己之前也尝试过,比如每天做 3 件重要的事情、每天只使用 1 小时手机等,很可惜没有坚持下来。 影音 满江红:大量情节翻转,部分剧情存在逻辑硬伤。几乎是全部场景都在大院里面拍摄,所以根本没有去电影院看的必要。 流浪地球:诚意满满,大场面,满足幻想,部分中国独有的精神。由于先看的满江红,看这部片的时候还睡了一会儿,更有趣的是电影院里面还有人打呼噜了…… 扬名立万:剧本杀形式电影,案中案,最后有开放结局的意思。 飞越13号房:互动影视游戏,看异灵术直播云的,改编自杨永信事件。剧情比较简单,和隐形的守护者相比没有太多反转和暗线。 三体电视剧:第一部《地球往事》的影视化,腾讯出品,十分忠于原著。部分场景和配乐非常震撼:比如三体游戏中秦始皇出场的「天有鲲鹏,展翅苍穹。六合一扫,四海统」。 狂飙:看完电视剧和同名小说,讲得是扫黑除恶的故事。高启强从买鱼佬成长为黑社会老大的过程非常刺激,最后为了过审等原因,强行改了很多剧情,感觉不是很过瘾。 新工具 鹿鸣 (elk.zone) 一个灵巧的 Mastodon web 客户端,模仿 twitter 样式。 去年就接触到 mastodon,上个月 mask 一系列操作,大量推友开始考虑迁移到 mastodon 上。我的帐号 @xiang578@douchi.space 可以参考这篇文章 設定 IFTTT 同步 Twitter 到 Mastodon. 事前準備 | by Pei-lun | Medium 将推文同步到长毛象。 Session - Pomodoro focus timer with analytics (stayinsession.com) 番茄钟工具,5 美元一个月,不太值得。SetApp 中有提供。 umami:网站访问量统计工具,可以用 docker 部署,也能使用官方提供的 umami cloud 服务(目前免费中),和 Google Analytics 相比更加注重隐私。 sethyuan/logseq-plugin-another-embed: This plugin provides 2 extra ways to embed blocks/pages. (github.com): logseq 插件,实现类似于 roam 的 embed 展现 ui。 Minflux:开源的轻量级 RSS 工具,可以用 docker 部署,在线版本 15 天试用,15 美元一年。默认不抓取全文,也没有 Inoreader 那样的双栏模式。 别让 cd 浪费你的时间 - Skywind Inside autojump 替代,实现终端内快速目录跳转,使用 lua 语言实现,所以能感觉到速度飞快!","link":"/post/thinking-07.html"},{"title":"大学书单","text":"大学书单 这几年学校一直有一个传统,会将毕业生大学期间在图书馆的借阅记录整理打印,形成一份特殊的书单。前几天,我就收到了这一份礼物,正好用来回忆一下自己在图书馆借过的书。 书单制作的很精美,基于成本考虑没有能做成一个小册子倒是蛮遗憾的。图书馆寄语:「世态炎凉于指尖低回婉转,人生百态于页上妙趣横生。流年不虚度,不负诗与书。」第二页写的是,四年里你最常去的阅览室。我感觉这个数据是错误的,阅览室门口没有可以统计次数的仪器,大概推测是分别在哪个阅览室借过多少本书吧。由于自己所学的是计算机专业,毫无疑问,在自然类的阅览室借阅最多。之后是哲学社科以及文学艺术,也没有太大的惊讶。 第三页开始,就是罗列我的借书记录了。这份书单上没有写,查询知道大学四年总借图书121本,号称打败了 93.4% 的小伙伴。从最后一行记录开始查看,多少可以见证自己思维的成长。刚开始借的书很杂,什么小说、教辅、人文社科都有。之后由于求职的压力,更多看地是专业技能的书籍。 书单很长也很杂,推荐 5 本我看过比较喜欢的图书。 1、我是一只IT小小鸟:这本是大四才看的书,我却想把他放在第一本。这本书一些博文总集,邀请一些毕业后从事计算机领域的工程师、教授写的关于如何走上 IT 的故事。很多人是大学科班出身,他们讲到自己是如何学习计算机专业知识的,对迷茫的新生应该会有很多帮助。也有一些是转行干 IT,也很符合目前知乎上的劝退风潮。 2、万历十五年:黄仁宇的作品,国内一直很火。去年热映的《人民的名义》中,高小凤正是因为这本书才与高育良搭上关系。这本书分析不同的人物(张居正、申时行、戚继光、海瑞、李蜇),去揭示明朝衰败的开端。黄教授多年在海外教学,书中的叙事逻辑更偏西式。对于我这种深受国内历史教科书迫害的人来说,有醍醐灌顶之效。 3、浪潮之巅:吴军博士的《XX之X》系列中的一本(还有文明之光、数学之美、大学之路)。讲述站在技术浪潮之巅的科技公司的故事,可以快速了解目前美国的一些大型公司成长的历程与规律,提高专业素养。 4、搞定:GTD 的开山之作,引领了一股风潮。于我而言,重要的是接触 GTD 之后,思维方式的转变,对事情开始进行规划和反思。每一个人都不一定需要去实践完整地 GTD 流程,但是不能不知道这种方法。 5、暗时间:刘未鹏的博文集,一本看完之后,直接在网上下单购买的书。内容很杂,很难简单的讲清楚,以后有机会再详细推荐。 借阅记录 1 软技能:代码之外的生存指南:the software developer’s life manual (美) John Z. Sonmez著 2 Qt 5开发实战 (韩) 金大〓著 3 大教堂与集市 (美)Eric S. Raymond著 4 人月神话 (美) 小弗雷德里克·布鲁克斯著 5 数学之美 吴军著 6 我是一只IT小小鸟 胡江堂主编 7 美语音标 赖世雄编著 8 统计学习方法 李航著 9 硅谷钢铁侠:埃隆·马斯克的冒险人生 (美) 阿什利·万斯著 10 构建之法:现代软件工程:effective software engineering 邹欣著 11 小狗钱钱 (德)博多·舍费尔著 12 Word排版艺术 侯捷著 13 乔布斯的魔力演讲.第3版 (美) 卡迈恩·加洛 (Carmine Gallo) 著 14 搞定.III,平衡工作与生活的艺术,Winning at the game of work and business of life:最新版.第2版 (美) 戴维·艾伦著 15 小强升职记 邹鑫著 16 不要等到毕业以后.修订版 张志著 17 硅谷钢铁侠:埃隆·马斯克的冒险人生 (美) 阿什利·万斯著 18 奇特的一生:柳比歇夫坚持56年的“时间统计法” (俄)格拉宁著 19 搞定.I,无压工作的艺术,The art of stress-free productivity:最新版.第2版 (美) 戴维·艾伦著 20 别闹了, 费曼先生:科学玩童的故事 (美) R·费曼著 21 好好学习:个人知识管理精进指南 成甲著 22 有道云笔记:记录,成为更好的自己 有道云笔记主编 23 公务员考试,申论的规矩 粉笔科技编著 24 你的知识需要管理 田志刚著 25 论可计算数:图灵与现代计算的诞生:the birth of computer science (美) 克里斯·伯恩哈特著 26 苏东坡传 林语堂著 27 统计学习方法 李航著 28 Word排版艺术 侯捷著 29 高频交易员:华尔街的速度游戏:a Wall Street revolt (美) 迈克尔·刘易斯著 30 人月神话 (美) 小弗雷德里克·布鲁克斯著 31 盖洛普优势识别器2.0 (美) 汤姆·拉思著 32 毛泽东选集.第1卷 毛泽东著 33 穿越抑郁的正念之道:freeing yourself from chronic unhappiness (英) 马克·威廉姆斯 … [等] 著 34 大学之路:陪女儿在美国选大学 吴军著 35 大学之路:陪女儿在美国选大学 吴军著 36 编程之美:微软技术面试心得 《编程之美》小组著 37 Redis设计与实现 黄健宏著 38 尽在双11:阿里巴巴技术演进与超越 阿里巴巴集团双11技术团队著 39 程序员修炼之道:从小工到专家 (美)Andrew Hunt, (美)David Thomas著 40 编码:隐匿在计算机软硬件背后的语言:the hidden language of computer hardware and software (美)Charles Petzold著 41 日本围棋故事.修订本 薛至诚编译 42 统计学习方法 李航著 43 编程之美:微软技术面试心得 《编程之美》小组著 44 剑指Offer:名企面试官精讲典型编程题 何海涛著 45 淘宝技术这十年 子柳著 46 Linux内核完全剖析 赵炯编著 47 计算机考研指导全书 赵霖 48 技术之瞳:阿里巴巴技术笔试心得 阿里巴巴集团校园招聘笔试项目组著 49 人生十八局:现在我将这样下 (日]吴清源著 50 阶梯围棋教室.从入门到业余初段.第2版 黄希文主编 51 布局 日本棋院编 52 计算几何:算法与应用:algorithms and applications Mark de Berg … [等] 著 53 数据库原理及应用.第2版 雷景生, 叶文珺, 楼越焕编著 54 只是为了好玩:Linux之父林纳斯自传:the story of an accidental revolutionary (美) Linus Torvalds, (美) David Diamond著 55 围棋入门.第3版 胡懋林, 马自正编著 56 向死而生:我修的死亡学分 李开复著 57 神奇的老大日记 有时右逝著 58 计算几何:算法与应用:algorithms and applications Mark de Berg … [等] 著 59 数字电子技术 (美) Thomas L. Floyd著 60 经济学原理.宏观经济学分册 (美) 曼昆著 61 旧制度与大革命 (法)托克维尔著; 冯棠译 62 离线·黑客.NO.002 主编李婷 63 数字电子技术 (美) Thomas L. Floyd著 64 黑客与画家:硅谷创业之父Paul Graham文集:big ideas from the computer age (美)Paul Graham著 65 菊与刀:日本文化模式论 (美)鲁思·本尼迪克特著 66 酒国 莫言著 67 电路与电子学习题解答与实验指导 李景宏, 刘淑英主编 68 煮酒探西游:吴闲云详解西游记 吴闲云著 69 悟空传 今何在作品 70 晨间日记的奇迹 (日) 佐藤传著 71 学习vi和Vim编辑器 Arnold Robbins,Elbert Hannah,Linda Lamb著 72 Evernote 100个做笔记的好方法:数字化重整你的工作和人生 异尘行者著 73 善用佳软:高效能人士的软件应用之道 张玉新, 陈勇, 吴放著 74 黑天鹅:如何面对不可预知的未来:the impact of the highly improbable (美) 纳西姆·尼古拉斯·塔勒布著 75 寻秦记:终结篇.陆 黄易著 76 寻秦记.伍 黄易著 77 构建之法:现代软件工程:effective software engineering 邹欣著 78 寻秦记 黄易著 79 寻秦记.叁 黄易著 80 寻秦记 黄易著 81 寻秦记 黄易著 82 1984 (英) 奥威尔 (G. Orwell) 著 83 四十一炮 莫言著 84 红高粱 莫言著 85 数据结构学习与实验指导 陈越 … [等] 编著 86 电路与电子学习题解答与实验指导 李景宏, 刘淑英主编 87 怎样解题:数学思维的新方法-1版 (美)G·波利亚著 88 万历十五年 黄仁宇著 89 图论算法理论、实现及应用 王桂平, 王衍, 任嘉辰主编 90 老子 汤漳平, 王朝华译注 91 魔方宝典:风靡世界的智力玩具之终极指南 (美) 杰瑞·斯洛克姆 … [等] 著 92 中国哲学简史:修订译本 冯友兰著 93 挑战程序设计竞赛 (日)秋叶拓哉,(日)岩田阳一,(日)北川宜稔著 94 文明之光 吴军著 95 数学之美 吴军著 96 把时间当作朋友:运用心知获得解放 李笑来著 97 浪潮之巅.第2版 吴军著 98 浪潮之巅.第2版 吴军著 99 暗时间 刘未鹏著 100 Vim实用技巧:edit text at the speed of thought (英) Drew Neil著 101 编程之美:微软技术面试心得 《编程之美》小组著 102 货币战争.2,金权天下 宋鸿兵编著 103 北大往事:珍藏版:纪念北京大学建校110周年 橡子,谷行著 104 C++ Primer Plus (第6版) 中文版 (美) Stephen Prata著 105 数据结构学习与实验指导 陈越 … [等] 编著 106 C++ Primer Plus (第6版) 中文版 (美) Stephen Prata著 107 鸟哥的Linux私房菜:基础学习篇.3版 鸟哥著 108 搞定.Ⅱ,提升工作与生活效率的52项原则,52 productivity principles for work and life (美) 戴维·艾伦著 109 搞定.Ⅲ.Ⅲ,平衡工作与生活的艺术,Winning at the game of work and business of life (美)戴维·艾伦著 110 搞定.Ⅰ.Ⅰ,无压工作的艺术,the art of stress-free productivity (美) 戴维·艾伦著 111 美国种族简史 (美)托马斯·索威尔著 112 一万小时天才理论 (美)丹尼尔·科伊尔(Daniel Coyle)著 113 番茄工作法图解:简单易行的时间管理方法 (瑞典) Staffan Noteberg著 114 越读者 郝明义著 115 C++ Primer中文版 Stanley B. Lippman, Josee Lajoie, Barbara E. Moo著 116 Vim实用技巧:edit text at the speed of thought (英) Drew Neil著 117 计算机科学导论 (美)贝鲁扎.佛罗詹著 118 ACM/ICPC算法训练教程 余立功主编 119 C程序设计 谭浩强著 120 数学分析习题集.2版 Б. П. 吉米多维奇著 121 高等数学全程学习指导与习题精解:同济六版 滕加俊, 滕兴虎编著","link":"/post/universiy-booklist.html"},{"title":"博客折腾记:主题更新、迁移博客到腾讯云COS以及解决百度收录","text":"本周有空对博客进行新一轮折腾,现在将这些尝试记下来和大家分享。 1. 主题更新 我在 博客折腾记:使用 Travis CI 自动部署 中提到将主题以 modules 的形式加入主仓库。而且现在使用的主题 git 仓库是我自己 fork 的,也有一些修改。几个天之前,hexo-theme-even 的 master 接受 feat: add LaTeX support by JieJiSS · Pull Request #236 ,完成对 LaTeX 公式的支持。所以,我需要将使用的代码和最新的代码合并。 这里使用的是 github Pull request 功能。在你自己 fork 的仓库的网页上点击 new pull request,然后按照下图修改。就会生成一个新的 Pull request 。 而且,如果你没有修改过原来的代码,PR 能自动合并。不过由于我对代码做了一些修改,会产生一些冲突,需要手动解决冲突(这里推荐使用 VS code)。出现下图的情况即成功合并两个库。 完成 PR 后,进入你站点下面的对应主题目录,使用 git checkout master 切换到主题的 master 分支,使用 git pull origin master 拉取最新的代码。回退到站点目录下,利用 git add 更新。 2. 迁移博客到腾讯云COS 利用腾讯云存储博客的静态文件,并配合使用 CDN 可以加快国内的访问速度。参考 Hexo博客迁移之旅(Coding到腾讯云COS)+ Travis CI持续集成 - 个人文章 - SegmentFault 思否 以及 如何在腾讯云COS部署HEXO博客 - 云+社区 - 腾讯云 。 记录两个我遇到的坑。 新的域名解析 完成 COS 配置后,需要将博客域名解析到腾讯提供CDN节点上的地址。 添加持续集成自动发布到COS(Travis CI) 为了发布到 COS,站点的 _config.yml 会添加下面的代码。 1234567 deploy:- type: cos secretId: XXX_ID secretKey: XXX_KEY appId: 1252086360 bucket: blog-1252086360 region: ap-shanghai 其中出现的 secretId 以及 secretKey 是私钥,不要在公开仓库展示。通过Travis-ci 中添加 Environment Variables 解决。 很多教程里,他们的 _config.yml 不会出现 secretId 和 secretKey 这两行,取而代之的是让你在 .travis.yml 添加几行。 123456script - hexo denv: global: - secretId: ${secretId} # Environment Variables 中配置 - secretKey: ${secretKey} # Environment Variables 中配置 按照这样设置,build 时,出现错误提示如下: 12345678910111213141516171819202122{ error: { Code: 'InvalidAccessKeyId', Message: 'The access key Id format you provided is invalid.', Resource: 'blog-1252086360.cos.ap-shanghai.myqcloud.com/2012/01/23/2011/index.html', RequestId: 'NWNlMDU3NzlfNWI5ZDA4MDlfNWVlMF81ZWUzNTg=', TraceId: 'OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc0OWRkZjk0ZDM1NmI1M2E2MTRlY2MzZDhmNmI5MWI1OTQyYWVlY2QwZTk2MDVmZDQ3MmI2Y2I4ZmI5ZmM4ODFjMDU3YThkNThjZmQ1NWVkMGY2ZDBiNGM1YTEyNGIzMGM=' }, statusCode: 403, headers: { 'content-type': 'application/xml', 'content-length': '513', connection: 'keep-alive', date: 'Sat, 18 May 2019 19:05:29 GMT', server: 'tencent-cos', 'x-cos-request-id': 'NWNlMDU3NzlfNWI5ZDA4MDlfNWVlMF81ZWUzNTg=', 'x-cos-trace-id': 'OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc0OWRkZjk0ZDM1NmI1M2E2MTRlY2MzZDhmNmI5MWI1OTQyYWVlY2QwZTk2MDVmZDQ3MmI2Y2I4ZmI5ZmM4ODFjMDU3YThkNThjZmQ1NWVkMGY2ZDBiNGM1YTEyNGIzMGM=' } }FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.htmlTypeError: Cannot read property 'statusCode' of undefined at uploadFileToCOS.catch.then.data (/home/travis/build/xiang578/xiang578.github.io/node_modules/hexo-deployer-cos/lib/deployer.js:42:16) at process._tickCallback (internal/process/next_tick.js:68:7) 出现这个问题是 hexo -d 时,_config.yml 无法获得环境变量 secretId 和 secretKey 的。会导致没有秘钥。 参考 使用 Travis CI 部署你的 Hexo 博客 - 知乎 ,在 .trvis.yml 文件的 hexo d 命令前,加入下面两行即可解决。 12- sed -i "s~XXX_ID~${secretId}~" _config.yml- sed -i "s~XXX_KEY~${secretKey}~" _config.yml 之后build 时,会自动利用环境变量中 secretId 和 secretKey 的值替换 _config.yml 文件缺省的值。 最后提供我的两份配置文件给大家参考:_config.yml、.travis.yml。 3. 百度收录 之前,我一直将博客的静态文件存储在 github 的项目中,也使用插件生成 baidusitemap 文件。但是由于一些不为人知的秘密,百度的爬虫实际上无法爬取 github 上的资源,导致博客最新的文章没有被收录到百度中。 而且从百度提供的抓取诊断上来看,配置腾讯云 COS 后,百度的爬虫依然访问的是 github 上的仓库。 一顿搜索之后,找到一个主动提交 hexo 博客链接至百度的插件 huiwang/hexo-baidu-url-submit。 参考 Hexo插件之百度主动提交链接 | 王辉的博客 以及 Hexo百度主动提交链接 - 简书 完成配置。 安装插件 cnpm install hexo-baidu-url-submit --save 修改根目录下面的 config.yml 文件,配置 baidu_url_submit 和 deploy。 1234567891011121314baidu_url_submit: count: 100 ## 比如3,代表提交最新的三个链接 host: xiang578.com ## 在百度站长平台中注册的域名 token: your_token ## 请注意这是您的秘钥, 请不要发布在公众仓库里! path: baidu_urls.txt ## 文本文档的地址, 新链接会保存在此文本文档里deploy:- type: cos secretId: XXX_ID secretKey: XXX_KEY appId: 1252086360 bucket: blog-1252086360 region: ap-shanghai- type: baidu_url_submitter 上面的代码中出现一个 token,由于这是一个私有的,不能出现在 github 公开的仓库中。所以也需要 Travis-ci 中添加 Environment Variables 解决。和前文提到相同,在 .travis.yml 中添加 - sed -i "s~your_token~${BD_TOKEN}~" _config.yml 解决私钥问题。 最终在 travis-ci 中发现下面的日志即配置成功。另外一点,百度的站长平台的数据不能及时展示我们提交后的结果,需要耐心等待。","link":"/post/use-cos-to-store-blog.html"},{"title":"利用 GTD 原则完成一次讲座","text":"前几天,在导师的邀请下,给17计算机班的同学们进行了一次分享讲座。内容大概是关于去年在滴滴实习时做的一些工作以及主观意愿下的大学学习建议。作为一个号称实践 GTD 的人,必不可少的要将 GTD 原则使用到这一次分享准备过程中。 自然式计划模式 这样子的一次活动,正好符合 GTD 中关于项目的定义。《搞定1》第 3 章中提到了「控制项目:纵向管理项目的5个阶段」。现在结合五个阶段,来复盘一下我准备讲座的过程。 1. 定义目标和原则 你为什么做这件事? 做这件事的真正目的或动机是什么? 做到什么程度才算是成功? 你的目标是否足够清晰明确? 什么样的行为可能会损害我正在进行的工作? 我怎样才能防止这类情况的发生? 我决定做这一次分享时,主要有下面的4方面原因。 第一,整理。每一次分享都是一次自己我反思。所以我需要整理一下之前在滴滴工作时留下的资料,以及梳理前几年的学习感悟。 第二,演讲。说句实话,我的演讲的能力很弱。体现在,口齿不清楚、演讲时语速太快和听众没有交流。众所周知,演讲能力是现代社会必不可少的一项能力。提升演讲的关键在于实践,所以给其他人讲解我熟悉的内容正是一次绝好的机会。 第三,回馈。虽然私下里和其他人骂过很多学校和学院的规章制度之类,但也不能忽视学校所提供给我的成长机会和空间。之前书记也在一次党会上说过,我们很多党员的材料中,只有那一年考了多少名,又获得什么奖这些的,没有和群众交流。 第四,参考。作为一个软弱的人,我很少会去谈给其他人有什么影响,也不会整天去批评这个那个,只希望自己的经历给其他人一个参考。所以,我很喜欢学院里面搞的《榜样的力量》栏目。通过这些,可以了解到学长学姐有多么努力,获得了什么样的成就。事实是,我们这样的普通学校中,很多优秀的人都已经模板化了,集中在绩点多少高,获得过什么奖学金,当过什么部门的什么而已。真正的大学教育,应该培养的学生达到「千人千样」。 2. 展望结果 成功是一番什么景象?听上去会怎样?有什么感觉?专注!创造出清晰可见的结果。只做积极性思考,不考虑不利因 素 对于我个人来说,这一次分享是一次宝贵的锻炼机会。是实践 GTD 原则,是完成一次公众演讲,也是完成一次和学弟学妹的交流。不过,由于个人经历的限制,我所分享的东西,终将是少数同学所感兴趣的,只希望这部分人听到我的一些观点,未来的学习会有那么一点点不同。也许多年之后,互联网上有一段文字记录,提起那个晚上我所讲的观点。 3. 头脑风暴/集思广益 在这张的纸的反面的正中央写上项目名称,开始头脑风暴。追求数量,不求质量,不判断,不质疑,不评估,不批判。 不要急于分析组织。1)目的?2)害怕什么?3)我所不知道的?4)有哪些不利因素? 上面写了这么多,终于到了最关键的一步。由于这是一次个人分享,所以也谈不上什么集思广益。不知道现阶段有没有什么头脑风暴的工具,我直接掏出几张草稿纸就开始搞了。上面的介绍也提到了,头脑风暴的原则,将大脑中的想法排空,为下一步工作做准备。 4. 组织整理 在完成头脑风暴之后,我开始使用幕布来整理之前想到的想法。上图中蓝色的对勾就是在整理时的记号,标记整理到大纲中的内容。最后导出一张思维导图,到这里为止我就清晰的知道自己要分享的内容。 5. 明确下一步的行动方案 目前我是在使用 Emacs 中的 org-mode 管理这些项目。所以,我就将自己要做的事情放到一个文件中。下图是完成这个项目之后的结果,当然也有些行动被我取消了。 回顾 来总结一下这次讲座之后的想法。 从辅助工具上来说,自己的 PPT 水平很差,也就认为不能把时间都放在准备 PPT 上。所以思考过其他一些工具,但都不是很乐观。考虑过两种类型的工具,可以生成 ppt 的软件,比如 Marp(利用 markdown 生成)以及 org-ioslide (利用 org-mode 生成),这两个工具很难实现图文混排。另外,就是幕布的演示模式,使用时需要展开和折叠大纲,有点麻烦,也容易导致出错。最后,还是只能硬着头皮去做了一个简单的 ppt 。 从演讲效果来说,内容是很丰富的,但是我的演讲能力很差,之前在上面提到的问题,都暴露无疑,还是需要加强锻炼。也由于时间上的一些原因,我的准备不够充分,试讲次数也太少了,导致节奏控制也不好。还要对浪费17计算班同学的时间,表示一些歉意。 点击查看我使用的ppt,文字形式的分享等我有空再来整理吧。 参考 自然式计划模式 【搞定GTD】用iPhone打造GTD实践1年后的心得体会 - 申龙斌的程序人生 - 博客园 《搞定1:无压工作的艺术》 · Issue #136 · JimmyLv/jimmylv.github.io","link":"/post/use-gtd-to-speach.html"},{"title":"博客折腾记:使用 Travis CI 自动部署博客","text":"已切换到 Github Action 之前一周在封闭接受公司培训,最重要的任务是熟悉「项目开发全流程」。其中有一点:服务的稳定性。不知道为什么,前几天自己的博客崩溃了,输入域名只能看到 404 页面。当时以为是 Travis CI 的原因,所以进行了全面的一次排查: 问题出现在 Github Pages 的 Custom domain 设置中。 具体表现:通过 Travis CI 推送博客静态文件到仓库中的 master 后,下图框中的域名就会变成空的,导致无法访问。 解决方法:在源文件的 source 目录下创建一个 CNAME 文件,写上你自己的域名。 Travis CI 其实看一眼就应该知道,我的博客是基于 hexo 搭建的,文件托管在 github 仓库中。不过,按照之前的设想博客应该在 Coding 中也有一份备份。后来由于一些原因,在利用 hexo 生成静态文件之后,自动推送到 Coding 上的命令不起作用。自己也没有时间去排查问题,所以最近访问速度有点慢。 传统的 hexo 博客更新过程是:在完成写作之后,利用命令行调用 hexo g && hexo d 来生成静态博客文件以及并推送到远端的仓库中。这种方法会产生三个痛点: 每一次修改源文件后都需要重新生成一边静态文件,当大量修改时,步骤就变得繁琐且无趣。 生成静态文件依赖电脑中的 hexo 和 node.js 环境,不方便在外出时临时写或修改博客。 博客源文件没有自动的备份功能,不符合安全原则。 Travis CI 是一种持续集成开发所使用的工具,在写作过程中引入他可以解决上面我提到的痛点。Travis CI 具体的含义也不是很清楚,直接介绍我是怎么使用的。 博客依赖 3 个 git 仓库: 原始文件 xiang578/blog 主题文件 xiang578/hexo-theme-even: A super concise theme for Hexo(我对这个主题有一些修改,所以自己 fork 了一份 发布文件 xiang578/xiang578.github.io: Welcome to My blog!。 和大部分人一样,这个博客的静态文件保存在 github 的 xiang578.github.io 仓库 master 分支中。但是,我还创建了一个新的分支 hexo,用来保存博客源文件。每一次修改博客源文件之后,我不在本地生成静态文件,而是利用 git 命令,将所有的修改内容推送到仓库中的 hexo 分支。Travis CI 服务监听到新的 push 时,会根据你的配置将 git 仓库拉倒他的服务器上,编译源文件成为静态文件,并推送生成的文件到指定仓库的指定分支中。而且,如果编译静态文件失败,他也会通过邮件通知你结果。 流程 将 github 上存放静态博客源文件的仓库拉下来,利用 git checkout -b hexo 创建并进入新的分支,删除分支内所有的文件。 将博客源文件复制到第一步中的文件夹中。 添加一个 .travis.yml 文件,文件内容可以参考下一节 Travis-ci 配置文件。 https://travis-ci.org/ 提供免费的持续集成服务,可以通过 github 登入,直接选择需要管理相关的项目。 第一次将源文件上传到 github 时,可能会遇到问题。主题 themes/xxx 是通过 git clone 下载的,无法直接 push 包含嵌套关系的 git 库。删除 themes/xxx/.git 正确的姿势是,最开始就使用 git modules 引用依赖库。所幸还能编辑 .git/config,添加下面几行代码解决: 打开 themes 对应的 github 网页,你会看到主题链接到其他仓库(其中 @commitid 控制对应的版本) 完成这样的设置,修改主题文件后,需要先将修改 push 到主题的仓库,然后在博客文件夹下 push 修改到远端仓库(修改依赖的 commitid)。最终,才能再网页上看到修改效果。 Travis-ci 配置文件 1234567891011121314151617181920212223242526272829303132333435363738394041language: node_jsnode_js:- 9.11.1cache: directories: - node_modulesbefore_install:- export TZ='Asia/Shanghai'- npm install hexo-cli -ginstall:- npm installscript:- hexo clean- hexo generateafter_script: - git clone https://${GH_REF} .deploy_git # GH_REF是最下面配置的仓库地址 - cd .deploy_git - git checkout master - cd ../ - mv .deploy_git/.git/ ./public/ - cd ./public - git config user.name "xiang578" - git config user.email "xiang578@foxmail.com" - git add . # - git commit -m "Deploy at $(date +"%Y-%m-%d %T")" - git commit -m "Travis CI Auto Builder at `date +"%Y-%m-%d %H:%M"`" # Github Pages - git push --force --quiet "https://${CI_TOKEN}@${GH_REF}" master:master # Coding Pages # - git push --force --quiet "https://xiang578:${Coding_TOKEN}@${CO_REF}" master:masterbranches: only: - hexoenv: global: # Github Pages - GH_REF: github.com/xiang578/xiang578.github.io # Coding Pages # - CO_REF: git.coding.net/xiang578/xiang578.git hexo 两个错误 在这一次的过程中,又遇到两个本地编译 hexo 的错误,一同记录一下。错误表现如下: 123456789ERROR Plugin load failed: hexo-renderer-sassError: Cannot find module 'node-sass' at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15) ...ERROR Plugin load failed: hexo-renderer-scssError: Node Sass does not yet support your current environment: OS X 64-bit with Unsupported runtime (64)For more information on which environments are supported please see:https://github.com/sass/node-sass/releases/tag/v4.8.3 ... 网上的建议是修改 npm 的源地址为淘宝的镜像,并且重新下载这两个包。 123sudo npm config set registry https://registry.npm.taobao.orgnpm install hexo-renderer-sass --savenpm install hexo-renderer-scss --save Reference 用TravisCI持续集成自动部署Hexo博客的个人实践 - CSDN博客 关于 git-submodule 的一些基本操作 - 个人文章 - SegmentFault 思否 安装 npm install hexo-renderer-sass --save 出错,有什么办法没 - V2EX hexo 发布之后 gitpage 自定义域名失效 - CSDN博客 使用 Travis 自动构建 Hexo 到 GitHub | Zthxxx’s Blog 使用travis-ci自动部署Hexo到github和coding - 掘金 ChangeLog 180904:完成初稿","link":"/post/use-travis-ci-to-auto-build-blog.html"},{"title":"博客折腾记:使用 Travis CI 自动部署","text":"前几天,看到其他人在 V2 上讨论利用 Docker 更新 hexo 博客。不过自己对使用 Docker 不是很感兴趣,倒是了解到 Travis CI 的作用。 参考使用 Travis 自动构建 Hexo 到 GitHub | Zthxxx’s Blog和使用travis-ci自动部署Hexo到github和coding - 掘金这两篇文章,完成了博客自动部署的修改,也解决了一些,之前没有在意的问题,写下来备忘一下。 介绍一下与这个博客先关的 git 项目。博客相关的原始文件放在 xiang578/blog,主题文件放在 xiang578/hexo-theme-even: A super concise theme for Hexo(我对这个主题有一些修改,所以自己 fork 了一份,最后发布的文件放在xiang578/xiang578.github.io: Welcome to My blog!(实际上这也是一个备份,访问时的文件是从 coding 服务器上读取的)。 按照上面两篇博文配置好 Travis CI 之后,每次向存放博客原始文件的仓库 push 时,travis-ci.com 都会拉取代码进行 build ,成功之后会出现下图。 之前都是使用 git clone 下载主题的,如果把本机上的博客相关文件直接推送到 github 上会遇到问题。简单地说就是一个 git 文件夹包含了另外一个 git 文件夹。所以,需要使用 git modules 来解决。通过这种方法可以在 clone 主仓库时,会自动clone子仓库。 博客仓库中会链接到其他仓库,其中 @ 之后的那一串就是 commit 编号,主要是用来做版本控制的。 完成这样的设置,修改主题文件后,需要先将修改 push 到主题的仓库,然后在博客文件夹下 push 修改到远端仓库。最终,才能再网页上看到修改效果。","link":"/post/use-travis-ci-to-auto-update.html"},{"title":"为知笔记写博客测试","text":"适用于WordPress 如果你可以看到这一篇文件,就表示我测试成功了! tips: 为知笔记中的标签自动变成博客文章的标签 选择发布时,会自动检测是新发布文章还是修改文章 自带markdown优化,轻松解决wordpress没有什么好用markdown编辑器的问题 参考连接:发布笔记到博客,更好的博客离线撰写工具","link":"/post/use-wiznote-to-write-blog.html"},{"title":"(WDR) Learning to Estimate the Travel Time","text":"严重申明:本篇文章所有信息从论文、网络等公开渠道中获得,不会透露滴滴地图 ETA 任何实现方法。 这篇论文是滴滴时空数据组 2018 年在 KDD 上发表的关于在 ETA 领域应用深度学习的文章,里面提到模型和技巧大家都应该耳熟能详,最大亮点是工业界的创新。 简单介绍一下背景:ETA 是 Estimate Travel Time 的缩写,中文大概能翻译成到达时间估计。这个问题描述是:在某一个时刻,估计从 A 点到 B 点需要的时间。对于滴滴,关注的是司机开车把乘客从起点送到终点需要的时间。抽象出来 ETA 就是一个时间空间信息相关的回归问题。CTR 中常用的方法都可以在这里面尝试。 对于这个问题:文章首先提到一个最通用的方法 Route ETA:即在获得 A 点到 B 点路线的情况下,计算路线中每一段路的行驶时间,并且预估路口的等待时间。最终 ETA 由全部时间相加得到。这种方法实现起来很简单,也能拿到一些收益。但是仔细思考一下,没有考虑未来道路的通行状态变化情况以及路线的拓扑关系。针对这些问题,文章中提到滴滴内部也有利用 GBDT 或 FM 的方法解决 ETA 问题,不过没有仔细写实现的方法,我也不好继续分析下去。 评价指标 对于 ETA 问题来说,工业界和学术界常用的指标是 MAPE(mean absolute percentage error),yi{y_i}yi 是司机实际从 A 点到 B 点花费的时间,f(xi){f(x_i)}f(xi) 是 ETA 模型估计出来的时间。得到计算公式如下: minf∑i=1N∣yi−f(xi)∣yi{min_f \\sum_{i=1}^{N}\\frac{|y_i - f(x_i)|}{y_i}} minfi=1∑Nyi∣yi−f(xi)∣ 多说一句,如果使用 GBDT 模型实现 ETA 时,这个损失函数的推导有点困难,全网也没有看见几个人推导过。 这个公式主要考虑预估时间偏差大小对用户感知体验的影响,目前我们更加关心极端 badcase 对用户的影响。 特征 特征: 空间特征:路线序列、道路等级、POI等 时间特征:月份、星期、时间片等 路况特征:道路的通行速度、拥堵程度 个性化信息:司机特征、乘客特征(有「杀熟」风险)、车辆特征 附近特征:天气、交通管制 模型 模型包含 3 个部分: Wide Learning Models:Wide & Deep 这一部分使用的是 LR + 特征工程,希望模型能记忆一部分的模型。这篇论文中直接利用交叉积学习,减少手动特征工程。 Deep Neural Networks:对 sparse feature 做一次 Embedding,使用 3 层 MLP 和 ReLU 的网络。 Long-Short Term Memory:前两部分模块没用使用路线序列特征,所以这部分采用 LSTM 抽取路线特征。由于路线序列是不定长的,论文中的模型是使用最后一个隐藏状态,我们也可以把全部的隐藏状态 reduce_sum 输入到最后的模块。 Regressor: 将 3 个模型的输出综合起来,作为最后的 ETA 预估。MAPE 作为损失函数,利用 BP 训练模型。 上面模型中使用的特征分类: Dense feature:行程级别的实数特征,比如起终点球面距离、起终点 GPS 坐标等。 Sparse feature:行程级别的离散特征,比如时间片编号、星期几、天气类型等。 Sequential feature:link 级别的特征,实数特征直接输入模型,而离散特征先做 embedding 再输入模型。注意,这里不再是每个行程一个特征向量,而是行程中每条 link 都有一个特征向量。比如,link 的长度、车道数、功能等级、实时通行速度等。 评估 包括两部分:离线评估和在线评估。 离线评估中取滴滴 2017 年北京前6个月的订单数据,分成两类 pickup (平台给司机分单后,司机开车去接乘客的过程)和 trip (司机接到乘客并前往目的地的过程)。具体数据集划分如下。 离线使用 MAPE 来评价模型。在线评估时,为了更好的与用户体验挂钩,采用多个指标来衡量 ETA 的效果。包括: APE20: absolute percentage error 小于 20% 的订单占比。(越大越好) Badcase率:APE 大于 50% 或者 AE 大于 180s 的订单占比,定义为对用户造成巨大影响的情况。(越小越好) 低估率:低估订单的比例。(越小越好) 离线结果如下图所示,说来汗颜 PTTE 和 TEMP 是什么算法我都不知道…… WD-MLP 指的是将 WDR 中的 R 部分换成 MLP 。最终 WDR 较 route-ETA 有巨大提升,而且 LSTM 引入的序列信息也在 pikcup 上提升了 0.75%。文章的最后还提出来,LSTM 也可以换成是 Attention,这样替换有什么优点和缺点留给大家思考。 在线实验结果如下图所示,滴滴 ETA MAPE 明显小于 com1、com2、com3 ,这三家地图公司具体是哪三家,大家也能猜到吧。 ETA 服务工程架构 从上面的图中可以看出 ETA 服务工程架构主要包括三个部分: Data Aggregation:包括利用 Map Matching 将司机上传到平台的 GPS 对应到滴滴的 Map Info 中得到司机真实行驶过的路线信息,Order Context 指的是订单相关的信息,augmented Data 额外数据比如上文说的交通情况相关信息。 Offline Training:利用上一步得到的历史数据训练模型。这里可以值得一提的是,ETA 模型是和时间强相关的(节假日和工作日的数据分布明显不同),所以在文章中作者指出将拿出最新的一部分数据用来 fine-tune 训练出来的 WDR 模型。 Online Service:这里需要一个完整的模型服务系统,其他公司也有很多分享,所以原文没有多提。 FMA-ETA: Estimating Travel Time Entirely Based on FFN With Attention WDR 模型中 RNN 耗时长,探索基于 Attention 机制的模型 对特征分组(multi-factor)去做 Attention 效果比多头要好 实验结果分析这部分没有看懂 The deep modules with attention achieve better results than WDR on MAE and RMSE metrics, which means attention mechanism can help to extract features and sole the long-range dependencies in long sequence. 遗憾之处 新模型预测时延减少,但是没有线上实验结果。 暂时没有公开代码和数据集。 总结 从上面简单的介绍来看,ETA 可以使用 CTR 和 NLP 领域的很多技术,大有可为。最后,滴滴 ETA 团队持续招人中(社招、校招、日常实习等),感兴趣者快快和我联系。 说点题外话 你为什么从滴滴出行离职? - 知乎 中提到一点: 8.同年大跃进,在滴滴中高层的眼里,没有BAT。滴滴单量超淘宝指日可待,GAFA才是滴滴要赶超的对象。百度系,LinkedIn系,学院派,uber帮,联想系,MBB就算了,据说连藤校都混成了一个小圈子。。一个项目A team ,B team。一个ETA,投入了多少人力自相残杀?MAPE做到0%又如何?用户体验就爆表了吗?长期留存就高枕无忧了吗?风流总被雨打风吹去,滴滴是二龙山,三虫聚首?是不是正确的事情不知道,反正跟着公司大势所趋,升D10保平安。 参考 KDD 2018:滴滴提出WDR模型显著提升ETA预测精度 | 雷锋网 LBS工业界ETA应用及滴滴WDR技术 – Semocean","link":"/post/wdr.html"},{"title":"每周分享第 1 期","text":"这里记录过去一周,我看到的值得分享的东西,每周六更新。 新闻 1、伊朗迷你裙消亡史_手机网易网 历史居然可以导流…… 2、欧盟GDPR有多狠?未合规的数据处理活动或将被叫停! - 大数据 - DBAplus社群——围绕数据库、大数据、PaaS云,运维圈最专注围绕“数据”的学习交流和专业社群 关于 GDPR 你需要了解的一切 - 少数派 最近收到很多跟这个相关的邮件 3、2018互联网女皇报告中文完整版呈现! 4、如何评价ry(Ryan Dahl)的新项目deno? - 知乎 这个新闻关键不在于这个新的项目,而是在于国内和多的开发者在项目的 Issues 页面灌水,引起其他人的反感。 工具 Kanbanist | The Missing Kanban Board for Todoist 前几天还在考虑如何将 todoist 与看板结合,也看了一下 todoist 相关的 api 文档,之后在网上搜索时就发现了这个产品。功能还不是很强大,不知道作者什么时候可以完善。 文摘 1、 大学的双休日应该如何充实地度过? - 知乎 这一个回答是我见过关于大学如何渡过比较好的解释,希望还没有毕业的同学可以不辜负四年。 你如果找准了目标,自然自己会有一个答案。每个人只要认准一件事情好好做下去,最后的结果不一定会差。虽然我自己是走传统路线的学生,GPA+英语+竞赛都稍微拿得出手,但是其实我并不喜欢现在的自己。其实你发现,除了顶级大牛,大多数大学所谓的好学生,其实都是一个模子刻画出来的。国家奖学金(其他综合奖学金)+90左右的均分+各类学科竞赛+各类荣誉称号+各类传奇的社会经历活动等等。当然,本科毕业后,人生不会太多波折,但是回首望去,这样的本科未必真的是自己想要的本科。 2、前几周加了民科微信群(不知道有没有人还记得当年发现电荷不存在的“民间科学家”),很难理解他为什么会这么执迷不悟,下面这一段话大概可以解释一下。 一个人不需要做什么惊天动地的大事,但是对自己做的事情必须有认同感,如果做学术的自己都觉得自己在灌水,理由是身边大多数人也是在灌水,那么我不明白我为什么要去做它。 3、哪些经济学论文让你发出「脑洞才是第一生产力」的感叹? - 童话李的回答 - 知乎 生活处处皆皆学问,从篮球比赛中的「手感」出发,抽象「这个球命中概率是否与下一个球命中概率正相关」,然后去统计数据研究,最后给出下面的结论。 The belief in the hot hand and the “detection” of streaks in random sequences is attributed to a general misconception of chance according to which even short random sequences are thought to be highly representative of their generating process. (一小段完全随机的结果,却被认为对整体有很高的代表性。) 4、我的5个经济学思维 – 左岸读书 折现、机会成本、边际效用递减、沉没成本、复利 图片 1、以 GDPR 为背景创建的图片 视频 1、2018 4 18 德云一队新街口剧场《朱夫子》高峰 栾云平 - YouTube 金句 1、坚持读书,坚信自己可以读完一些东西,坚信自己可以承受读书的强度——无论读的是什么,这过程本身就是一种信念,并且这份信念会让我们抵达心中的目的地。 2、许多时候,我们身处信息传导的末端。当一个问题反复多年都没有解决方法的时候,就应该怀疑是否信息上游的路径已经锁死?可能在你自己原有的知识体系和知识框架内并不存在解决方法,无论耗费多少时间和精力都不能解决问题。那么,这时候应该考虑迁移到其它陌生的领域中去,也许,你要的答案早就放在那里,只是你一直没有发现而已。你的问题,也许对那个领域里的人而言,只是他们工作的一个副产品,甚至都不会太在意。——和菜头 3、所有的科技公司,解决的都是人、信息、物品三方之间的关系。简化来说:谷歌解决的是人与信息的关系,亚马逊解决的是人与物的关系,Facebook解决的是人与人的关系,微软,解决的是企业人的问题。 ——如同答辩老师对我所说,做硬件才有意义。 4、元认知是对认知的认知。元认知是自省的能力。一个人能够理性的反思自我,自然就会知道许多麻烦,并非是外界的存在,而是自己暴戾所引发的。执迷于无知,甚至以无知为傲骄,才是最可怕的贫穷。 5、我觉得大多数幸福的人的生活就是这样的,没有什么高大上,也没有那么多的风花雪月,而就是这样简简单单、快快乐乐地用自己的努力和自己心爱的人一起为更美好的生活脚踏实地地奋斗着。 6、当一个学生从某一所知名大学毕业后,他不需要再把母校的名字天天挂在嘴边;当一个学生从一所二三流大学毕业后,那所学校今后会因为曾经出了这样一个学生感到自豪。这样的大学经历就堪称完美了。——快要离开学校时,思考自己的价值。","link":"/post/week-issue-1.html"},{"title":"每周分享第 10 期","text":"这里记录过去一周,我看到的值得分享的东西,每周六更新。 文章 深入FFM原理与实践 -:美团技术博客的文章之一,感觉比网上很多文章讲解的都深刻。不知道为什么文章中很多的参考资料都是网上的博文,有点遗憾。 「华为公积金下调到 5%」,刚毕业的应届生可能不懂,这当中有什么套路:前一段时间的热门,华为真是一家神奇的企业。从奋斗者协议到今天的调整公积金比例,不断地压榨着员工的极限。之前还看到有人说夸华为,至少给得钱对得起员工的时间,这次的调整无疑给已经买房的员工致命一击。 Readme驱动开发 - Erning.write():这种开发方式又称 RDD。目前在公司开发时,发现大部分项目没有开发文档或者 wiki,项目的内容也只能靠口口相传。造成这样的局面,可能是公司之前发展速度太快。从另外一个角度来说,没有外部的文档是否可以开发人员本身有一些优势,防止被快速的替代? 图片 新奇的创意,通过缺失表达战争造成的伤害。 金句 我经常骂孙笑川,心机自私膨胀,后来才发现我自己就是孙笑川,骂的都是现实中不争气的自己,人人都是孙笑川,却又都不想当孙笑川。每个人都在骂孙笑川,每个人都恶心孙笑川,因为每个人都知道自己就是孙笑川,但每个人都不想承认自己就是孙笑川。—— 网络时代,每个人都是小丑","link":"/post/week-issue-10.html"},{"title":"每周分享第 2 期","text":"这里记录过去一周,我看到的值得分享的东西,每周六更新。 毕业季脱更几天 新闻 1、EffectiveMac - EffectiveMac 一份 Mac 系统教程 2、Evernote 和印象笔记终于拆分了,国内的公司独立开发。为知笔记半死不活的情况下,还是希望印象笔记能给我们带来更多的惊喜。来源 3、离开毛坦厂,去吻我爱的女孩:又是一年高考时,这篇文章从不同的角度去感受被称为高考军工厂的毛坦厂,可惜当年我没有这样的感受。 工具 Thought Train for MacOS – Simple Note App for MacOS:有意思的小工具,在 Mac 状态栏上显示一些话。 Rooster for Chrome™:在新标签页统计每天浏览各个网站的时间。 文摘 1、看板使用指南:从三列看板到灵活的布局设计 思考了一下,个人管理在于项目比较少的时候不是很适合这种方法,还是比较适合软件团队使用。看完这篇文章,学习到的是泳道这个概念。 2、如何理解傅里叶变换公式? - 知乎 3、机器学习最佳实践:Google 官方指南 图片 1、索引卡的妙用 视频 1、預告分析 《蜘蛛人:返校日》 : 少年超級英雄的進化(一) | 誰不重要 - YouTube 台湾一名电影自媒体,看问题的方式更加的深刻。 金句 1、这是创业者最坏的时代,因为你很难再打情怀牌同情牌,要直面巨头们的烧钱大战。你能做的极限就是杀进决赛接受巨头投资。这也是创业者最好的时代,因为靠包装和营销的骗子们更加难以持续,劣币的离场速度显然是快于良币的。世界最终未必是你的,但一定是属于和你一样的人的。 2、评家罗世宏说,脸书作恶并非首次,“脸书强大的信息过滤和投放能力,代替人们开展正常的社交活动,也代替了人们自行选择接触什么信息的决定权。这次脸书再度陷入丑闻,或许最好的结果并不是脸书从此幡然改悟,善尽社交媒体平台的社会责任,而是扎克伯格的总统梦破灭了。(我并)不期待它从此改邪归正,但盼最终能把脸书这样的网络巨人和它所掌控的超大权力,逐步关到笼子里面去。 3、在一个知识更新如此迅猛的时代里,人们借助各种工具,将日常碎片化的时间充分利用起来,以更少的时间快速获取知识。这一点本来无可厚非。鲁迅先生也曾说,“哪里有天才,我是把别人喝咖啡的时间都用在写作上了”。但是,碎片化的学习不代表知识获得可以有捷径可走,更不等于打着知识付费的旗号去做知识的买卖。 4、其实,消费的本质就是考量成本与收益。这些新的名词后面的内核,是重新回到消费的本源,是为了使用价值而不是符号价值去消费;是为了提高生活品质的需要去消费,而不是追求炫耀的资本;为了获得身体和内心的享受去消费,而不是仅仅满足自己被裹挟的欲望。 微博写作训练 1、淘宝与拼多多的商业模式 淘宝由于通过商品展示赚钱,倾向于推荐客单价比较大的商品,很多长尾商家就没有那么多导入流量。拼多多正是瞄准这一点,利用微信进行裂变式发展,做低价标品的拼团。此外为了促进消费,拼多多在系统的设计上取消了购物车、收藏夹、评论等功能。","link":"/post/week-issue-2.html"},{"title":"每周分享第 3 期","text":"这里记录过去一周,我看到的值得分享的东西,每周六更新。 文章 1、 GitHub 和开源是对穷人的恩赐 - 来自知乎专栏,作者: 园长 想起之前PAT老师过来宣传PAT时(我不是很看好这个考试),将到企业通过学校来筛选候选人是因为应聘者太多,企业只需要找到合适的人,不需要考虑社会公平。这篇文章中谈到的观点,通过 Github 给开源世界贡献代码,能记录你学习成长的过程(git commit 还可以修改,是不是区块链技术适合这个场景),让更多的人认识你,逃过企业的一些过滤器。校招时,也在简历上写过 github 地址,在网易游戏面试,面试官还夸了一下。某一刻突然认识到,你需要找到属于自己的产品。 2、重新捡起GTD —— 读《软技能》有感 - 少数派 少数派上关于工作效率探讨的文章之一,我在月读中也推荐过《软技能》,这篇文章的作者结合里面的原理,打造了属于自己的工作流,有一定的参考意义,也可以当成是开始实现 GTD 的范本。 3、矩阵求导术(上) 学习机器学习时遇到的困难之一,这篇文章介绍的很详细,最后也分析了几个机器学习中的例题。 图片 1、中国看待世界的方法。小时候总以为世界上只有两个国家,中国和外国。 视频 1、一条穿过河北农村的海底隧道|大史记 Vol.6… 来自史里芬Schlieffen - 微博:魔幻现实主义,拥有中国特色的海洋馆,之前没有想过还可以建造龙宫。大史记还有好几个更这种类似的视频,介绍国内一些疯狂的建筑。 2、第1集 长沙:解放西路旁的小餐厅_纪实72小时(中国版)_腾讯视频:纪实72小时是日本 NHK 电视台的节目,每期选择一个地点连续拍摄 72 小时。之前在 B 站上看过这个系列很多的,现在腾讯搞了一个中文版的。看完第一集之后,没有日版的味道,感觉日版选择餐厅主题时,会平衡食物与故事之间的分配,长沙这个餐厅中,注重煽情。还是期待未来能去更多的地方拍摄。 金句 1、币圈生存法则不是已经告诉你了么 倾家荡产四大捷径:1,追涨杀跌;2,期货杠杆;3,融资融币;4,短线神操作。 人生巅峰四条大道:1,踏实工作;2,闲钱投资;3、长线持有;4,按时吃饭睡觉。 还有再加一条: 远离空气币。——勃学日常反投机语录之一 2、我对于主播粉丝感到非常费解的一个地方,就是能够把极高的信任授予某一本质上并非双向认识的一个人。 ——目睹之前绝地求生主播圈内的开挂风波的感叹 3、当别人知识体系已经汇编成执行节点,不仅达到成熟运转,还设计了升级调整的节奏,你的知识体系却还远远没有完善。 4、无非三本的学生不仅仅在初筛的时候会失去很多机会,并且在推销证明自己的时候,需要拿出比985学生更多的东西出来。 ——又快要到了高考填志愿的时候,不同选择的差距所在。前面也提到过这个观点。 微博写作训练 1、从少数派 Power+ 中看到的文章——颜色与身份统一。很多软件设置项目的颜色(比如日历软件中事件的颜色,todoist 中项目的颜色等等),思考将这些颜色对应一个现实中的身份进行统一(比如个人-绿色、家庭-紫色、工作/学校-棕色、其他-黄色),在不同的软件中进行统一(todoist、toggl、日历、文件夹)。在无法设置颜色的软件中利用 Emoji 解决。#效率思维# 少数派中文章是专属的,所以不放链接。放上知乎上一篇类似的文章:彩虹分类法:用七种颜色管理时间 。 工具 1、苹果设计奖的赢家,集日历、任务管理、笔记于一身的应用:Agenda - 少数派:看起来不错的一款多功能应用,由于之前的系统迁移成本有些太高,这一次都没有尝试的兴趣。","link":"/post/week-issue-3.html"},{"title":"每周分享第 4 期","text":"这里记录过去一周,我看到的值得分享的东西,每周六更新。 文章 一个程序员的成长之路 · Issue #41 · fouber/blog:之前一直在思考如何将一些分享展示出来,从这篇文章中得到启发,将 ppt 全部转换成图片,并且配上文字解说。 超一流作家的写作利器:用卡片提升创意的密度:卡片写作法,下一个阶段学习的重点之一。离线杂志的内容和形式也很有趣,不过目前停更了。 校长钟晓敏寄语2018届毕业生:拥抱时代,创造幸福:毕业季,贴出自己学校校长的毕业典礼演讲稿。从内容上来说平淡无奇,毫无在互联网上火爆的可能。听完之后,只记下了一句「我们每个人都是由自己一再重复的行为所铸造的。因而优秀不是一种行为,而是一种习惯。」 图片 微博中图片,有一种共建二流的错觉。好的学校创建世界一流,普通学校创建国内一流,就没有安心当二流的学校。 视频 2018世界杯足彩竞猜:一个稳赚不赔的方法是什么?李永乐老师教你足球彩票对冲套利(2018最新) - YouTube 最近世界杯,网上一大堆赌球的截图。这个视频虽然标题写的是稳赚不赔的方法,看完这个方法的数学原理之后才发现足彩公司的强大。 金句 这一改革,适应新时代我国社会主要矛盾的变化,聚焦发展所需、基层所盼、民心所向,为的就是建设服务型政府,更好服务人民,更加让人民满意。 [一棵妒忌另外一棵树,恨不得自己变成斧头]:雪山下有一只二头鸟名为共命鸟,其两头分别值守日夜彼此轮流休息。由于一个头总是得享美味果实,另一头心生嫉恨,于是吞下毒果,两头同归于尽。 大多数互联网和技术人都还是有种理想主义情怀(非贬义)在身上的;我们希望通过技术让世界更好,我们也希望能把前辈留给我们的那个包容开放自由的互联网传承下去,有些先驱们甚至用生命捍卫了这些价值与理念。 但是作为个人,我希望的互联网应该是更开放的,这也是为什么我们会说微信做的不好:因为互联网应该让信息更流通,而非人为地制造信息孤岛。 一个人是有多自恋,才会觉得几十光年以外,老久以前发生的天文现象,就为了暗示他的人生里的那点事。 工具 autojump:命令行中实现目录快速跳转","link":"/post/week-issue-4.html"},{"title":"每周分享第 5 期","text":"这里记录过去一周,我看到的值得分享的东西,每周六更新。 文章 想尝鲜 iOS 12,请先看这份 Public Beta 升降级指南 - 少数派:前几周就尝试开发者预览版了,升级之后,明显可以感觉到流畅度的提升,而且也多了屏幕时间等一些统计数据。 澎湃新闻的英文版发表这篇 Outside the Green Bubble of China’s Super-App,介绍一些人为什么要逃离微信?从自己的角度来看,这一年多以来,加了很多好友和群,有时候打开微信就是一排的群消息,不想看又不好退群,朋友圈还能通过屏蔽来净化。不可否认微信已经成为一个超级 APP,更进一步可以说是小型操作系统。手机只要能装上微信,几乎可以不安装其他软件。但是一群人却反其道而行之,接受种种的不变从而达到放弃微信。微信最大的问题是封闭,公众号中的文章很难被外部检索,人为的造成了一些信息的孤岛。第二就是野蛮,从最早朋友圈封杀支付宝,到现在的抖音、今日头条,完全不顾用户的感受。最后一点是自由,聊天消息被监控,严重的会转移到司法机关处理。以及谣传利用聊天数据进行广告推荐。不知道有没有其他一款通讯软件能挑战微信的地位。 技术演讲中最容易被忽视的问题 | 唐巧的博客 图片 推特上新学到的名词:无产中产阶级,自己也将成为其中的一员,却又没有机会逃离。 金句 能脱离原来的阶层思考问题,却与家人朋友有更深的隔阂,却依旧在贫穷与疾病里挣扎。命运并没有改变,只是更理解命运的无奈而已。 功利性的学习是对知识的一种浪费,异化的知识观念让学习变成了一场场知识与世俗的交易。 如今的朋友圈已经成为了每个人自我形象塑造和对外表达的关键平台。 一方面,优质教育资源可以向更广泛的地区辐射,惠及有需要的人群。另一方面,师生关系不再如以往那般界限分明。每个人都是相互学习、共同成长的分享者与传播者。 大多数互联网和技术人都还是有种理想主义情怀(非贬义)在身上的;我们希望通过技术让世界更好,我们也希望能把前辈留给我们的那个包容开放自由的互联网传承下去,有些先驱们甚至用生命捍卫了这些价值与理念。 卡片写作 《派出所的故事》 这几天一直在看《派出所的故事》,电视剧由《炊事班的故事》原班人马打造,每个人的性格也差不多继承。看完这部剧的第一感受,艺术源于生活,又高于生活,所有的巧合都集中发生。不过后来仔细一下,这部电视剧也是奶头乐中的一种,没有深度可以思考的内容。 《地下交通站》 这两天又高强度看完了一部情景喜剧《地下交通站》。这部片子以抗战时期河北安邱(虚拟)的鼎香楼为背景,展示我军情报人员如何与敌人斗志斗勇的故事。情节虽然短平快,却难逃抗日篇的通病,敌我黑白分明,好人聪明机智,某些特殊的还出场自带BGM,坏人这是一事无成。或许我能得出这种结论是因为站在了全知视角,没有将自己代入到故事中。有趣的一点,最近看的电视剧,经常发现某些演员重复出现,弹幕则疯狂地刷这个人之前的台词,为观剧添加了更多的期待。","link":"/post/week-issue-5.html"},{"title":"每周分享第 6 期","text":"这里记录过去一周,我看到的值得分享的东西,每周六更新。 卡片写作 熊猫慢递 上周《纪实72小时》,北京熊猫慢递。写给未来的一封这个概念很早就接触过,自己之前也尝试写过。再看那封信会有一些伤心,辜负了过去努力的自己。有一段时间为了使自己在考试时集中注意力,都会在试卷写上一句,不要辜负过去点点滴滴的努力。有机会,就去这个熊猫慢递写给两年后的自己一封信。 文章 细枝末节都交给 App,我只负责享受生活 | 2016与我的数字生活 - 沨沄的博客 | FoxGeeker Blog:博主从意识到数字生活开始的一系列改变,文章内容很充实。 LPL心理教练黄菁:“心”备竞赛(上)——RNG的锐变:看了半年多的 LPL,了解一下背后的故事。 卡片助力输入输出,工具我选 WorkFlowy | ishanshan’s blog:使用印象笔记之后,创建了很多只有几句话的笔记。这种情况下印象笔记很难管理,需要去寻找另外一个工具,有幸发现 Workflowy 这类大纲软件。 用心写周报的同事,绩效不会太差 | ishanshan’s blog:与上一篇文章的作者相同,最近自己也要入职了,拿这一篇文章来参考一下,其实不光工作可以写周报,学习也可以尝试写周报,反思是取得进步的途径。题外话,作者是来自开智学堂的,从我侧面的一些了解,这家公司对于工作规范要求比较高,也可以当成数字生活的参考。 金句 哪里会有人喜欢孤独,不过不喜欢失望。(挪威森林) 感谢大学四年里遇到的所有人,或萍水,或至交;或平平淡淡四年的柴米油盐,或惊鸿一瞥不期的遇见;或心酸的讥讽,不屑的嘲笑;或热情的洋溢,真心的赞美;所有形形色色的人和林林总总的事,无论是相逢于青山绿水还是最终相忘于江湖,感谢你们漫步庭前看花谢,坐卧塔下笑清风。人生匆忙,百年过往,他日相逢,此情莫忘。泛菊杯深,吹梅角远, 同在京城,聚散匆匆, 教人怎不伤情? 觉几度,魂飞梦惊。 后夜相思,尘随马去,月逐舟行。诸位,一世顺意! 直到毕业的时候我才明白,当你要致谢的人和环境并没有那么美好时,有些话是无论如何都说不出口的。于是乎,我也使用了前人的套路,留下几句客套话后便匆匆赶往下一站了。 高考做错的每一道题,都是为了遇见对的人。 工具 Mweb 3:是 Mac 上一款专业的 markdown 写作软件。目前,我自己用它来管理平时的卡片写作、机器学习笔记以及博客文章更新。最近,这个软件正在搞首发优惠,比较惊喜得是发现软件中隐藏的沉浸模式。","link":"/post/week-issue-6.html"},{"title":"每周分享第 7 期","text":"这里记录过去一周,我看到的值得分享的东西,每周六更新。 文章 I have forgotten how to read:碎片化时代对于阅读的反思。 技术演讲中最容易被忽视的问题:参考文章,内容不错 金句 感谢大学四年里遇到的所有人,或萍水,或至交;或平平淡淡四年的柴米油盐,或惊鸿一瞥不期的遇见;或心酸的讥讽,不屑的嘲笑;或热情的洋溢,真心的赞美;所有形形色色的人和林林总总的事,无论是相逢于青山绿水还是最终相忘于江湖,感谢你们漫步庭前看花谢,坐卧塔下笑清风。人生匆忙,百年过往,他日相逢,此情莫忘。泛菊杯深,吹梅角远, 同在京城,聚散匆匆, 教人怎不伤情? 觉几度,魂飞梦惊。 后夜相思,尘随马去,月逐舟行。诸位,一世顺意!(毕业论文结束语) 直到毕业的时候我才明白,当你要致谢的人和环境并没有那么美好时,有些话是无论如何都说不出口的。于是乎,我也使用了前人的套路,留下几句客套话后便匆匆赶往下一站了。 高考做错的每一道题,都是为了遇见对的人。 那些办公室的白领们,总是自以为自己的表现领先于父母。认为父母落伍了……其实,这不过是因为经济结构转型造成的误会而已。 现在各种写字楼里格子间里,哼哧哼哧做重复 ppt 的年轻人,和当年踩着缝纫机的女工们,其实没有本质区别。 同理,当年父母在菜场讨价还价,多一份还是少一分,和现在年轻人在群里争先恐后的抢红包,状态也都差不多。 父母当年非要给电视剧遥控器套个塑料袋,和现在年轻人非要给手机套个壳差不多。 当然,现在每天拿着手机刷朋友圈和微博的人,和当年蹲在墙角嗑瓜子的人,也没什么区别! 点评:从某种意义上来说,社会从未改变。它只是在不停的轮回。所谓的变化,只不过是外在形式和工具而已。 也同样,随着新一轮经济的转型,这些在写字楼里做 PPT 的白领,也即将重复当年那些纺织女工被淘汰时的情景…… 互联网时代的学习,学得太多,做得太少。恰恰正是“学习”知识剥夺了我们实践和内化知识的机会。","link":"/post/week-issue-7.html"},{"title":"每周分享第 8 期","text":"这里记录过去一周,我看到的值得分享的东西,每周六更新。 文章 唐爽:坦途的人生有时候经不起一次搭错车:前一段时间很火的周立波事件,当事人之一回复,唐爽说的话很有逻辑,不愧是博士。 德鲁克谈《自我管理》——《哈佛商业评论》史上最受欢迎的文章(某些原因不提供链接,拿关键字搜索一下就可以找到原文):开始工作之后,越来越关注自我提升的内容。 Shell 中的极品-- Zsh - Richard Wei:推荐的几个插件都很有用,shell 的美观程度又提高了一个层次。 演进:在工作的前三年里快速成长(练习篇) - Phodal | Phodal - A Growth Engineer:职业成长系列。 金句 为什么越长大觉得时间过得越快?因为小时候是在发现发掘,而长大后是在不断重复。“有的人30岁就死了,80岁才埋葬。”这句话说的就是这个理,小时候,我们把一年过成了365天,长大后,我们把一年过成了365次。“回程总比去程快”佐证了一件事情:“时间”和我们接收了多少信息有关——信息能够延长时间。 区块链是一种分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式,这是一个典型的去中心化应用,建立在 p2p 网络之上。","link":"/post/week-issue-8.html"},{"title":"每周分享第 9 期 看不懂的拼多多","text":"这里记录过去一周,我看到的值得分享的东西,每周六更新。 文章 拼多多的多和少:拼多多应该会在本周上市,这篇文章是上周的微信热门文章之一,也是我见过分析拼多多最仔细的文章。说句实话,我对拼多多了解不多,也没有研究过他们的商业模式,从文章中可以看到拼多多的成长。现在也有一点为当初拒掉拼多多的 offer 而后悔,虽然辛苦但是给的多啊。 My Approach to Getting Dramatically Better as a Programmer – malisper.me:程序员成长相关。常思考两个问题: Learning how to solve problems I didn’t know how to solve before. Learning how to write correct programs faster. 以及掌握方法: Reading a paper. Learning a new tool. Reading several chapters of a book. Recording my screen as I write a program. Then reviewing the footage and seeing how I could have written the program faster. 云风的 BLOG: 三人合租的房租公平分配方案:现实中我也遇到了租房问题,不过还不太需要这些高深的知识来处理。这篇文章提供了2 、3 人分房的方案。 2 人版:A 和 B 分两间房,由 A 写下对两间房的报价,然后由 B 选择自己住哪间房。如果两个人都在理性下完成这个任务,房间的价格会趋向于它本身的价值。 2 人版另外一种解法:A 和 B 同时写下对两间房的心里价格(两个房间的价格总和一定),然后每间房由开价最高的人居住,每个月需要支付的价格是两个人对这间房子开价的平均值。 3 人版:这个问题比前面两种情况更加复杂。A、B、C 三个人有不同的职责。 A:写下对三间房的报价(报价的总和一定),A 是最后一个选择房间。 B:首先查看 A 对三间房的报价,思考是否有两间价格是合理的。如果是,那么在 C 选择一个房间后,依然有一个价格合理的房间可以选择。如果不是,那么标记两间他认为价格不合理的房间。 C:也是查看 A 对三间房的报价,思考是否有两间房的价格是合理的。如果是,那么他可以让 B 先进行选择,即使 B 认为有两间房价格是不合理的,还是有一间价格是合理的,C 也有至少有一间价格合理的房子可以选择。如果不是,那么标记两间价格不合理的房子,如果 B 认为是合理的,让 B 先进行选择,C 第二个进行选择。否则,B 与 C 标记的房子中重复的分给 A ,然后由 B 和 C 进入两人分房间。 如何「收集」知识 | MacTalk-池建强的随想录:这一段时间一直思考的如何与知识更好相处的问题,这篇文章可以当成是入门参考,不要陷入研究工具的怪圈,而是找到一个适合自己的知识处理系统。 视频 How to Read a Paper Efficiently (By Prof. Pete Carr) - YouTube:虽然没有去读研究生,但由于工作的性质也需要去大量的阅读论文。这一段小视频在如何读论文这个问题上提出了一种框架化的方法,适合新人去模仿实践。 金句 第三届国际华语辩论公开赛复赛,重温了经典辩题“金钱是不是万恶之源”。正方恐龙复生队对“恶”做了全新的定义:人世间所有的恶,都可以概括为“不把人当人”。—— 有感于前一段时间的疫苗问题,看到这一段文字依旧有力量。 工具 hunkim/DeepLearningZeroToAll: TensorFlow Basic Tutorial Labs:非常好的 tensorflow 教程。另外说一句,利用 tensorflow 来写机器学习真是轻松。 哔哩哔哩·猜你喜欢:BiliBili 的客户端中有一个猜你喜欢的功能,杀时间利器。在信息化的时代,还有什么比调试一个符合自己口味的信息流更有成就感的事情?通过使用这个插件,可以在网页版上实现猜你喜欢功能。","link":"/post/week-issue-9.html"},{"title":"每周分享第 11 期","text":"这里记录过去一周,我看到的值得分享的东西,每周六不定时更新。 观点 美团和滴滴为什么要互相开展对方的业务: 我记得罗振宇在某一年时间的朋友中提到一个观点:O2O 领域会出现一个超级公司,业务横跨所有场景。 从技术角度分析,外卖中比较难的点在于分单、时间估计以及路径规划。这也是出行服务中的技术难点。不过各有侧重,外卖中路径规划相当于最多不超过 20 个点(10 个商家处取餐,10 个顾客中送餐)的 TSP 问题。出行服务最关键的是如何有效的获取道路信息。(我有一个观点,人是有主观能动性的,会抄各种小道) 这两个服务都严重依赖地推服务,所以双方本身都有一支庞大的城市地推人员。我想开展不同业务的切换难度应该会小一些。 读书《刻意练习》 听这个名字很容易认为是一本鸡汤书,英文小标题中提到 New science of Experitse。本书打破的是之前很流行的 1 万小时天才理论,这个理论认为很多天才之所以是天才是他们的技能经过长时间的训练,有量变引起质变。新的研究发现,学习的本质是在大脑中建立心理表征,它是一种长时记忆单元,也是我们习得技能的结果。刻意练习就是如何高效地获得这个心理表征。鉴于这是一本脑科学的书,方法是否正确还应该是自己亲身体验才能知道。 文章 经过一年的思考,我重新梳理了我的印象笔记使用方法 - 少数派:不知道为什么,我对这类文章特别地喜欢。这篇文章带来的新意是对知识的六种分类,之前我自己没有考虑过。不要过度沉溺于研究工具,而忘记学习的初心。 教授说没有写过一千行代码就别想上大公司,这种说法对吗? - 知乎:之前看到这个问题就想直接喷,写一千行代码怎么去大公司。看完其他人的回答,才发现又一次陷入到了思维定势。从数学角度来说,写一千行代码去大公司是一个必要不充分条件,去大公司确实需要写代码,一千行是被包括的,但可能远远不够。 iPhone X 发布会乔布斯录音的中译(或当代汉语现状) – 一天世界:一段英文白话翻译以及文言翻译对比,又一次体会到古典之美。 There’s lots of ways to be as a person, and some people express their deep appreciation in different ways. But one of the ways that I believe people express their appreciation to the rest of humanity is to make something wonderful and put it out there. You never meet the people, you never shake their hands, you never hear their stories or tell yours. But somehow in the act of making something with a great deal of care and love, something’s transmitted there. And it’s a way of expressing to the rest of our species our deep appreciation. So we need to be true to who we are and remember what’s really important to us. That’s what’s gonna keep Apple, Apple, is if we keep us, us. 「李如一」译文:人生而有别,感恩之心亦可谓十人十色。创造神奇,示之于人,此为对人性感恩之一种也。彼二人或未曾握手相见,对各自生平事故复无相闻,惟细巧体贴之创造即足以千里传音。此即吾等人类传递感恩之心之法门也。故人必诚于其本色,忠于其所信。林檎之为林檎,端赖吾辈不忘初心也。愿与诸君共勉。 「@东莞大唐和尚」译文:人与人的生活方式千差万别,表达感恩的方式也是多种多样。但我认为,做出一件绝妙的东西,才是向这个世界表达感恩的最最深刻的方式。你没见过那些人,没跟他们握过手,你没听过他们的故事,也没跟他们讲过自己的经历,但就是通过你倾注心血做出的这样一件东西,你传达给了他们一些东西。这是向其他人表达我们感激的最深刻的方式。我们需要真诚地面对自我,永远记住对自己最重要的东西是什么。苹果之所以是苹果,我们之所以是我们,正在于此。 视频 人生一串 _ 纪录片 _ bilibili _ 哔哩哔哩弹幕视频网:属于国人的深夜食堂,再搭配上神级文案,完美展示烧烤江湖。 后记 这半年自己写的东西有点少,从第 10 期到这一次拖了好久。最初,是在阮一峰的鼓舞下开始这种形式的分享。不过后来由于种种原因,又展现出自己的本质。有些事情还是要坚持的,所以将这些存货发布出来。","link":"/post/week-issues-11.html"},{"title":"(Wide&Deep) Wide & Deep Learning for Recommender Systems","text":"背景 这是一篇推荐系统相关的论文,场景是谷歌 Play Store 的 App 推荐。文章开头,作者点明推荐系统需要解决的两个能力: memorization 和 generalization。 memorization 指的是学习数据中出现过的组合特征能力。最常使用的算法是 Logistic Regression,简单、粗暴、可解释性强,而且会人工对特征进行交叉,从而提升效果。但是,对于在训练数据中没有出现过的特征就无能为力。 generalization 指的是通过泛化出现过特征从解释新出现特征的能力。常用的是将高维稀疏的特征转换为低维稠密 embedding 向量,然后使用 fm 或 dnn 等算法。与 LR 相比,减少特征工程的投入,而且对没有出现过的组合有较强的解释能力。但是当遇到的用户有非常小众独特的爱好时(对应输入的数据非常稀疏和高秩),模型会过度推荐。 综合前文 ,作者提出一种新的模型 Wide & Deep。 模型 从文章题目中顾名思义,Wide & Deep 是融合 Wide Models 和 Deep Models 得到,下图形象地展示出来。 Wide Component 是由一个常见的广义线性模型:y=wTx+b{y=w^Tx+b}y=wTx+b。其中输入的特征向量 x{x}x 包括两种类型:原始输入特征(raw input features)和组合特征(transformed features)。 常用的组合特征公式如下: ϕk(x)=∏i=1dxicki,cki∈{0,1}{\\phi_k(x)=\\prod_{i=1}^dx_i^{c_{ki}},c_{ki}\\in\\{0,1\\}} ϕk(x)=i=1∏dxicki,cki∈{0,1} cki{c_{ki}}cki 代表对于第k个组合特征是否包含第i个特征。xi{x_i}xi是布尔变量,代表第i个特征是否出现。例如对于组合特征 AND(gender=female, language=en) 当且仅当 x 满足(“gender=female” and “language=en”)时,ϕk(x)=1{\\phi_k(x)=1}ϕk(x)=1。 Deep Component 是一个标准的前馈神经网络,每一个层的形式诸如:a(l+1)=f(W(l)a(l)+b(l)){a^{(l+1)}=f(W^{(l)}a^{(l)} + b^{(l)})}a(l+1)=f(W(l)a(l)+b(l))。对于输入中的 categorical feature 需要先转化成低维稠密的 embedding 向量,再和其他特征一起喂到神经网络中。 对于这种由基础模型组合得到的新模型,常用的训练形式有两种:joint training 和 ensemble。ensemble 指的是,不同的模型单独训练,且不共享信息(比如梯度)。只有在预测时根据不同模型的结果,得到最终的结果。相反,joint training 将不同的模型结果放在同一个损失函数中进行优化。因此,ensmble 要且模型独立预测时就有有些的表现,一般而言模型会比较大。由于 joint training 训练方式的限制,每个模型需要由不同的侧重。对于 Wide&Deep 模型来说,wide 部分只需要处理 Deep 在低阶组合特征学习的不足,所以可以使用简单的结果,最终完美使用 joint traing。 预测时,会将 Wide 和 Deep 的输出加权得到结果。在训练时,使用 logistic loss function 做为损失函数。模型优化时,利用 mini-batch stochastic optimization 将梯度信息传到 Wide 和 Deep 部分。然后,Wide 部分通过 FTRL + L1 优化,Deep 部分通过 AdaGrad 优化。 实验 本篇论文选择的实验场景是谷歌 app 商店的应用推荐,根据用户相关的历史信息,推荐最有可能会下载的 App。 使用的模型如下: 一些细节: 对于出现超过一定次数的 categorical feature,ID 化后放入到模型中。 Continuous real-valued features 通过 cumulative distribution function 归一化到 [0, 1] 区间。 categorical feature 由 32 维 embedding 向量组成,最终的输入到 Deep 部分的向量大概在 1200 维。 每天在前一天 embedding 和模型的基础上进行增量更新。 实验结果: Wide & Deep 模型相对于其他两个模型毫无疑问有提升。但结果中也一个反常的现象:单独使用 Deep 模型离线 AUC 指标比单独使用 Wide 模型差,但是线上对比实验时却有较大的提升。论文中作者用了一句:线下实验中的特征是固定的,线上实验会遇到很多没有出现过的特征组合,Deep 相对于 Wide 有更好的模型泛化能力,所以会有反常现象。由于笔者工作中不关注 AUC,也没有办法继续分析。 总结 作者从推荐系统的的 memorization 和 generalization 入手,设计出新的算法框架。通过线上和线下实验实验,证明 Deep 和 Wide 联合是必须的且有效的。最终也在自己的业务场景带来提升。 Reference Wide & Deep Learning for Recommender Systems - 知乎 详解 Wide & Deep 结构背后的动机 - 知乎","link":"/post/wide-and-deep.html"},{"title":"浙江省第十三届程序设计竞赛总结","text":"周六冒雨前往浙大紫金港校区比赛 最终写了4题 获得铜奖 遗憾","link":"/post/zjp-2016.html"},{"title":"浙江省第十四届程序设计竞赛总结","text":"昨天是我第三次参加浙江省赛,比赛地点依旧设置在浙大。上午和其他人一起坐车过去,然后就是都差不多的流程。 由于一些原因,这一次我的两个队友异乎寻常的厉害(高质量就业:阿里研发工程师+京东算法工程师的组合)。赛前内心毫无波澜,不过周神教导我,作为浙财的五队,我们只要保个铜就可以了。 上午9点25左右,热身赛开始。打开试题册看了一下,我们发现热身赛题目跟去年一样,快速通过A和C题。周神机智的想起去年最后一题(输入一个数对一个非常的大梅森数取模,并判断结果的奇偶性)大数据只有四组,通过一番测试之后,今年也是一样。他写了一个程序直接判小的数据,开始枚举最后四组答案的排列组合。我们大概交了10次左右,就发现枚举的地方出现错误,然后改了一下又重新交,最后枚举到13(1101)的时候过了。本着写完热身赛去吃饭的原则,God王让我们开始写B题。不过仔细想了一下发现,万一写完发现是错的,是去吃饭还是不去吃饭,这是个很大的问题。所以,我们直接前往食堂。 12点15分左右,比赛正式开始。我自告奋勇的从A题开始看,本着看样例猜题意的指导思想,我大胆猜想出写法,趁他们两个不注意直接拿起键盘开始写。由于年纪大了,速度更比不上那些年轻人,所以也写了一会儿,交完之后大概有70只队伍通过。之后God王上来平推了B和D。我看一下C题,发现这是个简单题,把题意告诉老王之后,他也很快做了出来。至此,比赛大概过去45分钟。我们写完全部的签到题,完成保的铜的目标。 三个人继续分头看题目,没过多久他们两个人又开始讨论F题的写,很快也想出一个非常巧妙的方法,不过后来发现这个是超时的,所幸God王又想出了线段树的写法。我和周神开始研究E题的写法,很快也验证了用数位DP的正确性,不过也想到这其中有很多细节要考虑。说到这里,不得不讲一下,我昨天晚上就打印了两页模版,其中一个就是数位DP的模版。God王改完F之后,勇敢提交,直接返回了WA。然后我们三个看了好久代码,都没有找出错误来。God王直接出去逛了一下,我和周神开始写E题。God王发现周神读题目没有讲要输出子树的数量,改之就过了。之后,三个人共同推了E。接下来的时间差不多就是在挣扎了,H题God王写来写去都是超时的,G题周神说要找规律,打印了14页数据开始找没多久,就告诉我想的全部是错的。17点14分59秒,God王最后交了一份H题代码,没有什么奇迹,我们结束了这一次省赛。 晚上,在小剧场举行颁奖,这一个环节最主要的就是听听队名。当本科组银奖没有报到我们的时候,我的内心十分的开心。听到第一批金牌也没有报到我们的时候,周神对我讲了一句,是不是下面没有我们,今天就是冠军。事实证明这是幻想,然后他就高高兴兴的上台领奖了,毕竟昨天晚上特意做了一个发型…… 总的来说,这次省赛比浙大校赛难了很多,所以写完签到题不要错太多的都可以拿铜。中间过度居然拿了一道数位DP和一道线段树,命题人直接高估了浙江省程序设计的教育水平。最后面的几题,我们三个人共享完题意之后,完全没有思路,其他参赛选手也差不多,完全沦为观赏题。后来想一想,这一份题目只是在错误的时间出现,毕竟比赛的覆盖面是final到专科。但是,我感觉这样的比赛,一个人五小时也能做5题,生不逢时,为什么去年没有这么好的命啊。不过还是要感谢两位大佬带我体验了一下省赛获金的感觉。这一次,同场的还有学军和杭二的高中生,颁奖时,有以为领导还感叹大学生不如高中生。殊不知对于这些高中生来说考上浙江大学都是失败。 不知道明年还有没有机会参加。","link":"/post/zjp-2017.html"},{"title":"修复 Github Action 无法构建 Hexo 博客","text":"挺长时间没有通过 Github Action 编译过 Hexo 博客,为了更好搭配Github Publisher使用,今天重新打开 action,运行过程中报了下面几个错误,导致无法产出正常的静态文件。 问题一:Error: Cannot find module ‘@remy/webmention/lib/webmention’ 找不到插件,暂时也没有使用这个插件。直接删除对这个包的依赖。npm uninstall hexo-console-webmention --save 问题二: TypeError: require(…) is not a function 报错: 12345678[7](https://github.com/xiang578/blog-source/actions/runs/8553722187/job/23437478940#step:9:8)Inferno is in development mode.[8](https://github.com/xiang578/blog-source/actions/runs/8553722187/job/23437478940#step:9:9)ERROR Script load failed: themes/icarus/scripts/index.js[9](https://github.com/xiang578/blog-source/actions/runs/8553722187/job/23437478940#step:9:10)TypeError: require(...) is not a function[10](https://github.com/xiang578/blog-source/actions/runs/8553722187/job/23437478940#step:9:11) at /home/runner/work/blog-source/blog-source/themes/icarus/scripts/index.js:2:35 现在使用主题是 hexo-theme-icarus,开发者今天二月份回复 issues 使用源码安装主题报错 · Issue #1270 · ppoffice/hexo-theme-icarus (github.com)指出 hexo-log 4.0含有不兼容的升级。 由于用的是自己 clone 的版本,参考开发者的修复代码 chore: update to hexo 7 · ppoffice/hexo-theme-icarus@b1962d7 (github.com)将整个主题中的 const logger = require('hexo-log')(); 替换成 const createLogger = require('hexo-log');const logger = typeof createLogger === "function" ? createLogger() : createLogger.default();,大约有 11 处。 另外也需要修改主题的 package.json 我直接复制这个链接 hexo-theme-icarus/package.json at b1962d7257c566ea647ac1fd477c5f9df4774ee4 · ppoffice/hexo-theme-icarus (github.com) 里面的内容替换原始文件。 问题三:Error: Cannot find module ‘hexo/lib/plugins/helper/date’ 旧的依赖已经删除,需要把主题代码中 require('hexo/lib/plugins/helper/date'); 改成 require('hexo/dist/plugins/helper/date'); 。 修复上面三个问题,action 又可以正常生成静态网页。用了 Hexo 快 10 年,经常遇到这些糟心的问题,感觉是时候离开了。","link":"/note/fix-github-action-build-error.html"},{"title":"webmention 实现参考","text":"关于博客内实现 webmention 功能相关文章收集 综合 IndieWebify.Me - a guide to getting you on the IndieWeb 逐级引导如何使网站符合 IndieWeb 规范 KRISTOF ZERBE 三篇文章详细介绍 hexo 博客如何支持 Webmention。 Hexo and the IndieWeb - kiko.io 介绍 h-card、h-entry 等 html 标签用法。 发送 response 支持的标签 u-in-replay-to In reply to: <a class="u-in-reply-to" href="https://jacks-blog.com/awesome-work">Jacks Blog: Awesome Work</a> u-link-of Kristof liked <a class="u-like-of" href="https://jacks-blog.com/awesome-work">Jacks Awesome Work at https://jacks-blog.com/awesome-work</a> u-repost-of u-bookmark-of Hexo and the IndieWeb (Sending Webmentions) - kiko.io 向被你提及的网站发送 webmention 消息 webmention.app:打开一直显示 404,服务挂了? 评论区 Mirakelor 提醒网址必须加上 www 解析你博客的 RSS feed,匹配出提及的网址,然后发出 mention Hexo and the IndieWeb (Receiving Webmentions) - kiko.io 使用 webmention.io 接收其他站点发送的 mention 以及如何在博客页面展示。 集成收到的 mention 信息有两种方式: Static hexo 博客生成时写相关的数据到 html 页面中 Dynamic 访问网站时 javascript 实时解析数据展示 IndieWeb, Webmentions | ./kwaa.dev: 藍+85CD 在 Urara 博客系统中实现的过程记录。该博客系统已开源,详见RE:Introducing Urara | ./kwaa.dev Webmention-developer#Sending - IndieWeb indieweb.org 收集的实现 Sending 功能开源项目列表 Refactor your blog comments system with Webmention.io: GeekPlux 使用 twitter + webmention 实现博客评论系统 相关代码参考 site/theme.config.js at main · geekplux/site (github.com) Now, I’m in IndieWeb? - Owen Young’s Blog zola 博客 定期拉取站点全部 mention 信息,生成站点时在 html 页面写入对应的 mention blog/send-webmention.yml at main · theowenyoung/blog · GitHub 解析 rss feed 发送 mention 脚本 评论展示可以参考,如果匹配到作者发的推,用专门的卡片样式呈现 Joining the Webmentions Community: A Beginner’s Guide (eindex.me) 提供基于js 的 send mention 脚本 Webmention - KAIX.IN:介绍为什么要使用 webmention 以及写了个 webmention 接收器,不过没有找到相关代码链接。 发送 Automatically sending Webmentions from a static website - James Mead:解析站点 rss 然后通过 ifttt 发送请求 Telegraph (p3k.io):手动发送链接 kristofzerbe/hexo-console-webmention: Sending webmentions for posts within Hexo (github.com):解析最新 x 篇文章中引用的链接,然后发送到对应的接收服务。下载后,运行报错。 Bridgy 获取 twitter 交互 接收 Webmention.io 公开的接收服务,支持以 html,atom feed,json 等格式获取指定网址的 mention 信息 Webmentions on a static site with GitHub Actions \\ Seb De Deyne (sebastiandedeyne.com):定时拉取 webmention.io 上的 webmention 结果 新增对 Webmention 的支持 | Re:Linked (outv.im):基于 hexo+sass 的博客,提到 self-host 的接收服务 outloudvi/workers-webmention-server: Webmention server on Cloudflare Workers. (github.com) 展示 透過 webmention 來搜集 blog 的社群迴響 (jason-memo.dev) 评论展示形式很美观,值得学习。 拥抱独立网站运动 | M-x Chris-An-Emacser (chriszheng.science):hexo 博客,基于 webmention.js 展示收到的反馈。 PlaidWeb/webmention.js: Client-side library for rendering webmentions from webmention.io (github.com):第三方 js 库 Webmention Demo - IndieWeb Hexo Icarus (whyouare111.github.io) hexo+icarus 主题博客,实现 webmention + mastodon 集成。 修改后主题代码在 whyouare111/hexo-theme-icarus at matataki (github.com)。 提到 About | Seviche.cc 通过标签切换多种评论 评论模块以时间线形式展示 webmention 提醒 回复《webmention 实现参考》 - IndieWeb Hexo Icarus (whyouare111.github.io):webmention.io 提供 mention 的 rss feed,配合 rss 阅读器/IFTTT 等工具可以查看是否收到新的 mention 测试数据 Owen 的「Now, I’m in IndieWeb? 」相关 mention","link":"/note/641ea60f-a31e-4979-9327-c50509c146e3.html"},{"title":"luhmann@discuss.logseq.com","text":"链接:Luhmann’s Logseq Dashboard (notion.site) 介绍 论坛活跃用户,logseq 使用侧重于日常、学术 相关 Three Choices New Users Need to Make - General - Logseq 新用户使用 logseq 的三个选择 First choice: to use a daily journal or not? Second Choice: tags, hierarchy, or page-tags? luhmann 选择,page-tags 中使用层次结构([[多级标签]]) 同一个单词不同语义解决方法:Apple (company) 和 Apple (fruit) Third choice: One graph for everything, or multiple graphs? 总结:My choices are clear: use one graph, use the journal, and use hierarchy in page-tags to organize your pages when necessary. Three power-tools I wish I’d known about when I started using Logseq - Customization / Look what I built - Logseq Templates,在页面中快速添加自定义文本 Aliases Page-tags,用标签替代分类 My Logseq Workflow - Customization / Look what I built - Logseq 阅读笔记类型 Highlights and Annotations,管理从 readwise 导入的笔记,完成整理修改 page state My Reading Notes,论文等笔记,标题中带有 last name date,对应的标签:publication, pub/book, pub/academic, pub/teaching 工作流图","link":"/note/Luhmann_discuss_logseq_com.html"},{"title":"@didi food中的智能补贴实战漫谈","text":"滴滴国际化外卖团队的文章,前几个月做补贴关业务的时候看过。文章链接:https://mp.weixin.qq.com/s/WU1iILMFdH3RZAbJKFU4WA 补贴问题和其他机器学习问题最核心和最关键的不同点是补贴行为需要付出成本,一般用 ROI 来评估增加补贴成本带来的增量指标收益。 智能补贴问题拆解 预估干预 action 相比没有干预带来的增量 建模 [[UPlift Model]] [[Meta Learning]] 主要思想通过一些基模型的组合,去近似你和一个无法被观测到的增量 [[Two Model]] 差分模型,利用两个模型的差值去近似用户的增量 [[Single Model]] 将与干预手段 w 有关的特征加入训练,只建立一个模型。 利用样本特征、label、干预 w 训练一个模型 预测时将特征赋值 w=1 和 w=0 计算用户增量 τ^(x)=μ^(x,W=1)−μ^(x,W=0)\\hat{\\tau}(x)=\\hat{\\mu}(x, W=1)-\\hat{\\mu}(x, W=0)τ^(x)=μ^(x,W=1)−μ^(x,W=0) [[X-Learner]] 利用观察到的样本结果去预估未观察到的样本结果的思想,对增量进行近似,同时还会对结果进行倾向性权重调整,以达到优化近似结果的目的。 [[R-Learner]] 通过 Robinson’s transfomation 定义一个损失函数,然后通过最小化损失函数的方法达到对增量进行建模的目的。 tree-base 通过树模型中节点分类的算法思想,尝试直接对增量建模,预测增量。 主要思路,通过对特征点进行分裂,将X划分到一个又一个subspace中,这与补贴场景下,希望找到某一小部分增量很高的用户的想法几乎是完美重合。 [[Uplift Decision Tree]] 分裂规则 Δgain =Dafter (PT,PC)−Dbefore (PT,PC)\\Delta_{\\text {gain }}=D_{\\text {after }}\\left(P^T, P^C\\right)-D_{\\text {before }}\\left(P^T, P^C\\right)Δgain =Dafter (PT,PC)−Dbefore (PT,PC) [[Contextual Treatment Selection]] 直接最大化每个节点上实验组和对照组之间label期望的差值(可以理解为该节点上样本的Uplift值) [[Uplift Model 评估]] [[Qini curve]] [[AUUC]] 分配策略:存在多种干预 action 和已预估了他们 增量 的情况下,如何为每个用户合理分配 action 以期望达到全局最优 贪心分配 根据运营规则计算每个类别券的可支配数量 用户按计算出的 uplift 值倒排,按可以发放券的数量截断。 同一个用户如果在多个券的 uplift 都比较高,优先发比较低的券 整数规划 参数含义 xi,jx_{i,j}xi,j:是否对用户 i 发 j 券 pi,jp_{i,j}pi,j 增量模型预估用户 i 在 j 券下的增量 ti,jt_{i,j}ti,j 转化率模型预估用户 i 在 j 券下的转化率 优化目标 max(x1,1t1,1+x1,2t1,2+x1,3t1,3+x1,4t1,4+…+xn,1tn,1+xn,2tn,2+xn,3tn,3+xn,4tn,4)\\max \\left(x_{1,1} t_{1,1}+x_{1,2} t_{1,2}+x_{1,3} t_{1,3}+x_{1,4} t_{1,4}+\\ldots+x_{n, 1} t_{n, 1}+x_{n, 2} t_{n, 2}+x_{n, 3} t_{n, 3}+x_{n, 4} t_{n, 4}\\right)max(x1,1t1,1+x1,2t1,2+x1,3t1,3+x1,4t1,4+…+xn,1tn,1+xn,2tn,2+xn,3tn,3+xn,4tn,4) 问题约束 用户只能拿到一张券 {x1,1+x1,2+x1,3+x1,4=1⋯xn,1+xn,2+xn,3+xn,4=1\\left\\{\\begin{array}{l}x_{1,1}+x_{1,2}+x_{1,3}+x_{1,4}=1 \\\\ \\cdots \\\\ x_{n, 1}+x_{n, 2}+x_{n, 3}+x_{n, 4}=1\\end{array}\\right.⎩⎪⎨⎪⎧x1,1+x1,2+x1,3+x1,4=1⋯xn,1+xn,2+xn,3+xn,4=1 {x1,1,x1,2,x1,3,x1,4,…,xn,1,xn,2,xn,3,xn,4}∈{0,1}\\left\\{x_{1,1}, x_{1,2}, x_{1,3}, x_{1,4}, \\ldots, x_{n, 1}, x_{n, 2}, x_{n, 3}, x_{n, 4}\\right\\} \\in\\{0,1\\}{x1,1,x1,2,x1,3,x1,4,…,xn,1,xn,2,xn,3,xn,4}∈{0,1} 总资金约束 x1,1p1,1c1,1+x1,2p1,2c1,2+x1,3p1,3c1,3+x1,4p1,4c1,4+…+xn,1pn,1cn,1+xn,2pn,2cn,2+xn,3pn,3cn,3+xn,4pn,4cn,4≤Bx_{1,1} p_{1,1} c_{1,1}+x_{1,2} p_{1,2} c_{1,2}+x_{1,3} p_{1,3} c_{1,3}+x_{1,4} p_{1,4} c_{1,4}+\\ldots+x_{n, 1} p_{n, 1} c_{n, 1}+x_{n, 2} p_{n, 2} c_{n, 2}+x_{n, 3} p_{n, 3} c_{n, 3}+x_{n, 4} p_{n, 4} c_{n, 4} \\leq Bx1,1p1,1c1,1+x1,2p1,2c1,2+x1,3p1,3c1,3+x1,4p1,4c1,4+…+xn,1pn,1cn,1+xn,2pn,2cn,2+xn,3pn,3cn,3+xn,4pn,4cn,4≤B 实验设计 作者做了两组实验,来分别验证不同业务目标。(相同补贴或者相同单量/GMV 条件下,对比 ROI 才有意义) 相同单量,更少补贴 相同补贴,更多单量 后续规划 整数规划与强化学习理论结合的可能性 当前方法是针对每一次活动求得全局的最优化,实际需要对用户长期价值 [[LTV]] 建模。 问题 如何正确理解线上业务指标 [[ROI]] 如何理解离线指标 [[AUUC]] [[AUC]] 不同范围含义 0.5 随机线 0.6 模型还需要迭代 0.6-0.8 模型上线标准 0.9 模型是否过拟合或是否有未知强相关特征参与模型训练 补贴问题本身就是与实验批次和样本强相关的问题,很难在增量预估模型中建立一套类似 auc 的标准","link":"/note/WU1iILMFdH3RZAbJKFU4WA.html"},{"title":"@从终端到纯文本:我的任务管理简史","text":"链接:从终端到纯文本:我的任务管理简史 | cf020031308.github.io 想法 摘录 番茄工作法:每个任务在两个番茄之内完成 任务格式:计划时间、截止时间、状态、标签、紧急程度 inbox.md Inbox. 收集所有材料。 OKR. 就是 The Objective Keys and Results。每月修订,并保留历史记录。 ^^Don’t Do.^^ 不符合 OKR 的。这些不该做的事如果不记下来的话,每隔一段时间就可能又被你重新想到,然后再经历一遍收集、分析、放弃的浪费时间精力的过程。 Maybe Later. 不能立即开始的任务。 Can do. 这周或下周就可以做的任务。每周我会检查这里(和 Maybe Later),把合适的任务移到 todo.md。","link":"/note/a-brief-history-of-my-task-management.html"},{"title":"@激流时代","text":"从 纪录片:激流时代 - 拾月 (skyue.com) 了解到这部纪录片。腾讯出品,《十三邀》团队制作,李翔主持,共 5 集每集一个主题,从商业角度来观察这个时代。 第1集:直播浪潮 直播带货无疑是这几年最火的话题。第一集记录去年双十一期间,杭州大中小三类主播的故事。节目中也贴心给出本集探讨的问题: (个体命运)底层主播有没有明天? 杭州万象城,大量主播当街直播带货,几部手机一部露营手拉车就是全部家当。 (行业状况)中部主播崛起能带来什么改变? 抖音女主播,小熊出没,靠拼时长和拼熬夜杀出来,还直言「不想输不能挺」。 (深度规则)头部主播能否被复制? 大部分主播都存在算法焦虑,抖音这样的平台注重内容而不人,似乎有可能快速推出一个新人。 遥望科技 CEO 谢如栋在双十一这一天不停在公司旗下主播直播场地来回奔波,每次去到一个新的场地都会看一下对应直播间的数据,然后给直播组长一些建议。感觉他们也是数据驱动? 想不到谢如栋也是浙财信息学院毕业。。。 选品会上谢如栋批评下属选的白牌直播福利品,「你应该让好的品牌去灵活,而不是让那些灵活的垃圾货进来」 (行业状态)电商伴生的信任重建能为中国人带来什么? 价格是护城河,现在看起来直播电商中,商家让利太多给主播个人,不知道什么时候会开始反击? 谢如栋讲到希望能搭建一个直播中台,给不同的主播提供场地和货源。 直播这么火是不是之前的推荐系统算法还不够智能? 创新者的窘境 新行业的赢家不会是旧行业的赢家,所以能找到第二曲线的公司真的好少。 直播不仅是争夺观众的注意力,更是争夺观众的钱包。其实更希望能看一下原来占据注意力和钱包的模式变得怎么样了。 第2集:咖啡之围 这一集是云南咖啡,讲产业升级的困境。最初的云南咖啡是走期货模式,现在希望能做成精品咖啡,获得更高的溢价空间。 期货模式,看起来能更好的标准化,但是做不过其他国家的原因居然是国内的人工成本太高,埃塞尔比亚人工 7 元一天,云南的人工要 100 一天,导致咖啡豆的成本比其他产地要高。而且看起来种植咖啡的工业化程度也不太高,没有那种大片农场的感觉,也没有收割机这样的大型设备。 精品咖啡,供给测标准,有协会有咖啡师给你认定。不过,我总是感觉这些接近于玄学……农作物有一个特点,产地即品牌,云南之前给人的印象是期货咖啡,如果不能形成新的品牌出来,还是很难和其他产地竞争。另外,商业社会残酷的地方在于市场需求就这么大,没有那么多人为这些买单,你就只能当成普通咖啡豆去卖。这么一想,还是当螺丝钉好一些,只要内卷就可以…… 说回咖啡,工作之后偶尔会喝一喝咖啡,不过还是停留在公司内部咖啡厅水平(价格和瑞幸差不多),喝的就是通过咖啡因让自己更加精神。 第3集:消费不息 聚集在长沙,讨论新消费、新体验以及新设计美学。 新的风口自然少不了投资人,这集也采访了峰瑞资本的李丰 超级文和友,注重体验的品牌。最早在[[疯投圈]]上听过,也见过社交平台上发的动不动上万的等位照片。 创始人文宾非常有个性,印象最深的是给李翔介绍狭小的卧室,讲自己不喜欢住大的房子,还特意拉李翔坐下来感受一下房间窗外的风景。 在创始人的心中,超级文和友不是湖南地方精神,而是对应城市的地方精神。可惜深圳和广州的店都没怎么成功。 和其他人一样,你就没有机会存活下来。 商业的本质是利他 提到印度消费品品牌,帕坦加利 茶颜悦色 刚开始还有一点小作坊的感觉,慢慢变得正规。 柠茶 主打标准化,按流程李翔都能制作一杯标准的茶。在这种方式中,人只是一个工具,不知道什么时候会被完全替代? 顶上头 螺蛳粉火锅,创始人自我定位客单价只能做到 50 左右。挺想尝试的。 李翔 商业有意思的地方就在于,它一点都不在乎你是否认同,有人认同愿意付钱就行。 第4集:“宇宙中心” 这集选择地点是上海安福路。和三里屯、太古里这样的网红地点相比较,安福路的社区文化不是商业化公司整体运营形成的。 最初这地方有一个话剧院,负责人喻荣军讲希望做成百老汇模式,观众看完话剧后,可以挑选一些餐厅,然后边吃饭边讨论剧情,然后用话剧院的物业,挑选了一些入住的商业实体。 国内大部分旅游中心是小商品市场,做的是去特色,安福路的文化核心是时间的积累,外面的人很难融入进去。附近的居民也说到,游客走完才是真正的安福路。 这条路上居然还有多抓鱼。前几周有同事问我有什么处理旧书的渠道,给他推荐了多抓鱼,技术书籍回收基本上才几块钱…… 第5集:穿越周期 沙漠里不长虚弱的草,大海里没有无名之辈。 话剧中心 底线是什么 奥迪的广告 车和大众消费品是两个概念,人生安全相关,工业时代产品巅峰之作 大众产品穿越周期之间,边界是什么?质量 冯仑 穿越周期是少数人的事情 变化过程中什么是不变的,这才是你的核心。 认识到[[能力圈]],芒格的不为清单。 李翔 [[塔勒布]] 作家被人记住的是他最好的作品。政治家被人记住的是他最糟糕的决定。而商人几乎不会被记住。 企业家更大影响力,把技术更加大众化,更能带来改变。 总结 在 youtube 上看的,每集都会有一段时间突然没有声音。网上查了一下,可能是因为 bgm 版本问题,所以主动做了消音…… 前 4 集每集一个城市,奇怪的是没有出现北京,这个时代不需要北京吗? 如果我给这个系列选主题,可能会选:直播、咖啡、远程工作、自由职业","link":"/movie/age-of-dynamic.html"},{"title":"mutual influence rnn","text":"论文 Globally Optimized Mutual Influence Aware Ranking in E-Commerce Search 背景 淘宝搜索重排场景,如何生成序列最大化 GMV,vi 是价格 o∗=argmaxo∈O∑i=1Nv(i)p(i∣c(o,i))o^*=\\arg \\max _{o \\in O} \\sum_{i=1}^N v(i) p(i \\mid c(o, i))o∗=argmaxo∈O∑i=1Nv(i)p(i∣c(o,i)) 拆解成两个小问题: 问题一:p(i∣c(o,i))p(i \\mid c(o, i))p(i∣c(o,i)) 估计每个商品在 topk列表中成交的概率 问题二:O∗O^*O∗ 如何找到最优 topk 序列 问题一:通过 RNN 建模前面已选取物品对后面商品成交的影响 通过 global feature 建模 context 信息 原始特征 f 是 local feature,将 f 在候选集合下进行归一化即成为 global feature fg(i)=fl(i)−fminfmax−fmin,fmax=max1≤j≤Nfl(j),fmin=min1≤j≤Nfl(j)f_g(i) =\\frac{f_l(i)-f_{\\min }}{f_{\\max }-f_{\\min }}, f_{\\max } =\\max _{1 \\leq j \\leq N} f_l(j), f_{\\min } =\\min _{1 \\leq j \\leq N} f_l(j)fg(i)=fmax−fminfl(i)−fmin,fmax=max1≤j≤Nfl(j),fmin=min1≤j≤Nfl(j) 通过 RNN 预估 p p(oi∣o1,…,i−1)=sigmoid(Whhi+Wcci)hi=RNN(hi−1,f(oi))ci=∑j=1i−1αijhj\\begin{aligned} p\\left(o_i \\mid o_{1, \\ldots, i-1}\\right) & =\\operatorname{sigmoid}\\left(W_h h_i+W_c c_i\\right) \\\\ h_i & =\\operatorname{RNN}\\left(h_{i-1}, f\\left(o_i\\right)\\right) \\\\ c_i & =\\sum_{j=1}^{i-1} \\alpha_{i j} h_j\\end{aligned}p(oi∣o1,…,i−1)hici=sigmoid(Whhi+Wcci)=RNN(hi−1,f(oi))=j=1∑i−1αijhj 问题二:RNN + Beam Search 生成序列","link":"/note/alibaba_mirnn.html"},{"title":"@2024年中小结:清晰地生活","text":"链接:2024年中小结:清晰地生活_哔哩哔哩_bilibili 想法 记录已经足够的情况,为什么写不出总结?没有目标规划,先有目标后有总结。 每一个月一个主题词的形式,和日本年度汉字挺像的。 摘录 不足 1、没有设定月度目标 年度实现什么、月度实现什么 2、记录、总结不够 通过总结和记录,形成对生活更清晰的认知。 3、时间要更好利用 小经验: 1、给每个月选一个主题词,一年形成 12 个主题词。 2、用微小的改变来推进计划 3、生活的小心思,用相框展示自己拍的照片 4、日常关注健康 提出的问题: 1、什么是重要的? 个人健康 2、时间为什么很少/很紧张? 心态问题,慢下来 认真去节约时间,去获得闲暇时间。时间都消耗在哪里? 月度总结自己思考的问题","link":"/note/bb_BV12W421R7dh.html"},{"title":"@吴心越:大家不约而同用“度死日”来形容他们在养老院里的生活","text":"台湾东海大学社会学博士,江苏某家养老院田野调查。链接:【一席】吴心越:大家不约而同用“度死日”来形容他们在养老院里的生活_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili 想法 摘录 养老院从社会性的福利机构转变到商业机构 老年人的自由:独立出入,区域限制 看管和保护模式:老人身体安全为原则 衣来伸手,饭来张口 吃完早饭吃晚饭 [[度死日]]:没有期盼,没有目标 没有其他娱乐活 倒转的家长式作风和权威性保护 老人的内心感受,他们自己想要过一种什么样的生活? 家人的探望 女儿用具体而微的方式来表达孝心 儿子不太善于这种表达 孝道的市场转包 护理员:农村中老年妇女,城市下岗女工 月薪比月嫂和低,没有面子 传统中照顾他人的工作,社会地位低 家属和老人可能没有尊重 考核标准:干净和没有味道 清洁:人和环境 抱起老人,肌肉拉伤 腰部扭伤 认命:社会需求打,但是招工难 老人照顾老人 社会意义肮脏和现实意义肮脏 负面情绪发泄到老人身上 自我价值感和来自社会的肯定和尊重 没有同情和关爱,言语上抱怨表达不满 性别的麻烦,道德上的肮脏 标准化劳动 骚扰 照顾失智的老人:疾病现象 老龄化增加 民营养老院处于经济接受 1 个人对应 5 到 6 个老人 束缚工具 伦理问题:失去理智的思维能力,失去语言的沟通能力,失去做为完整的人的权力。这种限制和剥夺的界限在哪里,会不会演变成一种暴力跟伤害。 服用安眠药 照顾即可能是一种为善的手段,但它同时也蕴含了 暴力跟伤害的可能,尤其当我们不再把被照顾者当成是一个真正的人。 良善的照顾不能仅寄希望与个人的道德品质或者专业素养,它一定嵌入在更广泛的社会环境中,也反映了^整个社会的价值观念和情感结构^。 老年人的主体性,照顾劳动的价值,国家如何分配资源,对于个人和机构又能提供多少社会支持 一个怎样的社会才能培养共情和关爱。","link":"/note/bb_BV1MQ4y1K7Tz.html"},{"title":"@onenote 嵌套表格","text":"链接:思维导图?OneNote?我怕不是用了个假的?!医学生笔记经验分享_哔哩哔哩_bilibili 想法 挺喜欢 OneNote 的,但它给的人的感觉是太自由,一自由写的东西就乱了。UP 主用嵌套表格来做笔记,刚好对 OneNote 进行约束。另外,up 主在其他视频中还提到过,大学里面多人分工整理不同学科的笔记,真是未曾拥有的青春。 摘录 技巧 win 版本 onenote 可以指定页面大小为 A4,方便之后打印 表格中插入表格 按 Tab 然后输入文字会自动形成表格 使用不同方式制作导图对比的例子 大纲式思维导图,如果分级多,不容易看清楚。 logseq 利用标题级别,从视觉上切割屏幕,提升阅读体验 {:height 388, :width 805} 一些例子 内分泌 不同颜色背景","link":"/note/bi_BV1zi4y1u7Z5.html"},{"title":"博客折腾记 2024","text":"记录 2024 年折腾博客的过程。 修改主页 和大部分主题一样,[[hexo-theme-icarus]] 默认的主页是按时间顺序排列的历史文章摘要。尝试修改成手动维护的总览。 参考 Hexo+Next(6)修改主页 实现 source 文件夹下创建 index.md 文章 修改站点配置 _config.yml,把 index_generator.path 修改成其他值,比如 path: '/blog_raw_index/'。然后只有在访问 localhost:4000/blog_raw_index/ 才会出现旧主页。","link":"/note/blog_fix_2024.html"},{"title":"eta 技术参考","text":"持续整理中 滴滴 [[@Learning to Estimate the Travel Time]] 2018 年KDD,Wide & Deep & RNN 个人笔记:(WDR) Learning to Estimate the Travel Time - 算法花园 [[@Multi-task Representation Learning for Travel Time Estimation]] 多任务框架,预估行程时间和行程距离 [[@HetETA: Heterogeneous Information Network Embedding for Estimating Time of Arrival]] 图卷积应用在 ETA 和路况预测任务 [[CompactETA]] link 表达 + mlp [[@Interpreting Trajectories from Multiple Views: A Hierarchical Self-Attention Network for Estimating the Time of Arrival]] 和华南理工合作论文,2022 年KDD。 个人笔记:【滴滴 HierETA】Interpreting Trajectories from Multiple Views A Hierarchical Self-Attention Network for Estimating the Time of Arrival - 算法花园 (xiang578.com) Dynamic Heterogeneous Graph Neural Network for Real-time Event Prediction 使用异质图神经网络进行实时事件预测 Dynamic Heterogeneous Graph Neural Network for Real-time Event Prediction (KDD 2020) - 知乎 (zhihu.com) 百度 [[@ConSTGAT: Contextual Spatial-Temporal Graph Attention Network for Travel Time Estimation at Baidu Maps]] 时空图注意力网络 工业解密:百度地图背后的路线时长预估模型! [[@SSML: Self-Supervised Meta-Learner for En Route Travel Time Estimation at Baidu Maps]] [[@DuETA: Traffic Congestion Propagation Pattern Modeling via Efficient Graph Learning for ETA Prediction at Baidu Maps]] [[@DuTraffic: Live Traffic Condition Prediction with Trajectory Data and Street Views at Baidu Maps]] 高德 走近高德驾车ETA(预估到达时间) (qq.com) 概念 SP(Speed Profile):同一特征日相同时间区间的历史平均速度,按 10min 聚合。例如每周一早上 9:00-9:10,某个 link 上所有轨迹,可以将过去几周聚合求一个平均速度,这个平均速度可以代表对这个 link 在未来周一早上 9:00-9:10 这个时间区间内通行速度的静态预测。 AutoLR(Autonavi Location Reference):实时路况 link 通行耗时真值:在一个 5min 的时间窗口内进入某一 link 的所有轨迹,在完成去噪后求取平均值,即得到该 link 在该 5min 窗口内的通行耗时真值。 框架 真值生产 将各个 link 上 5min 窗口的实走轨迹聚合求平均通行时间,得到 link 通行耗时真值。 给定 trace 推算通行耗时真值 link 场景化预测:根据历史真值将 link 归为不同类别 不堵 link 直接用静态 sp link 级别预测 静态 sp,预测时间跨度可达未来一周 线性模型,通过实时信息 autolr 和历史信息 sp 来拟合 link 级真值 精准预测,模型预测 trace 级别预测 准点率预测,给出 trace 级别预测结果的可信度 路线 link 每 5 分钟推演,使用对应时间片的预测结果。超过 1 小时用历史。最后累加得到整条路线 eta。 效果评测层面 对问题 link 的 eta 进行自动干预,人工干预 精准预测 每分钟将 link 级多时间跨度预测值写入缓存,预测是有精准预测值的情况下将有限使用精准预测结果 1小时内有实时路况,使用线性模型预测 eta 预测难点 未来流量,让深度模型提前感知拥堵的到来 对导航路线进行时间推演,得到未来时间的位置。 [[H-STGCN]] 用域转换器整合异质模态的交通流量特征,设计了复合邻接矩阵使得图卷积层能够更好地捕捉路段间的接近性。 效果评估 link 评估 bad link 定义 link eta 和 link ata 的 ape 大于 0.3 MSE=∑i=1n∑j=1k(linki,etaj−linki,ataj)2n∗kMSE= \\frac{\\sum_{i=1}^n \\sum_{j=1}^k (link_{i,eta}^j - link_{i, ata}^j)^2}{n * k}MSE=n∗k∑i=1n∑j=1k(linki,etaj−linki,ataj)2 trace 评估 trace 的 ata 和 eta 对比 [[@Hybrid Spatio-Temporal Graph Convolutional Network: Improving Traffic Prediction with Navigation Data]] id:: 63f271b5-aa49-4212-a7c8-507109aefab5 预测流量 DARTS [[STGCN]] 高德KDD2020论文解读|混合时空图卷积网络:更精准的时空预测模型 (qq.com) 混合时空图卷积网络:能“推导”未来路况的智能算法 (qq.com) 深度学习在高德驾车导航历史速度预测中的探索与实践 (qq.com) 使用历史平均值法预测历史速度的缺点 对于异常点敏感 无法利用时域序列的演化趋势(trend)信息 无法利用去年同期的车辆行驶规律 [[TCN]] 特点 存在因果关系,未来到过去不会存在信息泄漏 可以将任意长度的序列映射到固定长度的序列 利用残差模块和空洞卷积来建构长期依赖关欻 目标:构建一个基于历史信息(某时间段 & 去年同期:同一段道路、确定特征日、确定时间批次)和道路属性来预测未来一周历史速度的机器学习模 网络架构 AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…-阿里云开发者社区 (aliyun.com) 路径规划 多目标平衡,如何在“帕累托最优”的情况下,进行多个目标之间的取舍、平衡。通过带约束的最优化问题来进行建模,保证其他指标不变差的情况下,把某个指标最优化。 偏置网络,解决陌生场景对导航依赖很重,很难决策哪条路线更好,导致首推路线选择率高。 优化的主要目标是实走覆盖率。 用户偏置网络,把路线排序的顺序,以及引导路线之间的相似度信息输入进去,期望尽可能消除掉偏置带来的影响。 TDR 求路算法提供随时间推演的能力。比如 8:00 从起点出发,后面要走 1 2 3 …n 条路到达目的地,假设 8:10 走到第 2 条道路,8:20 走到第 3 条道路,那么我们在 8:00 计算 Shortcuts 的时候,就不能只用到 8:00 的路况,需要把后续进入某个道路的时刻考虑进来,用那个时刻的路况来计算 交通事件抽取-对比知识蒸馏模型 LRC-BERT AAAI2021 饿了么 [[@Order Fulfillment Cycle Time Estimation for On-Demand Food Delivery]] 美团 [[深度学习在美团配送ETA预估中的探索与实践]]:提到挺多 eta 相同的算法和工程细节问题,值得仔细读一读。 [[@A Deep Learning Method for Route and Time Prediction in Food Delivery Service]] Google [[@ETA Prediction with Graph Neural Networks in Google Maps]] [[@BusTr: Predicting Bus Travel Times from Real-Time Traffic]] Uber [[@DeeprETA: An ETA Post-processing System at Scale]] 个人笔记:【Uber ETA】DeeprETA An ETA Post-processing System at Scale - 算法花园 (xiang578.com) How Uber Predicts Arrival Times - Xinyu Hu and Olcay Cirit | Stanford MLSys #64 - YouTube:从两个方面介绍他们的 ETA 系统:how we make it faster 以及 how we make it general(loss 和 calibration) DeepETA: How Uber Predicts Arrival Times Using Deep Learning | Uber Blog Day 17 Uber 要如何估計司機和外送的抵達時間?(上)- Self attention 介紹:简单讲了 self-attention 的计算过程 Day 18 Uber 要如何估計司機和外送的抵達時間?(下)- DeeprETANet geospatial features geohashing 转成 string 用 multiple feature hashing 转成 index","link":"/note/eta-ref-list.html"},{"title":"@reading better: retaining and applying what you read","text":"链接:url:: Reading Better: Retaining and Applying What You Read (fs.blog) 想法 提供一种主题阅读方法 [[The Blank Sheet]],通过自己记录的内容来衡量阅读前后的变化。原文用的是手绘思维导图,其实随便找一个纯文本软件都可以做到。 相关实践可以看 [[Minja]] 的 @卡片笔记实践篇:怎么做笔记,才能避免读书过眼不过脑、@稍后一周再读:一种明智的阅读策略 摘录 [[The Blank Sheet]] Before you start reading a new book, take out a blank sheet of paper. Write down what you know about the book / subject you’re about to read — a mind map if you will. After you finish a reading session, spend a few minutes adding to the map with a different color. Before you start your next reading session, review the page. When you’re done reading, put these ‘blank sheets’ into a binder that you periodically review. 认知地图 阅读前,在一张纸上记录关于这本书/这个主题你所有知道的知识。 阅读中,不停在纸上添加新了解的知识。 阅读后,定期回顾这张纸。 从其他人的知识结构发展到你的知识结构。 example","link":"/note/fs_reading.html"},{"title":"@好读书,不求甚解","text":"链接:马平:好读书 不求甚解 (guancha.cn) 想法 可惜已经大学毕业,没有机会让我一天读一本书,高强度读上一千本书。 如何建立一个世界模型? 人类行为背后的原理 人类生存环境感性模型,人在宇宙中的定位 天体数字感性模型,天数数字转化成自己能理解的数字 地理的尺度,人类世界很难超过一立方公里。 推测自己能看到什么 历史大趋势 时间感性模型 经济基础和上层建筑的互动 用世界模型去理解当代的信息 马克思主义是唯物主义的逻辑系统,而不是信仰。 摘录 读书当学诸葛亮 我不求逐字逐句,只求看个大概,再加上我读书快一点,逃课率高一些,一天读一本书其实不算难,我还有空每天踢球打游戏呢。 造纸术带来的信息爆炸改变了两个事实。一个是书籍总量爆炸性增长,一个是书籍便宜了,普通人买一本、借一本,最不济抄一本也很容易弄到书。 纸质书普及之前,人真的有可能看完当时全部的书。 给外星人当导游 我来之前看了我自己的讲座海报,上面写的很清楚:“无法对各位做出人生指导,也没能力帮各位设计职业规划,只想分享一下个人读书的喜好”。所以,今天来听我聊读书的各位,应该也没打算听我说怎么当副局级干部,也不是来听专业课的,而是像诸葛亮那样,打算通过阅读来全面了解这个世界,在自己的脑子里建立一个世界模型。 诸葛亮用这个模型可以去管理国家,我们至少可以满足自己的好奇心。接下来我就聊聊我在这方面读书的经验。 如何用一系列的书籍来了解世界?人类学、天文、地理、历史。 [[人类学]] 要认识人类自身,必须做到两个前提: 一是脱出日常生活,从俯瞰的角度分析人类活动, 二是观察各种环境中的人类生活模式,总结共性,分析差异。 人类学,是从生物和文化的角度对人类进行全面研究的学科群,人类学研究不同环境下的人类。 包括考古,去挖古代遗址和古人类的骨头; 包括研究各个民族的宗教和巫术,看看为什么各地的信仰如此相似又为啥有那么多不同; 甚至现代城市里大家怎么上班,怎么娱乐,怎么相亲,也是人类学的研究对象。 人类学案例:研究人们从原始部落进入现代社会的反应 从原始社会到现在过去一万年,但是地球上任何两个民族都可以直接通婚,不存在基因障碍。石器时代祖先的基因不仅决定我们的身体,还决定我们的思考方式,研究石器时代的部落生活,可以解释今天我们的行为。 肉食、甜食和坚果 部落集体打猎,对应现代社会基层组织的单位基本都是10多个人,体育运动团队人数(足球、橄榄球等等) 原始女性采集对应现代女性逛街 足球和逛街的例子,说明人类的行为并不神秘,完全可以像研究动物行为那样归纳总结。读人类学,让我们在认识中摆正人类的位置。既不用宗教神秘主义去解释人类的行为,也不会两手一伸,说人类行为完全没有规律,没法预测。 [[@裸猿]] 第一本就是《裸猿》,非常精确了描述了人类学家眼中的人类,就是没有毛的一种猿猴,从生物学和进化的角度来定位我们人类,讨论人类各种行为的原因。 第二本是《人类动物园》,讨论了把这么多没毛的猴子扔到现代都市的水泥丛林里,我们会做什么反应。足球其实就是男人远离能打猎的草原之后,做出的一种补偿动作。 第三本是《亲密行为》,讨论人类作为一种智能生物,怎么表达彼此的好感。 通过 [[天文学]] 理解天文数字的概念 在大家的直观感受里,中国现在的空间站,天宫一号的轨道离地面近,还是上海到徐州近? 天宫一号距地面三四百公里,比南京远点,肯定比徐州近的多,从我们头顶上飞过的时候,差不多和合肥离我们一样远。 天宫一号飞行飞行高度为什么选择三四百公里? 避开人类日常生活环境 大气层边缘约 40 公里,飞行高度是十倍这个距离,需要避开更稀薄的大气层。 天体数字模型 地球(直径12,742 公里)缩小成一个一米大小的地球仪 人类生存极限在 10 公里左右,加起来是20 公里,在模型中接近于 2 毫米 天宫一号在距离地面几厘米的地方飞 同步卫星在三米外 月球距离地球 30 多米,相当于篮球场的长度,大小比篮球略大 太阳是 15 公里外一个 100 多米大的球,相当于虹桥机场看人民广场的上海市政府大楼 海王星在 500 公里外的太阳系边缘,是 5 米大的球,徐州到上海的距离 最近的恒星(4 光年),距离我们 400 万公里 数字模型的意义,理解教科书上所的天文单位的概念。在太阳系里面找地球生物圈,像在一个省那么大的范围内找一个一米大的玻璃球。 科普书籍 推荐一本毛泽东喜欢读的天文科普书《大众天文学》,1973年法国总统访华,毛泽东还专门问这个作者的情况。 美国人尼尔.德格拉斯.泰森写的《万物起源》和卡尔萨根的一系列书籍都不错。 地理的尺度,地理学和地质学 立方公里的理解,衡量河流的流量,冰川和岩层的规模。 一立方公里等于十亿立方米 70 亿人类如何把中间的缝隙去除,最多就是 0.7 立方公里 这个单位实际上就是70亿人类合力改造地球能力的极限数量级。 三峡工程是作为千年工程设计的,物理尺度只有一两亿立方米,也就是0.1-0.2立方公里。 京杭大运河挖了两千年,算上现代疏浚成果,不过是几立方公里的土方量。 全世界每年上千万矿工,几百万台机械,日夜不停的挖矿石,一年能挖多少矿石呢?才4立方公里。这还亏得我们有许多露天矿,沿着地面挖就能挖到矿石。 这些所有的工程成果堆起来只能算个中等山头,倒下去填不平一个普通的山谷。 考虑人类世界的事情,不要随便超过这个单位。 测量距离大于 300 米,需要考虑地球弧度对高程的影响。人类肉眼可以看到地球和平面的偏差。 有一本比尔·布莱森的《万物简史》不错,但更重要的是自己常备几套精美直观的地图册,买一个比较详细的地球仪。 我建议大家出门的时候,不要查一下路线,就完全听手机导航的,怎么说怎么走。 最好提前看一下自己要去地方的地形图和卫星图,推测一下自己能看到什么。 回来以后再看看地图,看看自己为什么会看到那些东西。这是我坐火车和坐飞机时候的最大乐趣之一。 如果你按照导航的路线,走到哪里就看看,实际上你只走了一条线,是一维生物。 你能对沿途地理学有所理解的话,你至少是二维生物。 我们作为一种三维生物,被地球引力限制在二维球面上,已经是个很郁闷的事情了,千万不要因为地理学知识的缺乏,把自己限制到手机导航软件里,变成一维生物。 历史学 时间感性认识,一世纪是三代人,1000 年是 30 代人 孔子出生于 [[-551]] 年,距现在 2500 多年,79 代后裔孔垂长。相当于一代人是 三十多年。 人类文明史一万年左右,相当于 300 多代的差距 建立理想化历史模型再研究具体案例 经济基础和上层建筑的互动 人类各种制度,包括政治制度,包括宗教,包括所有的文化模式,甚至包括吃甜的多还是吃咸的多,穿衣服能不能露小腿,女人要不要带头巾,都是上层建筑的一部分。 这些生活方式之间不断的在竞争,争夺支持者。 但是呢,他们之间的竞争最终不是靠软实力来对抗的,两个宗教抢信徒,从长期来看,是要看经济基础的。 [[伊斯兰教]]发展最快的派系:[[瓦哈比派]],原因是沙特王室的国教,有钱传教 历史,18 世纪出现 道德,土匪行为 虔诚,摧毁穆罕穆德的墓地,刨了伊斯兰教的祖坟 历史上各种文化宗教和社会制度能在竞争中胜利,不是某某制度更好,更美,更有诱惑力,而是有经济基础。 历史的主流趋势是生产力水平高的才有钱,才有强大的军队和政治影响力。 如果某种社会制度从长期来看不促进强大的生产力,不创造更多的物质财富,那迟早会被其他的制度吞并,或是被逼着改革。 [[周朝]] 贵族社会,贵族武士的后代住在城里,叫国人,负责打仗,负责当官,负责搞学术,其他的人叫野人,在城外种地。这符合青铜时代的生产力水平。 等到战国时期,铁器普及了,农民不需要城里人也能获得金属工具,能打仗也能开垦新的土地,原来的统治制度就不合适了,需要变法。哪个国家能先消灭国人和野人的区别,调动所有人的积极性去占领新的土地,开垦新的土地,哪个国家就占优势。不愿意改变的国家就被干掉,当了别人的踏脚石。在这个过程中,哪个国家取得胜利并不重要,也不是历史大势,历史大势是新的制度一定胜利。你这个国家不愿意主动接受,就会被别人吞并之后被动接受 [[沙特阿拉伯]] 能发展不是他们符合生产力的发展,而是冷战后期大国对抗夹缝中的特殊情况。 历史大趋势偶尔会倒流,很少会倒流太久。 牛津版科学史,了解生产力发展的脉络。 还有些偶然因素纯粹和自然界有关。 比如说沙特的石油,本身就是个偶然因素。 贾雷德·戴蒙德 有一本[[@枪炮、病菌与钢铁]],就举了好多类似的例子。 比如说,为什么欧亚大陆的文明要比美洲大陆的文明发达? 他论证,说欧亚大陆的主要轴线是东西方向的,美洲大陆的主要轴线是南北方向的。 地球上的气候带主要和纬度有关系,受南北方向的影响大。 所以美洲大陆的农业文明没法沿着大陆的主要轴线传播,亚欧大陆的农业文明技术进步可以很方便地沿着大陆主要轴线传播。 所以是欧亚大陆的哥伦布去发现美洲的印第安人,而不是印第安人开着船,拿着火枪来屠杀欧亚大陆的原始人。 读通史 《泰晤士历史地图册》、谭其骧《中国历史地理地图册》 斯塔夫里阿诺斯的《世界通史》、汤因比的《历史研究》、《人类与大地母亲》最近刚出的那套《世界:一部历史》也可以作为入门读物。 国内的通史,我建议找一套解放后的和一套解放前的对照看,比如白寿彝的《中国通史》和咱们华东师大吕思勉的《中国通史》放到一起。 然后再读分段的史书,而且最好也是全球史,比如说刚刚去世的霍布斯鲍姆写的十九世纪三部曲。 用代当单位,画年表 看看各个历史人物和各个王朝都是哪一“代”的,你心里差不多就有一个历史框架了。 再进一步可以找一张空白世界地图,自己选择几个典型年代,把国家和重大事件画在上面。画几张,心里就有一套简史了。 读其他历史书籍,把这些把具体的段落挂到原有的框架下,你学到的所有历史知识就能成为一体,要用的时候可以一起发挥作用。 了解当代 整理人文方面知识:先了解自己,了解周围的环境,再了解人类社会都做过什么。这等于在时间、空间、历史渊源和生物本性几方面给自己定位。定了位置,我们才知道自己的视角,才能确定自己看到的现实。 社科院政治学所所长房宁评价过民国那些大师。 他们出生在一个大转折的年代,是一个汉语都彻底变化的年代。 他们一方面掌握了许多中国历史的旧资料,另一方面引入了西方许多分析方法、研究方法,比如马克思的理论。 他们是新人读旧书,拥有最好的研究机会。 只要拿西方的方法去研究过去的资料,就是开创性的大师,因为没人这么做过。 今天的学问还能这么做吗?显然不能了。 当代社会问题相当于中国几千年的历史知识之和。 @马前卒谈如何选择新闻 如何了解现在的社会 建立模型,用有意义的资料完善自己的模型 如果每天有空,不妨看看新闻联播,读读人民日报。过滤无效信息,保留有效信息。 尤其是看新闻联播后20分钟的东西,看人民日报前面八股社论之后的内容。里面会谈到许多数据的变动,许多社会细节在大范围内的渐变,对你构建自己的社会模型很有帮助。 理工科硬件 即便我们只想从社会科学的角度去考虑问题,也必须有最基本的自然科学背景,有基本的工程技术概念。 基础科学方面的科普书。 湖南科学技术出版社出了几个系列的《第一推动丛书》,算是很好的科普书。 还有写科幻小说的那个阿西莫夫,也写了很多的科普书籍。虽然有点旧了,但大多数还是值得一读。 乔治·伽莫夫写的《从一到无穷大》, 柯朗 H·罗宾写的《什么是数学》都是很不错的书 最近有一本书叫《信息简史》,詹姆斯·格雷克写的,也推荐大家翻一翻。 经济学可以读萨缪尔森,也可以读曼昆。 生物学呢,我完全不知道该读什么 了解一门使用工程技术,看一个工程实例。 工程是在各个指标之前妥协 读点马克思 这是因为我是来分享经验的,基于客观事实的东西对大家都一样,才能分享,而哲学和信仰,在很大程度上受个人的主观判断影响,就算分享了别人也很难用上。 [[马克思主义]] 不是信仰,是一套基于唯物主义的逻辑系统,是思考方式,是加工知识原料的一种模式。 我前面谈到历史的时候,用的就是标准的马克思主义唯物主义历史观。 我给自己搭建的全套人文知识体系,基本结构就是从马克思主义的世界观照搬的。 以外星人的视角来观测人类和人类社会,这个视角也是从马克思那里学的。 就是读点马克思,读点马克思列宁毛泽东的原著。 为什么不推荐从马克思开始阅读? 马克思和当代人有 150 年的差,马克思思的那一年全世界人口等于中国人口。 马克思基于19世纪的现实和科学搭建了自己的理论体系。这个体系既包括逻辑和原则,也包括细节和很多具体结论。 如果对历史学和经济学没有初步认识,直接读马克思,很难区分那些理性原则和具体结论,很有可能是全盘接受,改也改不掉,也可能是发现错误之后全面排斥,产生逆反心理。 其实现在主流的马克思主义宣传就是起到了这种恶劣作用。马克思主义的原则本来很简明,逻辑非常清晰。但自从被苏联中国捧为官方信仰,这东西就成了神学。不仅基本原则不能讨论,具体细节也不能讨论。甚至连创始人的个人经历都不能讨论。 没有介绍一生的电影,只能从具体时间里出现他们的伟大形象,把科学变成神学,神是不能描画的。 不求甚解是时代精神 可以不背书,但是要知道这本书大概在讲什么。 信息时代读书要多,要学会泛读。","link":"/note/gc_2014_05_16_230232.html"},{"title":"@马前卒谈如何选择新闻","text":"链接:马平:好读书 不求甚解 (guancha.cn) 想法 摘录 你要想知道什么是新闻,首先要知道什么不是新闻。 所谓不是新闻,就是事物的常态。 你要知道这个城市、这个社会,这个国家,乃至这个地球正常情况下是怎么运转的。 然后你看到一则原始报道,你用这个报导里面的事件,和你大脑中那个普通状态做对比, 如果有明显差异,这就是新闻; 如果你能解释这个差异的原因,这就是新闻评论; 如果你意识到这个原因背后还有故事,跑到事发地去采访,找到真正的原因,这就是读者爱看的深入报道。 但如果你不知道事物的普通状态,那么你无非就是两种情况,看啥都新鲜,看啥都是新闻,要么是看啥都不是新闻,看不懂。 最关键的问题就是脑袋里对这个社会有个一般状态的模型。 如何构造模型 首先,你要知道这个社会是怎么构成的,缺了什么就不能运转,比如说政府各个部门都是干啥的。 其次,你必须了解各部分占用各种资源的比例。 比如说某个机构消耗的财政数字,某个单位占用的人力,某个行业消耗的能源。 因为不谈成本的好处都是耍流氓,我们知道警察多了犯罪会少,但我们不能让所有人当警察。 我们都知道环保做好了,生活环境会变好,但不能因为环保停掉所有的工业。 所有事情都有个度,限制这个度的就是它消耗的成本。 到最后,我们心里应该有这样的模型,一个平均值的模型。 中国有两三千个县级单位, 平均每个县区有多少人口? 有多少的GDP? 有多少个中学? 有多少个公务员,应该有多少工厂,多少税收? 修多少公路? 每年消耗多少能源? 这些指标我们应该有个粗略的数字,还要知道这些数字的发展趋势和相对比例。 判断每天接触到的消息,哪些在原有模型出现,哪些消息不能融入到你这个平均模型,什么问题导致和你想得不一样?","link":"/note/gc_2014_05_16_230232_2.html"},{"title":"hexo 博客图片 webp 优化","text":"近期打算写一些游记,一看手机拍的照片大小都在 5Mb 以上,所以想着研究一下图片优化方法。主要了解了Imgbot 和 Webp 两种方法,最后选择通过腾讯云来优化图片。 Imgbot 从这篇文章了解到 使用 ImgBot 无损压缩博客中的图片 – Mogeko’s Blog,大概用法是将 Imgbot App 添加到 Github 指定的库内,它会递归遍历所有的图片,然后再发起一个 pull request 用压缩后的图片替换原始图片。如下图所示: 看起来挺方便的一个工具,不过可惜的是只有 public 库可以免费使用,最低付费价格 79 刀一个月。。。另外建了一个测试库,1 个小时过去也没给我压缩好。。。 Webp Webp 最早从木子博文 让图片飞起来 oh-my-webp.sh ! | Reimu’s blog (k8s.li) 里了解,是一种为网页而生的图像格式。很香,但需要自己自建服务器进行一系列的操作。 不过这次又找到一篇新的文章 个人博客访问速度优化:CDN, 图片压缩, HTTP2 (selfboot.cn),selfboot 通过腾讯云将图床上的文件处理成不同大小的 webp 图片,hexo 生成 html 时用新的图片链接替换原始图片链接,最后实现不同尺寸的设备能加载不同图片,更进一步优化图片访问体验。 图片格式优化 一直以来使用腾讯云的图床托管图片,链接类似于 https://blog.xiang578.com/assets/image_1718352560106_0.png。腾讯云提供在图片链接添加不同后缀返回不同方式处理后的图片的功能,比如 https://blog.xiang578.com/assets/image_1718352560106_0.png/webp 会返回根据用户定义 webp 规则处理的图片。 从 数据万象CI购买_数据万象CI选购 - 腾讯云 (tencent.com) 看,基础图片处理价格起步是25 元 1 年 1 TB ,也不是很贵。 图片处理 用户规则在桶的 规则管理 - 数据处理 - 图片处理 - 图片处理样式里指定 selfboot 定义了 4 种规则(原始/1600/800/400 等不同大小的 web,直接 copy 人家的方案。 12345styleName: webp, styleBody: imageMogr2/format/webp/interlace/1styleName: webp1600, styleBody: imageMogr2/thumbnail/1600x>/format/webp/interlace/0styleName: webp400, styleBody: imageMogr2/thumbnail/400x>/format/webp/interlace/0styleName: webp800, styleBody: imageMogr2/thumbnail/800x>/format/webp/interlace/0 压缩效果 随便找了一张图片,用规则 imageMogr2/format/webp/interlace/1 直接把图片从 2.63 mb 压缩到 161 kb。。。 自适应图片 完成压缩配置后,不可能手动将原来的所有图片链接都添加上相关的后缀。所以 selfboot 提供一个脚本,实现 hexo 渲染 html 时替换图片链接以及增加 scrset、sizes 等属性。 在 hexo 项目根目录创建文件 scripts/img.js,具体代码如下。不过要注意一点,const imgPath = path.join(__dirname, "../images", imgPathPart) 中的 "../images" 需要改成你的图片文件地址。比如我的图片放在根目录下的 source/assets 就改成"../source/assets"。 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950const cheerio = require("cheerio");const path = require("path");const imageSize = require("image-size");const url = require("url");const fs = require("fs");hexo.extend.filter.register("after_render:html", function (str, data) { const $ = cheerio.load(str); $("img").each(function () { const img = $(this); const src = img.attr("src"); if ( src && (src.endsWith(".png") || src.endsWith(".jpeg") || src.endsWith(".jpg") || src.endsWith(".gif") || src.endsWith(".webp")) ) { const parsedUrl = url.parse(src); const imgPathPart = parsedUrl.path; const imgPath = path.join(__dirname, "../source/assets", imgPathPart); // 检查文件是否存在 if (fs.existsSync(imgPath)) { const dimensions = imageSize(imgPath); const width = dimensions.width; const small = src + "/webp400"; const middle = src + "/webp800"; const large = src + "/webp1600"; const origin = src + "/webp"; let srcset = `${origin} ${width}w`; if (width > 400) srcset += `, ${small} 400w`; if (width > 800) srcset += `, ${middle} 800w`; if (width > 1600) srcset += `, ${large} 1600w`; img.attr("srcset", srcset); let sizes; if (width <= 400) { sizes = `${width}px`; } else { sizes = "(min-width: 1150px) 723px, (min-width: 48em) calc((100vw - 120px) * 3 / 4 - 50px), (min-width: 35.5em) calc((100vw - 75px), calc(100vw - 40px)" } img.attr("sizes", sizes); img.attr("src", origin); const height = dimensions.height; img.attr("width", width); img.attr("height", height); } } }); return $.html();}); 效果测试 selfboot 提到一个工具 RespImageLint (ausi.github.io),不过不知道自己为什么一直使用不成功。 另外一个方法就是通过开发者工具,查看请求的图片是否符合预期。","link":"/post/hexo_photo_webp.html"},{"title":"@强化学习在推荐系统中的实践探索与业界进展","text":"链接:强化学习在推荐系统中的实践探索与业界进展,张启华,虎牙 想法 摘录","link":"/note/i_6657cc09e4b0d84daad98015.html"},{"title":"lc1039. 多边形三角剖分的最低得分","text":"题目链接:1039. 多边形三角剖分的最低得分 题解 区间 DP,假设 dp[i][j]dp[i][j]dp[i][j] 为从 i 到 j 进行三角剖分后最低分。枚举 i 到 j 中间存在一个点 k,使多边形变成三部分:ik, kj 以及 ijk 三角形的多边形,取最小的就是 ij 的最低分。 用 DFS 来写比直接写出递推公式简单一些。 看了标签和官方题解才写出来! 参考代码 123456789101112131415161718class Solution: def minScoreTriangulation(self, values: List[int]) -> int: mp = {} def dp(i, j): if j - i < 2: return 0 if j - i == 2: return values[i]*values[i+1]*values[j] if (i,j) in mp: return mp[(i,j)] ans = 1e9 for k in range(i+1, j): tmp = dp(i, k) + dp(k, j) + values[i]*values[k]*values[j] ans = min(tmp, ans) mp[(i,j)] = ans return ans return dp(0, len(values)-1) 错误贪心 枚举一个点做为顶点,往其他点连线将平面且分成 n-2 个三角形,样例第三个都过不了…… 123456789101112class Solution: def minScoreTriangulation(self, values: List[int]) -> int: n = len(values) aa = values + values ans = 1e9+7 for i in range(n): tmp = 0 for j in range(1, n-1): tmp += aa[i] * aa[i+j] * aa[i+j+1] print(tmp) ans = min(tmp, ans) return ans","link":"/problem/lc1039.html"},{"title":"lc1053. 交换一次的先前排列","text":"题目链接:LC1053. 交换一次的先前排列 题解 第一次碰到num list 的字典序,数字大的字典序大。 题目合法交换就是去找一个逆序数,即 i<j, arr[i]>arr[j]。结合字典序最大条件,就是要 i 最大,i 最大情况下,还要 j 最大。这种方法的复杂度应该是 O(n2)O(n^2)O(n2) 官方题解复杂度是 O(n)O(n)O(n),枚举 i: n-2 -> 0,有一个隐含的假设已经枚举过的 [i,n) 是非递减的。 参考代码 12345678910111213141516171819202122232425class Solution: def prevPermOpt1(self, arr: List[int]) -> List[int]: mp = {} a = -1 b = -1 n = len(arr) for i in range(n-1, -1, -1): for j in range(i-1, -1, -1): if j <= a: break if arr[j] > arr[i]: a = j b = i if a == -1: return arr else: for j in range(a, b): if arr[b] == arr[j]: b = j break tmp = arr[a] arr[a] = arr[b] arr[b] = tmp return arr","link":"/problem/lc1053.html"},{"title":"lc1491. 去掉最低工资和最高工资后的工资平均值","text":"题目链接:1491. 去掉最低工资和最高工资后的工资平均值 - 力扣(LeetCode) 题解 排序,调包即可。 参考代码 12345class Solution: def average(self, salary: List[int]) -> float: salary.sort() return sum(salary[1:-1])/len(salary[1:-1])","link":"/problem/lc1491.html"},{"title":"lc15. 三数之和","text":"题目链接:15. 三数之和 - 力扣(Leetcode) 题解 写了挺久的,不是标解。假设 a+b+c=0,a≤b≤ca+b+c=0, a \\le b \\le ca+b+c=0,a≤b≤c,枚举 ab,然后去一个 map 里面找有没有 c。另外还要记录一下 ab 有没有重复过。 标解里面,先对数组排序,然后 c 用双指针的思路在数组里查找。 参考代码 123456789101112131415161718192021222324252627282930class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() ret = [] used = {} tmp = {} n = len(nums) for i in range(n): if nums[i] not in tmp: tmp[nums[i]] = [] tmp[nums[i]].append(i) for i in range(n): for j in range(i+1, n): key = (str(nums[i]) + "_" + str(nums[j])) if key in used: continue used[key] = 1 need = 0 - (nums[i] + nums[j]) if need < nums[j]: continue if need not in tmp: continue for k in tmp[need]: if k == i or k == j: continue ret.append((nums[i], nums[j], nums[k])) break return ret 超时 1234567891011121314151617181920212223242526class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: two_sum = defaultdict(list) n = len(nums) for i in range(n): for j in range(i+1, n): s = nums[i] + nums[j] two_sum[s].append((i, j)) ret = [] used = {} for i in range(n): need = 0 - nums[i] for (a, b) in two_sum[need]: if a == i or b == i: continue tmp = [nums[i], nums[a], nums[b]] tmp.sort() key = "_".join(map(str, tmp)) if key in used: continue used[key] = 1 ret.append((nums[i], nums[a], nums[b])) return ret","link":"/problem/lc15.html"},{"title":"lc16. 最接近的三数之和","text":"题目链接:16. 最接近的三数之和 - 力扣(Leetcode) 题解 连续三天都是双指针,然后今天才发现自己根本不理解双指针。 参考代码 1234567891011121314151617181920212223242526class Solution: def threeSumClosest(self, nums: List[int], target: int) -> int: nums.sort() ret = 1e9 n = len(nums) def check_ans(now, pre): if abs(now - target) <= abs(pre - target): return now return pre for i in range(n): if i - 1 >= 0 and nums[i] == nums[i - 1]: continue j = i + 1 k = n - 1 while j < k: tmp_sum = nums[i] + nums[j] + nums[k] if tmp_sum == target: return target ret = check_ans(tmp_sum, ret) if tmp_sum > target: k = k - 1 if tmp_sum < target: j += 1 return ret","link":"/problem/lc16.html"},{"title":"lc1630. 等差子数组","text":"题目链接:1630. 等差子数组 - 力扣(LeetCode) 题解 暴力枚举,判断一个区间是否是等差数列可以优化,(arr_max - arr_mix)/arr_len 应该能整除且结果为公差,所以可以优化到 O(n) 参考代码 123456789101112131415161718class Solution: def checkArithmeticSubarrays(self, nums: List[int], l: List[int], r: List[int]) -> List[bool]: ans = [] n = len(l) for i in range(n): tmp = nums[l[i]:r[i]+1] tmp.sort() ok = 1 g = tmp[1] - tmp[0] for j in range(1, len(tmp)): if tmp[j] - tmp[j-1] != g: ok = 0 break if ok: ans.append(True) else: ans.append(False) return ans","link":"/problem/lc1630.html"},{"title":"lc1637. 两点之间不包含任何点的最宽垂直区域","text":"题目链接:1637. 两点之间不包含任何点的最宽垂直区域 - 力扣(LeetCode) 题解 对Points数组按 x 从小到大排序,max(Points[i+1][0] - Points[i][0]) 就是答案。 参考代码 12345678class Solution: def maxWidthOfVerticalArea(self, points: List[List[int]]) -> int: points.sort(key=lambda x:x[0]) ans = 0 for i in range(1, len(points)): ans = max(ans, points[i][0]-points[i-1][0]) return ans","link":"/problem/lc1637.html"},{"title":"lc1638. 统计只差一个字符的子串数目","text":"题目链接:LC1638 题解 方法一 n<100,三层循环枚举。 方法二:动态规划 假设 dp[i][j] 代表以 s[i] 和 t[j] 为不同字符的满足题目条件的方案数 代码 12345678910111213141516171819class Solution {public: int countSubstrings(string s, string t) { int ans = 0; for (int i=0;i<s.size();i++) { for(int j=0;j<t.size();j++) { int d = 0; for(int k=0;i+k<s.size()&&j+k<t.size(); k++) { if(s[i+k]!=t[j+k]) { d++; } if(d==2) break; if (d==1) ans +=1; } } } return ans; }};","link":"/problem/lc1638.html"},{"title":"lc167. 两数之和 ii - 输入有序数组","text":"题目链接:167. 两数之和 II - 输入有序数组 题解 数组已经排好序,对于 numbers[i]numbers[i]numbers[i] 只需要用二分搜索查找 numbers 中有没有满足 target−numbers[i]target - numbers[i]target−numbers[i]。 另外也可以用双指针来做,复杂度可以降到 O(n)O(n)O(n) 参考代码 1234567891011121314151617181920class Solution {public: vector<int> twoSum(vector<int>& numbers, int target) { vector<int>ans; for (int i=0;i<numbers.size();i++) { int need = target - numbers[i]; int k = lower_bound(numbers.begin()+i+1, numbers.end(), need) - numbers.begin(); // cout<<need<<" "<<k<<" "<<i<<endl; if (k >= numbers.size()) { continue; } if (numbers[i] + numbers[k] == target) { ans.push_back(i+1); ans.push_back(k+1); break; } } return ans; }};","link":"/problem/lc167.html"},{"title":"lc18. 四数之和","text":"题目链接:18. 四数之和 - 力扣(Leetcode) 题解 双指针,题目中会超过 int 参考代码 12345678910111213141516171819202122232425262728293031323334353637class Solution {public: vector<vector<int>> fourSum(vector<int>& a, int s) { vector<vector<int>>ans; sort(a.begin(), a.end()); int n = a.size(); for(int i=0; i<n; ++i) { if(i&&a[i-1]==a[i]) continue; map<int,int>mp; for(int j=i+1;j<n;j++) { if(mp[a[j]]==1) continue; mp[a[j]] = 1; long long s1 = (long long)s - a[i] - a[j]; int k=j+1; int t=n-1; while(k<t) { long long s2 = a[k] + a[t]; if(s2==s1) { vector<int>tmp{a[i], a[j], a[k], a[t]}; ans.push_back(tmp); int now = a[k]; k++; while(k<=t&&a[k]==now) k++; // cout<<k<<" "<<t<<endl; } else if(s2<s1) { k++; } else { t--; } } } } return ans; }};","link":"/problem/lc18.html"},{"title":"lc1911. 最大子序列交替和","text":"题目链接:1911. 最大子序列交替和 - 力扣(Leetcode) 题解 标准 dp 题 参考代码 123456789101112131415class Solution {public: long long maxAlternatingSum(vector<int>& nums) { long long dp[112345][2]; int n = nums.size(); dp[0][0] = 0; dp[0][1] = nums[0]; for (int i=1;i<n;i++) { dp[i][0] = max(dp[i-1][0], dp[i-1][1] - nums[i]); dp[i][1] = max(dp[i-1][1], dp[i-1][0] + nums[i]); } return max(dp[n-1][0], dp[n-1][1]); }};","link":"/problem/lc1911.html"},{"title":"lc1969. 数组元素的最小非零乘积","text":"题目链接:1969. 数组元素的最小非零乘积 题解 P=3,P=4,手推一下就可以发现规律,结果是 (2P−2)(2(P−1)−1)(2P−1)(2^P-2)^{(2^{(P-1)} - 1)}(2^P-1)(2P−2)(2(P−1)−1)(2P−1) 由于数字很大,用 C++ 实现快速幂需要手动取模。Python 中的 pow(x, y[, z]) 函数 z 可以指定为模数。 参考代码 123class Solution: def minNonZeroProduct(self, p: int) -> int: return int((pow(2, p)-1) * pow( pow(2, p) - 2, (pow(2, p-1) - 1), 10**9+7)%(10**9+7))","link":"/problem/lc1969.html"},{"title":"lc1976. 到达目的地的方案数","text":"题目链接: 题解 最短路,堆优化 参考代码 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455class Solution {public: int countPaths(int n, vector<vector<int>>& roads) { int mod = 1e9+7; long long dp[300]; long long mp[300][300]; long long cnt[300]; int u[300]; // vector<vector<pair<int,long long>>>mp[300]; for(int i=0;i<n;i++) { dp[i]=0x7fffffffffffffff; cnt[i]=0; u[i]=0; // mp[i].clear(); } memset(mp, 0xff, sizeof mp); for(auto r:roads) { mp[r[0]][r[1]] = r[2]; mp[r[1]][r[0]] = r[2]; // mp[r[0]].push_back(make_pair(r[1], r[2])); // mp[r[1]].push_back(make_pair(r[0], r[2])); } dp[0]=0; cnt[0]=1; using Pair = pair<long long, int>; priority_queue<Pair, vector<Pair>, greater<Pair>> Q; // 小根堆 Q.push(Pair(0, 0)); while (!Q.empty()) { auto k = Q.top().second; // cout<<k<<endl; Q.pop(); if(u[k]) continue; u[k]=1; for (int i = 0; i < n; i++) { // cout<<i<<"->"<<k<<", "<<mp[k][i]<<" "<<Q.size()<<endl; if (mp[k][i] !=-1 && dp[k] + mp[k][i] <= dp[i]) { if(dp[k]+mp[k][i]==dp[i]) { cnt[i] += cnt[k]; } else { cnt[i] = cnt[k]; } dp[i] = dp[k] + mp[k][i]; cnt[i] %= mod; Q.push(Pair(dp[i], i)); } } } return cnt[n-1]; }};","link":"/problem/lc1976.html"},{"title":"lc2178. 拆分成最多数目的正偶数之和","text":"题目链接:LC2178 题解 首先 finalSum 为奇数时,问题无解。接下来考虑偶数。 设 2,4,6,8,10,12… 这个公差为 2 的等差数列和为 S,题目就是要找一个最大的 i 满足 Si≤finalSumS_i \\le finalSumSi≤finalSum,答案就是 [2,4,6,8...,2∗(i−1),2∗i+Si−finalSum][2,4,6,8...,2*(i-1),2*i+S_i-finalSum][2,4,6,8...,2∗(i−1),2∗i+Si−finalSum]。 最后 cpp 求和时可能会超过 long long int 值域,可以用 python 写。 参考代码 12345678910111213class Solution: def maximumEvenSplit(self, finalSum: int) -> List[int]: if finalSum%2 == 1: return [] tmp_sum = 0 ans = [] now = 2 while finalSum >= tmp_sum + now: ans.append(now) tmp_sum += now now += 2 ans[-1] += finalSum - tmp_sum return ans","link":"/problem/lc2178.html"},{"title":"lc225.用队列实现栈","text":"题目链接: 题解 最简单的模拟,用一个 vector 就可以?好像是偷懒了。。。。 参考代码 123456789101112131415161718192021222324252627282930313233343536373839404142434445/* * @lc app=leetcode.cn id=225 lang=cpp * * [225] 用队列实现栈 */// @lc code=startclass MyStack { vector<int>q;public: MyStack() { } void push(int x) { q.push_back(x); } int pop() { int ret = q[q.size()-1]; q.pop_back(); return ret; } int top() { return q[q.size()-1]; } bool empty() { if (q.size() == 0) return true; return false; }};/** * Your MyStack object will be instantiated and called as such: * MyStack* obj = new MyStack(); * obj->push(x); * int param_2 = obj->pop(); * int param_3 = obj->top(); * bool param_4 = obj->empty(); */// @lc code=end","link":"/problem/lc225.html"},{"title":"lc228. 汇总区间","text":"题目链接:228. 汇总区间 - 力扣(LeetCode) 题解 按题目模拟,关键是如何写的优化。 [[分组循环]] 参考代码 123456789101112131415161718192021class Solution: def summaryRanges(self, nums: List[int]) -> List[str]: if len(nums) ==0: return [] ans = [] ans.append([nums[0], nums[0]]) for i in range(1, len(nums)): if nums[i] == ans[-1][1] + 1: ans[-1][1] = nums[i] else: ans.append([nums[i], nums[i]]) ret = [] for (s,e) in ans: if s == e: ret.append(str(s)) else: ret.append("{}->{}".format(s,e)) return ret","link":"/problem/lc228.html"},{"title":"lc232.用栈实现队列","text":"题目链接: 题解 简单模拟 参考代码 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465/* * @lc app=leetcode.cn id=232 lang=cpp * * [232] 用栈实现队列 */// @lc code=startclass MyQueue { stack<int>s1; stack<int>s2;public: MyQueue() { } void push(int x) { s1.push(x); } int pop() { while(!s1.empty()) { s2.push(s1.top()); s1.pop(); } int ret = s2.top(); s2.pop(); while(!s2.empty()) { s1.push(s2.top()); s2.pop(); } return ret; } int peek() { while(!s1.empty()) { s2.push(s1.top()); s1.pop(); } int ret = s2.top(); // s2.pop(); while(!s2.empty()) { s1.push(s2.top()); s2.pop(); } return ret; } bool empty() { if(s1.empty()) return true; else return false; }};/** * Your MyQueue object will be instantiated and called as such: * MyQueue* obj = new MyQueue(); * obj->push(x); * int param_2 = obj->pop(); * int param_3 = obj->peek(); * bool param_4 = obj->empty(); */// @lc code=end","link":"/problem/lc232.html"},{"title":"lc235.二叉搜索树的最近公共祖先","text":"题目链接: 题解 由于是二叉搜索树,两个节点的最近公共祖先就是从 root 找到第一个 val 在两个节点之间的节点。 参考代码 1234567891011121314151617181920212223242526272829303132## @lc app=leetcode.cn id=235 lang=python3## LC235.二叉搜索树的最近公共祖先## @lc code=start# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode': pp = min(p.val, q.val) qq = max(p.val, q.val) def dfs(rt): # print(rt.val, pp, qq) if rt.val >= pp and rt.val <= qq: return rt if rt.val > qq: return dfs(rt.left) if rt.val < pp: return dfs(rt.right) # ans = dfs(root) return dfs(root)# @lc code=end","link":"/problem/lc235.html"},{"title":"lc2367. 算术三元组的数目","text":"题目链接:2367. 算术三元组的数目 - 力扣(LeetCode) 题解 三层 for 循环暴力,也可以优化,枚举 i 和 j,然后查找 a[k] 是否存在。 参考代码 123456789101112131415161718class Solution {public: int arithmeticTriplets(vector<int>& a, int diff) { int ans = 0; for(int i=0; i<a.size(); ++i) { for(int j=i+1; j<a.size(); j++) { if(a[j]-a[i]>diff) break; for(int k=j+1;k<a.size(); ++k) { if(a[j]-a[i]==a[k]-a[j] && a[j]-a[i]==diff) { ans += 1; } if (a[k]-a[j]>a[j]-a[i]) break; } } } return ans; }};","link":"/problem/lc2367.html"},{"title":"lc2368.受限条件下可到达节点的数目","text":"题目链接: 题解 简单 dfs 参考代码 123456789101112131415161718192021222324252627282930## @lc app=leetcode.cn id=2368 lang=python3## [2368] 受限条件下可到达节点的数目## @lc code=startclass Solution: def reachableNodes(self, n: int, edges: List[List[int]], restricted: List[int]) -> int: g = [[] for i in range(n)] for e in edges: g[e[0]].append(e[1]) g[e[1]].append(e[0]) ok = set(restricted) ans = 0 def dfs(rt, fa): if rt in ok: return 0 ret = 1 for nx in g[rt]: if nx == fa: continue ret += dfs(nx, rt) return ret return dfs(0, -1)# @lc code=end","link":"/problem/lc2368.html"},{"title":"lc2369.检查数组是否存在有效划分","text":"题目链接: 题解 简单 dp 参考代码 12345678910111213141516171819202122232425262728293031323334353637/* * @lc app=leetcode.cn id=2369 lang=cpp * * [2369] 检查数组是否存在有效划分 */// @lc code=startclass Solution {public: bool validPartition(vector<int>& nums) { int ok[112345]; memset(ok, 0, sizeof ok); int n = nums.size(); for(int i=1;i<n;i++) { if(nums[i-1] == nums[i]) { if(i==1||ok[i-2]) ok[i] = 1; } if(i>=2) { if(nums[i-2] == nums[i-1] && nums[i-1] == nums[i]) { if(i==2||ok[i-3]) ok[i] = 1; } if(nums[i-2] + 1 == nums[i-1] && nums[i-1] +1 == nums[i]) { if(i==2||ok[i-3]) ok[i] = 1; } } } return ok[n-1]; }};// @lc code=end","link":"/problem/lc2369.html"},{"title":"lc2476.二叉搜索树最近节点查询","text":"题目链接: 题解 题目中有坑,如果树退化成一个链,每次在树上搜索会超时。所以先把二叉搜索树转到一个数组(中序遍历),然后每次在数组上二分查找。 参考代码 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758/* * @lc app=leetcode.cn id=2476 lang=cpp * * [2476] 二叉搜索树最近节点查询 */// @lc code=start/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} * }; */class Solution {public: vector<vector<int>> closestNodes(TreeNode* root, vector<int>& queries) { vector<int> tmp; queue<TreeNode*> q; q.push(root); while(!q.empty()) { TreeNode* node = q.front(); q.pop(); tmp.push_back(node->val); if(node->left) q.push(node->left); if(node->right) q.push(node->right); } sort(tmp.begin(), tmp.end()); vector<vector<int>> ans; for(int i = 0; i < queries.size(); i++) { int left = -1; int right = -1; int k = lower_bound(tmp.begin(), tmp.end(), queries[i]) - tmp.begin(); if(k!=tmp.size() && tmp[k] == queries[i]) { left = queries[i]; right = queries[i]; } else if (k == 0) {right = tmp[k];} else if (k == tmp.size()) {left = tmp[k-1];} else { left = tmp[k-1]; right = tmp[k]; } ans.push_back({left, right}); } return ans; }};// @lc code=end","link":"/problem/lc2476.html"},{"title":"lc2544. 交替数字和","text":"题目链接:2544. 交替数字和 - 力扣(Leetcode) 题解 按题意模拟 参考代码 123456789class Solution: def alternateDigitSum(self, n: int) -> int: s = 0 f = 1 for i in str(n): s += f * int(i) f = f*-1 return s","link":"/problem/lc2544.html"},{"title":"lc2575.找出字符串的可整除数组","text":"题目链接: 题解 按题意模拟,对中间变量一直模 m。中间过程可能超过 int 范围。 参考代码 12345678910111213141516171819202122232425/* * @lc app=leetcode.cn id=2575 lang=cpp * * [2575] 找出字符串的可整除数组 */// @lc code=startclass Solution {public: vector<int> divisibilityArray(string word, int m) { vector<int> ans; long long p=0; for (int i = 0;i<word.size(); ++i) { p = p*10+word[i]-'0'; if (p%m==0) ans.push_back(1); else ans.push_back(0); p = p%m; } return ans; }};// @lc code=end","link":"/problem/lc2575.html"},{"title":"lc2581.统计可能的树根数目","text":"题目链接: 题解 如果已知 fa 为根时,满足猜测的答案是 now,那么如果 nx 为根,fa 为叶子,对答案的贡献就是 (fa, nx) 和 (nx, fa)。 第一次以 0 为根,计算满足的答案,之后再 dfs,每次值影响两个节点的关系。 参考代码 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748## @lc app=leetcode.cn id=2581 lang=python3## [2581] 统计可能的树根数目## @lc code=startclass Solution: def rootCount(self, edges: List[List[int]], guesses: List[List[int]], k: int) -> int: g = [[] for i in range(len(edges) + 1)] for a in edges: g[a[0]].append(a[1]) g[a[1]].append(a[0]) guesse = {(a[0], a[1]) for a in guesses} ans = 0 base = 0 def dfs(rt, fa): if (fa, rt) in guesse: nonlocal base base += 1 for nx in g[rt]: if nx == fa: continue dfs(nx, rt) dfs(0, -1) # print(base) def check(rt, fa, now): nonlocal ans if (now >= k): ans += 1 for nx in g[rt]: if nx == fa: continue tmp = now if (rt, nx) in guesse: tmp -= 1 if (nx, rt) in guesse: tmp += 1 check(nx, rt, tmp) check(0, -1, base) return ans# @lc code=end","link":"/problem/lc2581.html"},{"title":"lc2600. k 件物品的最大和","text":"题目链接:2600. K 件物品的最大和 - 力扣(LeetCode) 题解 按题意贪心 参考代码 1234567891011121314151617181920class Solution {public: int kItemsWithMaximumSum(int numOnes, int numZeros, int numNegOnes, int k) { int ans=0; if (k>=numOnes) { ans += numOnes; k-=numOnes; } else { ans = k; k = 0; } if(k>=numZeros) { k-=numZeros; } else { k = 0; } ans -= k; return ans; }};","link":"/problem/lc2600.html"},{"title":"lc2679. 矩阵中的和","text":"题目链接:2679. 矩阵中的和 题解 可以转化成,每一行从大到小排序,每一列取最大值求和。 时间复杂度 O(nmlogm)O(nm\\log m)O(nmlogm) 参考代码 1234567891011121314151617181920class Solution {public: int matrixSum(vector<vector<int>>& nums) { int n = nums.size(); int m = nums[0].size(); vector<int>ans(m, 0); for (auto num:nums) { sort(num.begin(), num.end()); for (int i=0;i<m;i++) { ans[i]=max(ans[i], num[i]); } } int ret = 0; for (auto aa:ans) { ret += aa; } return ret; }};","link":"/problem/lc2679.html"},{"title":"lc2734.执行子串操作后的字典序最小字符串","text":"题目链接:2734. 执行子串操作后的字典序最小字符串 - 力扣(LeetCode) 题解 贪心,刚开始没有看到至少需要修改一个字符错了一次。 参考代码 1234567891011121314151617181920class Solution {public: string smallestString(string s) { int ok = 0; for (int i=0;i<s.size();i++) { if (s[i] != 'a' && ok == 0) { ok = 1; } // cout<<s[i]<<endl; if (ok == 1 && s[i] == 'a') { break; } if(ok == 1) s[i] = s[i] - 1; } if (ok == 0) s[s.size()-1] = 'z'; return s; }};","link":"/problem/lc2734.html"},{"title":"lc2763.使二叉树所有路径值相等的最小代价","text":"题目链接: 题解 树形 DP,每一个节点最后对答案贡献是左右子树路径 sum 的差。 参考代码 12345678910111213141516171819202122232425262728## @lc app=leetcode.cn id=2673 lang=python3## [2673] 使二叉树所有路径值相等的最小代价## @lc code=startclass Solution: def minIncrements(self, n: int, cost: List[int]) -> int: # ans = 0 def dfs(rt, n): if rt > n: return 0, 0 now_ans = 0 left, ans = dfs(rt*2, n) now_ans += ans right, ans = dfs(rt*2+1, n) now_ans += ans now_ans += abs(left-right) return max(left, right) + cost[rt-1], now_ans sum1, ans = dfs(1, n) return ans# @lc code=end","link":"/problem/lc2763.html"},{"title":"lc2867.统计树中的合法路径数目","text":"题目链接:https://leetcode.cn/problems/count-valid-paths-in-a-tree/ 题解 方法一:简单树形dp,需要预处理质数。 方法二:将所有联通的素数放到一个并查集,减少重复计算 参考代码 1","link":"/problem/lc2867.html"},{"title":"lc2917.找出数组中的k-or值","text":"题目链接:2917. 找出数组中的 K-or 值 - 力扣(LeetCode) 题解 位运算,按题意模拟。 参考代码 1234567891011121314151617181920212223242526272829/* * @lc app=leetcode.cn id=2917 lang=cpp * * [2917] 找出数组中的 K-or 值 */// @lc code=startclass Solution {public: int findKOr(vector<int>& nums, int k) { long long ans = 0; int a[32]; memset(a, 0, sizeof a); for(auto num:nums) { for(int i=0; i<31; i++) { if(num & (1<<i)) a[i]+=1; } } for(int i=0; i<31;i++) { if (a[i] >= k) { ans += (1<<i); } } return ans; }};// @lc code=end","link":"/problem/lc2917.html"},{"title":"lc2923.找到冠军 i","text":"题目链接:2923. 找到冠军 I - 力扣(LeetCode) 题解 简单模拟,写的时候发现自己的 Voyager 键盘忘记设置大于号和小于号,还是从题目中复制的符号。。。 参考代码 1234567891011121314151617181920212223class Solution { public: int findChampion(vector<vector<int>>& grid) { int n = grid.size(); int ans = 0; for (int i=0;i<n;++i) { int sum = 0; for (int j=0;j<n;++j) { sum+=grid[i][j]; } if (sum == n-1) { ans = i; } } return ans; }};","link":"/problem/lc2923.html"},{"title":"lc526. 优美的排列","text":"题目链接:526. 优美的排列 - 力扣(LeetCode) (leetcode-cn.com) 题解 常规状态压缩,(偷懒直接在测试台输入 1-15 的样例打表也可以) 参考代码 123456789101112131415161718class Solution {public: int countArrangement(int n) { int a[16][1<<n]; memset(a, 0, sizeof(a)); a[0][0] = 1; for(int i=1;i<=n;i++) { for(int j=0;j<(1<<n);j++) { for(int k=1;k<=n;k++) { if (k%i!=0&&i%k!=0) continue; if (j & (1<<(k-1))) continue; a[i][j|(1<<(k-1))] += a[i-1][j]; } } } return a[n][(1<<n)-1]; }};","link":"/problem/lc526.html"},{"title":"lc552. 学生出勤记录 ii","text":"题目链接: 题解 动态规划,定义 dp[n][2][3],分别代表长度为 n,包含几个 A,末尾有几个 L 的方案数,转移的时候仔细点就可以。 参考代码 123456789101112131415161718192021222324252627282930313233343536373839404142/* * @lc app=leetcode.cn id=552 lang=cpp * * [552] 学生出勤记录 II */// @lc code=startclass Solution {public: int checkRecord(int n) { long long dp[123456][2][3]; int mod = 1e9+7; memset(dp, 0, sizeof dp); dp[0][0][0] = 1; for (int i=1;i<=n;i++) { // no A dp[i][0][0] = (dp[i][0][0] + dp[i-1][0][0] + dp[i-1][0][1] + dp[i-1][0][2])%mod; dp[i][0][1] = (dp[i][0][1] + dp[i-1][0][0])%mod; dp[i][0][2] = (dp[i][0][2] + dp[i-1][0][1])%mod; // A dp[i][1][0] = (dp[i][1][0] + dp[i-1][1][0] + dp[i-1][0][0] + dp[i-1][0][1] + dp[i-1][0][2]+ dp[i-1][1][1] + dp[i-1][1][2])%mod; dp[i][1][1] = (dp[i][1][1] + dp[i-1][1][0])%mod; dp[i][1][2] = (dp[i][1][2] + dp[i-1][1][1])%mod; } long long ans = 0; for (int i=0;i<2;i++) { for(int j=0;j<3;j++) { ans = (ans + dp[n][i][j]) % mod; } } return ans % mod; }};// @lc code=end","link":"/problem/lc552.html"},{"title":"lc5832. 构造元素不等于两相邻元素平均值的数组","text":"题目链接:5832. 构造元素不等于两相邻元素平均值的数组 - 力扣(LeetCode) 题解 (错了好几次后,看预期结果看出的规律……)数字从小到大排序后,将前 n/2 个数字依次放在 1、3、5… 位置上,剩下数字依次放在 0、2、4… 位置上。这样可以保证每一个数字不可能是左右两个数字的一半。 参考代码 12345678910111213141516class Solution {public: vector<int> rearrangeArray(vector<int>& a) { sort(a.begin(), a.end()); vector<int>ans(a.size()); int j = 1; for(int i=0;i<a.size();i++) { if(j >= a.size()) { j=0; } ans[j]=a[i]; j+=2; } return ans; }};","link":"/problem/lc5832.html"},{"title":"lc831. 隐藏个人信息","text":"题目链接:831. 隐藏个人信息 - 力扣(LeetCode) 题解 模拟 参考代码 123456789101112131415class Solution: def maskPII(self, s: str) -> str: ans = "" if '@' in s: s = s.lower() a, b = s.split("@") ans = a[0] + "*****" + a[-1] + "@" + b else: num = [] for ss in s: if ss.isnumeric(): num.append(ss) per = ['***-***-', '+*-***-***-', '+**-***-***-', '+***-***-***-'] ans = per[len(num)-10] + "".join(num[-4:]) return ans","link":"/problem/lc831.html"},{"title":"lc852. 山脉数组的峰顶索引","text":"题目链接:852. 山脉数组的峰顶索引 - 力扣(LeetCode) (leetcode-cn.com) 题解 三分搜索 参考代码 12345678910111213141516171819class Solution {public: int peakIndexInMountainArray(vector<int>& a) { int l = 0; int r = a.size()-1; while(l<r) { int m = l + (r-l) /2; int ml = l + (m-l)/2 ; int mr = r - (r-m) / 2; // cout<<m<<" "<<l<<" "<<r<<" "<<ml<<" "<<mr<<endl; if(a[ml]>=a[mr]) { r = mr-1; } else if(a[ml]<a[mr]) { l = ml+1; } } return l; }};","link":"/problem/lc852.html"},{"title":"lc887. 鸡蛋掉落","text":"题目连接:887. 鸡蛋掉落 - 力扣(LeetCode) 题解 假设 dp[i][j] 代表 i 个鸡蛋移动 j 次最多能覆盖多少层楼,可以得到递推公式 dp[i][j]=dp[i-1][j-1] + dp[i][j-1] + 1,题目转换成求 dp[k][j]>=n 时最小的 j。这个递推公式增长速度很快,超过 n 后强制修改成 n 即刻。 代码 123456789101112131415161718192021222324class Solution {public: int dp[101][10001]; int superEggDrop(int k, int n) { memset(dp, 0, sizeof dp); for(int i=1;i<=k;i++) { for(int j=1;j<=n;j++) { if(i==1) { dp[i][j]=j; } else { if (dp[i-1][j-1]>=n || dp[i][j-1]>=n) { dp[i][j] = n + 1; } else dp[i][j] = 1 + dp[i-1][j-1] + dp[i][j-1]; } if(i==k&&dp[i][j]>=n) { return j; } } } return n; }}; DFS 超时代码 123456789101112131415161718192021222324class Solution {public: int ans[101][10000+1]; int dfs(int k, int n) { if (ans[k][n]!= -1) { return ans[k][n]; } if (k == 1) return n; if (n == 1) return 1; int mi = n; for (int i = 1; i< n; i ++) { int f1 = dfs(k-1, i-1); int f2 = dfs(k, n-i); mi = min(1+max(f1, f2), mi); } ans[k][n] = mi; return mi; } int superEggDrop(int k, int n) { memset(ans, 0xff ,sizeof ans); return dfs(k,n); }};","link":"/problem/lc887.html"},{"title":"lc931.下降路径最小和","text":"题目链接:下降路径最小和 题解 简单动态规划 参考代码 123456789101112131415161718192021222324class Solution {public: int minFallingPathSum(vector<vector<int>>& a) { int n = a.size(); int m = a[0].size(); int dp[n][m]; int ans = 1e9; memset(dp, 0, sizeof dp); for (int i = 0;i<n;i++) { for(int j = 0; j<m; j++) { if (i!=0) { dp[i][j] = dp[i-1][j]; if (j > 0) dp[i][j] = min(dp[i][j], dp[i-1][j-1]); if (j + 1 < m) dp[i][j] = min(dp[i][j], dp[i-1][j+1]); } dp[i][j] += a[i][j]; if (i==n-1) { ans = min(ans, dp[i][j]); } } } return ans; }};","link":"/problem/lc931.html"},{"title":"librerank","text":"链接:LibRerank-Community/LibRerank: LibRerank is a toolkit for re-ranking algorithms. There are a number of re-ranking algorithms, such as PRM, DLCM, GSF, miDNN, SetRank, EGRerank, Seq2Slate. (github.com) 、推荐系统重排序之librerank 代码解读 - 知乎 (zhihu.com) 想法 开源重排算法库,最后更新是 22 年。 模型验证数据集 ad 和 prm","link":"/note/librerank.html"},{"title":"logseq","text":"从 2019 年开始使用 [[Roam]],2022 年底迁移到 Logseq,自己可以算得上一名资深双链笔记软件爱好者。得益于这几年日常高强度使用,已经积累超过 7k+ 笔记。本文记录我的 Logseq 最佳实践。 基础功能 [[logseq/task]] 任务管理相关内容整理 [[logseq/query]] 查询功能,期待官方数据库版本能提升查询体验。 同步 官方提供 [[Logseq Sync]] (需要赞助 5 刀成为 backer 用户),自己从这个功能上线开始使用,快要一年时间内,也没有遇到过什么大的问题,还是比较省心的。 由于之前还使用 [[logseq-publish]] 将笔记发布出来,所以家中主力 mac 上的 logseq 数据目录也会使用 git 管理。 笔记在线发布 最早使用 pengx17 的 Github Action 插件 [[logseq-publish]],将 public:: true 的笔记打包成一个 PWA,然后利用 Gihub 托管。 但是打包出来的 PWA 其实功能很弱,比如不支持访问量统计,评论。所幸自己写了一个 python 脚本,通过 [[Logseq API]] 将笔记转成 md 文件,然后通过 hexo 渲染成静态网页。比如你现在看到的这篇文章就是通过这种方式导出的,具体见 [[logseq 笔记发布到 hexo 博客]]。 插件 插件是提升用户体验必不可少的一环,但是和 Obsidian 相比,Loseq 的插件生态要弱上不少。[[Logseq plugin]]","link":"/note/logseq.html"},{"title":"8d - the building blocks - block types","text":"课程汇总链接: [[@Magical Academic Note Taking]] 总结 作者讲解自己定义的 Smart Note Blocks,光看她的解释是挺抽象的。例子在下一节课。 Block types answer Three Questions What will this Block type be used for? When do I want to see this Block type (not individual) again? How is this block type identified? General Blocks Life Note WHAT: A note about progress, thoughts, daily activities, etc… WHEN: I want to see these when I go back to review progress, analyze the effectiveness of my day, look back at my thoughts, etc… HOW: These notes do not need to be tagged as they live on the DNP page. Task Note WHAT: A note that includes a specific task WHEN: I want to see these notes when it is time to complete the task. HOW: All task notes get funneled through the [[X - Task Management]] process beginning with the tag of Inbox Project Note WHAT: A note that contributes to a project. Primarily an idea for content, or the content itself WHEN: I want to see these when I am working on that specific project HOW: No matter where these notes are taking, they are always either nested under the Project Page Name (nest tag), or added directly to the Project Page. Library WHAT: This note includes content that I want to explore further. It may be relevant to a specific project. It may just be something that interests me. WHEN: I want to see these when I am working on nurturing my Cabrelli Garden or when I am working on a specific project. HOW: These notes are automatically categorized through their linkage to [[Collection Tags]] or [[Projects]] Smart Note Blocks [[F-Note]] What [[Fleeting Notes]] are represented within the graph by the tag F-Note 标签代表闪念笔记 When I am only interested in seeing these notes again if I want to reference another’s work during the creation of an Output Page. 输出时应用相关工作才会重新看这类型笔记 How On the Source Page so will surface through Page relationship Tag or nest if specific connection comes to mind. 标签或嵌套 [[L-Note]] What L-Note 标签代表 [[Literature Notes]] When I want to see these when I am researching or creating content on a particular subject, or when I am researching to answer a #[[Q-Note]] or when I am building a #[[Z-Note]] 写特定主题的内容,找到 Q-Note 的答案,或者建立 Z-Note How Prefaced with a keyword that reflects the content of the note UNLESS 用反映笔记内容的关键词开头 Captured within the content of a Page with a relevant Page tag OR Nested under an #[[R-Note]] or Page that has the relevant keyword in the header of the Page (like this one). OR #L-Note 被嵌套在 Q-Note 或 Z-Note 下 重写引用的材料 [[R-Note]] What Realization Note When I want to see these when I am researching or creating content on a particular subject, or when I am researching to answer a #[[Q-Note]] or when I am building a #[[Z-Note]] How 和 L-Note 类似 [[Q-Note]] What Question Note When I want to see #[[Q-Note]] page when I am developing a theory, section header or idea relevant to an Output Page. 输出的时候看这部份笔记 How A #[[Q-Note]] is tagged as such in the Page Header and will appear on the #[[Q-Note]] Collection Page that is reviewed as part of the [[X - Curate]] session, or when building, renewing, or expanding an outline. 命名一个问题等于拥有了一个问题 [[Z-Note]] What Synthesis Note When When I am building an Output Page or an Outline. When I am reviewing my personal knowledge. How A #[[Z-Note]] exists on an independent page nested under a specific category that represents your knowledge (In my case it’s my Garden). No special linking is required. 对一个问题的总结笔记","link":"/note/magical_academic_note_taking_8d.html"},{"title":"9a - note synthesis","text":"课程链接: [[@Magical Academic Note Taking]] 想法 Note Synthesis 可以理解成笔记整理,从 What 、Why、When 三个角度出发,沿着 The Lagger of Thought 一级一级整理出可以支持你后续创作的笔记。在 8D - The Building BLOCKS - Block Types 中作者介绍她自己的笔记体系,这节课通过实际的例子讲解如何使用不同类型的笔记标签。 Pre-Synthesize 打开对应的材料 page 打开需要整理的笔记页面(一本书/一篇论文的全部高亮) 浏览浏览导入的高亮引用,标注关键词,将主题移到到 Topic 页面 写总结 Executive Summary,告诉未来的自己,这篇材料的主要内容是什么。 浏览导入的高亮引用,标注关键词,将主题移到到 Topic 页面 总结 Executive Summary,告诉未来的自己,这篇材料的主要内容是什么。 Synthesize The Lagger of Thought The Lagger of Thought 思想的阶梯 记录一个想法从产生到成熟的阶梯。 [[Graphics]] 如何组织笔记:Classify、Clarify、Connect 从 Classify、Clarify、Connect 三个方面整理笔记 Classify (What?) [[Fleeting Notes]] [[F-Note]] are used within your academic writing as direct quotes with attribution. [[F-Note]] notes are the initial notes collected from a source. F-Note 是直接摘录的原始笔记 [[F-Note]] are always the words and ideas of others (direct quotes or copied content). 其他人的文字和想法 [[F-Note]] should never be used without attribution to the source material. 不应该在没有标注来源的情况下使用 As part of the X - Collect process, an [[F-Note]] will have a sub-bullet that will represent a thought the reader had while consuming that specific content. F-Note 有一个子节点,记录读者在阅读对应内容时的想法 Fleeting Notes are the bottom layer of the foundation for further thinking. 闪念笔记是进一步思考的基础。 Also known as Fleeting Notes, Context Snippets. [[F-Note]]s support [[Literature Notes]] 用自己的话重写 fleeting notes 的内容 [[L-Note]] are used within your academic writing as paraphrases with attribution. 带有归属的释义 [[L-Note]] are a simple re-statement of the original text in the [[F-Note]] in your own words. 用自己的话总结 F-Note In the process of creating Literature Notes it is essential that the reader just simply re-states and does not permit the influence of their personal worldview, theories, or pre-conceived ideas. 文献笔记只需要重写原文,而不要融入自己的世界观、理论或设想 Literature Notes serve two main purposes They facilitate a deeper understanding of the material 更深入理解材料 They ensure that you do not change the meaning of the text from its original context. 保证你不改变原来的含义 Requiring an [[L-Note]] prior to further analysis of the Fleeting Note also allows the writer to easily see where they are adding value to their reading. 重新阅读产生什么价值 If the writer has something to say beyond the simple re-statement in an [[L-Note]] an [[R-Note]] is required. 如果在重写 L-Note 时还有其他想法想写,需要一个 R-Note An [[L-Note]] may uncover a new [[Q-Note]] required to explore an idea further. L-Note 可能引发出一个 Q-Note example:根据多个 [[F-Note]] 写一个 [[L-Note]] [[Literature Note]] 用自己的话重写 fleeting notes 的内容 example TODO 补充图片 [[Realization Notes]] 为什么要写下这个笔记? SyncRead R-note 更进一步的想法 Q-note 需要大量 blocks 支撑(实验、观点),Q-note 记录你不确定的东西。 Q-note 会变成未来论文的标题、章节 常青笔记围绕一个主题记录, 思想阶梯,记录一个想法从产生到成熟。 Z-note 一个页面,个人对一个主题所有理解。 Clarify (Why?) Question Notes Q-note 需要大量 blocks 支撑(实验、观点),Q-note 记录你不确定的东西。 What A [[Q-Note]] is used within your academic writing as an exploratory staging space for deeper thinking and connections between all other note types. 用于深入思考和连接其他所有类型的笔记 A [[Q-Note]] sits at the Page level with the question as a title and prefaced with a Q. 一个以 Q - 问题 为标题的 page A [[Q-Note]] poses a question or a theory (used as the page title, prefaced by a Q that needs further support or exploration. Q-Note 对应一个问题或理论,需要材料支持或进一步探索 A [[Q-Note]] is a page on it’s way to becoming an [[Z-Note]]. Q-Note’s make great outline line items for writing projects. Q-Note 会成为 Z-note。Q-Note 也是写作的大纲、标题、章节 Example Evergreen Notes/Synthesis Notes/Zettelkasten/[[Permanent Notes]],对某个特定主题的理解 What A [[Z-Note]] is used within your academic writing as a representation of a resolved and converted #[[Q-Note]] 对应一个已解决或转化的 Q-Note A [[Z-Note]] is always at the Page level and has a single declarative title (claim, theory, argument, problem) as a page title (prefaced by an Z) 以 Z - 声明性标题(主张、理论、论点、问题) 为标题的 Page A [[Z-Note]] is densely linked with #[[R-Note]], possibly other [[Z-Note]] and Q-Note. Z-Note 和其他类型的笔记都息息相关。 A [[Z-Note]] may be produced as the result of a Q-Note. Z-Note 可能是对一个 Q-Note 研究的成果。 The content of a [[Z-Note]] can be used in multiple contexts and for multiple projects. Z-Note 可以在多个上下文和项目中使用 A collection of [[Z-Note]] are a representation of your personal synthesized knowledge. 多少 Z-Note 就代表你有多少综合的知识。 example Connect/Time-Travel (When?) 如何链接/支援未来 Ways to Travel through Time 根据笔记的重要程度选择不同的链接方式,什么时候希望再看到相关的笔记 Connect/Time-Travel (When?) 高亮的内容放在对应的 page 下面, Ways to Travel through Time Very Important On Page On Page 通过页面汇总相关的 block Important Tagging - Page Level Nested Under Page Backlink - Page Level Nested Under Page Backlink - Page Level 嵌套在页面的反向链接下面 Related Referencing - Block Level []() 相关引用 Related Referencing - Block Level []() Less Important All Blocks to a Page Keeping it clean Commenting (also useful during create session) Invisibility Cloak, Roam 插件 Commenting (also will be useful when we get to writing) Post-Synthesize Ideas Remix 组合不同的想法形成新的想法? Ref Joel Chan’s [[@knowledge synthesis]]","link":"/note/magical_academic_note_taking_9a.html"},{"title":"纯文本任务管理","text":"最早该主题相关记录:纯文本任务管理思考 · Issue #11 · xiang578/xiang578.github.io 软件 [[org-mode]] 无法直接导入 org 文件,但是可以记录在 md 文件中,但是可读性不好。 或者定期将项目相关的记录已 markdown 格式导出? be-org [[taskpaper]] 可以打开 md 文件,可以被引用。部分功能不支持? 功能还没有 sublime 插件强大,日期格式都不能改变。 aziz/PlainTasks: An opinionated todo-list plugin for Sublime Text editor (version 2 and 3) Todo.txt: Future-proof task tracking in a file you control Ref @My productivity app is a never-ending txt file @从终端到纯文本:我的任务管理简史 我的时间管理工具 · 构建我的被动收入 每个关注领域一个 todo 文件来管理,拆分项目。 项目中的代办事项三个状态,@critical 代表是否重要。 bmpi-dev/todo_starter 以及 bmpi-dev/todo_parser_lib每日定时发送任务相关统计 *.todo -> json -> html","link":"/note/plain_text_gtd.html"},{"title":"pointer network","text":"求解凸包、TSP 等问题有一个特点:输出是输入的子集。由于输入序列就是词表(不定长),无法使用传统的 seq2seq 模型去建模。 基于对 attention 注意力机制进行修改和简化,得到新的公式: uji=vTtanh(W1ej+W2di)j∈(1,…,n)u_j^i =v^T \\tanh \\left(W_1 e_j+W_2 d_i\\right) \\quad j \\in(1, \\ldots, n)uji=vTtanh(W1ej+W2di)j∈(1,…,n) ej 是 encoder 第 j 步输出 di 是 decoder 第 i 步输出 vT,w1,w2 是固定维度的可训练参数 p(Ci∣C1,…,Ci−1,P)=softmax(ui)p\\left(C_i \\mid C_1, \\ldots, C_{i-1}, \\mathcal{P}\\right) =\\operatorname{softmax}\\left(u^i\\right)p(Ci∣C1,…,Ci−1,P)=softmax(ui) 考虑第 i 步的选择,先分别计算 uij,然后对 ui 求 softmax,最大值对应的 j 是这一步的输出。 Ref 什么是Pointer Network? - 知乎 李宏毅 Pointer Network - YouTube","link":"/note/pointer_network.html"},{"title":"@my productivity app is a never-ending txt file","text":"链接:My productivity app is a single .txt file (jeffhuang.com) 想法 这几天又看见有人分享这篇文章,想起来第一次,作者的标题还是 past 12 years,一转眼又过去好几年。 [[Twitter]] 12 年间使用一个 txt 进行任务管理方法分享。作者提到 to do list 变成 what done list 的过程,每天晚上将日历中第二天的代办事项整理到 txt 中,第二天顺手记录任务相关的信息(比如讨论出的结论,或者得到的信息)。结合自己使用经历,OmniFocus 是一个 to do list,基于纯文本的任务管理方式(org-mode 或 taskpaper)更容易成为 what done list。 [[Twitter]] 另外基于 Roam Research 的大纲形式以及 block ref 功能,很容易打造 what done list 。 任务管理系统只需要让使用者有一种自己能掌握全部事情的感觉即可。 摘录 Prerequisite 使用在线日历管理全部的代办事项和未来计划 Making the Daily List 每天睡觉前将日历中第二天需要完成的任务放到 txt 文件最后 scheduled tasks: 2pm meeting with Madonna, 4pm office hours errands: sign a form, return a book work items: review a paper, prepare a presentation As a Record to do list 变成 what done list,记录相关的任务细节。 Shortcuts and Features 使用特定的格式方便搜索以及统计数据 比如 meet with 代表 meetings idea 代表想法 annual 写到下一个年度报告中 nextui 为下一次 next ui 课程增加的内容 邮件处理 flag red 需要处理 flag Orange 需要其他人帮助处理 flag Yellow 等待他们回复 一天结束的时候,查看所有有flag的邮件,看有没有要升级为红色flag的邮件,将红色flag的事情排到第二天的日程中 daily routine look at the daily todo list I wrote last night to find out what I’m doing today do scheduled things on that list during the day when I have free (unscheduled) time, do the floating tasks on my list and work on Red-flagged emails at the end of the day do a quick review of Orange/Yellow emails to see if they need any handling copy the next day’s calendar items to the bottom of the text file 好处 每天早上起来都知道自己需要干什么 长时间联系可以准确估计完成任务的时间 减轻记忆负担(集中管理,知道自己不会错过) 动态调整工作量(减少标记的邮件、减少日历中的待办事项) 一天的结束后的记录 12345678910111213141516171819202122232425262728293031323334353637383940412017-11-3111:00am meet with Head TAs- where are things at with inviting portfolio reviewers? A: got 7/29 replies- need 3 TAs for Thursday lab- Redesign assignment handout will be done by Monday, ship Thursday11:30am meet with student Enya (interested in research)- they're a little inexperienced, suggested applying next yearreview and release A/B Testing assignment grading12pm HCI group meeting- automatically generate thumbnails from zoom behavior on web pages- #idea subliminal audio that leads you to dream about websites- Eminem presenting Nov 24- vote for lab snacks. A: popcorn and seaweed thinggot unofficial notification ARO YIP funding award #annual #cvread Sketchy paper draft- needs 1 more revision- send to Gandalf to look at?Zelda pick up eye tracker- have her sign for itupdate biosketch for Co-PIunexpected drop in from Coolio! #alumni- now a PM working on TravelAdvisor, thinking about applying to grad school3:15pm join call with Umbrella Corp and industry partnership staff- they want to hire 20 data science + SWE interns (year 3), 4 alums there as SWE3:45pm advising meet with Oprah- enjoyed CS 33- interning at Facebook4pm Rihanna talk (368 CIT)5pm 1:1 with Beyonce #phdadvisee- stuck on random graph generating crash - monitor memory/swap/disk? - ask Mario to help?- got internship at MSR with Cher - start May 15 or 22- will send me study design outline before next meeting- interviewing Spartacus as potential RA for next semester6pm faculty interview dinner with Madonna (Gracie's)- ask about connection with computer vision- cool visual+audio unsupervised comparison, thoughtful about missing data, would work with ugrads (?), likes biking, teach compvis + graphics- vote #HIRE#note maybe visit Monsters University next spring, Bono does related work 参考 Hacker News 两次讨论 链接:2021-12-23、2020-02-08 Any productivity system can be made to work once it becomes a habit and therefore your default action. We are what we repeatedly do. Excellence, then, is not an act, but a habit. Randy Pausch log format priority - datetime stamp - keywords/tag - content nrr-deprecated/todo: Tools inspired by the late Randy Pausch to help keep me on-task (github.com) note (maybe some text here) vim +'normal Go' +'r!date' did.txt 打开 vim 然后在文件最后一行加上日期。详细解释 did.txt file – Patrick (theptrk.com) X 上的 MindForge (曼福吉):“我的生产力应用程序是一个永无止境的.txt文件 https://t.co/iBSTeUbnvH Jeff Huang 使用 UltraEdit 手写一个 51,690行 的txt 文件,作为其生产力工具,这个 txt 记录了他作为教授所做的一切,他遇到的几乎每个人,以及关于他们讨论的内容或想法的笔记。 Jeff Huang 的 txt 工作流: -” / X 总结的要点 started just tracking in a single text file - 在同一个地方 consistent writing style - 以一致的标准 I have some tags like # idea for new ideas to revisit when I want project ideas - 记录你的洞见 用txt文件做日程管理 (qq.com) [[徐颖@笔记花园]] 无论是Luhmann的slip box,还是Jeff的txt文件,都不是笔记软件,而是笔记方法。方法遵循清晰的原则——他们知道自己在记录什么(What)、何时记录(When)、如何记录及检索(How),以及最基本的——为何而记录(Why) 7年记录了37000多行,完全能够记得什么时候,见过什么人,讨论过什么事情,以及自己的想法。 slip box笔记法围绕主题和上下文建立卡片笔记,强调笔记的去向。有网友评价其因为具备“耗散结构”而具有活力,笔者赞成这个说法。耗散结构因为能抵抗熵增,被认为是生命的基本特征,可参考《重新认识生命》。也就是说:有效的笔记,就是让信息变得有秩序。 用txt文档做日程管理,就是记流水账,记下将要做的事情,记录做过的事情和有用的想法。笔记中,时间是最重要的维度,这非常有利于时间管理与生产力评估。总的来说记录是线性的,但是,利用关键字或tag,也能组织出主题内容。 做笔记,原则比工具重要,工具可以帮忙更好的实施原则。 笔记软件的用户,应根据自己的意图,定制不同的原则。 笔记软件开发者,则可以根据这些典型用户的做法,改进产品。","link":"/note/productivity_text_file.html"},{"title":"黔山毛豆","text":"链接:尺宅杂记,尺宅足自庇,寸田有余畦。 介绍 本名黎明,网名黔山毛豆,我是谁 | 尺宅杂记 (qncd.com)。贵州幸福学堂老师(中文、历史、地理),看他的文章教学理念倾向于触发学生思辨。 看见另外一种可能,接近于每天写一篇文章。 相关 读书记 【读书记1283】沈昌文《也无风雨也无晴》 | 尺宅杂记 (qncd.com) 从这一篇开始,每读一本书都标记一个总阅读量 【读书记】《明亮的对话:公共说理十八讲》三 | 尺宅杂记 (qncd.com) 2021 年写博客 17 年,阅读量超过两千七百万。 [[送书]] 林汉达、曹余章的《上下五千年(珍藏版)》。这套书以故事讲历史,按时间顺序编排了262个历史故事,从开天辟地的神话,钻木取火的传说到乾隆禁书修书,曹雪芹写《红楼梦》,涉及到中国文明发展史的方方面面。 当下的世界也许是平庸和愚蠢的 | 尺宅杂记 (qncd.com) 虽然是中文经典课程,但我们会更加围绕一个核心来进行,即与其试图预测未来10年会发生什么变化,不如关注未来10年里什么是不变的——什么是人工智能做不到的,就是我们要去了解和学习的。 卡尔维诺 [[@为什么读经典]] 当下的世界也许是平庸和愚蠢的,但它永远是一个脉络,我们必须置身其中才能够顾后或瞻前。而经典帮助我们理解我们是谁和我们所到达的位置。但出于职责和敬意阅读经典作品是没有用的,我们只应仅仅因为喜爱而阅读他们。只有那些你在学校教育之后或之外选择的东西才有价值。只有在非强制的阅读中,你才会碰到将成为“你的”书的书。 而这些书,就存在于我们理想的经典藏书室中,其中一半应该包括我们读过并对我们有所裨益的书,另一半应该是我们打算读并假设可能对我们有裨益的书。我们还应该把一部分时间让给意外之书和偶然发现之书。 自编教材 [[唐人五十家]]","link":"/note/qncd.html"},{"title":"rerank","text":"推荐系统中的一环,考虑上下文信息对推荐结果的影响。 解决三大问题 用户体验 打散 多样性 算法效率 多任务融合 上下文感知 实时性提升 流量调控 保量:流量扶持、生态建设 调权:业务需求、实时干预 用户体验 打散 对同类目、同作者、相似封面图的 item 进行打散,有效防止用户疲劳和系统过度个性化 打散常用的方法 分桶打散法 不同属性 item 放入不同的桶中,一次从各桶取出 item 即可。 按高中低价格分桶,排序结果价格呈现多样性 简单,效果好。末尾容易扎堆,对原始序列改变大,可能带来指标的下降。 权重分配法 对每一个 item 定义一个分数,计算 f(x)=∑iWi∗f(x)=\\sum_i W_i *f(x)=∑iWi∗ Count i_ii w 为每个属性的权重,代表打散需求的优先级 Count 为同属性 item 已经出现的次数 fx 为打散加权分数,从低到高对 item 进行排序,完成打散。 实现简单,充分考虑多种属性的叠加,扩展性强,末尾容易扎堆 滑动窗口 在一个长度可控的滑动窗口内,同属性 item 超过一定次数后,交换出 session。 考虑局部,计算量小,对原序的破坏比较低,最大限度保留相关性,也有末尾扎堆。 多样性 评估方法 数据指标分析 user 和 item 角度,用户曝光一二级类目数,曝光item同属一个类目的概率 类目、作者、标签多个维度分析 人工评估 发展里程 规则约束 硬规则约束 规则引擎 个性化约束 不同类目、不同时段、不同活跃度用户配置不同 启发式方法:结合多样性和相关性 [[MMR]] 最大边缘相关模型 [[@The use of MMR, diversity-based reranking for reordering documents and producing summaries]] [[DPP]] 点行列式矩阵 [[@Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity]] [[Deep-DPP]] 结合深度神经网络 [[@Practical Diversified Recommendations on YouTube with Determinantal Point Processes]] 深度模型,加入上下文感知 算法效率 多任务融合 精排输出多个任务的分数,在重排阶段融合。 常用方法 人工调权 Grid Search 模型法 轻量模型融合多个打分以及其他比较重要的特征 point-wise 业务场景的最终指标必须单一,重排模型的监督目标必须是一个单一任务。 强化学习 根据用户在不同状态下的行为,利用强化学习建模状态转移过程,提升业务核心目标。 上下文感知 context-aware Learning-To-Rank 优化目标 min1∣B∣∑(S,Y)∈Bi∈[1,S[]∑[Loss(Yi, Fr(Si,Context(S,i)))\\min \\frac{1}{|B|} \\sum_{(S, Y) \\in B i \\in[1, S[]} \\sum_{[} \\operatorname{Loss}\\left(Y_i, \\mathrm{~F}_{\\mathrm{r}}\\left(S_i, \\operatorname{Context}(S, i)\\right)\\right)min∣B∣1∑(S,Y)∈Bi∈[1,S[]∑[Loss(Yi, Fr(Si,Context(S,i))) S 是曝光的物料序列,Y 是用户对 S 的反馈序列 Yi 是对 Si 的反馈 Fr 重排模型,预测 Si 被用户交互的概率。 Loss 可以是普通的交叉熵损失函数。 如何表达序列中的物料 Si 用户针对 Si 的个性化信息,精排模型打分 Si 在整个候选集中的排名、位置信息,刻画Si和邻居之间的相对关系,价格排名,精排序列排名 Fr 是能对序列建模的模型 如何生成序列 argmaxS∈ Permute (X)∑i∈[1,∣S[]Utility(Si, Fn(Si,Context(S,i)))\\underset{S \\in \\text { Permute }(X)}{\\operatorname{argmax}} \\sum_{i \\in[1, \\mid S[]} \\operatorname{Utility}\\left(S_i, \\mathrm{~F}_{\\mathrm{n}}\\left(S_i, \\operatorname{Context}(S, i)\\right)\\right)S∈ Permute (X)argmax∑i∈[1,∣S[]Utility(Si, Fn(Si,Context(S,i))) permute 代表排列组合能够生成的所有序列 Utility 收益函数,Si 被购买的概率等 Greedy Search 每次挑选剩下无聊中带来最大收益的那个。 pair-wise 类 构建 pair 对比两个 item 之间的相对关系,仍然忽略全局信息。 正样本好于负样本的概率,利用交叉熵来拟合目标 对比学习loss,hinge loss, [[Triplet Loss]] RankSVM、GBRank、RankNet、 LambdaRank RankNet 基础上引入 NDCG 目标 list-wise 类 直接对序列进行优化,建模 item 序列的整体信息和对比信息 即是使用List-Wise方法得到的候选序列,可以从list维度考虑排序,但在最终得到序列时也是逐个使用贪心方法选择候选item,还是不能做到充分上下文感知以及从整体(“长期”)收益的序列生成。 通过序列生成方法和强化重排解决。 树模型:lambdaMart RNN 分别利用 rnn+attention 和 pointer-network 来构建 seq2seq 模型 阿里巴巴 miRNN [[DLCM]] [[seq2slate]] 两段式:PRS PMatch 和 PRank 两个链路,通过两段式结构得到最终输出 self-attention:[[PRM]]、setRank self-attention 解决长序列建模问题 强化学习:京东LIRO、阿里GRN 实时性提升 实时性分类 系统响应实时性 用户实时行为捕捉,端上重排 特征实时性 链路数据回收延迟,用户本身行为延迟反馈 模型实时性 在线学习,实时更新模型 在线学习 ODL 延迟反馈 collapsed:: true 原因:链路数据回收延迟,用户本身行为延迟反馈 解决方法 负例校正法:先标记样本为负样本,真正转化后重新插入正样本。保证模型新鲜度,但假负例对模型有一定副作用。 Addressing delayed feedback for continuous training with neural networks in CTR prediction 等待法:一定时间内等待真实的成交转化,没等到就不校正。label 置信度提升,模型新鲜度有折损。 A Feedback Shift Correction in Predicting Conversion Rates under Delayed Feedback (arxiv.org) 纠偏法:ES-DFM,对观测转化分布和真实转化分布之间的关系建模,降低假负例的权重和增加真正例的权重,来纠正样本不置信问题。 Delayed Feedback (arxiv.org) 数据稳定性 电商 CVR 用户白天浏览点击,晚上下单。cvr 晚上比白天高,需要做修正。 端上重排 优点 推荐响应实时性:不用请求下一页,实现即时更新 行为特征实时性:端上即时计算,不用回传云端 行为特征丰富度:负反馈、滚动速度、曝光时长等多种用户行为都可以在模型中使用,基于云端的方式受限于数据传输和存储,一般只会选择点击等关键的用户行为。 引擎 TF-lite MNN TNN 基于双塔内积模型的实现方式 服务端一次下发几十个item,包括item的embedding 端上基于本地存储的user静态特征、统计特征,和实时行为特征,实时计算user embedding user和item embedding进行内积计算,对list中未展现的剩余item做重排 下次请求时,将更新后的user特征回传云端,方便云端模型实时更新。 发展进程 端上推理 EdgeRec 端上训练 DCCL 流量调控 保量:流量扶持、生态建设 规则引擎 冷启动、买卖家结构调整、曝光保量 探索和利用:通过e-greedy、Thompson sampling、UCB等EE类的方法,可以有效探索冷启item,同时利用已有item,保障效率折损最低。 调权:业务需求、实时干预 规则引擎 时效性要求高的场景,大促 item 加权 样本加权 命中调权规则的样本,增加其在 loss 中的权重。 实现个性化,对效率折损较低。 适合长期调权场景,大店和大 V Ref [[@推荐算法架构4:重排]] [[@互联网大厂推荐算法实战]] 6.2 重排 搜索推荐广告排序艺术-重排序 - 知乎 (zhihu.com) 搜推广生死判官:重排技术发展 - 知乎 (zhihu.com)","link":"/note/rerank.html"},{"title":"三峰环穿","text":"北京经典户外徒步路线。一般从大觉寺出发,经过三座海拔超过 1000 米的山(萝芭地北尖、阳台山和妙峰山),然后回到大觉寺,全程约 23 公里。 目前去过两次,2022 年 07 月 09 日用了 9 个小时走完全程,2022 年 10 月 15 日用了 5 个半小时走到涧沟村约 15 公里。 行程准备 交通可以坐 16 号线到达北安河站,然后再打车到大觉寺(十多块钱)。上次在涧沟村结束徒步,打不到滴滴,然后坐 M5 公交车(几个小时一班,可以从高德查看时刻表)到达苹果园站。 路线可以从两步路或六只脚上查询,两个 app 提供轨迹导航功能,也可以下载轨迹 gpx 文件然后导入佳明等手表中使用。 中途有多个补给商店(大觉寺商店、第一座山后的茶棚、涧沟村),价格也还行。 风景 {:height 1629, :width 1216}","link":"/travel/san-feng-huan-chuan.html"},{"title":"素数筛","text":"快速求 n 以内的素数 埃氏筛 the Sieve of Eratosthenes 复杂度 O(nloglogn)O(n \\log \\log n)O(nloglogn) 筛的过程中,会重复筛到同一个数。比如 12 同时被 2 和 3 筛到。 线性筛 复杂度 O(n)O(n)O(n) 让每一个合数被其最小的质因数筛到,比如 12=3*4=6*2 需要被 6 划去。 123456789101112131415161718bool isnp[MAXN];vector<int> primes; // 质数表void init(int n){ for (int i = 2; i <= n; i++) { if (!isnp[i]) primes.push_back(i); for (int p : primes) { if (p * i > n) break; isnp[p * i] = 1; if (i % p == 0) //保证每个数最多被筛一次。 break; } }} Ref 算法学习笔记(17): 素数筛 - 知乎 (zhihu.com)","link":"/note/sieve.html"},{"title":"soren bjornstad","text":"链接:碎片想法、zettelkasten 卡片笔记 tiddlywiki、长文博客 介绍 [[2022/09/10]],从朴禅郑仁: 万字长文:如何选笔记软件、做知识管理、建数字花园? - 即刻 (okjike.com) 了解到。 软件工程师,在 remnote 工作 有 3 个网站: Random Thoughts – Soren Bjornstad 从 2009 年 10 月开始到现在,记录超过 12000 条碎片。 利用 tiddlywiki 搭建 Zettelkasten — The public musings of Soren Bjornstad 网站,超过 2500 篇笔记,具体见视频 [[@A Tour Through My Zettelkasten]] Soren Bjornstad - YouTube 通过视频形式分享自己的工作流,比如用 remnote 阅读 pdf 以及写卡片笔记。 相关 [[Mosaic Muse]] 阅读 tiddlywiki 网站中的笔记记录 改造 tiddlywiki,在每篇文档末尾展示和该文档有关联的文档。 The Records Project ChronoBook RandomThoughts my Zettelkasten","link":"/note/soren_bjornstad.html"},{"title":"focus2flow","text":"链接:focus2flow的个人空间-哔哩哔哩视频 、公众号:走路 id:: 66913a21-31ae-4e24-a9ab-05bb985087d7 up 主的自我介绍 我是focus2flow,专注于个人成长和终身学习 昵称的意思是:专注达至心流,这是我对自己的期待。 我近期主要更新了一些年度总结、Logseq使用、高质量信息、30岁感悟、阅读感悟等方面的内容 背景 本科毕业于南京师范大学社会学专业 2018 研究生毕业于中山大学社会学专业 作品 [[@建立我的态度、趣味和生活]] [[段永平]] 公司和投资逻辑 如何获得高质量信息?从“不为清单”开始,从自身需求出发、选择好的信息源、善用工具 段永平,比做什么更重要的是不做什么。 不做什么 不看非高质量信息源,朋友圈,短视频 不看没有明确观点的内容,文章没有摘要和大纲不值得一看。你不告诉我你要讲什么?我不确定我花的时间会不会浪费在上面。 减少那种随意的无目的性的浏览 要少用手机去浏览信息 有做什么? 从自己需求出发寻找信息 善用工具,搜索技巧 多接触专业的信息源,批判性思维,信息背后的动机和利益","link":"/note/soren_focus2flow.html"},{"title":"【随想集】 8 新键盘","text":"不想计算距离上次写[[thinking 7]]过去多久,2024 年也已经过去一个月。反正还想立下一个 flag,今年一定要多写几篇! 本周最期待的事情就是收到 ZSA 从台湾寄过来的键盘快递。在使用了快4年的Ergodox ez 后,自己又下单一把分体键盘 The Voyager: A powerful, low-profile, split ergonomic keyboard | zsa.io。这次选择的是黑色、无刻、凯华茶轴,键盘花费 365 美元(其实商品价值只有 220美元,ZSA这SB公司非要收你 145 刀的快递费),另外过海关报税+快递公司服务费约 240 元。大概得时间线是:1.19 下单,1.30 ZSA 通过 DHL 发出快递,1.31 快递到达海关,DHL 的员工联系你去填写相关资料报关,2.1 海关清关,2.2 收到键盘。大概 10 天多一点,被国内次日达的服务惯坏之后,等待的时间确实挺煎熬。收到那天还随便录一个 Zsa voyager 键盘开箱_哔哩哔哩_bilibili ,后面用一段时间再来写写使用感受吧(希望我还记得)。目前用的键盘 layout:my voyager 工作方面,入职飞猪已经三个月,老板一直让做和机票红包补贴相关的事情。不过,自己对营销相关的方法基本上是一无所知,现在很大一部分精力花在恶补相关的知识。上周看完滴滴城运服团队发在 SIGIR 2023 上的论文 [[@A Consumer Compensation System in Ride-hailing Service]],文章主要介绍他们在货运和代驾业务上实现的基于 ODT 的用户补贴系统,包括离线构建补贴词典(价格弹性建模 + 运筹求解分配方案)以及在线部署。不知道是不是这个会议文章长度限制,有挺多感兴趣的点他们没有仔细去写。 另外,周末一直在看 Dragonnet 的原文 [[@Adapting Neural Networks for the Estimation of Treatment Effects]],targeted regularization 部分用到一些高级的统计知识,看了很久都是云里雾里。今天在知乎冲浪时,看到翁恺老师的鸡汤:计算机没有黑魔法。多花点时间和精力,一定会搞明白。 接下来还要上到除夕才能放假,好快又是一年。","link":"/weekly/thinking-8.html"},{"title":"【随想集】9 新思路","text":"不知不觉,距离上次写 thinking 8 又过去 4 个月,这几个月花了一些时间整理博客,写点东西记录一下。 个人主页 长时间以来,一直想折腾个人主页,但是迟迟没有动手。今天看到 Maeiee首页,觉得非常不错,立刻 fork 上游仓库 ardacarofficial/links-website: List all your links on one website.。 手搓出一个自己的主页 xiang578.com。整理过程中发现,自己折腾过太多网站,感觉都能搞出一个媒体矩阵。 博客更新 最近几个月开始高强度更新博客,最主要的原因是自己写了一个 python 脚本,可以把 Logseq 笔记快速导出成 md 文章。这几年使用下来,自己的 Logseq 笔记已经有超过 7k 篇笔记,感觉还有很多内容可以分享,接下来一段时间应该都能保持一定的频率更新。 这段时间分享的笔记中,自己最喜欢马前卒 2014 的 @好读书,不求甚解。马前卒分享如何通过读书构建世界模型,感觉他讲得一些方法直接冲击了自己的灵魂,还是思考的问题太少。 4 月份开始,自己的工作被调整到搜索排序方向上,主要了解的是 ReRank 技术。另外也看了一些 [[DataFun]] 上工业界分享 @多目标排序在快手短视频推荐中的实践、@重排序在快手短视频推荐系统中的演进 、@淘宝推荐场景的利器:融合复杂目标且支持实时调控的重排模型。 Logseq Database version [[2024/04/29]] Logseq 创始人 [[tienson]] 在社区发布一个帖子 Why the database version and how it’s going? - Announcements - Logseq 介绍一些和 Logseq 数据库版本相关的信息。从 Github [WIP] Database version by tiensonqin · Pull Request #9858 来看,这个功能差不多开发了 10 个月,最近几个月感觉团队开发者的重心都转移到这个功能,不过一直没有给用户带来试用版本。 突然觉得对这个产品有些失望。印象里 [[tienson]] 最早希望开发一个可以在手机上查看 [[org-mode]] 笔记的软件。后来 [[Roam]] 火起来,又开始致敬 Roam,慢慢变成现在这个样子。这几年笔记软件圈兴起过白板风潮,logseq 白板功能是一位社区用户贡献的,和 [[Heptabase]] 和 [[Obsidian]] 相比,完成度非常低。前一段时间尝试使用,连自动对齐元素的功能都没有,看起来相关功能更新也暂停了。最近火的 AI 功能,只在 github 上找到一个 pull requerst,也没有看见 [[tienson]] 继续开发下去。反倒是 tana notes,已经支持用 AI 自动整理录音。 总结起来,Logseq 开发者和社区沟通太少,也没有专门做产品运营的人,不知道自己什么时候会选择从这个软件迁移?","link":"/weekly/thinking_9.html"},{"title":"从 umami cloud 迁移到自建 umami","text":"Umami 是自己从今年年初开始使用网站统计工具,和 Google Analytics 相比,Umami 更加轻量和美观。根据 P.J. Wu 吳秉儒 在 博客文章 中介绍,一直通过 Umami Cloud 免费试用。 5 月 5 日突然收到官方邮件,Umami Cloud 结束 Beta 测试以及公布 Pricing,基础 Hobby Plan(Free) 支持 3 个网站/保存 6 个月内统计数据/10k以内请求量,下一档 Basic 直接是 9 刀一个月。由于免费计划保留数据时间太短,收费计划价格太贵,开始考虑从 Umami Cloud 迁移。 使用 Umami Cloud 差不多 5 月时间,本博客统计到 1.26k 浏览量,从来源域名分析超过一半以上访问都是自己贡献的。毕竟之前在 v2ex 看过网友锐评“大部分个人网站一天就 3 个访客,一个是自己家中电脑,一个是自己公司电脑,最后一个是自己手机”。 使用 Docker 自建 Umami 自建 Umami 有很多方式,比如 Pseudoyu 写过 从零开始搭建一个免费的个人博客数据统计系统(umami + Vercel + Heroku),由于自己不太再想依赖其他“免费”服务,直接选择在服务器使用 Docker Compose 一步安装 Umami。 官方在 umami/docker-compose.yml at master · umami-software/umami · GitHub 提供 docker-compose 文件。复制到服务器,保存成 docker-compose.yml,然后 docker-compose up -d 启动容器。 1234567891011121314151617181920212223242526---version: '3'services: umami: image: ghcr.io/umami-software/umami:postgresql-latest ports: - "3000:3000" environment: DATABASE_URL: postgresql://umami:umami@db:5432/umami DATABASE_TYPE: postgresql APP_SECRET: replace-me-with-a-random-string depends_on: - db restart: always db: image: postgres:15-alpine environment: POSTGRES_DB: umami POSTGRES_USER: umami POSTGRES_PASSWORD: umami volumes: - ./sql/schema.postgresql.sql:/docker-entrypoint-initdb.d/schema.postgresql.sql:ro - umami-db-data:/var/lib/postgresql/data restart: alwaysvolumes: umami-db-data: 根据 docker-compose.yml 中的设置,自建 umami 端口是 3000,所以可以直接访问 ip:3000。Umami 默认账户是 admin,密码是 umami。对于自建服务,一般出于安全考虑都不太建议通过 ip + 端口访问,加上也不太熟悉通过 nginx 配置反向代理,最终通过 [[Cloudflare Zero Trust]] 给端口绑定一个二级域名。 博客相关访问数据可以在 算法花园 Umami 统计 查看。 导入 Umami Cloud 数据 首先,从 Umami Cloud 导出数据。从下图位置点击 Export 后,会收到一封邮件,然后访问邮件中链接,浏览器会自动下载一个 csv 文件。 下载的 csv 文件没有标题栏,但是根据文件内数据形式猜测,每一行可能对应一条站点访问记录。 123"7e782528-455f-4f0a-acc5-01ec7ed759ff","24876f1d-7941-5c58-a549-737ebe7515b1","40bc9a7c-a2dc-4e6a-b126-c26313d4d66f","blog.xiang578.com","edge-chromium","Mac OS","desktop","2560x1440","zh-CN","HK","","","","/movie/age-of-dynamic.html","","/travel/san-feng-huan-chuan.html","","blog.xiang578.com","@激流时代 - 算法花园",1,"","2023-05-07 07:03:00""7e782528-455f-4f0a-acc5-01ec7ed759ff","2ffcc2a9-670c-5454-8913-0e6ad2a814a9","97b49b96-1f25-40a2-8465-565f2d1f3642","blog.xiang578.com","chrome","Mac OS","desktop","1920x1080","zh-CN","HK","HK-HCW","","Central","/post/are-transformers-effective-for-time-series-forecasting.html","","/","","google.com.hk","【时间序列预测】Are Transformers Effective for Time Series Forecasting? - 算法花园",1,"","2023-05-03 07:12:35""7e782528-455f-4f0a-acc5-01ec7ed759ff","ed67da59-da08-5525-9be2-cd2035f7fc95","49891f43-46db-4ec4-a412-b68eaf136e8e","blog.xiang578.com","chrome","Windows 10","laptop","1536x864","zh-CN","HK","HK-HCW","","Central","/post/reinforce-learnning-basic.html","","/","","google.com.hk","李宏毅强化学习课程笔记 PG PPO Q-Learing - 算法花园",1,"","2023-05-03 11:35:33 目前(5.7)没有在网上找到相关导入数据的教程,已经发邮件给官方求助,等收到回复后再来更新。 Umami Docker 数据自动备份 保存 postgres 中数据就可以,暂时还没有时间研究,等有空再回来更新。 参考 Umami Docker 部署及优化 - 大大的小蜗牛 (eallion.com)","link":"/note/umami-docker.html"},{"title":"@卡片笔记实践篇:怎么做笔记,才能避免读书过眼不过脑","text":"链接:卡片笔记实践篇:怎么做笔记,才能避免读书过眼不过脑 - #UNTAG (utgd.net) 想法 阅读清单到索引笔记 [[如何写索引笔记?]] 摘录 @Reading Better: Retaining and Applying What You Read 提倡用 [[The Blank Sheet]] 进行阅读。 重要的是阅读材料前后关于某一主题的认知是否有变化。 您不仅会增加新知识,而且同样有价值的是,您会删除您认为自己知道但并非如此的东西。这就是记录阅读前后认知变化的价值:让阅读真正过脑子,不要自欺欺人。 日本人有一种所谓的三点笔记法,就是读完一本书之后记下三点你印象最深刻的东西。 [[阅读清单]]实践 第一部分是阅读契机,往往包括直接动机(比如读了什么材料让我产生动力),以及我的直接目的是什么(可以是纯粹好奇); 第二部分列出阅读材料和已经知道的事情,这一步非常关键,我会尽可能回忆以前的笔记,找到我关于阅读主题的已有认知,以便在阅读后诚实反映认知变化; 最后一部分是阅读记录,不管是发现新知识还是仅仅确认了旧观点,都老老实实把所得所获记下来。 {:height 967, :width 822} 结果 阅读记录由此变成了一篇索引笔记,汇集在阅读之前已有的想法,然后随着阅读前进,提出新观点,并且通过双向链接在观点笔记和空白表笔记之间创建关联。","link":"/note/utgd_20113.html"},{"title":"@稍后一周再读:一种明智的阅读策略","text":"链接:稍后一周再读:一种明智的阅读策略 | #UNTAG (utgd.net) 想法 文章主要思想是,新的文章不需要及时读,用主题阅读替代。 原来以为是先读完一堆东西,再去写索引笔记。其实可以转变思路,通过主题去收集资料,积累到一定程度,然后阅读做笔记。不过,自己的兴趣变换太快,收集的文章文章一大堆,读完没有多少。 摘录 按主题写[[阅读清单]],列出所有相关资料、标明作者、写明来源、注明时间,并保持跟踪。 上图只是一张清单,重在内容,不挑软件。列出清单,再耐心等上一两周,相当一批热文、爆文就会原形毕露,你也免遭精神污染。 一个经验性的发现是:话题越是火爆,初期出现的文章最后越容易被证明是在胡扯——回忆一下这些重大事件发生时,那些所谓专家都在扯什么玩意儿吧 [[Minja]] 在 @卡片笔记实践篇:怎么做笔记,才能避免读书过眼不过脑 里面也有提到[[阅读清单]]相关方法。","link":"/note/utgd_20767.html"},{"title":"融合公式","text":"推荐系统会产生多个不同目标的预估分,需要将多个分数融合得到最终唯一的排序依据。 多目标融合步骤 分数变换,对目标输出分放大、压缩、平移等等 分数融合 乘法公式 ∏j(1+aj⋅pXTRj)bj\\prod_j\\left(1+a_j \\cdot \\mathrm{pXTR}_j\\right)^{b_j}∏j(1+aj⋅pXTRj)bj 加法公式 ∏j(1+aj⋅pXTRj)bj\\prod_j\\left(1+a_j \\cdot \\mathrm{pXTR}_j\\right)^{b_j}∏j(1+aj⋅pXTRj)bj 两种形式哪种更好? aj⋅pXTRja_j \\cdot \\mathrm{pXTR}_jaj⋅pXTRj 很小时,乘法公式相当于对数域上的加法 log[∏j(1+aj⋅pXTRj)bj]=∑jbj⋅log(1+aj⋅pXTRj)≈∑jajbj⋅pXTRj\\log \\left[\\prod_j\\left(1+a_j \\cdot \\mathrm{pXTR}_j\\right)^{b_j}\\right]=\\sum_j b_j \\cdot \\log \\left(1+a_j \\cdot \\mathrm{pXTR}_j\\right) \\approx \\sum_j a_j b_j \\cdot \\mathrm{pXTR}_jlog[∏j(1+aj⋅pXTRj)bj]=∑jbj⋅log(1+aj⋅pXTRj)≈∑jajbj⋅pXTRj aj⋅pXTRja_j \\cdot \\mathrm{pXTR}_jaj⋅pXTRj 变大,有 log[∏j(1+aj⋅pXTRj)bj]≈∑jbj⋅log(aj⋅pXTRj)=∑jbj⋅log(pXTRj)+C\\log \\left[\\prod_j\\left(1+a_j \\cdot \\mathrm{pXTR}_j\\right)^{b_j}\\right] \\approx \\sum_j b_j \\cdot \\log \\left(a_j \\cdot \\mathrm{pXTR}_j\\right)=\\sum_j b_j \\cdot \\log \\left(\\mathrm{pXTR}_j\\right)+Clog[∏j(1+aj⋅pXTRj)bj]≈∑jbj⋅log(aj⋅pXTRj)=∑jbj⋅log(pXTRj)+C 排序分 pXTR(predicted X-Through Rate) 先验分布更加接近于对数正态分布 排序分由多个随机变量乘积形成,具有很大范围的变异性,偏向与较小值,偶尔会出现极大值。根据中心极限定理,这些对数的和往往趋向于正态分布。 从用户交互上看,用户的互动和模型的输出之间存在反馈循环。高分的项目更有可能被展示和选择,从而进一步增加它们的分数,这种正反馈机制可以导致分数分布的长尾特性,从而更接近对数正态分布。 乘法公式在 aj⋅pXTRja_j \\cdot \\mathrm{pXTR}_jaj⋅pXTRj 较大时,利用 pXTR 的对数正态先验,在较小时,近似加法公式。 什么样的融合公式是好公式 基本要求 具有区分度:区分是排序的核心功能,较弱的区分度意味着排序机制的失效。 尽可能保留排序队列 pXTRj 的信息量:排序队列理应向融合分施加影响,否则就没有实现融合,也浪费了预估值。 尽可能少的冗余超参数:超参数应该能直接体现业务意志,过多的超参数会让融合公式丧失调整(不论是人工或自动)的指向性与被理解的能力。 对数域主成分分析视角下的融合公式 融合公式相当于把 m 维空间的点线性映射到以为空间,需要寻找保留最多信息的投影方向,等价于寻找均方误差意义上的最优线性变换。 x=(pXTR1,pXTR2,…,pXTRm)∈R+m→y=f(x)∈R+1\\mathbf{x}=\\left(\\mathrm{pXTR}_1, \\mathrm{pXTR}_2, \\ldots, \\mathrm{pXTR}_m\\right) \\in \\mathbb{R}_{+}^m \\rightarrow y=f(\\mathbf{x}) \\in \\mathbb{R}_{+}^1x=(pXTR1,pXTR2,…,pXTRm)∈R+m→y=f(x)∈R+1 KL 变化([[PCA]] 是 KL 变换的一种特殊情况),从最大化数据投影的方差的角度出发,寻找最优的线性变换,以便在降维后仍然能够反映最大的数据变异性。 具体 PCA 求解见知乎原文,实践代码 Mixician/src/mixician/examples/calculate_value_based_ensemble_score/self_balancing_value_based_ensemble_score.ipynb at develop · yinsn/Mixician (github.com) 模型化 通过模型来学习融合公式中的参数,需要考虑如何定义总目标作为监督信号。 实时流 AB 参数微弱变动严重影响 AB 指标,严格限制超参在 baseline 参数的临域附近,对指标进行兜底。 @多目标排序在快手短视频推荐中的实践 CEM 算法,baseline 参数 + 方差扰动得到多组高斯分布,所有参数应用于实时流 AB。 总结 融合公式见效快但不够动态,无法解决模型漂移、个性化偏置等问题。 模型化、实时流 AB 提高复杂度,进一步逼近理论上界,但也引入不可控性、稳定性、解释性差等问题。 Ref 值融合排序公式设计哲学的数学原理 - 知乎 (zhihu.com),对数域主成分分析视角下的融合公式 关于推荐系统多目标融合排序的进一步思考 - 知乎 (zhihu.com)","link":"/note/value_based_ensemble_score.html"},{"title":"vimtutor","text":"跟着 [[@如何提高编程速度:Emacs高手教授轻松精通所有编辑器和IDE的秘诀]] 学习 vim 官方教程的记录。 第二讲 删除类命令 d mention d 删除操作符 mention 对应操作符的操作对象 dw 删除到下一个单词开头 de 删除到本单词末尾 dE 删除到本单词末尾包括标点在内 db 删除到前一个单词 dB 删除到前一个单词包括标点在内 使用计数指定动作 2w 使光标向前移动两个单词 3e 使光标向前移动到第三个单词的末尾 使用计数删除 d number(数字) motion 撤销类命令 输入 u 来撤消最后执行的命令 输入 U 来撤消对整行的修改 CTRL-R 重做被撤销的命令 第三讲 删除的内容会被放入 Vim 寄存器 输入 p 将最后一次删除的内容置入光标之后。 更改类操作符 c [number] motion ce 从当前位置删除到单词结尾,然后进入插入模式 感觉 c 比 d 就多了一个删除完之后进入插入模式? 第四讲 CTRL-G 显示当前编辑文件中当前光标所在行位置以及文件状态信息 输入行号 + G(或 gg)跳转到对应行 / 查找字符串 ? 逆向查找字符串 CTRL-O 回到当前位置,CTRL-I 跳转到新的位置 % 查找匹配括号对 :s/old/new 替换光标所在行的第一个匹配,/g 替换全行的匹配串 :#,#s/old/new/g 指定行号之间 :%s/old/new/g 整个文件中的每个匹配 :%s/old/new/gc 提示是否进行替换,c 对应 confirm 第五讲 :! 外部命令 !rm TEST 删除文件 保存部分区域 v motion :w FILENAME :r FILENAME 当前文件中插入另外文件的内容 :r !ls 插入 ls 命令的输出 第六讲 打开类命令 o 和 O a 光标后插入 A 行末插入 R 连续替换多个字符 j$ 光标移动到下一行末尾 设置类命令 :set ic Ignore Case,忽略大小写。取消 :set noic /ignore\\c <回车> 一次查找忽略大小写 :set hls is hlsearch 高亮 incsearch 查找短语时显示部分匹配 第七讲 :help 参数 看指定参数的含义 CTRL-W CTRL-W 不同窗口切换 启动脚本 vimrc 文件 CTRL-D 列出可能的命令,TAB 命令行补全","link":"/note/vimtutor.html"},{"title":"vs code menus","text":"跟着 [[@如何提高编程速度:Emacs高手教授轻松精通所有编辑器和IDE的秘诀]] 过 VS Code 菜单的笔记,有些功能不看真不知道。 [[VS Code Menus/File]] Auto Save 可以打开,自动保存文件 [[VS Code Menus/Edit]] Find And Replace id:: 667326cf-0a8d-41ff-8547-b68b7f1e0b57 移动搜索框到下方,解决部分文件路径过长。"search.location": "panel" Advanced search options 中支持 glob syntax 语法指定搜索路径,具体用法见 Basic Editing in Visual Studio Code Toggle Comment 注释 id:: 66725943-fac6-4128-be3a-7b6d4a174567 Toggle Line Comment cmd+/ 单行注释 Toggle Block Comment 多行注释 [[Emmet]] Emmet is a plugin for many popular text editors which greatly improves HTML & CSS workflow. 前面是官网介绍,简单说是加快写 HTML 和 CSS 的速度 写前端重复代码时使用,现在前端框架不太依赖这些。 Emmet: Go to Matching Pair 实现从 tag 的开头跳到结尾 [[VS Code Menus/Selection]] 文本选择 shift + 方向键,以词为单位文本选择 ctrl + shift + 方向键 Expand Selection/Shrink Selection 选中从中心词往智能扩展/缩减选择区域,web 编程可以使用 id:: 66732c74-eb6d-420e-80a5-cd2c840ee84d Copy Line Down 在下方复制当前选中的行 Multi-Cursor [[Sublime Text]] 中的多行光标 id:: 66732e6c-43ed-41aa-8e0a-35c0b1002538 Add Next Occurrence 选中当前词的下一个词,每个词后面加一个光标。实现的部分功能可能和 Replace 重复 [[VS Code Menus/View]] Command Palette [[滴答清单]] 和 cmd shift p 有冲突 visual studio code - VSCode Command Palette (Ctrl + Shift + P) keyboard shortcut isn’t working on new installation - Stack Overflow Open view view 打开左侧或下面的面板 Source Control 源代码管理器 windows 系统支持按住 alt + 下划线对应的快捷键打开功能 Appearance Zen Mode 隐藏边栏,全屏 id:: 66733278-d445-4fbd-8353-3d368e3fe6d5 Primary Side Bar 左侧面板 Secondary Side Bar 右侧面板 Activity Bar Position 左侧几个大的图标 Zoom In/out cmd -/= 调整字体大小 Editor Layout id:: 66733451-cb08-4074-931e-fc45908c3c03 split Editor Down/Up/Left/Right 创建子窗口 Single 单列 three column 三列,默认不打开 Flip Layout 行列布局互换 其他 word wrap 软换行 show minimap 右侧代码视图 show breadcrumbs 文件地址面包屑,点击跳转 Render Control Characters 显示老式打印机对应的一些字符。 render Whitespace 查看隐藏字符 [[VS Code Menus/GO]] 跳转相关 Switch Group 和 Switch Editor group 对应子窗口 editor 对应group里面不同的 tab cmd + 数字 切换光标到不同的 group 其他 Go File 文件名模糊搜索 Back 返回 Last Edit Location 返回最后编辑 Go to Line/Column 跳到指定行 [[Go to Bracket]] 跳转括号 Peek 弹出窗口查看定义之类的,和 go to 对应。 Next/Previous Problem 错误之间跳转 Next/Previous Change 在没有提交到 Git 的改动之间跳转 Emacs [[git-gutters]] 支持模糊搜索改动,更加使用 Debug 建议使用语言对应的第三方调试器 Terminal run task Help Documentation 跳转到文档 Open Process Explorer 打开进程管理器","link":"/note/vs_code_menus.html"},{"title":"@多目标排序在快手短视频推荐中的实践","text":"链接:多目标排序在快手短视频推荐中的实践 (qq.com),郑东,快手推荐算法技术总监 想法 分享主要内容是排序机制和重排,还看不太懂。 摘录 用户反馈 隐式正反馈 显式正反馈 隐式负反馈 显式负反馈 多目标精排 手工融合和简单模型融合 多个预估值融合成单一的排序分 树模型规则 ensemble 融合 利用特征得到组合 label 上下滑无负样本,通过拷贝正样本实现对目标无偏估计 RuleFit,用树来做打分规则 超参 Learn To Rank dnn 拟合组合收益,通过学习线性加权的超参数去拟合最终组合收益 photo_top,24维,各种个性化预估值 user_top,24 维,用户特征(比如对用户划分不同的时间窗口:过去1分钟、5分钟、15分钟、…、2小时,每个时间窗内,对推荐给他的视频,根据用户的反馈拼接成一个向量,这些反馈包括有效播放、点赞、关注、分享、下载、观看时长等,最后,将各时间窗口对应的反馈向量和ID类特征一起输入到用户侧网络。) 端到端Learn To Rank pointwise 更复杂特征和网络结构,模型表达力更强。 pairwise 样本构造,一次请求 6 个视频,针对每个目标都构造偏序对 dnn 打分,sigmoid 变换,交叉熵损失产出 loss sij=σ(si−sj)losslikeij=yij⋅log(sij)+(1−yij)log(1−sij)\\begin{gathered}s_{i j}=\\sigma\\left(s_i-s_j\\right) \\\\ \\operatorname{loss}{ }_{l i k e}^{i j}=y_{i j} \\cdot \\log \\left(s_{i j}\\right)+\\left(1-y_{i j}\\right) \\log \\left(1-s_{i j}\\right)\\end{gathered}sij=σ(si−sj)losslikeij=yij⋅log(sij)+(1−yij)log(1−sij) 不同目标 loss 线性加权,从而兼顾多个目标的权重 效果上看做对不同目标的 auc 加权求和,auc 本质上是一个偏序的关系。 复杂多目标:Ensemble Sort和在线自动调参 Ensemble Sort 常规加权融合有问题 个子项分内做 Normalize 优化,把子项分转化为序,再转化成一个分数。 在线自动调参 离线学习 Learn2Rank 在线自动调参 CEM {:height 171, :width 290} 噪声 重排序 Listwise Rerank 上下滑场景采用 rerank 可以获得组合收益,如果排列用户喜欢和不喜欢的视频,可以提升用户浏览数量。 离线评估,左边表格,做 transformer 后推荐结果的 auc 和 dnn 基线,下图位次增加 auc 逐渐提升 强化学习 Rerank 贪心选择,LSTM 建模前序特征 策略梯度, [[GAE]] 使用仿真器训练 on-policy 训练更加稳定 [[端上重排]] 端上网络结构使用 [[TFLite]] 模型特征和结构 Transformer 建模用户实时反馈和各种序列 总结和展望 帕累托最优","link":"/note/wx_MzU1NTMyOTI4Mw.html"},{"title":"@基于超网络的实时可控重排模型","text":"链接:淘宝推荐场景的利器:融合复杂目标且支持实时调控的重排模型 如何灵活调节多目标之间的权重。 对应论文:[[KDD/2023]] Controllable Multi-Objective Re-ranking with Policy Hypernetworks 摘录 动机 强化学习的 reward function 由多个指标线性加权求和得到,加权参数 w 代表对各个目标之间的倾向。 动态指定 preference weights,给定任一一个 w,都能生成最好的序列。 准备多套 w,对应不同的业务目标。 方法 核心 Hypernet 和 conditional training 预测 根据用户 和 candidate item 信息实时指定 w,Hypernetwork 根据 w 生成参数给重排模型(DNN 最后几层的 w 和 b)。 图中重排模型黄色参数对 w 敏感,蓝色参数对 w 不敏感。 训练 每一个 sample 或 batch 从事先指定的 distibution 中随机采样一个 w。 重排模型生成序列给 evaluator 评估,reward 转化成一个 gradient,同时更新 hypernet 和重排模型相关的参数。 结果 a x 轴点击 utility 的权重,y 轴是线上真实回收出来的样本的点击平均值。 蓝色折线真实值,橙色一次拟合。 utility 权重增大,点击率明显上升。重排模型能够依据给定的 w 生成不一样的序列。 b 冷启内容占比 c 店铺多样性 d 组间排序的 utility,表示来自不同 group 的内容,大致要按照 group 的优先级排序。 右边是 ab 结果,实验方案线上超参调节,指标有提升。","link":"/note/wx_MzU1NTMyOTI4Mw_2.html"},{"title":"@重排序在快手短视频推荐系统中的演进","text":"链接:渠江涛:重排序在快手短视频推荐系统中的演进 (qq.com) 想法 值得一看,混排强化学习那部分设计还不是很熟悉 端上重排,如何拆分模型部署在服务器和端上 摘录 快手推荐环节 序列重排 重排需要解决的问题 整个序列的价值并非单 item 效果的累计,如何使得序列价值最大化; 沉浸式场景中,什么是好的多样性体验,业务意志如何体现; 同一个场景下越来越多的业务参与其中,如何恰当地分配流量和注意力,达成业务目标和整体最优; 如何更加及时、更加细微地感知用户状态,及时调整我们的推荐策略和内容。 generator-evaluator 范式 generator 从 top50 中生成模式丰富的序列类型 然后使用 evaluator 评价召回的序列整体价值 序列生成 通过协同采样生成多序列,采样过程从原理上来讲是不断地逼近 Pareto 最优曲面,进而得到不同的采样点,形成不同的序列。 [[Rerank/Evaluator]] 三个业务目标 单向 Transformer (用户自上而下刷视频,下游视频对上游视频没有增益),也可以降低复杂度,提升模型稳定性。 序列混排 Base 方案 混排问题定义:将各个业务返回结果恰当地组合,得到社会综合价值最大的返回序列。 LinkedIn 优化目标 在用户价值体验大于C的前提下最优化营收价值 base 方案的问题 混排 listwise 方案 跨域转化模块,广告和自然内容是跨域的 广告内容多任务预估,利用左侧短视频信息和 context 信息校准广告 ctr 和 cvr 等指标 混排 RL 方案 目标:长期体验和近期收入平衡 状态、动作、回报 [[Duel DQN]] 首先,V网络评估用户当前的满意程度,这使得模型可以在不同的用户状态下选择不同的放置策略。但由于放置策略十分离散,它的解空间相当大,那么我们需要对离散空间 dense 化。 我们的 dense 化不是通过模型去做的,而是通过之前使用的重预估监督模型来实现。通过监督模型,我们就可以知道这个 action 下每个位置放置的内容可以带来多少的用户体验和商业价值。 之后,我们可以使用一个神经网络对不同的 action 进行打分。 我们的优化目标是每一步选择能够达到最终的总和价值最大,reward 是长期价值和近期价值的组合。 两段式训练范式 首先,使用 online policy 的方式,先将模型部署上线生成 online policy 下的数据,作为 off policy 的训练数据放入回放池。 之后,使用 off policy 来训练 Dqn 模型。 端上重排 需要解决问题 实时感知 实时反馈 千人千端 算力分配 端上重排架构 千人千端 Ref 读《重排序在快手短视频推荐系统中的演进》有感 - 知乎 (zhihu.com) 评论区 qujt08 感觉是快手员工?","link":"/note/wx_OTyEbPCBh1NHogPM7bBtvA.html"},{"title":"@淘宝推荐场景的利器:融合复杂目标且支持实时调控的重排模型","text":"链接:淘宝推荐场景的利器:融合复杂目标且支持实时调控的重排模型,王原博士,淘宝 想法 整理一下他们发在外部的分享,在内部 ATA 上分享的内容更加详细。 摘录 业务场景 淘宝关注页面推荐 复杂信息面临的挑战与重排的独特优势 利用重排模型替代部分业务规则 但是重排模型后面还会有硬性用户体验规则限制,不满足时会丢弃重排的结果。 重排范式 V1 部分 Context 感知 + 单点打分 + greedy 排序 V2 逐步选取 item 问题 监督学习方式需要有 label,生成每一步时都需要最优选择作为 label。 比如有多种内容供给、多种目标、多种业务需求情况下,如何知道最优序列是什么呢? V3 强化学习 利用 reward 替代 label,而且无需可导。 序列一般会用 ndcg 来评估,该指标不可导。 有机融入多目标的重排模型 问题定义 U 是业务目标,w 是目标权重 Lw* 是 reward 最大的序列 利用 actor 训练能生成逼近 Lw* 的序列 {:height 583, :width 1021} 序列生成器 Encoder + Decoder 结构 [[DeepSet]] encoder,建模 item set 集合(与 item 顺序无关),用 user + set 信息,重新生成 item embedding Pointer Net + RNN 生成序列,与输入序列的长度无关。 rnn 的 output 作为 key 计算过程中 mask 不能选择的 item local context enhanced attention,通过特征工程和人工规则降低模型学习难度 item embedding 和 state 针对 state 和 item 的 local context 第一个特征是目前为止冷启内容的占比是多少 第二个是当前这个 item 在前序有没有重复,帮助重排模型做好店铺打散。 通过一系列加工的特征可以帮助模型快速捕捉业务意图。 序列评估 中间五个模块(sum pooling、forwar&concat、multi-head self attention、RNN、Pair-wise comparison)从不同角度提取 list 特征输入到 mlp 预测。 比如用户会不会点击这一页上的任意一个商品或者点击数是多少 模型训练 evaluator 常规 loss,训练是否页面有点击之类的。 充分训练后固定模型,再去训练 actor generator REINFORE based Algorithm LG=−(Rw(G(u,C))−Rw(Lexposure ))log(P(G(u,C)))L_G=-\\left(R_w(G(u, C))-R_w\\left(L_{\\text {exposure }}\\right)\\right) \\log (P(G(u, C)))LG=−(Rw(G(u,C))−Rw(Lexposure ))log(P(G(u,C))) reward = 当前序列 reward - 线上序列 reward,让模型能生成优于线上的序列 给定 user 和 candidates,计算 generator 生成这个序列的 probability,reward 高的序列应该有更大概率生成。 下图例子,每一列是当前选择 item 的概率,连乘再一起就是生成当前序列的概率。 论文中有如何设计将业务目标融合到模型中 @基于超网络的实时可控重排模型 问答 Q9**:重排使用精排模型的分数,后续精排模型迭代的问题怎么解决?** 精排模型通过校准把预估的点击率锚定到真实点击率含义上的那个物理值去,保证这个预估值到达重排模型的时候是稳定的。 Q13**:重排模型的离线指标看什么?** 获取到的 evaluator 的 reward,还有一个指标是 better percentage(生成重排序列 reward 由于线上展示序列的概率,>= 50%)","link":"/note/wx_fbd846a2ccafcfb4304057c67681f86ea9a3a51e7e7f67064a1b27909e9f89c63b54c9274877.html"},{"title":"@从笔记法到知识管理","text":"链接:从笔记法到知识管理 (qq.com) 想法 这几年有很多人提数字花园、常青笔记,但是看到好的实践却非常少。读徐颖的文章,能看到对于一个主题持续的思考,也能看到他自己大量文章之间不停的关联。 回想自己,记录的东西已经非常多,光是 logseq 里面都有 7k+ 的笔记。但是存在一些问题: 记录的质量不高,比如徐颖讲到的基于[[@如何阅读一本书]]设计出来的读书笔记模板,而自己的读书笔记大量都是没有整理的高亮内容。 分享出来的太少,今年开始已经通过脚本定期把一部分笔记发不到自己的博客上,还需要尝试通过去写一些主题笔记,将这些碎片笔记串联在一起。 摘录 2019 年尝试对一切思考和体验写笔记。 从2021年年初开始,连续三年,笔者在个人长期职业发展兴趣栏位都明确写了:利用知识管理提升团队生产力。 读书笔记模板 本章概述,用几句话概括内容; 本章读后感,用几句话概括个人感受; 摘录本章中你最赞成的观点并说明为什么; 摘录本章中你有疑问的观点并说明为什么; 摘录本章中你最喜欢的故事并说明为什么; 实践并分享本章的建议或练习。 个人知识管理也有新的方向。 今年的要求之一是宁可阅读速度慢下来,也要及时整理书评、影评、游记,写有价值的、真实的内容。 要求之二是统整之前的笔记,保持目前以年份和月份构建的文件夹目录,以通用的书名、影片名或地名为标题,另外取宣传名来概括内容。 从笔记法到知识管理和作者其他文章之间的关系","link":"/note/wx_o0frUpRNdkKQ-yaUk9onlw.html"},{"title":"@纯文本生产力方案探讨","text":"链接:纯文本生产力方案探讨 · 雅余 · 茶余饭后,闲情雅致 (yayu.net) 想法 从 [[Jtalk 废话集]] 发现这篇文章的链接。任何“生产力”与任何工具或格式无关,与你的规划、你的结构、你的逻辑排列组合关系有关系,而且是强关系。关键是在于 —— 今日事今日毕,更加考究自身的 目标/目的 感和以结果为导向。 之前也尝试过一些纯文本任务管理探索,到头来认识到这可能只是一种看起来更酷手段,和生产力没有太直接的关系。yayu 在文章最后给出自己的模板,感兴趣可以参考一下。 摘录 2008 年 Daniel Lucraft A Plain Text Personal Organizer - Daniel Lucraft (danlucraft.com) 单个大文本文件记录 One Big Text File (OBTF) 纯文本日历和日志记录方式 以月为一组,固定格式日期开头,每天一行文本记录当天的重要事情。 1234567May02/05/08 Fri | Z birthday03/05/08 Sat | Horsham?23/05/08 Fri | Mr. M bday24/05/08 Sat | H's Wedding!25/05/08 Sun | m away28/05/08 Wed | my birthday! The 80 char diary,每天用 80 个字符总结,一年共有 365 行。 12345| The 80 char diary |80419s |First week done! Nice weekend at home now. |80418f |Machines arrive, but can't get Ubuntu working. Hacker meetup, second time round!|80417t |More wrestling with MySpace. |80416w |Third day at SK. Wrestling with bastard MySpace OAuth, got it working. 2022 年 Jeff Huang @My productivity app is a never-ending txt file meet with 记录开会 #关键词 定位 Soren Bjornstad 从 09 年开始在 Random Thoughts 分享思考内容。 对于新生的软件工具,我只会大致的试用,了解技术的发展就适可而止了。利用倒腾软件工具的时间,把数据在各个软件间搬来搬去的时间,可以去多读几本书,多出去散步拍照。通过纯文本生产力的持续探索,我在 Obsidian 和 VS Code 所使用的插件也减少到寥寥无几。","link":"/note/yayu_net_4140.html"},{"title":"yjango@学习观","text":"链接:YJango 学习观,专栏导图 - 知乎 (zhihu.com) 想法 第一季是 Yjango 从机器学习角度讲解如何学习,二三两季开始将生命演化相关内容,挺有有意思的,可惜现在基本接近于烂尾。 第一季是 Yjango 从机器学习角度讲解如何学习。第二、三季将智能体演化,挺有有意思的,可惜现在基本接近于烂尾。 学习观的方法论 交叉验证,通过机器学习理论对众多心理学理论进行筛选 从生命最初的演化进行梳理 从“为何学习”到“如何学习” 第一季 01 好多人一辈子都没搞清楚什么是学习 记忆与学习的区别,用规律来换取信息的压缩 学习不是记忆 [[01.5 为什么有人擅长文科,有人却擅长理科]] 02 为什么学习要“先把书读厚,再把书读薄” 通过例子理清问题和答案的关系,读厚是学习大量的例子,读薄是总结出模型。 记住知识的描述无法使用知识 知识不是信息 03 十年学不会英语?其实你早就学会了“英语” 明确输入和输出 [[思考类知识]] [[运动类知识]] [[知识的分类]] [[04 为什么你解题时毫无头绪]] 如何解决思考类问题 [[04.5 你以为这些“学习方法”是从教育理论而来?]] [[05 思维导图原理:人生与高手之差]] [[05.5 如何设计自己的思维导图画法?]] [[06 终极学习方法]] [[费曼技巧]] [[07 我们十几年的外语教育方法几乎全错了]] 运动类学习 第二季,从学习的视角来观察自然生命历史 [[08 为什么人类无法感知真实世界]] 感知与真实 对真实的采样信号 -> 模型 -> 大脑中得到的认知 学习是为了更好的构建模型 [[09 标题党是如何用这些招数把你当宠物诱骗的]] 建模欲望 什么是好奇心? 阻碍好奇心的因素 [[10 老师,我没有传纸条作弊,我在学习信息论]] 什么是信息 生命本身以及整个人类社会的发展底层离不开两个概念:信息与能量 熵、信息 信息的心智 [[11 为什么信息还有单位?如何计算信息量?]] 通过质量物理单位的定义方式,理解信息的单位定义。 [[12 阻碍人类永生的原因是?]] 时间之矢 [[热力学第二定律]] [[麦克斯韦妖]] 生命是什么? [[兰道尔原则]] 信息熵和热力学熵的转化关系 [[13 若想造出人工智能生命,至少需要满足这五个条件]] 信息与智能 [[14 地球所有生命源于同一始祖?它靠什么演化成各种高级生物的?]] 人类为什么不能永生?为何死亡是被写进 DNA 的代码? 第三季 [[15 为什么人类没有演化成过目不忘?]] 记忆如此重要,为什么人类没有演化成过目不忘? 为什么要靠不断重复来记忆? 为什么记住的信息会被遗忘? 为什么我们的记忆还会混淆信息? [[15.5 遗忘是为了更好的学习]] 记忆、学习 泛化能力、过拟合 查找记忆和网络记忆 学习中的遗忘、学习后的遗忘 [[15.6 如何背台词]] [[15.7 昨夜想到个绝妙点子,想明天试下,结果。。猜到了吗?]] 循环神经网络 记下自己的点子 [[15.8 你们天天制造知识恐慌,应该自己吃掉自己的脑子]] 为什么用熟悉、掌握、精通来描述技能? 描述每个人所构建出的模型的泛化能力 为什么你打三年的游戏都没成为职业选手? 机器学习中模型的模式 更新模式,学习 预测模型,应用 打游戏刚开始在学习,之后知识应用。 为什么听了那么多道理,依然过不好这一生? 学习从“不能”到“能”的过程 完全看懂每个细节,基本上实在使用预测模型,根本不会学。 如何克服知识恐慌 知识不是信息 无法使用的信息,会被快速遗忘。 知识的学习是模型的构建 知识是筛选出来的 科学家才是知识的制造者 [[16 性与杀戮改变了所有生物的轨迹?六亿年前到底发生了什么?]] 神经细胞如何实现稳定连接和信息交流? 神经细胞是如何调整频率产生想要的感知和运动? 神经网络学习 [[16.5 新冠病毒的自我修养:如何统治全人类]] 生命维持自身不变的代价就是加剧环境的熵增。 第一寄生法则 相互制约以达成生态平衡 第二寄生法则 群体合作 [[17 为何你知道该做什么,却始终难以行动?毒品上瘾时,大脑中发生了什么?]] 知易行难 动机系统驱动我们所有的行为,理性无法越过动机系统做决定。 一次意外,我来到了世间,我走出虚无,睁开了双眼,起初是恐惧(情绪 emotion),耀光(感觉 sensation),噪音(感知 perception),寒冷(感知 perception),随后又是恐惧(情绪 emotion),我可以感到自己颤抖的双手,跳动的心脏,生命在我的血液中流淌,我想活下去(动机 motivation) [[17.5 是什么要素让一个科幻变成赛博朋克的?]] 对自我存在与自我价值的重新思考 18 打游戏上瘾 [[18.5 素质教育为何十年都没改革成?]] 知识争论 用强化学习方法分析当前教育模式 教育体制改革难,是因为它主要不是教育学问题,而是社会学问题。 [[19 被现代隐形人猎杀,你能活下来吗?]] 感知是什么? Ref 如何评价知乎用户 YJango 的公众号? - Serika Onoe 评价","link":"/note/yjango_learning.html"},{"title":"01 好多人一辈子都没搞清楚什么是学习","text":"课程笔记: YJango@学习观 记忆 容量有限,难以集齐 学习 找出知识,压缩信息 不同领域对[[学习]]的定义","link":"/note/yjango_learning_01.html"},{"title":"02 为什么学习要“先把书读厚,再把书读薄”","text":"课程笔记: YJango@学习观 学习 ≠\\neq= 记忆 知识 ≠\\neq= 信息 例子和知识 学习步骤 明确问题和答案 用例子构建知识 验证知识有效性 [[学习原则]] 明确任务输入输出 例子重塑大脑连接 二阶知识拆分知识","link":"/note/yjango_learning_02.html"},{"title":"03 十年学不会英语?其实你早就学会了“英语”","text":"课程笔记: YJango@学习观 [[思考类知识]] (依赖意识) 数学 逻辑 [[运动类知识]] 语言 运动 讲英语时,如果一直调用思考模式在脑中不断根据语法来造句,说话会非常慢,如果加上中文作为中间思考的话,则更是慢上加慢。 错误的学习方式? 错误的输入输出 文字到文字 错误的学习方式 语法 中文意思 不用例子学习 英语学习误区 统一变成文字到文字的学习 听:声音到意思 说:想法到发声 读:文字到意思 写:想法到打字","link":"/note/yjango_learning_03.html"},{"title":"@如何评价yjango的《学习观》系列?该如何改进?","text":"链接:如何评价YJango的《学习观》系列?该如何改进? - 知乎 想法 年初看完 YJango@学习观,当时觉得用机器学习的理念去解释学习挺新颖的,不过后来太忙也没有思考怎么根据他的方法改进自己的学习。 折恩的回答从认知科学角度批判学习观中的错误,让我意识如何从科学角度去理解学习、记忆、知识这些基本的概念。学习观的学习看起来很像模型训练的过程,折恩指出只是归纳学习,豁然开朗。另外,指出的缺点还有不成体系,信息模糊。看起来还是要多学习,才能进行批判性思考。 大部分讨论的内容属于形而上的问题,还是去实操吧。 折恩的回答 通过研究检验理论假设是否成立。 如果理论假设没有获得研究结果的支持,那么该理论需要重新审核并做出必要的修正。 回答的核心 (a)客观上,《学习观》对「学习」的定义是「归纳学习」; (b)《学习观》不成体系; (c)《学习观》的信息模糊,很容易引发争议; (d)《学习观》对于「知识」的理解也是错的 避免被带偏的方法 「他究竟想要表达什么?」 「他表达的内容,重要吗?」 「这对核心问题的讨论是否有帮助? 对学习错误的认知,反驳学习观 01 01 好多人一辈子都没搞清楚什么是学习 中定义:学习是从有限的例子中,找出问题和答案之间规律的一个过程,而所找出的规律叫做知识 这个定义只是 [[归纳学习]],几百年前哲学讨论中,就被认定为片面的理解。 学习观定义的反例 「爱因斯坦用理论推导出了相对论」「爱因斯坦用理论猜测上帝粒子的存在」 没有观察到规律,只是用理论推导出全新的理论。 观察学习中的波波玩偶实验,儿童观察一个榜样(专业名词)对一个玩偶进行攻击,儿童有很大的概率会学习榜样的攻击行为,也对玩偶进行攻击。 对学习错误的认知,反驳学习观 02 02 为什么学习要“先把书读厚,再把书读薄” 最终的学习一定要通过例子理清问题和答案的关系来重塑大脑连接 学习是为了解决新问题,所以验证从现有例子中所提炼的知识,是否能描述问题和答案的真正规律,而不是仅仅记住了这些例子 「通过例子来学习」确实是一种好用的学习方法,但不是唯一的方式。 学习观并不成体系 YJango 用人工智能比喻人类大脑,最早可以追溯到上世纪 60 年代[[信息处理理论]] 经典的信息处理模型 {:height 188, :width 410} 最新信息加工模型,Radavansky&Ashcraft,2014;Schunk,2016;Sternberg&Sternberg,2012 学习是[[认知科学]]讨论的重点之一 对知识的理解也是错的 01 好多人一辈子都没搞清楚什么是学习 找出的规律叫做知识 知识不只有找规律 03 十年学不会英语?其实你早就学会了“英语” 知识的构建分为两大类型,运动类和思考类。区别在于是否依靠意识,因为意识是后进化出来的,擅长解决的是推断问题,但速度缓慢。 学习误区: ① 学不会的原因都出在错误的输入和输出,甚至不知道输入和输出是什么;[[明确输入输出]] ② 很多人一生都在用思考类方式来学习所有知识; ③ 不通过例子,仅记忆知识 对 [[明确输入输出]] 的反驳 例如社会认知论,儿童观察一个榜样(专业名词)的攻击行为,如果榜样没有受到惩罚。那么,儿童有更大的概率会模仿榜样的攻击行为,对玩偶进行攻击。在这个过程中,儿童模仿学习了榜样的行为,并没有所谓的「明确输出」。 还有「要明确输入输出」无法解释「顿悟」现象。例如看一本书、看一部电影,突然想通了某件事。 关于「很多人一生都在用思考类方式来学习所有知识」 在学校学习的内容大多数属于[[程序性知识]],例如解数学题、总结信息、略读文章等,即多数学习活动都是程序性知识。 [[程序性知识]] 关于如何实时认知活动的知识,以言语密码和意象的形式存储在记忆网络中,其存储方式与陈属性知识的存储方式相同。 《学习观》很容易让人有受益良多的错觉 通过 [[把自己学到的新东西写下来]] 来判断有没有收获 学习不是记忆其实是[[学习不是死记硬背]] 学习和记忆相互联系、不可分割 「延迟模仿」。学习者通过观察模仿获得的新行为,有时会在观察完成一段时间才出现,这个现象叫做「延迟模仿」。 「延迟模仿」现象表明,学习过程可以包含对信息的存储和延后表现(也就是学习包含记忆)。 学习的分类 [[机械学习]] 死记硬背 [[意义学习]] [[接受性意义学习]],外界的信息主动传输给我们,我们理解并且接受信息。像传统的学校课堂,如果我们理解了老师讲述的内容,就属于「接受性意义学习」 [[发现性意义学习]] 我们主动探索发现,去归纳、推演,从而学到新的知识。 其他相关 [[Paul Graham]] 的 [[反驳金字塔]],快速判断互联网上的言论属于什么水平。 红鲱鱼(The Red Herring) 将言论引导到,看似相关、实则与争论话题无关的内容上,从而转移观众或读者的注意力,让言论偏离讨论的真正核心","link":"/note/zh_343396567.html"},{"title":"@厉害的 acm 选手一定是优秀的程序员么?","text":"链接:厉害的 ACM 选手一定是优秀的程序员么? - 知乎 (zhihu.com) 想法 paradisor 回答 你知道Google从成立开始为什么一直都很喜欢招博士么?不是因为说博士都是好码工,相反,很多读了博士的人反倒常年没怎么写代码,单论代码水平不一定真的比本科硕士好。 Google招博士的逻辑是:==一个人如果在一个领域里面做出过实质性的成就的话,那在别的领域成功的可能也会变大。==因为他知道怎么克服困难,知道怎样的努力才能成功。 ICPC也是类似的道理,不是说你ICPC打得好就进公司自动成为高手了,而是如果你知道怎么在ICPC成功的话,进公司想要成功不见得比ICPC难多少。","link":"/note/zh_354691424.html"},{"title":"圣弗朗西西利亚蒂@谈zettelkasten","text":"链接:卡片笔记写作法是否被过誉了? - 知乎 (zhihu.com)、卢曼笔记法(卡片盒笔记法,Zettelkasten)真正正确的实践是怎样的? - 知乎 (zhihu.com) 想法 卡片笔记写作法是否被过誉了? [[@How to Take Smart Notes]] 介绍受卢曼卡片法影响重新发明的一种笔记法,笔记方法可能对写作有帮助,而不是直接为了写作。 [[文献笔记]] 对应英文 Bibliography 目录,记录资料来源,以便下次使用时快速找到原始资料。 卢曼笔记法(卡片盒笔记法,Zettelkasten)真正正确的实践是怎样的? 其他两种方法 康奈尔笔记法(面向知识积累,也可以辅助记忆) 卢曼笔记法写上卡片的内容,对应康奈尔笔记法中的概要 空雨伞笔记法(面向解决问题,也可以辅助沟通) 在学习比较系统和复杂的学科时,例如通过领域经典教科书学习,接触到的知识往往是树状结构,但 Zettelkasten 又提倡以链接为主的网状结构?该如何做笔记,学习效率才最高呢? 课本教材、以及绝大多数非虚构非叙述类的书,都是“树状结构”。这种结构,是一种「描述结构」,或者说「表达结构」,或者说「输出结构」。「输出结构」仅仅只是为了传递的方便,那不是知识本来的模样。 真正的知识是网状结构。 卢曼本人的卡片大致分两个时期,第一个时期大约有11年,第一时期的编码是不规范的,到第二时期才形成他自己的规范的“数字和字母交替”,斜杠前是事前规划好的,斜杠后是事后生长出来的。 节点之间由编码确定关系,和节点里的内容的概念层级是没有关系的。 例如,已有这样一些卡片: 1生物,1.1猫,1.2狗,1.2a中华田园,1.2b哈士奇,1.3人,2矿物,2.1煤,2.2金…… 然后新写了一张卡片,“动物”,尽管它的概念层级处于“生物”和“猫”之间,但它的编号是不能代表它的概念层级的,只能作为“1.1猫,1.2狗,1.2a中华田园狗,1.2b哈士奇,1.3人”的兄弟节点,或者某一个的子节点,因为这些节点的父节点已经被占据了。于是,它的编号有可能是1.4,有可能是1.11,有可能是1.2c,有可能是1.2b1,取决于你第一时间是因为哪个节点得到了这个新概念。 事实上,人类探索和发现新知识的真实过程就是这样的,而不是像教材上安排得那样明明白白。教材、以及任何一种外部资料的清晰结构是没有办法直接整个嵌入大脑的。 卢曼卡片三要素 [[Antinet Zettelkasten]] 编码机制Folgezettel 链接无法替代编码机制,链接替代 index 的一部分作用 数字 + 字母的编码方式提供无限可能,知识网络可以生长 给卡片提供一个物理位置信息,可以在多年以后向你解释为什么会有这张卡片。 一开始的那个物理位置信息,是始终不变的。多年以后,你可能想不起这张卡的关键词,这张卡也可能没有再和别的卡片建立链接,但你清晰的记得一定有这张卡,你现在需要这张卡。如果这张卡有物理位置信息,人脑里会回忆起环境信息,回忆其它的父节点或者兄弟节点,你可以通过搜索或者索引找到它的父节点,从而找到这张卡。人脑的工作原理,环境信息无比关键。 编码有直觉上的美感。 参考reference/see also 被误解成引用 索引index 被误解为关键词 围绕某个话题写新的卡片,将之前分散在这个地方的卡片连接在一起。 使用卡片的两个原则 原子化 指把想法尽量分解到最小单元。分解到越小,越方便连接,越有可能产生创新。 纸质卡片受限于物理容量限制,客观上只能原子化。使用笔记软件需要额外注意。 例子 普通卡片1:07.1 卡片结构的三个要素 普通卡片2:07.1e 实施卡片法的原则 索引卡片:07.2b4 index 数字化卡片法 卡片法的“文献笔记”,是错误理解 卢曼本人的卡片,主要有两类箱子(盒子,物理容器)和三种卡片 两类箱子 普通卡、索引卡是放在一起 卡片法最核心的是包含「普通卡」和「索引卡」的那一类箱子。当卡片数量过了临界值时,会体现出一定程度的独立性,类似一个你亲自训练出来的助手,访问卡片就是与助手交流。 书目卡 「书目卡」的箱子是相对次要一些的,只是一个指针库。你可以认为它属于卡片法的附属部分,也可以认为它不属于卡片法。 三种卡片 (a) Notizzettel普通卡 (b) Bibliographiezettel书目卡 列出已经处理过的书 书目卡将分散在每张卡片上的参考集中在一起。 © Schlagwortregisterzettel索引卡 什么情况下添加链接 不做 wiki","link":"/note/zh_473841271.html"},{"title":"@我的知识笔记系统(基于anki)","text":"链接:我的知识笔记系统01——答怎样构建自己思维框架形成知识体系 - 知乎 (zhihu.com) 想法 工具不重要,方法才是问题的关键。 提供一种增量阅读的思路,不断把导入的内容改写成卡片。读到不懂的地方,暂停阅读,等卡片复习到相关概念后,继续阅读。 摘录 Anki 截图 增量阅读 我的知识笔记系统02-anki增量阅读之课程制作方法 - 知乎 (zhihu.com) 用 wps 将 pdf 转化成一页一图片,导入 anki 中。 步骤一:建立目录及框架。建立两个deck,分别为导入的书籍的deck以及笔记记录部分的deck 初始化 阅读过程 拆页写笔记,精读过程。原文拆分为概念、例子、定理、解释和讨论、证明过程、参考位置、示意图等部分,尽量将其按逻辑细分。 利用画图软件剪切原始的段落片段,改写成卡片。原始图片只保留未读的内容,类似于阅读进度。 原始材料拆分成多张卡片 如果读到某一部分理解不了,一般是对概念还没有熟练掌握,这时我会停一段时间。利用这段时间anki会帮助我不断重复对这个概念的理解,等到合适的时机之后再继续推进(一般需要1-2个星期)。如果内容已经比较熟悉,比如之前已经读过另外一个版本的著作,则可以跳着看,主要是要先相同和不同,对相同的部分主要是补充搜集数据,对不同的部分则需要对比着看差异。 类似于费曼的阅读方法,一本书从头开始看,看到不懂的,再从头开始看,一直重复直到看完。 维护目录,撰写读书笔记卡片,通过简短的文字、图表等对内容进行输出 通过 AnkiConnect 插件建立不同内容之间的关系 通过卡片索引可快速定位原卡片 拆散目录,完善连接关系 阅读即复习 同一个知识点引入多少个角度的解读。 添加笔记时对前面的知识点进行重新归类和优化 = Anki 复杂笔记例子1 Anki 复杂笔记例子2 Anki 复杂笔记例子3 Anki 手写笔记 儿童使用 Anki 学习各种知识,先帮帮忙制卡,后续一起制卡。 Supermemo 增量阅读 绘本阅读","link":"/note/zh_651179506.html"},{"title":"字节@漫谈时间序列预测","text":"链接:https://zhuanlan.zhihu.com/p/486343380 模型优化目标为 MAE 时,整体的预测就会比平均值小。部分业务预测偏小跟预测偏多造成的影响是不同的。一般会参考整体的预测偏差,进而使用一些非对称 loss 来进行具体优化。 交叉验证 在时间维度上做前后的 split [[传统时间序列预测]] [[ARIMA]] 对 AR 部分的残差做移动平均 [[Python/package]] pmdarima,通过 AutoML 手段来自动搜索参数 [[Prophet]] [[时间序列预测/问题]] 对于时序本身有一些性质上的要求,需要结合预处理来做拟合,不是端到端优化 需要对每条序列做拟合预测,性能开销大,数据利用率和泛化能力堪忧,无法做模型复用 较难引入外部变量 多步预测能力比较差 机器学习方法 基于训练窗口的信息来构建特征,转化为表格类预测问题来求解 [[Feature Engineering/Time Series Feature]] tsfresh 自动特征工程 模型选择 自动参数优化 Optuna 或 FLAML NN 优势 通过 embedding 学习类别变量 loss 设计更加灵活 [[Tabular Data]] local 模型和 global 模型取舍 local 方法每一个序列都要构建一个单独的模型来训练预测 global 使用所有数据进行训练 例子 股票中科技股的趋势和银行股的趋势明显不同 深度学习方法 思路 充分使用多层级维度的信息 只使用原始的序列和其它相关输入信息,基本不做特征工程,希望通过各类模型结构自动学习到时序的隐含表达,进而做到端到端的预测输出 与机器学习方法对比: 机器学习方法一般模型部分处理会相对简单,但涉及到的预处理,特征工程及后处理方面会比较复杂。 在整理 pipeline 层面会相对简单,更提倡 end-to-end 的训练,但模型部分则相对复杂和难以优化。 [[Seq2Seq]] [[Web Traffic Time Series Forecasting 1st place solution]] [[@WaveNet: A Generative Model for Raw Audio]] [[空洞卷积]] residual connection skip connection 门机制 CNN 结构缺乏[[位置编码]]导致对于序列问题预测效果不如 RNN [[LSTNet]] 效果不如特征工程 + fastai 效果好 [[DeepAR]] #mark/paper #时间序列专题学习 输出概率分布 [[quantile regression]] ngboost LightGBMLSS 等库在 GBDT 模型上实现概率预测输出。 亚马逊开源时序预测库 gluon-ts [[N-BEATS]] 单变量时序预测,具有一定的 seasonality,trend 的可解释性 #mark/paper [[@Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting]] 与树匹敌的深度学习模型 #mark/paper [[Gated Residual Network]] [[Variable Selection Networks]] 特征变量选择网络,类似于树模型做特征选择 [[TabNet]] [[NODE]] 也有这种模拟决策树行为的设计 输入特征的系统化设计, 静态类别/连续变量 动态已知类别/连续变量 动态未知类别/连续变量 [[Pytorch Forecasting]] 实现 12345678910111213141516training = TimeSeriesDataSet( data[lambda x: x.date <= training_cutoff], time_idx= ..., # column name of time of observation target= ..., # column name of target to predict group_ids=[ ... ], # column name(s) for timeseries IDs max_encoder_length=max_encoder_length, # how much history to use max_prediction_length=max_prediction_length, # how far to predict into future # covariates static for a timeseries ID static_categoricals=[ ... ], static_reals=[ ... ], # covariates known and unknown in the future to inform prediction time_varying_known_categoricals=[ ... ], time_varying_known_reals=[ ... ], time_varying_unknown_categoricals=[ ... ], time_varying_unknown_reals=[ ... ],) [[@Efficient Automated Deep Learning for Time Series Forecasting]] #mark/paper 没有能大规模应用的深度时序模型 [[@Do We Really Need Deep Learning Models for Time Series Forecasting?]] #mark/paper [[@Kaggle forecasting competitions: An overlooked learning opportunity]] #mark/paper [[@Deep Learning for Time Series Forecasting: Tutorial and Literature Survey]] #mark/paper 可能方向 数据增强 Time Series Data Augmentation for Deep Learning: A Survey 时序问题预训练 A network-based transfer learning approach to improve sales forecasting of new products [[AutoML]] 模型的自动选择和调优 因此完善的 AutoML 方案中,也需要包含例如 prior shift, covariate shift, concept drift 等方面的检测与处理,以适应复杂的真实预测场景。 [[Life Long Learning]] 模型的学习预测会随着时间的推移不断有新数据的输入","link":"/note/zhihu486343380.html"},{"title":"@一点微小的 onenote 使用经验","text":"链接:科研工作者都是如何使用OneNote的? - 知乎 想法 可以参考如何做论文阅读笔记 摘录 使用超链接 [[wiki link]] 导出 PDF 时自动转换:从 OneNote 导出 PDF 时(我有时候会用这个方式共享笔记),如果导出内容含有指向 A 的 OneNote 链接,且 A 本身也属于导出 PDF 的一部分,则 PDF 内该链接会指向 PDF 内的 A。不过如果 A 不是导出内容的一部分,则保持原样,即如果收件人有访问被指向笔记本的权限,则可以通过链接找到笔记内容。 存档邮件 Outlook Send to OneNote 保存邮件 科研操作 Meetings 记录每次和其他研究人员的讨论问题 @My productivity app is a never-ending txt file 里面也提到这种用法 会前笔记主要是计划讨论什么内容,在 Agenda 小节里依序列出需要讨论的点,对于复杂讨论,可以链接到对应文献、思考、先前会议记录的笔记,或者在下面增加新的小节(通常是思考笔记太冗长,新的小节总述要点)。 会后笔记主要是存档讨论期间的白板内容(回顾时提供上下文),以及记录讨论中产生的新想法、下一步操作等。偶尔会把和讨论有关的邮件往来存档到这里,作为对应记录的子级页面。 Paper Read [[how to read a paper]] 大量使用超链接关联笔记 格式 论文的短名/昵称 作者缩写 + 两位数年份 超链接指向文章的一个源头 论文的长名 标题的缩略形式,或者文章的重点。 例子中论文本身的标题是 Adaptively Secure and Succinct Functional Encryption: Improving Security and Efficiency, Simultaneously 文章重点 Adaptively Secure Succicnt FE 一段空白:读论文跟着它的思路写笔记 问题概括(如果文献提出了新的问题)、高层技术思路(尤其是这篇文章首次提出了某个技巧时) 前几次阅读时感觉磕磕碰碰的地方,以及这部分内容之后是如何成功理解的,即把一开始自己不太懂的语言翻译为自己容易理解的语言(不是指自然语言的语言;对于回顾十分有用) 和其他文献、我所研究的问题之联系(使用超链接) 在阅读中、阅读后产生的思路(如果新思路比较复杂,则应该创建一篇新的笔记并链接之) review(如果我需要 review 这篇论文) 论文的 citation 通常是这篇论文在 ePrint 上截至通讯作者邮件的部分,或者出版社页面上的信息。可以用来查询论文手稿更新状况。 单独笔记和直接写笔记在 PDF 上对比 后者的坏处有:笔记顺序不能和论文行文顺序不同; 手稿更新后难以迁移笔记; 不能在论文笔记段落之间建立超链接,和其他笔记的链接也比较难整合。 (思考顺序和行文顺序不一致的例子:证明的框架在正文,但步骤和步骤里的技巧在附录。) 把所有笔记归在一处比单独把论文笔记放在 PDF 里更容易形成知识网络。","link":"/note/zhihu_418933529_1525594474.html"}],"tags":[{"name":"7","slug":"7","link":"/tags/7/"},{"name":"wrtiting","slug":"wrtiting","link":"/tags/wrtiting/"},{"name":"life","slug":"life","link":"/tags/life/"},{"name":"book","slug":"book","link":"/tags/book/"},{"name":"movie","slug":"movie","link":"/tags/movie/"},{"name":"game","slug":"game","link":"/tags/game/"},{"name":"didiglobal","slug":"didiglobal","link":"/tags/didiglobal/"},{"name":"applescript","slug":"applescript","link":"/tags/applescript/"},{"name":"omnifocus","slug":"omnifocus","link":"/tags/omnifocus/"},{"name":"dash","slug":"dash","link":"/tags/dash/"},{"name":"network","slug":"network","link":"/tags/network/"},{"name":"Obsidian","slug":"Obsidian","link":"/tags/Obsidian/"},{"name":"font","slug":"font","link":"/tags/font/"},{"name":"weekly","slug":"weekly","link":"/tags/weekly/"},{"name":"Sleep","slug":"Sleep","link":"/tags/Sleep/"},{"name":"Workflow","slug":"Workflow","link":"/tags/Workflow/"},{"name":"wordpress","slug":"wordpress","link":"/tags/wordpress/"},{"name":"blog","slug":"blog","link":"/tags/blog/"},{"name":"cnn","slug":"cnn","link":"/tags/cnn/"},{"name":"alexnet","slug":"alexnet","link":"/tags/alexnet/"},{"name":"Mac","slug":"Mac","link":"/tags/Mac/"},{"name":"Alfred","slug":"Alfred","link":"/tags/Alfred/"},{"name":"nlp","slug":"nlp","link":"/tags/nlp/"},{"name":"google","slug":"google","link":"/tags/google/"},{"name":"bert","slug":"bert","link":"/tags/bert/"},{"name":"code","slug":"code","link":"/tags/code/"},{"name":"transformer","slug":"transformer","link":"/tags/transformer/"},{"name":"Paper","slug":"Paper","link":"/tags/Paper/"},{"name":"Transformer","slug":"Transformer","link":"/tags/Transformer/"},{"name":"Time Series Forecasting","slug":"Time-Series-Forecasting","link":"/tags/Time-Series-Forecasting/"},{"name":"workflow","slug":"workflow","link":"/tags/workflow/"},{"name":"alfred","slug":"alfred","link":"/tags/alfred/"},{"name":"ifttt","slug":"ifttt","link":"/tags/ifttt/"},{"name":"zufe","slug":"zufe","link":"/tags/zufe/"},{"name":"iOS","slug":"iOS","link":"/tags/iOS/"},{"name":"app","slug":"app","link":"/tags/app/"},{"name":"best of","slug":"best-of","link":"/tags/best-of/"},{"name":"hexo","slug":"hexo","link":"/tags/hexo/"},{"name":"vps","slug":"vps","link":"/tags/vps/"},{"name":"writing","slug":"writing","link":"/tags/writing/"},{"name":"engineering","slug":"engineering","link":"/tags/engineering/"},{"name":"computer","slug":"computer","link":"/tags/computer/"},{"name":"ml","slug":"ml","link":"/tags/ml/"},{"name":"course","slug":"course","link":"/tags/course/"},{"name":"uber","slug":"uber","link":"/tags/uber/"},{"name":"eta","slug":"eta","link":"/tags/eta/"},{"name":"english","slug":"english","link":"/tags/english/"},{"name":"timetrack","slug":"timetrack","link":"/tags/timetrack/"},{"name":"hack","slug":"hack","link":"/tags/hack/"},{"name":"fm","slug":"fm","link":"/tags/fm/"},{"name":"ftrl","slug":"ftrl","link":"/tags/ftrl/"},{"name":"gbdt","slug":"gbdt","link":"/tags/gbdt/"},{"name":"machine learing","slug":"machine-learing","link":"/tags/machine-learing/"},{"name":"lr","slug":"lr","link":"/tags/lr/"},{"name":"git","slug":"git","link":"/tags/git/"},{"name":"gtd","slug":"gtd","link":"/tags/gtd/"},{"name":"evernote","slug":"evernote","link":"/tags/evernote/"},{"name":"mubu","slug":"mubu","link":"/tags/mubu/"},{"name":"acm","slug":"acm","link":"/tags/acm/"},{"name":"hdu","slug":"hdu","link":"/tags/hdu/"},{"name":"didi","slug":"didi","link":"/tags/didi/"},{"name":"self-attention","slug":"self-attention","link":"/tags/self-attention/"},{"name":"KDD","slug":"KDD","link":"/tags/KDD/"},{"name":"taskpaper","slug":"taskpaper","link":"/tags/taskpaper/"},{"name":"mac","slug":"mac","link":"/tags/mac/"},{"name":"software","slug":"software","link":"/tags/software/"},{"name":"MachineLearning","slug":"MachineLearning","link":"/tags/MachineLearning/"},{"name":"ipad","slug":"ipad","link":"/tags/ipad/"},{"name":"podcast","slug":"podcast","link":"/tags/podcast/"},{"name":"school","slug":"school","link":"/tags/school/"},{"name":"wiznote","slug":"wiznote","link":"/tags/wiznote/"},{"name":"system","slug":"system","link":"/tags/system/"},{"name":"algorithm","slug":"algorithm","link":"/tags/algorithm/"},{"name":"Reinforcement Learning","slug":"Reinforcement-Learning","link":"/tags/Reinforcement-Learning/"},{"name":"backwpup","slug":"backwpup","link":"/tags/backwpup/"},{"name":"rime","slug":"rime","link":"/tags/rime/"},{"name":"logseq","slug":"logseq","link":"/tags/logseq/"},{"name":"covid-19","slug":"covid-19","link":"/tags/covid-19/"},{"name":"readwise","slug":"readwise","link":"/tags/readwise/"},{"name":"reading","slug":"reading","link":"/tags/reading/"},{"name":"travis","slug":"travis","link":"/tags/travis/"},{"name":"cos","slug":"cos","link":"/tags/cos/"},{"name":"github","slug":"github","link":"/tags/github/"},{"name":"travisci","slug":"travisci","link":"/tags/travisci/"},{"name":"lstm","slug":"lstm","link":"/tags/lstm/"},{"name":"widedeep","slug":"widedeep","link":"/tags/widedeep/"},{"name":"dnn","slug":"dnn","link":"/tags/dnn/"},{"name":"ctr","slug":"ctr","link":"/tags/ctr/"},{"name":"Hexo","slug":"Hexo","link":"/tags/Hexo/"},{"name":"Github","slug":"Github","link":"/tags/Github/"},{"name":"Action","slug":"Action","link":"/tags/Action/"},{"name":"webmention","slug":"webmention","link":"/tags/webmention/"},{"name":"IndieWeb","slug":"IndieWeb","link":"/tags/IndieWeb/"},{"name":"creator","slug":"creator","link":"/tags/creator/"},{"name":"Causal Inference","slug":"Causal-Inference","link":"/tags/Causal-Inference/"},{"name":"智能营销","slug":"智能营销","link":"/tags/%E6%99%BA%E8%83%BD%E8%90%A5%E9%94%80/"},{"name":"Ref","slug":"Ref","link":"/tags/Ref/"},{"name":"web","slug":"web","link":"/tags/web/"},{"name":"Ship 90 for 90","slug":"Ship-90-for-90","link":"/tags/Ship-90-for-90/"},{"name":"Alibaba","slug":"Alibaba","link":"/tags/Alibaba/"},{"name":"ReRank","slug":"ReRank","link":"/tags/ReRank/"},{"name":"IJCA/2018","slug":"IJCA-2018","link":"/tags/IJCA-2018/"},{"name":"Bilibili","slug":"Bilibili","link":"/tags/Bilibili/"},{"name":"focus2flow","slug":"focus2flow","link":"/tags/focus2flow/"},{"name":"死亡","slug":"死亡","link":"/tags/%E6%AD%BB%E4%BA%A1/"},{"name":"一席","slug":"一席","link":"/tags/%E4%B8%80%E5%B8%AD/"},{"name":"OneNote","slug":"OneNote","link":"/tags/OneNote/"},{"name":"ETA","slug":"ETA","link":"/tags/ETA/"},{"name":"how to read a book","slug":"how-to-read-a-book","link":"/tags/how-to-read-a-book/"},{"name":"Farnam Street","slug":"Farnam-Street","link":"/tags/Farnam-Street/"},{"name":"马前卒","slug":"马前卒","link":"/tags/%E9%A9%AC%E5%89%8D%E5%8D%92/"},{"name":"webp","slug":"webp","link":"/tags/webp/"},{"name":"qcloud","slug":"qcloud","link":"/tags/qcloud/"},{"name":"强化学习","slug":"强化学习","link":"/tags/%E5%BC%BA%E5%8C%96%E5%AD%A6%E4%B9%A0/"},{"name":"DataFun","slug":"DataFun","link":"/tags/DataFun/"},{"name":"LeetCode","slug":"LeetCode","link":"/tags/LeetCode/"},{"name":"Dynamic Programming","slug":"Dynamic-Programming","link":"/tags/Dynamic-Programming/"},{"name":"区间 DP","slug":"区间-DP","link":"/tags/%E5%8C%BA%E9%97%B4-DP/"},{"name":"greedy","slug":"greedy","link":"/tags/greedy/"},{"name":"sortings","slug":"sortings","link":"/tags/sortings/"},{"name":"two pointer","slug":"two-pointer","link":"/tags/two-pointer/"},{"name":"Brute Force","slug":"Brute-Force","link":"/tags/Brute-Force/"},{"name":"Problems","slug":"Problems","link":"/tags/Problems/"},{"name":"medium","slug":"medium","link":"/tags/medium/"},{"name":"Binary Search","slug":"Binary-Search","link":"/tags/Binary-Search/"},{"name":"DP","slug":"DP","link":"/tags/DP/"},{"name":"最短路","slug":"最短路","link":"/tags/%E6%9C%80%E7%9F%AD%E8%B7%AF/"},{"name":"贪心","slug":"贪心","link":"/tags/%E8%B4%AA%E5%BF%83/"},{"name":"二叉搜索树","slug":"二叉搜索树","link":"/tags/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91/"},{"name":"最近公共祖先","slug":"最近公共祖先","link":"/tags/%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%96%E5%85%88/"},{"name":"implementation","slug":"implementation","link":"/tags/implementation/"},{"name":"排序","slug":"排序","link":"/tags/%E6%8E%92%E5%BA%8F/"},{"name":"树形 DP","slug":"树形-DP","link":"/tags/%E6%A0%91%E5%BD%A2-DP/"},{"name":"Easy","slug":"Easy","link":"/tags/Easy/"},{"name":"bitmasks","slug":"bitmasks","link":"/tags/bitmasks/"},{"name":"三分搜索","slug":"三分搜索","link":"/tags/%E4%B8%89%E5%88%86%E6%90%9C%E7%B4%A2/"},{"name":"Logseq","slug":"Logseq","link":"/tags/Logseq/"},{"name":"Roam","slug":"Roam","link":"/tags/Roam/"},{"name":"Algorithm","slug":"Algorithm","link":"/tags/Algorithm/"},{"name":"Beijing","slug":"Beijing","link":"/tags/Beijing/"},{"name":"ZSA Voyager","slug":"ZSA-Voyager","link":"/tags/ZSA-Voyager/"},{"name":"Fliggy","slug":"Fliggy","link":"/tags/Fliggy/"},{"name":"Profile Page","slug":"Profile-Page","link":"/tags/Profile-Page/"},{"name":"docker","slug":"docker","link":"/tags/docker/"},{"name":"umami","slug":"umami","link":"/tags/umami/"},{"name":"阅读清单","slug":"阅读清单","link":"/tags/%E9%98%85%E8%AF%BB%E6%B8%85%E5%8D%95/"},{"name":"Minja","slug":"Minja","link":"/tags/Minja/"},{"name":"Vim","slug":"Vim","link":"/tags/Vim/"},{"name":"VS Code","slug":"VS-Code","link":"/tags/VS-Code/"},{"name":"多目标优化","slug":"多目标优化","link":"/tags/%E5%A4%9A%E7%9B%AE%E6%A0%87%E4%BC%98%E5%8C%96/"},{"name":"徐颖@笔记花园","slug":"徐颖-笔记花园","link":"/tags/%E5%BE%90%E9%A2%96-%E7%AC%94%E8%AE%B0%E8%8A%B1%E5%9B%AD/"},{"name":"Video","slug":"Video","link":"/tags/Video/"},{"name":"zhihu","slug":"zhihu","link":"/tags/zhihu/"},{"name":"Zettelkasten","slug":"Zettelkasten","link":"/tags/Zettelkasten/"},{"name":"时间序列预测","slug":"时间序列预测","link":"/tags/%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E9%A2%84%E6%B5%8B/"},{"name":"周远","slug":"周远","link":"/tags/%E5%91%A8%E8%BF%9C/"},{"name":"Gee Law","slug":"Gee-Law","link":"/tags/Gee-Law/"}],"categories":[{"name":"文渊阁","slug":"文渊阁","link":"/categories/%E6%96%87%E6%B8%8A%E9%98%81/"},{"name":"生活志","slug":"生活志","link":"/categories/%E7%94%9F%E6%B4%BB%E5%BF%97/"},{"name":"程序园","slug":"程序园","link":"/categories/%E7%A8%8B%E5%BA%8F%E5%9B%AD/"},{"name":"随手记","slug":"随手记","link":"/categories/%E9%9A%8F%E6%89%8B%E8%AE%B0/"},{"name":"随想集","slug":"随想集","link":"/categories/%E9%9A%8F%E6%83%B3%E9%9B%86/"},{"name":"智能路","slug":"智能路","link":"/categories/%E6%99%BA%E8%83%BD%E8%B7%AF/"},{"name":"不老阁","slug":"不老阁","link":"/categories/%E4%B8%8D%E8%80%81%E9%98%81/"},{"name":"军机处","slug":"军机处","link":"/categories/%E5%86%9B%E6%9C%BA%E5%A4%84/"},{"name":"读书记","slug":"读书记","link":"/categories/%E8%AF%BB%E4%B9%A6%E8%AE%B0/"},{"name":"时光机","slug":"时光机","link":"/categories/%E6%97%B6%E5%85%89%E6%9C%BA/"},{"name":"problem","slug":"problem","link":"/categories/problem/"},{"name":"行旅记","slug":"行旅记","link":"/categories/%E8%A1%8C%E6%97%85%E8%AE%B0/"}],"pages":[{"title":"About","text":"About Me 网上冲浪常用 ID:Ryenxx、xiang578。 2014-2018:浙江财经大学,计算机专业业余学生 多次参加 ACM 比赛,实属打铁水平,侥幸抱上大腿获得过金、银、铜奖。 2018-2023.10:滴滴地图事业部 - ETA和路况策略,预估价、导航ETA、拥堵气泡、红绿灯倒计时等 2023.10-Now:飞猪算法平台 - 排序&商业化算法,花名生心(取自:因无所住,而生其心),机票补贴、POI 匹配、搜索排序 兴趣: 机器学习、深度学习 Zettelkasten 阅读 数字生活:这里将成为我的数字坟墓 ErgoDox EZ:键位设置 macOS 软件清单 Chrome 扩展程序清单 About Blog 一万人来一百次的岛 写一些可能只有自己能看懂的文章 吾道不孤 欢迎写信到 ryenxx#gmail.com(#换成@) 进一步交流 了解更多博客折腾记 推荐阅读过去 90 天访问量 top5 文章: 「Rime 鼠须管」小鹤双拼配置指南 从零开始利用 hexo + Github/Coding 搭建个人博客 李宏毅强化学习课程笔记 PG PPO Q-Learing (WDR) Learning to Estimate the Travel Time (FTRL) Follow The Regularized Leader 分享 2018年5月 Standard Template Library PDF 2018年4月 路径规划那些事 PDF 2017年5月 数位 DP PDF 2016年6月 堆及其应用 PDF 2016年6月 树链剖分 PDF 2016年5月 搜索加强 PDF 2016年5月 树型动态规划 PDF 请我喝一杯咖啡 赞助不会给你带来什么,也不会让你失去什么 致谢 20160901: Fighting Heart 通过支付宝赞助 0.50 元 20160928: Jelly 通过微信赞助 0.60 元 20180324: 一位没有留下痕迹的读者 通过简书赞赏 2.00 元 20180712: *儿 通过微信赞助 3 元 20190110: 珍冰乐 通过微信赞助 0.01 元 20190114: 珍冰乐 通过微信赞助 6.66 元 谢谢你看到这里!","link":"/about.html"},{"title":"","text":";(function(){'use strict';if(window.goatcounter&&window.goatcounter.vars) window.goatcounter=window.goatcounter.vars else window.goatcounter=window.goatcounter||{} var s=document.querySelector('script[data-goatcounter]') if(s&&s.dataset.goatcounterSettings){try{var set=JSON.parse(s.dataset.goatcounterSettings)} catch(err){console.error('invalid JSON in data-goatcounter-settings: '+err)} for(var k in set) if(['no_onload','no_events','allow_local','allow_frame','path','title','referrer','event'].indexOf(k)>-1) window.goatcounter[k]=set[k]} var enc=encodeURIComponent var get_data=function(vars){var data={p:(vars.path===undefined?goatcounter.path:vars.path),r:(vars.referrer===undefined?goatcounter.referrer:vars.referrer),t:(vars.title===undefined?goatcounter.title:vars.title),e:!!(vars.event||goatcounter.event),s:[window.screen.width,window.screen.height,(window.devicePixelRatio||1)],b:is_bot(),q:location.search,} var rcb,pcb,tcb if(typeof(data.r)==='function')rcb=data.r if(typeof(data.t)==='function')tcb=data.t if(typeof(data.p)==='function')pcb=data.p if(is_empty(data.r))data.r=document.referrer if(is_empty(data.t))data.t=document.title if(is_empty(data.p))data.p=get_path() if(rcb)data.r=rcb(data.r) if(tcb)data.t=tcb(data.t) if(pcb)data.p=pcb(data.p) return data} var is_empty=function(v){return v===null||v===undefined||typeof(v)==='function'} var is_bot=function(){var w=window,d=document if(w.callPhantom||w._phantom||w.phantom) return 150 if(w.__nightmare) return 151 if(d.__selenium_unwrapped||d.__webdriver_evaluate||d.__driver_evaluate) return 152 if(navigator.webdriver) return 153 return 0} var urlencode=function(obj){var p=[] for(var k in obj) if(obj[k]!==''&&obj[k]!==null&&obj[k]!==undefined&&obj[k]!==false) p.push(enc(k)+'='+enc(obj[k])) return '?'+p.join('&')} var warn=function(msg){if(console&&'warn'in console) console.warn('goatcounter: '+msg)} var get_endpoint=function(){var s=document.querySelector('script[data-goatcounter]') if(s&&s.dataset.goatcounter) return s.dataset.goatcounter return(goatcounter.endpoint||window.counter)} var get_path=function(){var loc=location,c=document.querySelector('link[rel=\"canonical\"][href]') if(c){var a=document.createElement('a') a.href=c.href if(a.hostname.replace(/^www\\./,'')===location.hostname.replace(/^www\\./,'')) loc=a} return(loc.pathname+loc.search)||'/'} var on_load=function(f){if(document.body===null) document.addEventListener('DOMContentLoaded',function(){f()},false) else f()} goatcounter.filter=function(){if('visibilityState'in document&&document.visibilityState==='prerender') return 'visibilityState' if(!goatcounter.allow_frame&&location!==parent.location) return 'frame' if(!goatcounter.allow_local&&location.hostname.match(/(localhost$|^127\\.|^10\\.|^172\\.(1[6-9]|2[0-9]|3[0-1])\\.|^192\\.168\\.|^0\\.0\\.0\\.0$)/)) return 'localhost' if(!goatcounter.allow_local&&location.protocol==='file:') return 'localfile' if(localStorage&&localStorage.getItem('skipgc')==='t') return 'disabled with #toggle-goatcounter' return false} window.goatcounter.url=function(vars){var data=get_data(vars||{}) if(data.p===null) return data.rnd=Math.random().toString(36).substr(2,5) var endpoint=get_endpoint() if(!endpoint) return warn('no endpoint found') return endpoint+urlencode(data)} window.goatcounter.count=function(vars){var f=goatcounter.filter() if(f) return warn('not counting because of: '+f) var url=goatcounter.url(vars) if(!url) return warn('not counting because path callback returned null') if(navigator.sendBeacon) navigator.sendBeacon(url) else{var img=document.createElement('img') img.src=url img.style.position='absolute' img.style.bottom='0px' img.style.width='1px' img.style.height='1px' img.loading='eager' img.setAttribute('alt','') img.setAttribute('aria-hidden','true') var rm=function(){if(img&&img.parentNode)img.parentNode.removeChild(img)} img.addEventListener('load',rm,false) document.body.appendChild(img)}} window.goatcounter.get_query=function(name){var s=location.search.substr(1).split('&') for(var i=0;i","link":"/count.js"},{"title":"categories","text":"","link":"/categories/index.html"},{"title":"链接","text":"推荐 张驰原 Free Mind:MIT 博士,Google Brain。主题包括但不限于:机器学习、数学、程序设计、阅读、绘画。每年会写一篇长长的年度总结。 2022 梦想天空 刘未鹏 Mind Hacks:思维改变生活, 《暗时间》作者。 怎样花两年时间去面试一个人 我在南大的七年 木子:心态平和,语言幽默。关于阅读和折腾。 余舜哲的 One Piece - 时间知道:创业者·加密货币爱好者·文学爱好者。 为了某一瞬间的灵感-Quicy:生产力工具 (Productivity)、关于效率思维的思考 (Efficiency)、学习笔记 (Note)、以及偶尔记录的杂谈 (Miscellanea) 等等。 Pin 起来:生产力工具 Owen:主要关注技术,读书,摘抄,杂谈,文章评论,工具分享,工作流,灵感,英文学习,注意力管理,深度工作等方向 Pseudoyu:Blockchain | Programming | Photography | Misty yihong0618 (@yihong06181) / Twitter 参考他开源的「个人跑步数据可视化」项目,实现了自己的 Running page (xiang578.com) yihong0618/gitblog: People Die, but Long Live GitHub 使用 Github Issues 写博客 项目灵感来源 People Die, but Long Live GitHub - laike9m’s blog Github 是我们这个时代的数字公墓 不老阁 yihong0618/2020: 2020计划,喜欢的文章,博客,以及其它 用 git project 记录 Verne in GitHub | Verne in GitHub 数字生活方方面面 Obsidian 未来的笔记应用 | Verne in GitHub 我的 Obsidian 笔记跨设备同步方案 | Verne in GitHub (einverne.info) 我的笔记法(借助 Zettelkasten 和 Obsidian) | Verne in GitHub 机器学习 Lil’Log:英文博客,文章风格是围绕一个算法主题写综述。 The Transformer Family 华校专 - AI 算法工程师手册:基础知识,推荐系统,图神经网络,风格是对论文全文翻译…… 刘建平Pinard - 博客园 :十年码农,对数学统计学,数据挖掘,机器学习,大数据平台,大数据平台应用开发,大数据可视化感兴趣。 李海波 Semocean – 和自己赛跑的人:滴滴高级算法专家,阿里资深算法专家。机器学习如何在工业界落地。 朱小强 - 知乎:阿里妈妈资深算法专家。CTR。 张俊林 - 知乎:新浪微博 NLP,经常写一些深度长文。 王喆 - 知乎:CTR,《深度学习推荐系统》。 吴海波 - 知乎:蘑菇街。CTR。 苏剑林 科学空间|Scientific Spaces:追一科技。NLP 方向论文、代码解析。 石塔西 - 知乎:CTR,文章有深度。 Free Will:推荐系统 & 计算广告,推荐看一下 40 篇机器学习算法系列。 其他技术 期望最大化(洪亮劼的专栏) · 分享技术、管理、团队和业界的思考 LinkedIn工程总监、前Etsy工程总监、雅虎研究院高级研发经理,长期从事机器学习、大数据分析、个性化系统架构的研究;这是一个分享技术、管理、团队和业界思考的专栏。 产品 产品沉思录 · Product Thinking:少楠主理的 Newsletter 以及产品数据库,内容包括但不限于产品设计,服务设计,数据分析,互联网技术,经济学,心理学,社会学,决策学,自然科学,城市规划,零售,团队管理等内容。 推荐文章 如何管理自己的时间资产 - 面向信仰编程:如何将 OKR 融入到个人生活学习中。 Augmenting Long-term Memory:网络上看到最好介绍 Anki 实践的文章,通过 Anki 实现选择记忆的能力。 wzb56/13_questions_of_shell: shell十三问–shell教程(markdown 版本):shell 是挺神奇的语言(出错之后都能继续运行……坑),这份资料可以让你「知其然而知其所以然」。","link":"/link/index.html"},{"title":"","text":"Ref ObsidianPublisher/obsidian-github-publisher: Github Publisher helps you to publish your notes on a preconfigured GitHub repository from your Obsidian Vault, for free, and more! 最近折腾Obsidian及hexo - 天一生水 (jiangyu.org)","link":"/posts/Github%20Publisher.html"},{"title":"tags","text":"","link":"/tags/index.html"},{"title":"论文阅读笔记","text":"ETA WDR: Learning to Estimate the Travel Time #Didi Chuxing #KDD 2018 FMA-ETA: Estimating Travel Time Entirely Based on FFN With Attention #Didi Chuxing DeeprETA: An ETA Post-processing System at Scale #Uber #2022 HierETA: Interpreting Trajectories from Multiple Views A Hierarchical Self-Attention Network for Estimating the Time of Arrival #Didi Chuxing #KDD 2022 时间序列 Are Transformers Effective for Time Series Forecasting? #CUHK #AAAI 2023 CTR","link":"/tech/index.html"}]}