书接上文,上面介绍的是DNN的基本结构和一些要用到的公式。
在这里我将要说一下DNN的前向传播,上图先:
我来解释一下这个图。layer1是输入层,layer2是隐藏层,layer3是输出层。当然层数不是固定的,每层的神经元个数也不是固定的。一般来说第一层是输入参数的,最后一层是输出层,中间的都叫做隐藏层。
在输入层,每一个参数对应一个神经元(可以这么理解),每一个参数都要传给下一层(隐藏层),虽然输入层和隐藏层看似一样,但是输入层是不需要经过计算的,我们对于输入参数的调整一般在传入之前。
在隐藏层,做的事情就多了起来,首先隐藏层前一层的神经元个数是确定的,比如图中隐藏层layer2的前一层输入层layer1有3个神经元,那么layer2的每个神经元都有三个对应layer1三个输入的权重和一个偏置(一个神经元只有一个偏置)。
做下列运算:
我们将我们的例子对应该公式,l为层数,这里是第二层,所以l为2。k是前一层的神经元个数,k为3。a为上一层的输出,a中的符号和w是一样的,且a为l-1是因为计算当层输出时需要上一层的输出,b为偏置,每一个神经元都有自己的偏置。σ是激活函数,公式如下:
经过激活函数的计算之后,输出值会变得平滑规范,如下:
这就是一个很好的性质了,我们知道每一个神经元的输出会传向后一层所有的神经元。比如说我们不用激活函数会犯生什么?可能会出现以下情况,某一层有4个神经元,输出分别是9999999、0.1、0.1、0.3,这样一来第一个神经元的输出相比较于其他神经元的输出太大,对于权重的调整比较不友好,甚至会出现掩盖其他神经元输出值的情况发生。为了避免这类的问题发生,我们使用了该激活函数(sigmod),使得每个神经元的输出在0-1之间。
输出层,输出层和隐藏层差不多,只不过输出层不用向下一层传层值,且有时在分类问题中,输出层可能会使用softmax激活函数代替sigmod激活函数作为输出。
待续...