tf-1x-dl-cookbook-merge-4

53 阅读19分钟

TensorFlow 1.x 深度学习秘籍(五)

原文:TensorFlow 1.x Deep Learning Cookbook

协议:CC BY-NC-SA 4.0

十三、AutoML 和学习如何学习(元学习)

深度学习的成功极大地促进了特征工程的工作。 确实,传统的机器学习很大程度上取决于对正确的特征集的选择,而且与选择特定的学习算法相比,这一步骤通常更为重要。 深度学习改变了这种情况。 创建正确的模型仍然非常重要,但是现今的网络对特定特征集的选择已不那么敏感,并且能够自动选择真正重要的特征。

取而代之的是,深度学习的引入使人们更加关注正确的神经网络架构的选择。 这意味着研究人员的兴趣正逐渐从特征工程转向网络工程。 AutoML元学习)是一个新兴的研究主题,旨在针对给定的学习任务自动选择最有效的神经网络。 换句话说,AutoML 代表学习如何有效学习的一组方法。 考虑例如机器翻译,图像识别或游戏的任务。 通常,模型是由工程师,数据科学家和领域专家组成的团队手动设计的。 如果您认为一个典型的 10 层网络可以具有约10^10个候选网络,那么您就会知道该过程可能很昂贵,容易出错并且最终不是最佳选择。

使用循环网络和强化学习的元学习

解决此问题的关键思想是拥有一个控制器网络,该控制器网络会在给定特定网络输入的情况下,以概率p提出模型架构。 对子项进行训练和评估,以解决要解决的特定任务(例如,子项获得的准确率R)。 该评估R被传递回控制器,该控制器进而使用R来改善下一个候选架构。 在此框架下,可以将候选子项到控制器的反馈建模为计算p的梯度的任务,然后通过R缩放此梯度。 控制器可以实现为循环神经网络(请参见下图)。 这样做,控制器将倾向于在迭代之后获得更好的R的架构候选区域,并倾向于给得分不那么高的候选区域分配较低的概率。

例如,控制器循环神经网络可以对卷积网络进行采样。 控制器可以预测许多超参数,例如过滤器高度,过滤器宽度,步幅高度,步幅宽度和一层过滤器的数量,然后可以重复。 每个预测可以由 softmax 分类器执行,然后输入到下一个 RNN 时间步中。 以下图片来自《使用增强学习的神经架构搜索》(Barret Zoph,Quoc V. Le):

预测超参数是不够的,因为最好定义一组动作以在网络中创建新层。 这特别困难,因为描述新层的奖励函数极有可能是不可区分的,因此无法通过标准技术(例如 SGD)对其进行优化。 解决方案来自强化学习,它包括采用类似于我们的第 9 章,“强化学习”中所述的策略梯度网络。

除此之外,并行性可用于优化控制器 RNN 的参数。 Quoc Le&Barret Zoph 建议采用参数服务器方案,其中我们有一个 S 碎片的参数服务器,用于存储 K 个控制器副本的共享参数。 每个控制器副本都采样了如下图所示的并行训练的不同子架构,如下图所示,取自《使用增强学习的神经架构搜索》(Barret Zoph,Quoc V. Le):

Quoc 和 Barret 将 AutoML 技术用于神经架构搜索应用于 Penn Treebank 数据集,这是语言建模的著名基准。 他们的结果改进了目前被认为是最先进的手动设计网络。 特别是,他们在 Penn Treebank 上实现了 62.4 的测试集困惑,这比以前的最新模型好 3.6 困惑。 同样,在 CIFAR-10 数据集上,该方法可以设计一种新颖的网络架构,与测试集准确率方面最好的人类发明架构旗鼓相当。 提出的 CIFAR-10 模型实现了 3.65 的测试错误率,比使用类似架构方案的最新技术模型好 0.09%,并且快 1.05 倍。

元学习块

《用于可伸缩图像识别的学习可传输架构》(Barret Zoph,Vijay Vasudevan,Jonathon Shlens,Quoc V. Le,2017)中,建议在小型数据集上学习架构构造块,然后将其传输到大型数据集。 作者建议在 CIFAR-10 数据集上搜索最佳的卷积层(或单元),然后通过堆叠该单元的更多副本(每个都有其自己的参数),将此学习到的单元应用于 ImageNet 数据集。 准确地说,所有卷积网络都是由结构相同但权重不同的卷积层(或单元)组成的。 因此,将搜索最佳卷积架构简化为搜索最佳单元结构,这样可以更快地将其推广到其他问题。 尽管无法在 ImageNet 上直接学习该单元,但是在已发表的工作中,由学得最好的单元构成的架构可实现 ImageNet 的最新精度为 82.7% top-1 和 96.2% top-5。 该模型的 top-1 准确率比人类发明的最佳架构高 1.2%,而 FLOPS 则减少了 90 亿个,与之前的最新模型相比降低了 28%。 还需要注意的重要一点是,使用 RNN + RL(循环神经网络+强化学习)学习的模型正在击败随机搜索(RL)代表的基线,如本文中所取的图所示。 在 RL 与 RS 中确定的前 5 名和前 25 名模型的平均表现中,RL 始终是赢家:

新任务的元学习

可以对元学习系统进行训练以完成大量任务,然后对其元学习新任务的能力进行测试。 这种元学习的一个著名例子是在高级 CNN 章节中讨论的所谓迁移学习,其中网络可以从相对较小的数据集中成功学习基于图像的新任务。 但是,对于诸如语音,语言和文本之类的非视觉领域,没有类似的预训练方案。

《用于快速适应深度网络的模型不可知元学习》(切尔西·芬恩(Chelsea Finn),彼得·阿比尔(Siety Levine),2017 年)提出了一个模型 -不可知论方法的名称为 MAML,它与经过梯度下降训练的任何模型兼容,并且适用于各种不同的学习问题,包括分类,回归和强化学习。 元学习的目标是针对各种学习任务训练模型,以便仅使用少量训练样本即可解决新的学习任务。 元学习器旨在找到一种可以快速(以很少的步骤)并有效地(仅使用几个示例)快速适应各种问题的初始化。 用参数为θ的参数化函数f[0]表示的模型。 当适应新任务T[i]时,模型参数θ变为θ[i']。 在 MAML 中,使用对任务T[i]的一个或多个梯度下降更新来计算更新的参数向量θ[i']

例如,当使用一个梯度更新时,θ[i'] = θ - α∇[0]L[Ti](f[θ]),其中L[Ti]是任务T的损失函数,而α是元学习参数。 该图报告了 MAML 算法:

MAML 能够在流行的少拍图像分类基准上大大胜过许多现有方法。 旨在从一个或几个概念中学习新概念的镜头很少有挑战性。 例如,《通过概率性程序归纳进行人级概念学习》(Brenden M. Lake,Ruslan Salakhutdinov,Joshua B. Tenenbaum,2015 年),建议人们可以学会从单个图片中识别新颖的两轮车,例如红色框中包含的图片,如下所示:

在 2017 年底,AutoML(或元学习)主题是一个活跃的研究主题,旨在针对给定的学习任务自动选择最高效的神经网络。 目标是学习如何高效,自动地设计网络,从而可以学习特定任务或适应新任务。 主要问题是不能简单地用可微分的损失函数描述网络的设计,因此传统的优化技术不能简单地用于元学习。 因此,已经提出了一些解决方案,包括具有控制器循环网络(RNN)和基于强化学习的奖励策略的思想,以及具有与模型无关的元学习的思想。 两种方法都非常有前途,但是肯定还有很多研究空间。

因此,如果您对一个热门话题感兴趣,那么学习深度学习当然是一个可以考虑作为下一份工作的空间。

  • Google 提出了采用 RNN 作为控制器的方法,该方法使用机器学习来探索神经网络架构。
  • 《带有增强学习的神经架构搜索》(Barret Zoph,Quoc V. Le)是一篇开创性的论文,它证明了有关 Google 方法的更多细节。 但是,RNN 不是唯一的选择。
  • 《图像分类器的大规模发展》(Esteban Real,Sherry Moore,Andrew Selle,Saurabh Saxena,Yutaka Leon Suematsu,Jie Tan,Quoc Le,Alex Kurakin,2017 年)提出在进化遗传算法中使用遗传计算来探索新的候选网络。
  • 《学习用于可伸缩图像识别的可迁移架构》(Barret Zoph,Vijay Vasudevan,Jonathon Shlens,Quoc V. Le)提出了在 CIFAR 上学习的单元,用于改善 ImageNet 分类。
  • 《构建可以建立人工智能的 AI》:谷歌和其他公司为争夺一小部分研究人员而奋斗,他们正在寻找自动方法来应对人工智能专家的短缺。
  • 《用于快速适应深度网络的模型不可知元学习》(切尔西·芬恩(Chelsea Finn),彼得·阿比耶尔(Pieter Abbeel),谢尔盖·莱文(Sergey Levine),2017 年)。
  • 《通过梯度下降学习》(Marcin Andrychowicz,Misha Denil,Sergio Gomez,Matthew W. Hoffman,David Pfau,Tom Schaul,Brendan Shillingford,Nando de Freitas)展示了如何将优化算法的设计转换为学习问题,从而使该算法能够自动学习感兴趣的问题中的结构。 LSMT 学习的算法在训练任务上胜过手工设计的竞争对手,并且可以很好地推广到结构相似的新任务。 该算法的代码可在 GitHub 上获得。

连体网络

连体网络是 Yann LeCun 及其同事在 NIPS 1994 中提出的一种特殊类型的神经网络。 它们背后的基本思想是,像“连体双胞胎”一样,该网络由两个不同的神经网络组成,它们共享相同的架构和权重。

在这里,您可以看到连体架构:

在训练阶段,该对网络会显示一个训练对(X[1], X[2]),其中两个输入不同但相似,例如, X[1] = 他很聪明,而X[2] = 他是一个聪明人。 这两个神经网络将产生两个不同的结果。 可以将组合网络视为测量训练对(X[1], X[2])之间相似度的标量能量函数 , 定义为:

连体网络的目标是训练对(X[1], X[2])之间的能量应小于其他赝品对之间的能量(X[1], X'[2])

这可以通过使用对比损失函数进行训练来实现。

在训练阶段,网络被输入一个训练对和一个与之相关的标签,告诉它是一个真正的对或赝品对的网络:(X[1], X[2], Y[i])i个训练样本。 对比损失函数计算如下:

其中,

L[G]是真正对的部分损失, L[I]是赝品的部分损失对和P训练样本数。 当偶对是正品时,标签Y的值为 0;当偶对是赝品时,标签Y的值为 1。 设计局部损失L[G]L[I]的方式应使对比损耗L(W)将减少真正对的能量并增加赝品的能量。 这是通过选择部分损失L(G)单调增加而选择部分损失L(I)单调减少f来实现的。 一种可能的选择是使用余弦相似度来计算部分损耗。

使用反向传播算法调整权重。

连体网络的应用

近年来,连体网络已用于许多应用。 他们在 LeCun 论文中首次使用的是签名验证。 从那时起,出现了许多应用,我们将介绍一些最近的应用:

除此之外,还对连体网络进行了脸部验证/识别它们已用于问题解答

一个有效的例子 -- MNIST

工作示例基于 Github 页面。 此处的代码使用连体网络将手写的 MNIST 数字嵌入到 2D 空间中,属于同一类的数字被嵌入在一起。 该代码包含三个主要文件:

  • run.py:它包含执行训练的基本包装。 它使用“梯度下降”算法将对比度损失降至最低。

  • inference.py:包含定义 3 层全连接网络的连体类。 代码中两个网络的输出之间的相似性是欧几里得。 然后,使用部分生成损失和部分赝品损失来计算对比损失。

  • visualize.py:这只是用于可视化结果的包装。

经过前 100,000 个训练步骤,结果是:

您可以看到相同(标记)的数字一起嵌入 2D 空间。

还有另一个有趣的示例](github.com/dhwajraj/de…) 。

在这里,使用 Tensorflow,训练了深层的连体 LSTM 网络以使用字符嵌入来捕获短语/句子相似性。

十四、TensorFlow 处理单元

Google 服务(例如 Google 搜索(RankBrain),街景,Google 照片和 Google 翻译)有一个共同点:它们都使用 Google 的 Tensor 处理单元或 TPU 进行计算。

您可能在想什么是 TPU,这些服务有什么好处? 所有这些服务都在后台使用最新的机器学习算法,并且这些算法涉及大量计算。 TPU 有助于加速所涉及的神经网络计算。 甚至 AlphaGo,一种在 Go 游戏中击败 Lee Sedol 的深度学习程序,都由 TPU 推动。 因此,让我们看看 TPU 到底是什么。

TPU 是 Google 专门为机器学习而定制的定制专用集成电路(ASIC),是针对 Tensorflow 量身定制的。 它基于 28 纳米工艺构建,运行频率为 700 MHz,运行时消耗 40 W 的能量。 它包装为外部加速卡,可以插入现有的 SATA 硬盘插槽中。 TPU 通过 PCIe Gen 3×16 总线连接到主机 CPU,该总线提供 12.5 GB/s 的有效带宽。

到目前为止,第一代 TPU 的目标是推理,即使用已经训练好的模型。 DNN 的训练通常需要更多时间,但仍在 CPU 和 GPU 上进行。 在 2017 年 5 月的博客文章中宣布的第二代 TPU 都可以训练和推断机器学习模型。

TPU 的组件

在本书涵盖的所有深度学习模型中,无论学习范例如何,都需要进行三个基本计算:乘法,加法和激活函数的应用。

前两个成分是矩阵乘法的一部分:权重矩阵W需要与输入矩阵X相乘W^T · X; 矩阵乘法在 CPU 上的计算量很大,尽管 GPU 使操作并行化,但仍有改进的余地。

TPU 具有 65,536 个 8 位整数矩阵乘法器单元(MXU),峰值吞吐量为 92 TOPS。 GPU 和 TPU 乘法之间的主要区别在于 GPU 包含浮点乘法器,而 TPU 包含 8 位整数乘法器。 TPU 还包含一个统一缓冲区(UB),用作寄存器的 24 MB SRAM 和一个包含硬接线激活函数的激活单元(AU)。

MXU 是使用脉动数组架构实现的。 它包含一个数组算术逻辑单元(ALU),该数组连接到网状拓扑中的少量最近邻居。 每个数据值仅读取一次,但在流过 ALU 数组时会多次用于不同的操作,而无需将其存储回寄存器。 TPU 中的 ALU 仅以固定模式执行乘法和加法。 MXU 已针对矩阵乘法进行了优化,不适用于通用计算。

每个 TPU 还具有一个片外 8GiB DRAM 池,称为加权存储器。 它具有四个阶段的流水线,并执行 CISC 指令。 到目前为止,TPU 由六个神经网络组成:两个 MLP,两个 CNN 和两个 LSTM。

在高级指令的帮助下对 TPU 进行编程; 下面是一些用于对 TPU 进行编程的指令:

  • Read_Weights:从内存读取权重
  • Read_Host_Memory:从内存中读取数据
  • MatrixMultiply/Convolve:与数据相乘或卷积并累加结果
  • Activate:应用激活函数
  • Write_Host_Memory:将结果写入存储器

Google 创建了一个 API 栈,以方便 TPU 编程; 它将来自 Tensorflow 图的 API 调用转换为 TPU 指令。

TPU 的优势

TPU 提供的优于 GPU 和 CPU 的首要优势是性能。 Google 将 TPU 的性能与运行基准代码(代表 95% 的推理工作量)的服务器级 Intel Haswell CPU 和 NVIDIA K80 GPU 进行了比较。 它发现 TPU 的速度比 NVIDIA GPU 和 Intel CPU 快 15-30 倍。

第二个重要参数是功耗。 降低功耗非常重要,因为它具有双重能源优势:它不仅减少了功耗,而且还通过降低散热成本来散热,从而节省了功耗,从而消除了加工过程中产生的热量。 TPU / CPU 每瓦性能比其他 CPU 和 GPU 配置提高了 30-80 倍。

TPU 的另一个优点是其最小化和确定性的设计,因为它们一次只能执行一个任务。

与 CPU 和 GPU 相比,单线程 TPU 没有任何复杂的微架构功能会消耗晶体管和能量来改善平均情况,但不会消耗 99% 的情况:没有缓存,分支预测,乱序执行, 多处理,推测性预取,地址合并,多线程,上下文切换等。 极简主义是特定领域处理器的优点。

访问 TPU

Google 已决定不直接将 TPU 出售给他人; 取而代之的是,将通过 Google 云平台提供 TPU:Cloud TPU Alpha。 Cloud TPU Alpha 将提供高达 180 teraflops 的计算性能和 64 GB 的超高带宽内存。 用户将能够从自定义虚拟机连接到这些 Cloud TPU。

Google 还决定向全球的机器学习研究人员免费提供 1000 个云 TPU 集群,以加快开放式机器学习研究的步伐。 在有限的计算时间内,将授予选定的个人访问权限; 个人可以使用以下链接进行注册。 根据 Google Blog:

“由于 TensorFlow 研究云的主要目标是使整个开放式机器学习研究社区受益,因此,成功的申请人有望做到以下几点:

通过同行评审的出版物,开源代码,博客文章或其他开放媒体与世界分享其 TFRC 支持的研究

与 Google 分享具体的建设性反馈,以帮助我们随着时间的推移改进 TFRC 计划和基础的 Cloud TPU 平台。

想象一下 ML 加速丰富的未来,并基于这种未来开发新的机器学习模型。”

TPU 上的资源