深度神经网络
确定神经网络的结构是非常核心也是非常困难的问题。
需要多少神经元?网络多少层?神经元之间如何连接?……这些选择一方面凭主观意愿,另一方面通过验证的方法确定。
浅层(shallow)神经网络只有少量的隐层,深度(deep)神经网络有很多层,它们之间的对比如下:
浅层神经网络 | 深度神经网络 |
---|---|
✅训练较高效 | ❌训练极具挑战性 |
✅结构简单 | ❌结构复杂 |
✅非常强大 | ✅非常强大 |
✅能提取有意义的特征 |
若只有一层,它需要完成的任务就很复杂。层数增多,每层或层与层之间功能简单,如上图所示,只需从输入中提取简单的笔画,若还有下一层,继续从简单笔画中找出更复杂的笔画。层与层之间,实现从简单到复杂的特征转换。若原始特征是raw feature(每个特征物理意义有限,比如图像的每个像素),最终需要完成复杂的分类动作,深度学习处理这样的问题更自然。
一、深度学习的挑战与关键技术
- 决定网络结构很困难。
- 验证能帮忙但并非易事;
- 借助领域知识(domain knowledge),比如用于图像的convolutional NNet,像素物理位置有意义,相邻像素连接到下层同一神经元可描述更高阶的特征,相距太远的像素不连接在一起。
- 模型复杂度很高。
- 数据足够多时模型复杂度不是问题,但计算复杂度会更高;
- 利用正则化(在某些神经元坏掉时,dropout能使网络很好工作;输入出问题时,denoising能使网络很好工作)。
- 最优化很困难。局部极小值比神经网络更容易出现。
- 精心初始化,避免陷入糟糕的局部极小值(利用pre-training)。
- 计算复杂度很高,尤其是面对大数据的时候。
- 利用新的硬件软件架构,比如mini-batch+GPU。
其中,正则化和初始化是尤为关键的两项技术。
####二、深度学习两步走策略
- 预训练:对$\ell=1,\dots,L$,假设$\mathbf w_*^{(1)},\ldots\mathbf w_*^{(\ell-1)}$已知,逐层训练权值$\left\{w_{ij}^{(\ell)}\right\}$。
- 训练:利用BP算法在预训练的基础上调整(fine-tune)权值$\left\{w_{ij}^{(\ell)}\right\}$。
非线性自编码器:神经网络
权值的作用是进行特征转换,将数据换成另一种表现形式,也就是编码(encoding)。在预训练深度神经网络时,并不清楚当前层的权重对以后层有何影响。因此,好的权值需要能保持信息(information-preserving),不同层的权值以不同的形式表示信息。保持信息的意思是数据经过编码之后能重建或精确解码(decode accurately)出原来的信息。预训练权值就是保持信息的编码。
上图的$d-\tilde d-d$结构的神经网络力求输出与输入一致,$g(\mathbf x) = \mathbf x$,这种保持信息的神经网络称为自编码器(autoencoder),它的目的是做函数到它本身的逼近(approximate identity function)。$w_{ij}^{(1)}$称为编码权值,$w_{ji}^{(2)}$称为解码权值。
自编码器的变换$g(\mathbf x) = \mathbf x$采用了数据集上的隐含结构(hidden structure),其价值在于:
- 对于监督学习:$\mathbf x$的隐含结构(权值)很好的保持了信息,可用作特征变换$\Phi(\mathbf x)$。——informative representation of data
- 对于非监督学习:(1)密度估计(density estimation):稠密的区域$g(\mathbf x)\approx\mathbf x$效果好1,新的数据若表现好则位于稠密区域;(2)异常检测(outlier detection):异常点的$g(\mathbf x)\ne\mathbf x$。——typical representation of data
自编码器通过学习identity function得到了数据的表现形式。
基本的自编码器就是$d-\tilde d-d$结构的神经网络,误差函数为 $ \sum_{i=1}^d(g_i(\mathbf x)-x_i)^2。 $ 这是浅层网络,可以容易利用BP算法训练。通常情况$\tilde d<d$,这是数据的压缩表示。数据集是$\{(\mathbf x_1, \mathbf y_1=\mathbf x_1),(\mathbf x_2,\mathbf y_2=\mathbf x_2),\ldots,(\mathbf x_N, \mathbf y_N=\mathbf x_N)\}$,因此这也被视为非监督学习。有时会用约束条件$w_{ij}^{(1)}=w_{ji}^{(2)}$让网络更简单,也就是进行正则化,这也会让算法更复杂。
在深度学习中,采用基本的自编码器在数据集$\left\{\mathbf x_n^{(\ell-1)}\right\}$上训练(其中$\tilde d=d^{(\ell)}$),将自编码器权值$\left\{w_{ij}^{(1)}\right\}$作为深度神经网络预训练的权值$\left\{w_{ij}^{(\ell)}\right\}$。
许多成功的预训练技术,利用不同的网络结构或正则化机制等方法,实现了更精妙的自编码器。
去噪自编码器:正则化
复杂的神经网络模型复杂度高,需要利用正则化避免过拟合。通常采用的正则化技术包括:
- 选择简单的网络结构;
- weight-decay或weight-elimination正则化;
- 尽早停止迭代。
深度学习和自编码器采用了不同的正则化方法。
噪声是导致过拟合的重要原因,数据越少噪声越多时,越容易过拟合。当模型和数据确定时,去噪是避免过拟合的正则化方法。最直接的去噪技术可以采用数据清洗或者数据剪枝。能否反其道而行之,加入噪声?✅
对于鲁棒的自编码器,不仅能对原始数据$\mathbf x$有$g(\mathbf x)\approx \mathbf x$,而且对噪声数据$\tilde{\mathbf x}$有$g(\tilde{\mathbf x})\approx \mathbf x$,这就是去噪自编码器(denoising autoencoder)的任务。在数据集$\{(\tilde{\mathbf x}_1, \mathbf y_1=\mathbf x_1),(\tilde{\mathbf x}_2,\mathbf y_2=\mathbf x_2),\ldots,(\tilde{\mathbf x}_N, \mathbf y_N=\mathbf x_N)\}$训练自编码器,其中$\tilde{\mathbf x}_n$是对${\mathbf x}_n$加入了人工噪声的数据。在图像处理领域,$g(\tilde{\mathbf x})$可以得到$\tilde{\mathbf x}$的去噪版本。
在有噪声的数据集上训练出正则化的$g$具备抗噪的能力,这种正则化方法在神经网络模型中非常实用2。
线性自编码器/主成分分析
神经网络是复杂的非线性自编码器,能否利用简单高效且不易过拟合的线性自编码器呢?✅
对于第$k$个元素的线性模型 \[ h_k(\mathbf x)=\sum_{j=0}^{\tilde d}w_{jk}^{(2)}\left( \sum_{i=0}^{d}w_{ij}^{(1)}x_i \right), \] 加入限制条件:
- 去除掉常数项$x_0$,使$i$和$k$取值范围相同;
- 加入正则化约束$w_{ij}^{(1)}=w_{ji}^{(2)}=w_{ij}$,$\mathbf W=[w_{ij}]$是$d\times\tilde d$的权值矩阵;
- $\tilde d<d$;
可得 \[ h_k(\mathbf x)=\sum_{j=0}^{\tilde d}w_{kj}\left( \sum_{i=1}^{d}w_{ij}x_i \right)。 \]
因此,线性自编码器的假设(hypothesis)可以表示为 \begin{equation} h(\mathbf x)=\mathbf W\mathbf W^\top\mathbf x。 \end{equation} 好的自编码器就是对$\mathbf W$做最优化 \[ \mathbf W=\arg\min_{\mathbf W} E_{in}(\mathbf h)=E_{in}(\mathbf W)= {1\over N}\sum_{n=1}^N\left\lVert\mathbf x_n-\mathbf W\mathbf W^\top\mathbf x_n\right\rVert^2, \] 这是$w_{ij}$的4次多项式,不易得到解析解。
$\mathbf W\mathbf W^\top$是半正定矩阵,进行特征值分解$\mathbf W\mathbf W^\top=\mathbf V\boldsymbol\Gamma\mathbf V^\top$:
- $d\times d$的矩阵$\mathbf V$是正交的(orthogonal)$\mathbf V\mathbf V^\top=\mathbf V^\top\mathbf V=\mathbf I_d$;
- $d\times d$的对角(diagonal)矩阵$\boldsymbol\Gamma$非零对角线元素最多$\tilde d$个。
由此可得$\mathbf W\mathbf W^\top\mathbf x_n=\mathbf V\boldsymbol\Gamma\mathbf V^\top\mathbf x_n$:
- $\mathbf V^\top\mathbf x_n$表示对$\mathbf x_n$的坐标转换,几何上看是一种旋转或镜射(rotate or reflect),$\mathbf x_n$的长度不会改变;
- $\boldsymbol\Gamma(\cdots)$中$\boldsymbol\Gamma$对角线有$d-\tilde d$个0元素,其余的非0元素进行尺度缩放;
- $\mathbf V(\cdots)$表示还原到原始坐标系。
由于$\mathbf x_n=\mathbf V\mathbf I\mathbf V^\top\mathbf x_n$,最优化问题可变为 \[ \min_{\mathbf V}\min_{\boldsymbol\Gamma}{1\over N}\sum_{n=1}^N\left\lVert\mathbf V\mathbf I\mathbf V^\top\mathbf x_n-\mathbf V\boldsymbol\Gamma\mathbf V^\top\mathbf x_n\right\rVert^2, \] 可先对$\boldsymbol\Gamma$最优化再对$\mathbf V$最优化,并且$\mathbf V$不影响向量在变换过程中的长度,可省去$\mathbf V$。最优化的形式可记为$\min_{\boldsymbol\Gamma}\sum\lVert(\mathbf I-\boldsymbol\Gamma)(\cdots)\rVert^2$,这需要$\mathbf I-\boldsymbol\Gamma$的0元素越多越好,也就是$\boldsymbol\Gamma$的对角线1越多越好。由于$\boldsymbol\Gamma$的秩不超过$\tilde d$,$\boldsymbol\Gamma$的对角线最多$\tilde d$个1,$\boldsymbol\Gamma$的最佳形式为 \[ \boldsymbol\Gamma= \left[ \begin{aligned} \mathbf I_{\tilde d}&\quad 0\\ 0&\quad 0 \end{aligned} \right]。 \] 接下来对$\mathbf V$优化 \[ \min_{\mathbf V} \sum_{n=1}^N \left\lVert \left[ \begin{aligned} 0&\quad 0\\ 0&\quad \mathbf I_{d-\tilde d} \end{aligned} \right] \mathbf V^\top\mathbf x_n \right\rVert^2, \] 上式的意思是保留$\mathbf V^\top\mathbf x_n$的$d-\tilde d$个维度实现最小化,这可以通过最大化实现 \[ \max_{\mathbf V} \sum_{n=1}^N \left\lVert \left[ \begin{aligned} \mathbf I_{\tilde d}&\quad 0\\ 0&\quad 0 \end{aligned} \right] \mathbf V^\top\mathbf x_n \right\rVert^2。 \] 当$\tilde d=1$时,只有$\mathbf V^\top$的第一行$\mathbf v^\top$参与优化,也就是 \[ \max_{\mathbf v}\sum_{n=1}^N\mathbf v^\top\mathbf x_n\mathbf x_n^\top\mathbf v\quad\mbox{ s.t. }\mathbf v^\top\mathbf v=1, \] 最佳的$\mathbf v$满足$\sum_{n=1}^N\mathbf x_n\mathbf x_n^\top\mathbf v=\lambda\mathbf v$($\lambda$是拉格朗日乘子)3,此时最佳目标值为$\lambda$,这个最佳的$\mathbf v$是$\mathbf X^\top\mathbf X$的“最大”(topmost)特征向量。一般地,$\{\mathbf v_j\}_{j=1}^{\tilde d}$是$\mathbf X^\top\mathbf X$“最大”的$\tilde d$个特征向量。
最佳的$\{\mathbf w_j\}$就是$\mathbf X^\top\mathbf X$“最大”的特征向量。线性自编码器就是投影到最符合数据$\{\mathbf x_n\}$的正交模式(orthogonal pattern)$\mathbf w_j$。
线性编码器的目标是最大化$\sum(\mbox{maginitude after projection})^2$;主成分分析(PCA,principal component analysis)的目标是最大化$\sum(\mbox{variance after projection})$,变化量$\mbox{variance}$是相对于平均数差距的平方。线性编码器和主成分分析都是线性降维方法,主成分分析=数据0均值化 + 线性自编码器,在降维中应用更普遍。
####线性编码器/主成分分析
- 令$\bar{\mathbf x}={1\over N}\sum_{n=1}^N\mathbf x_n$,$\mathbf x_n\leftarrow\mathbf x_n-\bar{\mathbf x}$4;
- 计算$\mathbf X^\top\mathbf X$的最大$\tilde d$个特征向量$\mathbf w_1,\mathbf w_2,\ldots,\mathbf w_{\tilde d}$;
- 返回转换后的特征$\Phi(\mathbf x)=\mathbf W(\mathbf x-\bar{\mathbf x})$。
参考资料
脚注
-
为啥稠密区域效果好? ↩
-
可视为data hinting的正则化技术。 ↩
-
利用拉格朗日乘子法求导可得。 ↩
-
在0均值数据集基础上进行线性编码,自然实现了投影方向上变化最大。 ↩