1. 神经元概述
神经网络是由一个个的被称为“神经元”的基本单元构成,单个神经元的结构如下图所示:
对于上述的神经元,其输入为x_1 ,x_2 ,x_3 以及截距+1 ,其输出为:
h_{\mathbf{W},b}\left ( \mathbf{x} \right )=f\left ( \mathbf{W}^T\mathbf{x} \right )=f\left ( \sum_{i=1}^{3}W_ix_i+b \right )其中,\mathbf{W} 表示的是向量,代表的是权重,函数f 称为激活函数,通常激活函数可以选择为Sigmoid函数,或者tanh双曲正切函数,其中,Sigmoid函数的形式为:
f\left ( z \right )=\frac{1}{1+e^{-z}}双曲正切函数的形式为:
f\left ( z \right )=tanh\left ( z \right )=\frac{e^{z}-e^{-z}}{e^z+e^{-z}}以下分别是Sigmoid函数和tanh函数的图像,左边为Sigmoid函数的图像,右边为tanh函数的图像:
Sigmoid函数的区间为\left [ 0,1 \right ] ,而tanh函数的区间为\left [ -1,1 \right ] 。
若是使用sigmoid作为神经元的激活函数,则当神经元的输出为1时表示该神经元被激活,否则称为未被激活。同样,对于激活函数是tanh时,神经元的输出为1时表示该神经元被激活,否则称为未被激活。
2. 神经网络
2.1. 神经网络的结构
神经网络是由很多的神经元联结而成的,一个简单的神经网络的结构如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2kBGVAsn-1650777194062)(http://i.imgur.com/370RBZK.jpg)]
其中一个神经元的输出是另一个神经元的输入,+1 项表示的是偏置项。上图是含有一个隐含层的神经网络模型,L_1 层称为输入层,L_2 层称为隐含层,L_3 层称为输出层。
2.2. 神经网络中的参数说明
在神经网络中,主要有如下的一些参数标识:
2.3. 神经网络的计算
对于上述的神经网络结构,有下述的计算:
z^{(2)}_1=W^{(1)}_{11}x_1+W^{(1)}_{12}x_2+W^{(1)}_{13}x_3+b^{(1)}_1a^{(2)}_1=f\left ( W^{(1)}_{11}x_1+W^{(1)}_{12}x_2+W^{(1)}_{13}x_3+b^{(1)}_1 \right )z^{(2)}_2=W^{(1)}_{21}x_1+W^{(1)}_{22}x_2+W^{(1)}_{23}x_3+b^{(1)}_2a^{(2)}_2=f\left ( W^{(1)}_{21}x_1+W^{(1)}_{22}x_2+W^{(1)}_{23}x_3+b^{(1)}_2 \right )z^{(2)}_3=W^{(1)}_{31}x_1+W^{(1)}_{32}x_2+W^{(1)}_{33}x_3+b^{(1)}_3a^{(2)}_3=f\left ( W^{(1)}_{31}x_1+W^{(1)}_{32}x_2+W^{(1)}_{33}x_3+b^{(1)}_3 \right )从而,上述神经网络结构的最终的输出结果为:
h_{\mathbf{W},\mathbf{b}}\left ( \mathbf{x} \right )=f\left ( W^{(2)}_{11}a_1^{(2)}+W^{(2)}_{12}a_2^{(2)}+W^{(2)}_{13}a_3^{(2)}+b^{(2)}_1 \right )上述的步骤称为前向传播,指的是信号从输入层,经过每一个神经元,直到输出神经元的传播过程。
2.4. 其他形式的神经网络模型
上述以单隐层神经网络为例介绍了神经网络的基本结构,在神经网络的结构中,可以包含多个隐含层,神经网络的输出神经单元也可以是多个,如下面的含多隐层多输出单元的神经网络模型:
2.5. 神经网络中参数的求解
对于上述神经网络模型,假设有m 个训练样本\left \{ \left (\mathbf{x}^{(1)},y^{(1)} \right ),\cdots , \left (\mathbf{x}^{(m)},y^{(m)} \right )\right \} ,对于一个训练样本\left ( \mathbf{x},y \right ) ,其损失函数为:
J\left ( \mathbf{W},\mathbf{b};\mathbf{x},y \right )=\frac{1}{2}\left \| h_{\mathbf{W},\mathbf{b}}\left ( \mathbf{x} \right )-y \right \|^2为了防止模型的过拟合,在损失函数中会加入正则项,即:
J = loss + R其中,loss 表示的是损失函数,R 表示的是正则项。则对于上述的含有m 个样本的训练集,其损失函数为:
J\left ( \mathbf{W},\mathbf{b} \right )=\left [ \frac{1}{m}\sum_{i=1}^{m}J\left ( \mathbf{W},\mathbf{b};\mathbf{x}^{(i)},y^{(i)} \right ) \right ]+\frac{\lambda }{2}\sum_{l=1}^{n_l-1}\sum_{i=1}^{s_l}\sum_{j=1}^{s_{l+1}}\left ( W^{(l)}_{ij} \right )^2 通常,偏置项并不放在正则化中,因为在正则化中放入偏置项只会对神经网络产生很小的影响。
我们的目标是要求得参数\mathbf{W} 和参数\mathbf{b} 以使得损失函数J\left ( \mathbf{W},\mathbf{b} \right ) 达到最小值。首先需要对参数进行随机初始化,即将参数初始化为一个很小的接近0 的随机值。
参数的初始化有很多不同的策略,基本的是要在0 附近的很小的邻域内取得随机值。
在随机初始化参数后,利用前向传播得到预测值h_{\mathbf{W},\mathbf{b}}\left ( \mathbf{x} \right ) ,进而可以得到损失函数,此时需要利用损失函数对其参数进行调整,可以使用梯度下降的方法,梯度下降对参数的调整如下:
W^{(l)}_{ij}=W^{(l)}_{ij}-\alpha \frac{\partial }{\partial W^{(l)}_{ij}}J\left ( \mathbf{W},\mathbf{b} \right )b^{(l)}_{i}=b^{(l)}_{i}-\alpha \frac{\partial }{\partial b^{(l)}_{i}}J\left ( \mathbf{W},\mathbf{b} \right )其中,\alpha 称为学习率,在计算参数的更新公式中,需要使用到反向传播算法。
而\frac{\partial }{\partial W^{(l)}_{ij}}J\left ( \mathbf{W},\mathbf{b} \right ) ,\frac{\partial }{\partial b^{(l)}_{i}}J\left ( \mathbf{W},\mathbf{b} \right ) 的具体形式如下:
\frac{\partial }{\partial W^{(l)}_{ij}}J\left ( \mathbf{W},\mathbf{b} \right )=\left [ \frac{1}{m}\sum_{i=1}^{m}\frac{\partial }{\partial W^{(l)}_{ij}}J\left ( \mathbf{W},\mathbf{b};\mathbf{x}^{(i)},y^{(i)} \right ) \right ]+\lambda W_{ij}^{(l)}\frac{\partial }{\partial b^{(l)}_{i}}J\left ( \mathbf{W},\mathbf{b} \right )=\frac{1}{m}\sum_{i=1}^{m}\frac{\partial }{\partial b^{(l)}_{i}}J\left ( \mathbf{W},\mathbf{b};\mathbf{x}^{(i)},y^{(i)} \right )\begin{matrix} \delta _i^{(n_l)}=\frac{\partial }{\partial z_i^{n_l}}J\left ( \mathbf{W},\mathbf{b};\mathbf{x},y \right )\\ =\frac{\partial }{\partial z_i^{n_l}}\frac{1}{2}\left \| y-h_{\mathbf{W},\mathbf{b}}\left ( \mathbf{x} \right ) \right \|^2\\ =\frac{\partial }{\partial z_i^{n_l}}\frac{1}{2}\sum_{i=1}^{s_{n_l}}\left \| y_i-a_i^{n_l} \right \|^2\\ =\left ( y_i-a_i^{n_l} \right )\cdot \left ( -1 \right )\cdot \frac{\partial}{\partial z_i^{n_l}}a_i^{n_l}\\ =-\left ( y_i-a_i^{n_l} \right )\cdot {f}'\left ( z_i^{n_l} \right ) \end{matrix}-对于非输出层,即对于l=n_{l-1},n_{l-2},\cdots ,2 各层,第l 层的残差的计算方法如下(以第n_{l-1} 层为例):
\begin{matrix} \delta _i^{(n_{l-1})}=\frac{\partial }{\partial z_i^{n_{l-1}}}J\left ( \mathbf{W},\mathbf{b};\mathbf{x},y \right )\\ =\frac{\partial }{\partial z_i^{n_{l-1}}}\frac{1}{2}\left \| y-h_{\mathbf{W},\mathbf{b}}\left ( \mathbf{x} \right ) \right \|^2\\ =\frac{\partial }{\partial z_i^{n_{l-1}}}\frac{1}{2}\sum_{j=1}^{s_{n_l}}\left \| y_j-a_j^{n_l} \right \|^2\\ =\frac{1}{2}\sum_{j=1}^{s_{n_l}}\frac{\partial }{\partial z_i^{n_{l-1}}}\left \| y_j-a_j^{n_l} \right \|^2\\ =\frac{1}{2}\sum_{j=1}^{s_{n_l}}\frac{\partial }{\partial z_j^{n_{l}}}\left \| y_j-a_j^{n_l} \right \|^2\cdot \frac{\partial }{\partial z_i^{n_{l-1}}}z_j^{n_{l}}\\ =\sum_{j=1}^{s_{n_l}}\delta _j^{(n_l)}\cdot \frac{\partial }{\partial z_i^{n_{l-1}}}z_j^{n_{l}}\\ =\sum_{j=1}^{s_{n_l}}\left ( \delta _j^{(n_l)}\cdot \frac{\partial }{\partial z_i^{n_{l-1}}}\sum_{k=1}^{s_{n_{l-1}}}f\left ( z_k^{n_{l-1}} \right )\cdot W_{jk}^{n_{l-1}} \right )\\ =\sum_{j=1}^{s_{n_l}}\left ( \delta _j^{(n_l)}\cdot W_{ji}^{n_{l-1}}\cdot {f}'\left ( z_i^{n_{l-1}} \right )\right )\\ =\left (\sum_{j=1}^{s_{n_l}} \delta _j^{(n_l)}\cdot W_{ji}^{n_{l-1}}\right )\cdot {f}'\left ( z_i^{n_{l-1}} \right ) \end{matrix}因此有:
\delta _i^{(l)}=\left (\sum_{j=1}^{s_{l+1}} \delta _j^{(l+1)}\cdot W_{ji}^{(l)}\right )\cdot {f}'\left ( z_i^{(l)} \right )对于神经网络中的权重和偏置的更新公式为:
\frac{\partial }{\partial W_{ij}^{(l)}}J\left ( \mathbf{W},\mathbf{b};\mathbf{x},y \right )=a_j^{(l)}\delta _i^{(l+1)}\frac{\partial }{\partial b_{i}^{(l)}}J\left ( \mathbf{W},\mathbf{b};\mathbf{x},y \right )=\delta _i^{(l+1)}2.6. 神经网络的学习过程
对于神经网络的学过程,大致分为如下的几步:
- 初始化参数,包括权重、偏置、网络层结构,激活函数等等
- 循环计算
- 返回最终的神经网络模型
参考文献
[1] 英文版:UFLDL Tutorial
[2] 中文版:UFLDL教程