每周至少做一个leetcode的算法题、阅读并点评至少一篇英文技术文章、学习至少一个技术技巧、分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称 ARTS)
- Algorithm: LeetCode-124 Binary Tree Maximum Path Sum 第一次 Fail 在了最后 2 个 Case,看了题解恍然大悟——明修栈道暗度陈仓。
- Algorithm: LeetCode-114 Flatten Binary Tree to Linked List [Code]
- Algorithm: LeetCode-6255 Minimum Score of a Path Between Two Cities [Code] 复习一下并查集,然鹅在该题并不比 DFS 快
- Share: QRec 把近几年基于 GNN、自监督、社交推荐相关的 SOTA 模型进行了整合实现,框架非常友好,可用性很高。
- Algorithm: LeetCode-234 Palindrome Linked List Code
- Algorithm: LeetCode-328 Odd Even Linked List Code
- Share: WSDM2022 Tutorial-Graph Neural Networks for Recommender System 教程首先提出 GNN 解决推荐系统的优势和必要性,然后按 Stages、Scenarios、Objectives 三个维度介绍了 GNN 推荐系统的相关概念和进展。其中 Scenarios 和 Objectives 的内容比较有启发性。
- Algorithm: LeetCode-202 Happy Number
- Algorithm: LeetCode-1706 Where Will the Ball Fall
- Algorithm: LeetCode-105 Go
- Review: <Progresses and challenges in link prediction> 这篇综述文章给出了链路预测简单精确的定义,并且介绍了局部相似性指标、链路可预测性、网络嵌入、矩阵补全、集成学习方法等信息。周涛发现局部相似性指标中,3-hop based 方法在 AUC 上要优于 2-hop based 方法,但是在准确性上优势并不明显。作为一个偏统计物理的综述,引用了近 10 年链路预测领域的重要文献,非常有参考价值。
- Algorithm: LeetCode-104 Go
- Tip: 开始实践 Go 语言,Go 的官方网站提供了一个递进的实践教程,作为入门还不错。Go 有 C++ 一样的执行效率,在代码编写上又借鉴了 Python 的优美,虽然有一些强迫症(如:定义的变量必须被使用),但用久了应该会习惯。
- Algorithm: LeetCode-103 Python3 第一次 WA 在第 14 个用例,还是要秉承简单法则。
- Algorithm: LeetCode-102 Python3 好久没写 BFS,第一时间用了 DFS,虽然也能过,但代码逻辑会比较古怪。
- Tip: 最近用到一个不错的 Python 下网络可视化工具 pyvis[https://pyvis.readthedocs.io/en/latest/],相比 networkx 自带的可视化效果好很多,而且支持生成 HTML 交互式分析,跟 Jupyter notebook 结合得也好。
- Tip: Github 上提供了一套持续集成(Continuous Integration) 的 workflow,集成 flake8 和 pytest,前者是代码语法与格式检查工具,后者是单元测试工具,可以很方便地帮助代码提交后进行集成测试。Youtube 有个印度小哥的视频讲解非常清晰,分享一下:video
- Algorithm: LeetCode-101 Python3
- Algorithm: LeetCode-097 Python3
- Algorithm: LeetCode-096 Python3
- Algorithm: LeetCode-095 Python3
- Review: Fei Gao, Katarzyna Musial, Colin Cooper, Sophia Tsoka, "Link Prediction Methods and Their Accuracy for Different Social Networks and Network Metrics" 这篇文章研究了不同的启发式链路预测方法在不同网络特性(聚集系数、平均距离等)下的表现,试图找出什么样的网络是对预测友好的,什么样的网络是对预测方法不友好的。通过相关性分析,作者发现诸如「Cosine 相似度在聚集系数高的网络中表现更好」、「Katz 在直径大的网络中表现不理想」的观察,这个研究问题是一个很基础的灵魂拷问,如果能把它系统化研究透,对于网络链路预测就可以说是一个专家了。我从去年开始思考这个问题,希望可以用一两年的时间,把这样的经验沉淀成一个 Git 库,方便自己和有需求的朋友快速入坑上手。
- Algorithm: LeetCode-094 Python3
- Algorithm: LeetCode-093 Python3
- Algorithm: LeetCode-092 Python3 自己写的太丑了
- Algorithm: LeetCode-091 Python3 记忆化搜索的效率(尤其是空间)是不如递推,但我更喜欢它的直白。
- Review:
<Cooperative AI: machines must learn to find common ground>
当前阶段的 AI 更多在单体智能或双人零和博弈,而 AI-AI 合作、AI-Human 合作的进一步研究,有机会创造更高社会价值的产物。作者提出了合作智能的 4 个要素:1.理解接收的信息,2.发出信息&交流,3.做出承诺,4.通识。由于合作智能本身对交叉学科的诉求非常大,作者呼吁社会学、行为学、自然科学多领域交流,并建立了一个社区 www.cooperativeai.org。
- Review:
<World Models>
来自 Google Brain 的作者写的一份长文,介绍了其构建智能体(Agent)来学习世界的框架,包括 3 个关键模块:Vision Model(V) + Memory RNN(M) + Controller(C)。其中 V+M 构成了所谓的 World Model,作者在赛车和 VisDoom 两个环境中测试智能体的效果,发现缺乏了 M 的感知器 V,效果是要更差一些的。说明了记忆和认知在其中的重要性。在讨论环节作者也提出 World Model 后续发展方向是找到更有学习能力的 V 和 M,或者加入更强大的外部记忆模块。其中后者也是我比较感兴趣的部分。
- Algorithm: LeetCode-090 Python3
- Review:
<A Review of the Research Progress of Social Network Structure>
作者介绍了 1960 年以来在社交网络理论和结构模型的进展,包括关系强度、社会资本、结构洞,从微观到宏观的结构分析,包括小世界网络、无标度网络和。整体作为综述还是值得看的。
- Algorithm: LeetCode-089 Python3 格雷码是为了控制系统中减少进位突变而设计的循环二进制,每次只会修改一个数位。
- Algorithm: LeetCode-088 Python3
- Review:
<Self-Supervised Multi-Channel Hypergraph Convolutional Network for Social Recommendation>
这篇文章是发表在 WWW2021 的工作,整体来说是一个实验应用型的研究,虽然没有提出特别的技术突破,但通过组合当下研究热点(Hypergraph+GNN+Self-Supervised-Learning),可读性还不错。其中最大的亮点应该是将超图用于建模社交关系和交叉关系(社交+购买),有效提取特征并且减少社交关系的噪声。最后通过注意力机制融合来自社交、交叉、购买三个通道的信息,发现社交的信息量确实是最小的(当然我认为这个发现和具体数据集有关,公开数据集中的社交关系往往是相对公开的弱关系)。 - Tip: 可以通过 ssh 的远程端口转发功能实现本地访问远程的 jupyter-notebook,租用云 GPU 时可能会需要。
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
- Share: 《从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史》
- Algorithm: LeetCode-087 Python3
- Algorithm: LeetCode-086
- Algorithm: LeetCode-085 是前一题(084)的变种
- Share: 分享 Google Graph Mining 团队在 NeurIPS2020 关于 Graph Mining 的 Tutorial,这个团队在 Google 成立至今已有 11 年,研究方向从原来的大规模图挖掘到现在的图机器学习。由于 Google 的工业场景遇到的都是 Billion 级的超大规模图,所以他们的研究侧重也在如何实际解决大规模图计算/图模型的问题,其中大量用到了 LSH 等近似计算的技术。特别推荐 Bryan Perozzi 主讲的《GNNs and Graph Embeddings》一节,深入浅出地说明了 GCN 的实际意义和阿喀琉斯之踵。
- Algorithm: LeetCode-084 单调栈的实践例题,理解起来还挺绕的。
- Share: 分享一篇今年 2 月发表关于 GNN 发展趋势的评论文章"Top Trends of Graph Machine Learning in 2020",这篇博文以 ICLR2020 发表的文章为锚点,提出了今年往后 Graph Machine Learning 发展的 4 个特点:1)对 GNN 模型更可靠的理论理解,2)更好玩的 GNN 应用,3)知识图谱将再受瞩目,4)对图表征框架在效率和可靠性上的深入探索。
- Algorithm: LeetCode-081
- Algorithm: LeetCode-082
- Algorithm: LeetCode-083
- Algorithm: LeetCode-079
- Algorithm: LeetCode-080 充分利用好“指针”概念和互不影响的空间
- Algorithm: LeetCode-078
- Algorithm: LeetCode-076 这题难的不是 slide window,而是存储结构和频繁计算的优化
- Algorithm: LeetCode-077 很棒的进阶题,从 DFS 到记忆化搜索再到 DP,逐步优化时间和空间。
- Review: FDU 张诚教授的2019发表在Decision Support Systems的一篇文章:"Family profile mining in retailing",试用了一种 PU Learning 迭代寻优的框架,通过确定性特征筛选正样本,再通过相对弱一点的特征来做 PU Learning,对我们搞基础标签有一定的参考意义。原来想看这篇文章是以为会去建模家庭结构,结果看下来更多还是人的标签挖掘,转换成一个分类任务了。Anyway,文章对家庭营销的介绍还是有一定的启发价值。
- Alrogithm: LeetCode-075
- Review: Moira 和 Lada 等人在 2013 年发表的一篇探索性文章 "Families on facebook",通过 facebook 亲子交互数据,以小孩年龄、小孩性别、双方物理距离、父母角色为区分观察的视角,分析了共同好友数、联系频率和沟通内容的区别。发现了几个有意思的现象: 1)接近 40% 的英语用户在 facebook 上能找到其亲子关系,年轻的用户(小于 40 岁)父母关系居多,年长的用户(大于 40 岁)子女关系居多。其中「母亲-女儿」的关系占比最大,「母亲-儿子」次之。2)从双方居住距离来看,随着年龄的增长,儿子相比女儿会离父母到更远的地方居住,18-20岁是一个跳跃点(开始分居两地),但整体线上交互频率和居住距离远近没有强相关性。3)为了判别亲子关系,仅用 N-gram + LR 模型,可以拿到 60% 的模型准确率,虽然不是特别高,但足以区分其他关系了。通过 N-gram 词组的重要性(odds),可以发现不同关系类型的特点,有一定解释性。
- Algorithm: LeetCode-068 Python
- Algorithm: LeetCode-069 Python
- Algorithm: LeetCode-070 Python
- Algorithm: LeetCode-071 Python
- Algorithm: LeetCode-072 Python 「靠观察能解决的问题,就不用去操纵」
- Share: 分享一个讲解 BERT 算法的视频,把 BERT 的精华言简意赅地介绍清楚,Pre-training 阶段用于理解语言环境,是 BERT 的核心阶段,模型结构来源于 Transformer 的 Encoder 部分,搞清楚「What is language, what is context?」,其包含了 2 个代理任务:Mask Language Model(MLM) 和 Next Sentence Prediction(NSP),通过 loss 函数的设计把它联系到一起共同优化。然后 Fine-tuning 环节只需要简单基于下游具体任务(比如问题回答、情感分析)进行调优,就可以得到很好的模型效果,回答「How to use language for specific task」。
- Algorithm: LeetCode-067 Python
- Share: 断断续续听完了雷军的小米 10 周年演讲,分享两个脑子记下来的印象——1)雷军最看重的小米成就有 3 点,一是推动了**移动互联网的普及,二是孵化小米生态链带动了 100 多个行业的变革,三是为全球创造的工作岗位改变了一些人的命运。这 3 点的社会意义很明显,也足够宏大。2)初创时期的小米,靠七字口诀赢得了用户,现在看来依然值得体会,这七字口诀是「专注、极致、口碑、快」。
- Algorithm: LeetCode-066 Python
- Tips:本周参加了 PM 训练营预备考试,学习了两个概念比较有意思。一是燃尽图,用来跟踪剩余工作量随时间演变情况,跟 OKR 跟踪曲线类似;二是 RACI 表,用于明确组织中各个角色的权利与职责,其中 R 表示 Responsible(负责),A 表示 Accountable(批准),C 表示 Consulted(咨询),I 表示Informed(知会)。
- Algorithm: LeetCode-065 Python
pass
- Algorithm: LeetCode-064 Python
pass
- Algorithm: LeetCode-058 Python
- Algorithm: LeetCode-059 Python
- Share: 阅读左耳朵耗子专栏《如何才能拥有技术领导力》,文末提到 Google 评分卡,是一个 0-10 分的技术深度衡量体系,其中 2 分以内是初级,3-5 分算精通,6-8 分可以成为领域驱动者,9-10 分是标准制定者。值得膜拜对齐!
pass
- Algorithm: LeetCode-054 Python
- Algorithm: LeetCode-055 Python
- Review: 在立白的推荐下看了一篇 Zero-Shot 风格迁移的文章 ZM-Net: Real-time Zero-shot Image Manipulation Network,文章提出通过 PNet 提取风格,TNet 提取内容,两者组合后可以直接对于新内容进行风格上色,实现 Zero-shot 迁移。相比 GAN 最初即时训练的方式,在计算资源上要节省很多。
- Algorithm: LeetCode-053 Python
- Algorithm: LeetCode-051 Python
- Algorithm: LeetCode-052 Python
- Review: 读了赵姝、唐杰等人合作的《社交关系挖掘研究综述》(《计算机学报》2017.40),从关系链接预测、关系类型预测、关系交互预测三个方面进行问题形式化分析和算法调研。其中关系类型预测写得较为精彩,全面地涵盖了无监督学习、监督学习、主动学习和迁移学习,通过丰富语境下的多类型关系的关联一致性,取得更好的预测效果。这篇综述对我们日常工作中构建企业级社交网络体系有一定的启发作用。
- Algorithm: LeetCode-048 Python
- Algorithm: LeetCode-047 Python3
- Algorithm: LeetCode-045 Python3
- Algorithm: LeetCode-046 Python3
- Review: 杰克韦尔奇在《赢》一书的第 16 章“合适的工作”中,建议从「人、机遇、未来、主导权、工作内容」五个方面寻找信号评估自己的工作适不适合当下的自己。
- Algorithm: LeetCode-043 Python3
- Algorithm: LeetCode-044 Python3
- Tips: 动态规划边界条件的设定尤为重要,好的边界设置能减少很多不必要的附加操作
- Algorithm: LeetCode-037 Python
- Algorithm: LeetCode-038 Python
- Algorithm: LeetCode-039 Python
- Algorithm: LeetCode-040 Python
- Algorithm: LeetCode-034 Python
- Alrogithm: LeetCode-035 Python
- Alrogithm: LeetCode-036 Python
- Review: 读了 D.J. Watts & Steven Strogatz 1998 年在 Nature 发表的网络科学奠基文章 <Collective dynamics of 'small-world' networks>,通过关注两个重要的指标——聚集系数和平均距离,来指出现实世界的网络结构,更多是介于规则网络和随机网络之间的小世界网络,即聚集性高、平均路径短的网络特性。最后以疾病传播模拟为例子,来强调网络平均距离跟传播速度的正相关性,来体现小世界网络的研究价值。这篇文章到 2020 年初,已经获得了超过 40000 个引用。
- Algorithm: LeetCode-033 Python
- Algorithm: LeetCode-032 Python
- Review: 读了一篇陈皓老师写的《如何成为一个大家愿意追随的leader》,反思自己的团队协作方式,有时候真的冷不丁就往所谓的“BOSS”方向发展,而忘了成为 Leader 才是他人愿意追随的。Leader 和 Boss 的区别是:Leader 制造热情,Boss 制造畏惧,Leader 给予团队成绩,Boss 收割团队成绩,Leader 说跟我上,Boss 说给我上。
- Algorithm: LeetCode-031 Python
- Algorithm: LeetCode-030 Python
- Algorithm: LeetCode-029 Python
- Pass
- Algorithm: LeetCode-026 Python
- Algorithm: LeetCode-025 Python
- Algorithm: LeetCode-024 Python
- Tips: 要保证效率,最好一开始写代码的时候就用对数据结构。
- Algorithm: LeetCode-023 Python
- Tip: SIR 模型可以用来衡量网络节点传播重要性
- Algorithm: LeetCode-022 Python
- Tip: 可解释性 AI 正处于技术上升期,包括全局解释性(overall feature importance)和局部解释性(by-instance feature importance)。常用的思路是通过白盒模型(如线性模型)来拟合黑盒模型(如深度学习模型),从而对黑盒模型进行解释。与之很相似的一个机器学习领域叫“知识蒸馏”(Knowledge Distillation),在限制模型复杂度的条件下,用简单模型替代复杂模型,达到工业应用的目的。在解释训练的过程中,会通过特征缺失、样本扰动的方式去构造对比数据。目前 GA2M、LIME、SHAP 等解释性方法比较普遍在用。
- Algorithm: LeetCode-021 Python
- Algorithm: LeetCode-020 Python
- Algorithm: LeetCode-019 Python
- Tip: 业务需要,复习了网络密度和网络集聚系数,发现网络集聚系数在三角闭包不成环的时候区分力不够强。定义一个社团密度,想要具备更好的排序性,可以结合两者。
- Algorithm: LeetCode-018 Python
- Review: How Powerful Are Graph Neural Networks? 精读了一遍,其重点在证明图信息聚合的时候,用 Sum 比 Mean 和 Max 好,后接 MLP 比 1-Layer 好,其中 Max-1-Layer 就是 GraphSage,Mean-1-Layer 就是 GCN。
- Algorithm: LeetCode-017 Python
- Algorithm: LeetCode-016 Python
- Algorithm: LeetCode-015 Python
- Algorithm: LeetCode-950 Python
- Algorithm: LeetCode-014 Python
- Algorithm: LeetCode-013 Python
- Review: How Powerful Are Graph Neural Networks? 这篇文章尝试对 GNN 的底层机制做了解构,并且和 Weisfeiler-Lehman 方法进行类比,从而提出了一个更简单高效的 GNN 框架:Graph Isomorphism Network(GIN),在图分类的任务上取得了很不错的效果。
- Tip: 比发现问题更牛逼的是解决问题,比解决问题更牛逼的是优化问题的根源。站得越高,越不容易手无足措。
- Algorithm: LeetCode-012 Python
- Algorithm: LeetCode-011 Python 要理清影响决策的关键因素
- Algorithm: LeetCode-010 Python 记忆化搜索,用 DP 解应该也行
- Review: What's in a Name? An Unsupervised Approach to Link Users across Communities
- 这篇文章利用 n-gram 的 NLP 方法,通过分析用户名(username)独特性来自动抽取训练集,继而从用户头像、地理位置、签名、线上行为共现、语言偏好等角度抽取特征,以相同用户名为召回,对 user-user 关系对训练一个二分类模型。通过人为调研的方式提取了测试集合,相比直接把用户名相同视为同人(精确率 56.4%),模型精确率提升到 92.1%。综上,作者提出了 2 个 insight:一是自动抽取训练集的方式是有效的,二是训练 n-gram 模型得到的判别特征也是有效的。
- Algorithm: LeetCode-009 Python
- Review:
- Tip: 维护一个回归测试集,不仅在工程技术上有用,在数据科学应用中也是有效的。
- Share: 复杂网络升阶指南:如何构建最优网络模型 作者提出了几种升阶方法,包括分层、组合、时序、因果。
- Algorithm: LeetCode-008 Python
- Review:
- Tip: 从科技发展史,更容易抽象出技术未来的方向。比如市场营销领域的 Targeting,最初是 household(电话、报纸),然后是 individual(手机、电脑),现在可以做得更多维度 households+individual+device(一个人可能有多台设备),从发展的角度去看会更清楚做什么更有价值。
- Share: 社交网络中的深度知识挖掘 这个 PPT 是关于社交网络的应用综述,有几个有意思的东西:一是构建社会的 RoadMap(User-Tie-Network),二是用社交网络数据来做性别预测和关系预测,三是网络中可以挖掘出一些关键角色(比如公司 Boss)或者意见领袖。
- Algorithm: LeetCode-006 Python
- Review:
- Tip: 软件工程的目标是控制复杂度,而不是增加复杂度。
- Share:
- Algorithm: LeetCode-005 Python
- Review: User Identity Linkage across Online Social Networks 文章从特征挖掘和模型选型两个角度概述了如何在两个社交网络上做用户同人映射的学术研究,时间截至2016年。其中特征挖掘主要包括 Profile、Content、Network 三方面,模型包括有监督的分类模型(如 SVM、RF、朴素贝叶斯)、半监督的标签传播和 Embedding,以及无监督的迭代模型。需要重点关注的特征包括:文本特征、位置特征、网络特征甚至是图片特征,其中特征的相似度计算也是研究的热点。常见的评价指标包括:准确率、召回率、精确率、AUC 等。 其中[18][62]是信息推荐,对 OneID/OneRelation 均适用。 [38][46] 可能对系统性架构有借鉴意义。 [47][53] 是利用位置信息做同人识别的例子。 [38][40] 是各种特征的集大成者。
- Tip: 学会在长周期的任务里用好“缓存”**,能够帮助减少计算量、增加效率。
- Share: 李开复图灵奖推荐信曝光:AI时代里 Hinton是最值得嘉奖的人
- Algorithm: LeetCode-004 Python
- Review:Finding insights with graph analytics 介绍了如何用图分析的方法来帮助企业做决策,可看的地方主要在第一部分,对图分析方法做了分类。
- Pattern matching algorithms 模式匹配算法
- Traversal and pathfinding algorithms 遍历和路径查找算法,比如最短路径
- Connectivity algorithms 连通性算法,比如强联通分量、查找攻击点
- Community detection algorithms 社区检测算法,比如 Louvain、LPA
- Centrality algorithms 中心性计算,比如 PageRank、Degree、Closeness、Betweenness
- Tip:
- Share:
- Algorithm: Leetcode-007 Python
- Review:
- Tip:《Python风格规范》 第一条:不要在行尾加分号, 也不要用分号将两条命令放在同一行.
- Share:《CIKM 最佳论文是怎样炼成的》 这篇文章讲述了结合视觉和文本做搜索排序优化的新思路,经历了 CVPR、IJCAI 的拒稿后,最终被 CIKM 接收并且拿到最佳论文奖的历程。得到的启发是:一个新思路在被大家认可的过程中,是不断和外接碰撞,完善表达力的过程。其中重要的一环还是作为提出者要足够相信。