赞
踩
反向传播算法广泛用在机器学习、人工智能等领域,目的在于将各个结点的权值w
和偏差值b
等参数调节到最优状态(最优状态:使训练数据的平均效果达到最好)。反向传播算法与前向传播算法都是神经网络的经典算法,正如它们的名字一样。反向传播算法是从输出层一直传递到输入层,传递的过程主要做的动作是微调权值和偏差值;前向传播主要确定各层结点的输入与输出,最后计算输出层上所有结点的输出值(实际计算值)以及误差值(误差值:输出目标值与实际计算值之间的距离,具体公式典型的有:求差和欧式距离等)。
图片来自 http://blog.csdn.net/mao_xiao_feng/article/details/53048213
反向传播算法主要涉及到的数学原理是:链式求导,它是该算法的核心和精髓所在,掌握这个方法,就基本上学会了反向传播算法。想要真正掌握这个算法,就需要用代码实现一下了,但是它与神经网络耦合严重,所以需要掌握神经网络细节,有一定的挑战性,但想要成功的你一定可以办到 -_-||
1. 前向传播算法
前向传播主要确定各层结点的输入与输出,最后计算输出层上所有结点的输出值(实际计算值)以及误差值(误差值:输出目标值与实际计算值之间的距离,具体公式典型的有:求差和欧式距离等)。
上图中,从左到右依次是输入层、隐藏层(可以为多层,本例为一层)和输出层。i1
和i2
是输入层结点,h1
和h2
是隐藏层结点,o1
和o2
是输出层结点。前向传播主要确定各结点的值和全局误差(也称全局损失,由全局损失函数确定)和输出层各个结点的误差(局部误差)(也称局部损失,由局部损失函数确定)。各权重和偏差的初始值在图中已经给出,下面是求解过程(该求解过程为一次前向传播过程,对应一个实例的训练过程):
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
前向过程主要求出h1
、h2
、o1
和o2
的输出值(输出值:激活函数函数值)
激活函数: (懂激活函数可以跳过此处。)把结点的输入值作为自变量的函数,激活函数的函数值为该结点的输出值。激活函数来源于感受器的概念,一个感受器代表一个结点的过滤器,主要目的是矫正结点的值,使之在固定的范围内。比如:0-1。也就是激活函数的值域有固定的范围,比如典型的激活函数:sigmoid函数
1.2然后计算待求值:
h1计算过程:
h1的输入值neth1
h1
h2计算过程:
h2的输入值neth2
h2
E
和局部误差值
Ei
这里的误差函数是神经网络调优的一个参数
2. 反向传播算法
如果神经网络没有反向传播,只有前向传播,则前向传播从第二个实例进入神经网络,开始调节权重值和偏差值。只有前向传播过程的人工神经网络也称为序贯神经网络模型。
反向传播算法完成对权重值和偏差值的调节,主要用到链式求导
具体求解过程(该求解过程为一次反向传播过程,对应一个实例的训练过程):
1输出层到隐藏层
w5
w6
w7
w8
2隐藏层到输入层
w1
w2
w3
w4
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;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。