第5章〓模型体系结构基于第4章中的基本概念,现在看一个实际问题: 能否使用深度学习的模型预测比特币的价格?本章将介绍如何构建一个基于深度学习的模型以预测比特币的价格。本章结束时,将把所有模型组件组合在一起,初步构建一个完整的深度学习应用程序。
本章结束时,您将能够: 
 为深度学习模型准备数据;
 选择正确的模型架构;
 使用Keras(一个TensorFlow抽象库);
 用经过训练的模型进行预测。
5.1选择合适的模型体系结构
基于深度学习的研究是一项充满活力的研究。除此之外,研究人员也致力于开发新的神经网络体系结构。这些体系结构既可以解决新问题,也可以提高以前实现的体系结构的性能。本节内容将从新的体系结构和过去实现的体系结构两个方面展开。
早期实现的体系结构已经解决了大量问题,并且在开始新项目时也通常被作为合适的体系结构。较新的体系结构在特定问题上取得了巨大成功,但很难推广。有趣的是,新的体系结构可以作为下一步探索的参考,但在开始一个工程项目时,它却并不是适宜的选择。
5.1.1常见的体系结构
考虑到体系结构的多样性,目前有两种流行的体系结构,即卷积神经网络(Convolutional Neural Networks,CNN)和递归神经网络(Recurrent Neural Networks,RNN),许多应用程序是基于它们实现的,它们都是基础的神经网络,并且都可以作为大多数项目的基础。本章还会介绍另外三个网络(出于它们在该领域的相关性): 长短期记忆网络(LongShort Term Memory,LSTM,一种RNN变体)、对抗生成网络(Generative Adversarial Networks,GAN)和深度强化学习(Deep Reinforcement Learning)。这三种体系结构在解决现实问题时取得了巨大成功,但使用起来有些困难。
1. 卷积神经网络
卷积神经网络已经因处理类似网格结构的问题而声名狼藉译者注: 此句为原文直译。其实,卷积神经网络在很多应用场合的性能是不错的。,它最初是用来分类图像的,但在许多其他领域,例如从语音识别到自动驾驶,它们都得到了应用。
CNN的本质是将密切相关的数据作为训练过程的一个要素,而不仅仅是单个数据输入,这种思想在图像方面尤其有效。在图像中,一个像素右侧的邻近像素也与该像素相关,因为它们共同构成了又一个更大的组合。在这种情况下,该组合就是神经网络训练预测的内容。因此,将几个像素组合在一起考虑比单独使用单个像素处理要更好一些。
图51所示过程的数学表示称为卷积(convolution)。
图51卷积过程图解(图片来源: Volodymyr Mnih等)
如果想了解更多信息,请参阅《自然》杂志于2015年2月发表的题为Humanlevel control through deep reinforcement learning的文章,详见: https://storage.googleapis.com/deepmindmedia/dqn/DQNNaturePaper.pdf。2. 递归神经网络
卷积神经网络与一组输入一起工作,这些输入不断地更新网络各个层和节点的权重和偏差。这种方法的局限性是: 在确定如何改变网络的权重和偏差时,其架构忽略了这些输入的顺序。
递归神经网络就是为了解决这个问题而提出的。RNN旨在处理序列数据,这意味着在每个epoch中,每层都会受到前几层输出的影响。在给定的序列中,先前观察的记忆会在后验观察的评估中起作用。
由于上述问题具有时序性,因此RNN在语音识别中得到了成功的应用。此外,RNN也用于翻译问题。Google翻译目前所用的算法Transformer就使用了RNN,即将文本从一种语言翻译成另一种语言。如果想了解更多信息,请参阅Google Research Blog上由Jakob Uszkoreit于2017年8月发表的题为Transformer: A Novel Neural Network Architecture for Language Understanding的文章,详见: https://ai.googleblog.com/2017/08/transformernovelneuralnetwork.html。如图52所示,根据单词出现在句子中的位置,英语单词与法语单词是相关的,因此RNN在语言翻译问题中非常流行。
图52distill.pub图解(图片来源: https://distill.pub/2016/augmentedrnns/)
长短期记忆网络是为解决梯度消失问题而创建的RNN变体。梯度消失问题是由距离当前步骤较远的记忆单元所引起的,且某些记忆单元由于距离较远而导致其接受的权重较低。LSTM是RNN的变体,其包含一种称为遗忘门(forget gate)的记忆单元,该组件可用于评估近期元素和旧元素对权重和偏差的影响,具体取决于序列中观察点的位置。有关LSTM的详细信息请参阅Sepp Hochreiter和Jürgen Schmidhuber在1997年首次提出的LSTM架构。目前,LSTM架构的实现已经进行了多次修改。关于LSTM的每个组件的工作原理的详细数学解释,建议参考2015年8月由Christopher Olah撰写的题为Understanding LSTM Networks的文章,详见: http://colah.github.io/posts/201508UnderstandingLSTMs/。3. 对抗生成网络
对抗生成网络是由Ian Goodfellow及其蒙特利尔大学的同事于2014年发明的。GAN认为,与其用一个神经网络优化权重和偏差以使其误差最小化,不如建立两个相互博弈的神经网络以达到同样的目的。有关GAN的详细信息请参阅Ian Goodfellow等人于2014年6月10日在arXiv上发表的题为Generative Adversarial Networks的文章。详见: https://arxiv.org/abs/1406.2661。GAN有一个用于生成新数据(即“假”数据)的网络(即生成网络)和一个评估网络生成的数据的“真或假”可能性的网络(即辨别网络)。两种网络不断学习并互相博弈: 一个网络学习如何更好地生成“假”数据;另一个网络学习如何区分得到的数据的真假。当评估生成数据的网络(即辨别网络)不再能够区分数据的“真假”时,两个网络将在每个epoch中都进行迭代,直至两者都收敛。
GAN已经成功应用于数据具有明确拓扑结构的领域。GAN最初实现的是生成物体、人脸和动物的合成图像,并且这些图像都与这些事物的真实图像相似,如图53所示。图像生成是GAN最常用的领域,但在研究论文中,GAN在其他领域的应用也会偶尔出现。
图53 基于给定情感的不同GAN算法在改变人的面部表情方面的效果图
(图片来源:StarGANs Project,详见: https://github.com/yunjey/StarGAN)4. 深度强化学习
最初的深度强化学习(Deep Reinforcement Learning,DRL)体系结构是由位于英国的Google公司旗下的人工智能研究机构的DeepMind提出的。
DRL网络的核心思想是: 神经网络在本质上是无监督的,是从反复试验中学习的,并且只对激励函数进行优化。也就是说,不同于其他神经网络(它们使用有监督的方法优化预测的错误,而不是已知的正确方法),DRL网络不知道解决问题的正确方法。神经网络被简单地赋予了一个系统的规则,然后它在每次正确执行一个函数后都会得到奖励。这个过程需要大量的迭代,最终由于它在许多任务中的卓越表现而使训练网络脱颖而出。更多有关信息,请参阅在《自然》上由Volodymyr Mnih等人于2015年2月发表的题为Humanlevel control through deep reinforcement learning的文章,详情请见: https://storage.googleapis.com/deepmindmedia/dqn/DQNNaturePaper.pdf。深度强化学习模型在DeepMind创建了AlphaGo(一个比专业玩家玩游戏玩得还好的系统)之后逐渐流行起来。DeepMind还创建了DQN算法,可以学习如何完全依靠自己并以超人的水平玩电子游戏,如图54和表51所示。
图54DQN算法工作方式图
更多有关信息,请参阅DeepMind所创建的用来击败Atari游戏的DQN算法,该算法采用一种深度强化学习解决方案以不断增加其奖励。图片来源: https://keon.io/deepqlearning/。表51不同的神经网络体系结构在不同的应用领域都取得了成功,
采用的神经网络的体系结构通常与当前问题的结构有关结构数 据 结 构成 功 应 用卷积神经网络(CNN)网格状拓扑结构(即图像)图像识别和分类递归神经网络(RNN)和长短期记忆网络(LSTM)序列数据(即时间序列数据)语音识别、文本生成和翻译生成对抗网络(GANs)网格状拓扑结构(即图像)图像生成深度强化学习(DRL)规则清晰、激励函数明确的系统电子游戏和自动驾驶5.1.2数据标准化
在构建深度学习模型之前,还需要进行数据标准化。
数据标准化是机器学习系统中的一种常见做法,特别是在神经网络方面。研究人员提到,对于训练RNN和LSTM的神经网络来说,数据标准化是一项十分重要的技术,因为它减少了网络的训练时间并提高了网络的整体性能。有关更多信息,请参阅Sergey Ioffe等人于2015年3月发表于arXiv上的题为Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift的文章。详见: https://arxiv.org/abs/1502.03167。应当根据不同数据和问题决定采用哪一种标准化技术,下面介绍一些常用的标准化技术。
1. Zscore标准化译者注: 有的文献称之为零均值规范化、标准差标准化。经过处理的数据均值为0,标准差为1,它描述的是“给定数据距离其均值有多少个标准差”,在均值上的数据会得到一个正的标准化分数,反之则会得到一个负的标准化分数。引自: https://blog.csdn.net/weixin_38706928/article/details/80329563。
当数据呈正态分布(即高斯分布)时,可以将每个观测值之间的距离计算为与其平均值的标准差。
Zscore标准化方法适用于含有超出取值范围的数据的离散数据,定义如下: zi=xi-μσ其中,xi是第i个观测值,μ是平均值,σ是总体标准差。有关更多信息,请参阅Wikipedia中题为Standard score的文章,详见: https://en.wikipedia.org/wiki/Standard_score。2. PointRelative标准化
这种标准化方法是计算给定的观测值相对于序列的第一个观测值的差异,它对于确定与起点相关的趋势很有用。PointRelative标准化的定义如下。ni=OiO0-1其中,Oi是第i个观测值,O0是该序列的第一个观测值。 Siraj Raval在其名为How to Predict Stock Prices Easily Intro to Deep Learning #7的视频中介绍了相关内容,视频可在YouTube上获取: https://www.youtube.com/watch?v=ftMq5ps503w。3. MinMax标准化译者注: 有的文献称之为最小最大标准化方法,这是一种将原始数据线性化转换到[0,1]的方法。
MinMax标准化方法计算的是给定观测值与序列中的最大值和最小值之间的距离,其在处理最大值和最小值不是异常值以及对于将来的预测很重要的序列时非常有用。
MinMax标准化的定义如下。ni=oi-min(O)max(O)-min(O)其中,oi是第i个观测点,O表示具有所有O值的向量,函数min(O)和max(O)分别表示该序列中的最小值和最大值。
本书将在5.1.4节的实例“探索比特币数据集以及为模型准备数据”中准备可用的比特币数据,以便在LSTM架构下使用。实例中包括选择必要变量、选择相关的时间段以及采用PointRelative标准化技术。
5.1.3构建您的问题
与研究人员相比,在开始一个新的深度学习项目时,实践人员往往花费更少的时间决定选择哪种体系结构。在开发这类系统时,最重要的考虑因素是获取能够正确表示给定问题的数据,其次是理解数据集的固有偏差和局限性。
在开发深度学习系统时,请考虑以下问题,如图55所示。
图55在深度学习项目开始时要做的关键反思问题的决策树
 我有正确的数据吗?这是训练深度学习模型时面临的最大挑战。使用数学规则定义问题,使用精确的定义将问题划分为类别(分类问题)或连续值测度问题(回归问题)。那么,应该如何收集这些测度的数据呢?
 我有足够多的数据吗?通常情况下,深度学习算法在大型数据集中的表现要比在较小的数据集中的表现好得多。需要了解训练高性能算法所需的数据量,当然这取决于尝试解决的问题类型,但目标还是尽可能多地收集数据。
 我可以使用一个预先训练过的模型吗?如果您正在处理的问题属于一般应用程序的一部分(在同一领域中),那么请考虑优先使用训练好的模型。训练好的模型可以帮助您在解决问题的特殊模式方面领先一步,而不是让模型使用整个领域更通用的特征,可以从TensorFlow官方的Github库(https://github.com/tensorflow/models)入手。
在某些情况下,数据可能根本无法获得。根据具体的情况,可以使用一系列技术有效地从输入数据中创建更多的数据,这一过程被称为数据增强(data augmentation),数据增强技术在处理图像识别问题时得到了成功应用。这里有一篇很好的参考文章——Classifying plankton with deep neural networks,详见http://benanne.github.io/2015/03/17/plankton.html。为了增加该模型的训练样本数,文章的作者给出了一系列扩充少量图像数据的技术。5.1.4实例: 探索比特币数据集,为模型准备数据
下面使用一个最初从CoinMarketCap网站上检索到的公共数据集,CoinMarketCap是一个跟踪不同加密货币的统计数据的网站,该数据集会同本章内容一起提供给读者,以供使用。
我们将继续使用Jupyter Notebook对数据集进行探索。Jupyter Notebook通过Web浏览器提供Python会话,它允许用户以交互的方式处理数据。Jupyter Notebook是探索数据集的流行工具,我们将在本书的所有实例中使用它。
打开终端,导航到本书配套文件目录的Chapter_5/activity_3,并执行以下命令以启动Jupyter Notebook实例。$ jupyter notebook在浏览器中打开应用程序提供的URL,应该能够在文件系统中看到一个带有许多目录的Jupyter Notebook页面,如图56所示。
图56启动一个Jupyter Notebook实例后的终端图像。导航到浏览器中的URL显示,
应该能够看到Jupyter Notebook的登录页面
导航到目录,单击文件Activity_3_Exploring_Bitcoin_Dataset.ipynb。这是一个Jupyter Notebook文件,它将在一个新的浏览器选项卡中被打开,如图57和图58所示。应用程序将自动为用户启动一个新的Python交互式会话。
图57Jupyter Notebook实例的登录页面
图58Notebook中的Activity_Exploring_Bitcoin_Dataset.ipynb图。
现在可以与该Notebook互动,并进行修改
打开Jupyter Notebook后,即可开始探索本章提供的比特币数据。
数据集(data/bitcoin_historical_prices.csv)包含自2013年以来比特币价格的测度结果。最近的一次观察(observation)是2017年11月,数据集来自每日更新的在线服务网站CoinMarketCap。该数据集包含8个变量(如表52所示),其中2个变量(date和iso_week)描述数据的时间段,可以用作索引;还有另外6个变量(open、high、low、close、volume和market_capitalization),可以用来了解比特币的价格和其价值随时间的变化情况。表52比特币历史价格数据集中的可用变量变量描述date观察日期iso_week给定年份的周数open一枚比特币的公开价值