
个人主页 for_ever_love__ 欢迎各位大佬莅临其他栏目: 我想学python了 其他栏目: iOS项目总结大全 其他栏目: iOS UI 文章目录概率与统计——分布、期望与贝叶斯语言模型的建模基础一、概率分布模型眼里的世界1.1 离散分布1.2 采样按概率抽一个二、条件概率与链式法则语言模型的数学骨架2.1 条件概率2.2 从零统计一个 bigram 模型2.3 零概率问题与平滑三、交叉熵与困惑度模型好不好用数字说话3.1 信息量与熵3.2 交叉熵这就是模型的损失函数3.3 困惑度 Perplexity四、采样策略temperature、top-k、top-p4.1 Temperature 温度4.2 Top-k 与 Top-p核采样4.3 完整解码示例五、贝叶斯不确定性下的推理RAG 的哲学基础六、常见坑与注意事项七、本篇小结概率与统计——分布、期望与贝叶斯语言模型的建模基础承上上一篇《线性代数入门》我们知道词是向量、注意力是点积。本篇本篇学概率分布、条件概率与链式法则——解释模型怎么「选出下一个词」。启下下一篇《微积分基础》解决「参数该往哪个方向调、调多少」。学完这一节你能动手做用交叉熵与困惑度衡量一个语言模型好不好用 temperature、top-k、top-p 控制生成的严谨与发散从零统计一个 bigram 语言模型理解 GPT 在预测什么上一篇我们搞定了线性代数知道了词是向量、注意力是点积。这一篇回答一个更根本的问题大模型输出下一个词到底是怎么选出来的答案是它给词表里每一个词算一个概率然后按概率抽样。整个大模型的本质就是一台条件概率机器。理解了概率你就能理解为什么 temperature 调高模型更胡说八道、为什么大模型会一本正经地编造事实幻觉、困惑度 perplexity 到底在衡量什么。一、概率分布模型眼里的世界1.1 离散分布词表有 N 个词模型对每个词给一个概率加起来 1importnumpyasnp vocab[猫,狗,跑,吃,鱼]probsnp.array([0.45,0.25,0.15,0.10,0.05])print(和为:,probs.sum())# 必须是 1.0forw,pinzip(vocab,probs):print(f{w}:{p:.0%})这就是一个概率分布categorical distribution。大模型最后一层 softmax 输出的正是这样一个向量——只不过真实词表有 5 万15 万个词。1.2 采样按概率抽一个有了分布怎么选词不是直接取最大的而是抽样np.random.seed(0)# 按概率抽样 10000 次看频率是否收敛到给定概率samplesnp.random.choice(len(vocab),size10000,pprobs)countsnp.bincount(samples,minlengthlen(vocab))/10000forw,p,cinzip(vocab,probs,counts):print(f{w}: 理论{p:.2%}实测{c:.2%})实测频率会非常接近理论概率——这就是大数定律。也解释了为什么同一个问题问两次模型可能给出不同的答案它在抽样不是一个确定性函数。二、条件概率与链式法则语言模型的数学骨架2.1 条件概率P(鱼 | 猫)读作已知前面是’猫’下一个词是’鱼’的概率。语言模型做的就是这件事P(整句话) P(猫) × P(追|猫) × P(了|猫,追) × P(鱼|猫,追,了)链式法则联合概率 一串条件概率的乘积。这就是**自回归语言模型GPT**的数学定义。2.2 从零统计一个 bigram 模型不用神经网络光靠数数也能做一个语言模型corpus[我 爱 吃 苹果,我 爱 吃 香蕉,我 不 爱 吃 鱼,他 爱 吃 苹果,小 猫 吃 鱼,]fromcollectionsimportdefaultdict bigramdefaultdict(lambda:defaultdict(int))unigramdefaultdict(int)forlineincorpus:wordsline.split()foriinrange(len(words)-1):bigram[words[i]][words[i1]]1unigram[words[i]]1unigram[words[-1]]1defp_next(prev,word):P(word | prev)ifunigram[prev]0:return0.0returnbigram[prev][word]/unigram[prev]print(P(吃 | 爱) ,p_next(爱,吃))# 爱后面全是吃 → 1.0print(P(苹果 | 吃) ,p_next(吃,苹果))# 吃后面苹果2次/共4次 → 0.5print(P(鱼 | 吃) ,p_next(吃,鱼))# 给定吃下一个词的完整分布totalsum(bigram[吃].values())forw,cinbigram[吃].items():print(f P({w}|吃) {c/total:.2f})这就是语言模型最朴素的形态数语料 → 算频率 → 当概率。GPT 做的事完全一样只不过它用一个 1750 亿参数的神经网络来预测这个分布泛化能力强一万倍。2.3 零概率问题与平滑上面的模型有个致命伤语料里没出现过的组合概率 0一乘全完蛋。print(P(火箭 | 吃) ,p_next(吃,火箭))# 0.0 → 整句话概率归零解决办法是平滑smoothing给没见过的组合分一点点概率defp_next_smooth(prev,word,alpha0.5,V1000):加 α 平滑分子 α分母 α*Vreturn(bigram[prev][word]alpha)/(unigram[prev]alpha*V)print(平滑后 P(火箭|吃) ,p_next_smooth(吃,火箭))神经网络模型天然避免了这个问题——softmax 的输出永远不为 0除非下溢这就是它比 n-gram 强的原因之一。三、交叉熵与困惑度模型好不好用数字说话3.1 信息量与熵一个事件的概率越小发生了带来的信息量越大I(x) -log P(x)P1必然发生→ 信息量 0说了等于没说P0.001稀有→ 信息量 ≈ 6.9很意外熵 信息量的期望衡量分布有多不确定defentropy(p):pnp.array(p)pp[p0]# 0*log0 约定为 0return-np.sum(p*np.log2(p))print(均匀分布(5个词):,entropy([0.2]*5))# ≈ 2.32 bit 最不确定print(集中分布:,entropy([0.95,0.02,0.01,0.01,0.01]))# ≈ 0.36 bit 很确定3.2 交叉熵这就是模型的损失函数交叉熵衡量用分布 Q 去编码真实分布 P平均要花多少信息量defcross_entropy(p_true,q_pred):p_true: one-hot 真实标签q_pred: 模型预测的概率分布p_truenp.array(p_true)q_prednp.clip(np.array(q_pred),1e-12,1.0)# 防 log(0)return-np.sum(p_true*np.log(q_pred))# 真实下一个词是猫(index 0)y_true[1,0,0,0,0]print(猜得很准:,cross_entropy(y_true,[0.90,0.05,0.03,0.01,0.01]))# ≈ 0.105print(猜得一般:,cross_entropy(y_true,[0.40,0.30,0.20,0.05,0.05]))# ≈ 0.916print(猜错了 :,cross_entropy(y_true,[0.05,0.80,0.10,0.03,0.02]))# ≈ 2.996结论预测越准交叉熵越小。训练大模型就是在最小化交叉熵——让模型给正确答案的概率尽可能接近 1。3.3 困惑度 Perplexity困惑度是交叉熵的指数形式更直观defperplexity(ce):returnnp.exp(ce)print(ce0.105 → ppl ,perplexity(0.105))# ≈ 1.11print(ce2.996 → ppl ,perplexity(2.996))# ≈ 20.0困惑度的直观含义模型在预测时相当于在几个词之间犹豫。ppl20 意味着模型每次预测时感觉像是在 20 个候选词里随机挑——越接近 1 越好。评测大模型时经常看到ppl这个指标现在你知道它在说什么了。四、采样策略temperature、top-k、top-p同一个模型为什么有时严谨有时放飞答案是采样策略。4.1 Temperature 温度logitsnp.array([3.0,2.0,1.0,0.5,0.1])# 模型原始输出未归一化defsoftmax_with_temperature(logits,T1.0):zlogits/T zz-np.max(z)enp.exp(z)returne/np.sum(e)print(T0.5 (保守):,softmax_with_temperature(logits,0.5).round(3))print(T1.0 (默认):,softmax_with_temperature(logits,1.0).round(3))print(T2.0 (放飞):,softmax_with_temperature(logits,2.0).round(3))Temperature效果适用T 1分布更尖锐倾向高概率词代码生成、事实问答、抽取任务T 1原始分布通用T 1分布更平缓冷门词也有机会创意写作、头脑风暴T → 0等价于贪婪解码总选最大需要确定性输出temperature 调太高模型就开始胡说八道——因为低概率往往是错的的 token 被抽中的概率上升了。调太低则输出重复、呆板。4.2 Top-k 与 Top-p核采样更精细的控制只在靠谱的候选里抽。deftop_k_sample(probs,k3):idxnp.argsort(probs)[-k:]# 概率最高的 k 个subprobs[idx]/probs[idx].sum()# 重新归一化returnnp.random.choice(idx,psub)deftop_p_sample(probs,p0.9):核采样按概率从高到低累加只保留累计到 p 的最小集合ordernp.argsort(probs)[::-1]cumsumnp.cumsum(probs[order])keeporder[cumsump]iflen(keep)0:keeporder[:1]subprobs[keep]/probs[keep].sum()returnnp.random.choice(keep,psub)probssoftmax_with_temperature(logits,1.0)print(分布:,probs.round(3))print(top-k(2) 抽样 10 次:,[top_k_sample(probs,2)for_inrange(10)])print(top-p(0.9) 抽样 10 次:,[top_p_sample(probs,0.9)for_inrange(10)])top-p 比 top-k 聪明候选数量自适应。分布很确定时只留 23 个词分布很平模型没把握时留几十个——所以现在主流 API 默认推荐 top-p。4.3 完整解码示例defgenerate(model_predict_fn,prompt_tokens,max_new10,T0.8,top_p0.9):自回归生成的通用骨架tokenslist(prompt_tokens)for_inrange(max_new):logitsmodel_predict_fn(tokens)# 模型给下一步的 logitsprobssoftmax_with_temperature(logits[-1],T)next_idtop_p_sample(probs,top_p)tokens.append(int(next_id))returntokens# 用假模型演示流程vocab_size20fake_modellambdatoks:np.tile(np.arange(vocab_size,0,-1)/20.0,(len(toks),1))print(generate(fake_model,[1,2,3],max_new8))真实 GPT 的生成就是这个循环预测 → 采样 → 拼回去 → 再预测。你每次看到模型一个字一个字往外蹦就是在跑这个循环。五、贝叶斯不确定性下的推理RAG 的哲学基础贝叶斯定理P(A|B) P(B|A) · P(A) / P(B)用人话讲先验 P(A)是你原本的信念看到证据 B 之后更新成后验 P(A|B)。# 经典例子疾病检测# P(病) 0.01先验发病率 1%# P(阳性|病) 0.99真阳性率# P(阳性|健康) 0.05假阳性率p_disease0.01p_pos_given_disease0.99p_pos_given_healthy0.05p_posp_pos_given_disease*p_diseasep_pos_given_healthy*(1-p_disease)p_disease_given_posp_pos_given_disease*p_disease/p_posprint(f检出阳性后真得病的概率:{p_disease_given_pos:.1%})结果只有约16.7%——远低于直觉。这就是基础概率谬误因为健康人基数太大假阳性数量反超真阳性。和大模型什么关系RAG检索增强生成的哲学就是这个P(答案 | 问题) ← 只靠模型参数记忆先验→ 容易幻觉 P(答案 | 问题, 检索到的文档) ← 加入外部证据 → 更可信RAG 做的事就是给模型注入证据把后验分布掰到正确答案上。理解了贝叶斯你就理解了为什么 RAG 能治幻觉。六、常见坑与注意事项坑现象解决log(0)loss 变-inf/nannp.clip(p, 1e-12, 1)概率和不为 1采样报错用 softmax 保证归一化直接exp(logits)大 logits 溢出成 inf先减max再 exptemperature 设 0除零T 最小设 0.01或改贪婪解码忽视先验模型自信地胡说用 RAG 补证据 / 要求给出引用小样本统计不可靠bigram 概率抖动加平滑或增大语料七、本篇小结大模型 条件概率机器P(下一个词 | 上文)链式法则把整句概率拆成一串条件概率。交叉熵是损失函数训练就是让正确答案的概率趋近 1困惑度 ppl直观表示模型在几个词间犹豫。Temperature控制分布尖锐程度低严谨确定高创意发散过高胡说。Top-k / Top-p限制候选集top-p 自适应更主流自回归生成就是预测→采样→拼接循环。贝叶斯解释了 RAG 的价值注入外部证据用后验替代纯参数记忆的先验从而抑制幻觉。下一篇微积分基础导数、梯度与链式法则。这是反向传播的数学钥匙——我们会手推一个两层网络的梯度并对比手算梯度和数值梯度完全一致让你彻底相信反向传播不是魔法。本篇是《大模型开发从 0 到 1》专栏第 15 篇阶段 2「数学基础LLM 视角」第 2 篇。专栏文章按「分类专栏」归类顺序学习体验最佳。