美文网首页
DL01-6: 单层神经网络

DL01-6: 单层神经网络

作者: 杨强AT南京 | 来源:发表于2018-10-22 16:14 被阅读33次

    本主题内容包含:

    1. 理解单层多感知器神经网络(不含隐藏层)。
    2. 实现单层神经网络分类(矩阵)。

    多感知器实际就是单个感知器的集合,训练时对一个样本,所有感知器都同时得到训练(因为同时更新所有感知器的权重)。

    注意:本文显式使用了标量乘积\ast与向量内积\bullet

    1、分类特征表示

       一般的分类是简单的二类分类,要么是A类与是B类,可以用标量0与1表示,是A类就是0,是B类就是1。
       分类也可以使用向量表示\begin{bmatrix}1\\0\end{bmatrix}\begin{bmatrix}0\\1\end{bmatrix},是A类就是\begin{bmatrix}1\\0\end{bmatrix},是B类就是\begin{bmatrix}0\\1\end{bmatrix}
      向量的分类表示有多个好处:
        ( 1 ) 可以扩展为n类样本分类
        ( 2 ) 分类方式更加简单。比如:第i类样本的样本期望向量可以表示为\begin{bmatrix}0\\\vdots\\1_i\\\vdots\\0\end{bmatrix}。向量的第n个特征数据对应着对应分类的特征值,只要某位置上特征值最大\begin{bmatrix}0.001\\\vdots\\0.812_i\\\vdots\\0\end{bmatrix}(第i位置上的值0.812最大),我们就可以认为该输出的向量表示样本是对应位置的表示的分类(属于第i类)。

    神经网络的输出向量的每个特征值对应一个感知器。下面我们使用多个感知器构成单层神经网络。

    2、单层神经网络表示

    单层多感知器神经网络图示如下:> 单层多感知器神经网络

      其中数据表示如下:

    1. 输入数据向量:\overrightarrow{X}=\begin{bmatrix}x_0&x_1&\dots&x_n\end{bmatrix}\qquad\qquad (矩阵表示为:X
    1. 输出数据向量:\overrightarrow{Y}=\begin{bmatrix}y_0&y_1&\dots&y_m\end{bmatrix}\qquad\qquad (矩阵表示为:Y
    1. 权重矩阵:W=\begin{bmatrix} {\omega_{00}}&{\omega_{01}}&{\dots}&{\omega_{0n}}\\ {\omega_{10}} &{\omega_{11}}&{\dots}&{\omega_{1n}}\\ {\dots}&{\dots}&{\dots}&{\dots}\\ {\omega_{m0}}&{\omega_{m1}}&{\dots}&{\omega_{mn}} \end{bmatrix}\qquad\qquad
      n是输入特征数据长度,m数输出特征数据长度)
      (权重的每一行对应着一个感知器的权重,m行就意味着m个感知器)

    3、单层神经网络训练算法

      单层神经网络训练依据是基于如下目标:
      就是找到一组感知器的权重,使得这组感知器的输出Y与期望输出\bar{Y}之间的误差最小。

    第一步:初始化一个随机权重矩阵(用来训练);
    第二步:输入特征数据X计算每个感知器(m个感知器)的输出y_i(i=1,2,\dots,m),每个感知器的权重对应权重矩阵W中的一行,多个感知的输出就是输出向量Y
    第三步:计算感知器输出向量Y与样本期望输出\bar{Y}之间的误差。
    第四步:根据计算的误差,计算权重矩阵的更新梯度。
    第五步:用更新梯度,更新权重矩阵。
    第六步:然后从第二步反复执行,直到训练结束(训练次数根据经验自由确定)

    4、单层神经网络中的计算公式表示

    在上面描述的训练过程中,有两个主要的计算公式

    1. 感知器输出计算。
    2. 权重的更新计算(核心是计算更新梯度)。

    其中权重梯度的计算有两个依据:

    1. 误差的度量标准:损失函数的定义;
    2. 误差最小:损失函数极小值计算。

    根据这两个依据,我们可以列出单层神经网络的计算公式如下:

    单层多感知器的计算输出公式:

    Y^T=W\bullet X^T+W_b
    X\ \:输入特征数据,使用行向量表示.
    W_b:表示加权求和的偏置项。

    如果考虑激活函数,则计算输出公式为:

    Y^T=f_{activity}(W\bullet{X^T}+W_b)

    单层多感知器的权重计算公式:

    W_{new}=W_{old}-\eta\ast\nabla_{W}
    w_i^{new}=w_i^{old}-\eta\ast\nabla_{w_i}

    \ \ \ \ \ i:表示第i个感知器
    \ \ \ \ \ \eta:表示学习率,用来控制训练速度。
    \nabla_{w_i}:表示更新梯度(因为误差最小,是梯度下降,所以梯度更新是减去(-)梯度),梯度使用损失函数的导数,表示如下:
    \nabla_{w_i}=\frac{\partial{E{(w_i)}}}{\partial{w_i}}


    使用链式偏导数公式,损失函数E(W)可以表示为输出Y的函数,则可以把梯度展开:
    \nabla_{w_i}=\frac{\partial{E{(y_i)}}}{\partial{y_i}}\ast \frac{\partial{y_i}}{\partial{w_i}}


    上述公式中y_i是激活函数的输出,可以表示为y_i=f_{activity}(a_i),其中a_i=w_i\bullet X^T+w_{ib},则上述公式可以继续展开如下:
    \nabla_{w_i}=\frac{\partial{E{(y_i)}}}{\partial{y_i}}\ast \frac{\partial{f_{activity}(a_i)}}{\partial{a_i}}\ast \frac{\partial{w_i\bullet X^T}}{\partial{w_i}}
    上述公式中的计算项说明:
    \frac{\partial{E{(y_i)}}}{\partial{y_i}}:就是损失函数的导数;

    \frac{\partial{f_{activity}(a_i)}}{\partial{a_i}}:激活函数的导数;

    \frac{\partial{w_i\bullet X^T}}{\partial{w_i}}:加权求和的导数;


    如果损失函数采用误差平方和函数\frac{1}{2}\sum\limits_{k=1}^{N}(y_{ik}-\overline{y}_{ik})^2(N是样本个数),其导数为:\sum\limits_{k=1}^{N}(y_{ik}-\overline{y}_{ik}),如果采用随机梯度,则取当前样本,而不是所有样本,则可以表示如下:(y_{ik}-\overline{y}_{ik})

    若果激活函数采用恒等函数,其导数为:f(x)=1
    加权求和的导数为:X

    则梯度可以表示为:
    \nabla_{w_i}=\sum\limits_{k=1}^{N}(y_{ik}-\overline{y}_{ik})\ast X
    或者(随机误差损失函数):
    \nabla_{w_i}=(y_{ik}-\overline{y}_{ik})\ast X
    可以根据上面的推导过程很容易得到偏置项梯度为
    \nabla_{w_{ib}}=\sum\limits_{k=1}^{N}(y_{ik}-\overline{y}_{ik})
    或者
    \nabla_{w_{ib}}=(y_{ik}-\overline{y}_{ik})
    今后不采用其他激活函数与损失函数,这个公式尽管复杂点,但计算原理都是一样。


    更进一步,我们可以对\nabla_{w_i}=\frac{\partial{E{(w_i)}}}{\partial{w_i}}展开的公式进行分析,把与输入特征数据无关的部分剥离出来:
    \nabla_{w_i}=(\frac{\partial{E{(y_i)}}}{\partial{y_i}}\ast \frac{\partial{f_{activity}(a_i)}}{\partial{a_i}})\ast \frac{\partial{w_i\bullet X^T}}{\partial{w_i}}
    可以单独把上式括号中的项记为\delta,称为误差项:
    \delta_i=\frac{\partial{E{(y_i)}}}{\partial{y_i}}\ast \frac{\partial{f_{activity}(a_i)}}{\partial{a_i}}
    把误差项剥离出来,可以在今后多层神经网络中,对误差项进行传递,计算每一层的权重更新梯度。

    5、向量求导的理解

      因为标量与向量的求导是有区别的,但是当向量求导中的运算与标量一样的时候,向量求导与标量求导是没有差异的(传统标量的运算公式与规律大部分都可以平行移植到向量的运算中)。
      但是内积的求导是区别于传统的标量运算的,是向量运算中独有的运算定义,下面我们从细节上推导下面公式:

    \frac{\partial{w_i\bullet X^T}}{\partial{w_i}}=X


    标量对向量求导公式:
    \dfrac{\partial{y_i}}{\partial{w_i}}= \begin{bmatrix} \dfrac{\partial{y_i}}{\partial{w_{i0}}}&\dfrac{\partial{y_i}}{\partial{w_{i1}}}\cdots&\dfrac{\partial{y_i}}{\partial{w_{in}}}\\ \end{bmatrix}= \begin{bmatrix} x_0&x_1&\dots&x_n\\ \end{bmatrix}
    其中:y_i=w_i\bullet X^T


    6、单层多感知器神经网络的向量表示

       可以把上面多个感知器的梯度使用向量公式表达:

    W_{new}=W_{old}-\eta\ast\vec{\delta}\bullet X
    其中:\vec{\delta}=\begin{bmatrix}{\delta_0\\\delta_1\\\vdots\\\delta_m}\end{bmatrix}


    后面我们使用向量与tensorflow两种方式来实现单层神经网络。

    相关文章

      网友评论

          本文标题:DL01-6: 单层神经网络

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