自编码器/堆叠式自编码器(SAE)

自编码器( Auto-Encoder,AE)

定义:

通过将输入信息作为学习目标,对输入信息进行表征学习 (representation learning)。(将原始数据转换成为能够被机器学习来有效开发的一种形式)

作用:

使用自编码器是为了得到有效的数据表示, 降维(部分结构)、异常值检测(完整结构)。对于预测模型,去掉解码器,只保留编码器,让编码器 的输出直接作为后续机器学习模型的输入。(分析获取数据的内部结构特性, 更好的实验分析)

训练过程:

在这里插入图片描述
在这里插入图片描述
f,g激励函数(Sigmoid, Relu);W1,W2为权重;b,c为偏置。

最小化重构误差(损失值):

在这里插入图片描述
arg是变元(即自变量argument)的英文缩写。argmin 就是使后面这个式子达到最小值时的变量的取值

判断损失值(误差)是否在规定范围内,来选择是否更新权重、偏置。

特点:

降维:即隐含层的节点个数要小于输入节点的个数。
稀疏:即在隐含层的神经元上加入稀疏性的限制。 (稀疏更有利于表达数据的特性)

如何更新权重:

使用反向传播算法训练权重值
下面两个图是反向传播算法主要的计算过程:(太懒了,也就没有重新编辑了,[苦笑])
在这里插入图片描述
在这里插入图片描述

为什么稀疏(如何产生稀疏):

数据稀疏更有利于表达数据的特性
(如果当神 经元的输出接近于1的时候我们认为它被激活,而输出接近于0的时候认为它被抑 制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。这里 我们假设的神经元的激活函数是sigmoid函数(如果你使用tanh作为激活函数的话, 当神经元输出为-1的时候,我们认为神经元是被抑制的)。)
使隐藏神经元的平均激活度ρ特别小(接近于0)。一般ρ取值0.05(隐层节 点在95%的时间里都是被一直的,只有5%的机会被激活)。 为什么接近于0好:大脑接受某一刺激也是只有单一的神经元兴奋,或者说 某个神经元只对某种刺激兴奋,以这种形式构成的神经网络更符合人脑的思 维方式,更能够得到好的结果

平均激活度:

在这里插入图片描述
给定输入x情况下,自编码神经网络隐藏神经元 j的激活度


堆叠式自编码器(Stacked Auto-Encoder,SAE)

Stacked Autoencoder(SAE)模型是一个由多层稀疏自编码器组成的深度神经网络模型,其前一层自编码器隐层的输出作为其后一层自编码器的输入,最后一层是个分类器(logistic 回归或者softmax分类(预测分析))。 对隐藏单元施加稀疏性(同时具有比输入更多的隐藏单元), 自动编码器可以在输入数据中学习有用的结构。 这允许输入 的稀疏表示。 这些对于分类任务的前训练是有用的。

SAE的基本流程图,以及添加预测层的完整神经网络模型:

在这里插入图片描述

在这里插入图片描述


参考文献

1,《Traffic Flow Prediction With Big Data: A Deep Learning Approach
据作者所述,这是第一次使用SAE方法来表示用于预测的交通流特征。
2,《Stacked Denoising Autoencoders: Learning Useful Representations in a Deep Network with a Local Denoising Criterion
Stacked Denoising Autoencoders(堆叠式去噪自编码器)


("请不要后悔你的每一次抉择,勇敢的往前冲。是路总会有尽头,前方定会一片光芒。 FIGHTING…")

  • 5
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: SAE堆叠自编码器(Stacked Autoencoder, SAE)是一种深度学习网络模型,用于进行无监督学习或特征提取。MATLAB是一种流行的科学计算软件,提供了许多功能丰富的工具箱和函数,可以用于实现SAE。 要实现SAE的MATLAB源代码,首先需要引入相关的工具箱和函数。其中,MATLAB的深度学习工具箱是必需的,它包含了用于训练神经网络的功能。 以下是一个简单的SAE MATLAB实现源代码的示例: ```matlab % 导入数据集 load mnist.mat; % 假设mnist.mat包含训练数据集 inputSize = size(trainData, 1); % 设置自编码器的层数和每层的隐藏单元数量 hiddenLayerSizes = [100 50 20]; % 创建SAE网络 sae = saetrain(trainData, hiddenLayerSizes); % 保存训练好的模型 save('sae_model.mat', 'sae'); % 加载模型 load('sae_model.mat'); % 使用SAE进行特征提取 features = encode(sae, testData); % 可以使用得到的特征进行其他任务,如分类 % 实现自编码器训练函数 function sae = saetrain(inputData, hiddenLayerSizes) sae.numLayers = length(hiddenLayerSizes); sae.rbm = cell(1, sae.numLayers); for layer = 1:sae.numLayers if layer == 1 inputSize = size(inputData, 1); outputSize = hiddenLayerSizes(layer); input = inputData; else inputSize = hiddenLayerSizes(layer-1); outputSize = hiddenLayerSizes(layer); input = encode(sae, inputData, layer-1); end sae.rbm{layer} = trainRBM(input, inputSize, outputSize); end end % 实现RBM训练函数 function rbm = trainRBM(inputData, inputSize, hiddenSize) rbm = rbmsetup(inputSize, hiddenSize); rbm = rbmtrain(rbm, inputData); end % 实现RBM设置函数 function rbm = rbmsetup(visNum, hidNum) rbm.visNum = visNum; rbm.hidNum = hidNum; rbm.weights = 0.1 * randn(visNum, hidNum); rbm.vBias = zeros(visNum, 1); rbm.hBias = zeros(hidNum, 1); end % 实现RBM训练函数 function rbm = rbmtrain(rbm, data) rbm = rbmff(rbm, data); rbm = rbmbw(rbm); end % 实现RBM前向传播函数 function rbm = rbmff(rbm, data) rbm.visible = data; rbm.hiddenProb = sigmoid(rbm.visible * rbm.weights + repmat(rbm.hBias', size(data, 1), 1)); rbm.hiddenState = rbm.hiddenProb > rand(size(data, 1), rbm.hidNum); end % 实现RBM反向传播函数 function rbm = rbmbw(rbm) rbm.reconstructed = sigmoid(rbm.hiddenState * rbm.weights' + repmat(rbm.vBias', size(rbm.hiddenState, 1), 1)); end % 实现激活函数sigmoid function output = sigmoid(input) output = 1./(1 + exp(-input)); end ``` 该源代码演示了如何使用MATLAB实现SAE。首先,载入数据集,在本例中为mnist.mat。然后,定义自编码器的层数和每层的隐藏单元数量。接下来,采用自定义函数saeetrain来创建和训练SAE,该函数内部完成每个层级的RBM训练。最后,保存训练好的模型并加载模型以进行特征提取。 请注意,这只是一个简单的示例,实际上,要实现一个高效和有效的SAE可能需要更多的代码和调整。此外,还可以根据具体的数据集和需求进行一些参数调整和改进。 ### 回答2: SAE(Stacked Autoencoder,堆叠自编码器)是一种深度学习模型,可以用于无监督学习和特征提取。在MATLAB中,可以使用深度学习工具箱来实现SAE。 下面是一个简单的SAE MATLAB实现的示例源代码: ```matlab % 导入数据集 load('dataset.mat'); % 例如,dataset.mat包含训练数据X和相应的标签Y % 设置自编码器的参数 hiddenSize = 100; % 隐藏层的大小 autoenc1 = trainAutoencoder(X, hiddenSize); % 训练第一个自编码器 % 使用第一个自编码器的编码层作为第二个自编码器的输入 features = encode(autoenc1, X); % 获得第一个自编码器的编码层特征 autoenc2 = trainAutoencoder(features, hiddenSize); % 训练第二个自编码器 % 使用第二个自编码器的编码层作为整个SAE的输入 sae = stack(autoenc1, autoenc2); % 堆叠两个自编码器形成SAE % 微调整个SAE模型 sae = train(sae, X); % 使用训练数据进行微调 ``` 上述代码首先加载训练数据集,然后定义了一个隐藏层大小为100的自编码器。通过训练第一个自编码器,可以获取到其编码层的特征。接下来,利用第一个自编码器的编码层特征,训练第二个自编码器。最后,通过堆叠两个自编码器来形成完整的SAE模型,并使用训练数据进行微调。 此外,需要注意的是,在实际应用中,可能需要根据具体问题进行参数调整和模型优化,代码示例仅作为基本参考。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值