链载Ai

标题: LLM学习笔记:最好的学习方法是带着问题去寻找答案 [打印本页]

作者: 链载Ai    时间: 3 小时前
标题: LLM学习笔记:最好的学习方法是带着问题去寻找答案

知其然,然后知其所以然。本文主要是对学习赛博活佛Andrej Karpathy 7个小时教学视频的总结和拓展阅读笔记,推荐去看原视频,很精彩,链接在文末。从最常用的聊天应用过程分析开始,引入对话过程原理浅析,再到LLM训练过程;再结合当前主流的应用形式,在得知最新用法的同时,加深对LLM的理解;再谈谈AI的最新重大进展MCP;以及作为JAVAer,在Java领域有哪些前沿能力去整合LLM。

最后再罗列一下再公司内部一些AI平台、工具。最好的学习方法是带着问题去寻找答案,以费曼学习法为标准,产出可教学的资料。本文是个人所学梳理和所想记录,作为AI的小白,个人知识有限,难免有所错误、疏漏,请及时纠偏、不吝赐教,感谢。



1 大模型聊天过程分析

我打开AI聊天窗口DeepSeek.com/" textvalue="" target="_blank" linktype="text" data-linktype="2">https://chat.deepseek.com,发送我的Query:

1.1 流程浅析

当我们开始一个LLM聊天对话,输入问题时,实际上大模型托管服务有内置的上下文信息,在我们输入信息,按下发送按钮时,大模型收到的是内置上下文 + 系统服务Prompt + 用户输入信息。

大模型经过神经网络的概率统计(权重拟合)得到下一个要说的词,通过流式响应逐个词丢回会话窗口,用户就能看到大模型“正在打字”和我们聊天。“打字”的速度就是大模型响应的速度,通常看描述LLM性能的一个指标N token/s。

1.2 原理浅析

本质就是从输入的 tokens 推测下一个 token 的出现概率,将可能性较高的作为输出token,再将得到的token添加到输入中,直到满足结束条件(上下文长度限制、结束符以较高概率出现、用户定义的停止条件、概率阈值与采样策略、模型架构的隐式结束符)。所以LLM本质上是一个具有统计概率的知识记忆模糊的知识回顾系统,也可简称概率性复读机。那么这个回顾系统是怎么实现的呢,“zip文件”怎么得来的?构建一个现代的LLM三个步骤:**预训练、后训练(SFT)和强化学习(RL\RLHF)**。

1.3 预训练

在预训练过程中,需要有原始数据和验证数据,所以通常可以将数据集分为两份,例如90%用于训练,10%用于验证(具体比例可能因任务调整)。

1.3.1 数据集

图片来源huggingface.co/space...

数据集生成流程:

  1. 列举主流网站的URL

  2. 有害网站URL过滤,垃圾站点、成人内容等

  3. 从URL网站响应的富文本提取文字内容

  4. 文本语言过滤,如仅针保留英文或者中文内容,在huggingface上数据集语言分布前5如下图:

  5. Gopher 过滤,去除无意义、低信息量或有害内容(如垃圾文本、暴力、偏见等)

  6. MinHash 去重,用于快速检测并移除数据集中的重复或近似重复的文本片段(如文档、段落或句子)。其核心目的是减少数据冗余,避免模型因重复数据过拟合或偏向高频内容,同时节省计算资源。

  7. C4 过滤,C4(Colossal Clean Crawled Corpus) 数据集进行清洗和筛选的步骤,旨在从原始网页文本中提取高质量、多样化的语料,同时去除噪声、重复和低效内容。

  8. Custom Filters(自定义过滤器)目标是针对通用过滤方法(如MinHash去重、C4/Gopher过滤)无法覆盖的领域特殊性问题,进行更精细化的数据质量控制。

  9. PII Removal(个人身份信息移除) 是指从原始数据中识别并删除或匿名化 个人身份信息(Personally Identifiable Information, PII) 的关键步骤,旨在保护用户隐私、遵守数据保护法规(如GDPR、CCPA),并降低模型泄露敏感信息的风险。

预训练数据集示例:

1.3.2 Tokenization

tiktokenizer.vercel....上可以看到模型token可能是不一样的,这里举例OpenAI的对话示例:

可以看到OpenAI对数据结构化了,定义了对话角色,增加了<|im_start|>、<|im_sep|>、<|im_end|>这样的标识符用于分割对话,这些标识符都对饮一个token,“You are a helpful assistant”的tokens序列是“3575, 553, 261, 10297, 29186”。

Tokenization(分词/令牌化)是将输入文本拆分为模型可处理的离散单元(Token)的过程,即将文本数据表示为token的一维序列。它是自然语言处理(NLP)中的关键步骤,直接影响模型对文本的理解能力和效率。

数据集的原始文本数据量非常大,如著名的FineWeb数据集就有15万亿个token,总共44TB大小,需要高效拆分文本窗口,在能表达混合多种语言、复杂字符表达等情况,但不丢失语义。分词实际上就是一层映射包装,过粗、过细的分词都不利于训练和模型性能表现,分词过细(如字符级、字节级别、比特级别)导致长序列,计算开销大,分词过粗(如单词级)则词汇表爆炸,内存占用高。

采用BPE(Byte-Pair Encoding,如GPT)、WordPiece(如BERT)或SentencePiece,将文本转化为子词(subword)单元。BPE算法(Byte-Pair Encoding):平衡词汇表大小与序列长度。

原始文本:

原始字节

tokenization:

对话过程中输入的token越多,越分散注意力,降低模型准确性和性能,节约成本。不丢失信息的情况,越短越好,性能成本都会提升。所以,聊不同的主题应该单独开会话窗口。

1.3.3 词汇表

在tokenization过程中,我们发现,在44TB的文本内容里,很多词一起出现的概率较高,如图中49305后面出现17,那么就可以将49305与17合并成4930517,作为一个新的token,重复如此。最后,再将所有词汇压缩到最小映射表,重新编号token,这样就得到了一份可以还原44TB内容的词汇表。如GPT-4词汇表是100277个。主流大语言模型的词汇表大小如下(按数值从小到大排序):

  1. 原版LLaMA词汇表大小为32,000(32K),但中文token较少(仅几百个)。
  2. 中文LLaMA/Alpaca通过合并中文tokenizer后,词汇表扩展至49,953(约50K)。
  3. 优化后的实验模型






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5