- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
简介
【导读】大家好,我是泳鱼,一个乐于探索和分享AI知识的码农!模型的训练、调参是一项非常费时费力的工作,了解神经网络内部的数学原理有利于快速找出问题所在。本文作者从零开始,一步一步讲解了训练神经网络时所用到的数学过程。
神经网络是线性模块和非线性模块的巧妙排列。当聪明地选择并连接这些模块时,我们就得到了一个强大的工具来逼近任何一个数学函数,如一个能够借助非线性决策边界进行分类的神经网络。
本文代码的如下:
gitclone/omar-florez/scratch_mlp/pythonscratch_mlp/scratch_mlp.py
尽管技术具有直观、模块化的特质,但是它负责更新可训练的参数,这是一个一直未被深入解释的主题。让我们以乐高积木为喻,一次增加一块,从零构建一个神经网络来一探其内部功能。
神经网络就像是由乐高积木组成的
上图描述了训练一个神经网络时所用到的部分数学过程。我们将在本文中解释这个。读者可能感到有趣的一点是:一个神经网络就是很多模块以不同的目标堆叠起来。
输入变量X向神经网络馈送原始数据,它被存储在一个矩阵中,矩阵的行是观察值,列是维度。
权重W_1将输入X映射到第一个隐藏层h_1。然后权重W_1充当一个线性核。
Sigmoid函数防止隐藏层中的数字落到0-1的范围之外。结果就是一个神经激活的数组,h_1=Sigmoid(WX)。
此时,这些运算只是组成了一个一般线性系统,无法对非线性交互建模。当我们再叠加一层,给模块的结构增加深度的时候这一点就会改变。网络越深,我们就会学到越多微妙的非线性交互,能解决的问题也就越复杂,或许这也是深度神经模型兴起的原因之一。
为什么我要读这篇文章?
如果你理解一个神经网络的内部部分,你就能够在遇到问题的时候快速知道先去改变哪里,并且能够制定策略来测试你所知道的这个算法的部分不变量和预期的行为。
因为调试机器学习模型是一项复杂的任务。根据经验,数学模型在首次尝试的时候不会奏效。它们可能会对新数据给出较低的准确率,会耗费很长的训练时间或者太多的内存,返回一个很大的错误负数值或者NAN的预测……在有些情况下,了解算法的运行机制可以让我们的任务变得更加便利:
如果训练花费了太多的时间,那增加minibatch的大小或许是一个好主意,这能够减小观察值的方差,从而有助于算法收敛。
如果你看到了NAN的预测值,算法可能接收到了大梯度,产生了内存溢出。可以将这个视为在很多次迭代之后发生爆炸的矩阵乘法。减小学习率可以缩小这些数值。减少层数能够减少乘法的数量。剪切梯度也能够明显地控制这个问题。
具体的例子:学习异或函数
让我们打开黑盒子。我们现在要从零开始构建一个学习函数的神经网络。选择这个非线性函数可绝对不是随机的。没有反向传播的话,就很难学会用一条直线分类。
为了描述这个重要的概念,请注意下图中,一条直线是为何不能对异或函数输出中的0和1进行分类。现实生活中的问题也是非线性可分的。
这个网络的拓扑结构非常简单:
输入变量X是二维向量
权重W_1是具有随机初始化数值的2x3的矩阵
隐藏层h_1包含3个神经元。每个神经元接受观察值的加权和作为输入,这就是下图中绿色高亮的内积:z_1=[x_1,x_2][w_1,w_2]
权重W_2是具有随机初始化值的3x2的矩阵
输出层h_2包含两个神经元,因为异或函数的输出要么是0(y_1=[0,1]),要么是1(y_2=[1,0])
下图更加直观:
我们现在来训练这个模型。在我们这个简单的例子中,可训练的参数就是权重,但是应该知道的是,目前的研究正在探索更多可以被优化的参数类型。例如层之间的快捷连接、分布、拓扑结构、残差、学习率等等。
反向传播是这样的一种方法:在给定的一批具有标签的观察值上,朝着将预定义的错误指标(就是损失函数)最小化的方向(梯度)更新权重。该算法已经多次被重复发现,这是另一种更通用的被称为自动微分的技术在反向积累模式下的特例。
网络初始化
让我们用随机数来初始化网络权重
前向步骤:
这一步的目标就是把输入变量X向前传递到网络的每一层,直至计算出输出层h_2的向量。
这就是其中发生的计算过程:
以权重W_1为线性核对输入数据X做线性变换:
使用Sigmoid激活函数对加权和进行缩放,得到了第一个隐藏层h_1的值。请注意,原始的2D向量现在映射到了3D空间。
第2层h_2中发生了类似的过程。让我们首先来计算第一个隐藏层的加权和z_2,它现在是输入数据。
然后计算它们的Sigmoid激活函数。向量[00代表的是网络对给定的输入X计算出的对数概率
文档评论(0)