深度学习入门:用MNIST完成Autoencoder(续)

简介:

640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=

其实通常情况下,Autoencoder做数据压缩,性能并不怎么样。以图片压缩为例,想要训练一个能和JPEG性能相提并论的自编码器非常困难,并且要达到这个性能,你还必须要把图片的类型限定在很小的一个范围内(例如JPEG不怎么行的某类图片)。自编码器依赖于数据的特性使得它在面对真实数据的压缩上并不可行,你只能在指定类型的数据上获得还可以的效果,但谁知道未来会有啥新需求?在实际应用中用的很少,2012年人们发现在卷积神经网络中使用自编码器做逐层预训练可以训练深度网络,但很快人们发现良好的初始化策略在训练深度网络上要比费劲的逐层预训练有效得多,2014年出现的Batch Normalization技术使得更深的网络也可以被有效训练,到了2015年底,通过使用残差学习(ResNet)我们基本上可以训练任意深度的神经网络。

变分自编码器(Variational autoencoder,VAE)

VAE是更年轻也更有趣的一种Autoencoder,它为码字施加约束,使得编码器学习到输入数据的隐变量模型。在章末的Reference部分有VAE的ArXiv原文,有兴趣的同学可以去了解一下,不过论文这种东西面向对象毕竟不是所有人,使得有些同学读起来有点累,虽然VAE的文章很多,我在这里简单介绍一下我的理解。

VAE和GAN同是生成模型(Generative Models)。而所有的生成模型都是定义在一些潜藏高位空间数据点X的概率分布640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=,而生成模型(Generative Models)就是在X附近产生一个差不多接近X的值。如果你想装逼的话,可以这么念:“一个向量在其高维空间640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=内有一个潜变量,这个能够让我们依据概率密度函数(PDF)(他真的叫PDF)来定义640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=”——总之就是很不像人话。GAN源于博弈论(Game Theory),是为了找到生成网络和对抗网络之间的纳什均衡(Nash Equilibrium),意思就是同一时间内每个参与人的策略是对其他参与人策略的最优反应,你们可以理解成一个聪明的好人和一个聪明的坏人单挑,他们最坏的就是“鱼死网破”,而纳什均衡是能让他们双方收益最高的一个反应或者说决策。比如说坏人好人打架,有一个和事佬说,“你们不要打架不要打架”毕竟如果实力差不多的话,两方打起来的结果哪一方都不会讨好,在这里,不打架似乎损失是0,而各种打之类的都会造成损失,因此此时不打架就是好的,就是双方收益最高,就是纳什均衡了。GAN在Training部分与VAE有比较大的区别,毕竟VAE源于贝叶斯推理,对数据的概率分布进行建模,然后从这个分布中获得新的数据。

在这里不给大家引入大量的数学公式和证明,就给大家说一个小故事,来理解。

我先举一个例子:首先让你猜一个东西(data),比如说我让你猜一个动物,这个动物有四只脚,会游泳——刷刷刷的啥河马啥鸭嘴兽都出来了。

在我们猜这个动物是啥玩意的过程呢,我们的想象的对象比如河马啦鸭嘴兽啦,就是一个Latent Variable(实在不知道该如何翻译。。。)

首先我为了猜到河马或者鸭嘴兽这个答案,我们首先要缩小范围,我们不能瞎猜猜什么飞机大炮的,而是动物,然后我们的大脑就去思考动物了,但是问题是,假如你不知道是动物呢?在VAE中,我们用贝叶斯推理常用到的变分推理(Variational Inference),VI的先进性比MCMC(Markov Chain Monte Carol)是好很多。用KL divergence来判定一个分布与另一个分布的差异性,也就是说,KL Divergence可以判定人与人的差异和人与狗的差异。在我们不知道那个结果是什么的时候,在这里,也就是我们不知道那是动物这个集合的时候,我们可以用植物、无机物这些集合去和我们的目标进行比较。在真实世界,这个比较的动作其实很快,电光火石之间对比完事儿,Cell的那篇著名的Paper告诉我们人脸识别只有200多个细胞,而我们的算法。。。别提了。。。也算是真实世界与数学的逻辑世界的一点小小的不同吧。这一点我可能解释的不太好,还请有关大佬能告知我的错误。通过这种方式我们能够。。又好又快的得到我们想要的集合?

对,VAE玩了一个“大概”,要不怎么我猜猜猜,猜到最后可以出犀牛和鸭嘴兽呢?但是这并没有影响VAE在一个高水平、高容量的model里面表现出色。

VAE当然难度与Autoencoder相比更大了许多,如果只用Tensorflow的话,洋洋洒洒写了一百来行(主要是自身水平有限),放在这里就有一种水文的感觉,有兴趣的童鞋可以来Github上看一看。



原文发布时间为:2017-08-10
本文作者:那只猫
本文来自云栖社区合作伙伴“ Python中文社区”,了解相关信息可以关注“ Python中文社区”微信公众号
相关文章
|
13天前
|
机器学习/深度学习 自然语言处理 物联网
深度学习入门:从理论到实践新技术趋势与应用:探讨新兴技术如区块链、物联网、虚拟现实等的发展趋势和应用场景
【8月更文挑战第30天】本文将介绍深度学习的基本原理和实践应用。我们将从深度学习的定义、历史和发展开始,然后深入探讨其工作原理和关键技术。接着,我们将通过一个简单的代码示例来展示如何实现深度学习模型。最后,我们将讨论深度学习在现实世界中的应用和挑战。无论你是初学者还是有经验的开发者,这篇文章都将为你提供深度学习的全面理解。
|
12天前
|
机器学习/深度学习 人工智能 自动驾驶
深度学习中的卷积神经网络(CNN)入门
【8月更文挑战第31天】在人工智能的璀璨星空中,卷积神经网络(CNN)如同一颗耀眼的星辰,以其卓越的图像处理能力在深度学习领域熠熠生辉。本文将带你领略CNN的魅力,从其结构原理到实战应用,深入浅出地探索这一技术的奥秘。我们将通过Python代码片段,一起实现一个简单的CNN模型,并讨论其在现实世界问题中的应用潜力。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇通往深度学习世界的大门。
|
15天前
|
数据采集 机器学习/深度学习 人工智能
Python爬虫入门指南探索AI的无限可能:深度学习与神经网络的魅力
【8月更文挑战第27天】本文将带你走进Python爬虫的世界,从基础的爬虫概念到实战操作,你将学会如何利用Python进行网页数据的抓取。我们将一起探索requests库和BeautifulSoup库的使用,以及反爬策略的应对方法。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你打开一扇通往数据抓取世界的大门。
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的卷积神经网络(CNN)入门
【8月更文挑战第31天】在人工智能的浪潮中,深度学习以其强大的数据处理能力成为时代的宠儿。本文将引导你走进深度学习的核心组件之一——卷积神经网络(CNN),并带你一探其背后的奥秘。通过简明的语言和直观的代码示例,我们将一起构建一个简易的CNN模型,理解它在图像处理领域的应用,并探索如何利用Python和TensorFlow实现它。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇通往深度学习世界的大门。
|
11天前
|
机器学习/深度学习 自动驾驶 算法框架/工具
深度学习中的卷积神经网络(CNN)入门
【8月更文挑战第31天】 本文旨在通过浅显易懂的方式,引导初学者步入卷积神经网络(CNN)的神秘世界。我们将从CNN的基础概念出发,逐步深入到其在图像处理中的应用实例,最后通过一个简单的Python代码示例,展示如何实现一个基础的CNN模型。无论你是编程新手还是深度学习领域的初探者,这篇文章都将为你打开一扇了解和掌握CNN的大门。
|
11天前
|
机器学习/深度学习 人工智能 算法
深度学习中的卷积神经网络(CNN)入门
【8月更文挑战第31天】 在探索人工智能的奥秘时,我们常常被其背后的复杂算法所迷惑。本文旨在以浅显易懂的语言,带你走进深度学习的世界,特别是卷积神经网络(CNN)这一核心概念。我们将一起了解CNN的基本结构,它是如何工作的,以及为什么它在图像识别领域如此强大。通过简单的代码示例,你将学会如何搭建一个简单的CNN模型,并在自己的数据集上进行实验。无论你是编程新手还是深度学习初学者,这篇文章都将为你打开一扇通往高级人工智能应用的大门。
|
11天前
|
机器学习/深度学习 人工智能 TensorFlow
深度学习中的卷积神经网络(CNN)入门指南
【8月更文挑战第31天】本文旨在通过简明的语言和直观的代码示例,引导初学者理解并实践卷积神经网络(CNN)的基础概念。我们将从CNN的基本结构出发,逐步深入到构建一个简单的CNN模型,并在流行的深度学习框架TensorFlow中实现它。文章将用通俗易懂的方式解释复杂的技术概念,帮助读者建立起对CNN工作原理的初步认识,同时提供足够的信息以鼓励进一步的探索和学习。
|
14天前
|
机器学习/深度学习 Java TensorFlow
深度学习中的图像识别:从理论到实践Java中的多线程编程入门指南
【8月更文挑战第29天】本文将深入探讨深度学习在图像识别领域的应用,从基础理论到实际应用案例,带领读者一步步理解如何利用深度学习技术进行图像识别。我们将通过一个简单的代码示例,展示如何使用Python和TensorFlow库实现一个基本的图像识别模型。无论你是初学者还是有一定经验的开发者,都能从中获得启发和学习。 【8月更文挑战第29天】在Java世界里,线程是程序执行的最小单元,而多线程则是提高程序效率和响应性的关键武器。本文将深入浅出地引导你理解Java多线程的核心概念、创建方法以及同步机制,帮助你解锁并发编程的大门。
|
14天前
|
机器学习/深度学习 PyTorch 测试技术
深度学习入门:使用 PyTorch 构建和训练你的第一个神经网络
【8月更文第29天】深度学习是机器学习的一个分支,它利用多层非线性处理单元(即神经网络)来解决复杂的模式识别问题。PyTorch 是一个强大的深度学习框架,它提供了灵活的 API 和动态计算图,非常适合初学者和研究者使用。
25 0
|
2月前
|
机器学习/深度学习 并行计算 数据挖掘
🎓PyTorch深度学习入门课:编程小白也能玩转的高级数据分析术
【7月更文挑战第29天】踏入深度学习世界,新手也能用PyTorch解锁高级数据分析。
22 2