加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

100行Python代码,轻松搞定神经网络

发布时间:2019-05-09 11:22:03 所属栏目:建站 来源:eisenjulian 编译:周家乐、钱天培 用tensor
导读:大数据文摘出品 来历:eisenjulian 编译:周家乐、钱天培 用tensorflow,pytorch这类深度进修库来写一个神经收集早就不特别了。 然则,你知道怎么用python和numpy来优雅地搭一个神经收集嘛? 现现在,有多种深度进修框架可供选择,他们带有自动微分、基于图
副问题[/!--empirenews.page--]

100行Python代码,轻松搞定神经收集

大数据文摘出品

来历:eisenjulian

编译:周家乐、钱天培

用tensorflow,pytorch这类深度进修库来写一个神经收集早就不特别了。

然则,你知道怎么用python和numpy来优雅地搭一个神经收集嘛?

现现在,有多种深度进修框架可供选择,他们带有自动微分、基于图的优化计较和硬件加快等各类重要特征。对人们而言,好像享受这些重要特征带来的便利已经是理所虽然的事儿了。但着实,瞧一瞧潜匿在这些特征下的对象,能更好的辅佐你领略这些收集毕竟是怎样事变的。

以是本日,文摘菌就来手把手教各人搭一个神经收集。质料就是简朴的python和numpy代码!

文章中的全部代码可以都在这儿获取。

https://colab.research.google.com/github/eisenjulian/slides/blob/master/NN_from_scratch/notebook.ipynb

标记声名

在计较反向撒播时, 我们可以选择行使函数标记、变量标记去记录求导进程。它们别离对应了计较图中的边和节点来暗示它们。

给定R^n→R和x∈R^n, 那么梯度是由偏导∂f/∂j(x)构成的n维行向量

假如f:R^n→R^m 和x∈R^n,那么 Jacobian矩阵是下列函数构成的一个m×n的矩阵。

对付给定的函数f和向量a和b假如a=f(b)那么我们用∂a/∂b 暗示Jacobian矩阵,当a是实数时则暗示梯度

链式法例

给定三个分属于差异向量空间的向量a∈A及c∈C和两个可微函数f:A→B及g:B→C使得f(a)=b和g(b)=c,我们能获得复合函数的Jacobian矩阵是函数f和g的jacobian矩阵的乘积:

这就是台甫鼎鼎的链式法例。提出于上世纪60、70年月的反向撒播算法就是应用了链式法例来计较一个实函数相对付其差异参数的梯度的。

要知道我们的最终方针是通过沿着梯度的相反偏历来慢慢找到函数的最小值 (虽然最好是全局最小值), 由于至少在局部来说, 这样做将使得函数值慢慢降落。当我们有两个参数必要优化时, 整个进程如图所示:

反向模式求导

假设函数fi(ai)=ai+1由多于两个函数复合而成,我们可以重复应用公式求导并获得:

可以有许多种方法计较这个乘积,最常见的是从左向右或从右向左。

假如an是一个标量,那么在计较整个梯度的时辰我们可以通过先计较∂an/∂an-1并慢慢右乘全部的Jacobian矩阵∂ai/∂ai-1来获得。这个操纵偶然被称作VJP或向量-Jacobian乘积(Vector-Jacobian Product)。

又由于整个进程中我们是从计较∂an/∂an-1开始慢慢计较∂an/∂an-2,∂an/∂an-3等梯度到最后,并生涯中间值,以是这个进程被称为反向模式求导。最终,我们可以计较出an相对付全部其他变量的梯度。

相对而言,前向模式的进程正相反。它从计较Jacobian矩阵如∂a2/∂a1开始,并左乘∂a3/∂a2来计较∂a3/∂a1。假如我们继承乘上∂ai/∂ai-1并生涯中间值,最终我们可以获得全部变量相对付∂a2/∂a1的梯度。当∂a2/∂a1是标量时,全部乘积都是列向量,这被称为Jacobian向量乘积(可能JVP,Jacobian-Vector Product )。

你或许已经猜到了,对付反向撒播来说,我们更方向应用反向模式——由于我们想要慢慢获得丧失函数对付每层参数的梯度。正向模式固然也可以计较必要的梯度, 但由于一再计较太多而服从很低。

计较梯度的进程看起来像是有许多高维矩阵相乘, 但现实上,Jacobian矩阵经常是稀少、块可能对角矩阵,又由于我们只体谅将其右乘行向量的功效,以是就不必要淹灭太多计较和存储资源。

在本文中, 我们的要领首要用于按次序逐层搭建的神经收集, 但同样的要领也合用于计较梯度的其他算法或计较图。

关于反向和正向模式的细致描写可以参考这里☟:

http://colah.github.io/posts/2015-08-Backprop/

深度神经收集

在典范的监视呆板进修算法中, 我们凡是用到一个很伟大函数,它的输入是存有标签样本数值特性的张量。另外,尚有许多用于描写模子的权重张量。

丧失函数是关于样本和权重的标量函数, 它是权衡模子输出与预期标签的差距的指标。我们的方针是找到最吻合的权重让丧失最小。在深度进修中, 丧失函数被暗示为一串易于求导的简朴函数的复合。全部这些简朴函数(除了最后一个函数),都是我们指的层, 而每一层凡是有两组参数: 输入 (可所以上一层的输出) 和权重。

而最后一个函数代表了丧失怀抱, 它也有两组参数: 模子输出y和真实标签y^。譬喻, 假如丧失怀抱l为平方偏差, 则∂l/∂y为 2 avg(y-y^)。丧失怀抱的梯度将是应用反向模式求导的起始行向量。

Autograd

自动求导背后的头脑已是相等成熟了。它可以在运行时或编译进程中完成,但怎样实现会对机能发生庞大影响。我提议你能当真阅读 HIPS autograd的 Python 实现,来真正相识autograd。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读