利用「向量求导」优雅地计算「Logistic损失函数梯度」

Lingfeng2024-04-14

利用「向量求导」优雅地计算「Logistic损失函数梯度」

在几乎所有有关机器学习的教材中, 计算Logistic回归损失函数的梯度总是使用长串的"求和"符号. 例如

一方面, 这样的证明显得繁琐累赘, 非常不优雅! 另一方面, 在实际写代码过程中, 我们常常并不会使用求和符号, 而是全部采用向量或矩阵的形式, 初学者在写代码时往往会因为如此的转换而感到不适应.

因此, 不妨大胆的抛弃掉"丑陋"的求和符号, 全部采用向量形式推导! 下面本文将给出比较完整的推导过程.

1. 1. 预备知识

1.1 1.1 向量运算的扩展

在原有的向量运算中, 向量只有相加、数乘运算. 在这里我们对向量运算进行拓展, 使其能极大程度兼容代码中的向量运算.

为了避免标量向量混用, 我们记维度为且元素全为1的矩阵/向量为, 在上下文明确的情况下可简记为. 下面, 我们给出向量运算及其相关性质.


向量加法
, , 定义

特殊地, 有


向量数乘
, 为标量, 此时定义

在此基础上, 设为标量, 原先向量与标量相加的形式可以表示为


向量除法
, , 定义

当然, 这里需要, 且当, 维度不一致时除法无意义.


向量的超越函数
, 我们定义

同理也有
其余的超越函数的定义是类似的, 这里不作赘述.


值得一提的是, 这里我们没有定义向量乘法, 是为了避免与已有的矩阵乘法冲突. 在后文中可以看到, 我们可以借助对角矩阵来实现逐项相乘的效果.

1.2 1.2 对角矩阵

, 我们定义对角矩阵为


显然, 对角矩阵有以下性质
同时, 还注意到
因此可借助这种方式实现对角矩阵到向量的转换. 当我们想实现2个向量逐项相乘时, 可表示为

1.3 1.3 向量求导

可参见[[「向量求导」]]. 下面给出本文将提到的性质

为超越函数时, 有(以指数与对数函数为例)

2. 2. 推导过程

假设有个样本, 设自变量, 因变量.

此时设, 补充定义, 故有

此时sigmoid函数可以写为
此时得到的正好为列向量, 表示对的概率估计.

定义损失函数为对数似然函数的相反数, 即

注意到这里的为标量, 我们正用向量形式简化了先前繁琐的损失函数!

此时考虑对求导, 有

而注意到, 对两边取对数有
再两边对求导有
因此, 代入有
同时注意到
因此有

多么简洁的形式! 完全避免了任何的求和符号! 推导过程值得细细品味.

同理也可以计算二阶导数

3. 3. 总结

事实上, 虽然机器学习发展如火如荼, 但是教学模式相对来说十分落后. 明明在numpy等库中早早实现了向量运算, 在理论教学中却很少有教材给出一套规范完整的向量运算规则.

运用线性代数, 在解决高维数据时威力巨大! 这一思想应早在学生思想里普及, 而不是在写代码时后知后觉.

因此, 本文尝试给出一套相对优雅的形式, 仅作为个人的思考和总结, 欢迎评论区指出错误和不足.

Last Updated 12/14/2025, 2:00:14 AM