上一篇我们搞定了符号,这一篇直接拆解AI论文中出现频率最高的6个公式。每个公式都是:问题→公式→拆解→代码。
前置要求:读完上一篇符号速查手册。
一、Softmax与交叉熵损失 问题:如何把模型输出变成概率? 神经网络输出的是一堆数字(logits),可能是负数、可能很大。我们需要把它们变成概率分布(非负、和为1)。
公式 $$\text{softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{K} e^{x_j}}$$
拆解 $e^{x_i}$:指数函数,把任意数变成正数 $\sum_{j=1}^{K} e^{x_j}$:所有指数的和,用于归一化 除法:确保结果和为1 为什么用指数? 因为指数函数会放大差异——大的更大,小的更小,让模型更"自信"。
代码实现 import numpy as np def softmax(x): """ 输入: x, shape (K,) 或 (batch, K) 输出: 概率分布,shape同输入 """ # 减去最大值防止数值溢出(数学上等价) exp_x = np.exp(x - np.max(x, axis=-1, keepdims=True)) return exp_x / np.sum(exp_x, axis=-1, keepdims=True) # 示例 logits = np.array([2.0, 1.0, 0.1]) probs = softmax(logits) print(probs) # [0.659, 0.242, 0.099] print(probs.sum()) # 1.0 交叉熵损失 有了概率,如何衡量预测和真实标签的差距?
$$L = -\sum_{i=1}^{K} y_i \log(\hat{y}_i)$$
其中 $y_i$ 是真实标签(one-hot),$\hat{y}_i$ 是预测概率。
简化形式(单标签分类): $$L = -\log(\hat{y}_{correct})$$
就是正确类别的概率取负对数。概率越高,损失越小。
def cross_entropy_loss(probs, label): """ probs: softmax输出的概率, shape (K,) label: 正确类别的索引, int """ return -np.log(probs[label] + 1e-10) # 加小数防止log(0) # 示例 probs = np.array([0.7, 0.2, 0.1]) loss = cross_entropy_loss(probs, label=0) # 正确类别是0 print(loss) # 0.357(概率0.7对应的损失) 二、注意力机制(Attention) 问题:如何让模型"关注"输入的不同部分? 翻译"我爱北京"时,生成"Beijing"应该主要关注"北京"这个词,而不是平均关注所有词。
...