Python深度学习(使用 LSTM 生成文本)--学习笔记(十八)

第8章 生成式深度学习

  • 人工智能模拟人类思维过程的可能性,并不局限于被动性任务(比如目标识别)和大多数反应性任务(比如驾驶汽车),它还包括创造性活动。
  • 的确,到目前为止,我们见到的人工智能艺术作品的水平还很低。人工智能还远远比不上人类编剧、画家和作曲家。但是,替代人类始终都不是我们要谈论的主题,人工智能不会替代我们自己的智能,而是会为我们的生活和工作带来更多的智能,即另一种类型的智能。在许多领域,特别是创新领域中,人类将会使用人工智能作为增强自身能力的工具,实现比人工智能更加强大的智能。
  • 很大一部分的艺术创作都是简单的模式识别与专业技能。这正是很多人认为没有吸引力、甚至可有可无的那部分过程。这也正是人工智能发挥作用的地方。我们的感知模式、语言和艺术作品都具有统计结构。学习这种结构是深度学习算法所擅长的。机器学习模型能够对图像、音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出于模型在训练数据中所见到的艺术作品具有相似特征的新作品。当然,这种采样本身并不是艺术创作行为。它只是一种数学运算,算法并没有关于人类生活、人类情感或我们人生经验的基础知识;相反,它从一种与我们的经验完全不同的经验中进行学习。作为人类旁观者,只能靠我们的解释才能对模型生成的内容赋予意义。但在技艺高超的艺术家手中,算法生成可以变得非常有意义,并且很美。潜在空间采用会变成一支画笔,能够提高艺术家的能力,增强我们的创造力,并拓展我们的想象空间。此外,它也不需要专业技能和练习,从而让艺术创作变得更加容易。它创造了一种纯粹表达的新媒介,将艺术与技巧相分离。

8.1 使用LSTM生成文本

  • 本节将会探讨如何将循环神经网络用于生成序列数据。我们将以文本生成为例,但同样的技术也可以推广到任何类型的序列数据,你可以将其应用于音符序列来生成新音乐,也可以应用于笔画数据的时间序列(比如,艺术家在iPad上绘画时记录的笔画数据)来一笔一笔地生成绘画,以此类推。
  • 序列数据生成绝不限于艺术内容生成。它已经成功应用于语音合成和聊天机器人的对话生成。Google于2016年发布的Smart Reply(智能回复)功能,能够对电子邮件或短信自动生成一组快速回复,采用的也是相似的技术。
8.1.2 如何生成序列数据
  • 用深度学习生成序列数据的通用方法,就是使用前面的标记作为输入,训练一个网络(通常是循环神经网络或卷积神经网络)来预测序列中接下来的一个或多个标记。例如,给定输入the cat is on the ma,训练网络来预测目标t,即下一个字符。与前面处理文本数据时一样,标记(token)通常是单词或字符,给定前面的标记,能够对下一个标记的概率进行建模的任何网络都叫作语言模型(language model)。语言模型能够捕捉到语言的潜在空间(latent space),即语言的统计结构。
  • 一旦训练好了这样一个语言模型,就可以从中采样(sample,即生成新序列)。向模型中输入一个初始文本字符串(即条件数据(conditioning data)),要求模型生成下一个字符或下一个单词(甚至可以同时生成多个标记),然后将生成的输出添加到输入数据中,并多次重复这一过程。这个循环可以生成任意长度的序列,这些序列反映了模型训练数据的结构,它们与人类书写的句子几乎相同。在本节的示例中,我们将会用到一个LSTM层,向其输入从文本语料中提取的 N N N个字符组成的字符串,然后训练模型来生成第 N + 1 N+1 N+1个字符。模型的输出是对所有可能的字符做softmax,得到下一个字符的概率分布。这个LSTM叫作字符级的神经语言模型(character-level neural language model)。
8.1.3 采样策略的重要性
  • 生成文本时,如何选择下一个字符至关重要。一种简单的方法是贪婪采样(greedy sampling),就是始终选择可能性最大的下一个字符。但这种方法会得到重复的、可预测的字符串,看起来不像是连贯的语言。一种更有趣的方法是做出稍显意外的选择:在采样过程中引入随机性,即从下一个字符的概率分布中进行采样。这叫作随机采样(stochastic sampling, stochasticity在这个领域中就是“随机”的意思)。在这种情况下,根据模型结果,如果下一个字符是e的概率为0.3,那你会有30%的概率选择它。注意,贪婪采样也可以被看作从一个概率分布中进行采样,即某个字符的概率为1,其他所有字符的概率都是0。
  • 从模型的softmax输出中进行概率采样是一种很巧妙的方法,它甚至可以在某些时候采样到不常见的字符,从而生成看起来更加有趣的句子,而且有时会得到训练数据中没有的、听起来像是真实存在的新单词,从而表现出创造性。但这种方法有一个问题,就是它在采样过程中无法控制随机性的大小。
  • 为什么需要有一定的随机性?考虑一个极端的例子-纯随机采样,即从均匀概率分布中抽取下一个字符,其中每个字符的概率相同。这种方案具有最大的随机性,换句话说,这种概率分布具有最大的熵。当然,它不会生成任何有趣的内容。再来看另一个极端-贪婪采样。贪婪采样也不会生成任何有趣的内容,他没有任何随机性,即相应的概率分布具有最小的熵。从“真实”概率分布(即模型softmax函数输出的分布)中进行采样,是这两个极端之间的一个中间点。但是,还有许多其他中间点具有更大或更小的熵,你可能希望都研究一下。更小的熵可以让生成的序列具有更加可预测的结构(因此可能看起来更真实),而更大的熵会得到更加出入意料且更有创造性的序列。从生成式模型中进行采样时,在生成过程中探索不同的随机性大小总是好的做法。我们人类是生成数据是否有趣的最终判断者,所以有趣是非常主观的,我们无法提前知道最佳熵的位置。
  • 为了在采样过程中控制随机性的大小,我们引入一个叫作softmax温度(softmax temperature)的参数,用于表示采样概率分布的熵,即表示所选择的下一个字符会有多么出人意料或多么可预测。给定一个temperature值,将按照下列方法对原始概率分布(即模型的softmax输出)进行重新加权,计算得到一个新的概率分布。
# 对于不同的softmax温度,对概率分布进行重新加权

import numpy as np

# original_distribution是概率值组成的一维Numpy数组,这些概率值之和必须等于1。temperature是一个因子,用于定量描述输出分布的熵。
def reweight_distribution(original_distribution, temperature=0.5):
    distribution = np.log(original_distribution) / temperature
    distribution = np.exp(distribution)
 

你可能感兴趣的:(深度学习,神经网络,深度学习)