[自然语言处理先修]三、神经网络基础
三、神经网络基础
学习路线参考:
https://blog.51cto.com/u_15298598/3121189
https://github.com/Ailln/nlp-roadmap
https://juejin.cn/post/7113066539053482021
本节学习使用工具&阅读文章:
https://www.cnblogs.com/subconscious/p/5058741.html
https://www.jiqizhixin.com/graph/technologies/f9849d6c-6262-4c1f-8f42-6d976be17161
https://zhuanlan.zhihu.com/p/30155870
https://blog.csdn.net/qq_18822147/article/details/120243772
https://blog.csdn.net/weixin_44646390/article/details/127926813
https://zhuanlan.zhihu.com/p/72038532?ivk_sa=1024320u
https://blog.csdn.net/happy488127311/article/details/123869219
https://blog.csdn.net/hollyprince/article/details/125900787
https://blog.csdn.net/happy488127311/article/details/123869219
1. 神经网络
-
节点(神经元)
节点的结构如图所示:
用
x
来表示输入,用w
来表示权值,用g(x)
来表示非线性函数,用y
来表示输出,那么图上这个节点的计算过程可以描述为\(y = g(w_1x_1+w_2x_2+w_3x_3)\)。事实上,这是在一个线性回归的基础上增加了一个非线性函数。当去掉非线性函数(或换为线性函数)时,节点的计算过程就退化为线性回归。这个非线性函数被叫做激活函数。神经网络由多个节点组成,一个神经网络的训练算法就是让权重的值调整到最佳,以使得整个网络的预测效果最好。
-
单层神经网络(感知机)
感知器是一种最简单形式的前馈神经网络,可以处理线性可分问题。通常用于将数据分为两部分。因此也被称为线性二元分类器。
感知机的结构如图所示,可以看成是单个神经元,也可以看成是由
n
个不计算的神经元的输入层+用于计算的输出层组成。其激活函数通常选用符号函数\(sign(x)\)。当x
非负时,函数取值为1,;当x
为负数时,函数取值为-1。-
问题描述
感知机寻找的是一个超平面\(wx+b=0\)使得数据集的正实例点和负实例点完全正确地划分到超平面的两侧。
-
损失函数(Loss)
损失函数的一个自然选择是误分类点的总数,但是这样损失函数不是参数w和w的连续可导函数,不易优化。另一个选择是误分类点到超平面S的总距离,这是感知机所采用的。
输入空间中任一点\(x_0\)到超平面\(S\)的距离:\({1\over||w||}|wx_0+b|\)。其中\({1\over||w||}\)为\(w\)的\(L_2\)范数
误分类点\((x_i,y_i)\)到超平面\(S\)的距离:\({1\over||w||}y_i|wx_i+b|\)
假设超平面\(S\)的误分类点集合为\(M\),那么所有误分类点到超平面\(S\)的总距离:\({1\over||w||}\sum_{x_i∈M}y_i|wx_i+b|\)
不考虑\({1\over||w||}\),得到感知机学习的损失函数:\(L(w,b)=-\sum_{x_i∈M}y_i|wx_i+b|\)
- 损失函数的作用对象是误分类的点。只要数据集线性可分,无论有没有\({1\over||w||}\)Loss的值最终都会收敛到0,因此可以不考虑。
-
优化方案:随机梯度下降
-
-
两层神经网络(单隐层神经网络)
在感知机的基础上,向输入层和输出层中间再添加一层中间层,就得到了两层神经网络。中间层又被称为隐藏层,两层神经网络又被称为单隐层神经网络。
一般情况下,除了权重w,还有偏置值b。偏置节点是一个只含有存储功能,且存储值永远为1的单元。它没有输入,但与后一层的所有节点都有连接,一般在网络图中并不专门画出来。
-
前向传播:网络模型从输出到输出结果的过程。
设输入层节点数为\(n\),则网络的输入:\(X = (x_1,x_2,…,x_n)\)。
设隐藏层第i个节点的权重为\(w^1_i\),则权重向量:$W^{(1)} = (w1_1,w1_2,…,w^1_n) $
故隐藏层的求和结果为:\(Z^{(1)} = W^{(1)}X + b^{(1)}\)
设隐藏层的激活函数为\(\theta(x)\)
则隐藏层的输出为:\(A^{(1)} = \theta(Z^{(1)})\)
同理可得,输出层的求和结果为:\(Z^{(2)} = W^{(2)}A^{(1)} + b^{(2)}\)
输出层的输出为:\(A^{(2)} = \theta(Z^{(2)})\)
-
反向传播:网络模型参数更新的过程,可视为整体的最优化过程。
在单隐层神经网络中,首先要根据神经网络计算出的值和期望值计算损失函数的值,然后采用梯度下降法,通过链式求导法则计算出损失函数对每个权重或偏置的偏导,最后进行参数更新。
该方法对网络中所有权重计算损失函数的梯度。 这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数,使得输出靠近预期结果。
-
-
多层神经网络
在单隐层神经网络的基础上,继续增加隐藏层的数量,就得到了多层神经网络。因为神经网络的层数增加了,参数也增加了,表示能力大幅度增强,很容易出现过拟合现象。在情况更复杂的网络中,还会出现梯度消失和梯度爆炸问题。
2. 梯度消失与梯度爆炸
在反向传播过程中,得到的梯度值接近0的现象,被称为梯度消失;得到的梯度特别大的现象,被称为梯度爆炸。这两个问题是由于神经网络层数过深、激活函数选择不恰当、初始化权重不合适导致的。
防止出现该类问题有多种手段:
- 更换激活函数,更改权重初始化方式;
- Batch Normalization:对每一层的输出规范为均值和方差一致。这消除了权重参数放大缩小带来的影响,进而解决梯度消失和爆炸的问题
- 对权重进行正则化:通过正则化项来限制权重的大小
- 梯度截断:设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内
3. 防止过拟合
过拟合是指模型过分拟合训练集,导致泛化能力低下的现象。常常在训练数据过少或者过度训练的情况下出现。
-
正则化:给目标函数添加L1或L2正则项。
-
数据增强:增大数据数量。
-
Dropout:在训练过程中每次按一定的概率随机地使一部分隐藏节点的激活函数设为0,让这些神经元不进行计算而失灵。
-
Early Stopping:在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。
4. 常见激活函数
激活函数在神经网络中最重要的作用是引入非线性表达能力。除此之外,在提高模型鲁棒性、缓解梯度消失问题、将特征输入映射到新的特征空间以及加速模型收敛等方面都有不同程度的改善作用。
-
Sigmoid函数:\(g(x)=\frac{1}{1+e^{-x}}\)
- 优点:将输入转换为(0, 1)的区间
- 缺点:容易出现梯度消失;函数均值不为0,参数只能同增或者同减,网络收敛速度慢。
-
Tanh函数:\(g(x)={e^x-e^{-x}\over e^x+e^{-x}}\)
- 优点:解决了Sigmoid函数均值不为0的问题
- 缺点:依然存在梯度消失问题;幂函数计算开销大
-
ReLU函数:\(g(x) = max(0,x)\)
- 优点:解决了梯度消失问题;计算速度快
- 缺点:函数均值不为0;Dead ReLU Problem:当\(x < 0\)时梯度为0,且该神经元之后的神经元梯度永远为0,即神经元失效。需要通过合理的初始化,或是降低学习率来解决
-
Leaky ReLU函数:\(g(x) = max(αx,x)\)
-
优点:在负数区域时激活,而不是失效
-
缺点:函数均值不为0;\(α\)值不好确定
-
5. 常见优化器
-
随机梯度下降(SGD)& 小批量随机梯度下降(MBGD)
最常见的优化器,从梯度下降法延伸而来。梯度下降的问题是每次都要将整个矩阵加入计算,计算速度很慢。
随机梯度下降每次从样本中随机抽出一组,训练后按梯度更新一次,计算速度很快。缺点在于容易落入局部最优,不适合并行计算。
梯度下降:\(w=w-\alpha*\sum^n_i(wx_i-y_i)*x_{i}\)
随机梯度下降:对每一个\(x_i\),\(w=w-\alpha*(wx_i-y_i)*x_{i}\)
小批量随机梯度下降每次参数更新使用一小批样本。比GD收敛速度快,比SGD更稳定,且能并行化计算。缺点是学习率难以确定。
- 共同特点:容易落入局部最优点;容易出现震荡;每个参数的学习率相同,容易出现部分特征学习不足的问题。
-
SGDM:在SGD基础上增加一阶动量,抑制SGD的震荡问题。
-
Adagrad:在SGD基础上增加二阶动量,可以对模型中的每个参数分配自适应学习率。适合处理稀疏数据。
-
RMSProp:对Adagrad进行改进,缓解Adagrad算法学习律过快的问题。
-
Adam:同时结合一阶动量和二阶动量,并加入修正值,同时具备二者的优点。