作者丨石塔西
来源丨推荐道
编辑丨极市平台
极市导读
不是计算机科班出身,在工作之后通过自学而转行去做算法,现在来看看作者的学习经验总结吧。
前言
很多人在知乎上提问“怎么学习算法”。对于这个问题,我觉得自己很有资格回答。我并非计算机科班出身,工作几年后通过自学,不但成功转行做了推荐算法,而且我的算法水平在公司内部以及网络上都获得了广泛认可,算是转行比较成功的,我的学习方法也经实践证明是有效的。
总结我的算法学习经验并分享给大家。常言道“授人以鱼,不如授之以渔”,期望能对准备开始进行算法学习的同学以及在算法行业努力奋斗的同学都有所助益。
我的知识库工具
工欲善其事,必先利其器。每年人工智能领域发表的文章数量极多。倘若对自身记忆力过度自信且不做读书笔记,那么后果将会不佳,就如同“狗熊掰棒子”一般。随着时间流逝,大概的思想或许还能留有印象,然而细节必然是无法记住的,这就相当于白白耗费了之前所付出的努力。当需要用到的时候,才会感叹“书到用时方恨少”,而对于我接下来要谈论的“总结反思”,在这种情况下更是难以谈起。
所以,读书笔记具有极其重要的意义,怎么强调都不为过。笔记就如同我们的“第二大脑”和“知识库”,而一个恰当的笔记工具需为这个“知识库”的正常运转提供高效且可靠的物理基础。在此,我来介绍一下我正在使用的两款知识库工具。
笔记工具
我选择笔记工具时,一个极为重要的标准是是否拥有“内部链接”功能,即能够让我点击笔记中的某段文字或某张图片,从而跳转至笔记的另一段文字或图片。此功能极为重要,在后续段落中,我会始终强调不应孤立地学习单个知识点,而必须将知识点串联成脉络。而这种“内部链接”的功能,正是“脉络”的具体呈现形式。我使用过很多笔记工具,还为其中好几款充了会员。
我在自学机器学习知识准备转行期间,使用了某个工具。那个时候,我就察觉到“内部链接”功能对提升学习效率有很大帮助。后来,我又切换到了另一个工具,当时真的被惊艳到了,尤其是它强大的表格功能,让我为读过的论文建立了一个数据库,详细地记录了每篇论文的用途和特点,还为每篇论文打了标签,如下图所示。
但是最终还是选择了思源笔记:
思维导图工具
我将大段大段的笔记记录在思源笔记上。使用思维导图的场合主要有以下两个:
提到思维导图工具时,大家首先会想到的是。我曾使用过,也购买过订阅版,然而最终还是切换到了其他工具。因为我觉得新工具的功能更强大,像它具有云盘功能,能够允许一个节点链接到导图内的多个节点,还可以自定义图标等。至少在一年前我使用 Zen 的时候,Zen 是不具备这些功能的。在文章的结尾部分,我会给出一份我在阅读源码过程中所做的笔记。如果有同学对此感兴趣,那么可以下载免费版本并将其打开。(嘻嘻,期待打款哦 :-) )
我的学习方法论
有了称手的工具,然而利用工具记录的内容是什么,以及如何把笔记中的内容转化为自己的知识,这取决于个人对算法的理解水平。倘若只是把原文翻译成中文后贴在笔记上,为某大厂在 AI 领域取得的“重大突破”而喝彩,那真的就像是“听君一席话,如听一席话”,对提升自己的算法水平毫无帮助。
现在算法学习存在痛点。这个痛点并非是信息的匮乏。与之相反,如今的论文数量非常多,出现了信息爆炸的情况。每年在 KDD 和 CIKM 这两个会议上,有众多的中外研究者都在极力展示自己的成果,就像王婆卖瓜一样。各种 NN、FM 等技术和方法层出不穷,其中既有实实在在的有价值的内容,也有大量水分满满的灌水文章。这让人们很难分辨出哪种方法才是解决自己问题的有效途径,因为每篇文章都声称自己的实验结果比基线要好很多。并且绝大多数的论文都遵循着一种固定的格式,经过起承转合的阐述后,才会发现其中真正有价值的内容其实很少。
怎样才能拥有一双能够分辨干货与水文的慧眼呢?怎样才能把每篇文章中的水分挤干,提取出剩下的干货呢?怎样才能用这些干货来丰富自己的知识体系呢?接下来,我将从 5 个方面来介绍我的经验。
坚持问题导向
大家或许有类似经历,读完一篇算法论文后,合上书感叹那是一个很“精(fu)巧(za)”的网络结构。正要点开另一篇 PDF 时,突然想到,刚才那一篇是要解决什么问题来着?就像那句名言所说“正确提出问题,就已经解决了一半的问题”,我们往往学会了复杂的解决方法,却忽略了问题本身,这正符合“买椟还珠”这个成语的意思。
正确的方法是:在读论文时,要坚持问题导向。看看作者所提出的问题,是否在我们自己的推荐系统中也存在呢?倘若存在,我们的解决方法与作者提出的方法相比较,谁更优谁更劣呢?除了作者提出的方法之外,是否还有其他的方法能够解决这些问题呢?很多时候,作者提出的问题给了我很大的启发。作者的方法被我舍弃了,取而代之的是更契合我们系统实际的其他方法。
阿里妈妈在 2021 年发表了一篇论文,名为《via Pre- for CTR》。或许大多数人是被其中的某些内容所吸引,因为 GNN 当时很火。然而,这篇文章给我带来的最大启发在于,作者指出了当前推荐算法存在的一个重要问题,那就是我们过于注重“隐式语义建模”,而忽略了“显式语义建模”。
仅作者提出的这一个问题,就足以让我产生共鸣,因为我是从从前的 DNN 时代过来的,对前 DNN 时代对手工交叉特征的重视仍记忆犹新。作者紧接着提出的问题,再次引起了我的注意。
因为有以上两个问题,所以阿里妈妈团队提出了一种方法,那就是用模型预测来代替索引检索。
你看,要是让我给别人讲阿里的这篇文章,我花费了很多笔墨详细阐述了作者提出的两个问题。其一,大家对显式交叉特征的重视程度不够;其二,之前基于统计的方法存在着缺陷。然而,对于作者所使用的 GNN 模型,我只是简单提及了一下。因为要解决上述这些问题,不一定非得要用 GNN,使用简单的 FM 也能够起到作用。离线时通过 FM 将每个特征都训练好。在线上进行预测时,只需将两个点进行乘积操作,就能够得到由这两个特征组成的交叉特征上的相关结果。无论是从理论角度还是工程角度来看,这都是可行的。
也就是说,作者的启发让我们意识到了问题,这就已经解决了一半的问题。至于如何解决,不一定非要机械地照搬作者提出的方法,而是要结合实际采取更合适的方法,说不定这样会更简单,效果也会更好。这方面的例子还有:
举一反三,将知识点串联成脉络
我了解到,许多同学是孤立地去看论文的,就好像看了一篇论文,也只是看了一篇论文一样,这样收获很有限。正确的做法是,读完一篇论文后,要把这篇论文的知识点和之前的知识点连接起来。随着阅读论文的数量增多,孤立的知识点会串联成脉络,这样就能真正把别人的文章转化为自己的知识。例如,有很多同学很喜欢我的《无中生有:论推荐算法中的思想》()这篇文章。实际上,我能用“无中生有”刻画其本质,这正是推荐系统中“矩阵分解”技术“串联”所导致的结果。很多人认为这是深度学习引入的新技术,但事实并非如此。矩阵分析作为早期的经典算法,本身就已经包含了相关思想。
当你把 Deep 里的某些联系起来时,你会发现二者实际上是一回事。在 Deep 时代,万物皆可,并非局限于矩阵分解中所使用的某种方式。矩阵分解的结果能让我们在向量空间中找到相似的 user 和 item,而在万物皆可的理念下,模型能够发现“科学”和“科技”原来是相似的标签,进而提高了模型的扩展能力。其他的例子还包括:
勤于总结与反思
每隔一段时间,需要对之前学习到的知识进行总结回顾。希望你能察觉到,随着自身功能的提升,对之前知识的理解也上升到了一个新的层次。例如召回算法,它的品类众多且形态各不相同,乍一看很难找到共通点。如今较为流行的召回算法有:比如的召回算法、的召回算法、FM 召回、DSSM、双塔模型、百度的孪生网络、阿里的 EGES、的、腾讯的 RALM 等。
但是,仔细总结一下就会知晓,上述的向量化召回算法,实际上能够被一个统一的算法框架所包含。这个框架包含“怎样定义两个样本相近”“怎样定义两个样本距离远”“怎样生成”“怎样成对优化”。
总结出这样一套算法体系:
通过以上梳理,你会发现某篇文章只是在某一环上做了小改进,其他环上采用的方法可能存在瑕疵,不值得借鉴。面临实际问题时,可以先把问题难点拆解到五环中的某些环,然后从这些环的研究成果中获取解决问题的灵感,不要胡子眉毛一把抓,不要急病乱投医。最近我也在进行反思。我对推荐算法的理解进一步加深了,之前文章中的一些观点,值得再次进行思考和商榷。
敢于怀疑
看论文时,没必要被作者的名号以及大厂的招牌所震慑,不要觉得自己只能顶礼膜拜,完全不敢怀疑文章中的观点。只有敢于怀疑“权威”,敢于提出自己的观点,才能够提升自己。我那篇最受读者欢迎的《负样本为王:评的向量化召回算法》()就是“怀疑精神”的产物。
我读论文时,特别不理解为何不用“曝光未点击”当作负样本,而是用抽样结果来做负样本。并且这样做的不止一家,DSSM 中的负样本也是随机抽取的。然而,这两篇文章都未说明选择负样本的原因。当时的我仅有排序方面的经验,觉得用“曝光未点击”做负样本能体现用户的真实反馈,这是理所当然的。何况用“曝光未点击”数据,还能够复用排序的data 。
所以,我在第一次实践算法时敢于怀疑,直接拿“曝光未点击”样本当作负样本,结果就踩了坑。然而“塞翁失马,焉知非福”,踩坑的教训促使我进一步去思考。最终我领悟到,召回与排序相比,一方面速度要求不同,另一方面重大的不同在于二者面临的候选集差异巨大:排序是优中选优,而召回则是鱼龙混杂、良莠不齐。只有采用随机负采样这种方式,才能够让模型达成“开眼界、见世面”的目标,进而在“大是大非”的问题上不出现错误。
你看,倘若当初没有产生怀疑,只是一味地照搬论文中的做法,或许在当时能够少遭遇一次困境,然而同时也丧失了一次提升自身的契机。并且,如果不提高自身的认知水平,只是“知道事情是这样的,却不明白为什么是这样”,那么未来的困境也是无法避免的。
还有我对 Deep 的质疑,比如《也评 Deep 》。这引发了一定争议,当时有些公众号在转载我的文章时,标题是《看神仙打架》。但到今天,我依然坚持认为我的怀疑是有意义的。后来阿里推出《Deep for - Rate 》,这也证明了我“用户时序要区分内与外”这一观点是合理的。
最近一次有质疑,我在《初来乍到:帮助新用户冷启的算法技巧》()里对 MeLU 进行了狠狠吐槽。我觉得它“每个用户拥有一套参数”的这种做法完全脱离了推荐系统的实际情况,没有实战价值,不明白它怎么就被 KDD 录用了呢?后来有小伙伴评论称,让 MeLU 仅学习每个用户的 user id 就可以了。然而,一方面,新用户的 user id 在 meta-阶段是从未出现过的,meta-对此根本无法提供帮助;另一方面,原文的文字压根没有让 meta-只学习 user id 的意思。正因如此,我才说这篇文章是误人子弟的。熟悉我的文章的同学可能会发现,与很多解读论文的文章不同,
我的解读文章不会贴论文中的实验结果。这是从“敢于怀疑”的角度来考虑的。因为我们并非在打比赛,即便指标没有水分,由于大家的数据环境和技术治理水平各不相同,就像“橘生淮南则为橘,生于淮北则为枳”那样,论文中那样显著的效果不一定能在你的环境中重现。然而,论文中的实验设计是有借鉴价值的,是一定要看的。
我也要指出,我强烈认同推荐算法属于强实践的学问。我曾见到许多理论上很完美的算法,但在现实中无法发挥作用。而有些理论上存在瑕疵的算法,却实实在在地带来了收益。毕竟,“AB 平台是(老板)检验算法的唯一标准”,这是令人无奈的事实。结合上边“勤于总结与反思”这一条。过段时间后发现自己当初的怀疑是错误的。此时大方地承认就可以了。这并不丢人。反而意味着自己的水平得到了提高。
版权声明:本文为 “博览广文网” 原创文章,转载请附上原文出处链接及本声明;
工作时间:8:00-18:00
客服电话
0755-88186625
电子邮件
admin@lanyu.com
扫码二维码
获取最新动态