系列回顾:上一篇我们把论文里的符号语言扫了一遍,认识了 Σ、argmax、∝ 这些"字母"。这一篇我们来讲指数和对数,这是贯穿整个深度学习的数学工具——从损失函数到注意力机制,从概率模型到信息熵,几乎到处都有它们的身影。
说起指数和对数,大多数人的第一反应是:"这个我会,高中学过。"
$2^3 = 8$,$\log_2 8 = 3$,互为逆运算,背几个公式,考试用用,就这样。
但如果你真的去看深度学习论文,会发现 log 出现的频率高得有点诡异。损失函数里有 log,注意力机制里有 log,信息熵里有 log,KL散度里有 log,几乎每隔几行就冒一个出来。
为什么?
这不是巧合,也不是数学家的偏好,而是 log 这个函数有几个非常独特的性质,让它在处理概率和优化的时候几乎无可替代。
这篇文章,我们从头捋一遍指数和对数,重点不是计算技巧,而是理解这些性质背后的直觉,以及它们是怎么一步步渗透进深度学习的每个角落的。
先从最直觉的地方入手。
假设你有一张纸,厚度是 0.1 毫米。现在你把它对折,变成 0.2 毫米;再对折,0.4 毫米;继续折,折 42 次之后,这摞纸的厚度超过了地球到月球的距离(大约 38 万公里)。
这就是指数增长,它的增长速度快得让人难以置信,而描述它的数学工具就是指数函数:
$$f(x) = a^x$$
其中 $a$ 叫做"底数",$x$ 叫做"指数"。
对折纸的例子里,$a = 2$,$x$ 是折叠次数,$f(x)$ 是厚度(以 0.1mm 为单位)。
这几条规则在推导公式时会反复用到,先记住:
$$a^m \cdot a^n = a^{m+n} \quad \text{(相同底数相乘,指数相加)}$$
$$\frac{a^m}{a^n} = a^{m-n} \quad \text{(相同底数相除,指数相减)}$$
$$(a^m)^n = a^{mn} \quad \text{(幂的幂,指数相乘)}$$
$$a^0 = 1 \quad \text{(任何数的0次方等于1)}$$
$$a^{-n} = \frac{1}{a^n} \quad \text{(负指数等于倒数)}$$
这些规则看起来简单,但在后面推导梯度、化简概率公式时会频繁用到,熟悉它们能省很多力气。
在所有可能的底数里,有一个特殊的数字:$e \approx 2.71828...$
这个数字叫做自然常数,它的神奇之处在于:$e^x$ 这个函数,求导之后还是它自己。
$$\frac{d}{dx} e^x = e^x$$
这个性质让 $e^x$(指数函数)在微积分里几乎是最好用的函数——求导不变形,计算极其方便。
深度学习里用到 $e$ 最多的地方是 Softmax 函数:
$$\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{n} e^{z_j}}$$
我们在后面专门讲 Softmax 那篇会详细解析,但现在先记住:$e^x$ 有两个非常好用的性质——
性质一:$e^x$ 的输出永远是正数,不管 $x$ 是正是负是零。
性质二:$e^x$ 能把任意范围的数值"拉伸"成差距悬殊的正数,方便做概率归一化。
比如输入是 $[1, 2, 3]$,经过 $e^x$ 之后变成 $[2.72, 7.39, 20.09]$,三者的差距被放大了,这让"最大值"更加突出,模型在做选择时更有把握。
如果指数是"已知底数和指数,求结果",那对数就是"已知底数和结果,求指数"。
$$2^3 = 8 \iff \log_2 8 = 3$$
读作"以 2 为底,8 的对数等于 3"。换句话说:2 需要乘几次自己才能得到 8?答案是 3 次。
一般形式:
$$a^y = x \iff \log_a x = y$$
其中 $a$ 是底数($a > 0$ 且 $a \neq 1$),$x$ 是真数($x > 0$),$y$ 是对数值。
有两个常用的特殊对数:
这几条性质非常重要,是 log 在深度学习里大量出现的根本原因:
性质一:乘法变加法
$$\log(a \cdot b) = \log a + \log b$$
这个性质看起来只是简化计算,但在处理概率时意义重大。
在语言模型里,生成一段文字的概率是每个词的条件概率相乘:
$$P(\text{这句话}) = P(w_1) \cdot P(w_2 \mid w_1) \cdot P(w_3 \mid w_1, w_2) \cdots$$
假设每个词的概率是 0.1,生成 100 个词的概率就是 $0.1^{100} = 10^{-100}$,这个数字小到计算机都存不下(浮点数下溢)。
取对数之后:
$$\log P(\text{这句话}) = \log P(w_1) + \log P(w_2 \mid w_1) + \log P(w_3 \mid w_1, w_2) + \cdots$$
乘法变成了加法,每一项是 $\log(0.1) = -1$,加 100 次得到 $-100$,这个数字计算机完全能处理。
这就是为什么语言模型训练时总是操作 log 概率,而不是概率本身。
性质二:除法变减法
$$\log\frac{a}{b} = \log a - \log b$$
这个性质在 KL 散度(衡量两个概率分布差异的工具)里会直接用到:
$$KL(P \| Q) = \sum_x P(x) \log \frac{P(x)}{Q(x)} = \sum_x P(x) [\log P(x) - \log Q(x)]$$
DeepSeek R1 的损失函数里就包含 KL 散度,用来约束模型不要偏离参考策略太远。我们在强化学习那篇会详细展开。
性质三:幂次变系数
$$\log(a^n) = n \cdot \log a$$
这个性质让很多复杂的幂次运算变得简单。比如求 $2^{100}$ 有多少位数,直接算 $\log_{10}(2^{100}) = 100 \cdot \log_{10} 2 \approx 100 \times 0.301 = 30.1$,所以 $2^{100}$ 是一个 31 位的数字,根本不需要真的把 $2^{100}$ 算出来。
性质四:log 是单调递增函数
$$\text{如果 } a > b > 0,\text{则 } \log a > \log b$$
这个性质非常重要!它意味着:最大化 $P$ 和最大化 $\log P$ 是等价的。
在深度学习里,我们经常不直接最大化概率,而是最大化对数概率(log-likelihood),原因就在这里——两者等价,但 log 版本数值上更好处理。
画出 $y = \log x$(以 $e$ 为底)的图像,你会发现几个关键特征:
第一:$x = 1$ 时,$y = 0$。因为 $e^0 = 1$。
第二:当 $x$ 从 1 向 0 靠近时,$y$ 趋向负无穷。$\log(0)$ 是没有定义的(或者说是负无穷大)。
第三:当 $x$ 很大时,$y$ 增长得非常缓慢。比如 $\log(100) \approx 4.6$,$\log(10000) \approx 9.2$,$x$ 增大了 100 倍,$\log x$ 只增加了一倍。
第四:$0 < x < 1$ 时,$\log x < 0$。这很重要——概率值都在 0 到 1 之间,所以对数概率永远是负数或零。
这个增长"越来越慢"的特性,给了 log 一个很特别的直觉意义:log 是对数量级的感知,而不是对绝对值的感知。
人类感知声音大小(分贝)、地震强度(里氏震级)都是对数的,因为人类对大小的判断本来就是相对的、对数式的。深度学习里用 log 来处理概率,某种程度上也是在做类似的事情——把"从 0.001 到 0.01"和"从 0.1 到 1"这两种变化,映射到同样数量级的数值范围。
终于到重头戏了。
神经网络的训练,本质上是一个"对答案"的过程:模型预测了一个结果,和正确答案比较,看差了多少,然后调整参数让差距变小。
"差了多少"这件事,需要一个数学上严谨的度量方式,这就是损失函数(Loss Function)。
对于分类问题,最常用的损失函数是交叉熵(Cross-Entropy):
$$L = -\sum_{i=1}^{C} y_i \log \hat{p}_i$$
其中: - $C$ 是类别数量 - $y_i$ 是第 $i$ 个类别的真实标签(正确类别是 1,其余是 0) - $\hat{p}_i$ 是模型预测第 $i$ 个类别的概率
对于二分类问题(只有两个类别,比如"是猫"和"不是猫"):
$$L = -[y \log \hat{p} + (1 - y) \log(1 - \hat{p})]$$
假设有一个三分类问题(猫、狗、鸟),正确答案是猫($y = [1, 0, 0]$)。
情况 A:模型预测 $\hat{p} = [0.9, 0.05, 0.05]$(比较有把握,认为是猫)
$$L_A = -[1 \times \log(0.9) + 0 \times \log(0.05) + 0 \times \log(0.05)]$$ $$= -\log(0.9) \approx -(-0.105) = 0.105$$
损失很小,模型预测得很好。
情况 B:模型预测 $\hat{p} = [0.1, 0.8, 0.1]$(认错了,觉得是狗)
$$L_B = -[1 \times \log(0.1) + 0 \times \log(0.8) + 0 \times \log(0.1)]$$ $$= -\log(0.1) \approx -(-2.303) = 2.303$$
损失很大,模型预测错了,被"惩罚"得很严。
直觉:当模型对正确答案的预测概率很高时,$\log(\hat{p})$ 接近 $\log(1) = 0$,损失接近 0;当预测概率很低时,$\log(\hat{p})$ 是一个很大的负数,加上负号后损失就很大。log 的"越接近 0 就越往负无穷扎"的特性,天然地惩罚了信心不足的预测。
你可能会问:不就是比较差距吗,直接用 $(y - \hat{p})^2$ 不行吗?
可以,但有一个问题:概率值在 0 到 1 之间,MSE 的梯度在极端值附近会变得非常小(梯度消失),导致训练极慢。
而交叉熵用了 log,它的梯度形式非常漂亮,和 Softmax 搭配使用时,梯度就是简单的 $\hat{p} - y$,数值稳定,训练高效。这是数学结构和工程需求完美契合的例子。
香农(Claude Shannon,不是 Claude AI)在 1948 年发明了信息论,其中最核心的概念之一是信息熵:
$$H(P) = -\sum_{i} p_i \log p_i$$
信息熵衡量的是一个概率分布的"不确定程度"。
举个例子:
情况 A:抛一枚公平硬币,正面概率 0.5,反面概率 0.5
$$H = -(0.5 \times \log 0.5 + 0.5 \times \log 0.5) = -\log 0.5 = \log 2 \approx 0.693$$
情况 B:抛一枚作弊硬币,正面概率 0.99,反面概率 0.01
$$H = -(0.99 \times \log 0.99 + 0.01 \times \log 0.01) \approx 0.056$$
公平硬币的熵更高,因为结果更难预测(不确定性更大);作弊硬币的熵更低,因为几乎可以肯定是正面(不确定性小)。
极端情况:如果某个结果的概率是 1(完全确定),其余概率为 0,那么熵等于 0——没有任何不确定性,也就没有任何信息量。
这个设计是有道理的。
假设你要传递一条消息,告诉别人"今天摇骰子摇到了 6"。骰子有 6 个面,概率是 1/6,这个信息"出乎意料",信息量大,需要更多比特来传递。
如果你说的是"今天太阳从东边升起了",概率接近 1,这句话完全没有信息量,你根本不需要说。
信息量和 $\log(1/p) = -\log p$ 成正比:概率越低,信息量越大,需要的 bits 越多。这就是 log 在信息论里出现的根本原因。
有一个很重要的关系:
$$\text{交叉熵}(P, Q) = H(P) + KL(P \| Q)$$
其中 $H(P)$ 是真实分布的熵,$KL(P \| Q)$ 是两个分布之间的距离(KL散度)。
这个等式告诉我们:最小化交叉熵,等价于最小化预测分布 Q 和真实分布 P 之间的 KL散度。
换句话说,训练语言模型最小化交叉熵损失,本质上是在让模型的预测分布尽量靠近真实数据的分布。这个视角把损失函数和信息论完美地联系起来了。
DeepSeek V3 和 R1 的训练都基于这个核心原理。
我们还没讲到注意力机制,但先提一下 log 在里面扮演的角色,作为后续篇章的预告。
Transformer 的注意力分数计算公式:
$$\text{Attention}(Q, K, V) = \text{Softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
这里有 Softmax,Softmax 里有 $e^x$,而 $e$ 和 $\log$ 是互为逆运算的,所以 log 在计算梯度、做数值稳定优化时会反复出现。
特别是在实现 LogSumExp 技巧时(一种避免数值溢出的计算方式):
$$\log \sum_i e^{x_i} = x^* + \log \sum_i e^{x_i - x^*}, \quad x^* = \max_i x_i$$
这个看起来复杂的公式,本质是利用 log 和 exp 的互逆关系来稳定数值计算,防止 $e^{大数}$ 导致的溢出。在推理框架的底层代码里,这个技巧被大量使用。
把 $y = e^x$ 和 $y = \ln x$ 画在同一个坐标系里,你会发现它们关于直线 $y = x$ 完全对称——这直观地说明了它们互为逆运算的关系。
几个关键数值对,建议记住:
从这个表格也能看出 log 的"压缩"效果:$e^x$ 从 1 增长到 20,而 $\ln x$ 只从 0 增长到 3。
你会在不同的地方看到不同底数的 log: - 信息论里用 $\log_2$(以比特为单位) - 论文里通常用 $\ln$(自然对数) - 有时也看到直接写 $\log$
不同底数之间可以互相转换:
$$\log_b x = \frac{\ln x}{\ln b}$$
比如:
$$\log_2 x = \frac{\ln x}{\ln 2} \approx \frac{\ln x}{0.693} \approx 1.443 \ln x$$
在深度学习实践里,底数不同只影响一个常数倍数,不影响优化结果(因为梯度里这个常数会消掉),所以很多论文在推导时不严格区分底数。
讲完数学,说一件工程上的实际问题。
在计算 Softmax 时,如果输入值很大,$e^{大数}$ 会溢出(超出浮点数能表示的范围)。比如 $e^{1000}$ 直接就是 inf,后续计算全乱了。
inf
标准 Softmax:
$$\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_j e^{z_j}}$$
数值稳定版本:
$$\text{Softmax}(z_i) = \frac{e^{z_i - z_{\max}}}{\sum_j e^{z_j - z_{\max}}}$$
减去最大值 $z_{\max}$ 之后,指数的最大输入变成了 0,$e^0 = 1$,不会溢出。而 Softmax 的值不变(分子分母同除了 $e^{z_{\max}}$)。
这个技巧的正确性证明,恰好用到了 log 和 exp 的运算规则:
$$\frac{e^{z_i - z_{\max}}}{\sum_j e^{z_j - z_{\max}}} = \frac{e^{z_i} / e^{z_{\max}}}{\sum_j e^{z_j} / e^{z_{\max}}} = \frac{e^{z_i}}{\sum_j e^{z_j}}$$
等价,但数值稳定。这是数学和工程紧密结合的好例子。
学完这些,我们来看看 DeepSeek R1 论文里的一个真实公式:
GRPO 目标函数(简化版):
$$J_{GRPO}(\theta) = \mathbb{E}\left[\sum_{i=1}^{G} \frac{1}{G} \left( \min\left(r_i(\theta) \hat{A}_i, \text{clip}(r_i(\theta), 1-\varepsilon, 1+\varepsilon)\hat{A}_i \right) - \beta \cdot \mathbb{D}_{KL}[\pi_\theta \| \pi_{ref}] \right)\right]$$
其中:
$$r_i(\theta) = \frac{\pi_\theta(o_i \mid q)}{\pi_{\text{ref}}(o_i \mid q)}$$
这里有一个 KL 散度 $\mathbb{D}_{KL}$,它的展开式是:
$$\mathbb{D}_{KL}[\pi_\theta \| \pi_{ref}] = \sum_x \pi_\theta(x) \log \frac{\pi_\theta(x)}{\pi_{ref}(x)}$$
看到了吗?log 就在这里,它在衡量当前策略 $\pi_\theta$ 和参考策略 $\pi_{ref}$ 之间的差距。DeepSeek R1 用这个约束项,防止模型在强化学习过程中"跑偏"得太厉害。
现在你知道这个 log 是从哪来的了——是对数概率之差,来自信息论里的 KL 散度定义。
这篇文章我们做了这几件事:
首先,复习了指数和对数的基本定义和运算规则,重点强调了自然常数 $e$ 的特殊地位。
然后,深入讲了对数的四个关键性质:乘法变加法、除法变减法、幂次变系数、单调性不变。这四条性质是 log 在深度学习里大量出现的根本原因。
接着,从交叉熵损失函数出发,解释了为什么分类任务要用 log——它的梯度形式简洁,对低概率预测的惩罚力度大,数值范围适合计算机处理。
然后连接到信息论,解释了熵和 KL 散度的直觉,这是理解语言模型训练目标的关键视角。
最后,用 DeepSeek R1 的 GRPO 公式里的 KL 散度作为落地例子,让你看到这些数学工具在最前沿的论文里是如何出现的。
一句话总结 log 的用处:它把乘法变加法(避免概率值太小),把"有多大把握"变成"差了多少信息",是概率和优化之间的桥梁。
下一篇预告:
第3篇,我们讲函数与映射。
神经网络本质上是一个函数,输入是 token,输出是概率分布。但这个"函数"和高中数学里的函数有什么本质区别?多层网络是怎么把简单函数组合成复杂函数的?我们下篇从函数的本质出发,建立起理解神经网络结构的底层视角。
每一篇文章都是一块砖。砖头打好了,DeepSeek V3 和 R1 论文里的那些公式,只是一面已经有地基的墙。
还没有评论,来抢沙发吧!
博客管理员
40 篇文章
还没有评论,来抢沙发吧!