美文网首页
前馈神经网络

前馈神经网络

作者: 没天赋的学琴 | 来源:发表于2020-02-17 14:11 被阅读0次

前馈神经网络

   前馈神经网络,又称FNN(Feedforward Neural Network),是一种最简单的神经网络结构,FNN结构是由最基本的神经元(neuron)堆叠而成;在每个神经元会做两步操作:1.与对应权重相乘累加,称为神经元状态。2.累加后的结果传入激活函数\sigma(\omega^Tx)。激活函数的值即为一个神经元的输出。

单个神经元结构
一个简单的FNN是由输入层、输出层以及隐藏层(一个或多个)组成,下图就是一个简单的FNN,它拥有一层隐藏层(4个神经元组成),输入层(通常不做任何处理),输出层(2个神经元组成,代表最后输出是一个二维向量)。通常网络中还会有偏置层,即为下图中“+1”的部分。 简单的FNN网络
而本文仲描述FNN的记号:
  • n_l :第l层的神经元个数;
  • f():神经元的激活函数;
  • W^{[l]} \in R^{n_l*n_{l-1}}:第l层隐含层的权重所组成的矩阵
  • b^{(l)} :第l层的偏置
  • z^{(l)}:第l层神经元的状态
  • a^{(l)}:第l层神经元的激活值(即神经元输出值)

   总的来说,FNN的模型可以描述成:f_L(...f_k(...(f_2(f_1(x)))...)...)每经过一个隐含层就再给其增加一个中间函数,而每个隐含层所代表的具体的中间函数形式,是比较难解释。


前馈神经网络的损失函数

   与其他机器模型一样,FNN也需要模型训练时需要的目标cost function,也叫做loss function。常用的loss function有:

  • L(t,y)= \frac{1} {2} {(t - y)^2} (squared loss,用于实数预测回归);
  • L(t,y)= -(ylogt + (1 - y)log(1-t)) (用于二项分类,逻辑回归);
  • L(t,y)=- \sum _{j=1} ^{k} {y_jlog t_j} (cross entropy loss, 用于softmax回归);

linear regressionlogistic regression有些不同,模型的cost function可以通过极大似然估计这个角度切入,而前馈神经网络的cost function,笔者暂时还未深入了解,为何是如此设置。
   而当有了cost function,则模型训练的目标变成最小化损失函数,变成了一个无约束优化问题。


BP算法(反向传播算法)

   FNN参数的训练,可以使用反向传播算法,其基本思想是:1. 计算每一层的状态值和激活值,直至最后一层(前向传播);2. 从最后一层开始,计算每一层的误差,不断地向前推进(反向传播);3. 利用误差迭代参数,直至满足相应条件(达到迭代次数或误差得到满足)
   以下图的3层前馈神经网络为例:

三层神经网络
假设该神经网络的cost function为:

前向传播

   第二层神经元的状态值和激活值为:
z_{1} ^{(2)} = \omega_{11} ^{(2)} x_1 + \omega_{12} ^{(2)} x_2 + \omega_{13} ^{(2)} x_3 + b_1 ^{(2)} z_{2} ^{(2)} = \omega_{21} ^{(2)} x_1 + \omega_{22} ^{(2)} x_2 + \omega_{23} ^{(2)} x_3 + b_2 ^{(2)} z_{3} ^{(2)} = \omega_{31} ^{(2)} x_1 + \omega_{32} ^{(2)} x_2 + \omega_{33} ^{(2)} x_3 + b_3^{(2)} a_{1} ^{(2)} = f(z_{1} ^{(2)}) a_{2} ^{(2)} = f(z_{2} ^{(2)}) a_{3} ^{(2)} = f(z_{3} ^{(2)})
而第三层神经元的状态值和激活值则为:
z_{1} ^{(3)} = \omega_{11} ^{(3)} a_1 ^{(2)}+ \omega_{12} ^{(3)} a_2 ^{(2)} + \omega_{13} ^{(3)} a_3 ^{(2)} + b_1 ^{(3)} z_{2} ^{(3)} = \omega_{21} ^{(3)} a_1 ^{(2)}+ \omega_{22} ^{(3)} a_2 ^{(2)} + \omega_{23} ^{(3)} a_3 ^{(2)} + b_2 ^{(3)} a_{1} ^{(3)} = f(z_{1} ^{(3)}) a_{2} ^{(3)} = f(z_{2} ^{(3)})
如果若以矩阵形式来描述,则前向传播可以写成如下:z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)} a^{(l)} = f(z^{(l)})

反向传播

对输出层参数进行更新

先对cost function进行扩展
E=\frac {1} {2} {( (y_1 - a_1 ^{(3)})^2 + (y_2 - a_2 ^{(3)})^2) }
     = \frac{1}{2}{( (y_1 - f(z_1^{(3)}))^2 + ( y_2 - f(z_2 ^{(3)}) )^2 )}
 = \frac{1}{2}{( (y_1 - f(\omega_{11} ^{(3)} a_1 ^{(2)}+ \omega_{12} ^{(3)} a_2 ^{(2)} + \omega_{13} ^{(3)} a_3 ^{(2)} + b_1 ^{(3)}))^2 + ( y_2 - f(\omega_{21} ^{(3)} a_1 ^{(2)}+ \omega_{22} ^{(3)} a_2 ^{(2)} + \omega_{23} ^{(3)} a_3 ^{(2)} + b_2 ^{(3)}) )^2 )}

因此,若对输出层的神经元求偏导,则有:
\frac {\partial E} {\partial w_{11}^{(3)}} = -(y_1 - a_1 ^{(3)})*f^{'}(z_1 ^{(3)}) * a_1 ^{(2)} \frac {\partial E} {\partial w_{12}^{(3)}} = -(y_1 - a_1 ^{(3)})*f^{'}(z_1 ^{(3)}) * a_2^{(2)} \frac {\partial E} {\partial w_{13}^{(3)}} = -(y_1 - a_1 ^{(3)})*f^{'}(z_1 ^{(3)}) * a_3^{(2)} \frac {\partial E} {\partial w_{21}^{(3)}} = -(y_2 - a_2 ^{(3)})*f^{'}(z_2 ^{(3)}) * a_1 ^{(2)} \frac {\partial E} {\partial w_{22}^{(3)}} = -(y_2 - a_2 ^{(3)})*f^{'}(z_2 ^{(3)}) * a_2 ^{(2)} \frac {\partial E} {\partial w_{23}^{(3)}} = -(y_2 - a_2 ^{(3)})*f^{'}(z_2 ^{(3)}) * a_{3} ^{(2)}
若写成矩阵形式,则为:
\frac {\partial E} {\partial W} = {\delta ^{(L)} * {a^{(L-1)}}^T}
\delta^{(L)} = -(y - a^{(3)}) .* f ^{'}(z^{(L)})

对隐含层参数进行更新

继续对cost function进行进一步扩展
E = \frac{1}{2}{( (y_1 - f(\omega_{11} ^{(3)} f(z_1 ^{(2)})+ \omega_{12} ^{(3)} f(z_2 ^{(2)}) + \omega_{13} ^{(3)} f(z_3 ^{(2)}) + b_1 ^{(3)}))^2 + ( y_2 - f(\omega_{21} ^{(3)} f(z_1 ^{(2)})+ \omega_{22} ^{(3)} f(z_2 ^{(2)}) + \omega_{23} ^{(3)} f(z_3 ^{(2)}) + b_2 ^{(3)}) )^2 )}
对隐含层的神经元求偏导有:
{\partial E \over \partial w_{ij} ^{(l)} } = {\partial E \over \partial z_i ^{(l)} } {\partial z_i ^{(l)} \over \partial w_{ij} ^{(l)} }
{\partial E \over \partial z_i ^{(l)} } = \delta_i ^{(l)},则上式可写成:{\partial E \over \partial w_{ij} ^{(l)} } = \delta_i ^{(l)} a_j ^{(l-1)} \delta_i ^{(l)} = (\sum ^{} _{k \in E} {\delta_k ^{(l + 1)} \cdot w_{ki} ^{(l+1)}}) \cdot f^{'}(z_i ^{(l)})
这里E是指,与第l层的第i个神经元连接的第l+1层的神经元所组成的集合。由于上述的FNN各层之间是一种全连接方式,因此上述\delta_i ^{(l)}写成矩阵形式为:\delta ^{(l)} = ((W^{(l+1)})^T \delta ^{(l+1)}) .* f^{'}(z^{(l)}){\partial E \over \partial w_{ij} ^{(l)} }写成矩阵形式则为:{\partial E \over \partial W ^{(l)} } = \delta ^{(l)} \cdot ({a^{(l-1)})^T }

BP算法总结

   针对上述前馈神经网络,BP算法最后可以总结为四条公式:
\delta^{(L)} = -(y - a^{(L)}) .* f^{'}( z^{(L)} ) \delta^{(l)} = ( (W^{(l+1)})^T \cdot (\delta^{(l+1)}) ) .* f ^{'}(z^{(l)}) {\partial E \over \partial W^{(l)}} = \delta^{(l)} \cdot (a^{(l-1)})^T {\partial E \over \partial b^{(l)}} = \delta^{(l)}
选用不同的cost funtion,最后公式的形式可能会有所不同,但整个BP算法的流程是一样的。使用BP算法训练的神经网络,也被称为BP神经网络。深度学习中很多网络都可以使用BP算法来进行参数训练。


简单例子

   这里使用的是吴恩达在Coursera中machine learning的一个实验例子;在实验中,是通过搭建一个简单的神经网络,做到手写体数字识别的效果。

   下图是实验中的神经网络结构,是一个三层的神经网络,其中输入层的神经元个数是400(实验所用的数据是20x20 piexl的灰度图),隐含层的神经元个数是25,输出层的神经元个数是10(需要区分数字0-9) 网络结构
利用python实现上述网络的代码:

激活函数:

def sigmoid(x):
    
    return 1 / (1 + np.exp(-1 * x))

神经网络结构规格:

n0 = 400
n1 = 25
n2 = 10

BP算法:

def MinstNeuralNetwork(X, y, alpha=0.1, numIter=100):
    
    Xmat = np.mat(X)
    Ymat = np.mat(y)
    m, n = Xmat.shape
    
    #parameter initialize
    param_w1 = np.mat( np.random.random([n1, n0]) / 10 )
    param_w2 = np.mat( np.random.random([n2, n1]) / 10 )
    param_b1 = np.mat( np.random.random([n1, 1]) / 10 )
    param_b2 = np.mat( np.random.random([n2, 1]) / 10 )

    for i in range(numIter):
        
        for j in range(m):
            
            #forward
            z1 = param_w1 * Xmat[j, :].T + param_b1
            a1 = sigmoid(z1)
            
            z2 = param_w2 * a1 + param_b2
            a2 = sigmoid(z2)
            
            #backward
            nextItParam_w1 = param_w1
            nextItParam_w2 = param_w2
            nextItParam_b1 = param_b1
            nextItParam_b2 = param_b2
            
            delta2 = np.mat( -(Ymat[j, :].T - a2).A * sigmoid(z2).A * (1 - sigmoid(z2)).A )
            dw2 = delta2 * a1.T
            nextItParam_w2 = param_w2 - alpha * dw2
            
            delta1 = np.mat( (param_w2.T * delta2).A * sigmoid(z1).A * (1 - sigmoid(z1).A) )
            dw1 = delta1 * Xmat[j, :]
            nextItParam_w1 = param_w1 - alpha * dw1
            
            nextItParam_b1 = param_b1 - alpha * delta1
            nextItParam_b2 = param_b2 - alpha * delta2
            
            #update new parameter
            param_w1 = nextItParam_w1
            param_w2 = nextItParam_w2
            param_b1 = nextItParam_b1
            param_b2 = nextItParam_b2
            
    return param_w1, param_w2, param_b1, param_b2

最后网络在数据集上训练了300次,在训练集上的准确率达到了96%,与在Coursera里的实验相比,上述该例子的实现中并没有进行正则化,并且在训练次数较多;上述仅用最简的方法实现BP算法,较为粗糙。


总结

   前馈神经网络是最为简单的神经网络结构,是神经网络中的基础知识。当隐含层层数增加时,神经网络则可称之为深度网络。上述也对训练神经网络的BP算法做了简单介绍,也进行了较为粗略地实现。

相关文章

  • 前馈神经网络

    1 深度前馈网络 深度前馈网络(deepfeedforwardnetwork),也叫作前馈神经网络(feedfor...

  • 前馈神经网络

    前馈神经网络 前馈神经网络,又称FNN(Feedforward Neural Network),是一种最简单的神经...

  • Day6 Chapter6.1

    深度前馈网络 三个名字: 深度前馈网络( deep feedforward network)前馈神经网络( fee...

  • 常见神经网络类型之前馈型神经网络

    1、前馈型神经网络 常见的前馈型神经网络包括感知器网络、BP神经网络、RBF网络(径向基函数神经网络) (1)感知...

  • 姓名:于倩学号:21011210116学院:通信工程学院

    BP神经网络是前馈神经网络的一种,是指用反向传播算法(BP算法)进行训练的多层前馈神经网络,它包括信号的前向传播和...

  • 神经网络NN与前向传播算法简介

    前馈神经网络模型&前向传播算法 一个简单的前馈神经网络模型如下: 其中,称Layer L1 是输入层,不计入NN的...

  • 人工智能之深度学习——深度前馈网络

    深度前馈网络(Deep Feedforward Network)是具有深度结构的前馈神经网络,可以看成是进化...

  • 循环神经网络

    循环神经网络相对于前馈神经网络的有哪些优点? 传统的前馈神经网络一般的输入都是一个定长的向量,无法处理变长的序列信...

  • CNN基本算子与操作

    卷积神经网络(Convolutional Neural Networks,CNN)是一种前馈神经网络。卷积神经网络...

  • 卷积层(Convolution Layer)

    卷积神经网络(Convolutional Neural Networks,CNN)是一种前馈神经网络。卷积神经网络...

网友评论

      本文标题:前馈神经网络

      本文链接:https://www.haomeiwen.com/subject/hibpfhtx.html