反向传播和基于梯度的优化是机器学习(ML)重大突破的核心最近几年。人们普遍认为,机器学习的快速发展得益于研究人员使用第三方框架(如PyTorch、TensorFlow)来解析ML代码。这些框架不仅具有自动微分(AD)功能,还为原生代码提供了基本的计算功能。ML所依赖的这些软件框架都是围绕AD的逆向模式构建的。这主要是因为在ML中,当输入的梯度很大时,可以通过反向模式的单个评估来准确高效地评估。自动微分算法分为正向模式和反向模式。但前向模式的特点是只需要对一个函数进行一次前向评估(即不使用反向传播),计算成本大大降低。为此,来自剑桥和微软等机构的研究人员对该模型进行了探索,表明仅使用前向自动微分也可以在一系列机器学习框架上实现稳定的梯度下降。论文地址:https://arxiv.org/pdf/2202.08587v1.pdf他们认为正梯度有利于改变经典机器学习训练流水线的计算复杂度,降低训练的时间和精力成本,影响机器学习的硬件设计,甚至对大脑中反向传播的生物学合理性都有影响。1自动微分的两种模式首先简单回顾一下自动微分的两种基本模式。给定正向模式下的函数f:θ∈Rn,v∈Rn,正向模式下的AD会计算f(θ)和雅可比向量积Jf(θ)v,其中Jf(θ)∈Rm×n是在θ处计算的f的所有偏导数的雅可比矩阵,v是扰动向量。对于f:Rn→R的情况,雅可比向量积对应的方向导数记为?f(θ)-v,即θ处的梯度?f到方向向量v的映射,表示方向沿方向变化率。值得注意的是,正向模式在一次正向运行中同时评估函数f及其雅可比向量积Jfv。另外,获取Jfv不需要计算雅可比向量Jf,这种特性称为无矩阵计算。给定一个反向模式下的函数f:Rn→Rm,取值θ∈Rn,v∈Rm,AD反向模式会计算f(θ)和雅可比向量积v|Jf(θ),其中Jf∈Rm×n是f在θ处求值的所有偏导数的雅可比矩阵,v∈Rm是邻接向量。对于f:Rn→R和v=1,反向模式计算梯度,即f相对于所有n个输入的偏导数?f(θ)=h?f?θ1,。..,?f?θni|。请注意,v|Jf是在前向-后向评估中计算的,没有计算JacobianJf。运行时间成本两种AD模式的运行时间受运行被微分函数f所需时间的常数倍数的限制。反向模式比正向模式更昂贵,因为它涉及数据流的反转,并且需要保留正向传递中所有操作结果的记录,因为需要这些记录来评估后续反向传递中的导数。内存和计算成本特性最终取决于AD系统实现的功能,例如利用稀疏性。成本可以通过假设基本操作的计算复杂度来分析,例如存储、加法、乘法和非线性操作。将评估原始函数f所需的时间表示为runtime(f),我们可以将正向和反向模式所需的时间分别表示为Rf×runtime(f)和Rb×runtime(f)。实际上,Rf通常在1到3之间,Rb通常在5到10之间,尽管这些结果高度依赖于程序。2MethodsForwardGradientDefinition1给定一个函数f:Rn→R,他们定义“forwardgradient”g:Rn→Rn为:其中θ∈Rn是评估梯度的关键点,v∈Rn是一个扰动向量,被视为多元随机变量v~p(v),使得v的标量分量vi是独立的,对于所有i具有零均值和单位方差,?f(θ)-v∈R是f在点θ处在v方向上的方向导数。简单说一下这个定义的由来。如前所述,前向模式直接给了我们方向导数?f(θ)-v=Pi?f?θivi而不计算?f。向前计算fn次,方向向量作为标准基(one-hotcode)向量ei∈Rn,i=1...n,其中ei表示第i坐标为1,其他位置为0向量,在这种情况下,?f可以仅使用正向模式计算。这样,f对每个输入?f?θi的敏感度就可以单独评估,所有的结果可以结合起来得到梯度?f。为了获得优于反向传播的运行时优势,我们需要在每次优化迭代中运行一次正向模式。在正向运行中,我们可以将方向v理解为灵敏度加权和中的权重向量Pi?f?θivi,尽管这并没有区分每个θi在最终总和中的贡献。因此,我们使用权重向量v将整体灵敏度归因于每个单独的参数θi,与每个参数θi的权重vi成正比(例如,权重小的参数对整体灵敏度的贡献很小,权重大的参数贡献很大)。总之,每次我们评估前向梯度时,我们只需要做以下事情:采样一个与f的第一个参数大小相同的随机扰动向量v~p(v)。通过AD正向模式运行f函数会在一次正向运行中评估f(θ)和?f(θ)-v,而无需在此过程中计算?f。得到的方向导数(?f(θ)-v)是一个标量,由AD精确计算(而非近似)。将标量方向导数?f(θ)-v乘以向量v得到g(θ),前向梯度。图1显示了Beale函数的几个前向梯度的评估结果。我们可以看到对于k∈[1,5],扰动vk(橙色)如何转化为正向梯度(?f-vk)vk(蓝色),当受到指向(红色)的约束时,偶尔会指向正确的梯度。绿色箭头表示蒙特卡洛梯度是通过平均前向梯度来评估的,即1KPKk=1(?f-vk)vk≈E[(?f-v)v]。前向梯度下降他们建立了前向梯度下降(FGD)算法,用前向梯度g代替标准梯度下降中的梯度?f(算法1)。在实践中,他们使用一个小的随机版本,其中ft在每次迭代中都会发生变化,因为它受到训练中使用的每个小批量的影响。研究人员注意到算法1中的方向导数dt可以是正的也可以是负的。如果为负,则正梯度gt的方向将反转,指向预期的真实梯度。图1中显示的两个vk示例演示了此行为。在本文中,他们将范围限制在FGD,纯粹研究这种底层算法,并将其与标准反向传播进行比较,而没有考虑其他各种混杂因素,例如动量或自适应学习率。作者认为前向梯度算法可以应用于其他基于梯度算法的优化算法系列。3实验研究人员在PyTorch中进行前向AD进行实验。他们发现前向梯度与反向传播这两种方法在内存方面没有实际差异(每个实验小于0.1%)。逻辑回归图3显示了针对MNIST数字分类的多变量逻辑回归的多次运行结果。我们观察到,与基本运行时间相比,前向梯度和反向传播的运行时间成本分别为Rf=2.435和Rb=4.389,这符合人们对典型AD系统的预期。比率Rf/Rb=0.555和Tf/Tb=0.553表明前向梯度在运行时间和损失性能方面比反向传播快两倍。在简单模型中,这些比率是一致的,因为两种技术在空间行为上具有几乎相同的迭代损失,这意味着运行时增益几乎直接反映在每个时间空间的损失中。多层神经网络图4显示了在不同学习率下使用多层神经网络进行MNIST分类的两个实验。他们使用了三个完全连接的层,架构大小分别为1024、1024和10。在这个模型架构中,他们观察到前向梯度和反向传播相对于基本运行时间的运行成本为Rf=2.468和Rb=4.165,相对度量Rf/Rb平均为0.592,与逻辑回归的情况大致相同。有趣的是,在第二个实验(学习率为2×10-4)中,我们可以看到前向梯度在每次迭代中实现了损失图的快速下降。作者认为这种行为是由于常规SGD(反向传播)和前向SGD算法的随机性不同,因此他们推测前向梯度引入的扰动可能有利于探索损失平面。我们从时间图中可以看出,正向模式减少了运行时间。我们看到损失性能指标Tf/Tb的值为0.211,这表明在验证实验损失期间,前向梯度比反向传播快四倍以上。卷积神经网络图5显示了卷积神经网络在同一MNIST分类任务上的前向梯度和反向传播的比较。在此架构中,他们观察到前向AD相对于基本运行时表现最佳,其中前向模式的Rf=1.434仅代表基本运行时的43%开销。Rb=2.211的反向传播非常接近逆向AD系统中预期的理想情况。Rf/Rb=0.649表示正向AD运行时比反向传播具有显着优势。在损失空间中,他们得到比率Tf/Tb=0.514,这表明前向梯度比验证损失实验中的反向传播快两倍。可扩展性前面的几个结果表明,可以在没有反向传播的情况下在典型的ML训练管道中进行训练,并以计算竞争的方式进行训练;在相同的参数(学习率和学习率衰减)下,前向AD比反向传播花费的时间少得多。相对于基本运行时的成本,我们看到,对于大多数实验,反向传播在Rb∈[4,5]内,前向梯度在Rf∈[3,4]内。我们还观察到前向梯度算法在整个运行范围内都是有益的。Rf/Rb比率在10层内保持低于0.6,在100层内略高于0.8。重要的是,这两种方法在内存消耗上几乎没有区别。4结论总的来说,这项工作的主要贡献如下:他们将“前向梯度”(forwardgradient)定义为:一种无偏的、基于前向的自动微分并且不涉及反向传播。梯度估计器。他们在PyTorch中从零开始,在不依赖PyTorch中现有的反向传播的情况下,实现了前向模式的自动微分系统。他们将前向梯度模式应用于各种随机梯度下降(SGD)优化,最终结果充分证明了仅使用自动差分前向传播就可以构建典型的现代机器学习训练管道。他们对比了前向梯度和反向传播的运行时间和损失消耗等,证明了在某些情况下,前向梯度算法的速度是反向传播的两倍。
