在讨论矩阵求导之前,我们先回忆一下为什么要求导。
吴恩达的视频中讲到过相关问题,可以将找一个函数的极值看做机器学习的工作,比如下图,当前找到的解对应图中A点(x,f(x))。
此时可以求函数在A点的偏导。然后x减去就是更新的下一个位置。就是学习速率。可以看出离极值点越远,偏导的绝对值越大,那么每次移动步长的就更大,这样更快接近极值点。反之,离极值点越近,偏导的绝对值越小,每次移动的步长就更小,这样在求极值点的时候更精确。
从上述可以了解到求偏导的作用,就是帮助我们更新参数。因此如果要求一个参数x偏导,至少需要得到和x同型的矩阵才能更新x。
接下来就是怎么求导了。我们先按照数学公式看一下。
我一开始就直接推成这样了:
然后我想的是先求出f值和期望值y的差,然后利用上述公式求出x的更新值。
但这样以来不就和机器学习中梯度下降法中乘以偏导的算法相反了吗?因为按照这个公式明显是除以偏导得到x的更新值。我就在这里卡了好久,难受的一批。
最后才发现问题在哪里:
现在就要回到原点,想想我们为什么要求偏导,不就是为了更新x使得最后的误差值变小吗。按照上文最开始提到的吴恩达视频的讲解,用乘法可以符合更新要求,帮助我们找到最小解。
但是按照上述公式呢?假如此时及其接近最小解了,那么此处偏导接近0,除以这个偏导就会导致更新值太大,从而远离极值点。而且,涉及到矩阵,就是求逆矩阵了,不是每个矩阵都能求逆,除0的问题也不好解决。
所以还是用偏导乘以一个学习率来更新。
上面的微分公式也不是完全没用,它可以用来帮助我们在矩阵连乘时解决求导的顺序以及是否转置的问题。
比如:
其中y是一个标量,是参数矩阵(行列:n*m),是待输入矩阵(行列:m*p)。
那么
那么标量y对一个矩阵的偏导的形式是什么呢?
参考文章:
是一个和同构型的矩阵(行列:n*p)。
但这里其实也查到什么数学上的证明,因为要严格来说这是偏导的话,代入微分公式却算不回去。
我是这么理解的,就是标量y对的每个元素求导组成的矩阵,从而就得到了每个元素的更新幅度了。
换句话说,我认为其实是的一个微分形式,即。
即:
(这里的带个方向,即右乘,因为最开始X就是右乘)
然后按照上文最开始抛出的微分公式修正一下顺序和转置情况,得:
可以验证得到得矩阵形状和一样(行列:n*m)
这样一来再点成一个学习速率常数就可以更新了。
然后从这个博文神经网络中的矩阵求导及反向传播推导_DawnRanger的专栏-CSDN博客有计算意义上的证明:
记住这里的求导才是真正意义上的推导,上面的推导得出左乘或者右乘矩阵的转置就行了。微分方程只是帮助我们直接写的时候把握运算顺序和转置。
BPTT中在softmax + cross-entropy loss 的组合中也是类似的证明。记住就是超过一维的求导,在没有证明之前不能随便用。
上述的证明可以延用到其它形式(多次左右相乘)。
最后就好说了,利用那个微分公式我们可以在许多矩阵相乘时搞清楚顺序和是否需要转置。
以下述为例:
那么:
可以得出和矩阵是同形的