Python动态修改类方法
背景研究《langchain-ChatGLM》项目的过程中,发现一个比较神奇的写法,可能还是我自己见识太少,以后还是得多看各种大佬写的源码。
大佬的源码
1234567def similarity_search_with_score_by_vector( self, embedding: List[float], k: int = 4) -> List[Tuple[Document, float]]: pass# 第一次看到这样修改类的方法FAISS.similarity_search_with_score_by_vector = similarity_search_with_score_by_vector
在之前的思维中一般写法都是先继承这个类,然后再重新写一下这个函数,不知道python原来可以直接动态修改类方法。
实操总结下来主要就是三种:
直接继承一个类,然后重写这个函数
用上面讲到的方法动态修改
也可以用setattr魔法函数动态修改类的属性和方法
话不多说,上Code
12345678910111213141516171819202122232425 ...
回顾2022(裁员篇)
2022年刚过,写一篇杂记,记录一下2022年公司裁员的经过。
7月12号,有一天leader突然约我到会议室聊一下,她和我说有一个好消息,一个坏消息,你要听那个?我心里面一惊,我说咋了(自我感觉和领导关系还行,说话就相对比较随意)。他说公司要裁员了,但是你上个Q是A所以是安全的。那会的我内心掀起了掀然大波,我是第一次经历裁员,以前只是听说过,但是当发生在你身边时你会发现完全不是一回事(最后我被裁之前同事和我说其实我进来那会也一直在裁,只是我刚来感知不到而已)。leader接着问我,你觉得xxx怎么样?(我带的新员工),我也把实际想法和他交流了一下,简单来说就是认可他的能力,但是觉得效率稍微低了一些。那种会影响别人是否可以留下来的话语,我到现在都感觉很难说出口,但是领导问又不能不说。后面1,2周,我都沉浸在一种痛苦中,就是经常一起吃饭,但是你知道他可能要被cy了,你还什么都不能表现出来,因为我还要在这个单位混饭吃。不出所料,后两周,我们leader带着我们一起和xxx吃了个散伙饭,送他走了。不过蛮欣慰的,等我被cy以后我面了一家之前同事创的小公司,我发现xxx也在,虽然过了有点久, ...
PaddleOCR踩坑日记
PaddleOCR踩坑日记背景由于项目需要,调研了一下paddleocr在文字识别的效果,在离线服务器部署完成,但是迁移线上时出现了极为麻烦的环境配置问题,所以特意写下这篇文章,以防日后出现相同的情况。
具体安装步骤
检查系统版本[我是16.04版本]
1234567lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 16.04.7 LTSRelease: 16.04Codename: xenial
根据系统版本安装对应的cuda版本【我是11.2版本,主要是Paddle-gpu适配的是10.2/11.2/11.6】
不用单独安装nvidia驱动,安装cudatoolkit时会自动匹配上,如果有Nvidia驱动直接nvidia-uninstall卸载即可
查看paddleocr允许的cuda版本
根据对应的cuda版本安装pytorch【版本比使用低一些不要紧】
1pip3 install torch torchvision torchaudio --ex ...
万物皆可embedding
万物皆可embedding前言 本文的目的是想通过这次分享,让可爱学长们能够了解在算法人员口中的embedding到底是什么,它是如何作用在我们算法的日常工作中。
背景引入embedding之前,需要先讲一下embedding的前身技术,one-hot编码。
one-hot 在机器学习里,存在one-hot向量(英语:one-hot vector)的概念。在一任意维度的向量中,仅有一个维度的值是1,其余为0。譬如向量[0,0,1,0,0],即为5维空间中的一组one-hot向量。将类别型数据转换成one-hot向量的过程则称one-hot编码(英语:one-hot encoding。在统计学中,one-hot我们一般叫做虚拟变量。
优势
可以将类别型数据转化为向量形式,各类别在高维空间中距离相等
进行损失函数(例如交叉熵损失)或准确率计算时,变得非常方便
劣势
当类别数量过于庞杂时,会导致维度灾难
不能很好的刻画词与词之间的相似性
强稀疏性
备注
sklearn包:sklearn.preprocessing.OneHotEncoder
pandas包:pan ...
对比学习_SimCSE
前短时间接到一个title i2i召回数据的任务,最开始只是想用简单的Doc2vec输出每个title的emb然后用faiss做召回,但是效果很差。后来尝试了用Bert直接输出结果,效果也很差。后面看论文发现Bert的emb存在模型坍塌问题【详细可以参考美团的ConSERT任务】。最后利用SimCSE比较合理的解决了需求
问题
什么是自监督学习,什么是对比学习?
SimCSE生成监督数据的方法是什么?
为什么生成的句向量这么有用?
他的优劣势是什么?
概念自监督学习首先,我们知道现在训练模型的方式主要是两种:有监督和无监督,并且我个人认为无监督的使用场景是远远大于有监督的。无监督有一个比较特别的分支是自监督,他的特点就是不需要人工标注的类别标签信息,直接利用数据本身作为监督信息,来学习样本数据的特征表达。
自监督主要分为两类:
Generative Methods:其中的典型代表就是自编码器,其利用数据本身压缩再重构去比较生成的数据与原始数据的差距。
Contrastive Methods:这类方法则是通过将数据分别与正例样本和负例样本在特征空间进行对比,来学习样本的特征表示。 ...
关联挖掘
对商品订单进行类目级别的关联挖掘,因为订单太少,无法用到商品这个级别,并且主要是因为做关联挖掘的目的是为了投放广告
指标定义项于项集
项,指我们分析数据中的一个对象,如啤酒;项集,就是若干项的项构成的集合,如集合{啤酒,面包}是一个2项集。
支持度(support)
某项集在数据集中出现的概率,支持度体现的是某个项集的频繁程度,只有项集达到一定程度,我们才会研究该项集的必要。
其计算公式为:
$$
support(A\cup B)=\frac{{A\cup B}}{All}
$$
举个例子:AB在订单中同时出现了100次,总共有1000个订单,那$A\cup B$项集的支持度就是0.1
置信度(confidence)
当用户购买了商品A后有多大概率会购买商品B,表示关联性的强弱。
其计算公式为:
$$
confidence(A\rightarrow B)=\frac{support(A\cup B)}{support(A)}
$$
举个例子,AB同时出现的订单有100次,而A购买的订单次数有200次,那置信度就是0.5
提升度(lift)
商品A的出现,对商品B的出现概率提升 ...
Louvain算法
利用商品的点击和购买,对商品进行聚类分析,因此选择了Louvain这个高效的聚类算法,再此主要是为了记录一下,方便日后回顾
问题
什么是模块度,其代表什么含义,公式推导
Louvain算法的精髓是什么,以前是怎么做社团发现的
社团发现和广义聚类的区别
为什么Louvain算法会存在resolution问题,后面是怎么解决的。
模块度Newman1,2003年首次提出了第一版模块度,后在2,2006年提出了第二版模块度,经过多次修正后形成现在我们认知中的模块度。
解释模块度有可以从两个角度解释,一种是较为宏观的表示簇内聚集度和簇外离散度的综合指标,另一种从数学角度认为是在给定组内的边的比例减去边是随机分布的期望分数,其具体的值属于【-0.5,1】。论文中认为0.3-0.8是较好模块度
定义第一版
假设网络被划分为 $k$ 个社区,那么定义一个$k×k$的对称矩阵$e$,它的元素 $e{ij}$表示社区 $i$ 和社区 $j$ 之间的边的数量。矩阵的迹$Tre=\sum e{ii}$,也就表示了在相同社区内节点之间的边集合。显然,社区划分的好,也就是社区内部节点之间联系密集,那么 ...
GNN系列之_GCN
GCN那段数学推断实在看不懂,不过作为一个worker我觉得一不一样数学原理都要搞的很透彻,毕竟我们只是模块的堆积和简单优化,推导还是交给顶尖大神吧
回顾CNN的图片具有局部平移不变性:图片是一个规则的二维矩阵,无论卷积核平移到图片中的哪个位置都可以保证其运算结果的一致性,因此CNN可以利用卷积核进行特征提取。
CNN的三大特点
参数共享:如果不共享,其实就是全连接,参数数据差距很大
局部连接性:卷积计算每次只在与卷积核大小对应的区域进行
层次化表达:不断叠加卷积层,每一个卷积层都是在前一层的基础上进行的,这样的意义在于,网络越往后,其提取到的特征越高级
什么是GCN由于图片和文本等结构化数据具有上述提到的局部平移不变性,但很明显图的结构是不存在这种性质的,因为图结构的相邻节点数量是不确定的,因此用CNN的方式无法做卷积核。那graph中的CNN是什么呢?
目前的一大思路就是借助谱图理论(Spectral Graph Theory)来实现在拓扑图上的卷积操作,大致步骤为将空域中的拓扑图结构通过傅立叶变换映射到频域中并进行卷积,然后利用逆变换返回空域,从而完成了图卷积操作。
Gr ...
数据标准化和中心化
定义标准化:也叫归一化,常用的有最小—最大标准化、Z-score标准化、Sigmod函数等,利用上述标准化操作,将原始数据化为无量纲的数值。这在回归和神经网络类模型是很必要的。
中心化:也叫去均质化,让数据通过中心化处理,得到均值为0的数据【如果方差为1,那就是Z-score标准化】。同时中心化后的数据对向量来说也容易描述,因为是以原点为基准的。
公式最小—最大标准化:将数据变为0-1
\tilde{x}=\frac{x-min}{max-min}Z-score标准化:
\tilde{x}=\frac{x-u}{\sigma }sigmod函数:
f(x)=\frac{1}{1+e^{-x}}备注:
当$\sigma=1$就是中心化公式,所以中心化可以说是一种特殊的标准化
sigmod函数其实主要是在激活函数中对上一层神经层结果进行标准化,但也可以理解成对下一层神经层的输入做标准化。
优点
提升精度:消除量纲,针对梯度下降相关的算法,不同量纲的数据会产生干扰,可能本来是A特征对结果的影响更大,但因为其量纲较小,导致其影响力还不如量纲大的特征,从来导致精度的下降。
提神速度:同 ...
GNN系列之_GraphSAGE
GraphSAGE定义17年Hamilton在GCN发布不久以后就发布了这篇文章,原文是《Inductive Representation Learning on Large Graphs》,从题目很明显可以看出,该论文强调两个事情:1.inductive;2.Large Graphs。
1.什么是inductive
在常用的机器学习或者深度学习模型中,我们通常会讲数据集分为训练集,测试集,验证集,各个集合之间相互是独立的,因为如果存在交集就变成了数据泄漏,那测试集的效果就不能正确的反应结果。但是在GCN中,由于模型中存在领结矩阵,这个是数据集通用的,这样的训练方式叫做transductive。因为为了避免这种类似数据泄漏的操作,GraphSAGE是一种inductive模式,即训练集,测试集,验证集相互独立。
2.为什么叫适用于大规模图
从GCN的公式中我们可以知道,GCN的训练需要将全部的领结矩阵放入训练,这样对于大规模图训练是不可用的,而GraphSAGE是利用采样聚合的方式,训练聚合函数,因此可以用minbatch来训练大规模图。
3.为什么叫GraphSAGE
这个是我在一开 ...