参考文献

  • 动手学深度学习 Pytorch版

2.3 线性代数

标量

  • 本书采⽤了数学表⽰法,其中标量变量由普通⼩写字⺟表⽰(例如,xxyyzz).本书⽤R表⽰所有(连续)实数标量的空间,之后将严格定义空间(space)是什么,但现在只要记住表达式xRx\in R是表⽰x是⼀个实值标量的正式形式.符号\in称为“属于”,它表⽰“是集合中的成员”.例如x,y{0,1}x, y \in \{0, 1\}可以⽤来表明xxyy是值只能为0或1的数字.

  • 标量由只有⼀个元素的张量表⽰.下⾯的代码将实例化两个标量,并执⾏⼀些熟悉的算术运算,即加法、乘法、除法和指数

    1
    2
    3
    4
    5
    6
    import torch
    x = torch.tensor(3.0)
    y = torch.tensor(2.0)
    x + y,x * y,x / y,x ** y

    ==> (tensor(5.), tensor(6.), tensor(1.5000), tensor(9.))

向量

  • 向量可以被视为标量值组成的列表.这些标量值被称为向量的元素(element)或分量(component).当向 量表⽰数据集中的样本时,它们的值具有⼀定的现实意义.在数学表⽰法中,向量通常记为粗体、⼩写的符号(例如,$\mathbf{x} \mathbf{y} \mathbf{z} $​)).

    1
    2
    3
    4
    x=torch.arange(4)
    x

    ==> tensor([0, 1, 2, 3])
  • 我们可以使⽤下标来引⽤向量的任⼀元素,例如可以通过xix_{i} 来引⽤第ii个元素.注意,元素xix_{i} 是⼀个标量,所以我们在引⽤它时不会加粗.⼤量⽂献认为列向量是向量的默认⽅向,在本书中也是如此.在数学中,向量xx可以写为:

    x=[x1x2xn]x = \begin{bmatrix} x1 \\ x2 \\ \vdots \\ x_{n} \end{bmatrix}

    • 其中x1x_{1} , . . . , xnx_{n}​是向量的元素.

⻓度、维度和形状

  • 向量只是⼀个数字数组,就像每个数组都有⼀个⻓度⼀样,每个向量也是如此.在数学表⽰法中,如果我们想说⼀个向量x\mathbf{x}nn个实值标量组成,可以将其表⽰为xRn\mathbf{x} \in \mathbb{R}^{n} .向量的⻓度通常称为向量的维度(dimension)

    • 与普通的Python数组⼀样,我们可以通过调⽤Python的内置len()函数来访问张量的⻓度.

      1
      len(x)
    • 当⽤张量表⽰⼀个向量(只有⼀个轴)时,我们也可以通过.shape属性访问向量的⻓度.形状(shape)是⼀个元素组,列出了张量沿每个轴的⻓度(维数).对于只有⼀个轴的张量,形状只有⼀个元素.

      1
      x.shape

矩阵

  • 正如向量将标量从零阶推⼴到⼀阶,矩阵将向量从⼀阶推⼴到⼆阶.矩阵,我们通常⽤粗体、⼤写字⺟来表⽰(例如,X\mathbf{X}Y\mathbf{Y}Z\mathbf{Z}),在代码中表⽰为具有两个轴的张量.

  • 数学表⽰法使⽤ARm×n\mathbf{A}\in \mathbb{R}^{m×n}来表⽰矩阵A\mathbf{A},其由mm⾏和nn列的实值标量组成.我们可以将任意矩阵ARm×n\mathbf{A}\in \mathbb{R}^{m×n} 视为⼀个表格,其中每个元素aija_{ij}属于第ii⾏第jj

    A=[a11a12a1na21a22a2nam1am2amn]\mathbf{A}= \begin{bmatrix} a_{11}& a_{12}& \cdots & a_{1n} \\ a_{21}& a_{22}& \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1}& a_{m2}& \cdots & a_{mn} \end{bmatrix}

  • 对于任意ARm×n\mathbf{A}\in \mathbb{R}^{m×n},A\mathbf{A}的形状是(m,n)(m,n)m×nm × n.当矩阵具有相同数量的⾏和列时,其形状将变为正⽅形;因此,它被称为⽅阵(square matrix).

  • 当调⽤函数来实例化张量时,我们可以通过指定两个分量mmnn来创建⼀个形状为m×nm × n的矩阵.

    1
    2
    3
    4
    5
    6
    7
    8
    A=torch.arange(20).reshape(5,4)
    A

    ==> tensor([[ 0, 1, 2, 3],
    [ 4, 5, 6, 7],
    [ 8, 9, 10, 11],
    [12, 13, 14, 15],
    [16, 17, 18, 19]])
  • 当我们交换矩阵的⾏和列时,结果称为矩阵的转置(transpose).通常⽤aTa^{T}来表⽰矩阵的转置,如果B=ATB = A^{T} , 则对于任意iijj,都有bij=ajib_{ij}= a_{ji}​ .

    (AT)T=AAT+BT=(A+B)T(\mathbf{A}^{T})^{T}=\mathbf{A} \\ \mathbf{A}^{T}+\mathbf{B}^{T}=(\mathbf{A}+\mathbf{B})^{T}

张量

  • 就像向量是标量的推⼴,矩阵是向量的推⼴⼀样,我们可以构建具有更多轴的数据结构.张量(本⼩节中的 “张量”指代数对象)是描述具有任意数量轴的nn维数组的通⽤⽅法.例如,向量是⼀阶张量,矩阵是⼆阶张量.张量⽤特殊字体的⼤写字⺟表⽰(例如,X\mathbf{X}Y\mathbf{Y}Z\mathbf{Z}),它们的索引机制(例如xijkx_{ijk}[X]1,2i1,3[X]_{1,2i−1,3}​ )与矩阵类似.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    X=torch.arange(24).reshape(2,3,4)
    X

    ==> tensor([[[ 0, 1, 2, 3],
    [ 4, 5, 6, 7],
    [ 8, 9, 10, 11]],

    [[12, 13, 14, 15],
    [16, 17, 18, 19],
    [20, 21, 22, 23]]])

张量算法的基本性质

  • 标量、向量、矩阵和任意数量轴的张量(本⼩节中的“张量”指代数对象)有⼀些实⽤的属性.例如,从按元素操作的定义中可以注意到,任何按元素的⼀元运算都不会改变其操作数的形状.同样,给定具有相同形状的任意两个张量,任何按元素⼆元运算的结果都将是相同形状的张量.例如,将两个相同形状的矩阵相加,会在这两个矩阵上执⾏元素加法.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    A=torch.arange(20,dtype=torch.float32).reshape(5,4)
    B=A.clone()
    A,A+B,A*B

    ==> (tensor([[ 0., 1., 2., 3.],
    [ 4., 5., 6., 7.],
    [ 8., 9., 10., 11.],
    [12., 13., 14., 15.],
    [16., 17., 18., 19.]]),
    tensor([[ 0., 2., 4., 6.],
    [ 8., 10., 12., 14.],
    [16., 18., 20., 22.],
    [24., 26., 28., 30.],
    [32., 34., 36., 38.]]),
    tensor([[ 0., 1., 4., 9.],
    [ 16., 25., 36., 49.],
    [ 64., 81., 100., 121.],
    [144., 169., 196., 225.],
    [256., 289., 324., 361.]]))
  • 具体⽽⾔,两个矩阵的按元素乘法称为Hadamard积(Hadamard product)(数学符号\odot).对于矩阵BRm×n\mathbf{B}\in \mathbb{R}^{m×n} , 其中第ii⾏和第jj列的元素是bijb_{ij} .矩阵A\mathbf{A}B\mathbf{B}的Hadamard积为:

    AB=[a11b11a12b12a1nb1na21b21a22b22a2nb2nam1bm1am2bm2amnbmn]\mathbf{A}\odot \mathbf{B} = \begin{bmatrix} a_{11}b_{11}& a_{12}b_{12}& \cdots & a_{1n}b_{1n} \\ a_{21}b_{21}& a_{22}b_{22}& \cdots & a_{2n}b_{2n}\\ \vdots & \vdots & \ddots & \vdots \\ a_{m1}b_{m1}& a_{m2}b_{m2}& \cdots & a_{mn}b_{mn} \end{bmatrix}

降维

  • 我们可以对任意张量进⾏的⼀个有⽤的操作是计算其元素的和.数学表⽰法使⽤符号$\sum 表⽰求和.为了表⽰⻓度为表⽰求和.为了表⽰⻓度为d的向量中元素的总和,可以记作的向量中元素的总和,可以记作{\textstyle \sum_{i=1}^{d}} x_{i}$

    1
    2
    3
    4
    x=torch.arange(4,dtype=torch.float32)
    x,x.sum()

    ==> (tensor([0., 1., 2., 3.]), tensor(6.))
  • 矩阵A中元素的和可以记i=1mj=1naij{\textstyle \sum_{i=1}^{m}}{\textstyle \sum_{j=1}^{n}} a_{ij}

    1
    2
    3
    A.shape,A.sum()

    ==>(torch.Size([5, 4]), tensor(190.))
  • 默认情况下,调⽤求和函数会沿所有的轴降低张量的维度,使它变为⼀个标量.我们还可以指定张量沿哪⼀ 个轴来通过求和降低维度.以矩阵为例,为了通过求和所有⾏的元素来降维(轴0),可以在调⽤函数时指定axis=0.由于输⼊矩阵沿0轴降维以⽣成输出向量,因此输⼊轴0的维数在输出形状中消失.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    A_sum_axis0=A.sum(axis=0)
    A_sum_axis0

    ==> tensor([40., 45., 50., 55.])

    A_sum_axis1=A.sum(axis=1)
    A_sum_axis1

    ==> tensor([ 6., 22., 38., 54., 70.])
  • ⼀个与求和相关的量是平均值(mean或average).我们通过将总和除以元素总数来计算平均值.在代码中, 我们可以调⽤函数来计算任意形状张量的平均值

    1
    2
    3
    A.mean(), A.sum() / A.numel()

    ==> (tensor(9.5000), tensor(9.5000))

⾮降维求和

  • 有时在调⽤函数来计算总和或均值时保持轴数不变会很有⽤

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    sum_A=A.sum(axis=1,keepdims=True)
    sum_A

    ==> tensor([[ 6.],
    [22.],
    [38.],
    [54.],
    [70.]])

    A/sum_A

    ==> tensor([[0.0000, 0.1667, 0.3333, 0.5000],
    [0.1818, 0.2273, 0.2727, 0.3182],
    [0.2105, 0.2368, 0.2632, 0.2895],
    [0.2222, 0.2407, 0.2593, 0.2778],
    [0.2286, 0.2429, 0.2571, 0.2714]])
  • 如果我们想沿某个轴计算A元素的累积总和,⽐如axis=0(按⾏计算),可以调⽤cumsum函数.此函数不会沿任何轴降低输⼊张量的维度.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    A.cumsum(axis=0),A

    ==> (tensor([[ 0., 1., 2., 3.],
    [ 4., 6., 8., 10.],
    [12., 15., 18., 21.],
    [24., 28., 32., 36.],
    [40., 45., 50., 55.]]),
    tensor([[ 0., 1., 2., 3.],
    [ 4., 5., 6., 7.],
    [ 8., 9., 10., 11.],
    [12., 13., 14., 15.],
    [16., 17., 18., 19.]]))

点积(Dot Product)

  • 给定两个向量x,yRd\mathbf{x}, \mathbf{y}\in \mathbb{R} ^{d},它们的点积(dot product)xTy\mathbf{x}^{T}\mathbf{y}或者<x,y><\mathbf{x},\mathbf{y}>是相同位置的按元素乘积的和:xTy=i=1dxiyj\mathbf{x}^{T}\mathbf{y}=\sum_{i=1}^{d}x_{i}y_{j}

    1
    2
    3
    4
    5
    6
    import torch
    y=torch.ones(4,dtype=torch.float32)
    x = torch.arange(4, dtype=torch.float32)
    x,y,torch.dot(x,y)

    ==> (tensor([0., 1., 2., 3.]), tensor([1., 1., 1., 1.]), tensor(6.))
  • 也可以通过按元素乘法,然后求和来表示两个向量的点积

    1
    torch.sum(x*y)
  • 点积在很多场合都很有用.例如,给定一组由向量xRd\mathbf{x} \in \mathbb{R} ^{d}表示的值,和一组由wRd\mathbf{w} \in \mathbb{R} ^{d}表示的权重.$\mathbf{x} 中的值根据根据权重中的值根据根据权重\mathbf{w}的加权和,可以表示为点积的加权和,可以表示为点积\mathbf{x}^{T}\mathbf{w}.当权重为非负数且和为1(.当权重为非负数且和为1(即(\sum_{i=1}^{d}w_{i=1})$时,点积表示加权平均(weighted average).将两个向量规范化得到单位长度后,点积表示它们夹角的余弦.

矩阵-向量积

  • 定义矩阵ARm×n\mathbf{A}\in \mathbb{R}^{m×n}和向量xRnx\in \mathbb{R}^{n},将矩阵A\mathbf{A}用它的行向量表示:

    A=[a1Ta2TamT]\mathbf{A}=\begin{bmatrix} a_{1}^{T}\\ a_{2}^{T}\\ \vdots \\ a_{m}^{T} \end{bmatrix}

  • 其中每个aiTRna_{i}^{T} \in \mathbb{R}^{n}都是行向量,表示矩阵的第ii行.矩阵向量积Ax\mathbf{A}\mathbf{x}是一个长度为mm的列向量,其第ii个元素是点积aiTxa_{i}^{T}\mathbf{x}

    A=[a1Ta2TamT]x=[a1Txa2TxamTx]\mathbf{A}=\begin{bmatrix} a_{1}^{T}\\ a_{2}^{T}\\ \vdots \\ a_{m}^{T} \end{bmatrix} \mathbf{x}=\begin{bmatrix} a_{1}^{T}\mathbf{x}\\ a_{2}^{T}\mathbf{x}\\ \vdots \\ a_{m}^{T}\mathbf{x} \end{bmatrix}

  • 可以把一个矩阵ARm×n\mathbf{A}\in \mathbb{R}^{m×n}乘法看作一个从Rn\mathbb{R}^{n}Rm\mathbb{R}^{m}向量的转换.这些转换时非常有用的,例如可以用方阵的乘法表示旋转.

  • 在代码中使用张量表示矩阵-向量积,使用mv函数.当为矩阵A\mathbf{A}和向量x\mathbf{x}调用torch.mv(A,x)时,会执行行矩阵-向量积.注意A\mathbf{A}的列维数(沿轴1的长度)必须与x\mathbf{x}的维数(其长度)相同

    1
    2
    3
    4
    A=torch.arange(20,dtype=torch.float32).reshape(5,4)
    A.shape,x.shape,torch.mv(A,x)

    ==> (torch.Size([5, 4]), torch.Size([4]), tensor([ 14., 38., 62., 86., 110.]))

矩阵-矩阵乘法

  • 假设有两个矩阵ARn×k\mathbf{A} \in \mathbb{R}^{n×k}BRk×m\mathbf{B} \in \mathbb{R}^{k×m}

    A=[a11a12a1ka21a22a2kan1an2ank],B=[b11b12b1mb21b22b2mbk1bk2bkm]\mathbf{A}= \begin{bmatrix} a_{11}& a_{12}& \cdots & a_{1k} \\ a_{21}& a_{22}& \cdots & a_{2k} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1}& a_{n2}& \cdots & a_{nk} \end{bmatrix}, \mathbf{B}= \begin{bmatrix} b_{11}& b_{12}& \cdots & b_{1m} \\ b_{21}& b_{22}& \cdots & b_{2m} \\ \vdots & \vdots & \ddots & \vdots \\ b_{k1}& b_{k2}& \cdots & b_{km} \end{bmatrix}

  • 用行向量aiTRka_{i}^{T} \in \mathbb{R}^{k}表示矩阵A\mathbf{A}的第ii行,并让列向量bjRkb_{j} \in \mathbb{R}^{k}作为矩阵B\mathbf{B}的第jj列.要生成矩阵积C=AB\mathbf{C}=\mathbf{A}\mathbf{B}

    C=AB=[a1Ta2TanT][b1b2bm]=[a1Tb1a1Tb2a1Tbma2Tb1a2Tb2a2TbmanTb1anTb2anTbm]\mathbf{C}=\mathbf{A}\mathbf{B}=\begin{bmatrix} a_{1}^{T}\\ a_{2}^{T}\\ \vdots \\ a_{n}^{T} \end{bmatrix}\begin{bmatrix} b_{1}&b_{2}&\dots&b_{m} \end{bmatrix} = \begin{bmatrix} a_{1}^{T}b_{1} &a_{1}^{T}b_{2} &\dots& a_{1}^{T}b_{m} \\ a_{2}^{T}b_{1} &a_{2}^{T}b_{2} &\dots& a_{2}^{T}b_{m} \\ \vdots \\ a_{n}^{T}b_{1} &a_{n}^{T}b_{2} &\dots& a_{n}^{T}b_{m} \\ \end{bmatrix}

  • 可以将矩阵-矩阵乘法AB\mathbf{A}\mathbf{B}看作简单地执⾏mm次矩阵-向量积,并将结果拼接在⼀起,形成⼀个n×mn×m矩阵.

范数

  • 线性代数中最有⽤的⼀些运算符是范数(norm).⾮正式地说,向量的范数是表⽰⼀个向量有多⼤.这⾥考虑的⼤⼩(size)概念不涉及维度,⽽是分量的⼤⼩.

  • 在线性代数中,向量范数是将向量映射到标量的函数ff .给定任意向量xx,向量范数要满⾜⼀些属性.第⼀个性质是:如果我们按常数因⼦$\alpha $​缩放向量的所有元素,其范数也会按相同常数因⼦的绝对值缩放

    f(αx)=αf(x)f(\alpha \mathbf{x} )=\left |\alpha \right | f(\mathbf{x})

  • 第二个性质是三角不等式

    f(x+y)f(x)+f(y)f(\mathbf{x}+\mathbf{y} )\le f(\mathbf{x})+f(\mathbf{y})

  • 第三个性质是范数必须是非负的

    f(x)0f(\mathbf{x})\ge 0

  • 这是有道理的.因为在⼤多数情况下,任何东西的最⼩的⼤⼩是0.最后⼀个性质要求范数最⼩为0,当且仅
    当向量全由0组成

    i,[x]i=0f(x)=0\forall i,\left [ \mathbf{x} \right ] _{i}=0\Leftrightarrow f(\mathbf{x})=0

  • 范数听起来很像距离的度量.欧⼏⾥得距离和毕达哥拉斯定理中的⾮负性概念和三⻆不等式可能会给出⼀些启发.事实上,欧⼏⾥得距离是⼀个L2L_{2}范数:假设n维向量x中的元素是x1,,xnx_{1} ,\dots, x_{n} ,其L2L_{2}​范数是向量元素平⽅和的平⽅根

    x2=i=1nxi2\left \| \mathbf{x} \right \| _{2}=\sqrt{\sum_{i=1}^{n}x_{i}^{2} }

  • 其中,在L2L_{2}范数中常常省略下标2,也就是说x\left \| \mathbf{x} \right \|等同于x2\left \| \mathbf{x} \right \|_{2} .在代码中,我们可以按如下⽅式计算向量的L2L_{2}范数

    1
    2
    3
    4
    u=torch.tensor([3.0,-4.0])
    torch.norm(u)

    ==>tensor(5.)
  • 深度学习中更经常地使⽤L2L_{2}范数的平⽅,也会经常遇到L1L_{1}范数,它表⽰为向量元素的绝对值之和:

    x1=i=1nxi\left \| \mathbf{x} \right \| _{1}=\sum_{i=1}^{n}\left | x_{i} \right |

  • L2L_{2}范数相⽐,L1L_{1}范数受异常值的影响较⼩.为了计算L1L_{1}范数,我们将绝对值函数和按元素求和组合起来.

    1
    2
    3
    torch.abs(u).sum()

    ==>tensor(7.)
  • L2L_{2}范数和L1L_{1}范数都是更⼀般的LpL_{p}​范数的特例

    xp=(i=1nxip)1/p\|\mathbf{x} \|_p = \left( \sum_{i=1}^n |x_i|^p \right)^{1/p} \quad

  • 类似于向量的L2L_{2}范数,矩阵 ( XRm×n\mathbf{X} \in \mathbb{R}^{m \times n} ) 的 Frobenius 范数 (Frobenius norm) 是矩阵元素平方和的平方根

    XF=i=1mj=1nxij2\|\mathbf{X} \|_F = \sqrt{\sum_{i=1}^m \sum_{j=1}^n x_{ij}^2}

  • Frobenius范 数 满 ⾜ 向 量 范 数 的 所 有 性 质, 它 就 像 是 矩 阵 形 向 量 的L2L_{2}​范 数. 调 ⽤ 以 下 函 数 将 计 算 矩 阵 的Frobenius范数

    1
    2
    3
    torch.norm(torch.ones((4, 9)))

    ==> tensor(6.)

2.4 微积分

导数和微分

  • 假设我们有⼀个函数f:RRf: \mathbb{R}\to\mathbb{R},其输⼊和输出都是标量.如果ff​的导数存在,这个极限被定义为

    f(x)=limh0f(x+h)f(x)hf'(x)=\lim_{h \to 0} \frac{f(x+h)-f(x)}{h}

  • 如果f(a)f'(a)存在,则称ffaa处是可微(differentiable)的.如果ff在⼀个区间内的每个数上都是可微的,则此函数在此区间中是可微的.可以将上述公式中的导数f(x)f'(x)解释为f(x)f(x)相对于xx的瞬时(instantaneous)变化率.所谓的瞬时变化率是基于xx中的变化hh,且hh接近00

  • 给定 y=f(x)y = f(x),其中xxyy分别是函数ff的自变量和因变量.以下表达式是等价的:

    f(x)=y=dydx=dfdx=ddx(x)=Df(x)=Dxf(x)f'(x) = y' = \frac{dy}{dx} =\frac{df}{dx} = \frac{d}{dx} (x) = Df(x) = D_xf(x)

    • 其中符号 ddx\frac{d}{dx}DD​是微分符号,表示微分操作.我们可以使用以下规则来对常见函数求微分:

      DC=0C是一个常数)Dxn=nxn1(幂律(power rule),n是任意实数)Dex=exDln(x)=1/xDC = 0(C是一个常数)\\ Dx^n = nx^{n-1}(幂律 (power \ rule),n是任意实数)\\ De^x = e^x \\ D\ln(x) = 1/x\\

  • 为了微分一个由一些常见函数组成的函数,下面的一些法则方便使用.假设函数ffgg都是可微的,CC是一个常数,则

    • 常数相乘法则

      ddx[Cf(x)]=Cddx(f(x))\frac{d}{dx} [Cf(x)] = C \frac{d}{dx} (f(x))

    • 加法法则

      ddx[f(x)+g(x)]=ddxf(x)+ddxg(x)\frac{d}{dx} [f(x) + g(x)] = \frac{d}{dx} f(x)+ \frac{d}{dx}g(x)

    • 乘法法则

      ddx[f(x)g(x)]=f(x)ddx[g(x)]+g(x)ddx[f(x)]\frac{d}{dx} [f(x) g(x)] = f(x) \frac{d}{dx} [g(x)] + g(x) \frac{d}{dx} [f(x)]

    • 除法法则

      ddx[f(x)g(x)]=g(x)ddx[f(x)]f(x)ddx[g(x)][g(x)]2\frac{d}{dx} \left[ \frac{f(x)}{g(x)} \right] = \frac{g(x) \frac{d}{dx} [f(x)] - f(x) \frac{d}{dx} [g(x)]}{[g(x)]^2}

偏导数

  • y=f(x1,x2,...,xn)y = f (x1 , x2 , . . . , xn )是⼀个具有nn个变量的函数.yy关于第ii个参数xix_{i}的偏导数(partial derivative)为:

    yxi=limh0f(x1,,xi1,xi+h,xi+1,,xn)f(x1,,xi,,xn)h\frac{\partial y}{\partial x_{i}}=\lim _{h \rightarrow 0} \frac{f\left(x_{1}, \ldots, x_{i-1}, x_{i}+h, x_{i+1}, \ldots, x_{n}\right)-f\left(x_{1}, \ldots, x_{i}, \ldots, x_{n}\right)}{h}

  • 为了计算yxi\frac{\partial y}{\partial x_{i}},可以简单地讲x1,,xi1,xi+h,xi+1,,xnx_{1}, \ldots, x_{i-1}, x_{i}+h, x_{i+1}, \ldots, x_{n}看作常数,并计算yy关于xix_{i}的倒数,对于偏导数的表示,以下是等价的:

    yxi=fxi=fxi=fi=Dif=Dxif\frac{\partial y}{\partial x_{i}}=\frac{\partial f}{\partial x_{i}}=fx_{i}=f_{i}=D_{i}f=D_{x_{i}}f

梯度

  • 我们可以连结⼀个多元函数对其所有变量的偏导数,以得到该函数的梯度(gradient)向量.具体⽽⾔,设函数f:RnRf:\mathbb{R}^{n} \to \mathbb{R}的输⼊是⼀个nn维向量$\mathbf{x}=[x_{1} , x_{2} , \dots, x_{n}]^{T} ,并且输出是⼀个标量.函数,并且输出是⼀个标量.函数f(\mathbf{x})相对于相对于\mathbf{x}$​的梯度是⼀个包含n个偏导数的向量:

    xf(x)=[f(x)x1,f(x)x2,,f(x)xn]T\nabla _{x}f(\mathbf{x} )=\left [ \frac{ \partial f(\mathbf{x})}{ \partial x_{1}},\frac{ \partial f(\mathbf{x})}{ \partial x_{2}}, \dots,\frac{ \partial f(\mathbf{x})}{ \partial x_{n}} \right ] ^{T}

    • 其中xf(x)\nabla _{x}f(\mathbf{x})通常在没有歧义时被f(x)\nabla f(\mathbf{x})取代.
  • 假设x\mathbf{x}nn​维向量,在微分多元函数时经常使⽤以下规则:

    • 对于所有ARm×m\mathbf{A} \in \mathbb{R}^{m \times m},都有xAx=AT\nabla _{x}\mathbf{Ax}=\mathbf{A}^{T}
    • 对于所有ARm×m\mathbf{A} \in \mathbb{R}^{m \times m},都有xxTA=A\nabla _{x}\mathbf{x^{T}A}=\mathbf{A}
    • 对于所有ARm×m\mathbf{A} \in \mathbb{R}^{m \times m},都有xxTAx=(A+AT)x\nabla _{x}\mathbf{x^{T}Ax}=\mathbf{(A+A^{T})x}
    • xx2=xxTx=2x\nabla_{x} \|\mathbf{x}\|^{2}=\nabla_{x}\mathbf{x}^{T}\mathbf{x}=2\mathbf{x}
  • 同样对于任何矩阵X\mathbf{X},都有xXF2=2X\nabla_{x} \|\mathbf{X}\|^{2}_{F}=2\mathbf{X}

链式法则

  • 然⽽,上⾯⽅法可能很难找到梯度.这是因为在深度学习中,多元函数通常是复合(composite)的,所以难以应⽤上述任何规则来微分这些函数.幸运的是,链式法则可以被⽤来微分复合函数.

  • 让我们先考虑单变量函数.假设函数y=f(u)y = f(u)u=g(x)u = g(x)​都是可微的,根据链式法则

    dydx=dydududx\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}

  • 现在考虑⼀个更⼀般的场景,即函数具有任意数量的变量的情况.假设可微分函数yy有变量u1,u2,,umu_{1},u_{2}, \dots , u_{m},其中每个可微分函数uiu_{i}都有变量x1,x2,...,xnx_{1} , x_{2} , . . . , x_{n}.注意,yyx1,x2,xnx_{1} , x_{2} \dots , x_{n} 的函数.对于任意i=1,2,,ni = 1, 2, \dots , n​,链式法则给出

    yxi=yu1u1xi+yu2u2xi++yumumxi\frac{\partial y}{\partial x_{i}}=\frac{\partial y}{\partial u_{1}} \frac{\partial u_{1}}{\partial x_{i}}+\frac{\partial y}{\partial u_{2}} \frac{\partial u_{2}}{\partial x_{i}}+\cdots+\frac{\partial y}{\partial u_{m}} \frac{\partial u_{m}}{\partial x_{i}}

2.5 ⾃动微分

  • 深度学习框架通过⾃动计算导数,即⾃动微分(automatic differentiation)来加快求导.实际中,根据设计好的模型,系统会构建⼀个计算图(computational graph),来跟踪计算是哪些数据通过哪些操作组合起来产⽣输出.⾃动微分使系统能够随后反向传播梯度.这⾥,反向传播(backpropagate)意味着跟踪整个计算图,填充关于每个参数的偏导数.

2.6 概率

概率论公理

  • 在处理骰⼦掷出时,我们将集合S=1,2,3,4,5,6S = {1, 2, 3, 4, 5, 6} 称为样本空间(sample space)或结果空间(outcome space),其中每个元素都是结果(outcome).事件(event)是⼀组给定样本空间的随机结果.例如,“看到5”(5{5})和“看到奇数”(1,3,5{1, 3, 5})都是掷出骰⼦的有效事件.注意,如果⼀个随机实验的结果在A中,则事件A已经发⽣.也就是说,如果投掷出3点,因为31,3,53 \in {1, 3, 5}​,我们可以说,“看到奇数”的事件发⽣了.
  • 概率(probability)可以被认为是将集合映射到真实值的函数.在给定的样本空间S\mathcal{S}中,事件A的概率,表⽰为P(A)P (\mathcal{A} ),满⾜以下属性:
    • 对于任意事件A\mathcal{A},其概率从不会是负数,即P(A)0P (\mathcal{A}) ≥ 0
    • 整个样本空间的概率为1,即P(S)=1P (\mathcal{S}) = 1​;
    • 对于互斥(mutually exclusive)事件(对于所有iji\neq j都有$\mathcal{A}{i}\cap\mathcal{A}{j}=\emptyset )的任意一个可数序列)的任意一个可数序列\mathcal{A}{1},\mathcal{A}{2},\dots,序列中任意一个事件发生的概率等于它们各自发生的概率之和,序列中任意一个事件发生的概率等于它们各自发生的概率之和,即P(\cup_{i=1}^{\infty}\mathcal{A}{i})=\sum{i=1}^{\infty}P(\mathcal{A_{i}})$​
  • 以上也是概率论的公理,由科尔莫⼽罗夫于1933年提出.有了这个公理系统,我们可以避免任何关于随机性的哲学争论;相反,我们可以⽤数学语⾔严格地推理.例如,假设事件Ai\mathcal{A_{i}}为整个样本空间,且当所有i>1i > 1时的Ai=\mathcal{A_{i}} = \emptyset,那么我们可以证明P()=0P (\emptyset) = 0,即不可能发⽣事件的概率是0.

随机变量

  • 随机变量⼏乎可以是任何数量,并且它可以在随机实验的⼀组可能性中取⼀个值.考虑⼀个随机变量XX ,其值在掷骰⼦的样本空间S=1,2,3,4,5,6S = {1, 2, 3, 4, 5, 6}中.我们可以将事件“看到⼀个5”表⽰为X=5{X = 5}X=5X = 5,其概率表⽰为P(X=5)P ({X = 5})P(X=5)P (X = 5).通过P(X=a)P (X = a),我们区分了随机变量XXXX 可以采取的值(例如aa).
  • 然⽽,这可能会导致繁琐的表⽰.为了简化符号,⼀⽅⾯,我们可以将P(X)P (X )表⽰为随机变量X 上的分布(distribution):分布告诉我们XX获得某⼀值的概率.另⼀⽅⾯,我们可以简单⽤P(a)P (a)表⽰随机变量取值aa的概率.由于概率论中的事件是来⾃样本空间的⼀组结果,因此我们可以为随机变量指定值的可取范围.例如,表⽰事件1X3{1 ≤ X ≤ 3},即X=1,2,or,3{X = 1, 2, or, 3}的概率.等价地,P(1X3)P (1 ≤ X ≤ 3)表⽰随机变量XX1,2,3{1, 2, 3}​中取值的概率.

联合概率

  • 第⼀个被称为联合概率(joint probability)P(A=a,B=b)P (A = a, B = b).给定任意值aabb,联合概率可以回答:A=aA = aB=bB = b同时满⾜的概率是多少?请注意,对于任何aabb的取值,P(A=a,B=b)P(A=a)P (A = a, B = b) ≤ P (A = a).这点是确定的,因为要同时发⽣A=aA = aB=bB = b,A=aA = a就必须发⽣,B=bB = b也必须发⽣(反之亦然).因此,A=aA = aB=bB = b同时发⽣的可能性不⼤于A=aA = a或是B=bB = b​单独发⽣的可能性.

条件概率

  • 联合概率的不等式带给我们一个有趣的比率:0<P(A=a,B=b)P(A=a)10<\frac{P(A=a,B=b)}{P(A=a)} \le 1.我们称这个比率为条件概率(conditional probability),并用P(B=bA=a)P(B=b|A=a)表示它,它是B=bB=b的概率,前提是A=aA=a​已经发生.

⻉叶斯定理

  • 使用条件概率的定义,我们可以得出统计学中最有用的方程之一:Bayes定理(Bayes' theorem).根据乘法法则(multiplication rule)可得到P(A,B)=P(BA)P(A)P(A,B)=P(B|A)P(A).根据对称性,可得到P(A,B)=P(AB)P(B)P(A,B)=P(A|B)P(B).假设P(B)>0P(B)>0,求解其中一个条件变量,我们得到

    P(AB)=P(BA)P(A)P(B)P(A|B)=\frac{P(B|A)P(A)}{P(B)}

  • 请注意,这里我们使用紧凑的表示法: 其中P(A,B)P(A,B)是一个联合分布(join distribution),P(AB)P(A|B)是一个条件分布(conditional distribution).这种分布可以在定值A=a,B=bA=a,B=b上进行求值.