当前位置 博文首页 > SoftwareTeacher的专栏:AI应用开发基础傻瓜书系列2-神经网络中

    SoftwareTeacher的专栏:AI应用开发基础傻瓜书系列2-神经网络中

    作者:[db:作者] 时间:2021-08-29 22:35

    AI应用开发基础傻瓜书系列2-神经网络中反向传播与梯度下降的基本概念

    Copyright ? Microsoft Corporation. All rights reserved.
    适用于License版权许可
    更多微软人工智能学习资源,请见微软人工智能教育与学习共建社区

    • Content
    • 01.0-神经网络的基本工作原理
    • 01.1-基本数学导数公式
    • 01.2-Python-Numpy库的点滴
    • 02.0-反向传播与梯度下降
    • 02.1-线性反向传播
    • 02.2-非线性反向传播
    • 02.3-梯度下降
    • 03.0-损失函数
    • 03.1-均方差损失函数
    • 03.2-交叉熵损失函数
    • 04.0-单入单出单层-单变量线性回归
    • 04.1-最小二乘法
    • 04.2-梯度下降法
    • 04.3-神经网络法
    • 04.4-梯度下降的三种形式
    • 04.5-实现逻辑非门
    • 05.0-多入单出单层-多变量线性回归
    • 05.1-正规方程法
    • 05.2-神经网络法
    • 05.3-样本特征数据的归一化
    • 05.4-归一化的后遗症
    • 05.5-正确的推理方法
    • 05.6-归一化标签值
    • 06.0-多入多出单层神经网络-多变量线性分类
    • 06.1-二分类原理
    • 06.2-线性二分类实现
    • 06.3-线性二分类结果可视化
    • 06.4-多分类原理
    • 06.5-线性多分类实现
    • 06.6-线性多分类结果可视化
    • 07.0-激活函数
    • 07.1-挤压型激活函数
    • 07.2-半线性激活函数
    • 07.3-用双曲正切函数分类
    • 07.4-实现逻辑与门和或门
    • 08.0-单入单出双层-万能近似定理
    • 08.1-双层拟合网络的原理
    • 08.2-双层拟合网络的实现
    • 09.0-多入多出双层-双变量非线性分类
    • 09.1-实现逻辑异或门
    • 09.2-理解二分类的工作原理
    • 09.3-非线性多分类
    • 09.4-理解多分类的工作原理
    • 10.0-调参与优化
    • 10.1-权重矩阵初始化
    • 10.2-参数调优
    • 10.3-搜索最优学习率
    • 10.4-梯度下降优化算法
    • 10.5-自适应学习率算法
    • 11.0-深度学习基础
    • 11.1-三层神经网络的实现
    • 11.2-验证与测试
    • 11.3-梯度检查
    • 11.4-手工测试训练效果
    • 11.5-搭建深度神经网络框架
    • 12.0-卷积神经网络
    • 12.1-卷积
    • 12.2-池化
    • 14.1-神经网络模型概述
    • 14.2-Windows模型的部署
    • 14.3-Android模型的部署

    第二篇:神经网络中反向传播与梯度下降的基本概念

    预警:本篇博客中会涉及到偏导数的概念,但是非常初级,很容易理解,建议硬着头皮看,跟着算一遍,看完之后保证会觉得人生美好了很多。

    反向传播和梯度下降这两个词,第一眼看上去似懂非懂,不明觉厉。这两个概念是整个神经网络中的重要组成部分,是和误差函数/损失函数的概念分不开的。

    神经网络训练的最基本的思想就是:先“蒙”一个结果,我们叫预测结果a,看看这个预测结果和事先标记好的训练集中的真实结果y之间的差距,然后调整策略,再试一次,这一次就不是“蒙”了,而是有依据地向正确的方向靠近。如此反复多次,一直到预测结果和真实结果之间相差无几,亦即|a-y|->0,就结束训练。

    在神经网络训练中,我们把“蒙”叫做初始化,可以随机,也可以根据以前的经验给定初始值。即使是“蒙”,也是有技术含量的。

    通俗地理解反向传播

    举个通俗的例子,Bob拿了一支没有准星的步枪,或者是准星有bug,或者是Bob眼神儿不好看不清靶子,或者是雾很大…反正就是Bob很倒霉。第一次试枪后,拉回靶子一看,弹着点偏左了,于是在第二次试枪时,Bob就会有意识地向右侧偏几毫米,再看靶子上的弹着点,如此反复几次,Bob就会掌握这支步枪的脾气了。下图显示了Bob的5次试枪过程:

    在这个例子中:

    • 每次试枪弹着点和靶心之间的差距就叫做误差,可以用一个误差函数来表示,比如差距的绝对值,如图中的红色线。

    • 一共试枪5次,就是迭代/训练了5次的过程 。

    • 每次试枪后,把靶子拉回来看弹着点,然后调整下一次的射击角度的过程,叫做反向传播。注意,把靶子拉回来看和跑到靶子前面去看有本质的区别,后者容易有生命危险,因为还有别的射击者。一个不恰当的比喻是,在数学概念中,人跑到靶子前面去看,叫做正向微分;把靶子拉回来看,叫做反向微分。

    • 每次调整角度的数值和方向,叫做梯度。比如向右侧调整1毫米,或者向左下方调整2毫米。如图中的绿色矢量线。

    上图是每次单发点射,所以每次训练样本的个数是1。在实际的神经网络训练中,通常需要多个样本,做批量训练,以避免单个样本本身采样时带来的误差。在本例中,多个样本可以描述为连发射击,假设一次可以连打3发子弹,每次的离散程度都类似,如下图所示:

    • 如果每次3发子弹连发,这3发子弹的弹着点和靶心之间的差距之和再除以3,叫做损失,可以用损失函数来表示。

    其实损失就是所有样本的误差的总和,所以有时候损失函数可以和误差函数混用概念。

    其实射击还不这么简单,如果是远距离狙击,还要考虑空气阻力和风速,在神经网络里,空气阻力和风速可以对应到隐藏层的概念上。

    用数学概念理解反向传播

    我们再用一个纯数学的例子来说明反向传播的概念。

    假设我们有一个函数
    z = x ? y , 其 中 : x = w ? 2 + b , y = b + 1 , 即 : z = ( w ? 2 + b ) ? ( b + 1 ) z = x * y,其中: x = w * 2 + b, y = b + 1,即: z = (w * 2 + b) * (b + 1) z=x?y:x=w?2+b,y=b+1:z=(w?2+b)?(b+1)

    关系如下图:

    注意这里x,
    y, z不是变量,w,
    b是才变量,因为在神经网络中,我们要最终求解的是w和b的值,x,y,z只是样本值。

    当w = 3,
    b = 4时,会得到如下结果

    最终的z值,受到了前面很多因素的影响:变量w,变量b,计算式x,计算式y。常数是个定值,不考虑。目前的z=50,如果我们想让z变大一些,w和b应该如何变化呢?

    我们从z开始一层一层向回看,图中各节点关于变量b的偏导计算结果如下图:

    因为z = x

    • y,其中x = w
    • 2 + b,y = b +
      1

    所以:

    ? z ? b = ? z ? x ? ? x ? b + ? z ? y ? ? y ? b = 5 ? 1 + 10 ? 1 = 15 \frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}}*\frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}*\frac{\partial{y}}{\partial{b}}=5*1+10*1=15 ?b?z?=?x?z???b?x?+?y?z???b?y?=5?1+10?1=15

    其中:

    ? z ? x = ? ? x ( x ? y ) = y = 5 \frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x*y)=y=5 ?x?z?=?x??(x?y)=y=5

    ? z ? y = ? ? y ( x ? y ) = x = 10 \frac{\partial{z}}{\partial{y}}=\frac{\partial{}}{\partial{y}}(x*y)=x=10 ?y?z?=?y??(x?y)=