生成模型之生成器

2024-09-04 07:36
文章标签 模型 生成 生成器

本文主要是介绍生成模型之生成器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        生成模 型中网络会被作为一个生成器(generator)来使用。具体来说,在模型输入时会将一个随机 变量z 与原始输入x一并输入到模型中,这个变量是从随机分布中采样得到。输入时可以采 用向量拼接的方式将x和z一并输入,或在x、z 长度一样时,将二者的加和作为输入。这 个变量z 特别之处在于其非固定性,即每一次我们使用网络时都会从一个随机分布中采样得 到一个新的z。通常,我们对于该随机分布的要求是其足够简单,可以较为容易地进行采样, 或者可以直接写出该随机分布的函数,例如高斯分布(Gaussian distribution)、均匀分布 (uniform distribution)等等。所以每次有一个输入 x 的同时,我们都从随机分布中采样得 到z,来得到最终的输出y。随着采样得到的z 的不同,我们得到的输出y 也会不一样。同 理,对于网络来说,其输出也不再固定,而变成了一个复杂的分布,我们也将这种可以输出一 个复杂分布的网络称为生成器,如图 1所示。

图1 生成器示意图 

        下面我们介绍如何训练这个生成器。首先,我们为什么要需要训练生成器,为什么需要输 出一个分布呢?下面介绍一个视频预测的例子,即给模型一段的视频短片,然后让它预测接下 来发生的事情。视频环境是小精灵游戏,预测下一帧的游戏画面,如图 2所示。

图2 视频预测例子——以小精灵游戏为例

        要预测下一帧的游戏画面,我们只需要输入给网络过去几帧游戏画面。要得到这样的训 练数据很简单,只需要在玩小精灵的同时进行录制,就可以训练我们的网络,只要让网络的输 出y,与我们的真实图像越接近越好。当然在实践中,我们为了保证高效训练,我们会将每一 帧画面分割为很多块作为输入,并行分别进行预测。我们接下来为了简化,假设网络是一次性 输入的整个画面。如果我们使用前几章介绍的基于监督学习的训练方法,我们得到的结果可 能会是的十分模糊的甚至游戏中的角色消失、出现残影的,如图 3所示。

图3 基于监督学习的小精灵游戏的预测值

        造成该问题的原因是,我们监督学习中的训练数据对于同样的转角同时存储有角色向左 转和向右转两种输出。当我们在训练的时候,对于一条向左转的训练数据,网络得到的指示就 是要学会游戏角色向左转的输出。同理,对于一条向右转的训练数据,网络得到的指示就是学 会角色向右转的输出。但是实际上这两种数据可能会被同时训练,所以网络就会学到的是“两 面讨好”。当这个输出同时距离向左转和向右转最近,网络就会得到一个错误的结果———— 向左转是对的,向右转也是对的。

        所以我们应该如何解决这个问题呢?答案是让网络有概率的输出一切可能的结果,或者 说输出一个概率的分布,而不是原来的单一的输出,如图 4 所示。当我们给网络一个随机 分布时,网络的输入会加上是一个z,这时输出就变成了一个非固定的分布,其包含了向左转和向右转的可能。举例来说,假设我们选择的z服从一个二项分布,即就只有0和1并且各 占50%。那么我们的网络就可以学到z采样到1的时候就向左转,采样到0的时候就向右转, 这样就可以解决了。

图4 基于生成模型的小精灵游戏的预测结果

        回到生成器的讨论中,我们什么需要这类的生成模型呢?答案是当我们的任务需要“创造 性”的输出,或者我们想知道一个可以输出多种可能的模型,且这些输出都是对的模型的时候。 这可以类比于,让很多人一起处理一个开放式的问题,或者是头脑风暴,大家的回答五花八门 可以各自发挥,但是回答都是正确的。所以生成模型也可以被理解为让模型自己拥有了创造 的能力。再举两个更具体的例子,对于画图,假设画一个红眼睛的角色,那每个人可能画出来 或者心中想的动画人物都不一样。对于聊天机器人,它也需要有创造力。比如我们对机器人 说,你知道有哪些童话故事吗?聊天机器人会回答安徒生童话、格林童话甚至其他的,没有一 个标准的答案。所以对于我们的生成模型来说,其需要能够输出一个分布,或者说多个答案。 当然在生成模型中,非常知名的就是生成式对抗网络(generative adversarial network), 我们通常缩写为GAN。这一节我们就讲介绍这个生成对抗网络。

        我们通过让机器生成动画人物的面部来形象地介绍GAN,首先介绍的是无限制生成(un conditional generation),也就是我们不需要原始输入 x。其对应的就是需要原始输入 x 的条件型生成(conditional generation)。如图 5 所示,对于无限制的 GAN,它的唯一 输出就是z,这里假设为正态分布采样出的向量。其通常是一个低维的向量,例如50、100的 维度。

图5 基于无限制生成的GAN

        我们首先从正态分布中采样得到一个向量z,并输入到生成器中,生成器会给我们一个对 应的输出——一个动漫人物的脸。我们聚焦一下生成器输出一个动漫人物面部的过程。其实 很简单,一张图片就是一个高维的向量,所以生成器实际上做的事情就是输出一个高维的向 量,比如是一个64×64 的图片(如果是彩色图片那么输出就是64×64×3)。当输入的向量z 不同的时候,生成器的输出就会跟着改变,所以我们从正态分布中采样出不同的z,得到的输 出y 也就会不同,动漫人脸照片也不同。当然,我们也可以选择其他的分布,但是根据经验,分布之间的差异可能并没有非常大。大家可以找到一些文献,并且尝试去探讨不同的分布之 间的差异。我们这里选择正态分布是因为其简单且常见,而且生成器自己会想方设法把这个 简单的分布对应到一个更复杂的分布。所以我们后续的讨论都以正态分布为前提。

这篇关于生成模型之生成器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135395

相关文章

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

SpringBoot集成iText快速生成PDF教程

《SpringBoot集成iText快速生成PDF教程》本文介绍了如何在SpringBoot项目中集成iText9.4.0生成PDF文档,包括新特性的介绍、环境准备、Service层实现、Contro... 目录SpringBoot集成iText 9.4.0生成PDF一、iText 9新特性与架构变革二、环

idea-java序列化serialversionUID自动生成方式

《idea-java序列化serialversionUID自动生成方式》Java的Serializable接口用于实现对象的序列化和反序列化,通过将对象转换为字节流来存储或传输,实现Serializa... 目录简介实现序列化serialVersionUID配置使用总结简介Java.io.Seripyth

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

Java领域模型示例详解

《Java领域模型示例详解》本文介绍了Java领域模型(POJO/Entity/VO/DTO/BO)的定义、用途和区别,强调了它们在不同场景下的角色和使用场景,文章还通过一个流程示例展示了各模型如何协... 目录Java领域模型(POJO / Entity / VO/ DTO / BO)一、为什么需要领域模

C#自动化生成PowerPoint(PPT)演示文稿

《C#自动化生成PowerPoint(PPT)演示文稿》在当今快节奏的商业环境中,演示文稿是信息传递和沟通的关键工具,下面我们就深入探讨如何利用C#和Spire.Presentationfor.NET... 目录环境准备与Spire.Presentation安装核心操作:添加与编辑幻灯片元素添加幻灯片文本操

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)

《Python实现Word文档自动化的操作大全(批量生成、模板填充与内容修改)》在职场中,Word文档是公认的好伙伴,但你有没有被它折磨过?批量生成合同、制作报告以及发放证书/通知等等,这些重复、低效... 目录重复性文档制作,手动填充模板,效率低下还易错1.python-docx入门:Word文档的“瑞士

使用python生成固定格式序号的方法详解

《使用python生成固定格式序号的方法详解》这篇文章主要为大家详细介绍了如何使用python生成固定格式序号,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录生成结果验证完整生成代码扩展说明1. 保存到文本文件2. 转换为jsON格式3. 处理特殊序号格式(如带圈数字)4

Java使用Swing生成一个最大公约数计算器

《Java使用Swing生成一个最大公约数计算器》这篇文章主要为大家详细介绍了Java使用Swing生成一个最大公约数计算器的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下... 目录第一步:利用欧几里得算法计算最大公约数欧几里得算法的证明情形 1:b=0情形 2:b>0完成相关代码第二步:加