点乘和Softmax分别是什么

43 阅读1分钟

在机器学习和深度学习(特别是现在主流的 Transformer 大模型架构)中,点乘(Dot Product)和 Softmax 是两个最频繁打交道的数学操作。

简单来说:点乘用来计算“相似度”或“关联度”,而 Softmax 用来把这些度量值转化为“概率分布”。

一、 点乘 (Dot Product)

点乘又叫内积。它是针对两个向量(可以理解为两条线或两组特征数据)的运算。

1. 数学是怎么算的?

假设有两个长度相同的向量 a\mathbf{a}b\mathbf{b}

a=[a1,a2,,an]\mathbf{a} = [a_1, a_2, \dots, a_n]

b=[b1,b2,,bn]\mathbf{b} = [b_1, b_2, \dots, b_n]

它们的点乘就是对应位置的元素相乘,然后再全部加起来,最终得到一个普通的数字(标量)

ab=a1b1+a2b2++anbn\mathbf{a} \cdot \mathbf{b} = a_1b_1 + a_2b_2 + \dots + a_nb_n

2. 它的物理/几何意义是什么?

  • 衡量方向的一致性(相似度): 在几何上,ab=abcos(θ)\mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos(\theta)。如果两个向量的方向越接近(夹角 θ\theta 越小),点乘的值就越大;如果它们垂直,点乘为 0;如果方向相反,点乘为负数。
  • 在大模型里的作用: 在 Attention(注意力机制)中,点乘被用来计算两个词(比如“苹果”和“手机”)之间的关联程度。点乘结果越大,说明这两个词在当前上下文中关系越紧密。

二、 Softmax

Softmax 是一种激活函数,它的输入是一个包含多个任意实数的向量(通常称为 Logits),输出是一个概率分布

1. 数学是怎么算的?

假设输入一堆得分 z=[z1,z2,,zK]\mathbf{z} = [z_1, z_2, \dots, z_K],Softmax 对其中第 ii 个元素的计算公式为:

Softmax(zi)=ezij=1Kezj\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}}

也就是说,它先给每个得分来个ee 为底的指数次方(确保所有结果都变成正数),然后除以所有指数的总和(进行归一化)。

2. 它的核心作用是什么?

  • 变成概率: 经过 Softmax 处理后,所有的输出值都在 0 到 1 之间,并且所有输出值的总和绝对等于 1。这完美符合概率的定义。

  • “强手更强”(马太效应): 因为使用了指数函数 exe^x,它会放大原本较大的数,同时压低原本较小的数。

    举个例子: 假设模型算出的三个类别的原始得分是 [1,2,5][1, 2, 5]

    经过 Softmax 转换后,可能就变成了 [0.01,0.04,0.95][0.01, 0.04, 0.95]。原本只是 5 比 2 大一些,现在 5 对应的概率(95%)直接把其他两个碾压了。这让分类网络在做决定时更加果断。

下面对比 Hardmax,再用一个例子来详细说明一下 Softmax

3. 什么是 "Soft" Max?(对比 Hardmax)

假设你训练了一个 AI 图像识别模型,输入一张照片,模型对猫、狗、小鸟三个类别分别打出了原始分数(在深度学习里叫 Logits):

  • 猫: 3.5 分
  • 狗: 2.0 分
  • 小鸟: -1.5 分

如果用 Hardmax(平时用的 maxargmax):

它是一个极其霸道粗暴的裁判。它只看谁的分数最高,就把谁变成 1,其余全变成 0。

  • 结果变成: [猫: 1, 狗: 0, 小鸟: 0] * 缺点: 太绝对了!虽然猫的分数最高,但狗也有 2.0 分,说明模型觉得“也有可能是狗”。Hardmax 把这种可能性完全抹杀了。而且它没办法计算梯度,没办法做机器学习的背向传播(训练)。

如果用 Softmax(温柔的最大值):

它是一个温柔、理性的裁判。它承认猫的分数最高,但它会保留其他选项的微弱可能性,并把这些分数变成百分比(概率)

  • 结果可能变成: [猫: 80%, 狗: 19.9%, 小鸟: 0.1%]
  • 优点: 既分出了胜负(猫胜出),又保留了概率,总和还恰好是 100%。

4. Softmax 内部是怎么运作的?(核心两步)

Softmax 它的公式看起来唬人:Softmax(zi)=ezij=1Kezj\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}},但实际上它只做了两件事

第一步:请出数学界的“夸张放大器” —— 指数函数 exe^x

Softmax 拿到原始分数(3.5, 2.0, -1.5)后,第一件事不是直接算比例,而是把每个分数都变成 ee 的多少次方。

为什么要这么费事?有两个绝妙的原因:

  1. 消灭负数: 概率绝对不能是负数。而无论 xx 是多小的负数(比如小鸟的 -1.5),e1.5e^{-1.5} 算出来都是一个大于 0 的正数(约 0.22)。

  2. 拉开差距(强手更强): 指数函数增长极快。

    • 3.5 只比 2.0 大了 1.5 倍对吧?
    • 但变成了指数:e3.533.1e^{3.5} \approx 33.1e2.07.39e^{2.0} \approx 7.39
    • 瞧,33.1 已经是 7.39 的 4.5 倍了!它把“第一名”的优势成倍放大了,让模型在做决定时更加自信。

第二步:归一化(切蛋糕)

现在我们得到了三个正数:

  • 猫的新分数:33.1
  • 狗的新分数:7.39
  • 鸟的新分数:0.22

把它们全部加起来(总和):33.1+7.39+0.22=40.7133.1 + 7.39 + 0.22 = 40.71

最后,用每个人各自的分数,除以总和。就像切蛋糕一样,算出各自占了多少比例:

  • 猫的概率: 33.140.7181.3%\frac{33.1}{40.71} \approx 81.3\%
  • 狗的概率: 7.3940.7118.2%\frac{7.39}{40.71} \approx 18.2\%
  • 鸟的概率: 0.2240.710.5%\frac{0.22}{40.71} \approx 0.5\%

瞧! [81.3%, 18.2%, 0.5%] ,这就是 Softmax 的最终输出。它们全部是正数,而且加起来正好等于 11(100%)。

5. 为什么不直接用“传统比例”?

有人会问:“既然想变百分比,为什么不直接拿原始分数相加来除?”(比如直接用 3.53.5+2.01.5\frac{3.5}{3.5+2.0-1.5}

我们来看看如果不引入 exe^x,直接算比例会发生什么灾难:

  1. 负数灾难: 小鸟的分数是 -1.5。如果直接除,算出来的概率就是负概率,这在数学和现实中是无法解释的。
  2. 零分灾难: 如果总和恰好加起来是 0(比如分数是 [-2, 2]),分母直接变成 0,数学作废。

所以,Softmax 巧妙地用 exe^x 把所有恶劣的、奇形怪状的原始分数,整整齐齐地驯化成了漂亮的概率分布

三、 当它们相遇:大模型中的“黄金搭档”

在 ChatGPT 等大模型的核心技术——自注意力机制(Self-Attention)中,这两个概念是连起来使用的:

  1. 第一步(点乘): 模型让代表单词的向量相互点乘,算出它们两两之间的“亲密度”得分。
  2. 第二步(Softmax): 这些得分有大有小,不方便后续计算。于是把得分丢进 Softmax 里,变成权重概率(比如:当前词有 70% 的注意力该放在“苹果”上,20% 放在“公司”上,10% 放在“发布”上)。
  3. 第三步: 根据这个概率去融合信息。