Alex_McAvoy

想要成为渔夫的猎手

自编码器 AE

【概述】

自编码器(Auto-Encoder,AE)是一种无监督式深度学习模型,属于前馈神经网络的一种,最开始主要用于数据的降维以及特征的抽取,随着技术的不断发展,现在也被广泛应用于生成模型中,可用来生成图片等

其基于反向传播算法与最优化方法,利用输入数据 $x$ 本身作为监督,来指导神经网络尝试学习一个映射关系,从而得到一个重构输出 $\tilde{x}$​,其可以简单理解为一个试图去还原其原始输入的系统

如下图所示,自编码器由编码器(Encoder)解码器(Decoder)两部分组成,其主要目的是将输入 $x$ 转换为中间变量 $y$,再将中间变量 $y$ 转换成 $\tilde{x}$,最后对比输入 $x$ 和输出 $\tilde{x}$,使其无限接近

【原理】

AE 的构建主要考虑三个部分:

  1. 构建编码器:将高维输入 $X$ 编码成低维隐变量 $\mathbf{h}$,从而强迫神经网络学习最有信息量的特征
  2. 构建解码器:将隐藏层的隐变量 $\mathbf{h}$ 还原到初始维度,得到 $X^R$,最好的状态就是解码器的输出能够完美地或者近似恢复出原来的输入,即 $X^R\approx X$
  3. 设置损失函数:衡量由于压缩而损失掉的信息

编码器和解码器一般是参数化的方程,且关于损失函数可导,通常选用神经网络

如上图所示,从输入层到隐藏层的原始数据 $X$ 的编码过程为:

从隐藏层到输出层的解码过程为:

优化目标即为:

其中,$\text{dist}(\cdot,\cdot)$ 为距离度量函数,通常选用 MSE

直观来看,AE 就是训练了一个神经网络模型,让它的输入是 $X$,然后输出也近似 $X$,好像没有什么作用,但实际上由于输入层的神经元个数 $n$ 大于隐藏层神经元个数 $m$,实际上相当于将数据从 $n$ 维降维到 $m$ 维,然后再用这 $m$ 维的特征向量重构原始数据

这个过程与 PCA 一模一样,只不过 PCA 是通过求解特征向量进行降维,是一种线性的降维方式,而 AE 是强迫神经网络学习最有信息量的特征,是一种非线性的降维方式

此外,隐藏层学习到的特征,可以送入有监督的学习模型中,因此 AE 也能起到特征提取器的作用

【实现】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from torch import nn

class AutoEncoder(nn.Module):
def __init__(self, input_size: int, hidden_size: int) -> None:
super(AutoEncoder, self).__init__()

# 编码器
self.encoder = nn.Sequential(nn.Linear(input_size, hidden_size), nn.ReLU())

# 解码器
self.decoder = nn.Sequential(nn.Linear(hidden_size, input_size), nn.Sigmoid())

def forward(self, x: torch.Tensor) -> torch.Tensor:
x = self.encoder(x)
x = self.decoder(x)
return x
感谢您对我的支持,让我继续努力分享有用的技术与知识点!