对矩阵微积分的解释 - 未完待续

对矩阵微积分的解释 - Illustrated Matrix/Tensor Calculus

在不破坏既有定义(针对向量)的前提下,给出张量和张量求导的定义。

基本概念

标量、向量和矩阵

维度012>=3
名称标量 Scalar向量 Vector矩阵 Matrix张量 Tensor/Array

注意区别:

  • 某一维长度为0的array
    • 此时说明整个array没有可以放元素数值的地方,包含0个数据元素,但不代表没有维度方向
  • 某一维长度为1的array
    • squeeze or not
  • 标量和1维向量
    • 前者shape为(),后者shape为(1,)
  • 矩阵的分片(以a.shape = (2, 3, 4)为例)
    • 如果是单纯的取索引,那么相当于从对应维度考虑这个矩阵。此时这个矩阵相当于一个列表,通过下标索引相当于对列表取出元素。如果这么考虑,对应的维度坍缩是可以理解的。
      • 比如a[0, :, :].shape = (3, 4), a[:, 0, :].shape = (2, 4), a[0, 0, 0:2].shape = (2).
    • 如果是取矩阵的一个分片,那么这个维度没有消失,对应的维度不应该坍缩。
      • 比如a[0:1, :, :].shape = (1, 3, 4), a[:, 0:1, :].shape = (2, 1, 4)

向量求导的既有定义

希望我们建立的这套体系尽量能和已有的一些东西吻合

  • 向量和向量求导: ∂ y ∂ x = [ ∂ y i ∂ x j ] m ∗ n \frac{\partial y}{\partial x} = [\frac{\partial y_i}{\partial x_j}]_{m*n} xy=[xjyi]mn
  • Hessian矩阵和Jacobian矩阵、Jacobian行列式最好能融入到体系中来:见Eq60,Eq61

计算概念

内积:
计算方法是对应元素乘积之和,要求两个张量shape一样。内积是定义在同一个空间里面的运算,所以两个操作数的shape肯定是一样的。

标量对张量的导数

此处的张量包括标量、向量、矩阵、张量。(我们一般只研究到二维的矩阵)

因为 d f = d X ∗ d f d X df = dX * \frac{df}{dX} df=dXdXdf(其中乘号表示内积),所以 d f d X \frac{df}{dX} dXdf的shape和 d X dX dX的shape一样,进而和 X X X的shape一样。很明显,把导数定义成对应元素的乘积即可。
d f d X = [ d f d X i j ] m ∗ n \frac{df}{dX} = [ \frac{df}{dX_{ij}} ]_{m*n} dXdf=[dXijdf]mn

一句话解释:标量对张量求导,就是对其每一个元素求导,同时shape和张量保持不变。

张量对张量的导数

注意到张量是一系列标量元素的集成,那么下面的定义应该是容易接受的:
d A = [ d A i j ] m ∗ n dA = [dA_{ij}]_{m*n} dA=[dAij]mn
根据这个公式就能很好地给出张量对张量求导的定义:先通过上式展开成标量对张量求导(此时这些导数组成的矩阵的size为被求导张量的size),然后每个元素都是一个标量对张量的导数(每个元素张量的size为求导张量的size),形成整个的大张量。
d A d X = [ d A i j d X ] m ∗ n = [ d A i j d X k l ] m ∗ n ∗ p ∗ q \frac{dA}{dX} = [\frac{dA_{ij}}{dX}]_{m*n} = [\frac{dA_{ij}}{dX_{kl}}]_{m*n*p*q} dXdA=[dXdAij]mn=[dXkldAij]mnpq

衍生出来一个问题:上面的解释是基于上升维度的。或者说,用上式计算的矩阵和矩阵之间的导数是四维的( d A d X [ i ] [ j ] = d A i j d X = [ d A i j d X k l ] p ∗ q \frac{dA}{dX}[i][j] = \frac{dA_{ij}}{dX} = [\frac{dA_{ij}}{dX_{kl}}]_{p*q} dXdA[i][j]=dXdAij=[dXkldAij]pq)。如果要求矩阵对矩阵的导数还是二维的,以什么形式平铺?
一个简单的考虑是把每个元素(标量对张量的导数,矩阵)concat起来作为平铺。实际上大部分教材就是这么做的。于是问题解决了。

但是问题还没解决。
列向量对列向量求导,按照以上张量对张量求导的准则,应该是一个长的列。但是我们希望
d f d x = [ d f j d x i ] i ∈ [ 1.. m ] , j ∈ [ 1.. n ] \frac{df}{dx} = [\frac{df_j}{dx_i}]_{i\in [1..m], j\in [1..n]} dxdf=[dxidfj]i[1..m],j[1..n]
Then let it be. 对于向量对向量求导,就这样好了。

参考

主要参考 HU, Pili. “Matrix Calculus: Derivation and Simple Application.” (2012). 本文更多地是对此文的解读,而且本文中的公式号和此文是对应的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值