前面是从正向解释了一个网络如何能够将一张照片进行正确分类,原理是这个原理,但是你也许也注意到了,其中举到的例子,所有的参数,filter中的数值都是我们人工设计的,那么在真正的实践中,这些参数是如何计算出来的呢?这就要用到机器学习了,或者说网络的训练。
前面在讲Adaboost的时候其实我们已经讲过训练了,卷积网络的训练分为两个过程,一个前向传播,一个后向传播。
所谓前向传播,是指在网络上从左侧到右侧,由输入计算或推导出输出结果的过程。这时候如果网络仍未经过训练,或仍然训练得不够,其参数并不准确,那么计算出来的结果可能不等于真实的结果。
所以需要一个后向传播来修正。
后向传播是指将网络计算结果与真实结果之间的误差,通过网络连接一步步传递给前一层网络中的参数,通过细微的调整,使得这个误差减小,从而使网络下一次计算出来的结果更接近真实值。
举例来说,一组图片可能是猫或者狗,从中抽取一张猫的照片,输入给网络,这时候结果的真实值或者说期望值应该是猫等于100%,狗等于0%,然而网络计算结果却是猫的概率等于0.3,狗的概率等于0.7,那么网络输出结果就和真实结果存在误差,总误差为
|1-0.3|+|0-0.7| = 1.4
上面这个式子仅仅只是一个简单的原理展示,在实际应用中我们经常会使用到方差而非差值的绝对值来表示误差。
好吧,看起来误差有点大,那么我们小心地微调一下参数,使猫的概率增大一点点,狗的比例减小一点点,这样误差就低一些,我们离真实结果就近一些,这样不断调整,就使我们逐步接近真实结果(具体算法稍后介绍)。
所以前向传播传递的是输入数据,后向传播传递的是误差。
让我们先把这两个过程的具体步骤完整的列出来。
- 初始化网络参数。譬如说什么都不知道的情况下先将所有参数设置为1,等等。
- 输入图像数据,计算输出结果(输出层)
- 求总误差
- 根据总误差计算前一层网络的所有参数,如此循环,计算出每一层的参数
- 重复2-3步,直到总误差在可接受范围内
这里,网络的初始化有多种方法,本文不具体介绍,第2步的前向过程前面已经有比较详细的介绍了,也略过。以下主要介绍第3和第4步的过程。
假设有一个网络,它的最终输出层有2个节点,那么它的形式一定是这样的:
其中,输出层每一节点的数值都代表一个概率值,所有输出层的和为1。我们以下表为例:
节点 | 输出值 | 真实值 |
o1(cat) | 0.7 | 0.99 |
o2(dog) | 0.3 | 0.01 |
总误差的计算方式如下:
则上例中,总误差为
正如我们之前所讲,通常在这里使用方差而非差值的绝对值来表达误差。好了,误差就介绍到这里,下面来介绍几个概念,帮助我们理解卷积网络的训练背后的原理。