PCA & Autoencoders通俗解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 一文比较主成分分析,自编码器及稀疏自编码器。

1
来源:FK Films

自动编码器(Autoencoder)通过将数据映射到低维空间,提取数据的显著特征。该过程会对数据进行压缩编码,即“encoder”, “auto” 则体现在其能决定如何重组数据。其中编码特征被称为潜在变量。

为什么这样做:

  1. 降低数据维度从而缩短训练时间
  2. 挖掘潜在特征从而提高模型性能

潜在变量本质上是一些数据的隐式特征,它无法通过直接观察或测量得到。幸福就好比一个潜在变量,我们必须使用类似问卷调查的方式才有可能对一个人的幸福程度做出衡量。

与自动编码器一样,主成分分析(PCA,Principal Component Analysis)也是常用于降低数据维度。

举个简单的例子,你要送朋友一辆乐高跑车作为生日礼物。但是你用来装礼物的盒子不够大,无法装下全部零件。这时你就需要根据零件对汽车的重要性来判断是否扔掉它。像车把手和雨刷这类琐碎的零件就可以考虑丢弃,而留下车轮和车架之类的重要部件。朋友收到包裹后,在没有任何提示的情况下,会对组装它感到困惑。但最终,你的朋友还是搭建好了它,并能识别出它是一辆可驾驶的汽车。只是他们不知道这辆车到底是赛车、小轿车还是越野车。

上面的例子形象的讲解了有损数据压缩算法。由于一些原始数据(如部分乐高积木块)的丢失,数据的质量没有保留完整。尽管使用PCA和Autoencoders算法进行降维是有损的,但就如同示例中进行特征选择一样,二者抛弃数据中的某些特征是为了保留更为重要的显著特征。

主成分分析

还是基于上述场景,假设一年过去了,你朋友的生日又快到了。你决定给他们买一辆乐高汽车,因为去年他们有告诉你非常喜欢你送的礼物。有了上次的经验,你不会再买一个小盒子了。这一次,你想着将乐高积木系统地分割成小块,使他们能够更好的装进盒子。上一次,由于天线太长了无法装进盒子,只能丢弃,而这一次你把它分割成了三等分再装进盒子。当你的朋友收到这份礼物时,他们会把一些零件粘合在一起从而对汽车进行组装。他们将扰流板和轮毂盖粘合在一起,这样一来,就很容易辨认这是一辆乐高汽车了。

1

主成分分析是一种用于降维的统计方法,它借助于一个正交变换,将其分量相关的原随机向量转化成其分量不相关的新随机向量,这在代数上表现为将原随机向量的协方差阵变换成对角形阵,在几何上表现为将原坐标系变换成新的正交坐标系,然后对多维变量进行降维处理,使之能以一个较高的精度转换成低维变量系统,再通过构造适当的价值函数,进一步把低维系统转化成一维系统。

1
Original Data (left) 1st Principal Component & Data (right)

主成分分析把给定的一组相关变量通过线性变换转成另一组不相关的变量,这些新的变量按照方差依次递减的顺序排列。在数学变换中保持变量的总方差不变,使第一变量具有最大的方差,称为第一主成分,第二变量的方差次大,并且和第一变量不相关,称为第二主成分。我们希望主成分朝向方差最大的方向,因为该方向上携带的原始数据信息多,预测结果将会更为准确。好比你想预测一辆汽车的价格,有两个属性:颜色和品牌。所有汽车颜色相同,只是品牌有差异。那么根据颜色来预测汽车的价格显然不行。但当我们考虑品牌这个特性时,便能更好的预测价格,毕竟奥迪和法拉利定价总高于本田和丰田。PCA产生的主要成分是输入变量的线性组合,就像粘合的乐高积木是原始积木的线性组合一样。这些主要组件的线性性质能帮助我们更好的理解转换后的数据。

1
Data projected onto 1st principal component (Source: Author)

主成分分析优点:

  1. 降低数据维度
  2. 易于理解
  3. 提升运行速度

主成分分析缺点:

  1. 无法学习非线性特征

自动编码器

1
Autoencoder Architecture

将自动编码器的思想融合进刚才的例子便稍显奇怪。由于盒子大小的限制,你可能不仅限于切割零件,甚至开始融化、拉长和弯曲部分零件,随之产生的零件能够代表汽车最重要的特性。这样做能让盒子中装入更多的乐高积木,甚至还能够创建属于你自己的乐高。但是当你朋友收到这个包裹时,却不知道如何处理这些乐高玩具。由于改装后的零件过于与众不同,以至于你需要用几辆车重复这个过程无数次,才能以一种系统的方式将原来的零件转换成可以由你的朋友组装成汽车的零件。
希望上面的类比能够帮助你更好的理解自动编码器和PCA。在自动编码器中,假设你是编码器,你的朋友是解码器,你的工作就是对数据进行转换,使得你的朋友能够最大程度的理解和重构解码前的数据。

自动编码器可以被看作是一种特殊的前馈神经网络,经过训练后能尝试将输入复制到输出。

自动编码器优点:

  1. 能够学习到非线性特性
  2. 降低数据维度

自动编码器缺点:

  1. 训练的计算成本高
  2. 可解释性较差
  3. 背后的数学知识复杂
  4. 容易产生过度拟合的问题,尽管可以通过引入正则化策略缓解

稀疏自动编码器

1
Sparse Autoencoder Loss Function (Source: Andrew Ng)

稀疏自动编码器的灵感来源于大脑中突触的稀疏。整个神经网络中隐藏的神经元会挖掘输入数据的特征。普通的自动编码器通过不完全的架构(不完全是指隐藏层的神经元个数比输入层少)学习潜在特征。稀疏自动编码器的思想是,通过一个与架构无关的约束——稀疏约束来学习潜在的特征。

稀疏约束是通过设置ρ的值,通常是一个接近于零的值,使神经元的激活值较小。公式中的ρ是一个稀疏参数,ρ hat j为隐藏单位j的平均激活值。

我们通过添加由KL散度和权重β组成的惩罚项来最优化目标函数。KL散度度量了两个分布的不同。在损失函数中加入这一项可以激励模型优化参数,使激活值分布与稀疏参数分布之间的KL散度尽可能小。

通过让激活值更大程度趋近于零以使神经元处于抑制状态,只在关键的时候触发,从而提高准确性。

总结

本文深入讲解了PCA和自动编码器的相关概念。多数情况下,相较自动编码器,PCA优势更为明显——执行速度更快,易于解释,缓解维度灾难。但如果您需要挖掘数据的非线性特性,应首选自动编码器。值得注意的是,自动编码器通过挖掘潜在特性提高模型性能,但这些模糊的特性或许会对知识发现的结果产生不良影响。

以上为译文

本文由阿里云云栖社区组织翻译。

文章原标题《PCA & Autoencoders: Algorithms Everyone Can Understand》,作者:Thomas Ciha,译者:Elaine,审校:袁虎。

文章为简译,更为详细的内容,请查看原文

相关文章
|
机器学习/深度学习 数据可视化 TensorFlow
一文入门卷积神经网络:CNN通俗解析
CNN基础知识介绍及TensorFlow具体实现,对于初学者或者求职者而言是一份不可多得的资料。
19549 0
|
算法 决策智能 C++
干货 |【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例
干货 |【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例
824 0
|
存储 XML Java
SharedPreferences的通俗解析:
SharedPreferences的通俗解析: 很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友。对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件进行保存。
917 0
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
67 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
76 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0
|
2月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
65 0
|
2月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
85 0
|
13天前
|
PyTorch Shell API
Ascend Extension for PyTorch的源码解析
本文介绍了Ascend对PyTorch代码的适配过程,包括源码下载、编译步骤及常见问题,详细解析了torch-npu编译后的文件结构和三种实现昇腾NPU算子调用的方式:通过torch的register方式、定义算子方式和API重定向映射方式。这对于开发者理解和使用Ascend平台上的PyTorch具有重要指导意义。
|
18天前
|
缓存 监控 Java
Java线程池提交任务流程底层源码与源码解析
【11月更文挑战第30天】嘿,各位技术爱好者们,今天咱们来聊聊Java线程池提交任务的底层源码与源码解析。作为一个资深的Java开发者,我相信你一定对线程池并不陌生。线程池作为并发编程中的一大利器,其重要性不言而喻。今天,我将以对话的方式,带你一步步深入线程池的奥秘,从概述到功能点,再到背景和业务点,最后到底层原理和示例,让你对线程池有一个全新的认识。
47 12

推荐镜像

更多