1.代码表示学习
2.利用TPU-MLIR实现LLM INT8量化部署
3.深度语义匹配模型DSSM及其变体CNN-DSSM,量源 LSTM-DSSM
4.Bert是如何得到句向量和词向量的
代码表示学习
代码,编程语言的码词精髓,如今正通过代码表示学习,向量赋予机器理解其内在结构的编码智能。这一技术通过自动学习和端到端训练,量源展现出超越人工特征设计的码词宝塔专题页源码卓越性能。 不同于自然语言处理中的向量词向量表示(word2vec),代码表示学习需巧妙应对代码的编码独特性,如重复性、量源规律性(语法的码词逻辑性)以及鲁棒性(代码错误的敏感性)。它在lexical(词汇)、向量syntactic(语法)和semantic(语义)层次上,编码构建起代码的量源基石,词汇单元(lexical tokens)遵循严格规则,码词映射至实际执行的向量语义含义。 Alon等人的创新在于AST路径学习,通过注意力机制,赋予模型关注代码结构中关键路径的能力,揭示了代码的syntactic关系。然而,这些早期工作在恢复lexical和syntactic信息方面有所欠缺,未能充分挖掘identifier的自然语义价值。CodeBERT和GraphCodeBERT则通过预训练模型,如MLM(Masked Language Modeling)和RTD(Replaced Token Detection),致力于生成符合语法的代码,但它们往往过于依赖lexical信息,对syntactic信息的建模还有待加强。 面对这些挑战,老司机兑换源码研究者们尝试改进,如CodeBERT的扩展版本,引入Edge Prediction和Node Alignment预训练任务,同时结合MLM,使用Attention Mask处理图数据。尽管面临数据处理复杂和输入长度限制,通过AST简化表示,这些改进旨在平衡AST和代码序列表示,增强模型的适应性。例如,UniXcoder在保持syntactic信息的同时,兼容多种模式,适用于多种预训练任务,显示出对代码表示多样性的深刻理解。 在Allamanis等人工作的基础上,文章强调了将AST单纯引入图模型在VarMisuse任务中的局限性,因此提出了leaves-only图表示,聚焦于控制流和数据流的叶子节点。本文着重于代码的语义表示,揭示了理解代码的编译器视角以及数据增强在提升代码语义表示方面的潜力。不同的下游任务对代码信息的需求各异,例如,VarMisuse任务可能并不需要syntactic信息的全面支持。 为了进一步提升代码表示学习的效果,研究者们提出了两类结合结构化模型优点的模型:Graph Sandwich和Graph Relational Embedding Attention Transformer (Great)。这些创新不仅挑战现有技术,还探索了从编译器角度解读代码表示的QQ音乐钓鱼源码新路径。参考文献中,[6] Hellendoorn等人的工作展示了全局关系模型在源代码理解中的应用,[7] Allamanis等人则开创了程序图表示学习的先河,而[8] Bui等人则通过自我监督学习,探索了代码检索和摘要的新领域。利用TPU-MLIR实现LLM INT8量化部署
在年7月,我们已成功将静态设计应用于ChatGLM2-6B在BMX单芯片部署,采用F量化模式,模型大小为GB,平均速度为3 token/s。为提升效率与降低存储需求,我们进一步对模型执行了INT8量化部署。
传统TPU-MLIR的INT8量化方案并不适合LLM。这主要是由于LLM中PTQ校准或QAT训练成本过高,一轮校准可能需1-2天,且量化误差导致模型精度大量损失。基于此,我们沿用了ChatGLM2的W8A策略,对GLMBlock中Linear Layer权重进行per-channel INT8量化存储,运算时反量化至F,以确保精度损失几乎为零。
在编译器的Top至Tpu层lowering阶段,TPU-MLIR自动替换MatMul算子,将权重矩阵切分为W8AMatMul,以区分具有不同矩阵输入的算子。以ChatGLM2中某个MatMul算子为例,量化后权重从MB减至MB,cryengine2源码额外的Scale使用了0.MB存储,实现近一半的存储空间节省。相关源码可在TPU-MLIR仓库查询。
性能提升主要源于W8AMatMul后端算子优化。TPU架构下,W8A的计算过程分为5步,通过GDMA与BDC指令并行执行数据搬运与运算,将Local Memory分为两部分,确保效率。当左矩阵数据量较小时,性能瓶颈在于右矩阵数据加载,W8A量化减少数据搬运总量,额外运算时间被覆盖,性能影响可忽略。
从LLM角度看,推理流程包括prefill与decode。prefill阶段输入词向量补位至最大文本长度,decode阶段固定取前一轮生成的token作为输入。因此,prefill阶段GLMBlock接收数据量大时,W8A性能提升有限,而decode阶段$L_{ row}$恒为1,能实现显著性能提升。
应用W8A量化后,ChatGLM2-6B整体性能得到优化。具体结果展示如下:
深度语义匹配模型DSSM及其变体CNN-DSSM, LSTM-DSSM
在研究推荐和排序算法的过程中,DSSM(深度结构语义模型)是分时画线源码不可或缺的一部分。本文将详细介绍DSSM及其变体CNN-DSSM和LSTM-DSSM。
论文链接:microsoft.com/en-us/res...
源码:github.com/baharefatemi...
简介
现代搜索引擎在检索文章时,通常将文章中的关键字与query中的内容进行比较。然而,这种做法存在一个问题,即文字具有多义性,同样的含义可以用多种表达方式进行表达。因此,我们需要对query和document进行语义上的相似度匹配。
通常,我们会使用隐语义模型LSA、LDA来衡量Query和Document之间的相似性。然而,由于LSA、LDA是无监督学习的模型,这些模型的效果并不符合预期。基于隐语义模型,有两种扩展:第一种是使用BLTM结合DPM来拟合query和document之间的关系,另一种方法是采用深度模型对query和document进行自编码,但这两种方法都是无监督的方法。
本文针对搜索场景,提出了一系列深度网络语义模型(Deep Structured Semantic Models),模型的核心思想是:首先将query和document映射到同一个低维语义空间,然后通过cosine来计算query和document之间的距离。与之前的无监督学习模型不同,DSSM使用document的点击量进行训练,因此DSSM的效果要优于其他无监督模型。
接下来,我们来看看DSSM是如何对query和document进行处理的。
DSSM的结构采用DNN结构,将输入的query和document转换到低维的语义空间,然后计算他们的cosine相似度。
语义特征计算部分,首先使用DNN网络将query和document从高维的空间转换到低维的空间。对输入的query和document假设他们是x,经过转换的向量为y,[公式]表示隐藏层,[公式]分别表示隐藏层的参数和偏置。
最后一层采用tanh函数作为激活函数。最后将query和document映射到低维向量之后,我们采用cosine计算他们的相似度。
为了解决query和document在第一层维度非常大的问题,本文提出了word hashing的方法,来对文本进行降维。做法就是使用n-gram来表示一个词语,例如good,我们把它拆分成trigram:go goo ood od。
为了训练DSSM,我们需要得到query和他们对应的点击的document。作者假设如果用户点击了某个document,那么这个query和document就是相关的。因此,作者认为DSSM的目标是最大化给定query所对应的document的条件似然函数。条件似然函数的计算方式为:[公式]。其中,[公式]是平滑参数,D是针对query的所有可能相关的document集合,[公式]表示和query有关的且用户点击的document。
有了以上的介绍,我们所要最大化的条件似然函数就是[公式]。因此,loss函数就是:[公式]。文中作者采用梯度下降法来最大化loss函数。
作者收集了现实生活中用户搜索的日志作为实验的数据集,这份数据包含条用户query,平均每条query包含条url。每一个(query, document)的相关性分为5档,分别是0~4分,得分是人工评价的。模型的排序效果通过NDCG来衡量,这是推荐系统常见的评价指标,具体就是评价推荐给用户的内容是否是用户感兴趣的,而用户的阅读习惯一般是从上到下,所以我们希望将最相关的内容排在前面,然后以此类推。
实验效果如下,其中:首先我们可以看出DSSM的效果优于其他模型,并且L-WH DNN的效果是最好的。
DSSM是搜索里非常经典的一个算法,在工业界也广泛被使用。而且,根据应用场景的不同,对特征处理也会有一些区别。例如,在推荐召回模块的应用中,我们的输入可能就不再是query和doc的word embedding,而是用户和推荐的物品(例如**,商品)的特征。
本文依然是由DSSM的作者提出,在语义特征计算部分采用CNN网络,网络结构如上图所示。在词向量的表达上依然采用了word hash(不知道为啥作者对word hash这么执着)。
不过,trigram表示不能忽略了文本的上下文信息,因此作者在word trigram的基础上增加了letter trigram。在一定的窗口大小内,对该窗口内的word进行拼接就是letter trigram,例如I have an apple,可以被拼接为 # I have, I have an, ... 以此类推。
然后以上表示经过卷积层,max-pooling,和全连接之后得到query和doc的低维向量。最后计算相似度的时候还是cosine距离。
本文针对CNN-DSSM无法捕捉长文本的上下文信息的缺点,引入了LSTM。同时在LSTM的cell中加入了peehole,LSTM的cell结构如上图所示。
与传统的LSTM不同,作者在遗忘门、输入门、输出门中都考虑了[公式],总体来说考虑的信息更丰富。
Bert是如何得到句向量和词向量的
本文深入探讨了Bert预训练模型如何生成输入句子的句向量和词向量。在HuggingFace的BERT源码中,BertModel类承担着这一关键角色。其作用在于接收经过padding对齐后的token_id(bert_inputs/input_ids)和表示哪些token_id需要被mask的attention_mask,进而生成句子的句向量和词向量。
在BertModel类的架构中,通过一系列组件如get_extended_attention_mask()、BertEmbedding、BertEncoder和BertPooler进行紧密串联,最终为每个输入句子生成了包含丰富信息的向量表示。具体而言,BertModel的内部结构由这些核心组件共同协作,确保了模型能够准确捕捉文本的语义特征。
其中,get_extended_attention_mask()函数对输入的attention_mask进行特殊转换,将1和0分别映射为0和-,以增强模型对未被mask的token的注意力,同时削弱被mask token的影响。这一操作对于确保模型准确理解和处理输入文本至关重要。
BertEmbeddings类负责将输入的token_id与预定义的embedding(包括token embedding、token type embedding和position embedding)进行融合,形成多维度的embedding_output。这一过程通过层规范化和Dropout操作进一步增强向量的表示能力,确保了输入数据在通过后续层处理时的稳定性和泛化能力。
BertEncoder类则通过串联多个BertLayer,实现了对文本序列的多层编码。每个BertLayer通过自注意力机制(Self-Attention)对输入序列进行特征提取,构建出多层次的语义表示。在BertEncoder中,每个BertLayer的输出与下一个BertLayer的输入结合,最终生成包含多个层次信息的hidden_states,为文本理解提供丰富的上下文依赖。
最后,BertPooler组件从sequence_output中提取出表示整个句子的向量,即通过取出第0个token(CLS)的向量表示,经过线性变换和激活函数后输出,得到pooled_output。这一输出不仅包含了句子的全局特征,还承载了对句子整体语义的概括,为后续任务如文本分类、命名实体识别等提供了强有力的输入基础。
综上所述,BertModel类通过精心设计的组件协作,有效地将输入文本转换为句向量和词向量,为自然语言处理任务提供了高效、强大的表示能力。