NueralNetwork模型
一个神经元通常具有多个树突,主要用来接受传入信息;而轴突只有一条,轴突尾端有许多轴突末梢可以给其他多个神经元传递信息:
据此建立的神经元模型如下,其中 σ σ 函数被称为“激活函数”,实际起到“约束函数”的作用,通常是使用 g g 来表示,这里目的是表明“激活函数”使用的是Sigmoid函数,其他常见的激活函数有“Relu”,”Tanh”,”Leaky Tanh”等等。
这里用一个简单的2层网络来介绍后续使用的模型:
其中层为输入层, L1 L 1 层为隐藏层, L2 L 2 层为输出层,通常输入层不会计入层总数中,所以这是一个2层的神经网络。 a[l]j a j [ l ] 表示第 l l 层的第的神经元节点。
其中还隐藏了一些参数:
a[l]=g(z[l])=g(W[l]a[l−1]+b[l]) a [ l ] = g ( z [ l ] ) = g ( W [ l ] a [ l − 1 ] + b [ l ] )
W[l]={w[l]1,...,w[l]n}T W [ l ] = { w 1 [ l ] , . . . , w n [ l ] } T
前向传播
使用前述介绍提到的公式:
如此逐层计算得到输出即可。
后向传播
后向传播指的就是求出 loss l o s s 函数对于各层各参数的梯度的过程,实际得到的就是各层各参数的变化对于最终结果的影响程度。
根据链式法则则可以得出:
由于后续的实例为一个分类问题,所以这里 dlossda[L] d l o s s d a [ L ] 为二分类问题的结果,不同问题下这个结果会有不同,设计框架时需要独立出来。
所以我们只需要得出 loss′(a[L]) l o s s ′ ( a [ L ] ) ,然后使用 a′[l](W[l])=a′[l](z[l])z′[l](W[l]),a′[l](b[l])=a′[l](z[l])z′[l](b[l]) a ′ [ l ] ( W [ l ] ) = a ′ [ l ] ( z [ l ] ) z ′ [ l ] ( W [ l ] ) , a ′ [ l ] ( b [ l ] ) = a ′ [ l ] ( z [ l ] ) z ′ [ l ] ( b [ l ] ) 重复进行各层计算即可,注意各层间的关系 z′[l](a[l−1])=W[l]T z ′ [ l ] ( a [ l − 1 ] ) = W [ l ] T 不要忘记加入链中。
以上为基础深层神经网络的基本思路,详尽描述待补充
基于numpy和Tensorflow的实现代码见:https://github.com/Alnlll/ML/tree/master/NN