尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

零基础理解大语言模型:从N-gram概率猜词到神经网络

零基础理解大语言模型:从N-gram概率猜词到神经网络 简介这份PDF是一份面向初学者的《大语言模型入门的基础知识》讲义适合希望理解LLM底层逻辑、语言模型演化脉络的读者。内容从LLM背景切入先澄清语言模型的定义与评估指标再按规则统计模型、神经语言模型、预训练模型到大模型的路径展开重点讲解N-gram的计数原理、马尔科夫假设及其优缺点并过渡到神经网络语言模型的网络结构与训练思路。资源仅1个PDF文件约3.24MB整体结构清晰包含目录、阶段图示和实例计算可直接作为入门笔记或备课材料。已有129人学习下载对正在建立大模型知识框架、需要系统性扫盲的学习者尤其有价值。1. 先把玄学拆掉大语言模型就是一台“猜词机器”我刚开始接触“大语言模型”的时候满脑子都是“神经网络”“深度学习”“参数量”这些词听上去像一门玄学。后来我换了个角度想它其实特别像你手机输入法里的那个“联想”。你敲出“我想”输入法会猜下一个字是“吃”还是“去”猜得准不准取决于它见过多少人的聊天记录。大语言模型本质上就是一台见过海量文本、被训练得特别会“猜下一个词”的机器。它能做问答、翻译、写文案都是因为“猜词”能力强到一定程度之后自然涌现出来的本事。这篇文章适合完全零基础的新手不要求你会写代码也不要求你学过数学只用大白话把“这是什么、为什么要学、第一步怎么迈”讲清楚。2. 为什么要学语言模型从“一句人话”到“一段对话”2.1 语言模型到底在算什么一句话是人话的概率语言模型Language Model缩写 LM有一个很容易理解的通俗定义它是一个用来计算“一个句子看起来像不像人话”的模型。比如“我想去打篮球”这句话正常人都会说模型会给它一个很高的概率而“我篮球去想想打”这种乱序词串模型会给它一个很低的概率。标准定义稍微严谨一点假设一个句子由词序列组成比如 S {W1, W2, W3, …, Wn}语言模型就是在计算这个序列出现的概率 P(S)。如果给出的词序符合人们的使用习惯概率就高如果不符合概率就低。你可能会想这有什么难的直接数一数语料里这句话出现过几次不就行了理论上可以但你很快就会翻车。因为真实语言里几乎每一句话都是第一次出现你不可能靠着“数数”去覆盖无限多种句子组合。所以语言模型要解决的核心问题不是“背下见过的句子”而是“给没见过的句子也估算出一个靠谱的概率”。2.2 从文本生成视角看给定上文猜下一个词语言模型还有另一种更常见的定义也是现在大模型产品最直观的样子给定一个短语或一句话模型能预测接下来最可能出现的词。你可以把它想象成“成语接龙”或者“歌词接龙”。我说“床前明月”你大概率会接“光”我说“举头望明”你大概率会接“月”。语言模型做的就是这件事只不过它见过的文本比你多得多接词的能力也强得多。从概率角度说一个句子的概率可以用链式法则拆开P(W1, W2, …, Wn) P(W1) × P(W2|W1) × P(W3|W1,W2) × … × P(Wn|W1,…,Wn-1)。也就是说只要能把每一步“在已知前文的情况下下一个词是谁的概率”算出来整个句子的概率就能算出来。所以很多文献里也直接说语言模型就是能算出 P(W1,W2,…,Wn) 的模型。这个视角很重要因为大语言模型的生成过程就是一步一步把下一个词“猜”出来再把所有词拼成一段话。2.3 为什么大模型突然“像人”了规模带来的质变语言模型不是新鲜事物它已经发展了几十年。早期是规则和统计模型之后是神经网络模型再之后是预训练语言模型最后才走到今天的大语言模型。很多人好奇为什么以前的语言模型那么“笨”现在的突然像能聊天一样关键在“规模”两个字。大语言模型通常指参数量非常大的模型。目前比较常见的说法是参数量超过 100 亿10B的才算大语言模型。举个直观的例子在 2020 年前后有人发布了参数量高达 1750 亿的模型第一次让外界看到“原来模型大到一定程度不用专门训练它也能根据你给的例子完成任务”。后来各种大模型陆续出现有的几百亿参数有的上万亿参数。参数量变大模型见过的文本变多它“猜词”的能力和知识储备就会明显上升。这也是为什么我们感觉“大模型突然像人一样聪明了”它不是换了新魔法而是把同一套“猜词”逻辑做到了极致。3. 核心概念从 N-gram 到神经网络第一个能算的例子3.1 N-gram用“前几个词”猜下一个要让没接触过的人第一次理解语言模型我特别推荐从 N-gram 入手。它的思路特别朴素一个词出现的概率只和它前面有限的几个词有关。如果只和前面一个词有关就叫 bigram二元模型如果和前面两个词有关就叫 trigram三元模型。一般来说N-gram 模型假设当前词只依赖于它前面的 N-1 个词。为什么做这个假设因为要准确猜下一个词理论上需要把前面所有历史都考虑进去但这样的话可能性太多根本算不过来。N-gram 直接砍掉长距离依赖我不看完整历史只看最近的一两个词。这样参数少、好计算而且在实际语料里能算出可用的概率。它最大的缺陷也很明显只会用“前面有没有出现这个词对”来判断比如遇到从没见过的词组合模型就会给出 0 概率这在实际应用中非常尴尬。3.2 手把手算一个 bigram 概率计数、除法、验证我们来做一个不用电脑也能算的例子目标就是算出 P(想|我)也就是“当上一个词是‘我’时下一个词是‘想’的概率”。假设我们有这样一个小语料库一共 5 个句子编号句子1我 想 去 打 篮球2我 想 吃 晚饭3我 喜欢 打 篮球4我 爱 学习5他 想 去 打 篮球第一步统计“我”后面出现过的所有词。你会发现“我”后面分别跟过“想”“想”“喜欢”“爱”所以 C(我) 4也就是“我”作为前一个词出现了 4 次。第二步统计“我”和“想”连续出现的次数。句子 1 和句子 2 里有“我 想”其他句子没有所以 C(我, 想) 2。第三步计算条件概率P(想|我) C(我, 想) / C(我) 2 / 4 0.5。这个 0.5 的意思就是在这个语料里看到“我”之后有 50% 的可能性下一个词是“想”。用同样的方法你可以算出任意两个词之间的转移概率。是不是很简单N-gram 模型的训练过程就是把所有这种计数统计清楚然后做一次除法。这就是它的“训练”。你可能会问这个模型这么简陋有什么用它的价值在于你能亲手算出来、亲手验证能直观理解“概率从哪来”。我第一次学的时候自己拿 Excel 把这 5 个句子数了一遍才真正明白原来机器“学会”语言的方式这么朴实先数再除然后拿去猜。这个经验也成了我后来理解所有复杂模型的地基。3.3 神经网络语言模型跳出“只看前几个词”的限制N-gram 有个天然短板它只能看到前 N-1 个词看不了更长的上下文。为了解决这个问题人们开始用神经网络来做语言模型。神经网络方案的思路是把每个词用一个向量表示然后把前几个词的向量拼起来经过一个全连接层再用激活函数处理一下最后通过 softmax 输出下一个词的概率分布。具体来说第一层会把前 n-1 个词对应的词向量首尾拼接形成一个长向量。第二层是一个全连接层把拼接后的向量做线性变换再用 tanh 激活函数引入非线性。第三层输出 V 个节点V 是词汇表大小每个节点代表“下一个词是词汇表里第 i 个词”的得分最后用 softmax 把这些得分转成概率。这样的好处是模型可以通过训练自动调整词向量让意思相近的词在向量空间里也相近所以对于没见过的词组合它也能根据语义给出估计泛化能力比 N-gram 强得多。而且词向量本身就是一个很有用的副产品很多自然语言处理任务都会拿它当输入。当然神经网络语言模型也有缺点比如对很长的序列建模能力有限训练过程中也容易出现梯度消失之类的问题。但不管怎样它已经比你亲手算的 bigram 聪明太多了。4. 从 N-gram 到大模型四代模型各自在解决什么问题4.1 第一代规则和统计模型为什么撑不住语言模型的发展大致可以分成四个阶段。最早期是基于规则和统计的语言模型典型代表就是我上面讲的 N-gram 模型。那个时代专家设计规则再用统计方法对固定长度的文本窗口建模。它的优点是参数容易训练可解释性强直观好理解。但它的缺陷也特别致命。第一个缺陷是参数空间过大。如果用链式法则把整个句子的条件概率都算出来可能性几乎无穷多根本没法学。第二个缺陷是数据稀疏。很多词对在语料里一次都没出现过按最大似然估计算出来的概率就是 0可现实里人家可能只是没赶上你这份语料而已。由于这两个问题早期的统计模型只能在小词汇量、短文本场景里凑合用一旦遇到真实世界的海量文本就立刻力不从心。4.2 第二代神经网络语言模型如何改进随着神经网络技术成熟第二代语言模型开始出现。它不再依赖“数前面几个词出现几次”这种硬计数而是用词向量把词转换成数值表示再用神经网络去学习词与词之间的组合规律。相比 N-gram它的泛化能力更好数据稀疏问题也缓解了不少。我第一次看神经网络语言模型结构图的时候最惊讶的一点是它居然能把“国王”和“王后”这类词的位置关系在向量空间里对应出来。虽然它当时的目标只是“预测下一个词”但为了把下一个词猜准模型不得不把很多语义信息也学到手。这就像你为了做好菜天天背菜谱最后不但学会做菜还顺带认识了不少食材。不过第二代模型仍然有局限它处理长序列的能力有限而且一旦序列变长训练时容易出现梯度消失导致模型学不到远处的信息。4.3 第三代预训练语言模型第三代是预训练语言模型代表思路是 BERT、GPT、T5 这一类。它们的核心做法特别像“先实习、再上岗”先在大规模通用文本上做“预训练”让模型学到通用的语言表示再针对具体任务做“微调”也就是拿下游任务的数据再训练一下让模型适应某个特定场景。预训练阶段模型读海量文本学着填空、猜下一句、判断两句话是否连贯这些“自监督训练目标”不需要人工标注文本本身就是答案。微调阶段你在已有模型基础上用少量带标签的数据继续训练把它调整成能分类、能问答、能翻译的专用模型。这个范式的最大优势是一个预训练模型可以服务多个下游任务而且效果通常比从零开始训练好得多。当然它的缺点也很明显预训练需要非常大的计算资源而且模型的解释性比较差。它就像一个知识渊博但不太会解释自己心思的人你知道它能力强但很难说清它到底为什么这样判断。4.4 第四代大语言模型第四阶段就是我们所说的大语言模型时代。这个阶段的标志是模型参数规模急剧增大架构逐步走向自回归模型开始强调生成、对话和多模态核心生产范式也变成“和各种内容生成”挂钩也就是常说的 AIGC。大语言模型最让人惊艳的能力是它可以通过和人类对话进行“对齐”也就是不断调整自己的输出让回答更可靠、更安全、更符合人类偏好。很多你看到的大模型产品背后都做了大量这种对齐工作才让人觉得“它真的像个人”。它的优点是能像人类一样沟通聊天甚至能调用插件去自动检索信息。它的缺点也很现实参数量大算力要求高训练时间长还可能生成有害的或有偏见的内容。但你要记住大语言模型并不是“另一种语言模型”它是在前面三代基础上把数据、参数、算力一起堆上去之后产生的质变。理解了前几代模型是怎么一步步解决问题的你就能明白大模型并不是天上掉下来的黑匣子而是一路踩坑踩出来的产物。5. 新手避坑指南这些坑我当年全踩过5.1 坑一把“语言模型”和“对话产品”画等号现象很多新手第一次接触大模型直接就用聊天窗口于是以为大语言模型就等于那个对话框甚至觉得“模型就是产品”。原因你看到的对话产品其实只是一个壳外壳里除了语言模型还有提示词设计、鉴权、安全过滤、下游插件等一系列组件。模型本身并没有“产品”那么多花哨功能它真正做的还是“猜下一个词”。解决学的时候把“模型”和“产品”分开。用“模型”的视角看问题时就先想它的核心能力不要被产品界面的花哨功能带偏。5.2 坑二以为参数越大越好现象看到“1750 亿参数”“上万亿参数”就热血沸腾觉得参数越大就是越强于是选模型只盯着参数规模。原因参数大确实能带来更强的能力但参数量不是唯一指标。训练数据质量、训练方式、对齐程度、推理成本都很重要。而且参数越大对硬件要求越恐怖很多时候你根本跑不动。解决入门阶段先不要纠结超大模型。先拿小型开源模型或在线 API 练手把“输入、输出、概率”这些基础概念吃透再用大模型去解决实际问题。5.3 坑三把“概率生成”当成“确定答案”现象同一个问题你问两次得到的答案有时不同你就会觉得模型坏了或者觉得它在胡言乱语。原因大语言模型生成文本时本身就是按概率采样的它每次预测下一个词都有一个概率分布然后从分布里挑一个。这不是 bug而是模型生成机制的一部分。解决想让它稳定就需要设置好温度参数或采样策略并且明确告诉它“请给出确定性的回答”。如果只是拿来做体验你就要接受它偶尔给你来点“小惊喜”。5.4 坑四只会看“答得好不好”不懂看评估指标现象你训练完一个小模型试了几个句子觉得还行就以为万事大吉了。但换一批句子立刻崩你都不知道崩在哪。原因凭感觉评估非常不靠谱因为你看到的样本太少而且人眼容易被“看起来通顺”欺骗。真正的语言模型评估要用指标比如困惑度Perplexity它衡量的是模型对真实文本的预测能力。困惑度越低通常代表模型对语料的拟合越好。解决入门阶段就可以给自己的小模型算一个困惑度先跑通评估流程再慢慢接触 BLEU、ROUGE 这类任务专用指标。这样你以后看到“这个模型效果很好”的说法时至少知道别人是用什么尺子量的。6. 下一步怎么学从跑通一个最小的 bigram 开始6.1 准备好环境和语料我建议你学习大语言模型的第一课不是直接跑一个几百亿参数的大模型而是自己亲手写一个最小的 bigram 语言模型。你不用装任何深度学习的库只要电脑里有 Python 就行。你先准备一段很小的中文语料比如corpus [ 我 想 去 打 篮球, 我 想 吃 晚饭, 我 喜欢 打 篮球, 我 爱 学习, 他 想 去 打 篮球 ]注意我在每个词之间都加了空格这样方便按空格切词。这一段语料总共 5 个句子足够你跑通整个流程。6.2 写出第一个 bigram 计数模型下面这段代码实现的是我前面讲的三步统计前一个词出现次数、统计前后两个词连续出现次数、计算条件概率。from collections import defaultdict # 1. 统计词对出现次数 pair_count defaultdict(int) # 2. 统计每个前驱词出现次数 prev_count defaultdict(int) for line in corpus: words line.split() for i in range(len(words) - 1): prev, cur words[i], words[i 1] pair_count[(prev, cur)] 1 prev_count[prev] 1 # 3. 计算条件概率 def bigram_prob(prev, cur): if (prev, cur) not in pair_count: return 0.0 return pair_count[(prev, cur)] / prev_count[prev] print(bigram_prob(我, 想)) # 输出 0.5 print(bigram_prob(我, 爱)) # 输出 0.25代码逻辑很直白第一个循环统计“我 想”这种连续词对出现了几次同时统计“我”作为前一个词出现几次。最后用词对次数除以前一个词次数就得到了条件概率。比如“我 想”出现了 2 次“我”作为前驱出现了 4 次所以概率就是 2/4 0.5。你可以试着把“我”后面换成别的词或者自己加几个句子重新运行。你会直观看到数据变了概率就变了模型的“语言习惯”也跟着变。6.3 用模型预测下一个词接下来可以加一个小函数给定一个词从所有可能的下一个词里挑概率最高的那个。这就是最原始版“猜下一个词”的功能。def predict_next(prev): candidates {} for (p, c), cnt in pair_count.items(): if p prev: candidates[c] pair_count[(p, c)] / prev_count[p] if not candidates: return None return max(candidates, keycandidates.get) print(predict_next(我)) # 输出 想这个函数会遍历所有词对找到所有“以‘我’开头”的词对算概率后选最大值。在刚才的语料里“我 想”概率最高因此输出“想”。等你跑通了这个例子你就亲手实现了一个完整的统计语言模型虽然它很小但所有语言模型要解决的核心问题你都已经接触到了。6.4 之后的学习路线建议如果你还想继续往前走我的建议是接着做三件事。第一给这个 bigram 模型加上平滑策略处理没出现过的词对别让它一遇到新组合就概率归零。第二去看一个开源预训练模型库用现成工具加载一个小模型感受一下微调流程。第三去找一份含困惑度计算的代码把评估指标跑通以后你就能用数字说话而不是全靠感觉。我从那以后每次学一个新模型都强制自己走一遍“先看结构、再跑最小例子、最后算评估指标”的流程。哪怕只是训练一个 5 句话的玩具模型也要完整走完免得自己停留在“看着都会、动手就慌”的状态。希望帮到你。本文还有配套的精品资源点击获取
返回列表