0%

Deep Learning(深度学习)

应用数学与机器学习基础

线性代数

@(特征分解)

方阵 AA 的 特征向量(eigenvector)是指与 AA 相乘后相当于对该向量进行缩放 的非零向量 vv: Av=λvAv = λv.
标量 λλ 被称为这个特征向量对应的特征值(eigenvalue)。

假设矩阵 AAnn 个线性无关的特征向量{v(1),...,v(n)}\{v^{(1)},...,v^{(n)}\},对应着特征值 {λ1,...,λn}\{λ_1,...,λ_n\}。我们将特征向量连接成一个矩阵,使得每一列是一个特征向量:V=[v(1),...,v(n)]V = [v^{(1)},...,v^{(n)}]。类似地,我们也可以将特征值连接成一个向量 λ=[λ1,...,λn]\mathbb λ = [λ_1, . . . , λ_n]^⊤。因此 AA 的特征分解(eigendecomposition)可以记作

A=Vdiag(λ)V1A = Vdiag(\mathbb \lambda)V^{-1}

Asymetric=QΛQTA_{symetric} = Q\varLambda Q^T

@(奇异值分解)[SVD]

我们将矩阵 A 分解成三个矩阵的乘积 A=UDVTA = UDV^T
假设 AA 是一个 m×nm×n 的矩阵,那么 UU 是一个 m×mm×m 的矩阵,DD 是一个 m×nm×n 的矩阵,VV 是一个 n×nn × n 矩阵。

这些矩阵中的每一个经定义后都拥有特殊的结构。矩阵 UUVV 都定义为正交矩阵,而矩阵 DD 定义为对角矩阵。注意,矩阵 DD 不一定是方阵。

对角矩阵 DD 对角线上的元素被称为矩阵 AA奇异值(singular value)。矩阵 UU 的列向量被称为 左奇异 向量(left singular vector),矩阵 VV 的列向量被称 右奇异 向量(right singular vector)。

我们可以用与 AA 相关的特征分解去解释 AA 的奇异值分解。AA 的左奇异向量(left singular vector)是 AAAA^⊤ 的特征向量。AA 的右奇异向量(right singular vector)是 AAA^⊤A 的特征向量。AA 的非零奇异值是 AAA^⊤A 特征值的平方根,同时也是 AAAA^⊤ 特征值的平方根。

SVD 最有用的一个性质可能是拓展矩阵求逆到非方矩阵

@(Moore-Penrose 伪逆)

对于非方矩阵而言,其逆矩阵没有定义。假设在下面的问题中,我们希望通过矩阵 AA 的左逆 BB 来求解线性方程。Ax=bx=ByAx=b \to x = By。 取决于问题的形式,我们可能无法设计一个唯一的映射将 AA 映射到 BB

如果矩阵 AA 的行数大于列数,那么上述方程可能没有解。如果矩阵 AA 的行数小于列数,那么上述矩阵可能有多个解。

Moore-Penrose 伪逆(Moore-Penrose pseudoinverse)使我们在这类问题上取得了一定的进展。矩阵 A 的伪逆定义为

A+=limα0(ATA+αI)1AT\displaystyle A^+ = \lim_{\alpha \searrow 0}(A^TA + \alpha I)^{-1}A^T

计算伪逆的实际算法没有基于这个定义,而是使用下面的公式:

A+=VD+UTA^+ = VD^+U^T

矩阵 UUDDVV 是矩阵AA奇异值分解后得到的矩阵。对角矩阵 DD 的伪逆 D+D^+ 是其非零元素取倒数之后再转置得到的

当矩阵 AA 的列数多于行数时,使用伪逆求解线性方程是众多可能解法中的一 种。特别地,x=A+yx = A^+y 是方程所有可行解中欧几里得范数 x2∥x∥_2 最小的一个。
当矩阵 AA 的行数多于列数时,可能没有解。在这种情况下,通过伪逆得到的 xx 使得 AxAxyy 的欧几里得距离 Axy2∥Ax−y∥_2 最小。

@(迹运算)

迹运算返回的是矩阵对角元素的和: Tr(A)=iAi,iTr(A) = \sum_i A_{i,i}
显然 Tr(A)=Tr(AT)Tr(A) = Tr(A^T)

有些矩阵运算很难描述,而通过矩 阵乘法和迹运算符号可以清楚地表示。

例如,迹运算提供了另一种描述矩阵Frobenius范数的方式:

AF=Tr(AAT)||A||_F = \sqrt{Tr(AA^T)}

多个矩阵相乘得到的方阵的迹,和将这些矩阵中的最后一个挪到最前面之后相乘的迹是相同的。

Tr(ABC)=Tr(CAB)=Tr(BCA)Tr(ABC)=Tr(CAB)=Tr(BCA)

或者更一般地,

Tr(i=1nF(i))=Tr(F(n)i=1n1F<!0>)Tr(\prod_{i=1}^nF^{(i)}) = Tr(F^{(n)}\prod_{i=1}^{n-1}F^)

即使循环置换后矩阵乘积得到的矩阵形状变了,迹运算的结果依然不变。假设ARm×n,BRn×mA ∈ R^{m×n}, B ∈ R^{n×m}Tr(AB)=Tr(BA)Tr(AB) = Tr(BA)

@(行列式)

行列式,记作 det(A)det(A),是一个将方阵 AA 映射到实数的函数。行列式等于矩阵特征值的乘积。行列式的绝对值可以用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。如果行列式是 0,那么空间至少沿着某一维完全收缩了,使其失去了所有的体积。如果行列式是1,那么这个转换保持空间体积不变。

det(A)=i=1nλidet(A) = \prod_{i=1}^n\lambda_i

@(主成分析)[PCA]

假设在 RnR^n 空间中我们有 m 个点 {x(1),...,x(m)}\{x^{(1)}, . . . , x^{(m)}\},我们希望对这些点进行有损 压缩。有损压缩表示我们使用更少的内存,但损失一些精度去存储这些点。我们希 望损失的精度尽可能少。

一种编码这些点的方式是用低维表示。对于每个点 x(i)Rnx^{(i)} ∈ R^n,会有一个对应的 编码向量 c(i)Rlc^{(i)} ∈ R^l。如果 llnn 小,那么我们便使用了更少的内存来存储原来的数据。我们希望找到一个编码函数,根据输入返回编码,f(x)=cf(x) = c;我们也希望找到一 个解码函数,给定编码重构输入,xg(f(x))x ≈ g(f(x))

PCA 由我们选择的解码函数而定。具体地,为了简化解码器,我们使用矩阵乘法将编码映射回 RnR^n,即 g(c)=Dcg(c) = Dc,其中 DRn×lD ∈ R^{n×l} 是定义解码的矩阵。

目前为止所描述的问题,可能会有多个解。因为如果我们按比例地缩小所有点 对应的编码向量 cic_i,那么我们只需按比例放大 D:,iD_{:,i},即可保持结果不变。为了使问题有唯一解,我们限制 DD 中所有列向量都有单位范数。
计算这个解码器的最优编码可能是一个困难的问题。

为了使编码问题简单一些, PCA 限制 DD 的列向量彼此正交(注意,除非 l=nl = n,否则严格意义上 DD 不是一个正交矩阵)。

为了将这个基本想法变为我们能够实现的算法,首先我们需要明确如何根据每 一个输入 xx 得到一个最优编码 cc^∗。一种方法是最小化原始输入向量 xx 和重构向量 g(c)g(c^∗) 之间的距离。我们使用范数来衡量它们之间的距离。在 PCA 算法中,我们使 用 L2 范数:

c=argmincxg(c)2c^* =\mathop{\arg\min}_c||x - g(c)||_2

我们可以用平方 L2L^2 范数替代 L2L^2 范数,因为两者在相同的值 cc 上取得最小值。 这是因为 L2L^2 范数是非负的,并且平方运算在非负值上是单调递增的。

c=argmincxg(c)22=argminc(xg(c))T(xg(c))c^* = \mathop{\arg\min}_c||x-g(c)||_2^2 = \mathop{\arg\min}_c\big (x-g(c)\big )^T\big(x-g(c)\big)

因为第一项 xxx^⊤x 不依赖于 cc,所以我们可以忽略它,得到如下的优化目标:

c=argminc2xTg(c)+g(c)Tg(c)=argminc2xTDc+cTDTDc=argminc2xTDc+cTc\begin{aligned}c^* &= \mathop{\arg\min}_c - 2x^Tg(c) + g(c)^Tg(c)\\&=\mathop{\arg\min}_c - 2x^TDc + c^TD^TDc\\&= \mathop{\arg\min}_c -2x^TDc + c^Tc\end{aligned}

通过向量微积分来求解这个最优化问题

c(2xTDc+cTc)=02DTx+2c=0c=DTx\nabla_c(-2x^TDc + c^Tc) = 0 \\ -2D^Tx + 2c = 0 \\ c = D^Tx

这使得算法很高效:最优编码 xx 只需要一个矩阵-向量乘法操作。为了编码向量, 我们使用编码函数:

f(x)=DTxf(x) = D^Tx

进一步使用矩阵乘法,我们也可以定义 PCA 重构操作:

r(x)=g(f(x))=DDTxr(x) = g(f(x)) = DD^Tx

接下来,我们需要挑选编码矩阵 DD。要做到这一点,我们回顾最小化输入和重构之间 L2L^2 距离的这个想法。因为用相同的矩阵 DD 对所有点进行解码,我们不能再孤立地看待每个点。反之,我们必须最小化所有维数和所有点上的误差矩阵的Frobenius范数:

D=argminDij(xj(i)r(xi)j)2subject to DTD=IlD^* = \mathop{\arg\min}_D\sqrt{\sum_{ij}\bigg(x_j^{(i)} - r(x^{i})_j\bigg)^2} \hspace{2em}\text{subject to } D^TD = I_l

为了推导用于寻求 D∗ 的算法,我们首先考虑 l=1l = 1 的情况。在这种情况下,DD 是一个单一向量 dd

d=argmindXXddTF2subject to dtd=1XRmxn,Xi,:=x(i)T=argmindTr((XXddT)T(XXddT))=argmindTr(XTX)Tr(XTXddT)Tr(ddTXTX)+Tr(ddTXTXddT)=argmindTr(XTXddT)Tr(ddTXTX)+Tr(ddTXTXddT)=argmind2Tr(XTXddT)+Tr(ddTXTXddT)=argmind2Tr(XTXddT)+Tr(XTXddTddT)=argmind2Tr(XTXddT)+Tr(XTXddT)=argmindTr(XTXddT)=argmaxdTr(XTXddT)=argmaxdTr(dTXTXd)subject to dTd=I\begin{aligned} d^* &= \mathop{\arg\min}_d||X - Xdd^T||_F^2\hspace{2em}\text{subject to } d^td = 1\hspace{1em}X \in R^{mxn}, X_{i,:} = x^{(i)^T}\\ &= \mathop{\arg\min}_d Tr\bigg(\big(X - Xdd^T\big)^T\big(X - Xdd^T\big)\bigg)\\ &= \mathop{\arg\min}_d Tr(X^TX) - Tr(X^TXdd^T) - Tr(dd^TX^TX) + Tr(dd^TX^TXdd^T)\\ &= \mathop{\arg\min}_d - Tr(X^TXdd^T) -Tr(dd^TX^TX) + Tr(dd^TX^TXdd^T)\\ &= \mathop{\arg\min}_d -2Tr(X^TXdd^T) + Tr(dd^TX^TXdd^T) \\ &= \mathop{\arg\min}_d -2Tr(X^TXdd^T) + Tr(X^TXdd^Tdd^T)\\ &= \mathop{\arg\min}_d -2Tr(X^TXdd^T) + Tr(X^TXdd^T)\\ &= \mathop{\arg\min}_d -Tr(X^TXdd^T)\\ &= \mathop{\arg\max}_d Tr(X^TXdd^T)\\ &= \mathop{\arg\max}_d Tr(d^TX^TXd) \hspace{2em}\text{subject to } d^Td = I \end{aligned}

这个优化问题可以通过特征分解来求解。具体来讲,最优的 ddXXX^⊤X最大特征值对应的特征向量。

以上推导特定于 l=1l = 1 的情况,仅得到了第一个主成分。更一般地,当我们希望得到主成分的基时,矩阵 DD 由前 ll 个最大的特征值对应的特征向量组成。这个结论 可以通过归纳法证明。

概率论

数值计算

基于梯度的优化方法

多数深度学习算法都涉及某种形式的优化。优化指的是改变 xx 以最小化或最大化某个函数 f(x)f(x) 的任务。我们通常以最小化 f(x)f(x) 指代大多数最优化问题。最大化可经由最小化算法最小化 f(x)−f(x) 来实现。

我们把要最小化或最大化的函数称为 目标函数(objective function)或 准则 (criterion)。当我们对其进行最小化时,我们也把它称为 代价函数(cost function)、 损失函数(loss function)或 误差函数(error function)。
我们通常使用一个上标 表示最小化或最大化函数的 xx 值。如我们记 x=argminf(x)x^∗ = \arg\min f (x)

f(x+ϵ)f(x)+ϵf(x)f(x + \epsilon) \approx f(x) + \epsilon f'(x) 导数对于最小化一个函数很有用,因为它告诉我们如何更改 xx 来略微地调整 yy。因此我们可以将 xx 往导数的反方向移动一小步来减小 f(x)f(x)。这种技术被称为梯度下降(gradient descent)。

我们经常需要最小化具有多维输入的函数:f:RnRf : R^n → R。为了使 ‘‘最小化’’ 的概念有 意义,输出必须是一维的 (标量). 梯度(gradient)是相对一个向量求导的导数: ff的导数是包含所有偏导数的向量,记为 xf(x)∇_xf(x)

uu(单位向量)方向的方向导数(directional derivative)是函数 ffuu 方向的斜率。即方向导数是函数 f(x+αu)f (x + αu) 关于 αα 的导数(在 αα = 0 时取得)。

使用链式法则,我们可以看到当 α=0α = 0αf(x+αu)=uTxf(x)\displaystyle \frac{\partial}{\partial \alpha}f(x+\alpha u) = u^T\nabla_xf(x)

为了最小化 ff,我们希望找到使 ff 下降得最快的方向。计算方向导数:

minu,uTu=1uTxf(x)=minu,uTu=1u2xf(x)2cosθ\displaystyle \min_{u,u^Tu=1} u^T\nabla_xf(x) = \min_{u,u^Tu =1}||u||_2||\nabla_xf(x)||_2cos\theta

其中 θθuu 与梯度的夹角。

我们在负梯度方向上移动可以减小 ff。这被称为最速下降法(method of steepest descent) 或 梯度下降(gradient descent)。

最速下降建议新的点为 x=xϵxf(x)x' = x - \epsilon \nabla_xf(x)
其中 εε 为 学习率(learning rate),是一个确定步长大小的正标量。

有时我们需要计算输入和输出都为向量的函数的所有偏导数。包含所有这样的偏导数的矩阵被称为 Jacobian 矩阵。

具体来说,如果我们有一个函数:f:RmRnf : R^m → R^n, ff的Jacobian矩阵JRn×mJ∈R^{n×m} 定义为Ji,j=xjf(x)iJ_{i,j} = \frac{\partial}{\partial x_j} f(x)_i

当我们的函数具有多维输入时,二阶导数也有很多。我们可以将这些导数合并成一个矩阵,称为 Hessian 矩阵。Hessian 矩阵 H(f)(x)H(f)(x) 定义为 H(f)(x)i,j=2xixjf(x)\displaystyle H(f)(x)_{i,j} = \frac{\partial ^2}{\partial x_i\partial x_j}f(x)

Hessian 等价于梯度的 Jacobian 矩阵。
微分算子在任何二阶偏导连续的点处可交换,也就是它们的顺序可以互换: 2xixjf(x)=2xjxif(x)\displaystyle \frac{\partial ^2}{\partial x_i\partial x_j}f(x) = \frac{\partial ^2}{\partial x_j\partial x_i}f(x)
这意味着 Hi,j=Hj,iH_{i,j} = H_{j,i},因此 Hessian 矩阵在这些点上是对称的。

在深度学习背景下, 我们遇到的大多数函数的 Hessian 几乎处处都是对称的。因为 Hessian 矩阵是实对称的,我们可以将其分解成一组实特征值和一组特征向量的正交基。在特定方向 dd 上的二阶导数可以写成 dHdd^⊤Hd。当 ddHH 的一个特征向量时,这个方向的二阶导数就是对应的特征值。对于其他的方向 dd,方向二阶导数是所有特征值的加权平均, 权重在 0 和 1 之间,且与 dd 夹角越小的特征向量的权重越大。最大特征值确定最大二阶导数,最小特征值确定最小二阶导数。

我们可以通过(方向)二阶导数预期一个梯度下降步骤能表现得多好。我们在当前点 x(0)x^{(0)} 处作函数 f(x)f(x) 的近似二阶泰勒级数:

f(x)f(x(0))+(xx(0))Tg+0.5(xx(0))TH(xx(0))f(x) \approx f(x^{(0)}) + (x - x^{(0)})^Tg + 0.5(x-x^{(0)})^TH(x-x^{(0)})

其中 gg 是梯度,HHx(0)x^{(0)} 点的 Hessian. 如果我们使用学习率 εε,那么新的点 xx 将会是 x(0)εgx^{(0)} − εg。代入上述的近似,可得

f(x(0)ϵg)f(x(0))ϵgTg+0.5ϵ2gTHgf(x^{(0)}- \epsilon g) \approx f(x^{(0)}) - \epsilon g^Tg + 0.5 \epsilon^2 g^THg

其中有 3 项:函数的原始值、函数斜率导致的预期调整、函数曲率导致的校正。当 最后一项太大时,梯度下降实际上是可能向上移动的。当 gHgg^⊤Hg 为零或负时,近似的泰勒级数表明增加 εε 将永远使 ff 下降。在实践中,泰勒级数不会在 εε 大的时候也 保持准确,因此在这种情况下我们必须采取更启发式的选择。当 gHgg^⊤Hg 为正时,通过计算可得,使近似泰勒级数下降最多的最优步长为

ϵ=gTggTHg\epsilon^* = \frac{g^Tg}{g^THg}

最坏的情况下,ggHH 最大特征值 λmaxλ_{max} 对应的特征向量对齐,则最优步长是 1λmax\frac{1}{\lambda_{max}}
我们要最小化的函数能用二次函数很好地近似的情况下,Hessian 的特征值决定了学 习率的量级。

二阶导数还可以被用于确定一个临界点是否是局部极大点、局部极小点或鞍点。

在多维情况下,我们需要检测函数的所有二阶导数。利用 Hessian 的特征值分解,我们可以将二阶导数测试扩展到多维情况。在临界点处(xf(x)=0∇_xf(x) = 0),我们通过检测 Hessian 的特征值来判断该临界点是一个局部极大点、局部极小点还是鞍点。

  1. 当 Hessian 是正定的(所有特征值都是正的),则该临界点是局部极小点。因为方向二阶导数在任意方向都是正的,参考单变量的二阶导数测试就能得出此结论。
  2. 当 Hessian 是负定的(所有特征值都是负的),这个点就是局部极大点。在多 维情况下,实际上我们可以找到确定该点是否为鞍点的积极迹象(某些情况下)。
  3. 如果 Hessian 的特征值中至少一个是正的且至少一个是负的,那么 xxff 某个横截面 的局部极大点,却是另一个横截面的局部极小点。

约束优化

有时候,在 xx 的所有可能值下最大化或最小化一个函数 f(x)f(x) 不是我们所希望 的。相反,我们可能希望在 xx 的某些集合 SS 中找 f(x)f(x) 的最大值或最小值。这被称 为 约束优化 (constrained optimization)。在约束优化术语中,集合 SS 内的点 xx 被称可行(feasible)点。

Karush–Kuhn–Tucker(KKT)方法是针对约束优化非常通用的解决方案。 为介绍KKT方法,我们引入一个称为 广义 Lagrangian(generalized Lagrangian) 或 广义 Lagrange 函数(generalized Lagrange function)的新函数。
为了定义Lagrangian,我们先要通过等式和不等式的形式描述 SS。我们希望通过mm个函数g(i)g^{(i)}nn个函数h(j)h^{(j)} 描述SS,那么SS可以表示为S={xi,g(i)(x)=0 and j,h(j)(x)0}S=\{x|∀i,g^{(i)}(x)= 0 \text{ and }∀j, h^{(j)}(x) ≤ 0\}。其中涉及 g(i)g^{(i)} 的等式称为 等式约束(equality constraint), 涉及 h(j)h^{(j)} 的不等式称为 不等式约束(inequality constraint)。
我们为每个约束引入新的变量 λiλ_iαjα_j,这些新变量被称为 KKT 乘子。广义 Lagrangian 可以如下定义:

L(x,λ,α)=f(x)+iλig(i)(x)+jαjh(j)(x)L(x, \lambda, \alpha) = f(x) + \sum_i\lambda_ig^{(i)}(x) + \sum_j\alpha_jh^{(j)}(x)

现在,我们可以通过优化无约束的广义 Lagrangian 解决约束最小化问题。只要存在至少一个可行点且 f(x)f(x) 不允许取 \infty,那么

minxmaxλmaxα,α0L(x,λ,α)\min_x\max_\lambda\max_{\alpha,\alpha\ge 0}L(x,\lambda, \alpha)

与如下函数有相同的最优目标函数值和最优点集 xx

minxSf(x)\min_{x\in S}f(x)

这是因为当约束满足时

maxλmaxα,α0L(x,λ,α)=f(x)\max_\lambda\max_{\alpha,\alpha\ge 0}L(x,\lambda, \alpha) = f(x)

而违反任意约束时

maxλmaxα,α0L(x,λ,α)=\max_\lambda\max_{\alpha,\alpha\ge 0}L(x,\lambda, \alpha) = \infty

这些性质保证不可行点不会是最佳的,并且可行点范围内的最优点不变。

 

要解决约束最大化问题,我们可以构造 f(x)−f(x) 的广义 Lagrange 函数,从而导 致以下优化问题:

minxmaxλmaxα,α0f(x)+iλig(i)(x)+jαjh(j)(x)\min_x\max_\lambda\max_{\alpha,\alpha\ge 0} -f(x) + \sum_i\lambda_ig^{(i)}(x) + \sum_j\alpha_jh^{(j)}(x)

我们也可将其转换为在外层最大化的问题:

maxxminλmaxα,α0f(x)+iλig(i)(x)jαjh(j)(x)\max_x\min_\lambda\max_{\alpha,\alpha\ge 0} f(x) + \sum_i\lambda_ig^{(i)}(x) - \sum_j\alpha_jh^{(j)}(x)

我们可以使用一组简单的性质来描述约束优化问题的最优点。这些性质称 为 **Karush–Kuhn–Tucker(KKT)**条件
这些是确定一个点是最优点的必要条件,但不一定是充分条件。这些条件是:

  • 广义 Lagrangian 的梯度为零
  • 所有关于 xx 和 KKT 乘子的约束都满足
  • 不等式约束显示的 ‘‘互补松弛性’’: αh(x)=0α ⊙ h(x) = 0

机器学习基础

学习算法

@(线性回归)

线性回归解决回归问题。建立一个系统,将向量 xRnx ∈ R^n 作为输入,预测标量 yRy ∈ R 作为输出。线性回归的输出是其输入的线性函数。令 y^\hat y 表示模型预测 yy 应该取的值。我们定义输出为

y^=ωTx\hat y = \omega^T x

度量模型性能的一种方法是计算模型在测试集上的均方误差(mean squared error)。

如果 y^(test)\hat y^{(test)} 表示模型在测试集上的预测值,那么均方误差表示为:

MSEtest=1mi(y^(test)y(test))i2=1my^(test)y(test)22MSE_{test} = \frac{1}{m}\sum_i(\hat y^{(test)} - y^{(test)})_i^2 = \frac{1}{m}\bigg|\bigg|\hat y^{(test)} - y^{(test)}\bigg|\bigg|_2^2

最小化 MSEtrain,我们可以简单地求解其导数为 0 的情况: ωMSEtrain=0\nabla_\omega MSE_{train} = 0
ω=(X(train)TX(train))1X(train)Ty(train)\to \omega = \bigg(X^{(train)T}X^{(train)}\bigg)^{-1}X^{(train)T}y^{(train)}

@(监督学习法)[SVM]

粗略地说, 监督学习算法是给定一组输入 xx 和输出 yy 的训练 集,学习如何关联输入和输出。在许多情况下,输出 yy 很难自动收集,必须由人来提供 ‘‘监督’’,不过该术语仍然适用于训练集目标可以被自动收集的情况。

类似于逻辑回归,SVM模型也是基于线性函数 wx+bw^⊤x + b 的。不同于逻辑回归的是,支持向量机不输出概率,只输 出类别。当 wx+bw^⊤x + b 为正时,支持向量机预测属于正类。类似地,当 wx+bw^⊤x + b 为负 时,支持向量机预测属于负类。

支持向量机的一个重要创新是核技巧(kernel trick)。核技巧观察到许多机器学习算法都可以写成样本间点积的形式。例如,支持向量机中的线性函数可以重写为

ωTx+b=b+i=1mαixTx(i)\omega^Tx + b = b + \sum_{i=1}^{m}\alpha_ix^Tx^{(i)}

其中,x(i)x^{(i)} 是训练样本,αα 是系数向量。学习算法重写为这种形式允许我们将 xx 替 换为特征函数 φ(x)φ(x) 的输出,点积替换为被称为核函数(kernel function)的函数 k(x,x(i))=φ(x)φ(x(i))k(x, x^{(i)}) = φ(x) · φ(x^{(i)})。运算符 · 表示类似于 φ(x)φ(x(i))φ(x)^⊤φ(x(i)) 的点积。对于某些特征空间,我们可能不会书面地使用向量内积。在某些无限维空间中,我们需要使用其他类型的内积,如基于积分而非加和的内积。这种类型内积的完整介绍超出了本书的范围。
使用核估计替换点积之后,我们可以使用如下函数进行预测

f(x)=b+iαik(x,x(i))f(x) = b + \sum_i\alpha_ik(x, x^{(i)})

这个函数关于 xx 是非线性的,关于 φ(x)φ(x) 是线性的。ααf(x)f(x) 之间的关系也是线性的。核函数完全等价于用 φ(x)φ(x) 预处理所有的输入,然后在新的转换空间学习线性模型。

最常用的核函数是高斯核(Gaussian kernel)

k(u,v)=N(uv;0,σ2I)k(u, v) = \mathcal{N}(u-v; 0, \sigma^2I)

这个核也被称为径向基函数(radial basis function, RBF)核,因为其值沿 vv 中从 uu 向外辐射的方向减小。高斯核对应于无限维空间中的点积,但是该空间的推导没有整数上最小核的示例那么直观。

@(随机梯度下降)

几乎所有的深度学习算法都用到了一个非常重要的算法:随机梯度下降 (stochastic gradient descent, SGD)

@(构建机器学习算法)

几乎所有的深度学习算法都可以被描述为一个相当简单的配方:特定的数据集、代价函数、优化过程和模型。

深度网络

deep feedforward network 深度前馈网络

前馈神经网络被称作网络(network)是因为它们通常用许多不同函数复合在一起来表示。该模型与一个有向无环图相关联,而图描述了函数是如何复 合在一起的。例如,我们有三个函数 f(1)f^{(1)}, f(2)f^{(2)}f(3)f^{(3)} 连接在一个链上以形成 f(x)=f(3)(f(2)(f(1)(x)))f(x) = f^{(3)}(f^{(2)}(f^{(1)}(x)))。这些链式结构是神经网络中最常用的结构。在这种情况下,f(1)f^{(1)}被称为网络的第一层(firstlayer),f(2)f^{(2)} 被称为第二层(secondlayer),以此类推。链的全长称为模型的深度(depth)。正是因为这个术语才出现了 ‘‘深度学 习’’ 这个名字。前馈网络的最后一层被称为输出层(output layer)。在神经网络训练的过程中,我们让 f(x)f(x) 去匹配 f(x)f^∗(x) 的值。训练数据为我们提供了在不同训练点上取值的、含有噪声的f(x)f^∗(x) 的近似实例。每个样本xx都伴随着一个标签yf(x)y ≈ f^∗(x)。训练样本直接指明了输出层在每一点 xx 上必须做什么;它必须产生一个接近 yy 的值。但是训练数据并没有直接指明其他层应该怎么做。学习算法必须决定如何使用这些层来产生想要的输出,但是训练数据并没有说每个单独的层应该做什么。相反,学习算法必须决定如何使用这些层来最好地实现 ff^∗ 的近似。因为训练数据并没有给出这些层中的每一层所需的输出,所以这些层被称为隐藏层(hidden layer)

一种理解前馈网络的方式是从线性模型开始,并考虑如何克服它的局限性。线性模型,例如逻辑回归和线性回归,是非常吸引人的,因为无论是通过闭解形式还 是使用凸优化,它们都能高效且可靠地拟合。线性模型也有明显的缺陷,那就是该 模型的能力被局限在线性函数里,所以它无法理解任何两个输入变量间的相互作用。

为了扩展线性模型来表示 xx 的非线性函数,我们可以不把线性模型用于 xx 本身, 而是用在一个变换后的输入 φ(x)φ(x) 上,这里 φφ 是一个非线性变换。同样,我们可以 使用核技巧,来得到一个基于隐含地使用 φφ 映射的非线性学习算 法。我们可以认为 φφ 提供了一组描述 xx 的特征,或者认为它提供了 xx 的一个新的表示。

剩下的问题就是如何选择映射 φφ

  1. 其中一种选择是使用一个通用的 φφ

例如无限维的 φφ,它隐含地用在基 于 RBF 核的核机器上。如果 φ(x)φ(x) 具有足够高的维数,我们总是有足够的能力来拟合训练集,但是对于测试集的泛化往往不佳。非常通用的特征映射通常只基于局部光滑的原则,并且没有将足够的先验信息进行编码来解决高级问题。

  1. 另一种选择是手动地设计 φφ

在深度学习出现以前,这一直是主流的方法。这种方法对于每个单独的任务都需要人们数十年的努力,从业者各自擅长特定的领域(如语音识别或计算机视觉),并且不同领域之间很难迁移 (transfer)。

  1. 深度学习的策略是去学习 φφ

在这种方法中,我们有一个模型 y=f(x;θ,w)=φ(x;θ)wy = f (x; θ, w) = φ(x; θ)^⊤w。我们现在有两种参数:用于从一大类函数中学习 φφ 的参数 θθ,以及 用于将 φ(x)φ(x) 映射到所需的输出的参数 ww。这是深度前馈网络的一个例子,其 中 φφ 定义了一个隐藏层。这是三种方法中唯一一种放弃了训练问题的凸性的, 但是利大于弊。在这种方法中,我们将表示参数化为 φ(x;θ)φ(x; θ),并且使用优化算 法来寻找 θθ,使它能够得到一个好的表示。如果我们想要的话,这种方法也可 以通过使它变得高度通用以获得第一种方法的优点——我们只需使用一个非常广泛的函数族 φ(x;θ)φ(x; θ)。这种方法也可以获得第二种方法的优点。人类专家可以将他们的知识编码进网络来帮助泛化,他们只需要设计那些他们期望能够表现 优异的函数族 φ(x;θ)φ(x; θ) 即可。这种方法的优点是人类设计者只需要寻找正确的函数族即可,而不需要去寻找精确的函数。

隐藏单元

隐藏单元的设计是一个非常活跃的研究领域,并且还没有许多明确的指导性理 论原则。
整流线性单元是隐藏单元极好的默认选择。

除非另有说明,大多数的隐藏单元都可以描述为接受输入向量 xx,计算仿射变 换 z=Wx+bz = W^⊤x + b,然后使用一个逐元素的非线性函数 g(z)g(z)。大多数隐藏单元的区别仅仅在于激活函数 g(z)g(z) 的形式

整流线性单元及其扩展

整流线性单元使用激活函数 g(z)=max{0,z}g(z) = max\{0, z\}。通常作用于仿射变换之上 h=g(WTx+b)h = g(W^Tx + b)

当初始化仿射变换的参数时,可以将 bb 的所有元素设置成一个小的正值,例如 0.10.1。 这使得整流线性单元很可能初始时就对训练集中的大多数输入呈现激活状态,并且允许导数通过。

流线性单元的一个缺陷是它们不能通过基于梯度的方法学习那些使它们激活 为零的样本。整流线性单元的各种扩展保证了它们能在各个位置都接收到梯度
整流线性单元的三个扩展基于当 zi<0z_i < 0 时使用一个非零的斜率 αiα_i:

hi=g(z,α)i=max(0,zi)+αimin(0,zi)h_i = g(z, \alpha)_i = max(0,z_i) + \alpha_i min(0, z_i)

  • 绝对值整流(absolute value rectification)

固 定 αi=1α_i = −1 来得到 g(z)=zg(z) = |z|。它用于图像中的对象识别 (Jarrett et al., 2009a),其中 寻找在输入照明极性反转下不变的特征是有意义的。整流线性单元的其他扩展比这 应用地更广泛。

  • 渗漏整流线性单元(Leaky ReLU)

渗漏整流线性单元(Leaky ReLU)(Maas et al., 2013) 将 αiα_i 固定成 一个类似 0.010.01 的小值

  • 参数化整流线性单元(parametric ReLU)

参数化整流线性单元(parametric ReLU)或者 PReLU 将 αiα_i 作为学习的参数 (He et al., 2015)。

maxout 单元(maxout unit)(Goodfellow et al., 2013a) 进一步扩展了整流线性单元。maxout 单元将 zz 划分为每组具有 kk 个值的组,而不是使用作用于每个元素的函数 g(z)g(z)。每个maxout 单元则输出每组中的最大元素:

g(z)i=maxjG(i)zjg(z)_i = \max_{j\in G^{(i)}} z_j

这里G(i)G^{(i)} 是组ii的输入索引集{(i1)k+1,...,ik}\{(i−1)k+1,...,ik\}。这提供了一种方法来学习对输 入 xx 空间中多个方向响应的分段线性函数。

maxout 单元可以学习具有多达 kk 段的分段线性的凸函数。maxout 单元因此可以视为学习激活函数本身而不仅仅是单元之间的关系。使用足够大的 kk,maxout 单元可以以任意的精确度来近似任何凸函数。特别地,具有两块的 maxout 层可以学习实现和传统层相同的输入 xx 的函数,这些传统层可以使用整流线性激活函数、绝 对值整流、渗漏整流线性单元或参数化整流线性单元,或者可以学习实现与这些都不同的函数。maxout 层的参数化当然也将与这些层不同,所以即使是 maxout 学习去实现和其他种类的层相同的 xx 的函数这种情况下,学习的机理也是不一样的。

每个 maxout 单元现在由 kk 个权重向量来参数化,而不仅仅是一个,所以 maxout 单元通常比整流线性单元需要更多的正则化。如果训练集很大并且每个单元的块数 保持很低的话,它们可以在没有正则化的情况下工作得不错 (Cai et al., 2013)。

maxout 单元还有一些其他的优点。在某些情况下,要求更少的参数可以获得一 些统计和计算上的优点。具体来说,如果由 n 个不同的线性过滤器描述的特征可以在不损失信息的情况下,用每一组 kk 个特征的最大值来概括的话,那么下一层可以获得 kk 倍更少的权重数。

logistic sigmoid与双曲正切函数

在引入整流线性单元之前,大多数神经网络使用 logistic sigmoid 激活函数 g(z)=σ(z)g(z) = \sigma(z) 或者是双曲正切激活函数 g(z)=tanh(z)g(z) = tanh(z)。这些激活函数紧密相关,因为 tanh(z)=2σ(2z)1tanh(z) = 2\sigma(2z) − 1

与分段线性单元不同,sigmoid 单元在其大部分定义域内都饱和——当 z 取绝对值 很大的正值时,它们饱和到一个高值,当 z 取绝对值很大的负值时,它们饱和到一 个低值,并且仅仅当 z 接近 0 时它们才对输入强烈敏感。sigmoid 单元的广泛饱和 性会使得基于梯度的学习变得非常困难。因为这个原因,现在不鼓励将它们用作前 馈网络中的隐藏单元。当使用一个合适的代价函数来抵消 sigmoid 的饱和性时,它 们作为输出单元可以与基于梯度的学习相兼容。

当必须要使用 sigmoid 激活函数时,双曲正切激活函数通常要比 logistic sigmoid 函数表现更好。

sigmoid 激活函数在除了前馈网络以外的情景中更为常见。循环网络、许多概率 模型以及一些自编码器有一些额外的要求使得它们不能使用分段线性激活函数,并且使得 sigmoid 单元更具有吸引力,尽管它存在饱和性的问题。

架构设计

线性模型,通过矩阵乘法将特征映射到输出,顾名思义,仅能表示线性函数。它具有易于训练的优点,因为当使用线性模型时,许多损失函数会导出凸优化问题。可惜的是,我们经常希望我们的系统学习非线性函数。

具有隐藏层的前馈网络提供了一种万能近似框架。 具体来说, 万能近似定理(universal approximation theorem)(Hornik et al., 1989; Cybenko, 1989) 表明,一个前馈神经网络如果具有线性输出层和至少一层具有任何一种 ‘‘挤压’’ 性质的激活函数(例如logistic sigmoid激活函数)的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另 一个有限维空间的 Borel 可测函数。前馈网络的导数也可以任意好地来近似函数的 导数 (Hornik et al., 1990)。

Montufar et al. (2014) 的主要定理指出,具有 dd 个输入、深度为 ll、每个隐藏层具有 nn 个单元的深度整流网络可以描述的线性区域的数量是

O((nd)d(l1)nd)O\bigg(\dbinom{n}{d}^{d(l-1)}n^d\bigg)

意味着,这是深度 ll 的指数级。在每个单元具有 kk 个过滤器的 maxout 网络中,线性区域的数量是

O(k(l1)+d)O\big(k^{(l-1) + d}\big)

反向传播和其他的微分算法

当我们使用前馈神经网络接收输入 xx 并产生输出 y^\hat y 时,信息通过网络向前流动。输入 xx 提供初始信息,然后传播到每一层的隐藏单元,最终产生输出 y^\hat y。这称 之为 前向传播(forward propagation)。在训练过程中,前向传播可以持续向前直到它产生一个标量代价函数 J(θ)J(θ)。反向传播(back propagation)算法经常简称为backprop,允许来自代价函数的信息通过网络向后流动,以便计算梯度。

反向传播这个术语经常被误解为用于多层神经网络的整个学习算法。实际上, 反向传播仅指用于计算梯度的方法,而另一种算法,例如随机梯度下降,使用该梯度来进行学习。

计算图 computational graph
  • 我们使用图中的每一个节点来表示一个变量。

变量可以是标量、向量、矩 阵、张量、或者甚至是另一类型的变量。

  • 为了形式化我们的图形,还需引入**操作(operation)**这一概念。

操作是指 一个或多个变量的简单函数。我们的图形语言伴随着一组被允许的操作。我们可以通过将多个操作复合在一起来描述更为复杂的函数。

微积分中的链式法则

微积分中的链式法则用于计算复合函数 的导数。反向传播是一种计算链式法则的算法,使用高效的特定运算顺序。
假设 xRm,yRnx ∈ R^m, y ∈ R^ngg 是从 RmR^mRnR^n 的 映射,ff 是从RnR^nRR的映射。如果y=g(x)y=g(x)并且z=f(y)z=f(y),那么

zxi=jzyjyjxi\frac{\partial z}{\partial x_i} = \sum_j\frac{\partial z}{\partial y_j}\frac{\partial y_j}{\partial x_i}

使用向量记法,可以等价地写成

xz=(yx)Tyz\nabla_x z = \bigg(\frac{\partial y}{\partial x}\bigg)^T \nabla_y z

这里 y/x∂y/∂xggn×mn×m的Jacobian矩阵。显然,变量xx的梯度可以通过Jacobian矩阵y/x∂y/∂x和梯度yz\nabla_y z相乘得到。反向传播算法由图中每一个这样的 Jacobian 梯度的乘积操作所组成。

深度学习中的正则化

机器学习中的一个核心问题是设计不仅在训练数据上表现好,并且能在新输入上泛化好的算法。在机器学习中,许多策略显式地被设计来减少测试误差(可能会以增大训练误差为代价)。这些策略被统称为正则化。

参数范数惩罚

许多正则化方法通过对目标函数 JJ 添加一个参数范数惩罚 Ω(θ)Ω(θ),限制模型的学习能力。我们将正则化后的目标函数记为J~\tilde J

J~(θ;X,y)=J(θ;X,y)+αΩ(θ)\tilde J(\theta; X, y) = J(\theta;X,y) + \alpha\Omega(\theta)

其中 α[0,)α ∈ [0,\infty) 是权衡范数惩罚项 ΩΩ 和标准目标函数 J(X;θ)J(X;θ) 相对贡献的超参数。 将 αα 设为 0 表示没有正则化。αα 越大,对应正则化惩罚越大。

特别说明:在神经网络中,参数包括每一层仿射变换的权重和偏置,我们通常只对权重做惩罚而不对偏置做正则惩罚。 精确拟合偏置所需的数据通常比拟合权重少得多。每个权重会指定两个变量如何相 互作用。我们需要在各种条件下观察这两个变量才能良好地拟合权重。而每个偏置仅 控制一个单变量。这意味着,我们不对其进行正则化也不会导致太大的方差。另外, 正则化偏置参数可能会导致明显的欠拟合。因此,我们使用向量 w 表示所有应受范 数惩罚影响的权重,而向量 θθ 表示所有参数 (包括 ww 和无需正则化的参数)

在神经网络的情况下,有时希望对网络的每一层使用单独的惩罚,并分配不同 的 αα 系数。寻找合适的多个超参数的代价很大,因此为了减少搜索空间,我们会在所有层使用相同的权重衰减

L2 参数正则化

最简单而又最常见的参数范数惩罚,即通常被称为权重衰减(weight decay)的 L2 参数范数惩罚。这个正则化策略通过向目标函数添加一个正则项 Ω(θ)=12w22Ω(θ) = \frac{1}{2}∥w∥^2_2 ,使权重更加接近原点。在其他学术圈,L2 也被称为岭回归或 Tikhonov 正则。

我们可以通过研究正则化后目标函数的梯度,洞察一些权重衰减的正则化表现。 为了简单起见,我们假定其中没有偏置参数,因此 θθ 就是 ω\omega。这样一个模型具有以 下总的目标函数:

J~(ω;X,y)=α2ωTω+J(ω;X,y)\tilde J(\omega; X, y) = \frac{\alpha}{2}\omega^T\omega + J(\omega; X, y)

ωJ~(ω;X,y)=αω+ωJ(ω;X,y)\to \nabla_\omega \tilde J(\omega;X,y) = \alpha \omega + \nabla_\omega J(\omega; X,y)

使用单步梯度下降更新权重,即执行以下更新

ω=ωϵ(αω+wJ(ω;X,y))=(1ϵα)ωϵωJ(ω;X,y)\begin{aligned}\to \omega &= \omega - \epsilon (\alpha \omega + \nabla_w J(\omega;X,y))\\ &= (1-\epsilon\alpha)\omega - \epsilon\nabla_\omega J(\omega;X,y)\end{aligned}

ω\omega^∗ 为未正则化的目标函数取得最小训练误差时的权重向量,即 ω=argminωJ(ω)\omega^∗ = \arg\min_\omega J (\omega),并在 ω\omega^∗ 的邻域对目标函数做二次近似

J^(θ)=J(ω)+12(ωω)TH(ωω)\hat J(\theta) = J(\omega^*) + \frac{1}{2}(\omega - \omega^*)^TH(\omega - \omega^*)

HHJJω\omega^∗ 处关于 ω\omega的 Hessian 矩阵。因为 ω\omega^∗ 被定义为最优,即梯度消失为 0,所以该二次近似中没有一阶项。同样地,因为 ω\omega^∗JJ 的一个最优点, 我们可以得出 HH 是半正定的结论。
J^\hat J取得最小时,其梯度为0

ωJ^(ω)=H(ωω)=0\nabla_\omega\hat J(\omega) = H(\omega - \omega^*) = 0

为了研究权重衰减带来的影响,我们在上式中添加权重衰减的梯度。现在我们探讨最小化正则化后的 J^\hat J。我们使用变量 ω~\tilde\omega 表示此时的最优点:

αω~+H(ω~ω)=0(H+αI)ω~=Hωω~=(H+αI)1Hω\begin{aligned}\alpha\tilde\omega + H(\tilde\omega - \omega^*) &= 0 \\ (H + \alpha I)\tilde\omega &= H\omega^*\\ \tilde\omega &= (H + \alpha I)^{-1}H\omega^* \end{aligned}

αα 趋向于 0 时,正则化的解 ω~\tilde\omega 会趋向 ω\omega^∗。那么当 α 增加时会发生什么呢? 因为 H 是实对称的,所以我们可以将其分解为一个对角矩阵 ΛΛ 和一组特征向量的标准正交基 Q,并且有 H=QΛQtH = QΛQ^t

ω~=(QΛQT+αI)1QΛQTω=[Q(Λ+αI)Q]1QΛQω=Q(Λ+αI)1ΛQTω\begin{aligned}\tilde\omega &= (QΛQ^T + \alpha I)^{-1}QΛQ^T\omega^*\\&= [Q(Λ + αI)Q^⊤]^{−1}QΛQ⊤\omega^∗\\&=Q(Λ+\alpha I)^{-1}ΛQ^T\omega^*\end{aligned}

我们可以看到权重衰减的效果是沿着由 H 的特征向量所定义的轴缩放 ω\omega^∗。具体来说,我们会根据 λiλi+α\frac{\lambda_i}{\lambda_i + \alpha} 因子缩放与 H 第 ii 个特征向量对齐的 ω\omega^∗ 的分量

沿着 HH 特征值较大的方向 (如 λiαλ_i\gg α)正则化的影响较小。而 λiαλ_i \ll α 的分量将会收缩到几乎为零。

L2正则化能让学习算法 ‘‘感知’’ 到具有较高方差的输入 xx,因此与输出目标的协方差较小(相对增加方差)的特征的权重将会收缩

L1 参数正则化

L2 权重衰减是权重衰减最常见的形式,我们还可以使用其他的方法限制模型参数的规模。一个选择是使用 L1正则化。对模型参数 ω\omega 的 L1正则化被定义为

Ω(θ)=ω1=iωi\displaystyle \Omega(\theta) = ||\omega||_1 = \sum_i|\omega_i|

即各个参数的绝对值之和。

相比 L2正则化,L1正则化会产生更稀疏(sparse)的解。此处稀疏性指的是最优值中的一些参数为 0。和 L2正则化相比,L1正则化的稀疏性具有本质的不同。

由 L1正则化导出的稀疏性质已经被广泛地用于特征选择(feature selection)机制。特征选择从可用的特征子集选择出有意义的特征,化简机器学习问题。著名的 LASSO (Tibshirani, 1995)(Least Absolute Shrinkage and Selection Operator)模型将 L1 惩罚和线性模型结合,并使用最小二乘代价函数。L1 惩罚使部分子集的权重为零,表明相应的特征可以被安全地忽略。

数据集增强
噪声鲁棒性

将噪声作用于输入,作为数据集增强策略。对于某些模型而言, 向输入添加方差极小的噪声等价于对权重施加范数惩罚 (Bishop, 1995a,b)。在一般情 况下,注入噪声远比简单地收缩参数强大,特别是噪声被添加到隐藏单元时会更加强大。向隐藏单元添加噪声是值得单独讨论重要的话题; Dropout 算法是这种做法的主要发展方向。

另一种正则化模型的噪声使用方式是将其加到权重。这项技术主要用于循环神经网络 (Jim et al., 1996; Graves, 2011)。这可以被解释为关于权重的贝叶斯推断的随机实现。贝叶斯学习过程将权重视为不确定的,并且可以通过概率分布表示这种不确定性。向权重添加噪声是反映这种不确定性的一种实用的随机方法。

提前终止

当训练有足够的表示能力甚至会过拟合的大模型时,我们经常观察到,训练误差会随着时间的推移逐渐降低但验证集的误差会再次上升。这意味着我们只要返回使验证集误差最低的参数设置,就可以获得验证集误差更低的模型。

在每次验证集误差有所改善后,我们存储模型参数的副本。当训练算法终止时,我们返回这些参数而不是最新的参数。当验证集上的误差在事先指定的循环次数内没有进一步改善时,算法就会终止。

这种策略被称为提前终止(early stopping)。这可能是深度学习中最常用的正则化形式。它的流行主要是因为有效性和简单性。

参数绑定和参数共享

参数范数惩罚是正则化参数使其彼此接近的一种方式,而更流行的方法是使用约束:强迫某些参数相等。由于我们将各种模型或模型组件解释为共享唯一的一组参数,这种正则化方法通常被称为 参数共享(parameter sharing)。和正则化参数使其接近(通过范数惩罚)相比,参数共享的一个显著优点是,只有参数(唯一一个集 合)的子集需要被存储在内存中。对于某些特定模型,如卷积神经网络,这可能可以显著减少模型所占用的内存。

稀疏表示

前文所述的权重衰减直接惩罚模型参数。另一种策略是惩罚神经网络中的激活单元,稀疏化激活单元。这种策略间接地对模型参数施加了复杂惩罚。

Dropout

Dropout (Srivastava et al., 2014) 提供了正则化一大类模型的方法,计算方便但功能强大。

对抗训练

深度模型中的优化

神经网络优化中的挑战

优化通常是一个极其困难的任务。传统的机器学习会小心设计目标函数和约束,以确保优化问题是凸的,从而避免一般优化问题的复杂度。

病态

在优化凸函数时,会遇到一些挑战。这其中最突出的是Hessian矩阵 HH 的病态。这是数值优化、凸优化或其他形式的优化中普遍存在的问题。

病态问题一般被认为存在于神经网络训练过程中。病态体现在随机梯度下降会 ‘‘卡’’ 在某些情况,此时即使很小的更新步长也会增加代价函数。

局部极小值

凸优化问题的一个突出特点是其可以简化为寻找一个局部极小点的问题。任何一个局部极小点都是全局最小点。有些凸函数的底部是一个平坦的区域,而不是单一的全局最小点,但该平坦区域中的任意点都是一个可以接受的解。优化一个凸问题时,若发现了任何形式的临界点,我们都会知道已经找到了一个不错的可行解。

卷积网路

卷积神经网络(convolutional neural network, CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。

通常来说,卷积神经网络中用到的卷积运算和其他领域(例如工程领域以及纯数学领域)中的定义并不完全一致。

卷积运算通常用星号表示

s(t)=(xω)(t)s(t) = (x * \omega)(t)

在卷积网络的术语中,卷积的第一个参数(函数 xx)通常叫做输入(input),第二个参数(函数 ω\omega)叫做核函数(kernel function)。输出有时被称作特征映射(feature map)。

在机器学习的应用中,输入通常是多维数组的数据,而核通常是由学习算法优化得到的多维数组的参数。我们把这些多维数组叫做张量。因为在输入与核中的每一个元素都必须明确地分开存储,我们通常假设在存储了数值的有限点集以外,这些函数的值都为零。这意味着在实际操作中,我们可以通过对有限个数组元素的求和来实现无限求和。

我们经常一次在多个维度上进行卷积运算。如把一张二维的图像 II 作为输入,我们也许也想要使用一个二维的核 KK:

S(i,j)=(IK)(i,j)=mnI(m,n)K(im,jn)S(i,j) = (I * K)(i,j) = \sum_m\sum_nI(m,n)K(i -m , j - n)

卷积是可交换的 (commutative),我们可以等价地写作:

S(i,j)=(KI)(i,j)=mnI(im,jn)K(m,n)S(i,j) = (K * I)(i,j) = \sum_m\sum_nI(i - m, j - n)K(m , n)

互相关函数(cross-correlation),和卷积运算几乎一样但是并没有对核进行翻转:

S(i,j)=(IK)(i,j)=mnI(i+m,j+n)K(m,n)S(i,j) = (I * K)(i,j) = \sum_m\sum_nI(i + m, j + n)K(m , n)

许多机器学习的库实现的是互相关函数但是称之为卷积。

卷积运算通过三个重要的思想来帮助改进机器学习系统:

  • 稀疏交互(sparse interactions)(也叫做稀疏连接(sparse connectivity)或者稀疏权重(sparse weights))
  • 参数共享(parameter sharing)
  • 等变表示(equivariant representations)。

对于卷积,参数共享的特殊形式使得神经网络层具有对平移等变(equivariance) 的性质。如果一个函数满足输入改变,输出也以同样的方式改变这一性质,我们就说它是等变 (equivariant) 的。

特别地,如果函数 f(x)f(x)g(x)g(x) 满足 f(g(x))f(g(x)) = g(f(x))g(f(x)), 我们就说 f(x)f(x) 对于变换 gg 具有等变性。

另外,卷积提供了一种处理大小可变的输入的方法。

池化

卷积网络中一个典型层包含三级。

  1. 在第一级中,这一层并行地计算多个卷积产生一组线性激活响应。
  2. 在第二级中,每一个线性激活响应将会通过一个非线性的激活函数,例如整流线性激活函数。
    这一级有时也被称为探测级(detector stage)。
  3. 在第三级中,我们使用池化函数(pooling function)来进一步调整这一层的输出

池化函数使用某一位置的相邻输出的总体统计特征来代替网络在该位置的输出。 例如, 最大池化(max pooling)函数 (Zhou and Chellappa, 1988) 给出相邻矩形区域内的最大值。其他常用的池化函数包括相邻矩形区域内的平均值、L2 范数以及基于据中心像素距离的加权平均函数。

使用池化可以看作是增加了一个无限强的先验:这一层学得的函数必须具有对少量平移的不变性。当这个假设成立时,池化可以极大地提高网络的统计效率。

结构化输出

序列建模:循环和递归网络

循环神经网络(recurrent neural network)或 RNN (Rumelhart et al., 1986c) 是一类用于处理序列数据的神经网络

实践方法论

在实践中,正确使用一个普通算法通常比草率地使用一个不清楚的算法效果更好。正确应用一个算法需要掌握一些相当简单的方法论。
我们建议参考以下几个实践设计流程:

  • 确定目标

使用什么样的误差度量,并为此误差度量指定目标值。这些目标和误差度量取决于该应用旨在解决的问题。

  • 尽快建立一个端到端的工作流程,包括估计合适的性能度量。
  • 搭建系统,并确定性能瓶颈。
  • 根据具体观察反复地进行增量式的改动,如收集新数据、调整超参数或改进算法。

@(性能度量)[精度precision|召回率recall|覆盖coverage]

精度是模型报告的检测是正确的比率。
召回率则是真实事件被检测到的比率。
覆盖是机器学习系统能够产生响应的样本所占的比率。

@(默认的基准模型)

确定性能度量和目标后,任何实际应用的下一步是尽快建立一个合理的端到端的系统。

  1. 首先,根据数据的结构选择一类合适的模型。
  2. 选择优化算法,具有衰减学习率以及动量的 SGD 是一个合理的选择。
  3. 添加正则化约束

除非训练集包含数千万以及更多的样本,否则项目应该在一开始就包含一些 温和的正则化。提前终止也被普遍采用。Dropout 也是一个很容易实现,且兼容很 多模型和训练算法的出色正则化项。批标准化有时也能降低泛化误差,此时可以省 略 Dropout 步骤,因为用于标准化变量的统计量估计本身就存在噪声。

深度学习研究

自编码器

自编码器(autoencoder)是神经网络的一种,经过训练后能尝试将输入复制到输出。 自编码器(autoencoder)内部有一个隐藏层 hh,可以产生编码(code)表示输入。

该网络可以看作由两部分组成:一个由函数 h=f(x)h = f(x) 表示的编码器和一个生成重构的解码器 r=g(h)r = g(h)

@(欠完备自编码器)

从自编码器获得有用特征的一种方法是限制 hh 的维度比 xx 小,这种编码维度小于输入维度的自编码器称为欠完备(undercomplete)自编码器。学习欠完备的表示将强制自编码器捕捉训练数据中最显著的特征。学习过程可以简单地描述为最小化一个损失函数

L(x,g(f(x)))L(x, g(f (x)))

其中 L 是一个损失函数,惩罚 g(f(x))g(f(x))xx 的差异,如均方误差。

当解码器是线性的且 L 是均方误差,欠完备的自编码器会学习出与 PCA 相同 的生成子空间。这种情况下,自编码器在训练来执行复制任务的同时学到了训练数 据的主元子空间。

蒙特卡罗方法

当无法精确计算和或积分时,通常可以使用蒙特卡罗采样来近似它。这种想法把"和"或者"积分"视作某分布下的 期望,然后通过估计对应的平均值来近似这个期望。令

s=xp(x)f(x)=Ep[f(x)]s = \sum_xp(x)f(x) = E_p[f(\mathbb x)]

或者

s=p(x)f(x)dx=Ep[f(x)]s = \int p(x)f(x)dx = E_p[f(\mathbb x)]

为我们所需要估计的和或者积分,写成期望的形式,pp是一个关于随机变量x\mathbb x的概率分布或者概率密度函数。
我们可以通过从 pp 中抽取 nn 个样本 x(1),...,x(n)x^{(1)}, . . . , x^{(n)} 来近似 ss 并得到一个经验平均值

s^n=1ni=1nf(x(i))\hat s_n = \frac{1}{n}\sum_{i=1}^nf(x^{(i)})

首先很容易观察到 s^\hat s 这个估计是无偏的,由于

E[s^n]=1ni=1nE[f(x(i))]=1ni=1ns=sE[\hat s_n] = \frac{1}{n}\sum_{i=1}^nE[f(x^{(i)})] = \frac{1}{n}\sum_{i=1}^ns = s

马尔可夫链蒙特卡罗方法

许多实例中,我们希望采用蒙特卡罗方法,然而往往又不存在一种简单的方法可以直接从目标分布 pmodel(x)p_{model}(\mathbb x) 中精确采样或者一个好的(方差较小的)重要采样分布 q(x)q(x)。在深度学习中,当分布 pmodel(x)p_{model}(\mathbb x)表示成无向模型时,这种情况往往会发生。 在这种情况下,为了从分布 pmodel(x)p_{model}(\mathbb x) 中近似采样,我们引入了一种称为 马尔可夫链(Markov Chain)的数学工具。

深度生成模型