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)分类、回归、序列建模
分类和回归,大致的感觉如下,
而对于序列建模,当这些样本的
y
y
y 在时间上有相关性时,就变成了 时间序列问题,如果我们依然用非时间序列的方法来处理,就割裂了
y
y
y的时间相关性,
4)损失函数选择
关于离群点的影响,对于mse的改进使用,看这个https://zhuanlan.zhihu.com/p/38529433;
5)FM模型(理论学习阶段)
FM模型,Factorization Machines,LR后面加了个特征的二次项(或者更高阶),将二次项的参数矩阵(对称) n ∗ n n*n n∗n转化为 n ∗ k n*k n∗k与转置的乘积,参数由 n ∗ n n*n n∗n个转化为 k ∗ n k*n k∗n( k < < n k<<n k<<n, k k k是各特征的embedding维度);预测、训练复杂度 k ∗ n k*n k∗n这个级别,细节理解https://zhuanlan.zhihu.com/p/58160982,学习中看到讲的很好的一个博文。
- 协同过滤的矩阵分解是FM的特例,FM还可以加入其它content特征,更加的统一
- 实现了user、item、content在目标 y y y这个目标(比如点击概率)下的统一embedding,同质,可内积
- 内积越大的组合,对目标 y y y,贡献越大??所以可以通过内积,来做召回、排序?
6)稠密向量的topK(理论学习阶段)
Embedding向量 m m m维,在 n n n个里面找topN相似,遍历的化复杂度为 m ∗ n m*n m∗n;
annoy算法:
- 总的来说,把 n n n变成 l o g 2 n log_2n log2n。
- a.思路上,先把样本聚2类,计算分割平面,然后子类再聚2类新一级分割平面,循环下去,形成了树结构。
- b.找topN的时候,先和根节点分割平面比较,找到相近的分支,然后依次类推,找到相似样本,复杂度是 m ∗ l o g 2 n m*log_2n m∗log2n。
- c.既然是聚类这种思想,那么初始点影响大,那么可以重复上述,生成多棵树,取综合的结果。
faiss处理大量数据思想:
- 总的来说,同时优化 m m m和 n n n。
- PQ法编码向量,向量间距离计算变为查表操作,优化了m。向量维度 m m m拆开为 l l l段,每个子维度聚类 k k k簇,所有样本都可由对应聚类中心向量代替,那么计算量第一部分为,搜索query转化为聚类中心向量表达, l l l个子向量分别计算归属簇(这部分还涉及到空间换时间,比如欧式距离下 ( x 1 − x 2 ) 2 = x 1 2 + x 2 2 − 2 ∗ x 1 ∗ x 2 (x_1-x_2)^2 = x_1^2+x_2^2-2*x_1*x_2 (x1−x2)2=x12+x22−2∗x1∗x2,如果 x 1 x_1 x1对应的是query原始向量,x_2对应的是簇中心向量, x 2 2 x_2^2 x22可以存表查询),关键是第二部分计算量,当搜索query被 l l l个簇中心表达后,与所有的样本(也被簇中心表达)的距离计算相似度,这个距离的计算无论query怎么变化,也是不同簇中心距离的组合,查表就好。这里可以基本理解为在计算query与 n n n个样本的距离,是一个查表工作,这个表大小为 l ∗ k ∗ ( k − 1 ) / 2 l*k*(k-1)/2 l∗k∗(k−1)/2,查询次数 n n n;
- IVF找k近邻思想,优化了 n n n,数据进行聚类(这个聚类的时候,距离计算可以用PQ这种查表方式),去query最近的1类或者几类寻找topN,将 n n n缩小到 n 1 n_1 n1;在 n 1 n_1 n1范围内,搜索计算距离的时候采用上述的PQ法。