0.个人思考
1)跟那些大佬们相比,我是彩笔,所记录是自己的感悟。也许多年后看,极其幼稚,又或许大佬们觉得弱智,但是不影响我持续做笔记和学习记录。
2)个人认为,做算法策略的同学,大致可以看做两类:
一类是“卖铲子”的,也就是“造轮子”的,比如Xgboost、tf、keras、pytorch、FM、pca等各种优质工具;
一类是“用铲子的”,也就是“调包侠”,比如用各种轮子做“搜广推”的;
到目前为止,我不认为谁比谁高贵,分工不同罢了。
3)有一些“用铲子”的,被人说“调包侠”,不开心了,也开始把精力分散去“抄轮子”,无效的“改轮子”,做一些重复性、和实际目的不一致的工作,就好像明明有“sort”函数可以直接用了,得自己手写个“快排”表明自己的尊贵…我觉得是心态不好的表现。
4)既然社会分工是提高生产效率的,那么“调包侠”就应该好好理解手头的“铲子”和场景,去让他作用在实际的业务场景,发光发热,这名字有那么难听?
5)我斗胆猜测一下,这些经典的“铲子”可以直接或者略加改动就能适用80%以上的场景,否则这个“铲子”有问题,或者,用的人有问题。不然,那些做这些的“大佬”是“傻蛋”?
6)当然,多研究“铲子”的构造,改进适配以更好的应用,那是进阶需要的。
1.“铲子”的经验、学习记录,不定期update
0.)先贴个百科式的汇总
https://www.jiqizhixin.com/sota
主流分支的概念
1)关于numpy、breeze等科学计算包
能矢量计算的,就不要写for循环、map函数。
例子1:向量点乘,自己写for循环后者map,和调用dot函数的时间差异,数量级的
例子2:batch化预测,相比for循环样本预测
2)关于xgboost树模型、深度学习的场景选择
最直观的,变量数目(embedding也是很香的)
其他的,做特征工程的复杂度等等

3)分类、回归、序列建模
分类和回归,大致的感觉如下,

而对于序列建模,当这些样本的 yyy 在时间上有相关性时,就变成了 时间序列问题,如果我们依然用非时间序列的方法来处理,就割裂了yyy的时间相关性,

4)损失函数选择

关于离群点的影响,对于mse的改进使用,看这个https://zhuanlan.zhihu.com/p/38529433;
5)FM模型(理论学习阶段)
FM模型,Factorization Machines,LR后面加了个特征的二次项(或者更高阶),将二次项的参数矩阵(对称)n∗nn*nn∗n转化为n∗kn*kn∗k与转置的乘积,参数由n∗nn*nn∗n个转化为k∗nk*nk∗n(k<<nk<<nk<<n,kkk是各特征的embedding维度);预测、训练复杂度k∗nk*nk∗n这个级别,细节理解https://zhuanlan.zhihu.com/p/58160982,学习中看到讲的很好的一个博文。
- 协同过滤的矩阵分解是FM的特例,FM还可以加入其它content特征,更加的统一
- 实现了user、item、content在目标yyy这个目标(比如点击概率)下的统一embedding,同质,可内积
- 内积越大的组合,对目标yyy,贡献越大??所以可以通过内积,来做召回、排序?
6)稠密向量的topK(理论学习阶段)
Embedding向量mmm维,在nnn个里面找topN相似,遍历的化复杂度为m∗nm*nm∗n;
annoy算法:
- 总的来说,把nnn变成log2nlog_2nlog2n。
- a.思路上,先把样本聚2类,计算分割平面,然后子类再聚2类新一级分割平面,循环下去,形成了树结构。
- b.找topN的时候,先和根节点分割平面比较,找到相近的分支,然后依次类推,找到相似样本,复杂度是m∗log2nm*log_2nm∗log2n。
- c.既然是聚类这种思想,那么初始点影响大,那么可以重复上述,生成多棵树,取综合的结果。
faiss处理大量数据思想:
- 总的来说,同时优化mmm和nnn。
- PQ法编码向量,向量间距离计算变为查表操作,优化了m。向量维度mmm拆开为lll段,每个子维度聚类kkk簇,所有样本都可由对应聚类中心向量代替,那么计算量第一部分为,搜索query转化为聚类中心向量表达,lll个子向量分别计算归属簇(这部分还涉及到空间换时间,比如欧式距离下(x1−x2)2=x12+x22−2∗x1∗x2(x_1-x_2)^2 = x_1^2+x_2^2-2*x_1*x_2(x1−x2)2=x12+x22−2∗x1∗x2,如果x1x_1x1对应的是query原始向量,x_2对应的是簇中心向量,x22x_2^2x22可以存表查询),关键是第二部分计算量,当搜索query被lll个簇中心表达后,与所有的样本(也被簇中心表达)的距离计算相似度,这个距离的计算无论query怎么变化,也是不同簇中心距离的组合,查表就好。这里可以基本理解为在计算query与nnn个样本的距离,是一个查表工作,这个表大小为l∗k∗(k−1)/2l*k*(k-1)/2l∗k∗(k−1)/2,查询次数nnn;
- IVF找k近邻思想,优化了nnn,数据进行聚类(这个聚类的时候,距离计算可以用PQ这种查表方式),去query最近的1类或者几类寻找topN,将nnn缩小到n1n_1n1;在n1n_1n1范围内,搜索计算距离的时候采用上述的PQ法。
本文探讨了算法策略中“造轮子”与“调包侠”的角色,强调两者并无高低之分,而是分工不同。作者分享了如何有效利用科学计算包如numpy,选择合适的模型如Xgboost和深度学习,并讨论了分类、回归、序列建模、损失函数选择以及FM模型和稠密向量的topK计算方法。文章提倡理解并优化现有工具,以提高业务场景中的应用效率。
1388





