神经网络

发布时间 2023-04-01 15:45:15作者: 小蒟蒻皮皮鱼

1.简介

简单来说就是模仿动物神经网络行为特征进行信息处理的算法模型
每一个神经元接收多个上一级神经元传递的信号,将其处理后,若电信号足够强超过了阈值,神经元就会发信号给下一级神经元

神经网络也是这个思路,每一层的神经元都与下一层的链接,并通过权重将自己的值传输到下一个神经元
一般定义有输入层,隐藏层,输出层

2.神经元结构

\(w_i\)表示权重,\(b\)表示偏置,\(f(x)\)表示激活函数
激活函数有很多种,它的作用是判断信号强度并输出真正需要的值,目的都是为了增强网络的拟合能力,进行非线性的拟合
常用的有 Sigmoid, ReLU 等
\(n\)为输入的数量,\(x_i\)为输入的值,则他们的输出为加权求和,即
\(q=\sum_{i=1}^nw_ix_i+b\)
激活后的输出为
\(r = f(q)\)
在接下来的说明中,我们定义如下变量
\(T\):网络层数
\(n_k\):第k层神经元数量(k=0时表示输入数量)
\(f(k)\):第k层激活函数
\(w_{k,i,j}\):链接第k层第i个神经元和k-1层第j个神经元的权重
\(b_{k,i}\):第k层第i个神经元的偏置
\(q_{k,i}\):第k层第i个神经元激活前的输入
\(r_{k,i}\):第k层第i个神经元激活后的输入(r=0时表示初始输入)

3.前向传播

根据前文提到过的神经元工作原理,可以很容易的得到这个式子
\(q_{k,i}=\sum_{j=1}^{n_{k-1}}w_{k,i,j}r_{k-1,j} + b_{k,i}\\ r_{k,i} = f_k(q_{k,i})\)
最后一层神经元激活后的输出就是整个神经网络的输出

4.训练——梯度下降法

训练,简单地来说就是人为设定好神经网络的初始结构后,不断喂给他数据,让他自己学习找到合适的参数
\(X=(x_1,x_2,...,x_{n_T}),Y=(y_1,y_2,...,y_{n_T})\)
我们定义误差函数
\(L(X,Y)=\sum_{i=1}^{n_T}(x_i-y_i)^2\)
令期望输出的第\(i\)个值为\(y_i\)
定义\(R=(r_{T,1},r_{T,2},...,r_{T,n_T}),Y=(y_1,y_2,...,y_{n_T})\)
想要找找到合适的参数,需要让误差最小
令损失值\(l=L(R,Y)\)
也就是找到\(l\)的最小值(或者说比较优秀的极小值)
求极值也就需要求偏导
想办法求出\(\frac{\partial l}{\partial w_{k,i,j}}\)\(\frac{\partial l}{\partial b_{k,i}}\)
这样就可以想办法调整参数让\(l\)最小
这就是梯度下降法
定义\(O(\omega,d,\eta) = \omega - d\eta\)为优化器,其中的\(\eta\)为学习率
通常\(\eta\)太高会导致损失值不稳定,太低会导致学习过慢
在修改参数的时候,只需要不断使
\(w_{k,i,j} = O(w_{k,i,j},\frac{\partial l}{\partial w_{k,i,j}},\eta)\\ b_{k,i} = O(b_{k,i},\frac{\partial l}{\partial b_{k,i}},\eta)\\\)
就可以得到较优的参数

5.反向传播

这部分是关于如何求出\(\frac{\partial l}{\partial w_{k,i,j}}\)\(\frac{\partial l}{\partial b_{k,i}}\)
首先,由\(q_{k,i}=\sum_{j=1}^{n_{k-1}}w_{k,i,j}r_{k-1,j} + b_{k,i}\),根据链式法则得出
\(\begin{align} \frac{\partial l}{\partial w_{k,i,j}} &= \frac{\partial l}{\partial q_{k,i}}\frac{\partial q_{k,i}}{\partial w_{k,i,j}}\\ &= \frac{\partial l}{\partial q_{k,i}}r_{k-1,j} \end{align}\)
\(\begin{align} \frac{\partial l}{\partial b_{k,i}} &= \frac{\partial l}{\partial q_{k,i}}\frac{\partial q_{k,i}}{\partial b_{k,i}}\\ &= \frac{\partial l}{\partial q_{k,i}} \end{align}\)
还是根据链式法则,由于第\(k + 1\)层每一个神经元都与当前神经元相连接,可以得到
\(\begin{align} \frac{\partial l}{\partial q_{k,i}} &= \sum_{j =1}^{n_{k+1}} \frac{\partial l}{\partial q_{k+1,j}} \frac{\partial q_{k+1,j}}{\partial r_{k,i}} \frac{\partial r_{k,i}}{\partial q_{k,i}}\\\ &= \sum_{j =1}^{n_{k+1}} \frac{\partial l}{\partial q_{k+1,j}}w_{k+1,j,i}f'_k(q_{k,i}) \end{align}\)
在最后一层,由\(l=L(R,Y)\),如下:
\(\frac{\partial l}{\partial q_{T,i}} = \frac{\partial l}{\partial r_{T,i}} \frac{\partial r_{T,i}}{\partial q_{T,i}} = \frac{\partial l}{\partial r_{T,i}}f'_T(q_{T,i})\)
于是,就可以从后往前推出每一个\(\frac{\partial l}{\partial w_{k,i,j}}\)\(\frac{\partial l}{\partial b_{k,i}}\),进而进行梯度下降

部分内容参考了洛谷日报