双变量的反向传播
作业要求
作业正文
1、java实现双变量的反向传播计算
更新权重的代码计算
package one;
public class One {
public static double target = 150 ;
public double[] calcul (double ans[]) {
double x = 2*ans[0] + 3*ans[1] ;
double y = 2*ans[1] + 1 ;
ans[2] = x*y ;
System.out.println("z的值为"+ans[2]) ;
double deltaz = ans[2] - target ;
double deltaw = deltaz / (2*(2*y)) ;
double deltab = deltaz / (2*(3*y+ 2*x)) ;
ans[0] = ans[0] - deltaw ;
ans[1] = ans[1] - deltab ;
System.out.println("z的误差为"+deltaz) ;
System.out.println("w的修正值为"+deltaw) ;
System.out.println("b的修正值为"+deltab) ;
return ans ;
}
public static void main (String[] args) {
long startTime=System.nanoTime(); //获取开始时间
One one = new One();
double []ans = {3, 4, 0} ;
ans = one.calcul(ans);
double tmp = ans[2] - one.target ;
while(true) {
ans = one.calcul(ans) ;
tmp = ans[2]-one.target ;
if (Math.abs (tmp) < Math.pow(10, -5)) {
break ;
}
}
long endTime=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ns");
}
}
输出结果
z的值为162.0
z的误差为12.0
w的修正值为0.3333333333333333
b的修正值为0.09523809523809523
z的值为150.18140589569163
z的误差为0.18140589569162557
w的修正值为0.00514800514800559
b的修正值为0.0014986324978458446
z的值为150.0000443352674
z的误差为4.4335267403994294E-5
w的修正值为1.2585912044840693E-6
b的修正值为3.66496618559716E-7
z的值为150.00000000000267
z的误差为2.6716406864579767E-12
w的修正值为7.584264054954093E-14
b的修正值为2.208506878651647E-14
程序运行时间: 4143411ns
权重占比不一致的更新权重的代码计算的输出结果
z的值为162.0
z的误差为12.0
w的修正值为0.16666666666666666
b的修正值为0.14285714285714285
z的值为150.21768707482994
z的误差为0.21768707482993932
w的修正值为0.003122560499609785
b的修正值为0.0026933004152172382
z的值为150.00007716317668
z的误差为7.716317668382544E-5
w的修正值为1.1075334505340644E-6
b的修正值为9.55395967682429E-7
z的值为150.00000000000975
z的误差为9.748646334628575E-12
w的修正值为1.3992366237322298E-13
b的修正值为1.2070290833939266E-13
程序运行时间: 2840496ns
2、思考与比较
由于w对z的影响更大,所以将权重偏向w的方向能使运算时间更短。