自动编码器中的预处理和丢失?

数据挖掘 机器学习 深度学习 喀拉斯 张量流 自动编码器
2021-09-20 00:58:03

我正在使用自动编码器并且几乎没有混淆,我正在尝试不同的自动编码器,例如:

fully_connected autoencoder
convolutional autoencoder
denoising autoencoder 

我有两个数据集,一个是具有浮点和整数值的数值数据集,第二个是具有文本和日期值的文本数据集:

数值数据集如下所示:

date ,        id ,             check_in , check_out , coke_per , permanent_values , temp
13/9/2017     142453390001    134.2       43.1        13         87                 21
14/9/2017     142453390005    132.2       46.1        19         32                 41
15/9/2017     142453390002    120.2       42.1        33         99                 54
16/9/2017     142453390004    100.2       41.1        17         39  

           89

我的任何文本数据集看起来像:

data              text
13/9/2017         i totally understand this conversation about farmer market and the organic products, a nice conversation ’cause prices are cheaper than traditional
14/9/2017         The conversation was really great. But I think I need much more practice. I need to improve my listening a lot. Now I’m very worried because I thought that I’d understand more. Although, I understood but I had to repeat and repeat. See you!!!

所以我的问题是:

在输入任何类型的自动编码器之前,我是否应该标准化我的数值数据值?如果它们是 int 和 float 值,我仍然必须规范化吗?

我应该在自动编码器中使用哪个激活函数?有些文章和研究论文说“sigmoid”,有些说“relu”?

我应该在每一层都使用 dropout 吗?就像我的自动编码器看起来像

encoder (1000 --> 500 -- > 256 ----> 128 ) --> decoder (128 --> 256 --> 500--> 784) 

像这样的东西?

encoder(dropout(1000,500) --> dropout( 500,256) --> dropout (256,128) )----> decoder(dropout(128,256),dropout(256,500),dropout(500,784))

对于文本数据集,如果我使用 word2vec 或任何嵌入将文本转换为向量,那么每个单词都会有浮点值,我是否也应该规范化该数据?

text ( Hello How are you  ) -- > word2vec(text) ----> ([1854.92002 , 54112.89774 ,5432.9923 ,5323.98393]) 

我应该标准化这个值还是直接在自动编码器中使用?

2个回答

我会一一解答你的问题:


在输入任何类型的自动编码器之前,我是否应该标准化我的数值数据值?如果它们是 int 和 float 值,我仍然必须规范化吗?

强烈建议这样做,原因有两个。首先,如果不同的变量在不同的尺度上,权重分布将是不平等的。在梯度下降的应用过程中,较大的尺度将主导较小的尺度,这将导致许多参数训练不足,从而导致次优结果。其次,您的图层具有激活函数,旨在“学习”数据中的非线性模式。所有常用的激活函数(Sigmoid、Tanh、所有 ReLU 家族,你可以命名它)往往仅在零附近是非线性的。规范化您的数据有助于神经网络从它们中学习最多。


我应该在自动编码器中使用哪个激活函数?有些文章和研究论文说“sigmoid”,有些说“relu”?

这更像是一门艺术而不是一门科学,但是 ReLU 家族的所有激活都已被证明优于其他同类产品。我建议您基本上总是选择某种 ReLU。有些更漂亮但计算成本更高,通常排名是: ELU > Leaky ReLU > ReLU


我应该在每一层都使用 dropout 吗?就像我的自动编码器看起来像

使用一定量的 dropout,但不要太多。Dropout 是一种正则化技术,可帮助您防止过度拟合。该技术在随机采样的训练期间“关闭”一些神经元,以使所有神经元在训练期间专门化(它将您的神经网络变成神经网络的集合)。但是,请记住,dropout 也代表信息丢失!例如,如果你设置一个Dropout()dropout 概率为 0.5 的层,你会在每次迭代中丢失该层一半的信息!我建议你使用它,但不要在每一层都使用它,并且要简约。


对于文本数据集,如果我使用 word2vec 或任何嵌入将文本转换为向量,那么每个单词都会有浮点值,我是否也应该规范化该数据?

不,这些是模型自动学习的,您不必担心它们的内部值。

  1. 您应该始终规范化您的输入数据,因为 NN 可以使用规范化数据更快地学习
  2. 你不能概括这个问题,但根据我的经验,relu 更好
  3. 辍学的使用取决于您对模型的应用。例如,可以通过 dropout 改进图像修复。你想对模型做什么?