自编码器(autoencoder)是神经网络的一种,经过训练后能够尝试将输入复制到输出。自编码器包括两部分:①编码器②解码器。

设给定训练数据集X={X1,X2,X3...},其中

表示训练数据的第i个样本,设训练集X的维度为d,则自编码器的编码过程与解码过程可以描述为:编码过程:

;解码过程:

;如果一个自编码器只是简单的学会

,则该自编码器没有实际用途。因此,自编码器的学习不应该是简单的让输入与输出相等,为了实现这一目标,应该在自编码器中添加一些约束,使自编码器只能近似的复制输入数据。加入的约束条件强制的让自编码器考虑输入数据的部分需要被优先复制,因此可以利用自编码器学习输入数据的有用特征,这一点可被用来进行降维或者特征学习。

自编码器可以看做是前馈神经网络的一种特例,通常使用小批量梯度下降法进行训练。不同于一般的前馈网络,自编码器也可以使用再循环训练,但是再循环算法很少用于机器学习应用。 

自编码器网络权重如何更新 自编码器的_编码器

图1.自编码器的一般结构

图1中x表示输入数据,f表示编码阶段,h表示对输入数据x编码后的值,g表示解码阶段,r表示对h进行解码后的值。

自编码器有许多类型,按学习范式,可将自编码器分为收缩自编码器、变分自编码器、正则自编码器。按编码维度与输入数据维度大小关系,可将自编码器分为欠完备自编码器、过完备自编码器、等维自编码器。若输入层神经元数量小于隐藏层神经元数量,则该自编码器为稀疏自编码器,反之则为压缩自编码器。如果输入层神经元数量等于隐藏层神经元数量,则是等维自编码器。

以上为关于自编码器的一般性描述。利用Matlab2017A实现了一个简单的自编码器,代码如下:

function [outputArg1,outputArg2] = ae(inputArg1,inputArg2)
%SAE 此处显示有关此函数的摘要
% 此处显示详细说明
%对实验所用数据集的解释:该代码段使用的B.txt数据是利用的UCI公开数据集当中的
%WDBC数据集中抽取出的B类肿瘤数据,包含357个样例,每个样例包含30个特征
% 装载数据
X=load('B.txt');
% matlab神经网络的读取是按列读取,即一列是一个训练样本
y=X';
% 训练一个自编码器
% hiddensize表示隐藏层的维度大小
hiddenSize1 = 25;
autoenc1= trainAutoencoder(y, hiddenSize1, ...
    'L2WeightRegularization', 0.001, ...
    'SparsityRegularization', 4, ...
    'SparsityProportion', 0.05, ...
    'DecoderTransferFunction','purelin');
% 抽取出被第一个自编码器训练过后的隐藏层数据
features1=encode(autoenc1,y);
%给定一个测试样本,查看其经训练完成后的自编码器重构后的值
XReconstructed = predict(autoenc1,y);
%计算重构误差
mseError = mse(y-XReconstructed);
end