反算法详解
① 工资算法是什么呢
工资算法及举例如下。
1、正算法:工资=月薪÷21.75×月计薪天数×(出勤天数比例)。
2、反算法:工资=月薪-月薪÷21.75x缺勤天数×(出勤天数比例)。
3、月计薪天数=(月出勤天数+法定节假日天数)。
4、出勤天数比例=21.75÷(当月应出勤天数+法定节假日天数)。
5、同样举上面的案例。
案例一:某员工月薪2175,7月份有23个工作日,员工缺勤1天,出勤是22天,本月月薪多少。
正算法:2175÷21.75×22×(21.75÷23)=2080.4。
反算法:2175—2175÷21.75×1×(21.75÷23)=2080.4。
案例二:某员工月薪2175元,5月份有21个工作日,5.1为法定节假日,员工缺勤1天,出勤是20天,本月月薪多少。
正算法:2175÷21.75×(20+1)×(21.75÷(21+1))=2076.14。
反算法:2175—2175÷21.75×1×(21.75÷(21+1))=2076.14。
② 读懂反向传播算法(bp算法)
反向传播算法可以说是神经网络最基础也是最重要的知识点。基本上所以的优化算法都是在反向传播算出梯度之后进行改进的。同时,也因为反向传播算法是一个递归的形式,一层一层的向后传播误差即可,很容易实现(这部分听不懂没关系,下面介绍)。不要被反向传播吓到,掌握其核心思想就很容易自己手推出来。
我们知道神经网络都是有一个loss函数的。这个函数根据不同的任务有不同的定义方式,但是这个loss函数的目的就是计算出当前神经网络建模出来输出的数据和理想数据之间的距离。计算出loss之后,根据反向传播算法就可以更新网络中的各种参数以此使loss不断下降,即可使输出的数据更加理想。
所以,现在的任务是,已知一个网络的loss之后,如何根据loss来更新参数呢?具体点即如何更新网络节点中的权重w和偏差b的值呢?
这里我们采用的是全连接神经网络进行说明。
要想把这个过程说清楚,首先需要将神经网络中各个参数用文字表达清楚。定义的就是w和b在网络中的准确位置。
对于 表示的是神经网络中第 层第k个节点到神经网络中第 层第j个节点之间的权重。注意w的下标是首位表示的是节点后层节点的位置,末尾表示是前层节点的位置。理解这样的表达方式在后面的计算中会很好理解。
同理,对于b的表示:
b的表示相比于w要简单一些,符号 表示第l层网络在第j个节点的偏置。无论w还是b的表示,上标都是表示层数。并且 和 表示都是第l层网络第j个节点的参数。所以该节点的输出可以表示为:
神经网络输出之后会经过一个激活函数,这用激活函数用 表示,则经过激活函数输出为:
至此,根据上面符号 、 、 、 。我们可以对于神经网络里面每一个数据准确的表示了。
给定一个损失函数之后,用 表示,说白了反向传播就是求∂C/∂w和∂C/∂b,然后将这个值乘以和对应的w,b进行相减就可以实现一次的参数更新了。为什么这样的操作就可以优化网络,减小loss值呢?
来源于导数的概念和速度相关。∂C/∂w和∂C/∂b相当于loss值C相对于w和v变化的速度。如果∂C/∂w是正的,则增大w,C也会增大,如果希望C减小的话,应该减小w;并且∂C/∂w的绝对值越大,表示w对C的值影响越大,w稍微有一点变化,C就会有大幅变化。如果要优化C变小,w应该对应的减少多少呢?也没有一个确定的答案。这里通过变化的速度和学习率相乘作为一个减小的值。通过多轮迭代。最终是希望c达到最小点。而当函数落入最小值的时候,无论是局部最小还是全局最小,其周围一定是平滑的。所以此时∂C/∂w和∂C/∂b将会变得很小甚至为0,即参数不在更新了。当函数在局部最小点处参数不在更新出现梯度消失的问题时,目前也有各种trick进行解决。不是这里的重点。
为了好说明,这里定义一个很简单的损失函数C:
接下来就是有意思的阶段了。这里还是利用上一节中∂C/∂w和∂C/∂b的解释。如果我们想要求出∂C/∂w和∂C/∂b的值,即具体的 、 对C影响速率的值,我们找一个中间变量∂C/∂ 。因为我们知道:
我们定义:
当我们知道了 值之后,我们根据 式子可以很容易求出 。
利用导数的链式法则:
很容易推出来不是?同理可以求出:
可以看出通过媒介 很容易求出∂C/∂w和∂C/∂b。那么我们现在来理解一下 到底是什么意思,以及如何求出来每一个l层j节点的 值。
根据定义:
可以看出来 就是 对于C的影响大小(联系之前说的导数和速率的关系)。而 是第 层第 个神经元未进过激活函数之前的输出。所以我们可以理解 为网络中第 层第 个神经元对loss的影响。所以很直观的看法就是我们先求出单个神经元对loss值得影响,然后再计算该神经元内部参数对于loss的影响。
ok,如果我们已经理解了为什么要引入 变量以及如何利用该变量计算具体参数的梯度后,接下来我们就可以看看如何获得 值。反向传播的名字我想也就是通过计算 的方式而来的。是一层一层递归而来的。
既然说是递归的方式,我们来思考一下 和 之间有什么关系,如果找到这个关系之后,我们就可以默认我们如果知道最后一层网络节点的 值,我们就可以获得倒数第二层网络节点的 值,倒数第三层,倒数第四层,……以此推类即可获得整个网络的每个节点的 值。至此我们的反向传播也基本完成了。
所以最重要的有两点:
先看问题1,直接根据求导的链式法则就可以找出两个的关系,具体公式如下,可以多看看手写一下,思路上也很简单。
觉得这样的链式公式还是很直观的,如果不好理解,可以自己画一个神经网络图,连上节点与节点之间的线,标上参数,然后推一下应该就能理解了。
这里的 都表示的未经过激活函数的神经元的输出。 表示激活函数。因为:
所以:
带入上式就可以得出:
至此就找出了 和 之间的关系了。
(还能简化,根据最开始我们定义的 )。
理解起来就是网络中前面一层某一个神经元对于loss的影响与该层的后一层所有的神经元对loss的影响、该神经元的输出大小、该神经元与后一层神经元连接的权重有关系的,并且是一个累加的效应。这样的理解也是非常直观合乎常理的。
现在万事具备,只差问题2了。即假设最后一层网络是L,最后一层 如何计算得出。最后一层的 值就像一个导火索,一旦有了开始,就可以利用我们之前推出来的: 公式进行反向传播了(反向传播还是很形象的不是?)。现在解决这个问题。这个问题就是和损失函数具体怎么定义有关系了。不过我们先不考虑C的具体形式,根据通用的链式法则我们可以得到:
这里需要注意的是最后一层激活函数使用的是哪种。最后一层激活函数在计算某一个神经元的输出时可能会结合其他节点的输出来计算。比如softmax激活函数,其输出的是一个概率值【0,1】。输出大小就是结合输出所有的值。
现在我们来考虑两个具体的损失函数,并且采用之前定义的均方误差损失函数 :
求导为:
因为sigmoid输出的值仅仅和输入的x值有关 。所以 当 时值为0.所以:
根据上面,BP推导有三部曲,先求出 ,再根据 分别求出 、 。总结公式如下:
启动上面反传的导火索是最后一层的 值,计算公式为:
根据最后一层不同类型的激活函数不同对待。
③ 省考行测:反算法
在广东省考行测资料分析题目中,经常会遇到一些列式之后和一个比较整的数据比较大小的题目,此时我们可以化除为乘,化减为加,不用计算很多不整的数据,从而简化运算。
例1:2017年粮食产量为a,2016年为b。问:增长率是否超过20%?
中公解析:粮食产量增长率超过20%,即(a-b)÷b>20%。将除法转乘法,得到a-b>0.2b,即a-b>0.2b时,2017年增长率超过20%。
这种方法就叫反算法,通过分析题干特点,将题目进行巧妙转化从而简化计算。
可以利用反算法的题型一般会具有以下特点:题干要求满足某个或某些条件的指标个数,通常是指两数之比或增长率在某个范围内,给出的比值一般简单易算。
具体使用方法可以总结为以下三步:
第一步:将除法转化为乘法;
第二步:检验“>”或“<”关系是否成立;
第三步(视情况而定):若正而计数个数较多,可先从反面计数,再用总数相减。
我们再通过几道例题练习一下。
例2:2017年第一季度,某省农林牧渔业增加值361.78亿元,比上年同期增长5.9%,高于上年同期0.2个百分点,具体情况如下:
该省种植业增加值119.21亿元,比上年同期增长8.2%。林业增加值34.84亿元,比上年同期增长8.3%。畜牧业增加值176.64亿元,比上年同期增长4.2%,增速比上年同期加快2.1个百分点。渔业增加值9.22亿元,比上年同期增长4.5%。农林牧渔服务业增加值21.87亿元,比上年同期增长3.8%。
问题:2017年第一季度,该省占农林牧渔业增加值比重超过三成的包括:
A.种植业、渔业
B.林业、畜牧业
C.种植业、畜牧业
D.农林牧渔服务业、林业
【答案】C。中公解析:根据题干信息判断考查现期比重。比重超过三成,即部分/整体>30%。计算每个指标所占的比重比较耗时,可直接使用反算法,简化计算过程。
首先得到2017年第一季度该省农林牧渔业增加值的三成,为361.78×30%≈362×0.3=108.6亿元。再查找材料中超过该值的只有种植业和畜牧业,分别为l19.21亿元、176.64亿元。故本题选C。
例3:
④ 反向传播算法的算法简介
反向传播算法(backpropagation)是目前用来训练人工神经网络(artificial
neural
network,ann)的最常用且最有效的算法。其主要思想是:
(1)将训练集数据输入到ann的输入层,经过隐藏层,最后达到输出层并输出结果,这是ann的前向传播过程;
(2)由于ann的输出结果与实际结果有误差,则计算估计值与实际值之间的误差,并将该误差从输出层向隐藏层反向传播,直至传播到输入层;
(3)在反向传播的过程中,根据误差调整各种参数的值;不断迭代上述过程,直至收敛。
反向传播算法的思想比较容易理解,但具体的公式则要一步步推导,因此本文着重介绍公式的推导过程。
1.
变量定义
上图是一个三层人工神经网络,layer1至layer3分别是输入层、隐藏层和输出层。如图,先定义一些变量:
表示第层的第个神经元连接到第层的第个神经元的权重;
表示第层的第个神经元的偏置;
表示第层的第个神经元的输入,即:
表示第层的第个神经元的输出,即:
其中表示激活函数。
2.
代价函数
代价函数被用来计算ann输出值与实际值之间的误差。常用的代价函数是二次代价函数(quadratic
cost
function):
其中,表示输入的样本,表示实际的分类,表示预测的输出,表示神经网络的最大层数。
3.
公式及其推导
本节将介绍反向传播算法用到的4个公式,并进行推导。如果不想了解公式推导过程,请直接看第4节的算法步骤。
首先,将第层第个神经元中产生的错误(即实际值与预测值之间的误差)定义为:
本文将以一个输入样本为例进行说明,此时代价函数表示为:
公式1(计算最后一层神经网络产生的错误):
其中,表示hadamard乘积,用于矩阵或向量之间点对点的乘法运算。公式1的推导过程如下:
公式2(由后往前,计算每一层神经网络产生的错误):
推导过程:
公式3(计算权重的梯度):
推导过程:
公式4(计算偏置的梯度):
推导过程:
4.
反向传播算法伪代码
输入训练集
对于训练集中的每个样本x,设置输入层(input
layer)对应的激活值:
前向传播:
,
计算输出层产生的错误: