自动编码器的相关内容

  • 20210909

0. 引言

对于自动编码器的内容,平时仅仅是使用最简单的自编码器,就是隐藏层或者说中间层比输入层的维度小,这样的方式,相对来说比较简单。以前的时候,也知道比如说降噪自编码器,或者说稀疏自编码器这类,但都没有关注过。最近翻阅了一些相关的文章,例如[1],对自编码器中一些比较有名的方式进行了介绍。本篇文章就针对其中的某些类别展开具体的研究。

1. 稀疏自编码器

1.1 概念介绍

在文章[1]中对稀疏自编码器有所介绍,第一感觉跟添加了Dropout差不多。
为了更深入的理解这部分内容,又搜索了另外一篇文章[2]。这篇文章着重介绍了稀疏自编码器。这篇文章在介绍时,先介绍了自动编码器的具体原理,不过他之类对自编码器的损失函数添加了一个惩罚项。
O b j = L ( x , x ^ ) + r e g u l a r i z e r Obj = L(x, \hat x)+regularizer Obj=L(x,x^)+regularizer

我觉得这个惩罚项就是为了后面其他的一些类型添加的;稀疏自编码器就是在自编码器的基础上添加了稀疏惩罚,对于实现来说,包括两种形式,一种是 L 1 L_1 L1正则化,和KL散度的方式,这篇文章中主要讨论了 L 1 L1 L1的方式。

1.2 激活正则

既然前面提到了跟这类惩罚项,就进一步翻阅了文章[3],这篇文章主要是讲述激活正则化。其实对于深度学习中的正则化,l1-l2这种我没怎么关注过,主要用的就是dropout这种方式来减缓过拟合。在读这篇文章的时候,发现他说出来一个问题,就是通过l1-l2正则化的方式来获取到更加准确,效果更好的特征,其实这个点我平时还真没想到过,一直以来的概念都是通过正则化来减轻过拟合。

不过,其实因为本身深度学习就是一种表征学习,他说这个目的,我倒也不惊讶。

但是这篇文章,因为也没有具体的代码,整体都是理论介绍,所以看起来也有点吃力,没有理解透彻。

不过其实,我之前的时候,也看到过相关的代码,keras是能够直接通过api来进行限制的,所以感觉使用应该没什么问题。

但是这里还有一个问题,就感觉,这个稀疏的概念还没有理解清楚,到底是利用L1-L2这种正则来进行描述,还是说用dropout,这两中到底哪个是针对稀疏自编码器的。

1.3 代码实现

我觉得看过的这些文章中,这篇文章[4],应该算是具体将这个稀疏自编码器让我理解了。不过这篇也没有太多代码。我觉得这篇文章介绍还算不错,从最开始自动编码器是什么,然后降噪自编码器,最后稀疏自编码器。主题呢,都是重点关注特征提取;对于为了达成特征提取的目标,在自编码器的角度,他提出了三种措施:
1)将中间层的维度降低(正常使用自编码器的方式)
2)降噪自编码器
3)稀疏自编码器

其中降噪自编码器:在这种文章中的实现,是将原始的图片添加了噪声,然后在fit()的时候,原始数据是加了噪声的数据。而稀疏自编码器的话,先上代码:

#code中间层
#非稀疏
code = Dense(code_size, activation='relu')(input_img)
#稀疏
code = Dense(code_size, activation='relu', activity_regularizer=l1(10e-6))(input_img)

不过因为他仅仅给出了中间层的代码,并没有给出其他层的;当然也可能是因为他仅仅只有这一层中间层。

前面的时候,我感觉我吧dropout和这种激活正则项给闹混了;特别是我看到这个代码中,直接将activity_reqularizer放在了dense层里面。

1.4 简单总结

目前来说,简单理解了对于正则化的方式,不过感觉还是没有理解透彻,因为还有很多其他的方式;比如dropout,而且对于前面提到的L1和L2他们的具体不同点是什么,还需要再深入理解。虽然说,通过通过代码也就是一行的事情,但是有必要好好理解。

1.5 具体代码实现(20210909增加)

在keras的官网上,对于自编码器部分,有相关的代码实现[5],我觉得这个代码,还是具备非常高的参考价值的。基本上前面介绍过的代码,这个部分都有。

在稀疏自编码器的部分,他也是采用了和文章[3]一样的方式,都是在dense层使用了一个参数来进行调整。从这个角度来看,既然官方都是这么写的,那么代码肯定是具备一定的权威性的。

不过,我其实,对有一个部分还是没理解,就是在最后编译的部分,他是使用了二进制的交叉熵函数,我平时可能使用的更多的就是直接MSE,这个部分具体有什么讲究,还没有考虑清楚,可能是因为这个最后的sigmoid的问题。

1.6 疑问解答

为什么可以使用二进制的交叉熵来作为损失函数?这里找到了两篇文章比较相关。
1)为什么可以使用二进制交叉熵[7]

2. 变分自编码器

前端时间学习对抗自编码器的时候,对变分自编码器也简单了解过,变分自编码器属于一种生成模型,从代码的角度来看,在中间层变成了某个分布的参数,训练过程中,中间层就是为了学习这个分布的参数;然后损失函数是两个部分,一部分是重构损失,另外一部分是KL散度的相关信息,主要是这样的一个过程。代码在文章[5]中同样有,不过他在最后利用散点图的形式展现这个编码效果的部分,感觉并不是非常好,就是重叠度还是挺高。

3. 文章记录

(20211005)
今天看了一个文章[8],专门介绍自动编码器的,包含了大部分的编码器变种。当时是因为看到了这个KL惩罚项的部分,感觉跟我写的代码不太一样,所以有点疑惑。在[8]中看到了。其实我这篇文章的前面也已经记录了,有两种惩罚方式。

前面也已经说过了,对于KL散度的惩罚没有找到相应的代码,都是直接使用了L1惩罚项。在github[9]中给出了这种KL方法的计算方式,这种方式应该就是我需要的。

(20230304)- 自编码器的权值初始化

看一篇权值初始化的时候,看到了他们利用了那种逐层训练的方式,或者说,利用一些其他的形式来进行初始化;我之前还想尝试一下,但是结果发现,没什么效果;就是跟我直接训练的结果没啥两样。后来搜了搜,发现了这里的一些说法[10]:

在这里插入图片描述
大致意思就是,现在的很多技术,不管是初始化方式也好,又或者是激活函数,他们这些技术的发展,可以不使用以前那种方式来训练。

参考

[1][自编码器:理论+代码]:自编码器、栈式自编码器、欠完备自编码器、稀疏自编码器、去噪自编码器、卷积自编码器
[2]What happens in Sparse Autoencoder
[3]A Gentle Introduction to Activation Regularization in Deep Learning
[4]Applied Deep Learning - Part 3: Autoencoders
[5]Building Autoencoders in Keras
[6]How does binary cross entropy loss work on autoencoders?
[7]Why binary crossentropy can be used as the loss function in autoencoders? [duplicate]
[8]Introduction to autoencoders.
[9]sparse_autoencoder
[10]Is initializing the weights of autoencoders still a difficult problem?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值