当前位置:首页 > 娱乐

【王小新】什么是自编码器?有什么用?这里是入门指南(包括代码)

作家内森胡本斯

王小新是从《世界数据科学》编译而来的。

量子比特生产|公众号QbitAI

自编码器(Autoencoder,AE)是一种神经网络,它使用反向传播算法使输出值等于输入值,首先将输入压缩为潜在的空间表示,然后通过这个表征重建输出。

自编码器由以下两部分组成:

编码器:在此部分中,可以将输入压缩为潜在的空间表征,并以编码函数h=f(x)表示。

解码器:在此部分中,您可以重新配置解码函数r=g(h)可以表示的潜在空间表征的输入。

自编码器结构

因此,整个自编码器可以用函数G (F (X)=R来描述。其中输出R类似于原始输入X。

为什么要用输入重构输出?

如果自行编码器的唯一目的是使输出值等于输入值,那么这个算法就没有用了。实际上,通过教育输出值等于输入值的自身编码器,使潜在的表征H具有价值属性。

这可以通过在重组操作中创建约束来实现。

在自己的编码器中获得有用功能的一种方法是将H的维度限制在小于输入X的范围内。这称为损耗自编码器。训练通过损失表征,使自己的编码器能够从数据中学习最重要的特征。

如果自身编码器的容量过大,则无需提取数据分布的有用信息,就可以更好地执行重建任务。

如果潜在表征的维度与输入相同或过于完备,则即使潜在表征的维度大于输入,也会出现上述结果。

在这种情况下,即使仅使用线性编码器和线性解码器,也可以利用输入重新配置输出,而无需知道有关数据分布的有用信息。

理想情况下,根据要分配的数据的复杂性,正确地选择编码器和解码器的编码维和容量,可以成功地训练必要的自编码器结构。

自编码器是用来干什么的?

目前,自编码器应用有两个主要方面。第一个是数据去噪,第二个是为了可视化降低维度。通过设置适当的维和稀疏约束,编码器可以学习比PCA等技术更有趣的数据投影。

自编码器可以在数据样本中进行无监督学习。也就是说,将该算法应用于数据集,可以获得良好的性能,不需要新的功能工程。只需要适当的教育数据。

但是,自编码器不利于图像压缩。因为在给定的数据集上训练了编码器,所以在处理类似于训练集的数据时可以获得适当的压缩结果,但在压缩其他差异较大的图像时效果不好。其中,JPEG等压缩技术在通用图像压缩中工作得更好。

您可以训练自己的编码器,通过编码器和解码器保存尽可能多的信息,但您也可以训练自己的编码器,为新的表象赋予各种属性。不同类型的自编码器旨在实现不同类型的属性。下面重点介绍四种不同的自编码器。

四种不同的自编码器

本文介绍了以下四种自编码器。

香草自行编码器

多层自编码器

卷积自编码器

正规自编码器

为了说明不同类型的自编码器,我们使用Keras框架和MNIST数据集为每种类型创建了单独的示例。每个自己的编码器代码都可以在Github上找到。

香草自行编码器

这个自我编码器最简单的结构有三个网络层,即只有一个隐藏层的神经网络。输入和输出相同,可以学习使用Adam优化程序和均方误差损失函数重建输入。

其中,当隐式层维(64)小于输入维(784)时,编码器可能损坏。通过这个约束,强迫神经网络学习数据的压缩表象。

Input_size=784

Hidden_size=64

Output_size=784

X=input(形状=(input _ size,))

# Encoder

H=dense (hidden _ size,activation=' relu') (x)

# Decoder

R=dense (output _ size,activation=' sigmoid') (h)

Autoencoder=model (input=x,output=r)

优化器(Au)

='adam', loss='mse')

多层自编码器

如果一个隐含层还不够,显然可以将自动编码器的隐含层数目进一步提高。

在这里,实现中使用了3个隐含层,而不是只有一个。任意一个隐含层都可以作为特征表征,但是为了使网络对称,我们使用了最中间的网络层。

input_size = 784 hidden_size = 128 code_size = 64 x = Input(shape=(input_size,)) # Encoder hidden_1 = Dense(hidden_size, activation='relu')(x) h = Dense(code_size, activation='relu')(hidden_1) # Decoder hidden_2 = Dense(hidden_size, activation='relu')(h) r = Dense(input_size, activation='sigmoid')(hidden_2) autoencoder = Model(input=x, output=r) au(optimizer='adam', loss='mse')

卷积自编码器

你可能有个疑问,除了全连接层,自编码器应用到卷积层吗?

答案是肯定的,原理是一样的,但是要使用3D矢量(如图像)而不是展平后的一维矢量。对输入图像进行下采样,以提供较小维度的潜在表征,来迫使自编码器从压缩后的数据进行学习。

x = Input(shape=(28, 28,1)) # Encoder conv1_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(x) pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1) conv1_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool1) pool2 = MaxPooling2D((2, 2), padding='same')(conv1_2) conv1_3 = Conv2D(8, (3, 3), activation='relu', padding='same')(pool2) h = MaxPooling2D((2, 2), padding='same')(conv1_3) # Decoder conv2_1 = Conv2D(8, (3, 3), activation='relu', padding='same')(h) up1 = UpSampling2D((2, 2))(conv2_1) conv2_2 = Conv2D(8, (3, 3), activation='relu', padding='same')(up1) up2 = UpSampling2D((2, 2))(conv2_2) conv2_3 = Conv2D(16, (3, 3), activation='relu')(up2) up3 = UpSampling2D((2, 2))(conv2_3) r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up3) autoencoder = Model(input=x, output=r) au(optimizer='adam', loss='mse')

正则自编码器

除了施加一个比输入维度小的隐含层,一些其他方法也可用来约束自编码器重构,如正则自编码器。

正则自编码器不需要使用浅层的编码器和解码器以及小的编码维数来限制模型容量,而是使用损失函数来鼓励模型学习其他特性(除了将输入复制到输出)。这些特性包括稀疏表征、小导数表征、以及对噪声或输入缺失的鲁棒性。

即使模型容量大到足以学习一个无意义的恒等函数,非线性且过完备的正则自编码器仍然能够从数据中学到一些关于数据分布的有用信息。

在实际应用中,常用到两种正则自编码器,分别是稀疏自编码器和降噪自编码器。

稀疏自编码器:

一般用来学习特征,以便用于像分类这样的任务。稀疏正则化的自编码器必须反映训练数据集的独特统计特征,而不是简单地充当恒等函数。以这种方式训练,执行附带稀疏惩罚的复现任务可以得到能学习有用特征的模型。

还有一种用来约束自动编码器重构的方法,是对其损失函数施加约束。比如,可对损失函数添加一个正则化约束,这样能使自编码器学习到数据的稀疏表征。

要注意,在隐含层中,我们还加入了L1正则化,作为优化阶段中损失函数的惩罚项。与香草自编码器相比,这样操作后的数据表征更为稀疏。

input_size = 784 hidden_size = 64 output_size = 784 x = Input(shape=(input_size,)) # Encoder h = Dense(hidden_size, activation='relu', activity_regularizer=regularizers.l1(10e-5))(x) # Decoder r = Dense(output_size, activation='sigmoid')(h) autoencoder = Model(input=x, output=r) au(optimizer='adam', loss='mse')

降噪自编码器:

这里不是通过对损失函数施加惩罚项,而是通过改变损失函数的重构误差项来学习一些有用信息。

向训练数据加入噪声,并使自编码器学会去除这种噪声来获得没有被噪声污染过的真实输入。因此,这就迫使编码器学习提取最重要的特征并学习输入数据中更加鲁棒的表征,这也是它的泛化能力比一般编码器强的原因。

这种结构可以通过梯度下降算法来训练。

x = Input(shape=(28, 28, 1)) # Encoder conv1_1 = Conv2D(32, (3, 3), activation='relu', padding='same')(x) pool1 = MaxPooling2D((2, 2), padding='same')(conv1_1) conv1_2 = Conv2D(32, (3, 3), activation='relu', padding='same')(pool1) h = MaxPooling2D((2, 2), padding='same')(conv1_2) # Decoder conv2_1 = Conv2D(32, (3, 3), activation='relu', padding='same')(h) up1 = UpSampling2D((2, 2))(conv2_1) conv2_2 = Conv2D(32, (3, 3), activation='relu', padding='same')(up1) up2 = UpSampling2D((2, 2))(conv2_2) r = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up2) autoencoder = Model(input=x, output=r) au(optimizer='adam', loss='mse')

总结

本文先介绍了自编码器的基本结构,还研究了许多不同类型的自编码器,如香草、多层、卷积和正则化,通过施加不同约束,包括缩小隐含层的维度和加入惩罚项,使每种自编码器都具有不同属性。

希望这篇文章能让深度学习初学者对自编码器有个很好的认识,有问题欢迎加入量子位的机器学习专业群一起讨论↓↓↓

— 完 —

诚挚招聘

量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。量子位 QbitAI · 头条号签约作者

վ'ᴗ' ի 追踪AI技术和产品新动态

1.《【王小新】什么是自编码器?有什么用?这里是入门指南(包括代码)》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《【王小新】什么是自编码器?有什么用?这里是入门指南(包括代码)》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/yule/2862324.html

上一篇

【明月心是谁演的】《新倚天》不好的地方不仅仅是林璇,古田勒那边脸塌,女主露肩露腿。

下一篇

【北京青年叶坦】曾裕堂:中戏校花,脸部被撞的李小兰,现在《那片花那片海》中的康乃信。

【王小新】在一篇文章中,可以看到多种神经网络优化算法,即从梯度下降到Adam方法。

【王小新】在一篇文章中,可以看到多种神经网络优化算法,即从梯度下降到Adam方法。

王小新相关介绍,王小信是从中化编译来的。 量子比特生产|公众号QbitAI 在调整模型更新权重和偏差参数的方法时,有没有想过哪些优化算法可以使模型更好、更快?是否需要使用梯度下降、随机梯度下降或Adam方法? 介绍了...

【王小新】深层民德的新论文:基于变分法的自编码生成对抗网络

【王小新】深层民德的新论文:基于变分法的自编码生成对抗网络

王小新相关介绍,王小信是从Arxiv编译来的。 量子比特生产|公众号QbitAI 最近,DeepMind的Mihaela Rosca、Balaji Lakshminarayanan和David Warde-Farle...

【王小新】加强学习新路径:基于自我监督预测的好奇心驱动探索(论文代码)

【王小新】加强学习新路径:基于自我监督预测的好奇心驱动探索(论文代码)

王小新相关介绍,王小信编译整理 量子比特报告|公众号QbitAI 最近,来自加州大学伯克利分校的Deepak Pathak、Pulkit Agrawal、Alexei A. Efros等撰写了一篇题为《基于自我监督预...