当前位置:   article > 正文

浅析反向传播算法_反向传播算法其实是将输出层的损失,从输出层往后传播逐步分配给各个层,并用梯

反向传播算法其实是将输出层的损失,从输出层往后传播逐步分配给各个层,并用梯

反向传播算法概念

反向传播算法广泛用在机器学习、人工智能等领域,目的在于将各个结点的权值w偏差值b等参数调节到最优状态(最优状态:使训练数据的平均效果达到最好)。反向传播算法与前向传播算法都是神经网络的经典算法,正如它们的名字一样。反向传播算法是从输出层一直传递到输入层,传递的过程主要做的动作是微调权值和偏差值;前向传播主要确定各层结点的输入与输出,最后计算输出层上所有结点的输出值(实际计算值)以及误差值(误差值:输出目标值与实际计算值之间的距离,具体公式典型的有:求差和欧式距离等)。

反向传播算法细节

神经网络
图片来自 http://blog.csdn.net/mao_xiao_feng/article/details/53048213

反向传播算法主要涉及到的数学原理是:链式求导,它是该算法的核心和精髓所在,掌握这个方法,就基本上学会了反向传播算法。想要真正掌握这个算法,就需要用代码实现一下了,但是它与神经网络耦合严重,所以需要掌握神经网络细节,有一定的挑战性,但想要成功的你一定可以办到 -_-||

1. 前向传播算法
前向传播主要确定各层结点的输入与输出,最后计算输出层上所有结点的输出值(实际计算值)以及误差值(误差值:输出目标值与实际计算值之间的距离,具体公式典型的有:求差和欧式距离等)。

上图中,从左到右依次是输入层、隐藏层(可以为多层,本例为一层)和输出层。i1i2是输入层结点,h1h2是隐藏层结点,o1o2是输出层结点。前向传播主要确定各结点的值和全局误差(也称全局损失,由全局损失函数确定)和输出层各个结点的误差(局部误差)(也称局部损失,由局部损失函数确定)。各权重和偏差的初始值在图中已经给出,下面是求解过程(该求解过程为一次前向传播过程,对应一个实例的训练过程):

1.1首先,涉及到的变量有下面16个:

i1 = 0.05;h1 = 待求;o1 = 待求;w1 = 0.15;w3 = 0.25;w5 = 0.40;w7 = 0.50;b1 = 0.35
i2 = 0.10;h2 = 待求;o2 = 待求;w2 = 0.20;w4 = 0.30;w6 = 0.45;w8 = 0.55;b2 = 0.60

前向过程主要求出h1h2o1o2的输出值(输出值:激活函数函数值)

激活函数: (懂激活函数可以跳过此处。)把结点的输入值作为自变量的函数,激活函数的函数值为该结点的输出值。激活函数来源于感受器的概念,一个感受器代表一个结点的过滤器,主要目的是矫正结点的值,使之在固定的范围内。比如:0-1。也就是激活函数的值域有固定的范围,比如典型的激活函数:sigmoid函数

y=11+ex
它的值域为(0,1),所以可以保证每个结点的输出值都在0-1之间。

1.2然后计算待求值:

h1计算过程:
h1的输入值neth1

neth1=i1w1+i2w2+b1

h1的输出值 h1
h1=func(neth1)

(func为激活函数,如果为sigmoid时)
h1=11+eneth1

h2计算过程:
h2的输入值neth2

neth2=i1w3+i2w4+b1

h2的输出值 h2
h2=func(neth2)

(func为激活函数,如果为sigmoid时)
h1=11+eneth2

o1和o2计算过程类似,这里省略。
1.3最后求全局误差值 E和局部误差值 Ei
局部误差函数(误差函数就是神经网络中的损失函数,误差函数是数学术语,损失函数是机器学习领域术语)的选择有多种,如果是误差平方和,则:
Ei=12(oioi)2

全局误差函数
E=inEi

这里的误差函数是神经网络调优的一个参数

2. 反向传播算法
如果神经网络没有反向传播,只有前向传播,则前向传播从第二个实例进入神经网络,开始调节权重值和偏差值。只有前向传播过程的人工神经网络也称为序贯神经网络模型。

反向传播算法完成对权重值和偏差值的调节,主要用到链式求导

z=y
,
y=a+b
, 则z对a求导为:
z(a)=z(y)y(a)

具体求解过程(该求解过程为一次反向传播过程,对应一个实例的训练过程):
1输出层到隐藏层
w5

w5=w5αEw5

Ew5=Eo1o1neto1neto1w5

alpha为正数,如:0.5
这里解释一下为什么用减而不用加:偏导值为正数,表示w5与E正相关,也就是w5越大,E越大。所以此时减取一个正数,w5减少了,也就是全局误差E减少了。所以理论意义与物理意义符合逻辑。偏导值为负数时道理一样。全局误差E减少正是我们的目标。

w6

w6=w6αEw6

Ew6=Eo1o1neto1neto1w6

w7

w7=w7αEw7

Ew7=Eo2o2neto2neto2w7

w8

w8=w8αEw8

Ew8=Eo2o2neto2neto2w8

2隐藏层到输入层
w1

w1=w1αEw1

Ew1=Eh1h1neth1neth1w1

Eh1=E1h1+E2h1

w2

w2=w2αEw2

Ew2=Eh1h1neth1neth1w1

Eh1=E1h1+E2h1

w3

w3=w3αEw3

Ew3=Eh2h2neth2neth2w3

Eh2=E1h2+E2h2

w4

w4=w4αEw4

Ew4=Eh2h2neth2neth2w4

Eh2=E1h2+E2h2

偏差值的计算与此类似,这里省略。

代码细节

java实现

    /**
     * 前馈算法<hr>
     * 默认激活函数tanh,若自定义激活函数则自行修改本函数
     * @param layers 所有神经层
     * @param weights 所有权重值
     * @param bis 所有偏置值
     * @return
     */
    public static Map<Integer, List<List<Neural>>> forward(Layer[] layers, Map<Integer, double[][]> weights, List<Double> bis) {

        Map<Integer, List<List<Neural>>> result = new HashMap<Integer, List<List<Neural>>>();
        List<List<Neural>> inputs = new ArrayList<List<Neural>>();
        List<List<Neural>> outputs = new ArrayList<List<Neural>>();
        result.put(0, inputs);
        result.put(1, outputs);
        for (int i = 0; i < layers.length-1; i++) {
            List<Neural> inputNeurals = new ArrayList<Neural>();
            List<Neural> outputNeurals = new ArrayList<Neural>();
            inputs.add(inputNeurals);
            outputs.add(outputNeurals);
            for (int j = 0; j < layers[i+1].getSize(); j++) {
                inputNeurals.add(new Neural(0));
                outputNeurals.add(new Neural(0));
            }
        }

        for (int i = 0; i < layers.length; i++) {
            if (i == 0) continue;
            for (int j = 0; j < layers[i].getSize(); j++) {

                double sum = 0;
                for (int z = 0; z < layers[i-1].getSize(); z++) {
                    sum += layers[i-1].getNeurals().get(z).getValue() * weights.get(i-1)[z][j];
                }
                sum += bis.get(i-1);
                inputs.get(i-1).get(j).setValue(sum);


                sum = ActivationFunction.tanh(sum);
                layers[i].getNeurals().get(j).setValue(sum);
                outputs.get(i-1).get(j).setValue(sum);
            }
        }

        return result;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

代码分析

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/405591
推荐阅读
相关标签
  

闽ICP备14008679号