手撕损失函数:交叉熵(CE / BCE)

转载自公众号“浪猿” 引言 在机器和深度学习中,损失函数(loss function)是非常重要的概念,它的值(loss)定量表达了实际模型与理想模型的差异,而它的导数(梯度)又为模型更新提供了方向及大小。 交叉熵(Cross Entropy)损失函数是最经典也最常用的选择之一:从逻辑回归到深度神经网络,从二分类到多分类任务,都有它的身影。 本文将解析: 为什么需要损失函数 什么是信息量、什么是信息熵 什么是相对熵(KL 散度) 什么是交叉熵 Binary Cross Entropy(BCE)和 Cross Entropy(CE)的区别 为什么需要损失函数 机器学习和深度学习的本质,是利用有限样本数据,学习一个「参数化模型」,使其概率分布尽可能逼近真实数据分布。 如何评估图上(C)模型分布与(B)有限样本分布是否相似呢? 这就需要损失函数(Loss Function),它用一个数值(损失函数的值:loss)来衡量模型预测结果与样本规律之间的差距,数值越小,说明模型越接近真实数据。 而交叉熵损失函数的值正是用来衡量两个概率模型的差异大小的。 什么是信息量、信息熵 什么是信息量 信息量用于衡量一个特定事件发生所带来的信息多少。 即一个事件发生的概率越小,它发生后带来的「信息量」就越大(比如“太阳从西边出来”比“太阳从东边出来”的信息量大得多)。 对于一个事件 $a$,发生概率为 $P_a$,信息量为 $I_a$,公式如下: $$ I_a=-\log P_a $$它的函数图像如下: x 轴为 $a$ 事件发生的概率,y 轴为对应的信息量。 这时你是不是有个疑问,为什么使用 $-\log$ 函数来定义信息量?随便定义一个线性函数不是也可以嘛,例如以下线性函数,它也满足概率越小,它发生后带来的信息量就越大: $$ I_a=1-P_a $$ $I_a=1-P_a$ 线性函数图。 这是因为信息量还需要满足另一个自治。 假设你正准备报考一个岗位,需要面试 + 笔试,如下图: 笔试通过发生概率 80%,面试通过发生概率 60%,入围发生概率就为 $0.8 \times 0.6=0.48$,很好理解吧? 我现在来考虑这个过程「信息量」的变化,我们假设还不知道「信息量」的定义,所以设一个 $X$ 函数来表示计算「信息量」的函数。 笔试通过的「信息量」为 $I_{\text{笔试通过}}$: $$ I_{\text{笔试通过}}=X(P_{\text{笔试通过}}) $$面试通过的「信息量」为 $I_{\text{面试通过}}$: ...

July 11, 2026 · 3 min

Transformer 数学原理

上一篇笔记建立了 Transformer 的直觉和代码实现,这篇深入每个组件背后的数学原理。每个主题都标注了出处论文或博客,方便查阅原文。 一、Scaled Dot-Product:为什么除以 √dk? 出处:Vaswani et al. (2017) “Attention Is All You Need”, Section 3.2.1 上一篇笔记里我们知道 Attention 的计算公式是: $$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right) V$$其中: $Q$:Query 矩阵 $K$:Key 矩阵 $V$:Value 矩阵 $d_k$:Key 向量的维度 $\text{softmax}$:归一化函数(将分数转为概率分布) 但为什么要除以 $\sqrt{d_k}$?Vaswani et al. 在论文中给出了一句关键解释:“We suspect that for large values of $d_k$, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients.” 下面把这句话拆成严格的数学推导。 1.1 方差推导 假设 $q$ 和 $k$ 的每个分量都是独立同分布的随机变量,均值为 0,方差为 1。点积 $q^T k = \sum_{i=1}^{d_k} q_i k_i$。 ...

April 13, 2026 · 13 min

Self-Attention & Transformer 学习笔记

一、为什么要学 Transformer? Transformer 是当前深度学习的基础架构。NLP 领域的 BERT、GPT 系列,计算机视觉的 ViT,多模态模型 CLIP、Stable Diffusion——底层全是 Transformer。不理解 Transformer,后续读任何相关论文都会卡在架构细节上。 学完本笔记后,应该能回答:Q/K/V 怎么算?Multi-Head 为什么有用?Positional Encoding 干什么的?Encoder 和 Decoder 有什么区别? 二、Self-Attention(自注意力机制) 2.1 核心问题:如何处理变长序列? 输入可能是一句话(5个词)、一段语音(200帧)、一张图(196个patch),长度不固定。传统 FC 层要求固定输入维度,无法处理这种情况。 生活类比:你在教室里坐着,老师点名提问。FC 层相当于老师只看你一个人;Self-Attention 相当于老师让全班每个人都互相看一眼,综合所有人的信息后再做判断。 2.2 Self-Attention 的计算流程 假设输入序列有 T 个 token,每个 token 是一个 d 维向量: 输入:X = [x₁, x₂, ..., xT],shape = [T, d] 第1步:生成 Q, K, V(三个"角色") Q = X @ Wq # Query: "我在找什么?" shape = [T, dk] K = X @ Wk # Key: "我能提供什么?" shape = [T, dk] V = X @ Wv # Value: "我的实际内容" shape = [T, dv] 第2步:算 Attention Score(谁和谁最相关?) Score = Q @ K^T # shape = [T, T],每对 token 之间的相关性 Score = Score / √dk # 缩放,防止数值过大导致 softmax 梯度消失 第3步:Softmax 归一化 Attention = softmax(Score, dim=-1) # 每行和为1,变成概率分布 第4步:加权求和 Output = Attention @ V # shape = [T, dv] 生活类比: ...

March 13, 2026 · 14 min