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

像堆乐高一样:从零开始解释神经网络的数学过程

发布时间:2019-07-12 11:57:02 所属栏目:建站 来源:机器之心编译
导读:神经网络是线性模块和非线性模块的巧妙排列。当聪明地选择并连接这些模块时,我们就得到了一个强大的工具来逼近任何一个数学函数,如一个能够借助非线性决策边界进行分类的神经网络。 运行代码的步骤如下: gitclonehttps://github.com/omar-florez/scratc

请注意,这个损失函数包括一个正则项,它以岭回归的形式惩罚较大的权重。换言之,平方值比较大的权重会增大损失函数,而这正是我们希望最小化的指标。

像堆乐高一样:从零开始解释神经网络的数学过程

反向步骤:

这一步的目标就是沿着最小化损失函数的方向更新神经网络的权重。正如我们将要看到的,这是一个递归算法,它可以重用之前计算出来的梯度,而且严重依赖微分函数。因为这些更新减小了损失函数,所以一个神经网络便「学会了」去逼近具有已知类别的观察值的标签。这就是被称作泛化的一种属性。

与前向步骤不同的是,这个步骤沿着反向的顺序进行。它首先计算出输出层中损失函数对每个权重的偏导数 (dLoss/dW_2),然后计算隐藏层的偏导数 (dLoss/dW1)。让我们详细地解释每个导数吧。

(1) dLoss/dW_2:

链式法则表明,我们可以将一个神经网络的梯度计算分解成好多个微分部分:

像堆乐高一样:从零开始解释神经网络的数学过程

为了帮助记忆,下表列出了上面用到的一些函数定义以及它们的一阶导数:

像堆乐高一样:从零开始解释神经网络的数学过程

更直观地,我们在下图中要更新权重 W_2(蓝色部分)。为了做到这件事,我们需要沿着导数链计算三个偏导数。

像堆乐高一样:从零开始解释神经网络的数学过程

将数值代入到这些偏导数中,我们就能够计算出 W_2 的偏导数,如下所示:

像堆乐高一样:从零开始解释神经网络的数学过程

结果是一个 3x2 的矩阵 dLoss/dW_2,它将会沿着最小化损失函数的方向更新 W_2 的数值。

像堆乐高一样:从零开始解释神经网络的数学过程

(2) dLoss/dW_1:

计算用于更新第一个隐藏层 W_1 权重的链式规则就展现了重复使用已有计算结果的可能。

像堆乐高一样:从零开始解释神经网络的数学过程

更直观地,从输出层到权重 W_1 的路径会碰到在后面层中早已计算出来的偏导数。

像堆乐高一样:从零开始解释神经网络的数学过程

例如,偏导数 dLoss/dh_2 和 dh_2/dz_2 在上一节中已经被计算为输出层 dLoss/dW_2 学习权值的依赖项。

像堆乐高一样:从零开始解释神经网络的数学过程

将所有的导数放在一起,我们就能够再一次执行链式法则,来为隐藏层的 W_1 更新权重。

像堆乐高一样:从零开始解释神经网络的数学过程

最后,我们给权重赋予新的数值,完成了对神经网络的一步训练。

像堆乐高一样:从零开始解释神经网络的数学过程

实现

让我们仅使用 numpy 作为线性代数引擎来将上面的数学方程转换成代码。神经网络在一个循环中进行训练,其中每次迭代会给神经网络展示标准的输入数据。在这个小例子中,我们只考虑每次迭代中的整个数据集。前向步骤、损失函数和反向步骤的计算会得到比较好的泛化,因为我们在每一次循环中都用它们对应的梯度(矩阵 dL_dw1 和 dL_dw2)来更新可训练的参数。

代码保存在这个 repo 中:https://github.com/omar-florez/scratch_mlp

像堆乐高一样:从零开始解释神经网络的数学过程

让我们来运行这份代码!

(编辑:核心网)

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

热点阅读