利用「向量求导」优雅地计算「Logistic损失函数梯度」
利用「向量求导」优雅地计算「Logistic损失函数梯度」
在几乎所有有关机器学习的教材中, 计算Logistic回归损失函数的梯度总是使用长串的"求和"符号. 例如
一方面, 这样的证明显得繁琐累赘, 非常不优雅! 另一方面, 在实际写代码过程中, 我们常常并不会使用求和符号, 而是全部采用向量或矩阵的形式, 初学者在写代码时往往会因为如此的转换而感到不适应.因此, 不妨大胆的抛弃掉"丑陋"的求和符号, 全部采用向量形式推导! 下面本文将给出比较完整的推导过程.
1. 1. 预备知识
1.1 1.1 向量运算的扩展
在原有的向量运算中, 向量只有相加、数乘运算. 在这里我们对向量运算进行拓展, 使其能极大程度兼容代码中的向量运算.
为了避免标量向量混用, 我们记维度为且元素全为1的矩阵/向量为, 在上下文明确的情况下可简记为. 下面, 我们给出向量运算及其相关性质.
向量加法
设, , 定义
向量数乘
设, 为标量, 此时定义
向量除法
设, , 定义
向量的超越函数
设, 我们定义
值得一提的是, 这里我们没有定义向量乘法, 是为了避免与已有的矩阵乘法冲突. 在后文中可以看到, 我们可以借助对角矩阵来实现逐项相乘的效果.
1.2 1.2 对角矩阵
设, 我们定义对角矩阵为
显然, 对角矩阵有以下性质同时, 还注意到因此可借助这种方式实现对角矩阵到向量的转换. 当我们想实现2个向量逐项相乘时, 可表示为
1.3 1.3 向量求导
可参见[[「向量求导」]]. 下面给出本文将提到的性质
当为超越函数时, 有(以指数与对数函数为例)2. 2. 推导过程
假设有个样本, 设自变量, 因变量.
此时设, 补充定义, 故有
此时sigmoid函数可以写为此时得到的正好为列向量, 表示对的概率估计.定义损失函数为对数似然函数的相反数, 即
注意到这里的为标量, 我们正用向量形式简化了先前繁琐的损失函数!此时考虑对求导, 有
而注意到, 对两边取对数有再两边对求导有故因此, 代入有同时注意到因此有故多么简洁的形式! 完全避免了任何的求和符号! 推导过程值得细细品味.
同理也可以计算二阶导数
3. 3. 总结
事实上, 虽然机器学习发展如火如荼, 但是教学模式相对来说十分落后. 明明在numpy等库中早早实现了向量运算, 在理论教学中却很少有教材给出一套规范完整的向量运算规则.
运用线性代数, 在解决高维数据时威力巨大! 这一思想应早在学生思想里普及, 而不是在写代码时后知后觉.
因此, 本文尝试给出一套相对优雅的形式, 仅作为个人的思考和总结, 欢迎评论区指出错误和不足.