自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(82)
  • 收藏
  • 关注

原创 钓鱼大模型,让它输出不该输出的东西

这个小发现只局限于Qwen模型,其他模板的喜欢都可以试试。能发现这个问题也是基于对LLM本身训练规则的思考,而且只要模板换了,或者厂家把user assistant 分隔符这种token换成闭源非开放的,马上就好了。试了一下,llama3.1也被这招攻破了。而且继续被攻破的输出接着提问,它也会继续输出涩情信息。

2024-08-16 21:55:43 888 1

原创 flash-attention123和ring-attention

它的主要思想是希望把对于attention score matrix的计算拆成有规律的小块,以可控的顺序避免机器自己做无用的HBM <—> SRAM之间的读写。一个朴素的想法就是,既然q要对每个kv计算,那么我干脆只读一次kv,让q来回倒腾,比起倒腾kv,这样读写量更少。所以必须把KV放循环的外层。

2024-08-14 13:31:05 492

原创 Asymmetric Loss For Multi-Label Classification

从b站视频区看到的一篇论文,来自阿里。据他所说,他的多标签分类数据长尾最大到100:1,再做增广也没用,用了这篇论文的loss直接起飞。

2024-08-13 20:29:55 369

原创 self-reasoning from baidu

我自己做rag时必加的一步就是相关性检测,但是只是yes or no的检测,而self-reasoning是带分析的检测,并且需要总结其中与query相关的信息,然后把这些信息作为llm的context,这就有点介于rag-fusion和普通rag之间了,不是直接得到子问题答案,也不是直接对着context输出答案,而是像做材料题一样,先摘出有用信息,再回答。一般rag检索回来的文本都是直接rerank,拿top-k个扔进llm里,但是这里面仍然会有不相关文档,可能导致幻觉。但是至少能改善现状。

2024-08-12 09:16:27 196

原创 如何通过大模型生成业务需要的数据集

现在大模型训练数据的主力都是LLM自己贡献的了。但是也不是说你让它输出什么,然后它就一劳永逸地不停地输出你想要的东西。受限于LLM本身的能力、上下文规定的长度、训练方式导致的有限变化,你需要不断变更你的prompt,以让输出更多样。接下来介绍的数据生成方法。

2024-08-08 10:14:44 869 1

原创 LLM的投机采样

如果部分接收了甚至全部拒绝了,这两种情况可以一起处理,则保存接收的部分,此时仍然可以使用上面提到的trick,从target model产生拒绝的位置采样下一个token,此时这个trick是必须做的,否则如果全部拒绝,你又不使用target的预测,你就永远不会往前移动了。基本思路很简单,假如你的input token长度10,small模型往前预测3个,也就是执行model() 3次,注意,你必须手动保存kv,即model()返回的past_key_values,并使用。r>0.5了,就合格。

2024-08-07 10:54:52 355

原创 Trainer、RewardTrainer、PPOTrainer、DPOTrainer都需要什么格式的数据?

Trainer用于预训练。这仨就是tokenizer给你的东西,所以处理语料是主要内容,然后扔tokenizer里得到这仨。一般input_ids就是你输入的整个QA语料,包括bos eos。具体格式得看具体模型。attention_mask与你的语料长度一致,一般全1。不一般是指这种情况:你一次的语料是一个batch,这会需要你对短的数据做left padding或right padding(取决于你在训练还是推理),对于padding的token就不能attention了,对应位置需要填0。

2024-08-05 13:35:35 231

原创 增量预训练阶段,是直接扔文本,还是扔指令数据集?

(吐槽一句,现在的大海捞针的海水是不是都是与针完全不相关的数据啊,纯纯考验的是长文本信息搬运能力吧,而不是海水里找淡水的能力。很多base模型都往预训练数据集里扔指令微调数据,应该是给SFT打基础,因为SFT阶段大家都不用input的loss,可能会让这块的语义理解能力打折,全靠预训练数据撑起来也不现实,所以指令微调数据也拿去预训练。是一个有用的工作,但是不一定有利于实际落地,因为QA训练基于raw data,而SFT时候没给你raw data,这是否是一种训练目标不一致?效果很好,对垂类应该很友好。

2024-08-04 17:49:49 326

原创 马后炮解释一下为什么swiglu更好

现在,我们把glu的sigmoid替换成了一个swish,你也可以理解为是glu里面塞了一个阉割版的glu,结果就是glu它自己把自己的问题解决了。你看swish的函数图像,首先它在0和1的位置有导数,好优化,门能关严(指0),还能大开门(指放大),这不就是完美的sigmoid上位替代品嘛。当然可以,但是肯定是算起来费时间,swish只需要一个超参数beta,剩下的计算大头只有sigmoid,而glu还有训练参数,一训练就又要陷入sigmoid的陷阱里了。swish单用时,缺点肯定与glu一样。

2024-08-04 15:51:55 168

原创 小结——知识注入

然后手动测试了几条wiki数据,发现关于数字的会有严重幻觉,例如“丹麦海峡的最长长度是多少“,不仅是我的模型,你百度去搜,百度ai给的结果也不对。假设现在LLM训练好了,对于query,后续token的概率都很高,除了”8“这个位置的概率几乎为0,那么对于后面的“0年1月23日”,如果前面这个“8”LLM吐不出来,那么它们的高概率也就完全不顶用了,大概率是要出所谓的“幻觉”的,毕竟你现在的状况和训练时候完全不一样嘛。知识,也就是你问他问题,他能输出正确的回答,这只是一个简单的输出token的过程。

2024-08-04 14:46:40 374

原创 DeepSeek-V2

等价于一个放大了8/3倍隐层的纺锤形FFN的参数量,而我看有些普通模型的FFN是放大4倍。一个反直觉的知识点:FFN层参数量几乎占整体参数量的2/3,对一个72B模型,如果按这个比例算,把FFN改成DeepSeekMoE的MoE,参数量会少。MoE使用router决定每个token具体使用哪个或哪一些expert,这在本来的Dense LLM中,是每个token使用同一个FFN,并且FFN是一个纺锤形网络结构,可能是300维先放大到1200维,再缩小回300维。

2024-08-02 13:10:42 327

原创 微调任何模型之前,先推理一遍,看看输出对不对劲,有助于辅助检查环境是否可靠

这几天在torch2.0.1上量化int4微调Qwen2-7B(base模型),lora r=32,调完用bfloat16推理,然后发现怎么都不像是微调过的样子,虽然输出格式已经被训好了,但是内容完全不符合训练数据,而且loss也降不下来。这段代码一来把output变float32,以便无损计算loss,二来inference时观察一下tensor。结果我从bfloat16推理改到int4量化推理时,发现输出变成了全inf!!!说明量化训练的时候就不对劲,能把输出格式训好,全靠lora自己。

2024-08-01 19:40:15 196

原创 预训练,增量预训练,instruction tuning,RLHF,这些步骤的目的都是什么?

这个阶段只是简单地把所有语料都扔到LLM里训练而已,让有顺序的单词在next token prediction时的概率更高。而增量预训练,肯定是有些词过于垂类,导致base LLM不会给它太高概率,因此你得告诉他有这些文本是这些词连在一起的,这样LLM就学到了,也就是所谓的“眼熟”。此时要不要训练embedding和lm_head是一个问题。我觉得除非是像“en模型加训成zh模型”一样的体量,否则小数据集别动embedding和lm_head。

2024-07-31 10:42:38 193

原创 记录我LLM预训练+微调时所有遇到的错误

我用的是transformers==4.42.3,出错文件是model_qwen2.py 1127行,当Qwen2 bfloat16时不出错,量化后出错,训练和推理都是。然而服务器和本地对比出错部分的代码,发现俩版本都是4.42.3,结果文件不一样。太啥比了,不知道怎么回事,输出半天也没发现哪里有问题。由于这个py文件我已经全读过了,出错代码我却从来没见过,遂卸载transformers重装。第一次重装后,运行通过,第二次运行又出现该错误,观察model_qwen2.py发现又是错误代码。

2024-07-30 15:01:59 227

原创 rag实际工程中好用的技巧

这是一个论文来着我记得。而且在langchain官方教学里也有。思路是一个query生成多个同样语义但是表述不同的query,然后分别进去rag,得到多个回答,最后把多个回答fusion,即总结。这个法子能很好滴增加正确文档的召回率。

2024-07-30 03:44:52 317

原创 tokenizer是如何训练的

说是训练,不如说是统计。

2024-07-30 01:21:30 354

原创 Qwen2就算是int4和lora,训练时仍然占很多显存

模型参数虽然freeze,但是要保存前向的中间过程,batch越多中间过程越多,但是没法从参数量直接推,和batch size/ hidden size/ sequence length /attention head / layer 这五个参数有关,而且为了反向传播,这个还得存成足够细的float16,因此所占空间极大,比前面参数+训练用的空间都要大,最后造成了前面 14891MiB / 45634MiB 的GPU消耗。显然,这也用了不少,参数量统计如下。这还是我batch=1的时候。

2024-07-29 20:54:49 147

原创 LLM还能拿来做异常检测

它使用distilbert-base-uncased这个模型给表格数据做文本embedding,并且期望这个LLM已经蕴含了合理的房产相关信息,因此对于没见过的异常房产信息,一定会产生一个与大多数信息embedding都不一样的embedding。收集一堆embedding后,假设我们已经有了一批好数据,则在UMAP降维算法的帮助下,能够轻易地把好数据的分布可视化,而且聚类也很好做,就找到了一堆聚类中心。使用2%的异常数据,Anom Quantile置信度0.55,异常列大概意思是随机选4列变成异常值?

2024-07-29 16:21:22 283

原创 LLM推理优化的一些方法

这个很好想到,对于足够大的模型,int8基本不伤性能。

2024-07-29 13:45:07 276

原创 LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

算子拆分了,一个矩阵乘法搞出两个,是省显存了,速度下来了。而且你8bit也和4bit差一半呢。2022年的论文,提出把XW过程里能量化的量化掉,不能量化的原样计算。从图里也能看出来它怎么搞的。

2024-07-29 13:14:22 152

原创 prompt design prompt learning prompt tuning instruction tuning prefix-tuning P-tuning prefix-layer

prompt tuning: freeze LLM参数,在input的地方用可训练的virtual-token embedding代替token embedding,然后通过带mask标记的模板引诱模型在mask处输出单词分布or单词之前的embedding,再把这个东西接到FFN上,训练这个FFN。难的任务多加点virtual-token,简单的少加点,然后多任务学习,复杂任务的效果比微调和P-tuning都要好很多。具体是生成几个可训练向量,过一遍MLP再放到token的位置。

2024-07-29 11:09:39 168

原创 rag输出了幻觉怎么办

这个论文让关键的事实性信息计算后的loss近乎归0,而应对其他问题仍然会有一定的loss,以此让LLM兼顾了记住关键事实和具有一定创造力的能力,其原理就是对于关键信息提问的query会严格依靠cross attention找到100万个memory中对应的32个memory向量,然后融合进query的embedding,与self-attention并行计算,结果再与self-attention的结果加和。另一个是忠实性幻觉,就是你要求LLM根据你给的材料给出答案,而LLM看着材料还答错了。

2024-07-27 14:49:20 537

原创 rag系统中,如果召回的文本里有一个超链接,要怎么办?

kimi阅读网页的顺序很有趣,有时间的排名更靠前,说明rerank中时间很重要,而且检索来源应该设置了过滤器,对于某类问题,需要在某些特定网站平台搜索结果,例如我搜索batchnorm和layernorm实际应用中的性能差距,kimi搜索了batchnorm性能 和 layernorm性能 这两个词,12个网页来自:pytorch官方文档、csdn、百度智能云、百度开发者中心、极市开发者平台。显然,kimi先拆解了我提出的问题并生成搜索关键字,这些关键字去搜索后返回大量链接,kimi要实时分析这些链接。

2024-07-27 09:33:48 234

原创 如何让LLM准确地输出一个json

json其实是有很严格的输出结构的,{后面必须是",第一个"肯定是key的,key之后肯定是 “:”,然后是value。我猜是直接在一开始强制生成{",然后强制不生成",直到生成一个合法的key,然后再遇到一个",然后继续强制。function call本质也是一个LLM训练的结构化输出,而且训练得够好,够稳定,比起要求LLM输出json,由function call格式代替然后转变成json更好。这是一个很机智的办法,甚至靠这一招还能诱导LLM输出那些它被“教育“不能生成的那些东西。

2024-07-27 00:10:34 501

原创 对于上千个类别的多标签文本分类任务,使用RAG进行分类:In-Context Learning for Extreme Multi-Label Classification

2.术语和关键词、标签,这俩东西都能embedding进空间里。不过这里并没有做任何对齐,只是使用预训练模型的能力而已。对于职位标签,论文用all-mpnet-base-v2。对于医学相关,使用BioLORD。这俩都是预训练模型,使用但不微调。1.使用DSPy框架,动态地分配few-shot给prompt。神奇的是即使是这个阶段,论文也没让7B模型做in-context learning。3.rerank使用gpt,排名靠前的就是更相似的。1.通过7B模型,让文章输出多个术语or关键词。

2024-07-26 23:19:00 195

原创 No module named ‘_lzma’

和这俩错误是前后脚的关系。

2024-07-23 20:56:05 390

原创 PyramidInfer

注意,如果在某一层扔掉了某个token的kv cache,那么后续层的该token的kv cache都要扔掉,且对于当前token sequence是永久扔掉。其他方法只在层内drop,下一层又要重新考虑上一层被drop的token,而在PyramidKV的观察下,LLM并不需要把drop的再捡起来。基于此,PyramidInfer尝试在每一层都除掉一些kv cache,随着层数加深,底层就只剩重要token了,符合LLM attention金字塔结构的特征。

2024-07-22 10:40:41 150

原创 vllm安装踩坑

我没找到好的解决办法,issue里说的情况都是在用源码安装后遇到的,我直接在干净环境ubuntu20.24 cuda12.2下面pip安装,仍然遇到了问题。而且问题指向是torch里的class缺少属性,因此我猜测是torch的问题,vllm的每个版本又强制要求某个torch版本,因此我只能选择之前的vllm版本。vllm0.5.2最近一周出了个不好搞的新issue,会遇到torch.ops._C没有rms_norm,或者没有reshape_and_cache_flash这两个属性的问题。

2024-07-18 17:32:04 692

原创 奇怪的错误记录

https://github.com/meta-llama/llama3/issues/80读模型没问题,推理时出现:RuntimeError: “triu_tril_cuda_template” not implemented for ‘BFloat16’————————————————我尝试了解transformers的AutoProcessor时,它提示我:RuntimeError: Failed to import transformers.models.auto.processing_auto

2024-07-11 20:24:04 513 2

原创 提示学习的本质是KNN

提示工程对某一类问题指定了一个共同的前缀。这其实是改变了query的分布,而在训练后,在提示学习的引导下,特定的提示词会让同一query分布对应的正确answer分布发生改变,使得这个正确answer所在的子空间的概率密度变大。遵循query的分布,answer的空间有其自己的分布,一个query进去,answer拿到的值是在其分布上的采样,也就是在输出端的不断sample。

2024-07-10 15:05:00 179

原创 DSPy的BootstrapFewShot

DSPy认为用原始数据直接做few-shot效果不好的原因是:output的answer不是LLM习惯的文本方式,所以尝试用一个teacher LLM(就是你提供的LLM,只不过现在当成teacher用),它满载max_labeled_example数量的few-shot example,这个few-shot example不会被改动。后者是不得已而为之,如果前者只能拿出2个,few-shot又要凑齐4个,那只能从原trainset里拿了,即使它在我们看来不是LLM生成的合适的answer。

2024-07-01 15:13:44 390

原创 cross-attention里为什么encoder提供的是KV?

依照attention在计算全连接图中有向边权重的思路,KV是中心节点的邻居们的KV,中心节点提供Q,与每个邻居单独交流(指QK),然后根据这个权重聚合邻居的信息(V)。因此,encoder提供KV,是全面抛弃了decoder端input的信息库,只将其作为从encoder中摘取信息的媒介(Q)。所以图without self-loop的图,每一个token的output都从同一个节点集合(encoder的input)采集信息。这是decoder-only好的理由之一。

2024-06-04 21:58:45 287

原创 GNN和LLM的关系——瞎想

套用这个想法,casual attention的任务等于图分类任务,给定一个序列token,在每一层decoder拓扑中的边权重都不同的情况下,在某个固定的master node(默认为最后一个token)上汇聚全图表示,然后预测图类别,类别就是token。我注意到,如果每一层的拓扑边权重都不一样,我可以解释成:除了第一层的输入,其他token节点都应该看作一个master node,这就和GNN图分类合上了,将全图特征聚于一个master node,就能用它预测图类别,图类别等于token。

2024-06-03 11:56:46 445

原创 为什么需要CoT,所谓“增加中间token给LLM思考”是什么意思?

那为什么CoT有用?原本直接根据query吐出answer,现在,先吐前半个answer,只要你数据里有这种数据,LLM吐半个就吐得准,然后根据query+前半个answer再吐后半个answer。另外,现有的CoT和改进一定不是解决复杂answer的方法,CoT还是在把问题看作序列生成,依靠拆解问题,基于LLM本身的能力,用类似蒙特卡洛的方法提高最优解题思路的概率,这种办法不具有远视能力,是贪心的方法,只有整条路径上“正确答案”的比例都高才能稳定得到最终的正确答案。所以或许RL才是解决CoT短视的方法。

2024-06-03 11:17:00 197

原创 LLM能够触类旁通的原因

有了这两条,就能知道LLM为什么能够触类旁通了。因为loss逼它必须记住这些知识,所以迫不得已必须有损,差不多能输出对就行,只要一“差不多”,两个人的活就可以一个人干,就能省下一部分神经元去做其他功能,这一个人就有了“触类旁通”的能力。压缩的另一重境界就是同类归并,有论文已经实验出,中文词大概都在英文词的某一个方向,这样的数据对LLM最好处理,LLM只需要很少的神经元,就可以完成中英文转换。因此,所有的触类旁通,本质是过量数据对少量参数的压迫(想不出更好的词了),逼着它不得不用更少的神经元处理更多事务。

2024-06-03 10:47:35 152

原创 ppo-clip的本质以及它为什么是另一种ppo-KL-penalty

于是希望你增加,但是别太狠,就给你增加的量上设个限制,最多上涨一点,就有了负A时重采样比例<1-ε的说法,这样就能继续让这个action提供大比例的负A,打压目标函数R,R就会持续地缩小该action的概率。clip选择截断到1+ε,这等于是人为地增大了RL训练后的策略选中该action的概率(这就是说它等于KL散度的原因),也等于减小了目标函数R的值,反向凸显了其他采样里导致负A的action,彼消,此就涨,就能让RL后的策略选择正确action的概率回上来。对于A<0且重采样比例>1+ε呢?

2024-06-02 22:38:45 416

原创 为什么self-attention要除以一个根号dk

太one-hot了,这里的梯度直接全部到0,就太小了。我愿称之为softmax陷阱,就和sigmoid一样,你以为one-hot好,事实上谁知道呢,比起任由self-attention只关注一个v,还是看看远方的其他v更好吧。这样看,如果浅层网络已经提取到足够的信息了,后面的所有v都将与最有价值的v趋于一致,否则就会因为根号dk强制多see几个而引入不必要的v。这本应是好的,但是从实践来看,我们并不要求一定要输出one-hot,这有点over-fitting的感觉了。是softmax的结果。

2024-05-24 17:21:37 396

原创 PathSim和HeteSim的简单记录

PathSim和HeteSim

2022-12-14 14:08:08 597 2

原创 inductive 和 transductive

什么是直推式学习

2022-10-29 13:42:02 568

原创 证明半群S的非空子集A生成的理想是A⋃SA⋃AS⋃SAS

证明半群S的非空子集A生成的理想是A⋃SA⋃AS⋃SAS

2022-01-11 14:35:51 377

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除