Friday, January 19, 2018

机器学习中的表达能力, 训练难度和泛化性能

我非常感谢王家兴 (Jiaxing Wang) 把这个博客文章翻译成中文。

当我在阅读机器学习相关文献的时候, 我经常思考这项工作是否1)提高了模型的表达能力 2)使模型更易于训练 3)提高了模型的泛化性能。这样的分类标准是我从我在Google Brain的同事Jascha Sohl-Dickstein那里借鉴来的,相关的术语在这篇文章有介绍。 我发现这样的区分标准有助于我们确定一项研究工作(特别是理论方面的工作)如是何将人工智能的子领域(如机器人学, 产生式模型, 自然语言处理等)融入到机器学习研究的整个大图景里的[1]。
在这篇博文中, 我们讨论当前(截止到2017年11月)的机器学习研究:监督学习, 无监督学习和强化学习在这些方面的表现。谈到模型的泛化性能的时候, 我把它分为两类:‘‘弱泛化’’ 和 ‘’强泛化’ 。我将会在后面分别讨论它们。 下表总结了我眼中的研究现状:



表达能力

模型可以进行什么样的计算?拟合多么复杂的函数?
训练难度

给定数据训练一个模型的难度?
弱泛化

数据分布发生较小变化时模型的性能?
强泛化

数据分布发生较大改变时模型的性能?
监督学习

使用人工标定的标签。 训练模型预测这些标签
较容易
将要实现
困难
无监督学习

不使用人工标定的标签。 训练模型预测这些标签
较容易
将要实现
困难
强化学习

学习在一个环境中获得最多的奖励
困难
非常困难
非常困难

非常感谢Jascha Sohl-Dickstein 和 Ben Poole 为这篇博文提供反馈和修正。 感谢Marcin Moczulski 关于回馈神经网络(RNN)训练难度的探讨以及Joaquin Ruales对这篇博文的语法进行更正。
这篇博文涵盖了相当宽泛的研究领域,仅表达我个人对相关研究的看法,不反映我的同事和公司的观点。欢迎读者进行讨论以及给出修改的建议, 请在评论中提供反馈或发送电子邮件给我。

表达能力 expressivity

----模型可以进行什么样的计算, 拟合多么复杂的函数?


模型的表达能力用来衡量参数化模型如神经网络的可以拟合的函数的复杂程度。深度神经网络的表达能力随着它的深度指数上升, 这意味着中等规模的神经网络就拥有表达监督, 半监督, 强化学习任务的能力[2]。 深度神经网络可以记住非常大的数据集就是一个很好的佐证。

神经网络几乎可以表达所有的变量,连续的, 离散的,实值的, 复数的,甚至是随机变量。近几年在生成式模型和贝叶斯神经网络的研究中,利用深度神经网络取得了令人难以置信的好的结果。

最近在产生式模型研究上的突破证明了神经网络强大的表达能力:神经网络可以找到几乎与真实数据难以分辨的极为复杂的数据流形(如音频, 图像数据的流形)。下面是NVIDIA研究人员提出的新的基于产生式对抗神经网络的模型的生成结果:



产生的图像仍然不是很完美(注意不自然的背景),但是已经非常好了。同样的, 在音频合成中,最新的WaveNet模型产生的音频也已经非常像人类了。

无监督学习不仅仅限于产生式模型。 一些研究人员比如Yann LeCun 将无监督学习更名为“预测学习”:模型学习过去, 推理当下,或者预测未来。但是, 由于大部分的无监督学习关注于预测极其复杂的联合分布(图像,音频), 我认为产生式模型的能力是一个很好的无监督学习中模型表达能力的评价基准。

在强化学习中神经网络看起来也有足够的表达能力。 很小的网络(2个卷积层2个全连接层)就足够解决 Atari 和MuJoCo 控制问题了(虽然它们的训练还是一个问题,我们将在下一个部分讨论)

模型的表达能力本身并不是一个很有趣的问题-通过增加网络层数,增加连接等手段我们总可以获得更强的表达能力。真正的问题在于我们要让神经网络在训练和测试集上都有足够的表达能力,而训练的难度仍被控制在可接受的范围内。 比如我们常常使用二维卷积来完成图像分类任务, 虽然一个比较深的全连接神经网络也有足够的容量来记住整个训练集。

模型的表达能力问题是最容易的(增加一些层即可), 但同时也是最神秘的:我们无法找到一个很好的方法来度量对于于一个给定的任务我们需要多强的(或什么类型的)表达能力。什么样的问题会需要比我们现在用的神经网络大得多的网络?为什么这些任务需要这么大量的计算?我们现有的神经网络是否有足够的表达能力来表现像人类一样的智能?要解决更加困难的问题的泛化问题会需要表达能力超级强的模型吗?

人的大脑有比我们现在的大网络(Inception-ResNet-V2 有大概25e6 ReLU结点)多很多数量级的“神经节点”(1e11)。 这个结点数量上的差距已经很巨大了, 更别提ReLU单元根本无法比拟生物神经元。 一个生物神经元及它的各种神经递质,树突,轴突可以时变地整合来自多达10000 个其它神经元的信号—它的表达能力之强令人难以置信。 蝗虫只用的一个都要好。这样强大的表达能力究竟是从何而来?又会发展到什么地步?我们还需要多少表达能力?

训练难度 trainability

----给定一个有足够表达能力的模型结构, 我能够训练出一个好的模型吗(找到好的参数)

任何一个从数据中学习到一定功能的计算机程序都可以被称为机器学习模型。在 “学习”过程中, 我们在(可能很大的)模型空间内搜索一个比较好的, 利用数据中的知识学到的模型来做决策。 搜索的过程常常被构造成一个在模型空间上的优化问题。




优化的不同类型


通常, 特别是在深度学习中, 我们会定义一些标量度量来评价模型的好坏, 然后使用数值优化技术来使模型‘’变好’’。

一个具体的例子:最小化平均交叉熵是训练神经网络分类图像的标准方法。我们希望模型在训练集上的交叉熵损失达到最小时, 模型在测试数据上可以以一定精度或召回来正确分类图像。 通常我们不能直接优化模型的评价指标如分类精度(很明显, 我们事先并没有见过测试集), 但训练集上的替代函数比如交叉熵可以。

搜索好的模型(训练)最终会变为一个优化问题—没有别的途径! 但是有时候我们很难去定义优化目标。 在监督学习中的一个经典的例子就是图像下采样--我们无法定义一个 标量可以准确反映出我们人眼感受到的下采样造成的 ‘’视觉损失’’。同样地, 超分辨率图像和图像合成也非常困难,因为我们很难把效果的好坏写成一个标量的最大化目标:想象一下, 如何设计一个函数来判断一张图片有多像一张真实的照片?事实上关于如何去评价一个产生式模型的好坏一直争论现在

近年来最受欢迎的的方法是 “协同适应” (co-adaptation)方法:它把优化问题构造成求解两个相互作用演化的非平稳分布的平衡点求解问题[3]。这种方法比较“自然”, 我们可以将它类比为捕食者和被捕食者之间的生态进化过程。 捕食者会逐渐变得聪明, 这样它可以更有效地捕获猎物。然后被捕食者也逐渐变得更聪明以避免被捕食。两种物种相互促进进化, 最终它们都会变得更加聪明。

产生式对抗神经网络就是这样工作的, 这样可以避免我们直接显式地定义“人感知到的损失”目标。同样地, 强化学习中的竞争性自博弈也运用了这个原则来学习到更丰富的行为方式。虽然现在没有显式定义的优化目标, 这仍然是一个优化问题, 机器学习实践者可以使用熟悉的工具比如深度神经网络, 随机梯度下降来求解这些问题。

演化策略通常把优化看作是仿真。用户对模型群体指定一些动力系统, 在仿真过程中的每个时间步上, 根据动力系统的运行规则来更新模型群体。 这些模型可能会相互作用也可能不会。 随着时间的演变, 系统的动态特性可能会使模型群体最终收敛到好的模型上面。

David Ha所著的 《A Visual Guide to Evolution Strategies》 是一部非常好的演化策略在强化学习中应用的教材(其中的“参考文献和延伸阅读”部分非常棒!)


研究现状:


监督学习中前馈神经网络和有显式目标函数的问题已经基本解决了(经验之谈, 没有理论保障)。2015年发表的一些重要的突破(批归一化(Batch Norm), 残差网络(Resnets), 良好初始化(Good Init))现在被广泛使用, 这使得前馈神经网络的训练变得非常容易。事实上, 数百层的深度网络已经可以把大的分类数据集的训练损失减小到零。关于现代深度神经网络的硬件和算法基础结构,参考这篇综述文章

回馈神经网络相对更加困难一些, 但是研究人员已经取得了重大进展。 现在我们不再把直接将LSTM放到一个复杂的机器人策略中并期望它取得良好效果看作是一件疯狂的事情。这很令人难以置信, 回望2014年,还只有很少人相信可以训出好的RNN模型,而再前些年有很多工作指出RNN极其难以训练。有证据表明很多RNN结构有相同的表达能力 , 模型最终效果的差异仅仅是由于一些结构比另一些更加易于训练[4]。

无监督学习的模型输出常常大很多(并不是总是)—比如, 1024 x 1024像素的图片, 很长的语音和文本序列。很不幸, 这导致模型更加难以训练。

2017年一个比较大的突破是对抗式生成网络的训练难度大大下降了。 现在最受欢迎的改进是在对抗式生成网络原本的Jensen-Shannon 距离目标函数上进行小的修正:

最小二乘(least square), 带间隔的绝对偏差(absolute deviation with magin)和使用Wasserstein距离(1, 2) 。 最近NVIDA的工作改进了Wasserstein GAN 使之对很多超参, 比如BN的参数, 网络结构等不再敏感。模型的稳定性在实践和工业应用中非常重要-稳定性让我们相信它会和我们未来的研究思路和应用相兼容。总的来讲, 这些成果令人振奋, 因为这证明了我们的产生网络有足够的表达能力来产生正确的图像, 效果的瓶颈在于训练的问题--不幸的是对于神经网络来讲我们很难辩别一个模型表现较差仅仅是因为它的表达能力不够还是我们没有训练到位。

基于神经网络的含有离散隐变量的模型之前同样难以训练,因为离散变量的蒙特卡洛梯度估计具有很大的方差。近些年含离散变量的模型在各种结构中都有出现,从对抗式生成网络到语言模型到记忆增强网络到强化学习。从模型的表达能力的角度来看离散的表示是非常有用的,而且我们现在可以非常可靠地训练这些模型。

不幸的是, 即使在仅仅考虑可训练性,不考虑泛化的情况下, 强化学习也远远地落在了后面。在有多于一个时间步的环境中, 我们实际是在首先搜索一个模型, 这个模型在推理阶段会最大化获得的奖励。强化学习比较困难,因为我们要用一个外部的(outer loop),仅仅依赖角色(agent)见过的数据的优化过程来找到最优的模型, 同时用一个内部的(inner loop), 模型引导的最优控制(optimal control)过程来最大化获得的奖励。

最近我在一个连续的机器人控制任务上添加了一维,我的强化学习模型的效果就从超过80% 降到了10%。强化学习不仅难以训练, 而且非常不可靠!强化学习优化目标函数值的大小非常随机, 用不同的随机种子, 我们甚至就不能得到相同的结果。 这样我们只能报告使用不同的随机种子多次试验下奖励曲线的平均值。不同环境下,实现同样的算法我们经常得到不同的结果, 因此强化学习文章中报告的结果我们也不能轻易完全相信。

这很讽刺, 强化学习的训练还是一个很大的问题,因为我们稍微扩大一点问题的规模, 就不能在每次的实验中得到相同的结果。

如果我们把强化学习看作一个单纯的优化问题(先不考虑模型的泛化和复杂的任务), 这个问题同样非常棘手。假设现在有一个环境, 只有在一个场景结束时才会有非常稀疏的奖励(例如:保姆照看孩子, 只有在父母回家时她才会得到酬劳)。动作(action)的数量(和它相应的环境输出)会随着场景的持续呈现指数性的增长, 而实际上这些动作(action)序列中只有极少数的会导致成功。

因此, 要想估计模型优化过程中任意一处的策略梯度, 我们都要采样指数增长的动作空间(action space)中的样本来获得一些对学习有用的信号。这就像是我们想要使用蒙特卡洛方法关于一个分布计算期望(在所有动作序列上), 而这个分布集中于一个狄拉克函数(dirac delta distribution)(密度函数见下图)。在建议分布(proposal distribution)和奖励分布(reward distribution)之间几乎没有重叠时, 基于有限样本的蒙特卡洛估计会失效,不管你采了多少样本。



此外, 如果数据布不是平稳的(比如我们采用带有重放缓存(replay buffer)的离策略(off-policy)算法), 数据中的“坏点”会给外部的优化过程(outer loop)提供不稳定的反馈。

不从蒙特卡洛估计的角度, 而从优化的角度来看的话:在没有关于状态空间的任何先验的情况下(比如对于世界环境的理解或者显式地给角色(agent)一些明确的指示), 优化目标函数的形状(optimization landscape)看起来就像 ‘’瑞士芝士‘’ --一个个凸的极值(看作小孔)周围都是大面积的平地,这样平坦的“地形”上策略梯度信息几乎没用。这意味着整个模型空间几乎不包含信息(非零的区域几乎没有,学习的信号在整个模型空间里是均匀的)。




如果没有更好的表示方法, 我们可以就仅仅是在随机种子附近游走, 随机采样一些策略, 直到我们幸运地找到一个恰好落在‘’芝士的洞里”的模型。 事实上,这样训练出的模型效果其实很好。这说明强化学习的优化目标函数形状很有可能就是这样子的。

我相信像Atari和 MuJoCo这样的强化学习基准模型并没有真正提高机器学习的能力极限, 虽然从一个单纯优化问题来看它们很有趣。这些模型还只是在一个相对简单的环境中去寻找单一的策略来使模型表现得更好, 没有任何的选择性机制让他们可以泛化。 也就是说, 它们还仅仅是单纯的优化问题, 而不是一个复杂的机器学习问题。

考虑强化学习的泛化性(而不仅仅是训练)会让解释和调试变得更加复杂, 但是我认为让角色真正理解环境和任务目标,获得泛化的能力是让强化学习在真实世界的机器人系统中可以工作的唯一途径。

在监督学习和非监督学习中, 不管我们当前在模型空间的什么位置,我们可以很容易地获取到学习的信号。批(batch)数据梯度给出的建议分布和真实的梯度分布总会有重叠。如果我们使用批大小(batch size)为1 的随机梯度下降方法, 那么在最差情况下我们采样到得到有用的训练信号的转移的概率是1/N,N是数据集的大小(这样每一代的训练都会可靠地让模型变好)。为了找到一个较好的模型, 我们可以暴力地送入更多的数据或增加训练代数。此外, 通过在低层特征上的”自举”(bootstrapping), 提高低层的感知泛化很可能还有减小方差的效果。

要想解决更高维,更复杂的强化学习问题, 在解决数值优化问题之前,我们必须先考虑模型的泛化和一般的感性认知能力。反之就会愚蠢地浪费计算力和数据(当然这可能会让我们明白仅仅通过暴力计算我们可以做得多好)。 我们要让每个数据点都给强化学习提供训练信息,也需要能够在不用指数增长的数据时就能通过重要性采样(importance sampling)获得非常复杂的问题的梯度。只有在这样的情况下, 我们才能确保通过暴力计算我们可以获得这个问题的解。

示范学习(learning from demonstration), 模仿学习(imitation learning),逆向强化学习(inverse reinforcement learning)以及用自然语言进行交互学习可能会快速地让初始策略可以得到训练信号(得到一个好的初始化), 或者改变搜索空间的形状使得每个场景片段(episode)都可以提供有效的信息来训练策略(policy) (比如说,不给予奖励,但是角色的观察会提供一些信息来帮助模型进行规划, 使之倾向于做某些有意义的动作)

最后做一个总结:监督学习的训练比较容易。 无监督学习的训练相对困难但是已经取得了很大的进展。但是对于强化学习,训练还是一个很大的问题。

泛化性能

在这三个问题中, 泛化性能是最深刻的,也是机器学习的核心问题。简单来讲, 泛化性能用来衡量一个在训练集上训练好的模型在测试集上的表现。

泛化问题主要可以分为两大类:1) 训练数据与测试数据来自于同一个分布(我们使用训练集来学习这个分布)。 2)训练数据与测试数据来自不同的分布(我们要让在训练集上学习的模型在测试集上也表现良好)。 通常我们把(1)称为“弱泛化”, 把(2)称为“强泛化”。 我们也可以把它们理解为“内插(interpolation)”和“外推(extrapolation)”, 或“鲁棒性(robustness)”与“理解(understanding)”。


弱泛化: 考虑训练集与测试集数据服从两个类似的分布

----如果数据的分布发生了较小的扰动, 模型还能表现得多好?


在“弱泛化”中, 我们通常假设训练集和数据集的数据分布是相同的。但是在实际问题中, 即使是‘’大样本’’(large sample limit)情况下, 二者的分布也总会有些许差异。

这些差异有可能来源于传感器噪声,物体的磨损,周围光照条件的变化(可能摄影者收集测试集数据时恰好是阴天)。对抗样本的出现也可能导致一些不同, 对抗的扰动很难被人眼分辨,因此我们可以认为对抗样本也是从相同的分布里采出来的。

因此, 实践中把“弱泛化”看作是评估模型在“扰动”的训练集分布上的表现是有用的。

数据分布的扰动也会导致优化目标函数(optimization landscape)的扰动。



不能事先知道测试数据的分布为我们优化带来了一些困难。如果我们在训练集上优化得过于充分(上图蓝色曲线左边的最低的局部极小点), 我们会得到一个在测试集上并不是最好的模型(红色曲线左边的局部极小点)。 这时, 我们就在训练集上过拟合(overfitting)了, 模型在测试集上没有很好地泛化。

“正则化”包含一切我们用来防止过拟合的手段。我们一点都不知道测试集分布的扰动是什么, 所以我们只能在训练集或训练过程中加入噪声, 希望这些引入的噪声中会包含测试集上的扰动。随机梯度下降,随机剪结点(dropout),权值噪声(weight noise), 激活噪声(activation noise), 数据增强等都是深度学习中常用的正则化技术。在强化学习中,随机仿真参数(randomizing simulation parameters)会让训练变得更加鲁棒。Chiyuan Zhang 在ICLR2017的报告中认为正则化是所有的可能“增加训练难度”的方法(而不是传统上认为的“限制模型容量”)。 总的来讲, 让优化变得困难一些有助于模型的泛化。

这很令人不安, 我们的“泛化”方法太粗糙了,仅仅相当于一个”优化阻碍器”。我们基本就是给优化器制造一点障碍,干扰训练过程让它刚刚好可以防止过拟合。还有,更好的训练会牺牲模型的泛化性能, 用这种观点看待泛化问题会让模型的可训练性的研究非常困难。

但是如果更好的优化会导致过拟合,那我们又怎么解释一些优化过程可以同时降低训练集和测试集上的误差?事实上任何一个优化器和优化目标的组合总会维持一个1)在模型空间中找到更好的模型 2)过拟合到某一个特定解 二者的平衡。现在我们还没有办法去控制这个平衡。

对于弱泛化最大的挑战可能就是对抗攻击了。 对抗方法会产生对模型最糟糕的的干扰,在这些扰动下模型会表现得非常差。 我们现在还没有对对抗样本鲁棒的深度学习方法, 但是我感觉这个问题最终会得到解决[5]。

现在有一些利用信息论的工作表明在训练过程中神经网络会明显地经历一个由 “记住”数据到”压缩”数据的转换。 这种理论正在兴起, 虽然仍然有关于这种理论是不是真的有效的讨论。 请关注这个理论,这个关于“记忆”和”压缩”的直觉是令人信服的。


强泛化:自然流形

在强泛化范畴,模型是在完全不同的数据分布上进行评估的, 但是数据来自于同一个流形(或数据产生过程)





如果测试数据分布于训练数据分布“完全不同”,我们如何来训练一个好的模型呢?实际上这些数据都来自同一个 “自然数据流形’‘ (natural data manifold)。 只要来源于同一个数据产生过程,训练数据和测试数据仍然含有很多的信息交叠。

现实可观察的数据可以被看作来源于一个非常高维的,不断变化的“自然流形”。一个数据元组(一段敲钹的的视频, 敲钹发出的声音)是这个流形上的一个点。数据元组(一段敲钹的视频,蛙鸣的声音)就不是这个流形上的点--这样的数据元组不符合现实。正如你感觉到的, 这个自然流形非常巨大, 它也是高度结构化的。例如,我们观察到的所有的数据都要遵循物理规律如重力定律, 物体不会突然出现,也不会突然消失等等。

强泛化可以看作是模型可以多好地学到这个 “超级流形”, 训练这个模型只使用了流形上的很小一部分样本。一个图像分类器不需要去发现麦克斯韦方程组--它只需要理解与流形上的数据点相一致的事实。

在ImageNet上训练的现代分类器已经基本上可以做到强泛化了。模型已经可以理解基础的元素比如边缘, 轮廓以及实体。这也是为什么常常会把这些分类器的权值迁移到其它数据集上来进行少样本学习(few shot learning),和度量学习(metric learning)。这样的迁移还有提升空间:在ImageNet上训练的分类器不是完全通用的,少样本学习任务还没有被解决,对抗样本仍然会造成很大干扰 。很明显,我们的模型还不能像人类一样明白它在看什么,但这是个开始

和弱泛化一样,我们可以对抗地采样测试集来让它的数据分布与训练集尽量不同。AlphaGo Zero是我最喜欢的例子: 在测试阶段,它看到的是与它在训练阶段完全不一样的, 来自人类选手的数据。此外,人类选手也在尽力把 AlphaGo Zero带到它在训练时从未见过的地方。虽然 AlphaGo Zero不能明确地理解抽象的数学, 对弈心理学或绿色是什么意思, 但是很明显它在围棋这个领域理解得很好,足够击败人类选手。 如果一个人工智能系统可以在有经验的人类的干扰下稳定地工作, 我认为它具有了足够的强泛化能力。

遗憾的是, 强化学习的研究忽略了强泛化问题。 大部分的基准都基于静态的环境, 没有多少认知的内容(比如人型机器人只知道一些关节的位置可能会带来奖励, 而不知道它的它的世界和它的身体是什么样子的)。

我相信解决强化学习可训练性问题的关键在于解决泛化性。我们的学习系统对世界的理解越多, 它就更容易获得学习的信号, 可能需要更少的样本。这也是为什么说 少样本学习(few shot learning),模仿学习(imitation learning), 学习如何学习(learning to learn)重要的原因了:它们将使我们摆脱采用方差大而有用信息少的暴力求解方式。

我相信要达到更强的泛化,我们要做到两件事:



首先我们需要模型可以从观察和实验中积极推理世界基本规律。符号推理(symbolic reasoning)和因果推理(causal inference)看起来已经是成熟的研究了, 但是对任何一种无监督学习可能都有帮助。 我想起了人类通过逻辑推理系统(数学)推导宇宙物理规律来理解天体运行。有趣的是, 在哥白尼的革命之前, 人类最初可能依赖某种贝叶斯式的启发(“迷信”), 当我们发现经典力学以后, 这些”贝叶斯”式的模型就被抛弃了。

我们的基于模型的机器学习方法(试图去“预测”环境的模型)现在正处于哥白尼革命之前的时期:它们仅仅是肤浅地基于一些统计原理进行内插, 而不是提出深刻的,一般性的原理来解释和推断可能在数百万光年以外或很久远的未来的事情。注意人类不需要对概率论有很好的掌握就能推导出确定性的天体力学, 这就产生了一个问题:是否有可能在没有明确的统计框架下进行机器学习和因果推理?

让我们的学习系统更具适应性可以大大降低复杂性。我们需要训练可以在线实时地思考,记忆, 学习的模型而不仅仅是只能静态地预测和行动的模型。

其次, 我们需要把足够多样的数据送给模型来促使它学到更为抽象的表示。只有环境里有非常丰富的内容,正确的表示才能被发掘出来(AlphaGo Zero 就提出了角色需要使用自然流形中多少的数据,才能具有一定的理解能力的问题)。没有这些限制的话,学习本身就是欠定义的,我们能够恰好找到一个好的解的可能性也非常小。 也许如果人类不能站起来看到天空,就不会想要知道为什么星星会以这样奇怪的椭圆形轨迹运行,也就不会获得智慧。

我想知道三体文明(出自小说《三体》)拥有如此高的技术水平是不是因为他们的生计取决于他们复杂的天体力学的理解。也许我们也应该在我们的Mujoco 和 Bullet环境中加入一些天体运行 : )

脚注:


[1]有一些研究领域不能被归入表达能力, 训练难度和泛化性能的框架内。比如说可解释性研究试图去解释为什么一个模型会有特定的行为。不仅仅是高风险领域(医疗, 执法)的机器学习技术用户关心这些研究,可解释性也能帮助解决泛化性问题:如果我们发现模型提供的诊断的方式或根据与一个人类医学专家非常不同,这很可能意味着我们的模型的推理方式并不能够泛化。确定你的模型学到了正确的东西比仅仅获得低的测试误差更为重要。差分隐私是另一个我们对机器学习模型的要求。这些话题超出了本文讨论的范畴。

[2]简单地解释为什么会这样:一个包含N个神经元的ReLU 全连接层会把一个线性空间切分成N个分段连续的部分。 再加一个ReLU层会再次切分, 产生N^2个分段线性部分, 三层就会是N^3个等等。详细的分析参见Raghu et al. 2017.

[3]这有时候会被称为多层次优化问题, 它含有一个“外部” 和一个 “内部”优化过程,而协同适应是同时进行的。 比如一个机器上并发进程的异步通信,或者生态系统中相互影响的物种进化。在这些例子中,没有明确的“外部” 和 “内部”优化过程。

[4]序列-序列注意力机制模型(seq2seq with attention)在刚被提出的时候达到了当时最好的水平, 但是我怀疑带有注意力机制只是让模型变得易于训练而不是增加模型的表达能力和泛化能力。可能单纯的序列-序列模型在有好的初始化情况下也可以做得一样好。

[5]一个缓解对抗攻击的想法,虽然无助于解决强泛化问题:让计算对抗扰动的代价变得极其高昂。模型和数据都是黑盒子。在推理期间每次调用模型时, 从训练好的模型中随机挑选一个送给对抗者而不告诉他们是哪一个模型。模型的训练彼此独立甚至可以用不同的架构。 这使得计算有限差分梯度变得很困难因为f(x+dx)-f(x)可以有任意大的方差。此外,由于我们采样不同的模型,连续模型梯度之间的梯度也会有很大的方差。另一种可行的方案就是使用多模态数据(视频, 多视角, 图像+声音), 对抗攻击者很难在扰动输入的同时保持不同模态输入的一致性。

La expresividad, la entrenabilidad y la generalización en el aprendizaje automático

Esta es una traducción de mi publicación anterior. Muchas gracias a Joaquin Antonio Ruales (@_jruales) por traducir esta publicación.

Cuando leo trabajos de investigación sobre el aprendizaje automático, intento clasificarlos en base al tipo de contribuciones que hacen: contribuciones en 1) Expresividad 2) Entrenabilidad y/o 3) Generalización. Aprendí este sistema de categorización de mi colega Jascha Sohl-Dickstein en Google Brain, y esta terminología también es propuesta por este trabajo de investigación. Esta categorización me ha resultado efectiva cuando trato de entender de qué manera cierto trabajo de investigación (especialmente si es teórico) conecta varios sub-campos de la investigación en inteligencia artificial (por ej.: robótica, modelos generadores, procesamiento de lenguas naturales) en un solo panorama general [1].

En esta entrada de blog, discuto la aplicación de estos conceptos a la investigación actual (noviembre de 2017) en el área del aprendizaje supervisado, aprendizaje no supervisado, y aprendizaje por refuerzo. Considero que la Generalización se compone de dos categorías — generalización "débil" y "fuerte" — y discutiré a cada una por separado. La siguiente tabla resume mi opinión de dónde están las cosas al momento:



Expresividad

¿Qué computaciones puede hacer este modelo?
Entrenabilidad

¿Qué tan fácil es ajustar el modelo a los datos?
Generalización débil

¿Qué tan bien funciona el modelo cuando ocurren pequeñas perturbaciones en la distribución de los datos?
Generalización fuerte

¿Qué tan bien funciona el modelo cuando ocurren grandes cambios en la distribución de los datos?
Aprendizaje supervisado

Aprende usando etiquetas creadas por humanos. Predice estas etiquetas
Fácil


OK
Ya mismo
Difícil
Aprendizaje no supervisado

Aprende sin necesidad de etiquetas creadas por humanos. Predice estas etiquetas.
Fácil
OK
Ya mismo
Difícil
Aprendizaje por refuerzo (RL)

Aprende a maximizar la recompensa en un entorno
Fácil
Difícil
Dificilísimo
Dificilísimo

Quisiera expresar mi más profundo agradecimiento a Jascha Sohl-Dickstein y a Ben Poole por sus comentarios y correcciones a esta entrada de blog, así como a Marcin Moczulski por las útiles discusiones sobre la entrenabilidad de las redes neuronales recurrentes.

Esta entrada de blog cubre un amplio rango de investigación desde mi punto de vista en particular. Cabe recalcar que cualquier error factual aquí es mío y no representa las opiniones de mis colegas o correctores. No duden en contribuir su opinión en los comentario o en enviarme un email si quieren discutir el artículo o sugerir correcciones — estoy aquí para aprender.


Expresividad

¿Qué computaciones puede hacer este modelo?

Existen medidas de expresividad que caracterizan lo complejas que pueden llegar a ser las funciones computadas por una red neuronal u otra función paramétrica. Las redes neuronales son exponencialmente expresivas con respecto a su profundidad, lo que significa que incluso las redes neuronales de tamaño moderado son lo suficientemente expresivas para la mayoría de problemas de aprendizaje supervisado, no supervisado y de refuerzo que se investigan hoy en día [2]. Una demostración de esto es que las redes neuronales profundas son capaces de memorizar conjuntos de datos muy grandes.

Las redes neuronales pueden expresar todo tipo de cosas: variables continuas, complejas, discretas e incluso estocásticas. Gracias a la investigación en modelado generativo y en aprendizaje profundo bayesiano en los últimos años, las redes neuronales profundas han producido increíbles resultados de modelado generativo.

Los recientes avances en el modelado generativo ilustran la profunda expresividad de las redes neuronales: las redes neuronales pueden producir geometrías multidimensionales de datos extremadamente complejas (audio, imágenes) que son casi indistinguibles de las reales. Aquí están unos resultados de generación de imágenes de caras usando una arquitectura de red generativa antagónica (GAN) reciente, propuesta por investigadores en NVIDIA:



Los resultados aún no son perfectos (nótese el fondo borroso), pero estamos muy cerca. Así mismo, en el campo de la síntesis de audio, las muestras de audio generadas por los más recientes modelos WaveNet suenan a gente real.

El aprendizaje no supervisado no se limita a los modelos generadores. Algunos investigadores, como Yann LeCun, quieren renombrar al aprendizaje no supervisado "aprendizaje predictivo", donde el modelo deduce el pasado, imputa el presente o predice el futuro. Sin embargo, dado que bastante del aprendizaje no supervisado se ha enfocado en predecir distribuciones conjuntas extremadamente complejas (imágenes del pasado/futuro, audio), creo que los modelos generadores son un punto de referencia bastante bueno para medir la expresividad en el dominio no supervisado.

Las redes neuronales también parecen ser lo suficientemente expresivas como para el aprendizaje por refuerzo. Incluso redes bastante pequeñas (2 capas convolucionales y 2 capas totalmente conectadas) son lo suficientemente potentes como para resolver las tareas de control de Atari y MuJoCo (aunque su "entrenabilidad" deja mucho que desear — consúltese la siguiente sección).

Por sí sola, la expresividad no es un asunto muy interesante: es simple aumentarla agregando más capas, más conectividad, etc. El desafío es hacer que las redes neuronales sean lo suficientemente expresivas como para tener un buen desempeño en el conjunto de entrenamiento y el de pruebas, y al mismo tiempo evitar que sea muy difícil el entrenamiento. Por ejemplo, el uso de convoluciones 2D parece ser necesario para que los modelos de clasificación de imágenes logren generalizar, a pesar de que una red profunda totalmente conectada tiene la capacidad suficiente para memorizar el conjunto de entrenamiento.

La expresividad es el problema más fácil (solo añade más capas!), pero es al mismo tiempo el más misterioso: no tenemos una buena manera de medir cuánta expresividad (y de qué tipo) se requiere en una tarea en particular. ¿Qué tipos de problemas necesitarán redes neuronales que sean varios órdenes de magnitud más grandes que las que se usan hoy en día? Por qué necesitarán tanta potencia de cómputo? ¿Será que las redes neuronales actuales ya son lo suficientemente expresivas para implementar inteligencia parecida a la humana? ¿Acaso resolver la generalización para nuevos y más difíciles problemas requiere modelos considerablemente más expresivos?

El cerebro tiene muchos órdenes de magnitud más "unidades neuronales" (1e11) que el número de unidades en nuestras redes neuronales grandes (Inception-ResNet-V2 tiene aproximadamente 25e6 unidades ReLU). Esta comparación ya es drástica, incluso cuando le damos a las neuronas artificiales ReLU el beneficio de la duda de que sean remotamente comparables a las neuronas biológicas. Incluso una sola neurona biológica (con sus diversos neurotransmisores, bosques dendríticos que integran la señal de otras 10,000 neuronas en una integración variable en el tiempo) también es increíblemente expresiva. Una langosta (el insecto) implementa su sistema de detección de colisiones con tan solo una neurona y ya vuela mejor que cualquier sistema de drones que hayamos construido. ¿De dónde viene toda esta expresividad y a dónde va? ¿Cuánta más expresividad necesitamos?

Entrenabilidad

Una vez encontrada una familia de modelos matemáticos lo suficientemente expresiva, ¿qué tan fácil es encontrar un buen modelo?

En el campo del aprendizaje automático, un modelo es cualquier programa de computadora cuya funcionalidad es aprendida en base a datos. Durante el "aprendizaje", buscamos un modelo razonablemente bueno que utilice los datos para tomar decisiones, de entre un espacio de modelos (potencialmente enorme). Este proceso de búsqueda usualmente se formula como la solución a un problema de optimización sobre el espacio de modelos.



Varios tipos de optimización

Una estrategia común, especialmente en el aprendizaje profundo, es establecer una métrica escalar que evalúe la "bondad" de un modelo (es decir, qué tan bueno es su desempeño). Después usamos una técnica de optimización numérica para maximizar tal "bondad" (o equivalentemente, "minimizar la maldad").

Un ejemplo concreto: la minimización del error de entropía cruzada es una manera estándar de entrenar redes neuronales para que clasifiquen imágenes. Esto se hace con la esperanza de que cuando el modelo haya minimizado la pérdida de entropía cruzada con respecto al conjunto de datos, también logrará lo que queremos, por ejemplo clasificar imágenes correctamente con cierto grado de precisión y exhaustividad en las imágenes de prueba.

La búsqueda de buenos modelos (el entrenamiento) no es, a la final, nada más que optimización — ¡no hay lugar a dudas! Sin embargo... los objetivos de optimización pueden ser difíciles de especificar. Un escenario clásico en el aprendizaje supervisado es el submuestreo (sub-resolución) de imágenes, en donde es difícil definir una sola métrica escalar que esté alineada exactamente con cómo los humanos perciben la "pérdida perceptual" de un algoritmo de submuestreo en particular. Asimismo, la super-resolución y la síntesis de imágenes también resultan difíciles, porque es difícil definir una fórmula para la "bondad" del modelo como un objetivo de maximización. ¡Imagínate descubrir una función matemática que determine de manera objetiva lo "fotorealista" que sea una imágen! El debate de cómo medir la calidad de los modelos generadores (para imágenes, audio) sigue y sigue incluso hasta hoy.

La técnica más popular de los últimos años que se ocupa de este problema es la estrategia de la co-adaptación. En esta estrategia, se formula el problema de optimización como la búsqueda de un punto de equilibrio entre dos distribuciones no estacionarias que evolucionan simultáneamente [3]. Una analogía intuitiva que explica por qué esta estrategia es "natural" es la evolución ecológica de una especie de predadores y una especie de presas. Primero, la especie de predadores se adaptan para poder cazar la presa efectivamente. Después, la especie de presas se adapta para evitar a los predadores. Y así sucesivamente. Las dos especies co-evolucionan como antagonistas el uno del otro, y el resultado es que ambas especies se vuelven más inteligentes.

Las redes generativas antagónicas (GAN) operan acorde a un principio similar para así no tener que explícitamente definir objetivos de pérdida perceptual. Asimismo, el auto-juego competitivo en el aprendizaje por refuerzo emplea este principio para aprender comportamientos complejos. Aunque el objetivo de optimización ahora tiene una especificación implícita, sigue siendo un problema de optimización, y los practicantes del aprendizaje automático pueden reutilizar herramientas familiares como las redes neuronales y el método estocástico del descenso más rápido (SGD, Stochastic Gradient Descent).

Las estrategias evolutivas típicamente aplican un método de optimización-como-simulación. El usuario especifica un sistema dinámico sobre una población de modelos, y en cada paso temporal de la simulación, la población se actualiza de acuerdo a las reglas del sistema dinámico. Los modelos pueden o no interactuar el uno con el otro. La simulación corre adelante en el tiempo, y se espera que la dinámica del sistema cause que la población eventualmente converja a un buen modelo.

Para un excelente tutorial sobre las estrategias evolutivas en el contexto del aprendizaje por refuerzo, véase el artículo A Visual Guide to Evolution Strategies (Una guía visual de las estrategias evolutivas) por David Ha.

La situación actual

La entrenabilidad ya básicamente ha sido resuelta para las redes neuronales prealimentadas (feedforward) y los objetivos de optimización "directos" que son comunes en el aprendizaje supervisado (afirmo esto empíricamente, no teóricamente). Algunos de los grandes avances tecnológicos publicados en el 2015 (normalización por lotes (Batch Norm), redes residuales (ResNets), buena inicialización) se usan ampliamente hoy en día para que las redes prealimentadas sean super entrenables. De hecho, hay redes neuronales con cientas de capas que logran minimizar el error de entrenamiento a cero en conjuntos de datos grandes. Véase éste trabajo de investigación para ver una síntesis completa de la infraestructura algorítmica y de hardware usadas por las redes neuronales profundas en la actualidad.

Las redes neuronales recurrentes todavía resultan un poco difíciles de entrenar, pero la comunidad de investigación sigue avanzando en el área, al punto que ya no se considera loco usar una red neuronal de gran memoria de corto plazo (LSTM) en un sistema robótico complejo y esperar que "simplemente funcione". Esto es increíble, considerando que en el 2014 no muchos confiaban en la entrenabilidad de las redes neuronales recurrentes, y en las décadas previas hubo un montón de trabajos que demostraban que las redes recurrentes eran horribles para entrenar. Existe evidencia que una gran cantidad de las arquitecturas de redes neuronales recurrentes son equivalentemente expresiva la una a la otra, y que cualquier diferencia en desempeño es a causa de que unas arquitecturas son más fáciles de entrenar que otras [4].

En el aprendizaje no supervisado, los datos de salida de los modelos suelen ser (¡no siempre!) más grandes — por ejemplo, 1024 x 1024 píxeles para imágenes, o secuencias gigantescas para la generación de habla y texto. Desafortunadamente, esto los hace más difíciles de entrenar.

Uno de los avances importantes del 2017 fue que la redes generativas antagónicas (GANs) se volvieron más fáciles de entrenar. Las mejoras más populares han sido simples modificaciones al objetivo de divergencia de Jensen-Shannon: mínimos cuadrados, desviación absoluta con margen y la desviación de Wasserstein (1, 2). El trabajo reciente de NVIDIA extiende el trabajo de las GANs basadas en Wasserstein, haciendo que el modelo sea menos sensible a una gran variedad de hiperparámetros, tales como los parámetros de normalización por lotes (BatchNorm), de elección de arquitectura, etc. La estabilidad es increíblemente importante para aplicaciones prácticas e industriales — es lo que nos da confianza de que un modelo será compatible con nuestras ideas de investigación o aplicaciones a futuro. Estos resultados son emocionantes porque indican que nuestras redes neuronales generadoras son lo suficientemente expresivas para generar las imágenes correctas, y el obstáculo que las detenía en el pasado era uno de entrenabilidad. Es posible que la entrenabilidad siga siendo un obstáculo — desafortunadamente con las redes neuronales es difícil saber si es que un modelo no es lo suficientemente expresivo y/o si es que no lo hemos entrenado lo suficiente.

La inferencia con variables latentes discretas dentro de las redes neuronales también solía ser difícil de entrenar a causa de la gran varianza producida por los estimadores de gradiente con técnicas Monte Carlo. Sin embargo, este tipo de inferencia ha resurgido en estos últimos años en todo tipo de arquitecturas, desde redes generativas antagónicas (GANs) a modelos de lenguajes, a redes neuronales con memoria aumentada, a aprendizaje por refuerzo. Las representaciones discretas son muy útiles desde un punto de vista de expresividad y es excelente que ahora podamos entrenarlas de manera bastante fiable.

Trágicamente, el aprendizaje profundo por refuerzo sigue bastante atrasado cuando se trata de la pura entrenabilidad, sin siquiera considerar el aspecto de la generalización. El aprendizaje por refuerzo es difícil porque para ambientes con más de 1 paso temporal, estamos buscando un modelo que realice la optimización (de la recompensa) en el momento de la inferencia. Hay un proceso interno de optimización en el cual el modelo induce el control óptimo, y un bucle externo de optimización que aprende este modelo óptimo, usando solo una base de datos de lo que el agente vio.

Hace poco, añadí una dimensión adicional a una tarea de control robótico contínuo, y el desempeño de mi algoritmo de aprendizaje por refuerzo de derrumbó de >80% a 10%. ¡El aprendizaje por refuerzo no es solo difícil, sino que también es poco fiable! Como el paisaje matemático de optimización es tan estocástico, no podemos siquiera obtener el mismo resultado cuando usamos diferentes semillas para el generador de números aleatorios. Por lo tanto, la estrategia es reportar la distribución de curvas de recompensa a lo largo de varios intentos, cada uno con diferente semilla aleatoria. Diferentes implementaciones del mismo algoritmo varían en desempeño en diferentes entornos, así que las métricas reportadas en la literatura deben ser tomadas con cautela.

¡Qué ridiculez! La entrenabilidad en el aprendizaje por refuerzo definitivamente sigue sin resolverse, porque aún no podemos aplicar nuestro modelo a un problema de escala un poquito más grande y esperar que el mismo aprendizaje haga la misma cosa 10 sobre 10 veces.

Si tratamos al aprendizaje por refuerzo como a un problema puramente de optimización (y lidiamos con la generalización y las tareas complejas más luego), el problema sigue siendo intratable. Digamos que hay un ambiente en donde una recompensa dispersa se da solo al final de un episodio (por ej. el cuidado de niños en el cual se le paga a la niñera cuando vuelven los padres a casa). El número de posibles acciones (y los resultados correspondientes) crecen exponencialmente en relación a la duración del episodio, pero solo pocas de esas secuencias de acciones corresponden al éxito.

Por lo tanto, estimar la gradiente de política en un punto en particular en el panorama matemático de optimización de modelos requiere una cantidad exponencial de muestras con respecto al espacio de acciones antes de que se obtenga una señal útil de aprendizaje. Esto es tan malo como tratar de calcular una expectativa Monte Carlo de una distribución de probabilidad (sobre todas las secuencias de acciones) en donde la masa de la distribución se concentra en una "distribución delta de Dirac" (ver diagrama a continuación). Cuando hay una superposición desvanecedora entre la distribución de propuestas (exploración) y la distribución de recompensas, los estimados de la gradiente de política en base a métodos Monte Carlo de muestras finitas simplemente no funcionarán, sin importar cuántas muestras se recolecten.



Además, si la distribución de datos es no estacionaria (tal como en el caso de los algoritmos fuera-de-política con un buffer de reproducción), recolectar "malos datos" puede introducir bucles de retroalimentación inestables en el proceso externo de optimización.

Aquí está la misma idea pero desde la perspectiva de la optimización en vez de de la estimación Monte Carlo: sin ninguna distribución a priori sobre el espacio de estados (tales como un entendimiento del mundo o una instrucción explícita proveída al agente), el panorama matemático de la optimización se ve como "queso suizo" — pequeños hoyos de soluciones óptimas convexas rodeadas de vastos altiplanos de espacio de parámetros en los cuales la información del gradiente de política es inútil. Esto significa que el espacio completo del modelo tiene básicamente cero información (porque la señal de aprendizaje es efectivamente uniforme a lo largo del espacio de modelos, a causa de que el área que no es cero es extremadamente pequeña).





Si no tenemos buenas representaciones sobre las cuales entrenar el modelo, nos resulta mejor ir ciclando por semillas aleatorios y tomando muestras aleatorias de políticas hasta que descubramos un buen modelo que aterrice en uno de estos hoyos de queso suizo. El hecho que esta técnica aleatoria sea sorprendentemente buena en el aprendizaje por refuerzo sugiere que es muy posible que nuestros paisajes de optimización se vean así.

Según yo, los entornos comparativos como Atari y MuJoCo del aprendizaje por refuerzo, aunque sean interesantes desde el punto de vista de la optimización, en verdad no van hasta el límite del aprendizaje automático, sino más bien simplemente resuelven una política monolítica que optimiza el desempeño en cierto entorno estéril. Hay poca presión selectiva que promueva que el modelo "generalice", así que el problema se vuelve uno de pura optimización, y no un problema del aprendizaje automático en verdad difícil.

No es que quiera complicar los problemas del aprendizaje por refuerzo con asuntos de generalización (¡ciertamente no hará las cosas fáciles de depurar!), pero creo que el aprendizaje de ambos—el entorno y la tarea—es la única manera que hará que el aprendizaje por refuerzo sea manejable para los problemas de robótica del mundo real.

Contrasta esto con el aprendizaje supervisado y el no supervisado, en los cuales podemos obtener señales de aprendizaje de manera barata, sin importar dónde estemos en el espacio de búsqueda de modelos. La distribución de propuesta para gradientes de mini-lotes tiene algo en común con la distribución de gradientes. Si estamos usando el método estocástico del descenso más rápido (Stochastic Gradient Descent) con mini-lotes de tamaño=1, entonces la probabilidad de muestrear la transición con una señal útil de aprendizaje es en el peor de los casos 1/N, en donde N es el tamaño del conjunto de datos (así que está garantizado que se aprenderá algo después de cada época de entrenamiento). Podemos llegar a una buena solución con la fuerza bruta simplemente echando al problema un montón de datos y potencia de cálculo. Además, mejorar la generalización perceptual de las capas más bajas puede de hecho tener un efecto de reducción de la varianza usando "boostrapping" encima de las características (features) de las capas de nivel bajo.

Para resolver los problemas de aprendizaje por refuerzo con alta dimensionalidad y complejidad, debemos primero considerar la generalización y el entendimiento perceptual general antes de atacar el problema de la optimización numérica. Intentar algo diferente es un gasto insensato de esfuerzo. Debemos llegar al punto en el que cada punto de datos provea un número positivo de bits al algoritmo de aprendizaje por refuerzo, y necesitamos tener una manera fácil de hacer un muestreo por importancia de gradientes cuando la tarea sea muy complicada (sin tener que recolectar exponencialmente más datos). Solamente entonces será razonable asumir que podemos tener éxito usando la fuerza bruta en este problema.

El aprendizaje por demostración, por imitación y por refuerzo inverso, y la interfaz con instrucciones de lenguaje natural quizá provean maneras de llevar la política inicial rápidamente a un punto que obtenga algo de señal de aprendizaje (por ejemplo, el entorno otorga una recompensa de 0 pero las observaciones ceden un poco de información útil para los sesgos inductivos del módulo de planificación del modelo).

En resumen: la entrenabilidad es: fácil para el aprendizaje supervisado, difícil-pero-ya-mismo-llega para el aprendizaje no supervisado, y sigue siendo terriblemente difícil para el aprendizaje por refuerzo.

Generalización

La generalización es el más profundo de los 3 problemas, y es la esencia misma del aprendizaje automático. En términos generales, es qué tan bueno es el desempeño del modelo en el conjunto de datos de prueba cuando ha sido entrenado en un conjunto de datos de entrenamiento.

Cuando se habla de la generalización, se distinguen dos escenarios: 1) los conjuntos de datos de entrenamiento y de prueba son muestreados de la misma distribución (y debemos aprender esta distribución solo en base a los datos de entrenamiento) o 2) los datos de entrenamiento y de prueba son muestreados de distribuciones distintas (y necesitamos generalizar de los datos de entrenamiento a los de prueba). Llamemos al (1) "generalización débil" y al (2) "generalización fuerte". Esta manera de clasificar la generalización puede también usar la nomenclatura "interpolación y extrapolación", o "robustez y entendimiento".

Generalización débil: Dos paisajes


¿Qué tan bien funciona el modelo cuando ocurren pequeñas perturbaciones en la distribución de los datos?

En la "generalización débil", asumimos que las muestras del conjunto de entrenamiento y del conjunto de prueba provienen de la misma distribución. Sin embargo, en el mundo real, casi siempre hay alguna diferencia entre la distribución de entrenamiento y la de prueba, incluso en el límite de un gran número de muestras.

Estas diferencias pueden venir del ruido del sensor, del deterioro gradual de los objetos, de variaciones en iluminación (puede que haya estado nublado el día en el que el fotógrafo tomó las imágenes del conjunto de prueba). Otra situación es que las diferencias pueden ser generadas por un antagonista. Las perturbaciones antagónicas son casi imperceptibles al ojo humano, así que podríamos considerar a los ejemplos antagónicos como que fueran muestras de la "misma distribución".

Consecuentemente, es útil en la práctica pensar sobre la "generalización débil" como la evaluación en una versión "perturbada" de la distribución de entrenamiento:



Una distribución perturbada de datos de prueba puede también inducir un paisaje de optimización perturbado (el punto más bajo es el mejor).


El hecho de que no conozcamos la distribución de prueba por adelantado presenta ciertas dificultades para la optimización. Si somos muy agresivos en optimizar el paisaje de entrenamiento (el mínimo *global* puntiagudo de la parte izquierda de la curva azul), terminamos con un modelo que es sub-óptimo con respecto a los datos de prueba (el mínimo *local* puntiagudo de la parte izquierda de la curva roja). Aquí, hemos sobreajustado ("overfitting" en inglés) a la distribución de entrenamiento o a muestras de datos de entrenamiento, y hemos fallado en cuanto a generalizar a la distribución perturbada de prueba.

La "regularización" es una técnica que empleamos para prevenir el sobreajuste. No tenemos ninguna información previa de qué será la perturbación en el conjunto de prueba, así que a menudo lo mejor que podemos hacer es tratar de entrenar en varias versiones aleatoriamente perturbadas de la distribución de entrenamiento, y tener la esperanza que estas incluyan las perturbaciones características de la distribución de prueba. Algunos regularizadores comúnmente usados en el aprendizaje profundo son: el método estocástico del descenso más rápido (Stochastic Gradient Descent), dropout, ruido en los pesos de la red, ruido en las activaciones, y aumento artificial de los datos. En el aprendizaje por refuerzo, es posible aleatorizar los parámetros de simulación para que se vuelva más robusto el entrenamiento. En su charla en ICLR 2017, Chiyuan Zhang comentó que él considera como regularización "cualquier cosa que haga que el entrenamiento sea más difícil" (en vez de la vista convencional de "limitar la capacidad del modelo"). Básicamente, *dificultar* la optimización mejora, de alguna manera, la generalización.

Esto es inquietante — nuestros métodos de "generalizar" son muy rudimentarios, equivalentes a una "lobotomía de optimizadores". Básicamente le lanzamos una llave de tuercas al optimizador con la esperanza que interfiera con el entrenamiento justo lo suficiente como para prevenir el sobreajuste (overfitting). Además, ¡mejorar la entrenabilidad puede hacernos pagar un precio en generalización! Esta manera de ver la generalización (débil) ciertamente complica la manera en la que procedemos con la investigación en el área de la entrenabilidad.

Pero si los mejores optimizadores sobreajustan, entonces ¿cómo explicamos por qué ciertos optimizadores parecen bajar ambos el error de entrenamiento y el de prueba? La realidad es que cualquier combinación de paisaje de optimización y de optimizador causa cierto balance entre 1) encontrar una mejor región de modelos y 2) sobreajustar a una solución específica, y no tenemos buenos métodos para controlar este balance.

La prueba más desafiante de la generalización débil es probablemente la de los ataques antagónicos, en donde las perturbaciones vienen de un "adversario" o "antagonista" que provee la peor posible perturbación para tus datos, de tal manera que con alta probabilidad, tu modelo se desempeñe mal. Aún no tenemos ninguna técnica de aprendizaje automático que sea muy robusta a ataques antagónicos, pero tengo la corazonada de que eventualmente será posible resolver este problema [5].

Hay algunos trabajos teóricos sobre la aplicación de la teoría de la información para mostrar que las redes neuronales aparentemente van a través de una transición de fases durante el proceso de entrenamiento en la cual el modelo cambia de "memorizar" los datos a "comprimirlos". Esta teoría está comenzando a tomar velocidad, pero sigue habiendo un debate académico sobre si es una teoría válida o no. Hay que mantener los ojos abiertos con respecto a esta teoría — la intuición de la "memorización" y la "compresión" es convincente.

Generalización fuerte: superficie geométrica natural

En las pruebas de la "generalización fuerte", el modelo es evaluado en una distribución de datos completamente diferente a la de prueba, pero con datos proviniendo de la misma superficie geométrica subyacente (o proceso generativo)



Cómo puede uno tener la esperanza de aprender un buen modelo para la distribución de prueba si es que es "completamente diferente" a la distribución de entrenamiento? La respuesta a esto es que estos vistazos de datos en verdad provienen de la misma superficie geométrica de "datos naturales". Aún puede haber un montón de información en común entre la distribución de entrenamiento y la de prueba, con tal de que provengan del mismo proceso generativo subyacente.

El espacio de datos observables en el mundo puede ser descrito como una "superficie matemática natural" contínuamente variante. La tupla (videoclip de un par de platillos chocando el uno con el otro, el sonido de los platillos chocando) is un punto en esta superficie matemática. La tupla (videoclip de un par de platillos chocando el uno con el otro, el sonido de ranas croando) no lo es — esos puntos de datos juntos simplemente son inconsistentes con nuestra realidad. Como puedes ver, aunque no hay duda que la superficie matemática es gigantesca, también es altamente estructurada. Por ejemplo las leyes físicas como la gravedad se obedecen en todos los datos que observamos, los objetos no desaparecen y reaparecen repentinamente, y así sucesivamente.

La generalización fuerte puede ser considerada la cantidad de esta "super-superficie" geométrica que es capturada por un modelo en particular que es solo entrenada en una diminuta muestra de puntos de datos de la superficie. Nótese que un clasificador de imágenes no necesita descubrir las ecuaciones de Maxwell — simplemente necesita tener un entendimiento de la realidad que sea consistente con los datos en la superficie geométrica.

Se puede argumentar que los modelos modernos de clasificación entrenados en ImageNet son buenos en la generalización fuerte — los modelos entrenados en ImageNet en verdad entienden conceptos tales como bordes, contornos y objetos, y por eso es que es tan común transferir sus pesos pre-entrenados a otros conjuntos de datos aparte de ImageNet para realizar aprendizaje "few-shot" ("de pocas tomas", en el que se entrena un modelo en muy pocos ejemplos en vez de cientos o más ejemplos) y aprendizaje de métricas. Sin embargo, podrían ser mucho mejores: los clasificadores entrenados en ImageNet no funcionan universalmente, el aprendizaje "few-shot" aún no ha sido resuelto completamente, y estos clasificadores todavía son susceptibles a ejemplos antagónicos. Obviamente nuestros modelos no entienden lo que están viendo de la misma manera en la que los humanos lo hacen. Sin embargo, es un comienzo.

Así como con la generalización débil, la distribución de prueba puede ser muestreada antagónicamente de tal manera que cause la máxima diferencia entre las distribuciones de entrenamiento y de prueba. El programa AlphaGo Zero (un programa que aprende a jugar el juego de mesa Go sin necesidad de observar juegos humanos, y que sin embargo logra vencer a los campeones mundiales de este juego) es mi ejemplo favorito: a la hora de la prueba, este programa observa datos de jugadores humanos completamente diferentes a los datos de su distribución de entrenamiento (nunca ha "visto" a un humano antes). Además, el humano está usando todo su inteligencia para llevar a AlphaGo a regímenes que no hayan sido observados en los datos de prueba. A pesar de que AlphaGo no entiende explícitamente nada sobre matemáticas abstractas, la psicología de oponentes, o qué significa el color verde, claramente entiende lo suficiente acerca del mundo como para ser más listo que un jugador humano en una tarea bastante específica. Si un sistema de inteligencia artificial es robusto en contra a un adversario humano experto, yo considero que tiene la suficiente capabilidad de generalización.

Tristemente, la investigación en el área del aprendizaje por refuerzo ha ignorado en gran medida el problema de la generalización fuerte. La mayoría de las tareas estandarizadas del aprendizaje por refuerzo utilizan ambientes estáticos, con muy poca riqueza perceptual (por ej., el humanoide no entiende su mundo o cómo se ve un cuerpo, sino que simplemente lo interpreta como un conjunto de articulaciones flotantes cuyas posiciones pueden llevar a obtener cierta recompensa).

Yo en verdad creo que resolver la generalización es esencial para resolver la entrenabilidad en el aprendizaje por refuerzo. Mientras más "entiende" el mundo nuestro sistema inteligente, mejor le irá obteniendo señales de aprendizaje, y posiblemente con menos muestras. Por esto es que el aprendizaje "few-shot", el aprendizaje por imitación, y el aprender-a-aprender son importantes: nos alejan de las soluciones de fuerza bruta en donde la varianza es alta y la información es baja.

Yo creo que son necesarias dos cosas para lograr formas más fuertes de generalización:

Primero, necesitamos modelos que activamente deduzcan las leyes fundamentales del mundo en base a la observación y la experimentación. El razonamiento simbólico y la inferencia causal parecen ser temas de estudio con bastante potencial, pero es probable que cualquier tipo de aprendizaje no supervisado pueda ayudar. Esto me recuerda de la larga búsqueda de la humanidad por entender el movimiento de los cuerpos celestes derivando las leyes físicas del universo por medio de un sistema de razonamiento lógico (las matemáticas). Es interesante tomar en cuenta que antes de la Revolución de Copérnico los humanos probablemente dependían al comienzo de heurísticas bayesianas ("supersticiones"), y estos modelos "bayesianos" fueron descartados una vez que descubrimos la mecánica clásica.

Nuestros métodos de aprendizaje automático en base a modelos (modelos que intentan "predecir" aspectos de su ambiente) son al momento "pré-copérnicos" en el sentido que solo interpolan en base a supersticiones estadísticas muy superficiales, en vez de desarrollar principios generales y profundos para explicar y extrapolar datos que pueden estar a millones de años luz de distancia o a muchos pasos temporales en el futuro. Nótese que los humanos en verdad no necesitaron entender la teoría de la probabilidad para derivar la mecánica determinística de los cuerpos celestes, lo cual plantea la pregunta de si habrá cómo usar el aprendizaje automático y la inferencia causal sin necesidad de usar explícitamente la estadística.

Una manera de drásticamente reducir el peso de la complejidad es hacer que nuestros sistemas de aprendizaje automático sean más adaptativos. Necesitamos ir más allá de los modelos de optimización que predigan o actúen en maneras estáticas. En vez de eso, tenemos que optimizar modelos que puedan pensar, recordar, y aprender, y todo esto en tiempo real.

Segundo, necesitamos echarle suficiente diversidad de datos al problema, para empujar al modelo a que desarrolle estas representaciones abstractas. Un ambiente necesita ser lo suficientemente rico como para forzar el desarrollo de la representación correcta (aunque AlphaGo Zero nos hace dudar de qué cantidad de la superficie geométrica natural de datos en verdad es necesaria para el agente). Sin estas restricciones, el problema está fundamentalmente subespecificado y la probabilidad de que accidentalmente descubramos la solución real es nula. Quizá los humanos nunca se hubieran vuelto seres inteligentes si no se hubieran podido parar en sus patas traseras y preguntado por qué las estrellas se mueven en tan raros patrones elípticos.

Me pregunto si la civilización trisolariana (del libro "El problema de los tres cuerpos") evolucionó a tal nivel de avance tecnológico porque su supervivencia dependía de su entendimiento de la mecánica celeste compleja. Quizá necesitemos incluir un poco de movimiento de cuerpos celestes en nuestros ambientes de simulación MuJoCo y Bullet :)

Notas


[1] Hay algunos campos de investigación que no caben tan bien en esta estructura de expresividad, entrenabilidad y generalización. Por ejemplo, la investigación en el campo de la interpretabilidad trata de entender por qué cierto modelo produce una respuesta en particular. Ésta respuesta no solo es exigida, en ciertos campos de alto riesgo (medicina, aplicación de la ley), por las autoridades responsables de las políticas relacionadas al aprendizaje automático y por los clientes del aprendizaje automático, sino que también pueden ayudarnos a entender mejor la generalización: si descubrimos que el modelo determina las diagnosis de manera muy distinta de la cual lo hacen los profesionales médicos humanos, esto podría significar que hay ciertos casos en los que el proceso deductivo del modelo fallará al momento de generalizar.

[2] Un bosquejo de la prueba: Una capa completamente conectada con N neuronas seguida de una no linealidad ReLU puede tajar a un espacio vectorial en N regiones lineales a trozos. La introducción de una segunda capa ReLU subdivide el espacio en N más pedazos, resultando en N^2 regiones lineales a trozos en el espacio de entrada. 3 capas son N^3, y así sucesivamente. Para un análisis más detallado, véase Raghu et al. 2017.

[3] Esto a veces se llama un problema de optimización multi-nivel. Sin embargo, esto implica un bucle de optimización "externo" y uno "interno", mientras que la co-adaptación puede ocurrir simultáneamente. Por ejemplo, procesos concurrentes en una sola máquina comunicándose asincrónicamente, o especies evolucionando contínuamente con respecto el una a la otra en un ecosistema. En estos casos, no hay bucles claros de optimización "externos" e "internos".

[4] Los modelos de secuencia-a-secuencia con atención lograron resultados de punta cuando fueron presentados por primera vez, pero sospecho que la ventaja que otorgan es una de entrenabilidad, no de expresividad o generalización. Es posible que los modelos de secuencia-a-secuencia sin atención obtengan resultados igual de buenos si son inicializados adecuadamente.

[5] Una idea para proteger en contra de los métodos antagónicos, sin resolver la generalización fuerte: hacer que sea extremadamente costoso computar las perturbaciones antagónicas. Los modelos y los datos son parcialmente como cajas negras. En cada llamada al modelo durante el momento de la inferencia, elige un modelo al azar de un conjunto de modelos entrenados, y entrega este modelo al adversario sin decirle qué modelo recibió. Los modelos son entrenados independientemente el uno del otro y pueden adoptar arquitecturas diferentes. Esto hace que sea difícil computar gradientes de diferencias finitas, por lo que f(x+dx) - f(x) puede tener una varianza arbitrariamente grande. Además, los gradientes entre cómputos sucesivos de gradiente aún tendrán una alta varianza porque diferentes pares de modelos pueden ser muestreados. Otra manera de mejorar las cosas sería usar datos multimodales (vídeo, multi-vista, imágenes + sonido), para que sea difícil perturbar entradas en una manera que preserve la consistencia de las entradas.

Wednesday, January 17, 2018

Normalizing Flows Tutorial, Part 2: Modern Normalizing Flows

This tutorial will show you how to use normalizing flows like MAF, IAF, and Real-NVP to deform an isotropic 2D Gaussian into a complex cloud of points spelling the words "SIGGRAPH" in space. Like stretching taffy.
In my previous blog post, I described how simple distributions like Gaussians can be “deformed” to fit complex data distributions using normalizing flows. We implemented a simple flow by chaining 2D Affine Bijectors with PreLU nonlinearities to build a small invertible neural net.

However, this MLP flow is pretty weak: there are only 2 units per hidden layer. Furthermore, the non-linearity is monotonic and piecewise linear, so all it does is slightly the data manifold around the origin. This flow completely fails to implement more complex transformations like separating an isotropic Gaussian into two modes when trying to learn the “Two Moons” dataset below:



Fortunately, there are several more powerful normalizing flows that have been introduced in recent Machine Learning literature. We will explore several of these techniques in this tutorial.

Autoregressive Models are Normalizing Flows


Autoregressive density estimation techniques like WaveNet and PixelRNN model learn complex joint densities $p(x_{1:D})$ by decomposing the joint density into a product of one-dimensional conditional densities, where each $x_i$ depends on only the previous $i-1$ values:

$$p(x) = \prod_i{p(x_i \,|\, x_{1:i-1})}$$

The conditional densities usually have learnable parameters. For example, a common choice is an autoregressive density $p(x_{1:D})$ whose conditional density is a univariate Gaussian, whose mean and standard deviations are computed by neural networks that depend on the previous $x_{1:i-1}$.

$$p(x_i \,|\, x_{1:i-1}) = \mathcal{N}(x_i  \,|\,\mu_i, (\exp\alpha_i)^2)$$
$$\mu_i = f_{\mu_i}(x_{1:i-1})$$
$$\alpha_i = f_{\alpha_i}(x_{1:i-1})$$

Learning data with autoregressive density estimation makes the rather bold inductive bias that the ordering of variables are such that your earlier variables don’t depend on later variables. Intuitively, this shouldn’t be true at all for natural data (the top row of pixels in an image does have a causal, conditional dependency on the bottom of the image). However it’s still possible to generate plausible images in this manner (to the surprise of many researchers!). 

To sample from this distribution, we compute $D$ “noise variates” $u_{1:D}$ from the standard Normal, $N(0,1)$, then apply the following recursion to get $x_{1:D}$.

$$x_i = u_i\exp{\alpha_i} + \mu_i$$
$$u_i \sim \mathcal{N}(0, 1)$$

The procedure of autoregressive sampling is a deterministic transformation of the underlying noise variates (sampled from $\mathcal{N}(0, \mathbb{I})$) into a new distribution, so autoregressive samples can actually be interpreted as a TransformedDistribution of the standard Normal!

Armed with this insight, we can stack multiple autoregressive transformations into a normalizing flow. The advantage of doing this is that we can change the ordering of variables $x1,...xD$ for each bijector in the flow, so that if one autoregressive factorization cannot model a distribution well (due to a poor choice of variable ordering), a subsequent layer might be able to do it.

The Masked Autoregressive Flow (MAF) bijector implements such a conditional-Gaussian autoregressive model. Here is a schematic of the forward pass for a single entry in a sample of the transformed distribution, $x_i$:



The gray unit $x_i$ is the unit we are trying to compute, and the blue units are the values it depends on. $\alpha_i$ and $\mu_i$ are scalars that are computed by passing $x_{1:i-1}$ through neural networks (magenta, orange circles). Even though the transformation is a mere scale-and-shift, the scale and shift can have complex dependencies on previous variables. For the first unit $x_1$, $\mu$ and $\alpha$ are usually set to learnable scalar variables that don’t depend on any $x$ or $u$.

More importantly, the transformation is designed this way so that computing the inverse $u = f^{-1}(x)$ does not require us to invert $f_\alpha$ or $f_\mu$. Because the transformation is parameterized as a scale-and-shift, we can recover the original noise variates by reversing the shift and scale: $u = (x-f_\mu(x))/\exp(f_\alpha(x))$. The forward and inverse pass of the bijector only depend on the forward evaluation of $f_\alpha(x)$ and $f_\mu(x)$, allowing us to use non-invertible functions like ReLU and non-square matrix multiplication in the neural networks $f_\mu$ and $f_\alpha$.

The inverse pass of the MAF model is used to evaluate density:

distribution.log_prob(bijector.inverse(x)) + bijector.inverse_log_det_jacobian(x))




Runtime Complexity and MADE


Autoregressive models and MAF can be trained “quickly” because all conditional likelihoods $p(x_1), p(x_2\,|\, x_1), ... p(x_D\,|\, x_{1:D-1}))$ can be evaluated simultaneously in a single pass of D threads, leveraging the batch parallelism of modern GPUs. We are operating under the assumption that parallelism, such as SIMD vectorization on CPUs/GPUs, has zero runtime overhead.

On the other hand, sampling autoregressive models is slow because you must wait for all previous $x_{1:i-1}$ to be computed before computing new $x_i$. The runtime complexity of generating a single sample is D sequential passes of a single thread, which fails to exploit processor parallelism.

Another issue: in the parallelizable inverse pass, should we use separate neural nets (with differently-sized inputs) for computing each $\alpha_i$ and $\mu_i$? That's inefficient, especially if we consider that learned representations between these D networks should be shared (as long as the autoregressive dependency is not violated). In the Masked Autoencoder for Distribution Estimation (MADE) paper, the authors propose a very nice solution: use a single neural net to output all values of $\alpha$ and $\mu$ simultaneously, but mask the weights so that the autoregressive property is preserved.

This trick makes it possible to recover all values of $u$ from all values of $x$ with a single pass through a single neural network (D inputs, D outputs). This is far more efficient than processing D neural networks simultaneously (D(D+1)/2 inputs, D outputs).

To summarize, MAF uses the MADE architecture as an efficiency trick for computing nonlinear parameters of shift-and-scale autoregressive transformations, and casts these efficient autoregressive models into the normalizing flows framework.

Inverse Autoregressive Flow (IAF)


In Inverse Autoregressive Flow, the nonlinear shift/scale statistics are computed using the previous noise variates $u_{1:i-1}$, instead of the data samples:

$$x_i = u_i\exp{\alpha_i} + \mu_i$$
$$\mu_i = f_{\mu_i}(u_{1:i-1})$$
$$\alpha_i = f_{\alpha_i}(u_{1:i-1})$$




The forward (sampling) pass of IAF is fast: all the $x_i$ can be computed in a single pass of $D$ threads working in parallel. IAF also uses MADE networks to implement this parallelism efficiently.

However, if we are given a new data point and asked to evaluate the density, we need to recover $u$ and this process is slow: first we recover $u_1 = (x-\mu_1) * \exp(-\alpha_1)$, then $u_i = (x-\mu_i(u_{1:i-1})) * \exp(-\alpha_i(u_{1:i-1}))$ sequentially. On the other hand, it’s trivial to track the (log) probability of samples generated by IAF, since we already know all of the $u$ values to begin with without having to invert from $x$.

The astute reader will notice that if you re-label the bottom row as x_1, .. x_D, and the top row as u_1, … u_D, this is exactly equivalent to the Inverse Pass of the MAF bijector! Likewise, the inverse of IAF is nothing more than the forward pass of MAF (with $x$ and $u$ swapped). Therefore in TensorFlow Distributions, MAF and IAF are actually implemented using the exact same Bijector class, and there is a convenient “Invert” feature for inverting Bijectors to swap their inverse and forward passes.

iaf_bijector = tfb.Invert(maf_bijector)

IAF and MAF make opposite computational tradeoffs - MAF trains quickly but samples slowly, while IAF trains slowly but samples quickly. For training neural networks, we usually demand way more throughput with density evaluation than sampling, so MAF is usually a more appropriate choice when learning distributions.

Parallel Wavenet


An obvious follow-up question is whether these two approaches can be combined to get the best of both worlds, i.e. fast training and sampling.

The answer is yes! The much-publicized Parallel Wavenet by DeepMind does exactly this: an autoregressive model (MAF) is used to train a generative model efficiently, then an IAF model is trained to maximize the likelihood of its own samples under this teacher. Recall that with IAF, it is costly to compute density of external data points (such as those from the training set), but it can cheaply compute density of its own samples by caching the noise variates $u_{1:D}$, thereby circumventing the need to call the inverse pass. Thus, we can train the “student” IAF model by minimizing the divergence between the student and teacher distributions.



This is an incredibly impactful application of normalizing flows research - the end result is a real-time audio synthesis model that is 20 times faster to sample, and is already deployed in real-world products like the Google Assistant.


NICE and Real-NVP


Finally, we consider is Real-NVP, which can be thought of as a special case of the IAF bijector.

In a NVP “coupling layer”, we fix an integer $0 < d < D$. Like IAF, $x_{d+1}$ is a shift-and-scale that depends on previous $u_{d}$ values. The difference is that we also force $x_{d+2}, x_{d+3}, … x_{D}$ to only depend on these $u_{d}$ values, so a single network pass can be used to produce $\alpha_{d+1:D}$ and $\mu_{d+1:D}$.

As for $x_1:d$ they are “pass-through” units that are set equivalently to $u_{1:d}$. Therefore, Real-NVP is also a special case of the MAF bijector (since $\alpha(u_{1:d}) = \alpha(x_{1:d})$).



Because the shift-and-scale statistics for the whole layer can be computed from either $x_{1:d}$ or $u_{1:d}$ in a single pass, NVP can perform forward and inverse computations in a single parallel pass (sampling and estimation are both fast). MADE is also not needed.

However, empirical studies suggest that Real-NVP tends to underperform MAF and IAF and my experience has been that NVP tends to fit my toy 2D datasets (e.g. SIGGRAPH dataset) more poorly when using the same number of layers.

Real-NVP was a follow-up work to the NICE bijector, which is a shift-only variant that assumes $\alpha=0$. Because NICE does not scale the distribution, the ILDJ is actually constant!

Batch Normalization Bijector


The Real-NVP paper proposes several novel contributions, one of which is a Batch Normalization bijector used to stabilize training. Conventionally, Batch Norm is applied to training neural networks where the forward statistics are mean-centered and scaled to diagonal unit covariance, and the batchnorm statistics (running mean, running variance) are accumulated via an exponential moving average. At test time, the accumulated statistics are used to normalize data.

In normalizing flows, batch norm is used in bijector.inverse during training, and the accumulated statistics are used to de-normalize data at “test time” (bijector.forward). Concretely, BatchNorm Bijectors are typically implemented as follows:


Inverse pass:
  1. Compute the current mean and standard deviation of the data distribution $x$.
  2. Update running mean and standard deviation
  3. Batch normalize the data using current mean/std
Forward pass:
  1. Use running mean and standard deviation to un-normalize the data distribution. 

Thanks to TF Bijectors, this can be implemented with only a few lines of code:




The ILDJ can be derived easily by simply taking the log derivative of inverse function (consider the univariate case).

Code Example


Thanks to the efforts of Josh Dillon and the Google Bayesflow team, there is already a flexible implementation of MaskedAutoregressiveFlow Bijector that uses MADE networks to implement efficient recovery of $u$ for training.

I’ve created a complex 2D distribution, which is a point cloud in the shape of the letters “SIGGRAPH” using this blender script. We construct our dataset, bijector, and transformed distribution in a very similar fashion to the first tutorial, so I won’t repeat the code snippets here - you can find the Jupyter notebook here. This notebook can train a normalizing flow using MAF, IAF, Real-NVP with/without BatchNorm, for both the "Two Moons" and "SIGGRAPH" datasets.

One detail that’s easy to miss / introduce bugs on is that this doesn’t work at all unless you permute the ordering of variable at each flow. Otherwise, none of the layers’ autoregressive factorization will be learn structure of $p(x1 | x2)$. Fortunately, TensorFlow has a Permute bijector specially made for doing this.





Here’s the learned flow, along with the final result. It reminds me a lot of a taffy pulling machine.








Discussion


TensorFlow distributions makes normalizing flows easy to implement, and automatically accumulate all the Jacobians determinants in a chain for us in a way that is clean and highly readable. When deciding which Normalizing Flow to use, consider the design tradeoff between a fast forward pass and a fast inverse pass, as well as between an expressive flow and a speedy ILJD.

In Part 1 of the tutorial, I motivated Normalizing Flows by saying that we need availability of more powerful distributions that can be used in reinforcement learning and generative modeling. In the big picture of things, it’s not clear whether having volume-tracking normalizing flows is actually the best tool for AI applications like robotics, structured prediction, when techniques like variational inference and implicit density models already work extremely well in practice. Even still, normalizing flows are a neat family of methods to have in your back pocket and they have demonstrable real-world applications, such as in real-time generative audio models deployed on Google Assistant.

Although explicit-density models like normalizing flows are amenable to training via maximum likelihood, this is not the only way they can be used and are complementary to VAEs and GANs. It’s possible to use normalizing flow as a drop-in replacement for anywhere you would use a Gaussian, such as VAE priors and latent codes in GANs. For example, this paper use normalizing flows as flexible variational priors, and the TensorFlow distributions paper presents a VAE that uses a normalizing flow as a prior along with a PixelCNN decoder. Parallel Wavenet trains an IAF "student" model via KL divergence.

One of the most intriguing properties of normalizing flows is that they implement reversible computation (i.e. have a defined inverse of an expressive function). This means that if we want to perform a backprop pass, we can re-compute the forward activation values without having to store them in memory during the forward pass (potentially expensive for large graphs). In a setting where credit assignment may take place over very long time scales, we can use reversible computation to “recover” past decision states while keeping memory usage bounded. In fact, this idea was utilized in the RevNets paper, and was actually inspired by the invertibility of the NICE bijector. I’m reminded of the main character from the film Memento who is unable to store memories, so he uses invertible compute to remember things.

Thank you for reading.



Acknowledgements


I’m grateful to Dustin Tran, Luke Metz, Jonathan Shen, Katherine Lee, and Samy Bengio for proofreading this post.

References and Further Reading