学习笔记

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

Lingfeng 2024-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等库中早早实现了向量运算, 在理论教学中却很少有教材给出一套规范完整的向量运算规则.

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

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

更新于 2026-09-07 20:48:54