在前几节,我们一直强调,人工智能运行的一个基本原理是,由人分析具体问题然后抽象出问题与数据间的逻辑关系,这种逻辑关系往往是一个数学模型。计算机的任务是根据大量数据的分析来确定数学模型中的各种参数。前面我们详细讨论过的一个例子就是二维平面上点集的划分。
这里写图片描述
如上图,由人对问题进行抽象分析后得出,两组数据可以用一条通过圆点的直线分割开来。直线所对应的方程就是问题与数据间的逻辑关系,也就是数学模型,模型的参数就是直线的斜率,这条直线与横坐标成多大的夹角才能更好的将两组数据区分开来。计算机的任务就是根据输入的大量点坐标,然后根据给定算法步骤把这个夹角计算出来。计算的办法就是开始先随机设置这个夹角值,然后检测直线区分数据的效果,如果数据集中总共有100个点,其中60个点属于红点,但是当前直线只能将30个点识别为红点,那么误差就是30个点,根据这个误差,算法调节直线夹角,使得调整后能正确识别的红点数量越来越多,这就是人工智能运转的基本原理。
前面说过,神经网络模型中,需要修正的参数是神经元链路之间的权重值,问题在于如何修改,如下图,假定最后神经元输出结果,跟正确结果比对后得到一个误差,那么我们如何根据误差来修正W(1,1) 和 W(2,1)呢?
这里写图片描述
神经网络模型的问题在于,任何一个节点链路权重的改变都会对最终结果产生影响。所以当我们拿到计算结果产生的误差后,不可能仅仅修改其中某一个权重,而是所有权重都要相应修改。接下来问题是,权重参数有多个,而最终误差只有一个,那么如何把误差分配给每个权重进行调整呢?一种做法是把误差平均分配给每个权重,如下图:
这里写图片描述
但这种大锅饭机制不合理,因为W(1,1)权重大,传送给输出节点的信号量就强,因此最终结果的误差来自于这条链路的贡献相对就大,因此要调整的话,这个权重的调整幅度肯定要比下面链路权重的调整幅度要大,因此合理的做法是,根据权重的比值进行相应的调整,因此网络要把误差的四分之三传递给W(1,1), 四分之一传递给W(2,1),于是误差反向传播的模式如下图:
这里写图片描述
这个误差回传机制继续运用到后续节点链路上,这就是所谓的反向传导。当前模型中,输出节点只有一个,如果输出节点有多个怎么办?例如下图:
这里写图片描述
上图网络有两个输出节点,两个节点的输出结果跟正确结果都会产生偏差,其处理方式跟一个节点时一样,每个节点拿到误差后,根据进入其节点的链路权重,等比例的返回给后面节点。如果第一个节点的输出结果为O1, 对应的正确结果为T1, 那么第一个输出节点的误差就是E1 = T1 - O1.从上图可以看出E1会根据W(1,1)和W(2,1)的相互比值,同比例的返回给第一层的节点1和节点2.误差E2的分配也同理。这么算来,用于调整权重W(1,1)的误差比值为:
这里写图片描述
同理用于调整权重W(2,1)的误差比值为:
这里写图片描述
举个实际例子,假定E1= 9, W(1,1) = 6, W(2,1) = 3, 那么用于调整W(1,1)的误差值为 9 * (6 / (6+3)) = 6, 用于调整W(2,1)的误差值为 9 *(3/(3+6)) = 3。同理E2也依据相同原则分配给W(1,2)和W(2,2).
如果网络有三层,那么误差以相同机制反向传播,如下图:
这里写图片描述
误差先从最外层节点开始,根据链路的权重比例返回给中间隐藏层节点1,隐藏层节点1和输入层节点1之间,在根据两者的链接链路比重把中间层节点1接收到的误差同比例分配给权重W(i,h)。如果还有更多的层级,这个反向传播机制就一直进行下去。我们用一个具体实例把误差的反向传播机制走一遍。
这里写图片描述
最外层输出两个输出节点的误差分别为1.5和0.5,中间层节点1与最外层节点1之间的链路权重为2.0,中间层节点1与最外层节点2的链路权重为1.0,中间层节点2与最外层节点1的链路权重为3.0,中间层节点2与最外层节点2的链路权重为4.0,于是最外层节点1反向传导给中间层节点1的误差为 1.5 * (2 / (2+3)) = 1.5 * (2/5) = 0.6, 最外层节点2反向传导给中间层节点1的误差为 0.5 * (1 / (1+4)) = 0.5 *(1/5) = 0.1, 因此中间层节点1接收到的总误差为0.7.
中间层节点1与最外层节点2间链路权重为1.0,因此最外层节点1反向传播给中间层节点2的误差为1.5 * (3.0 / (2.0 + 3.0)) = 1.5 * (3/5) = 0.9,中间层节点2与最外层节点2的链路权重为4.0,因此最外层节点2反向传播给中间层节点2的误差为0.5 * (4.0 / (1.0 + 4.0)) = 0.5 * (4/5) = 0.4, 由此中间层节点2获得的误差为1.3.
我们以同样的方法将误差从中间层传到回最外层,如下图:
这里写图片描述
最外层节点1与中间层节点1的链路权重为3.0,最外层节点2余中间层节点1链路权重为2.0,因此中间层节点1反向传导给最外层节点1的误差为 0.7 * (3.0 / (3.0+2.0) ) = 0.7 * (3/5) = 0.42, 中间层节点1反向传导给最外层节点2的误差为 0.7 * (2.0 / (3.0 + 2.0) ) = 0.28.
最外层节点1与中间层节点2的链路权重为1.0,最外层节点2与中间层节点2的链路权重为7.0,因此中间层节点2反向传导给最外层节点1的误差为 1.3 * (1.0 / (1.0 + 7.0) ) = 1.3 * (1/8) = 0.1625, 中间层节点2反向传导给最外层节点2的误差为1.3 * (7.0 / (7.0 + 1.0) ) = 1.1375.
由此最外层节点1获得的总误差为 0.42 + 0.1625 = 0.5825, 最外层节点2获得的误差为0.28 + 1.1375 = 1.4175.
通过反向传播,我们就能把最外层节点获得的误差传导给神经网络每一层的每个节点,每个节点再根据获得的误差调整它与下一层网络节点的链路权重,这个误差回传过程就是神经网络中经常提到的反向传播机制。
下一节我们看看如何使用矩阵快速实现反向传播误差的计算。
作者:望月从良
链接:https://www.jianshu.com/p/0232a0dbd1c3