DL01-6: 单层神经网络

2018-10-22  本文已影响33人  杨强AT南京

本主题内容包含:

  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两种方式来实现单层神经网络。

上一篇下一篇

猜你喜欢

热点阅读