github.io 有点慢,font-awesome 有点大,
客官麻烦搬条板凳坐一下下,我马上就到!

自编码器、PCA和白化

全文转自 immcrr的博客

自编码器 Autoencoder

自编码器就是一个全连接网络,就简单的三层,一个输入一个输出一个隐藏层。也可以把自编码器级联,形成多层的结构。自编码器的目的就是训练一个恒等映射,输入进去什么,就期望输出什么。简单的恒等映射没有意义,有意义的在于它的隐藏层神经元的个数往往和输入层不同。如果少于输入个数,这就相当于一个特征提取和重构的过程(降维);如果隐藏层个数大于输入层个数,此时如果还能再加上稀疏性约束,则就相当于稀疏编码。

如果是前者,Loss直接是输入和输出的的差,比如平方误差之类。

如果是后者,得加上稀疏性约束(稀疏性即提取出来的特征中,大量系数为零,非零系数尽量少)。为约束稀疏性,手段可以如下(来自UFLDL教程)。先定义隐藏层第 $j$ 单元的平均激活(在训练集上取平均)如下,其中$x^i$是训练集第$i$个样本,一共有$m$个样本。

再引入一个接近于零的所谓的稀疏性参数$ρ$,约束为$\hat{ρ}_j$接近$ρ$。从而此时Loss可以定义为

右边第一项代表重构误差,第二项代表稀疏惩罚。$KL(⋅)$是相对熵,$\hat{ρ}_j$ 离$ρ$越远则这个惩罚项越大;参数$β$用于权衡。

稀疏编码 Sparse Coding

上面的自编码器,隐层单元数量大于输入层时,如果再有稀疏性的约束,则相当于稀疏编码。但是因为激活函数的非线性等等问题,总的来说,它不是线性的变换。而一般说的稀疏编码、稀疏表示,大多数都是线性变换。就线性变换而言,稀疏编码是在寻找超完备的一组基$\{ϕi\},i=1,2,⋯,k$,使得输入向量表示成基的线性组合(这里不要求基的正交性)。

这里$a_i$是稀疏表示稀疏,而非激活函数值。因为这组基是超完备的,所以基的个数大于输入信号的维数,$k>n$。训练集样本容量设为$m$则问题表达为

其中$S(⋅)$是一个函数,负责惩罚明显大于零的系数,从而保证稀疏性,$λ$负责权衡。上面的形式有一个漏洞,即为了减小在新基上的分量(从而迎合稀疏惩罚),我可以把基变大,把其上的分量$a$减小,不改变最终结果而又使得上面目标函数变小。为了弥补,再加入约束来控制基,不让它太大,例如约束为$||ϕi||<Ci$.

PCA 主成分分析

PCA具体推导就不写了,也不说方差最大化,或者拉格朗日法求驻点的步骤。只简单总结一下,如果从协方差矩阵对角化的角度来看,事情会怎么样。

$n$维随机变量$x$每个元素的均值设为零。则其协方差矩阵的第$(i,j)$元为$Cov(xi,xj)$根据协方差定义,它等于$E(x_ix_j)-E(x_i)E(x_j)=E(x_ix_j)$,所以$m$个矩阵的平均$\frac{1}{m}\sum^\limits{i}\boldsymbol{x}^{(i)}\boldsymbol{x}^{(i)T}$正好是协方差矩阵的无偏估计。根据协方差矩阵的意义,如果其第$(i,j)$元素为零,则说明$x_i$和$x_j$不相关。PCA就是要让协方差矩阵的非对角元全部为零(对角元没法搞成零,那是方差),从而使得信号$\boldsymbol{x}$的任意两个维度都不相关,并在此基础上进行维度压缩。

要对角化一个矩阵,标准手段是求特征值和特征向量,然后在其特征空间中,这个矩阵就自动对角化了。PCA这里也一样,求协方差矩阵的特征分解,然后把特征向量作为新的一组基,把原来的信号空间变换到协方差矩阵的特征空间中,这时协方差矩阵是对角化的形式。

然后开始降维,利用一个结论:协方差矩阵的越大的特征值对应的特征向量指向的方向是数据弥散越厉害的方向。降维就是要剔除几个基,找到一个子空间,在这个子空间中数据尽可能地保留。所以如果要尽量保留原数据分布地降维,则优先丢弃特征值小的特征向量。剔除以后,得到子空间,降维的操作就是把原数据往这个子空间中投影。

PCA白化

PCA白化目的就是得到对角的协方差矩阵后,进一步使其变成单位矩阵。注意到对角的协方差矩阵的对角元就是特征值的排列,所以要使其变成单位矩阵,只要每个对角元$λi$除以他自己(特征值)就可以了,但是一个矩阵的特征值是确定的,不能变,所以直接改变投影后的信号$\boldsymbol{x}$的每个分量,每个分量$xi$乘以$\frac{1}{\sqrt{\lambda_i}}$即可。

在UFLDL的教程中,使用了二维数据为例,形象一点,可以把二维数据弥散最大的方向与其正交方向视为一个椭圆的长轴方向与短轴方向。无降维的PCA相当于把这个斜着的椭圆旋转摆正。而PCA白化则相当于把这个椭圆两个轴进行缩放,使其变成圆。



————  EOF  ————