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