前言

发现虽然玩了一次卷积神经网络,但还没有写文章分析下它在干什么。

and今天瞅了眼自编码器和深度生成模型,生成宝可梦感觉真好玩啊(x

视频链接:李宏毅机器学习中文课程 - 网易云课堂 (163.com)

一、卷积神经网络

1. 应用场景

  1. 在图片处理中,我们想要捕捉的特征远比整张图片的尺寸要小,无需对所有像素作线性组合
  2. 我们想要捕捉的特征可以在图片的不同位置出现,因此一些hidden layer的参数会相等导致冗余
  3. 降低图片的分辨率几乎不会影响判断结果,可以降低数据维度加快计算

我们将以上三点更加抽象地描述为:

1. 特定信息只存在于完整数据中的一部分
2. 特定信息在完整数据中多次出现
3. 降采样对结果不会有影响

2. 解决方案

  1. 卷积层
    利用卷积核抽取我们需要的特定信息,卷积核只作用于输入数据中的一定区域(解决了问题1),并以一定步长在输入数据上移动(解决了问题2)。
  1. 池化层
    用某个数值代表特定区域的数值,成倍地降低数据地空间大小(解决了问题3

3. 更多示例

当一个问题满足上述的三个条件时,就可以利用卷积神经网络来train一个合适的模型。

实际上,卷积和池化不一定要同时出现。

比如,在下五子棋时,判断当前棋局的问题满足问题1和问题2,但是不满足问题3

由2可知,卷积层解决的是问题1和问题2,池化层解决的是问题3。

因此,我们只需要使用卷积来处理五子棋的问题。

二、自编码器

1. 何为自编码器

在使用PCA时,我们得到一个矩阵$M$将原始的高维数据$x$转换为低维数据$z$,同时可以利用$M^T$对低维数据$z$作逆变换得到$\widehat{x}$。但是在高维向低维投影的过程中出现了损失,所以逆变换得到的$\widehat{x}$与原来的$x$存在不小的偏差

PCA原理参考:机器学习笔记——机器学习系统设计、支持向量机(SVM)、K-Means算法、主成分分析法(PCA) - 掘金 (juejin.cn)

在神经网络中,一个hidden layer的参数就是一个矩阵,所以我们可以将上述过程描述为:

我们将前面的过程称作编码(Encode),后面的过程称作(解码),中间输出的编码后的低维数据称作code

我们现在希望编码和解码的过程,能够尽可能地减小损失,最大程度地还原数据

不妨分别将编码和解码过程抽象为神经网络,然后在训练的过程最小化$x$ 和 $ \widehat{x} $之间的偏差:

于是我们就利用了没有任何标签的数据,训练了一个能自动解码和编码的神经网络,而且解码和编码模块都能单独拎出来用,这就是自编码器

2. 自编码器的神奇之处

2.1 CNN与自编码器

在卷积神经网络中,我们可以将卷积和池化操作也看作是编码过程,本质是提取低维的特定信息。

对应地,将解码过程称作反卷积和反池化:

  1. 反卷积的操作与卷积一致
  2. 反池化将数据扩大时,多出来的空间可以置零,或取相同的值

2.2 预训练(Pre-training)

在神经网络层次比较深时,需要拟合大量的参数。

我们可以将每个Hidden Layer(注意:不包括输出层)视作一个编码器,先利用大量的无标签数据依次对每个Hidden Layer的参数作初始化,这个过程叫预训练(Pre-training)。

最后在随机初始化输出层的参数,再利用少量标签数据训练模型。在这里,大部分的参数已经被预训练确定了七七八八,所以训练阶段只是在做微调(fine-tuning)

2.3 生成新数据

特别有趣的是,我们可以自己设定一些code,丢进解码器中,这样就得到许多新数据。

将真的原始数据生成的code作Normalization,然后划定真code比较密集的一个范围作为我们的假code,可以使我们选择的code更有意义。