在之前的博文中我们提到过,最好的求取矩阵梯度的方法就是将矩阵写成微分的形式:
d f \mathrm{d}f df 化成 d f = t r ( G d X ) \mathrm{d}f=\mathrm{tr}(\mathbf{G}\mathrm{d}\mathbf{X}) df=tr(GdX)的形式, 就可以得到 ∇ f = G T \nabla f = \mathbf{G}^T ∇f=GT
在大部分情形中, d f \mathrm{d}f df的结果都是包含了一堆矩阵相乘而 d X \mathrm{d}\mathbf{X} dX在其中的形式, 这时候可以通过 t r ( A B ) = t r ( B A ) \mathrm{tr}(AB) = \mathrm{tr}(BA) tr(AB)=tr(BA)把 d X \mathrm{d}\mathbf{X} dX移位到最后, 从而得到 d f = t r ( G d X ) \mathrm{d}f=\mathrm{tr}(\mathbf{G}\mathrm{d}\mathbf{X}) df=tr(GdX)的形式。
今天要讨论的是一种较为棘手的场景, 即当 f f f中包含哈达玛积的情况时。 由于哈达玛积不能像矩阵相乘一样在迹中任意的移位,那么该如何求导呢?
利用哈达玛积的重要性质:
tr
(
A
(
B
∗
C
)
)
=
tr
(
(
A
∗
B
T
)
C
)
\operatorname{tr}\left(A(B * C)\right)=\operatorname{tr}\left(\left(A * B^{\mathrm{T}}\right) C\right)
tr(A(B∗C))=tr((A∗BT)C)
这里
∗
*
∗就代表哈达玛积(也就是点乘)。 这个性质非常容易证明, 只需要证明左右两边的两个矩阵的对角线元素都是相等的就可以了。 那么,我们可以使用这一结论对点乘的情形就行求导。
以例子来说明, 首先是简单的LS问题:
f
(
X
)
=
t
r
(
(
A
−
P
∗
B
X
)
H
(
A
−
P
∗
B
X
)
)
f(X) = \mathrm{tr}\left((A - P*BX)^H(A-P*BX)\right)
f(X)=tr((A−P∗BX)H(A−P∗BX))
其中
X
X
X为复数, 因此我们只需将
d
(
f
(
X
)
)
=
t
r
(
G
d
(
X
H
)
)
\mathrm{d}(f(X))=\mathrm{tr}(G\mathrm{d}(X^H))
d(f(X))=tr(Gd(XH))的形式化出,
G
G
G就是我们要求取的导数。
因此:
d
f
(
X
)
=
d
t
r
(
−
(
P
H
∗
X
H
B
H
)
A
+
(
P
H
∗
X
H
B
H
)
(
P
∗
B
X
)
)
=
d
t
r
(
−
A
(
P
H
∗
X
H
B
H
)
)
+
d
(
(
P
∗
B
X
)
(
P
H
∗
X
H
B
H
)
)
=
d
t
r
(
−
(
A
∗
P
∗
)
X
H
B
H
)
)
+
d
(
(
P
∗
B
X
)
∗
P
∗
)
X
H
B
H
)
)
=
d
t
r
(
−
B
H
(
A
∗
P
∗
)
X
H
)
)
+
d
(
B
H
(
P
∗
B
X
)
∗
P
∗
)
X
H
)
)
=
t
r
(
B
H
(
(
P
∗
B
X
)
−
A
)
∗
P
∗
)
d
(
X
H
)
)
\begin{array}{l} {\rm{d}}f(X) = {\rm{dtr}}( - ({P^H}*{X^H}{B^H})A + ({P^H}*{X^H}{B^H})(P*BX))\\ = {\rm{dtr}}( - A({P^H}*{X^H}{B^H})) + {\rm{d}}((P*BX)({P^H}*{X^H}{B^H}))\\ = {\rm{dtr}}( - (A*{P^*}){X^H}{B^H})) + {\rm{d}}((P*BX)*{P^*}){X^H}{B^H}))\\ = {\rm{dtr}}( - {B^H}(A*{P^*}){X^H})) + {\rm{d}}({B^H}(P*BX)*{P^*}){X^H}))\\ = {\rm{tr}}({B^H}((P*BX) - A)*{P^*}){\rm{d}}({X^H})) \end{array}
df(X)=dtr(−(PH∗XHBH)A+(PH∗XHBH)(P∗BX))=dtr(−A(PH∗XHBH))+d((P∗BX)(PH∗XHBH))=dtr(−(A∗P∗)XHBH))+d((P∗BX)∗P∗)XHBH))=dtr(−BH(A∗P∗)XH))+d(BH(P∗BX)∗P∗)XH))=tr(BH((P∗BX)−A)∗P∗)d(XH))
可以得到梯度为 B H ( ( P ∗ B X ) − A ∗ P ∗ ) B^{H}\left(\left(P^{*} B X\right)-A* P^{*}\right) BH((P∗BX)−A∗P∗)。
技巧: 反复使用
tr
(
A
(
B
∗
C
)
)
=
tr
(
(
A
∗
B
T
)
C
)
\operatorname{tr}\left(A(B * C)\right)=\operatorname{tr}\left(\left(A * B^{\mathrm{T}}\right) C\right)
tr(A(B∗C))=tr((A∗BT)C)
使得自变量
X
X
X不参与哈达玛积的运算。
