正则自编码器之收缩自编码器(Contractive Autoencoders)

衡量一个自编码器模型的效果可以从两个标准入手:1.模型是否可以很好的重建输入信号;2.模型对输入数据在一定程度下的扰动是否具有不变性。

为了使自编码器在标准2下具有更好的效果,Rifai等人提出了收缩自编码器,其主要目的是为了抑制训练样本在所有方向上的扰动。为了实现这一目标,Rifai等人提出在传统自编码器的目标函数上增加一个惩罚项来达到局部空间收缩的效果。该惩罚项是关于输入的隐藏层表达的Jacobian矩阵的F范数,其目的是为了使特征空间在训练数据附近的映射达到收缩效果,表达式如下:

\left \| J_{f}(x) \right \|_{F}^{2}=\sum_{ij}(\frac{\partial h_{j}(x)^2 }{\partial x_{i}^2})                                                                   (公式1)

把公式1作为惩罚项添加到自编码器的损失函数中,是因为当惩罚项具有比较小的一阶导数时,说明与输入信号对应的隐藏层表达比较平滑,则当输入出现一定变化时,隐藏层表达不会发生过大的变化,由此可以使自编码器对输入变化不敏感。收缩自编码器的损失函数表示如下:

J_{CAE}(W)=\sum(L(x,y))+\lambda \left \| J_{f}(x) \right \|_{F}^2                                             (公式2)

公式2中\lambda用于控制惩罚项强度的超参数,可选择0-1之间的任意值。公式2中的第一项是为了让重构误差尽可能的小,第二项可以看做是自编码器在尽可能的丢弃所有信息。由此CAE最终只会捕获到训练数据上出现的扰动信息,使模型对扰动具有不变性

稀疏自编码器通过对大部分隐藏层神经元进行抑制,隐藏层输出对应于激活函数的左饱和区域。收缩自编码器通过对隐藏层神经元的输出推向它的饱和区域来达到收缩性。

收缩自编码器的鲁棒性体现在对隐藏层表达上,而去噪自编码器的鲁棒性体现在重构信号中。

高阶收缩自编码器(High Order Contractive Autoencoders)

高阶收缩自编码器在收缩自编码器的损失函数基础上添加了一个二阶惩罚项,该惩罚项是关于输入的隐藏层表达的Hessian矩阵的F范数,具体表示如下:

\left \| H_{f}(x) \right \|_{F}^{2}=\left \|\frac{\partial J_{f}(x)}{\partial x} \right \|_{F}^{2}                                                                       (公式3)

由此,高阶收缩自编码器的损失函数为:

J_{CAE}(W)=\sum(L(x,y))+\lambda \left \| J_{f}(x) \right \|_{F}^2+\gamma \left \| H_{f}(x) \right \|_{F}^{2}                       (公式4)

由于二阶导数的计算会极大增加模型的复杂度,Rifai等人提出利用随机近似方法将二阶导数转换为一阶导数来降低其计算复杂度:

\left \| H_{f}(x) \right \|_{F}^{2}=\lim_{\sigma \rightarrow 0}\mathbb{E}[\left \| J_{f}(x)-J(x+\epsilon ) \right \|_{F}^{2}]                                            (公式5)

由此,高阶收缩自编码器的最终目标是最小化如下目标函数:

J_{CAE+H}(W)=\sum(L(x,y))+\lambda \left \| J_{f}(x) \right \|_{F}^2+\gamma \left \| \mathbb{E}[\left \| J_{f}(x)-J(x+\epsilon ) \right \|_{F}^{2}] \right \|                 (公式6)

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
收缩自编码器contractive autoencoder)是一种可以用于降维的神经网络模型,在 TensorFlow 中可以实现。 首先,需要定义收缩自编码器的结构。收缩自编码器和普通的自编码器相似,只是在损失函数中加入了一个惩罚项,以使得模型对输入数据的微小变化更加敏感,从而提高了模型的泛化性能。 以下是一个简单的收缩自编码器的结构: ```python import tensorflow as tf # 定义输入层 input_layer = tf.keras.layers.Input(shape=(input_dim,)) # 定义编码器 encoder = tf.keras.layers.Dense(encoding_dim, activation='relu')(input_layer) # 定义解码器 decoder = tf.keras.layers.Dense(input_dim, activation='sigmoid')(encoder) # 定义收缩自编码器 autoencoder = tf.keras.models.Model(inputs=input_layer, outputs=decoder) # 定义惩罚项 def contractive_loss(y_true, y_pred): mse = tf.keras.losses.mean_squared_error(y_true, y_pred) W = tf.Variable(autoencoder.get_layer('dense').get_weights()[0]) h = autoencoder.get_layer('dense').output dh = h * (1 - h) contractive = tf.reduce_sum(tf.square(tf.matmul(dh, W)), axis=1) return mse + 0.1 * contractive # 编译模型 autoencoder.compile(optimizer='adam', loss=contractive_loss) ``` 其中,`input_dim` 表示输入数据的维度,`encoding_dim` 表示降维后的维度。在定义惩罚项时,首先计算均方误差(MSE)作为基本损失,然后定义惩罚项,其中 `W` 是编码器层的权重矩阵,`h` 是编码器层的输出,`dh` 是 `h` 的导数,`contractive` 是惩罚项的值。 接下来,可以使用收缩自编码器对数据进行降维: ```python # 训练模型 autoencoder.fit(X_train, X_train, epochs=100, batch_size=32, validation_data=(X_test, X_test)) # 获取编码器层的输出 encoder_output = autoencoder.get_layer('dense').output # 定义降维模型 dim_reduction_model = tf.keras.models.Model(inputs=input_layer, outputs=encoder_output) # 对数据进行降维 X_train_encoded = dim_reduction_model.predict(X_train) X_test_encoded = dim_reduction_model.predict(X_test) ``` 其中,`X_train` 和 `X_test` 是输入数据的训练集和测试集。训练模型时,输入数据和输出数据都是 `X_train`,因为该模型是自编码器。训练完成后,可以获取编码器层的输出,即降维后的数据。定义降维模型时,输入层和输出层分别为原始的输入层和编码器层的输出。对数据进行降维时,只需使用降维模型的 `predict` 方法即可。 以上就是使用 TensorFlow 实现收缩自编码器进行降维的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值