系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI,
点击star加星不要吝啬,星越多笔者越努力。
2.2 非线性反向传播
2.2.1 提出问题
在上面的线性例子中,我们可以发现,误差一次性地传递给了初始值w和b,即,只经过一步,直接修改w和b的值,就能做到误差校正。因为从它的计算图看,无论中间计算过程有多么复杂,它都是线性的,所以可以一次传到底。缺点是这种线性的组合最多只能解决线性问题,不能解决更复杂的问题。这个我们在神经网络基本原理中已经阐述过了,需要有激活函数连接两个线性单元。
下面我们看一个非线性的例子,如图2-8所示。
图2-8 非线性的反向传播
其中 。假设有5个人分别代表x、a、b、c、y:
正向过程
- 第1个人,输入层,随机输入第一个x值,x取值范围(1,10],假设第一个数是2
- 第2个人,第一层网络计算,接收第1个人传入x的值,计算:
- 第3个人,第二层网络计算,接收第2个人传入a的值,计算b:
- 第4个人,第三层网络计算,接收第3个人传入b的值,计算c:
- 第5个人,输出层,接收第4个人传入c的值
反向过程
- 第5个人,计算y与c的差值: ,传回给第4个人
- 第4个人,接收第5个人传回
- 第3个人,接收第4个人传回
- 第2个人,接收第3个人传回
- 第1个人,接收第2个人传回 ,回到第1步
提出问题:假设我们想最后得到c=2.13的值,x应该是多少?(误差小于0.001即可)
2.2.2 数学解析解
2.2.3 梯度迭代解
因此得到如下一组公式,可以把最后一层 的误差一直反向传播给最前面的 ,从而更新x值:
我们给定初始值 ,依次计算结果如表2-2。
表2-2 正向与反向的迭代计算
方向 | 公式 | 迭代1 | 迭代2 | 迭代3 | 迭代4 | 迭代5 |
---|---|---|---|---|---|---|
正向 | 2 | 4.243 | 7.344 | 9.295 | 9.665 | |
正向 | 4 | 18.005 | 53.934 | 86.404 | 93.233 | |
正向 | 1.386 | 2.891 | 3.988 | 4.459 | 4.535 | |
正向 | 1.177 | 1.700 | 1.997 | 2.112 | 2.129 | |
标签值y | 2.13 | 2.13 | 2.13 | 2.13 | 2.13 | |
反向 | -0.953 | -0.430 | -0.133 | -0.018 | ||
反向 | -2.243 | -1.462 | -0.531 | -0.078 | ||
反向 | -8.973 | -26.317 | -28.662 | -6.698 | ||
反向 | -2.243 | -3.101 | -1.951 | -0.360 |
表2-2,先看“迭代-1”列,从上到下是一个完整的正向+反向的过程,最后一行是-2.243,回到“迭代-2”列的第一行,2-(-2.243)=4.243,然后继续向下。到第5轮时,正向计算得到的c=2.129,非常接近2.13了,迭代结束。
运行示例代码的话,可以得到如下结果:
-
how to play:
1) input x,
2) calculate
c,
3) input target number but not faraway from
c
-
input x
as initial number(
1.2,
10), you can
try
1.3:
-
2
-
c=
1.177410
-
input y
as target number(
0.5,
2), you can
try
1.8:
-
2.13
-
forward...
-
x=
2.000000,a=
4.000000,b=
1.386294,
c=
1.177410
-
backward...
-
delta_c=-
0.952590, delta_b=-
2.243178, delta_a=-
8.972712, delta_x=-
2.243178
-
......
-
forward...
-
x=
9.655706,a=
93.232666,b=
4.535098,
c=
2.129577
-
backward...
-
done!
为节省篇幅只列出了第一步和最后一步(第5步)的结果,第一步时c=1.177410,最后一步时c=2.129577,停止迭代。
代码位置
ch02, Level2
转载:https://blog.csdn.net/songfei_dream/article/details/103257394
查看评论