系列回顾:前两篇我们把概率基础(随机变量、期望、方差)和条件概率与贝叶斯定理讲透了。这一篇聚焦具体的概率分布——它们是深度学习里对数据建模的"语言",选择什么分布意味着对数据结构做了什么假设。我们从最直觉的角度讲透每个分布,然后联系到 DeepSeek V3/R1 里的具体用途。
上一篇我们学了条件概率,知道了语言模型本质上是在算 $P(\text{下一个词} \mid \text{上文})$。
但这个条件概率具体长什么形状?是所有词等可能(均匀分布)?还是只有少数词可能(尖峰分布)?还是平滑地集中在某几个词附近(类似正态)?
概率分布描述的就是这个"形状"——随机变量取各个值的可能性如何分布。
不同的应用场景,适合不同的分布: - 语言模型的下一个词:分类分布(128K个类别,各有不同概率) - 网络权重的初始值:正态分布(集中在零附近的连续分布) - Dropout是否保留某个神经元:伯努利分布(要么保留,要么丢弃) - 从词表均匀采样:均匀分布(所有选项等可能)
这篇文章把深度学习里最重要的几个分布,从形状、参数、性质到应用,逐一讲透。
伯努利分布(Bernoulli Distribution) 描述只有两种结果的随机实验:成功(1)或失败(0)。
只有一个参数 $p \in [0,1]$,表示成功的概率:
$$P(X=1) = p, \quad P(X=0) = 1-p$$
写成统一的形式:
$$P(X=x) = p^x (1-p)^{1-x}, \quad x \in \{0, 1\}$$
期望和方差:
$$\mathbb{E}[X] = p, \quad \text{Var}[X] = p(1-p)$$
方差在 $p=0.5$ 时最大(最不确定),在 $p=0$ 或 $p=1$ 时为零(完全确定)。
最经典的例子是抛硬币:正面(1)概率为 $p$,反面(0)概率为 $1-p$。
用途一:Dropout 正则化
训练时,每个神经元以概率 $1-p_{drop}$ 被保留,以概率 $p_{drop}$ 被置零。每个神经元的"保留/丢弃"决策服从伯努利分布:
$$\text{mask}_i \sim \text{Bernoulli}(1 - p_{drop})$$
为什么 Dropout 有效?它让网络不能依赖任何单个神经元,因为任何神经元都可能被"杀死",迫使网络学习更鲁棒的特征表示。
用途二:二分类输出
二分类问题(正面/负面、真/假、相关/不相关),模型输出经过 Sigmoid 函数,得到伯努利分布的参数 $p$:
$$p = \sigma(z) = \frac{1}{1+e^{-z}} \in (0,1)$$
训练目标是最大化标签 $y \in \{0,1\}$ 在伯努利分布下的对数概率:
$$\log P(y; p) = y \log p + (1-y) \log(1-p)$$
取负号求和,就是二元交叉熵损失(Binary Cross-Entropy Loss)——伯努利分布的负对数似然。
用途三:掩码语言模型(BERT 风格)
BERT 的预训练用"遮掩语言模型":对每个 token 以 15% 的概率随机掩盖,让模型预测被掩盖的词。每个位置是否被掩盖服从 $\text{Bernoulli}(0.15)$。
分类分布(Categorical Distribution) 是伯努利分布的 $K$ 类推广:有 $K$ 个可能结果,各有概率 $p_1, p_2, \ldots, p_K$,满足 $\sum_{k=1}^K p_k = 1$。
$$P(X = k) = p_k, \quad k = 1, 2, \ldots, K$$
用 one-hot 向量 $\mathbf{e}_k$(第 $k$ 位为 1,其余为 0)表示结果:
$$P(X = \mathbf{e}_k) = p_k$$
期望:$\mathbb{E}[X] = (p_1, p_2, \ldots, p_K)^T$——就是概率向量本身。
DeepSeek V3 在每个位置生成下一个 token 时,实际上是在定义一个 $K=128000$ 的分类分布。
怎么从 logits 得到分类分布?
模型输出 128000 维的 logits 向量 $\mathbf{z}$(未归一化的分数),经过 Softmax 变换:
$$p_k = \frac{e^{z_k}}{\sum_{j=1}^K e^{z_j}}$$
Softmax 保证了所有 $p_k > 0$ 且 $\sum_k p_k = 1$,得到合法的分类分布参数。
训练目标:最大化真实 token 的概率,等价于最小化交叉熵损失:
$$L = -\log p_{y^*} = -z_{y^*} + \log \sum_j e^{z_j}$$
拿到分类分布的参数 $\{p_k\}$ 后,有两种生成策略:
贪心解码:每次选概率最大的 token。 $$x_t = \arg\max_k p_k$$ 确定性,但可能陷入重复或过于保守。
采样:按概率分布随机采样。 $$x_t \sim \text{Categorical}(\mathbf{p})$$ 有随机性,输出更多样,但可能偶尔采到低概率的奇怪词。
温度采样:用温度参数 $\tau$ 控制分布的"尖锐程度": $$p_k(\tau) = \frac{e^{z_k/\tau}}{\sum_j e^{z_j/\tau}}$$
DeepSeek 的 API 默认 $\tau = 1$,代码生成任务适合用较低的 $\tau$,创意写作适合用较高的 $\tau$。
离散均匀分布:$K$ 个结果等可能,每个概率为 $\frac{1}{K}$。
$$P(X = k) = \frac{1}{K}, \quad k = 1, 2, \ldots, K$$
$$\mathbb{E}[X] = \frac{K+1}{2}, \quad \text{Var}[X] = \frac{K^2-1}{12}$$
连续均匀分布 $\text{Uniform}(a, b)$:在区间 $[a, b]$ 上等可能取值。
$$f(x) = \frac{1}{b-a}, \quad x \in [a, b]$$
$$\mathbb{E}[X] = \frac{a+b}{2}, \quad \text{Var}[X] = \frac{(b-a)^2}{12}$$
在所有离散分布里,均匀分布的熵(Entropy)最大:
$$H(X) = -\sum_k p_k \log p_k$$
当所有 $p_k = \frac{1}{K}$ 时,$H = \log K$,取最大值。
熵衡量不确定性。均匀分布表示"对所有结果一无所知,完全没有偏好"——这是在没有任何先验信息时最合理的选择,不对任何结果额外偏袒。
标签平滑(Label Smoothing) 就利用了这个思想:
与其用 one-hot 标签(把所有概率压在正确类别),不如用: $$\tilde{p}_k = (1-\varepsilon) \cdot \mathbb{1}[k=y] + \frac{\varepsilon}{K}$$
把正确类别的概率从 1 降到 $1-\varepsilon+\frac{\varepsilon}{K}$,其余类别从 0 升到 $\frac{\varepsilon}{K}$。
效果是混入了一点均匀分布($\varepsilon$),防止模型对训练集过度自信,提升泛化性。DeepSeek V3 等大模型训练时通常会用这个技巧($\varepsilon$ 通常设为 0.1)。
Xavier 均匀初始化:
$$W \sim \text{Uniform}\left(-\frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}}, \frac{\sqrt{6}}{\sqrt{n_{in}+n_{out}}}\right)$$
为什么选这个范围?要让 $\text{Var}[W] = \frac{2}{n_{in}+n_{out}}$(保持前向传播信号稳定),代入均匀分布的方差公式 $\text{Var} = \frac{(b-a)^2}{12}$ 反解边界 $b$:
$$\frac{(2b)^2}{12} = \frac{2}{n_{in}+n_{out}} \Rightarrow b = \sqrt{\frac{6}{n_{in}+n_{out}}}$$
数学不是魔法,是从目标(方差稳定)反推参数的结果。
正态分布(Normal / Gaussian Distribution) $\mathcal{N}(\mu, \sigma^2)$:
$$f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)$$
期望和方差:$\mathbb{E}[X] = \mu$,$\text{Var}[X] = \sigma^2$。
性质一:68-95-99.7 法则
$$P(\mu - \sigma \leq X \leq \mu + \sigma) \approx 68.3\%$$ $$P(\mu - 2\sigma \leq X \leq \mu + 2\sigma) \approx 95.4\%$$ $$P(\mu - 3\sigma \leq X \leq \mu + 3\sigma) \approx 99.7\%$$
几乎所有概率都集中在均值附近 $3\sigma$ 范围内。
性质二:线性变换保持正态
若 $X \sim \mathcal{N}(\mu, \sigma^2)$,则 $aX + b \sim \mathcal{N}(a\mu + b, a^2\sigma^2)$。
正态分布的线性组合还是正态,方便理论推导。这也解释了为什么分析神经网络激活值的统计时,假设正态是合理的起点。
性质三:独立正态之和还是正态
若 $X \sim \mathcal{N}(\mu_1, \sigma_1^2)$,$Y \sim \mathcal{N}(\mu_2, \sigma_2^2)$ 独立,则:
$$X + Y \sim \mathcal{N}(\mu_1+\mu_2, \sigma_1^2+\sigma_2^2)$$
方差相加——这正是为什么深层网络的激活方差会随层数累积,需要归一化层来控制。
中心极限定理(CLT):大量独立随机变量之和,不管原始分布如何,趋向正态分布。
神经网络的激活值 $a = \sum_{i=1}^d w_i x_i$,是 $d$ 个独立乘积的求和。当 $d$ 足够大时(比如 $d=7168$),CLT 保证 $a$ 近似正态,不管 $w_i$ 和 $x_i$ 原始分布如何。
这解释了: - 为什么权重初始化用正态分布是合理的(激活值会趋向正态) - 为什么 LayerNorm/BatchNorm 有效(假设激活近似正态,归一化后性质更好) - 为什么分析注意力分数时用正态假设(点积 $q \cdot k = \sum_i q_i k_i$ 是大量乘积之和,趋向正态)
应用一:Kaiming 初始化(针对 ReLU)
$$W \sim \mathcal{N}\left(0, \frac{2}{n_{in}}\right)$$
方差设为 $\frac{2}{n_{in}}$ 而不是 $\frac{1}{n_{in}}$,是因为 ReLU 会把负半部分置零,平均只有一半的神经元激活,相当于"损失了"一半的信号。乘以 2 来补偿这个损失,保持方差稳定。
应用二:扩散模型的噪声
扩散模型(DDPM)的前向过程:逐步向数据添加高斯噪声:
$$x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1-\bar{\alpha}_t} \varepsilon, \quad \varepsilon \sim \mathcal{N}(0, I)$$
最终 $x_T \approx \mathcal{N}(0, I)$——数据完全被噪声淹没,变成纯高斯噪声。
逆向过程学习去噪:从高斯噪声出发,逐步"去噪"恢复数据。这整个框架的数学基础是高斯分布的各种性质。
应用三:VAE 的隐变量
变分自编码器(VAE)假设隐变量 $\mathbf{z}$ 服从标准正态先验:
$$P(\mathbf{z}) = \mathcal{N}(\mathbf{0}, I)$$
编码器输出后验分布的参数 $(\boldsymbol{\mu}_\phi, \boldsymbol{\sigma}^2_\phi)$,重参数化技巧让采样可微:
$$\mathbf{z} = \boldsymbol{\mu}_\phi + \boldsymbol{\sigma}_\phi \odot \varepsilon, \quad \varepsilon \sim \mathcal{N}(\mathbf{0}, I)$$
把随机性转移到 $\varepsilon$(和参数无关),梯度可以正常通过 $\boldsymbol{\mu}_\phi$ 和 $\boldsymbol{\sigma}_\phi$ 传播。
标准正态分布 $\mathcal{N}(0, 1)$:均值为 0,方差为 1。
任意正态分布都可以通过标准化(Z-score)变换为标准正态:
$$Z = \frac{X - \mu}{\sigma} \sim \mathcal{N}(0, 1)$$
LayerNorm 的数学本质就是这个变换:
$$\text{LayerNorm}(\mathbf{x}) = \frac{\mathbf{x} - \hat{\mu}}{\hat{\sigma}} \cdot \boldsymbol{\gamma} + \boldsymbol{\beta}$$
先用样本均值和标准差做 Z-score 标准化,再用可学习的 $\boldsymbol{\gamma}$(缩放)和 $\boldsymbol{\beta}$(平移)恢复表达能力。
DeepSeek V3 用的 RMSNorm 是 LayerNorm 的简化版,只做方差归一化,不减均值:
$$\text{RMSNorm}(\mathbf{x}) = \frac{\mathbf{x}}{\sqrt{\frac{1}{d}\sum_i x_i^2 + \varepsilon}} \cdot \boldsymbol{\gamma}$$
实验发现去掉均值中心化对性能影响微乎其微,但计算更快,训练更稳定。
泊松分布(Poisson Distribution) 描述在固定时间或空间内,独立随机事件发生的次数。
参数 $\lambda > 0$(单位时间内事件的平均发生次数):
$$P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}, \quad k = 0, 1, 2, \ldots$$
$$\mathbb{E}[X] = \lambda, \quad \text{Var}[X] = \lambda$$
泊松分布的特点:均值等于方差。
泊松分布在 NLP 里有一个有趣的应用:建模文本中词的频率分布。
实际文本中,词频分布服从Zipf 定律(最常见词的频率是第二常见词的 2 倍,是第三常见词的 3 倍……),而不是泊松。
但泊松分布常用于对比学习的负样本采样:把"token 出现次数"建模为泊松,用来分析稀有词和高频词的统计差异,指导数据集构建。
更直接的应用:语言模型生成文本时的重复控制。重复惩罚(Repetition Penalty)可以理解为修改泊松分布的参数——降低已出现词的"再次出现期望次数"。
指数分布(Exponential Distribution) 描述独立随机事件之间的等待时间。
参数 $\lambda > 0$:
$$f(x) = \lambda e^{-\lambda x}, \quad x \geq 0$$
$$\mathbb{E}[X] = \frac{1}{\lambda}, \quad \text{Var}[X] = \frac{1}{\lambda^2}$$
无记忆性(Memoryless Property):$P(X > s + t \mid X > s) = P(X > t)$——已经等了 $s$ 时间,还需要等待的时间和从头开始等一样。这是指数分布的独特性质。
指数分布和正态分布有一个重要联系:如果 $X \sim \mathcal{N}(0, 1)$,则 $X^2 \sim \chi^2(1)$(卡方分布),而多个卡方分布之和的极限和指数族相关。
更直接的应用:Gumbel 分布(指数分布的极值分布)在语言模型采样中有重要作用。
Gumbel-Max 技巧:从分类分布采样,等价于在每个 logit 上加独立的 Gumbel 噪声,然后取 argmax:
$$x^* = \arg\max_k (z_k + g_k), \quad g_k \sim \text{Gumbel}(0, 1)$$
这个等价性让离散采样有了可微的近似(Gumbel-Softmax),对 MoE 路由的端到端训练很有帮助。
伯努利、分类、正态、泊松、指数分布……它们形式各异,但有一个统一的框架:指数族分布(Exponential Family)。
指数族分布的统一形式:
$$p(x; \eta) = h(x) \exp\left(\eta^T T(x) - A(\eta)\right)$$
几乎所有深度学习里常见的分布都属于指数族。
神经网络输出层叫"logit",很多人不知道为什么。
伯努利分布 $\text{Bernoulli}(p)$ 的自然参数是:
$$\eta = \log \frac{p}{1-p}$$
这个函数叫 logit 函数(log + odds 的合成词)。Sigmoid 函数是它的反函数:
$$p = \sigma(\eta) = \frac{1}{1+e^{-\eta}} = \frac{e^\eta}{1+e^\eta}$$
神经网络最后一层的输出就是这个自然参数 $\eta$,所以叫 logit——它是分类分布的自然参数,不是概率本身。通过 Softmax(多类版的 Sigmoid)转化为概率。
指数族有一个重要性质:MLE 的解等价于让模型期望充分统计量等于数据的样本充分统计量。
对高斯分布:MLE 解是 $\hat{\mu} = \bar{x}$(样本均值),$\hat{\sigma}^2 = \overline{(x-\bar{x})^2}$(样本方差)。充分统计量是 $(x, x^2)$,MLE 让 $\mathbb{E}[X] = \bar{x}$,$\mathbb{E}[X^2] = \overline{x^2}$——直接等于样本均值。
对分类分布:MLE 解是 $\hat{p}_k = \frac{n_k}{n}$(类别频率)。
所有这些干净的闭合解,都是同一个数学性质的体现。这解释了为什么深度学习的损失函数(交叉熵、MSE……)都有如此简洁的形式——它们都是某个指数族分布的负对数似然。
import numpy as np import torch import torch.nn.functional as F from scipy import stats np.random.seed(42) torch.manual_seed(42) # ===== 1. 伯努利分布:Dropout 模拟 ===== print("===== 伯努利分布:Dropout 模拟 =====\n") p_keep = 0.8 # 保留概率 d = 1000 # 神经元数量 # 训练时:随机置零 mask = np.random.binomial(1, p_keep, size=d) # 伯努利采样 activations = np.random.randn(d) # 模拟激活值 dropped = activations * mask / p_keep # 置零 + 缩放(保持期望不变) print(f"神经元总数: {d}") print(f"保留概率: {p_keep}") print(f"实际保留数: {mask.sum()} (期望={d*p_keep:.0f})") print(f"原始激活均值/std: {activations.mean():.4f} / {activations.std():.4f}") print(f"Dropout后均值/std: {dropped.mean():.4f} / {dropped.std():.4f}") print("(除以p_keep是为了保持期望一致,推理时不需要Dropout)") # ===== 2. 分类分布:温度对采样的影响 ===== print("\n===== 分类分布:温度采样 =====\n") # 模拟语言模型的 logits(10个词的小词表) vocab = ["猫", "狗", "鱼", "鸟", "在", "吃", "跑", "跳", "的", "了"] logits = torch.tensor([3.0, 1.0, 2.0, 0.5, 1.5, 1.8, 0.3, 0.2, 2.5, 1.2]) print(f"{'温度τ':>6} | {'最高概率词':>8} | {'最高概率':>8} | {'熵':>6} | {'概率分布(前5)'}") print("-" * 70) for tau in [0.1, 0.5, 1.0, 1.5, 2.0]: probs = F.softmax(logits / tau, dim=0) entropy = -(probs * torch.log(probs + 1e-10)).sum().item() top_idx = probs.argmax().item() top5 = sorted(zip(vocab, probs.tolist()), key=lambda x: -x[1])[:5] top5_str = " ".join(f"{w}:{p:.2f}" for w, p in top5) print(f"τ={tau:.1f} | {vocab[top_idx]:>8} | {probs[top_idx].item():>8.4f} | {entropy:>6.3f} | {top5_str}") # 模拟采样1000次,统计采样分布 print(f"\n温度τ=1.0 时,采样1000次的词频(期望分布):") probs_t1 = F.softmax(logits, dim=0) counts = np.zeros(len(vocab)) for _ in range(1000): idx = torch.multinomial(probs_t1, 1).item() counts[idx] += 1 for word, cnt, p in sorted(zip(vocab, counts, probs_t1.tolist()), key=lambda x: -x[1]): bar = "█" * int(p * 40) print(f" '{word}': 期望={p:.3f} 实际={cnt/1000:.3f} {bar}") # ===== 3. 正态分布:权重初始化的重要性 ===== print("\n===== 正态分布:权重初始化的重要性 =====\n") def simulate_forward(d, n_layers, init_std, activation='linear'): """模拟多层网络的前向传播,追踪激活值方差""" x = np.random.randn(1000, d) # 1000个样本 vars_per_layer = [x.var()] for _ in range(n_layers): W = np.random.normal(0, init_std, (d, d)) x = x @ W if activation == 'relu': x = np.maximum(0, x) vars_per_layer.append(x.var()) return vars_per_layer d = 256 n_layers = 8 print("不同初始化方案下,各层激活方差变化(d=256, 8层):") print(f"\n{'层':>4}", end="") for method in ["std=1.0(错误)", "Xavier", "Kaiming(ReLU)"]: print(f" {method:>16}", end="") print() print("-" * 65) std_bad = 1.0 std_xavier = np.sqrt(1.0 / d) # Xavier: sqrt(1/n) std_kaiming = np.sqrt(2.0 / d) # Kaiming for ReLU: sqrt(2/n) vars_bad = simulate_forward(d, n_layers, std_bad, 'linear') vars_xavier = simulate_forward(d, n_layers, std_xavier, 'linear') vars_kaiming= simulate_forward(d, n_layers, std_kaiming, 'relu') for layer in range(n_layers + 1): print(f"{layer:>4}", end="") print(f" {vars_bad[layer]:>16.4f}", end="") print(f" {vars_xavier[layer]:>16.4f}", end="") print(f" {vars_kaiming[layer]:>16.4f}") # ===== 4. 均匀分布:标签平滑 ===== print("\n===== 均匀分布:标签平滑 =====\n") K = 5 # 5个类别 epsilon = 0.1 y_true = torch.zeros(K) y_true[0] = 1.0 # 正确类别是0 y_smooth = (1 - epsilon) * y_true + epsilon / K print(f"原始 one-hot 标签: {y_true.numpy()}") print(f"标签平滑(ε={epsilon}): {y_smooth.numpy().round(3)}") # 对比损失 logits_overconf = torch.tensor([5.0, 0.5, 0.5, 0.5, 0.5]) # 过度自信的模型 log_probs = F.log_softmax(logits_overconf, dim=0) loss_hard = F.cross_entropy(logits_overconf.unsqueeze(0), torch.tensor([0])) loss_smooth = -(y_smooth * log_probs).sum() print(f"\n过度自信模型(logits={logits_overconf.tolist()}):") print(f" Softmax概率: {F.softmax(logits_overconf, dim=0).numpy().round(3)}") print(f" 硬标签交叉熵损失: {loss_hard.item():.4f}") print(f" 标签平滑交叉熵损失: {loss_smooth.item():.4f}") print(f" (标签平滑对过度自信有额外惩罚,防止模型太确定)") # ===== 5. 中心极限定理:正态分布的普适性 ===== print("\n===== 中心极限定理:正态分布的普适性 =====\n") # 从均匀分布采样,n个样本的均值趋向正态 n_experiments = 50000 print("Uniform(0,1) 的 n 个样本的均值分布(理论上趋向正态):") print(f"{'n':>5} | {'样本均值的均值':>14} | {'样本均值的std':>14} | 理论std | 正态性检验(p值)") print("-" * 75) for n in [1, 5, 30, 100]: sample_means = np.array([np.random.uniform(0, 1, n).mean() for _ in range(n_experiments)]) theoretical_std = np.sqrt(1/12 / n) # Var[Uniform(0,1)] = 1/12 # Shapiro-Wilk 正态性检验(用一个子集) _, p_value = stats.shapiro(sample_means[:500]) print(f"{n:>5} | {sample_means.mean():>14.4f} | {sample_means.std():>14.6f} | " f"{theoretical_std:>7.6f} | {p_value:.4f} {'← 正态 ✓' if p_value > 0.05 else '← 非正态'}") # ===== 6. 分布选择指南:根据场景选分布 ===== print("\n===== 分布选择指南 =====\n") scenarios = [ ("语言模型下一个token", "分类分布 Categorical(p₁,...,p_K)", "K=128K,Softmax输出"), ("Dropout保留/丢弃", "伯努利 Bernoulli(p)", "p=1-dropout_rate"), ("二分类输出", "伯努利 Bernoulli(σ(z))", "Sigmoid激活"), ("回归目标(假设高斯噪声)", "正态 N(f(x), σ²)", "→ MSE损失"), ("权重初始化(线性层)", "正态 N(0, 2/(n_in+n_out))", "Xavier/Kaiming"), ("VAE隐变量先验", "标准正态 N(0, I)", "重参数化技巧"), ("扩散模型噪声", "正态 N(0, σ²_t·I)", "前向加噪过程"), ("token均匀采样/对比学习", "均匀 Uniform(1/K)", "负样本采样"), ("标签平滑目标分布", "混合:one-hot + Uniform", "防止过度自信"), ] print(f"{'应用场景':<20} {'选用分布':<30} {'说明'}") print("-" * 80) for scene, dist, note in scenarios: print(f"{scene:<20} {dist:<30} {note}")
这篇文章把深度学习里最重要的概率分布,从直觉到公式、从参数到应用,系统讲透了。
第一,伯努利分布描述两结果的随机性,参数 $p$ 是成功概率。它是 Dropout(每个神经元的保留/丢弃)、二分类输出(Sigmoid + 二元交叉熵)和 BERT 掩码预训练的基础分布。
第二,分类分布是伯努利的多类推广,是语言模型下一个 token 预测的核心分布。Softmax 把 logits 转化为分类分布参数,温度参数控制分布的"尖锐度"(熵的大小)。logit 这个名字本身就来自伯努利/分类分布的自然参数。
第三,均匀分布是熵最大的分布,代表"一无所知"。Xavier 初始化用均匀分布,范围由"保持前向传播方差稳定"的目标反推。标签平滑混入均匀分布来防止模型过度自信。
第四,正态分布是深度学习的"默认分布"——中心极限定理保证了大量独立贡献之和趋向正态,这解释了为什么激活值近似正态、为什么正态初始化合理、为什么 LayerNorm 有效。Kaiming 初始化用正态分布,方差 $\frac{2}{n_{in}}$ 补偿了 ReLU 丢失一半信号的损失。
第五,所有这些分布都属于指数族,有统一的数学结构。MLE 在指数族上总有干净的闭合解(让模型期望充分统计量等于样本充分统计量),这解释了深度学习损失函数形式简洁的深层原因。
下一篇预告:
第14篇,我们讲最大似然估计(MLE):模型是怎么"学"出来的?
概率分布选好了,用什么标准来估计参数?MLE 给出了一个统一的答案:找到让训练数据出现概率最大的参数。第14篇会完整推导 MLE,展示它如何统一了分类任务的交叉熵损失、回归任务的 MSE 损失,以及语言模型的 NLL 训练目标。
每个概率分布背后都有一个关于"数据是如何生成的"的假设。选择伯努利,意味着你认为结果只有两种;选择正态,意味着你认为噪声是对称的高斯噪声;选择分类分布,意味着你认为结果是 $K$ 个离散类别之一。深度学习的设计,在很大程度上就是选择合适的分布来建模数据的生成过程。
还没有评论,来抢沙发吧!
博客管理员
40 篇文章
还没有评论,来抢沙发吧!