美文网首页
神经网络(Neural Network)

神经网络(Neural Network)

作者: ZzzZBbbB | 来源:发表于2020-04-08 10:46 被阅读0次

    注意,此处的神经网络指的是Feedforward neural network,或者说是多层感知器(MLP, Multilayer perceptron)

    为什么需要神经网络?解决线性不可分问题

    线性不可分转化为可分.png

    神经网络理解之两部曲:

    1.随机梯度下降(Stochastic gradient descent)
    2.动态规划(Dynamic programming)

    随机梯度下降(SGD)

    一般的,机器学习算法中参数都是通过最小化损失函数来进行参数的迭代更新,但是这里隐含了一个条件,那就是对损失函数的定义是建立在所有训练样本之上的,换句话说,将所有的训练样本放到算法中进行学习,得到损失函数,随后更新参数,这样的方法叫批量梯度下降(Batch gradient descent),公式如下:
    E_{i n}(\vec{w})=\frac{1}{N} \sum_{i=1}^{N} e\left(h_{\vec{w}}\left(x_{i}\right),y_{i}\right)

    \vec{w}=\vec{w}-\eta \nabla E_{i n}

    但是对于SGD来说,参数的每一次更新只从一个随机样本中得到,公式如下:
    \vec{w}=w-\eta \nabla e\left(h_{\vec{w}}\left(x_{i}\right),y_{i}\right)

    这样子做的好处有:
    1.简化(偏)导数\nabla的计算
    2.可以更好的确定学习率\eta,每一次计算都可以重新换一个\eta

    神经网络为什么需要这个?
    继续往下分析,即可明白。

    动态规划

    在进行动态规划的解释之前,首先画一下基本的神经网络的结构,并且将一些数字规范做好,便于之后的推导

    NN基本结构.png

    数字标注:从左往右看:
    x^{(i)}=\left[\begin{array}{c}x_{1} \\ x_{2} \\ \vdots \\ x_{d}\end{array}\right]

    x^{(i)}:i个样本
    x_{m}^{[l]}:l层第m个感知器的输出
    \sum: 线性回归函数 \sum = w^{T}x +b
    \theta: 非线性函数,也叫激活函数
    d^{(l)}:l层感知器的个数

    现在着重看第l层第j个感知器其数据的流向:

    i->j.png

    x_{i}^{[l-1]}: 从第l-1层第i个感知器传来的值
    w_{i j}^{[l]}:l层第j个感知器对于第l-1层第i个传来输入的权重
    S_{j}^{[l]}:l层第j个感知器经过\sum = w^{T}x +b得到的求和值
    x_{j}^{[l]}: 从第l层第j个感知器经过\theta非线性变换后的输出值
    b_{j}^{[l]}: 从第l层第j个感知器对于前一层所有输入的偏置

    通过上述表示可以得到如下公式:

    x_{j}^{[l]}=\theta\left(S_{j}^{[l]}\right)
    S_{j}^{[l]}=\sum_{i=1}^{d^{(l-1)}} W_{i j}^{[l]} \cdot x_{j}^{[l-1]}+b_{j}^{[l]}

    神经网络其实是许多个这样的感知器堆叠而成,所以其所谓的前向传播(Forward propagation) 就是上面的这两个公式。

    那么现在来看参数更新的问题,通过前向传播可以得到一个样本i的最终预测值,也就可以得到其对应的损失函数e,这个时候就可以通过反向传播去得到参数的偏导数,并进行更新。(这里可以看到,仅仅只是使用一个样本,计算量都比较大,所以SGD的思想很重要)

    为了方便理解反向传播的动态规划,继续画一张图来理解:


    bp.png

    参数的更新:
    w_{i j}^{[l]}=w_{i j}^{[l]} -\eta \nabla \frac{\partial e}{\partial w_{i j}^{[l]} }
    b_{j}^{[l]}=b_{j}^{[l]} -\eta \nabla \frac{\partial e}{\partial b_{j}^{[l]} }

    具体的求解方式如下:
    先求关于w的偏导数:
    \frac{\partial e}{\partial w_{i j}^{[l]}}=\frac{\partial e}{\partial S_{j}^{[l]}} \cdot \frac{\partial S_{j}^{[l]}}{\partial w_{i j}^{[l]} }

    \frac{\partial S_{j}^{[l]}}{\partial w_{i j}^{[l]}}=x_{i}^{[l-1]}

    S_{j}^{[l]} = \sum_{i=1}^{d^{(l-1)}} w_{i j}^{[l]} \cdot x_{i}^{[l-1]} + b_{j}^{[l]}
    我们令\frac{\partial e}{\partial S_{j}^{[l]} }\delta_{j}^{[l]}那么

    \frac{\partial e}{\partial w_{i j}^{[l]}}=\delta_{j}^{[l]} \cdot x_{i}^{[l-1]}

    现在我们来关注一下这个\delta_{j}^{[l]},这里就运用到了dynamic programming的概念——关联\delta_{j}^{[l]}\delta_{i}^{[l-1]}
    \begin{aligned} \delta_{i}^{[l-1]}=\frac{\partial e}{\partial S_{i}^{[l-1]}} &=\sum_{j=1}^{d^{(l)}}\left(\frac{\partial e}{\partial S_{j}^{[l]}} \cdot \frac{\partial S_{j}^{[l]}}{\partial x_{i} ^{[ l-1]}} \cdot \frac{\partial x_{i}^{[ l-1]}}{\partial S_{i}^{ [l-1] }}\right) \\ &=\sum_{j=1}^{d^{(l)}}\left(\ { \delta_{j}^{[l]}} \cdot \frac{\partial S_{j}^{[l]}}{\partial x_{i} ^{[ l-1]}} \cdot \frac{\partial x_{i}^{[ l-1]}}{\partial S_{i}^{ [l-1] }}\right) \end{aligned}
    而这里
    \frac{\partial S_{i}^{[l]}}{\partial x_{i}^{[l-1]}}=w_{i j}^{[l]}
    \frac{\partial x_{i}^{ [l-1] }}{\partial S_{i}^{[l-1]}}=\theta^{\prime}
    \theta 可以是sigmoid函数,也可以是其他激活函数,这里假设为tanh函数,而tanh 函数的导数可以表示为
    \theta^{\prime} = 1- \theta^{2}

    总结一下,一个非常重要的关联公式就出来了:
    \delta_{i}^{[l-1]}=\sum_{j=1}^{d^{(l)}} \delta_{j}^{[l]} \cdot w_{i j}^{[l]}\left[1-\left(x_{i}^{ [l-1] }\right)^{2}\right]

    到这里,dp浮出水面,也就是说,通过计算当前层的\delta_{j}^{[l]}可以反推出上一层的\delta_{i}^{[l-1]} ,通过由右及左的方式便可以得到所有的 w

    而关于对b的更新,其实和 w 一样
    \frac{\partial e}{\partial b_{j}^{[l]}}=\frac{\partial e}{\partial S_{j}^{[l]}} \cdot \frac{\partial S_{j}^{[l]}}{\partial b_{j}^{[l]} }

    \frac{\partial S_{j}^{[l]}}{\partial b_{j}^{[l]}} = 1

    也就是说\frac{\partial e}{\partial b_{j}^{[l]} } 等价于\delta_{j}^{[l]}

    至此,可以说将神经网络参数一次更新的前前后后细节讲完了。之后便就是多次训练更新参数的问题了。

    相关文章

      网友评论

          本文标题:神经网络(Neural Network)

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