上周过一个code up RNN from scratch的tutorial卡在了代码里一个小细节上。懵逼了几天终于找到了我迷茫的根源以及自己满意的答案,就,大概记一下。
本质上就是一个直白的matrix calculus基础题:如果我有, A 是 m by n的matrix,x是 n by 1的vector,显然y是 m by 1的vector。那么问题来了,对y求关于x的梯度是谁?对y求关于A的梯度呢?
Given, 有多少人会跟我一样猜, ? 这个猜的也不是不靠谱。去翻Andrew Ng的CS231n note,明明白白:
而我看的代码里的世界观似乎是认为dy/dx = W.T, dy/dW = x.T. 这里为什么有个转置呢?
讲道理,两边摆一下维度的话这个事情是很好接受的,实战写代码的时候不转置一报错也就查一会儿bug的事情,问题不大。不过数学上没找到依据就…不很安心。
有兴趣的同学复习一下multivariable calculus里gradiant 和 partial derivative的定义和推导,我在这里就直接放好记的小结论吧。
矩阵求导有两种layout,numerator layout和denominator layout, 我们在分析里学到的普遍都是numerator layout,它也被叫做Jacobian formulation,那么你自然就猜到了,当我们讲vector对vector求gradiant拿到一个Jacobian时,用得其实是numerator layout。本质区别可以用一个简单的例子来记:对scalar 求关于column vector 的偏导:
你想要结果跟vector 维度一致,也是column vector ->denominator layout;
你想要结果跟vector 维度不一致,得到row vector ->nominator layout。
这个选择很随意,计算上consistent就够了 (Wiki表示用得不consistent的情况也很常见,搞数学的又不用调bug)。
注意上图Andrew Ng的note里对向量的偏导是用Jacobian matrix表示的, 贴个Jacobian的Wiki图参照:
。比我细心得多的同学们当然一眼就注意到了这个结果col=n, 而求偏导的对象是row=n的column vector x,结果与其是转置的关系。果然是numerator layout.
numerator layout数学上套公式很漂亮, (Ax)'=A. 不过如果你要用这个layout,要注意当对scalar y求关于column vector x的gradiant时,结果要转置成一个row vector。比方说gradient descent第一步求loss对soft-max函数的output(一个column vector) 求gradiant,把 copy过来对每个分量分别求偏导完了记得补个转置。
而machine learning代码大多用的是denominator layout,就需要在套公式的时候补个转置。
来回答题目的问题。A或者A.T都是对的,数值计算上取决与你在用Chain rule的时候,别的gradient是按照numerator layout还是denominator layout来present。numerator->A, denominator->A.T.
最后tldr一下ML中会用得到的矩阵求导公式:
以后遇到什么再来补充。
网友评论