导航菜单
首页 » 无极4 » 正文

云画的月光-梯度下降是最好的程序员:Julia未来将内嵌可微编程体系

参加:思源、一鸣

假如一种言语,它本身便是一个可微编程体系,那写起代码来又是怎样的。

假如一种言语,它本身便是一个可微编程体系,那写起代码来又是怎样的。

近来,Julia Computing 团队宣布论文表明他们构建了一种可微编程体系,它能将主动微分内嵌于 Julia 言语,然后将其作为榜首级的言语特性。也便是说,咱们今后直接用 Julia 言语及可微编程就能写模型了?都不需求再调用 TensorFlow 或 PyTorch 这样的结构了?

假如咱们将可微编程体系视为编程言语最重要的特性之一,那么不论是机器学习仍是其它科学核算都将便利不少,这样的言语也将是科学核算最好的言语。Y Combinator Research 研讨者 Michael Nielsen 对此也十分振奋,他十分附和 Andrej Karpathy 所说的「梯度下降是更好的程序员」。

Karpathy 一起也回复到:「咱们正向前移动了一点,与本来对程序有完好的界说不同,咱们现在仅仅写一个大致的架构,这样的架构会经过权重参数化。假如咱们有一个好的评价规范,那么最优化算法就能帮咱们找到更好的解。」

这儿 Karpathy 说的便是机器学习和编程的差异,ML 会经过梯度下降等最优化办法主动查找最优解。但这儿有个问题,模型需求梯度才干向着最优行进,因而模型的许多部分都要求是可微的。鉴于这一点,许多人也就将 ML 称号为可微编程了。

可是可微编程只能用于机器学习吗?它能不能扩展到其它范畴,乃至成为编程言语的根本特性?答案是能够的,这便是 Julia 团队及 MIT 等其他研讨机构正在测验的。

近年来,机器学习模型越来越精妙,展现出了许多科学核算的特性,旁边面凸显了机器学习结构的强壮才能。研讨者表明,由于广泛的科学核算和机器学习范畴在底层结构上都需求线性代数的支撑,因而有可能以可微编程的方式,发明一种新的核算基础设施。

  • 论文地址:https://arxiv.org/pdf/1907.07587.pdf
  • GitHub项目地址:https://github.com/MikeInnes/zygote-paper

可微编程与 DL 结构又有什么不同

在论文中,研讨人员提出了一种可微编程体系,它能在 Julia 言语中完结梯度核算,并成为 Julia 言语的榜首级特性。这使得构建深度学习模型变得更直观。更重要的是,这令用户能够运用已有的 Julia 科学核算包去构建深度学习模型,并高效完结梯度核算。

那么可微编程与 TensorFlow 或 PyTorch 等 DL 结构又有什么不同,它的速度莫非还要快于这些构建细算图的体系?研讨者表明,可微编程会履行 source-to-source 的转化,主动微分转化根本上没有运转时开支,因而它要比反向传达的实践核算本钱更有优势。

在 Reddit 上也有开发者评论到了这一点:云画的月光-梯度下降是最好的程序员:Julia未来将内嵌可微编程体系

一位名为「Coconut_island」开发者表明,Zygote 和现有的机器学习结构的不同之处在于,Zygote 将源代码视为核算图,省掉了中心言语的进程。更重要的是,经过操控流进行子梯度核算,这种梯度核算的办法能够运用在任何一种操控流分支上,具有代码的抽象性。

科学核算和机器学习的联婚:可微编程

咋一看,科学核算和机器学习分属不同的范畴。现代机器学习在神经网络上的打破使得整个学科取得了极大的前进。神经网络能够处理许多不同的核算机科学问题,使得人们开端规划新的硬件和软件,以便于提高功能,处理极许多的标示数据,并能够一起将练习好的模型布置在设备上。科学核算与之相反,它具有十分悠长的前史,且希望运用一系列从物理现象中获取的建模技能。

和典型的机器学习研讨者不同,许多科学核算学家在数据量较少、但核算复杂度更高和规模更广的数据上进行研讨。可是调查来看,科学核算和机器学习有共同点。两个范畴都倾向于运用动态编程言语进行核算,如 Python、R 和 Julia。一般来说,Python 和 R 的要害功能模块都运用 C++和 Fortran,而 Julia 中则较少。而且两者的中心核算流程都是根据线性代数的,而且有硬件专门用于加快这种核算。

由于机器学习和科学核算都依靠线性代数,且已有许多硬件专门优化用于加快运算,因而可微编程具有进一步交融两者的潜力。运用何种言语完结这项作业呢?由于编程作业量的问题,研讨人员仅挑选在 Julia 言语上添加可微编程才能。挑选这门言语的一个原因是,Julia 言语已有许多的机器学习和科学核算包,都是朴实的 Julia 言语完结。这能够协助他们在相对较多的运用中进行测验。

研讨人员表明,已有的 Julia 程序包能够直接运用他们的体系,包含处理用户界说类、根据状况的操控流,以及经过「source-to-source」主动微分进行许多标量运算。论文展现了一些运用可微编程的事例。

用 Z云画的月光-梯度下降是最好的程序员:Julia未来将内嵌可微编程体系ygote 对正弦函数进行微分求导

研讨人员以正弦函数为例,解说可微编程的办法。如图为正弦函数 sin(X) 的泰勒打开:

这个公式能够运用 Julia 言语进行界说,为了运转,请装置 Julia 言语 1.1 以上版别,并装置 Zygote.jl 和 ForwardDiff.jl 包,代码如下所示:

  • 云画的月光-梯度下降是最好的程序员:Julia未来将内嵌可微编程体系

尽管用 Julia 言语能够更好的表明正弦函数,可是为了展现核算进程,这儿运用了一个循环、一个条件句子、「isodd」和「factorial」函数,这些都是 Julia 的原生完结。在微分核算中,主动微分直接作业。如下为 x = 1.0 开端,i 的改变状况,核算得到的梯度,以及何时这个梯度和 cos(1.0) 的梯度匹配。

julia> cos(1.0)0.540302305868139

可微编程中的深度学习

Zygote 是用来核算深度学习模型梯度的灵敏后端,它的功率十分高。下面展现了一个典型的比如,研讨人员运用 LSTM 学习莎翁的著作。下面的代码展现了 Zygote 许多优异的特点,只需调用几个 Julia 言语的一些快捷特性就能完结。

首要,界说的模型并没有特别的数据类型,因而能够直接启用主动微分(AD);模型的界说只需求确认前向传达的核算流就行了,反向传达只要在界说 BLAS 运算和根本数组操作等根本构建块时才需求手动界说。

Zygote 还能够用于包装模型丢失的核算,清晰指明核算鸿沟应该关于模型梯度的核算是可微的,可是其它部分的代码,包含咱们界说的 LSTM 层级,在写的时分都不需求考虑主动微分进程。终究模型能够在 CPU、GPU 和谷歌的 TPU 上运转,它们不需求或只需求一点修正。

opt = ADAM(0.01)

# Run through our entire dataset a few timesfor epoch_idx in 1:10,(x_batch, y_batch) in zip(Xs, Ys) # Calculate gradients upon the model for this batch of data,# summing crossentropy loss across each time index in this batchgrads = |Zygoteplain|.gradient(model) do modelreturn sum(crossentropy.(model.(x_batch), y_batch)) end

# Update the model, then reset its internal LSTM statesmodel = update!(opt, model, grads)Flux.reset!(model)end

如上所示整个模型及练习进程看起来十分简练,有点像 Keras 或 PyTorch 的编程风格,根本上只需求建立模型、算梯度、更新参数等几个重要进程。即运用户不太了解 Julia 的语法规矩,但仍是很简单读懂的,它十分重要的部分便是经过 Zygote 求梯度。

Zygote 供给了一个本钱极端低的主动微分接口。经过履行 source-to-source 的转化,AD 转化根本上没有运转时开支,因而它要比反向传达的实践核算本钱更有优势。此外,Zygote 在 TPU pod 上练习 ResNet 与 TensorFlow 有相同的功能水平。

表 1:在不同深度的 LSTM 网络中,Zygote 每一个运算(OP)开支的估量值。

为了衡量上面的成果,研讨者对 LSTM 网络的反向传达做了一个基准测验,并研讨运转时刻与批量巨细的联系,然后进一步估量主动微分体系中每一个操作的固定开支。研讨者终究在 i5 CPU 和 Julia 1.3 上完结了测验,成果如表 1 所示十分有竞争力。由于像 PyTorch 那样的老练深度学习结构,每个 op 的实践开支都至少是 1s。

这些消失的开支提高4455了 AD 体系的功率和运用门槛,因而它能以十分细粒度的岔村集成到编程言语中,且还无需忧虑功能问题。一般来说,主动微分的开支越低,AD 体系的最小可行的内核就越小。因而咱们只需求考虑反向传达功率,就能规划出又小又高效的主动微分内核。

其他事例

除了用 Julia 完结 LSTM 模型的主动微分以外,论文还供给了运用可微分编程在其他机器学习范畴中的运用示例。

投石机问题——强化学习

图 3:运用神经网络的代替处理反问题(inverse problem)

根据模型的强化学习对无模型强化学习具有优势,由于高功能的智能体有必要能够对其环境动态进行拟合。可是,深度强化学习模型不能够和实在环境结合,约束了它的开展。曩昔的研讨一般运用机器学习结构,能够成功完结实践的物理引擎,可是这种工程的投入十分大,而且和现有的引擎比较有约束,因而在生物学或气象学等范畴中的运用较少。

Zygote 能够被用来处理操控问题,能够将模型的反向传达进程操控在一个对梯度的恳求中。研讨人员运用了投石机问题作为试验事例。他们优化一个能够应对多个方针的神经网络,神经网络的云画的月光-梯度下降是最好的程序员:Julia未来将内嵌可微编程体系输入是方针的间隔和当时的风速,而网络的输出则是投石机云画的月光-梯度下降是最好的程序员:Julia未来将内嵌可微编程体系的设置(如射程和发射视点)。输入来自一个模拟器,能够作为一个常微分方差,并核算落地点到方针的间隔。研讨人员然后比照实践成果,并进行反向传达,调整网络权重。研讨人员的数据集是随机从一系列方针和风速中选出的。这个智能体能够在笔记本电脑的 CPU 上练习,并能够在常数时刻内处理反问题,较直接优化投石机体系的强化学习办法快 100 倍。

核算机视觉

在本事例中,研讨人员运用了一个原型生成器,根据希望终究生成的图画,展现优化点光源方位的进程。研讨人员界说了一个丢失函数,将点光源作为输入,发生图画,并和参阅图画比照。依照常规,梯度能够被提取,并用于更新点光源的方位。

julia> functionloss_function(light)rendered_color= raytrace(origin, direction, scene, light, eye_pos)rendered_img= process_image(rendered_color, screen_size.w,screen_size.h)returnmean((rendered_img .- reference_img).^2)end

julia> gs= gradient(x -> loss_function(x, image), guess)

图 4、5、6:生成的图片和点光源的联系。4(左)是最开端生成的图画,5(中)是迭代 100 次的成果,6(右)方针图画。

深度Pro

理论详解 | 工程实践 | 工业剖析 | 行研陈述

机器之心最新上线深度内容栏目,汇总AI深度好文,详解理论、工程、工业与运用。这儿的每一篇文章,都需求深度阅览15分钟。

今天深度引荐

点击图片,进入小程序深度Pro栏目

PC点击阅览原文,拜访官网

更适合深度阅览

www.jiqizhixin.com/insight

每日重要论文、教程、资讯、陈述也不想错失?

云画的月光-梯度下降是最好的程序员:Julia未来将内嵌可微编程体系
二维码