【机器学习】无监督学习算法之:自编码器

本文介绍了自编码器的基本概念、工作原理、实现方式,包括编码器和解码器的作用、训练过程以及其在数据处理中的应用。重点讨论了自编码器如何通过无监督学习学习输入数据的表示,并提到了其在深度学习发展中的地位和演变
摘要由CSDN通过智能技术生成

1、引言

小屌丝:鱼哥, 今天可以讲一讲 自编码器嘛
小鱼:请说清楚,是什么编码器?
小屌丝:自编码器
小鱼:自己的写的编码器吗?
小屌丝:你要是这么说,也没毛病, 自己写自编码器博文
小鱼:… 那我不写了。
小屌丝:…别啊。
小鱼:那你说清楚,是什么自编码器呢?
小屌丝:就是 无监督学习的 自编码器
小鱼:… 感觉自己给你挖坑。
小屌丝: 没关系, 我带铁锹的哦 。你看
在这里插入图片描述

小鱼:此时小鱼的想法。
在这里插入图片描述

小屌丝:我不是那个意思了。
小鱼:那你是啥意思。
小屌丝:(⊙o⊙)…,嗯… 听说xxx(此处省略几个字)要上zhong了哦
小鱼: 那还等什么。

2、自编码器

2.1 定义

自编码器是一种无监督的神经网络模型,它试图通过训练网络来学习一个恒等函数,即输出尽可能接近输入的表示。

自编码器由两部分组成:编码器(Encoder)和解码器(Decoder)。

编码器负责将输入数据压缩成一个低维的隐藏层表示(编码),而解码器则负责从编码中重构出原始输入。

2.2 原理

自编码器的原理基于神经网络的学习能力。

在训练过程中,自编码器通过最小化重构误差来优化网络参数,使得解码器能够准确地从编码中恢复出原始输入。

通过限制隐藏层的大小,自编码器可以学习到一个紧凑的、有意义的输入表示,这个表示能够捕捉到输入数据的关键特征。

2.3 实现方式

实现自编码器通常包括以下步骤:

  • 构建网络结构
    • 定义编码器和解码器的网络层,以及它们的连接方式。
    • 编码器通常是一个多层感知机(MLP),通过一系列线性变换和非线性激活函数将输入数据压缩成低维编码。
    • 解码器则是一个与编码器结构对称的网络,用于从编码中重构出原始输入。
  • 定义损失函数
    • 损失函数用于衡量解码器输出的重构数据与原始输入之间的差异。
    • 常用的损失函数包括均方误差(MSE)和交叉熵损失等。
  • 训练网络
    • 使用无监督学习方法(如随机梯度下降)来训练自编码器。
    • 在训练过程中,网络参数通过反向传播算法进行更新,以最小化损失函数。
  • 应用
    • 一旦自编码器训练完成,它可以用于多种任务,如数据降维、特征提取、去噪等。
    • 通过提取编码层的输出,我们可以获得输入数据的低维表示,用于后续的分析和建模。

2.4 算法公式

自编码器的算法公式主要涉及编码和解码过程。假设输入数据为(x),编码器的输出(即编码)为(h),解码器的输出为(\hat{x})。

  • 则编码过程

[ h = f encoder ( x ) ] [ h = f_{\text{encoder}}(x) ] [h=fencoder(x)]

其中,$(f_{\text{encoder}})$表示编码器的映射函数,通常是一个参数化的神经网络。
  • 解码过程

[ x ^ = f decoder ( h ) ] [ \hat{x} = f_{\text{decoder}}(h) ] [x^=fdecoder(h)]

其中,$(f_{\text{decoder}})$表示解码器的映射函数,也是一个参数化的神经网络。
  • 损失函数通常定义为重构误差,如均方误差

[ L ( x , x ^ ) = 1 n ∑ i = 1 n ( x i − x ^ i ) 2 ] [ L(x, \hat{x}) = \frac{1}{n} \sum_{i=1}^{n} (x_i - \hat{x}_i)^2 ] [L(x,x^)=n1i=1n(xix^i)2]

其中,(n)是输入数据的维度。

训练过程中,通过最小化损失函数来更新编码器和解码器的参数。

2.5 代码示例

# -*- coding:utf-8 -*-
# @Time   : 2024-03-11
# @Author : Carl_DJ

'''
实现功能:
   使用 Keras库实现自编码器
     
'''
import numpy as np  
from keras.layers import Input, Dense  
from keras.models import Model  
  
# 假设输入数据维度为784(例如,展平后的28x28图像)  
input_dim = 784  
encoding_dim = 32  # 编码维度  
  
# 定义编码器模型  
input_img = Input(shape=(input_dim,))  
encoded = Dense(encoding_dim, activation='relu')(input_img)  
  
# 定义解码器模型  
decoded = Dense(input_dim, activation='sigmoid')(encoded)  
  
# 构建自编码器模型  
autoencoder = Model(input_img, decoded)  
  
# 编译模型  
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')  
  
# 生成一些随机数据作为示例  
x_train = np.random.random((1000, input_dim))  
x_train = x_train.astype('float32') / 255.  
  
# 训练自编码器  
autoencoder.fit(x_train, x_train,  
                epochs=50,  
                batch_size=256,  
                shuffle=True,  
                validation_data=(x_train, x_train))  
  
# 使用编码器提取特征  
encoder = Model(input_img, encoded)  
encoded_imgs = encoder.predict(x_train)


代码实现功能解析

  • 定义自编码器模型:使用Keras库定义了一个简单的自编码器模型。自编码器是一种无监督学习模型,它试图学习一个恒等函数,即输出尽可能地复制输入。它由两部分组成:编码器和解码器。

    • 编码器:将输入数据压缩成一个低维表示,这里使用了单个全连接层(Dense layer),输出维度为encoding_dim(在这个例子中是32)。
    • 解码器:从编码器的输出中重构出原始输入数据,这里也使用了单个全连接层,输出维度与输入维度相同(input_dim,这里是784)。
  • 编译模型:使用Adam优化器和二元交叉熵损失函数来编译自编码器模型。优化器用于更新模型的权重以最小化损失函数,而损失函数衡量了模型输出与原始输入之间的差异。

  • 生成训练数据:生成了一个随机的数据集x_train,其形状为(1000, 784)。这里假设这些数据代表784维的特征(例如,展平的28x28像素的图像)。然后,这些数据被归一化到0到1的范围内。

  • 训练自编码器:使用生成的训练数据x_train来训练自编码器模型。训练过程中,模型会尝试学习一个函数,使得输入数据通过编码器和解码器后能够尽可能地接近原始输入。

  • 提取特征:训练完成后,代码构建了一个新的模型encoder,该模型仅包含自编码器中的编码器部分。然后,使用这个编码器模型对训练数据x_train进行预测,得到其低维表示encoded_imgs。这些低维表示可以被视为输入数据的特征,可以用于后续的任务,如分类、聚类等。

在这里插入图片描述

3、总结

看到这里,今天的分享就该结束了。

自编码器通过学习输入数据的压缩表示来实现无监督特征学习。
它延伸应用于数据去噪、异常检测等任务中。但编码空间容易趋向平均值,需要设计特殊结构进行正则化。
自编码器为后来的变分自编码器等深度学习模型奠定基础。

当然, 随着深度学习技术的不断发展,自编码器也在不断演进和创新。例如,变分自编码器(VAE)卷积自编码器(CAE) 等变体在特定任务上取得了更好的效果。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,学习机器学习领域的知识。

  • 22
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carl_奕然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值