深度学习(RNN系列、CNN、 Attention系列 + 激活函数 + 损失函数 + 优化器 + BN + Transformer+Dropout)

过拟合和欠拟合

  1. 欠拟合的话,模型对训练集本身学习能力就不足,增大模型复杂度

  2. 过拟合的话, 一般体现在测试集上, 训练集效果和测试集效果差别太大,一般操作是降低模型复杂度, 增大数据集的量。。

降低模型复杂度:
(1)正则化, 损失函数中加入正则项,惩罚模型的参数,L1正则化(获得参数较稀疏,贡献不大的参数都为0),L2正则化(不稀疏,贡献不大的参数只是很小)。。 (控制模型参数大小来降低模型复杂度。。)

(2)early stopping(提前终止迭代),初始化一组较小的权值参数,迭代过程中提前终止,降低模型复杂度。。

(3)权值共享(CNN中用到的思路),也是降低模型复杂度。。

(4)Batch Normalization(BM)

(5)集成学习的思想,bagging boosting的方式,多个模型组合,弱化单个模型的异常点的影响,保留模型之间的通性,提升泛化能力。

(6)增加噪声, 数据上添加噪声,增大数据的多样性(不至于在一样数据上学的过深),在权值上添加噪声,类似于L2正则化。
(复制原有数据,加上随机噪声,原始向量特征中加上一个维度比如0,问句匹配项目也用到了这个思路,提升泛化能力)

Dropout

模型参数太多, 训练样本太少,产生过拟合。
过拟合的具体表现:在训练数据上损失函数很小, 预测准确率很高; 再测试数据上损失函数较大, 预测准确率较低。

Dropout有效缓解过拟合的发生, 并且达到正则化的效果。

作为训练神经网络的一种trick选择。 每个batch中,忽略一半的特征检测器(让一半的隐层节点值为0),明显的减少过拟合现象。减少隐层节点之间的相互作用。

换句话说,让某个神经元的激活值,以一定的概率p停止工作,可以使得模型泛化性能更强,
在这里插入图片描述
dropout为什么可以缓解过拟合:

  1. 多个不同的模型结果取平均: 每次随机的删除不同的隐层节点, 相当于训练不同的网络,减小网络参数的同时,多模型融合也可以减小过拟合。
  2. 减小神经元之间复杂的共适应关系。 每个随机删除,不再依赖节点前后关系, 相当于增加了结构风险,有点像L1\L2正则化。 提高鲁棒性。
  3. 自适应当前的网络环境。 泛化能力更强。

Transformer

也是一种很优秀的改造后的seq2seq模型。。
encoder部分: 多个sub-layer堆叠。。 Nx (编码过程可以每个时刻一起并行计算)
2个sub-layer:一个是multi-head attention 一个是feed forward(提供非线性变换。
编码层可以并行编码。。
(1)multi-head attention sub-layer: 多个self-attention, 多种不同的线性变换结果进行拼接,

(2)position-wise feed forward sub-layer:

每个sub-layer 都引入了residual connection和normalisation,
add 是残差结构, normalisation是norm结构。。
所以,每个sub-layer的计算方式为:
sub-layer-output = layerNorm( x + sub-layer(x) )

attention计算方式,点乘, softmax。。

decoder:解码需要按序列一个个解。。 要用到上一个序列的信息作为attention的query。。 输入:encoder的输出和上一个时刻的信息,解码出当前时刻的输出。。
比起encoder,多了一个masked multi-head attention。。 引入mask的attention的目的:防止数据穿越, 解码时会用到真实output数据,避免引入后面时刻的数据。。

postional-encoding:纯attention,没有序列结构,所以需要引入位置编码,学习序列位置。。为每个输入的embedding添加一个位置向量,进行融合。。
https://zhuanlan.zhihu.com/p/44121378
在这里插入图片描述

因为网络没有任何循环或者卷积,为了使用序列的顺序信息,需要位置向量。
embeddings + 位置编码,
位置编码和embeddings 有相同的维度,两者直接相加。
位置编码可以学习到,也可以固定不变。

解码层,加了一个mask操作,softmax时,不会将非法值连到attention。

优点: 纯用attention搭建的模型,训练快,在机器翻译等任务中效果很好, 是bert的基础。。

缺点:

transformer变体: universal transformer。。
Reformer:一种高效的Transformer, 降低计算复杂度。。
使用长短距离注意力模型(LSRA)的轻量级Transformer

Batch Normalization(BN, 批规范化)

https://blog.csdn.net/qq_34106574/article/details/82454471
解决深度神经网络难以训练的问题。

每次SGD的时候, mini-batch做规范化操作,使得结果(这一批数据) 均值为0, 方差为1, 数据处理,分布一致。

也属于网络中的一层,在网络的每一层都插入一个归一化层(BN层), 然后再进入网络的下一层。(它是一个可学习、有参数(γ、β)的网络层。)
在这里插入图片描述
引入了这个可学习重构参数γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布

作用:

  1. 可以以更大的初始学习率,去训练模型,会很快的收敛。

  2. 也算正则化的一种形式,不需要再去理会 dropout 、L1 L2

  3. 不需要再去专门的 局部归一化。 本身就是一个归一化网络层。

防止 梯度消失。

遇到收敛速度很慢梯度爆炸等情况,可以用BN。

激活函数

sigmoid、 tanh、 ReLU

  1. 上层节点的输出和下层节点的输入之间,具有一个函数关系,这个函数称为激活函数(或者激励函数)
  2. 线性的f(x) = x, 网络的逼近能力相当有限,
    3。 因此,要引入非线性的函数作为激励函数, 深层网络的表达能力就更加强大。
    好用的激活函数:方便求导,单调平滑,

Sigmoid:

在这里插入图片描述
在这里插入图片描述
映射到 0-1 之间。 常用于LR,以及神经网络的最后一层,曾经主流的激活函数,
缺点:1) 容易梯度消失(权重初始值在[0,1]内), 或者梯度爆炸(权重初始值在[1,+∞]),
2) 不是0-均值,(输入为正,就一直为正,不会波动。。)
3) 幂运算,计算耗时。

tanh

是0-均值。
梯度消失,幂运算的问题还在。

ReLU

ReLU = MAX (0, X)

计算速度非常快,
收敛速度快,

Leakly ReLU

f(x) = max( ax, x)

MaxOut

加入一层激活函数层,包含一个参数k,增加了k个神经元,输出激活函数的最大值。
可学习的分段线性函数。
在这里插入图片描述
MaxOut的拟合能力非常强, 可以拟合任意的凸函数。
具有ReLU的所有优点, 线性、 不饱和性。
并且没有RELU的缺点,不会神经元死亡。

损失函数

7.31更新
几个概念:
损失函数(loss function): 是定义在单个样本上的,一个样本的误差。
代价函数(cost function): 定义在整个训练集上的,所有样本误差的平均,所有损失函数的平均
目标函数(object function): 指最终需要优化的函数,经验风险 + 结构风险,或(代价函数 + 正则化项)

常用的损失函数:

0-1损失函数
在这里插入图片描述
预测错误时,损失函数为1;预测正确时,损失函数值为0. (没有考虑预测值和真实值的误差程度)

平方损失函数
在这里插入图片描述
预测值和实际值之间,差的平方。

绝对值损失函数
在这里插入图片描述
该损失函数和平方损失差不多, 只是,差距没有被平方放大。

对数损失函数
在这里插入图片描述
对数损失函数,用到了极大似然估计的思想。 概率之间同时满足需要乘法,方便计算就转化为加法,取对数。 损失函数,预测正确概率越高,损失值越小,就取负数。

Hinge loss(分类算法中的损失函数,尤其SVM)
在这里插入图片描述
y取+1 或者 -1

常用的代价函数

(1)MSE (Mean Square Error, 均方误差)
在这里插入图片描述
估计值和真值之间差的平方的期望值。 评价数据的变化程度,MSE值越小,说明预测模型描述实验数据具有更好的精确度。 常用来做回归的代价函数。

(2) RMSE(Root MSE, 均方根误差)
在这里插入图片描述
是均方误差的算术平方根,能够直观 观测预测值和实际值的离散程度。 通常作为回归算法的性能指标。

(3) 平均绝对误差(MAE, Mean Absolute Error)
在这里插入图片描述
是绝对误差的平均值,能更好的反映预测值误差的实际情况。 通常作为回归算法的性能指标。

(4)交叉熵代价损失函数(Cross Entropy)
通常用作分类问题的代价函数。

MSE + Sigmoid
用作分类损失的话,存在的两个问题: 1)sigmoid的原因,输出层。梯度更新缓慢。学习效率低。 2)计算量过大,

交叉熵损失函数: 解决输出层神经元学习缓慢的问题。

交叉熵

在这里插入图片描述
p(x): 真实的数据分布, q(x):模型预测的数据分布。
准测: 希望模型在训练数据上学到的预测数据分布和真实数据分布越相近越好,
交叉熵损失函数: 一般用来代替 均方差+sigmoid的组合。
在这里插入图片描述
在这里插入图片描述
交叉熵对参数的偏导,没有sigmoid导数,梯度下降正常,不会缓慢。
交叉熵计算比均方差计算量小点。

CNN(卷积神经网络):

DNN(全连接,对于输入节点都是同等对待,没有考虑节点与节点之间的关系,并且计算量巨大)

https://blog.csdn.net/m0_37490039/article/details/79378143
CNN: 局部感受野(local receptive field), 权值共享(shared weights), 池化(pooling)
窗口卷积操作的权值都是共享的。

使用广泛的特征提取网络。
越深(复杂,参数多),有更强的表达能力。

https://blog.csdn.net/dcrmg/article/details/79652487 (卷积计算细节)
在这里插入图片描述

在这里插入图片描述
stride:每一次滑动走的步长,
padding:在卷积之前,在原图像边缘加上一层像素,就是补0. padding=0,就是不补。

TextCNN:
https://www.cnblogs.com/bymo/p/9675654.html

VGG Net:CNN结构堆叠16-19层。
Inception: google net里面提到的概念。
https://blog.csdn.net/lanran2/article/details/79057994
ResNet: 参数比VGG Net更少, 效果更突出。残差结构,还能加速网络训练。
模型思想: 增加了直连通道,将输入信息绕道传到输出,
残差结构,避免了梯度消失。

残差结构,对输出的变化,更敏感,比重加大了,残差的思想是去掉主体部分,突出微小变化。
F(x) = F(x) + x, 每次加上原始特征,再继续学习,避免信息消失。
文字识别模型用到的,ResNet 101
在这里插入图片描述
3层瓶颈结构,降低参数的数目,第一层和第三层用于消减维度和恢复维度。中间3*3是瓶颈部分。
RNN(Recurrent Neural Networks, 循环神经网络), 主要用来处理和预测
序列数据。

全连接或者卷积网络中, 网络都是从输入到隐含层,再到输出层。 层与层之间是全连接或者部分连接, 每层之间的节点无连接。
RNN的隐藏层之间的节点是有连接的。隐藏层的输入包括输入层的输出,还包括上一时刻隐藏的输出。
在这里插入图片描述
w有两个,输入层到隐藏层的w 和 隐藏层到隐藏层的w, b只有1个。
在这里插入图片描述
RNN的问题: 序列过长,梯度消散问题。重复模块去记忆信息,只有一个简单结构。
https://www.cnblogs.com/jins-note/p/9715610.html

LSTM(Long Short Term Memory,长短时记忆网络):可以学习长期依赖信息,
重复的模块 有四个结构。
在这里插入图片描述
门结构就是:一个sigmoid(下面的符号就是sigmoid)激活函数和全连接层结构,sigmoid激活输出一个0-1之间的值,描述前面多少信息量通过这个结构。

第一步:忘记门,决定丢弃哪些信息。
在这里插入图片描述
Ct 代表了 长时记忆, ht代表了短时记忆。

GRU(Gated Recurrent Unit),
更新门 Zt, 重置门 rt
候选记忆单元 ht~, 当前记忆单元 ht 。

参数少了1/3, 不容易过拟合,效果和LSTM差不多。
在这里插入图片描述
双向RNN:
传统的循环神经网络是单向的从前往后传,有些问题会和后面状态有关,就需要双向结构。
双向RNN就是两个单向RNN的结合,在每个时刻t,输入会同时提供给这两个方向相反的RNN, 输出则是由这两个单向RNN共同决定(拼接或者求和)。
在这里插入图片描述

Attention

https://blog.csdn.net/hahajinbu/article/details/81940355

背景:
序列过长,信息处理效率低,只用最后一个时刻的信息时,信息损失较多。。
attention,可以充分利用很多时刻的信息,并且计算权重,有目标的取舍。。

普通attention: 可以发生在任意序列之间,比如decoder中每一个query,和encoder的所有。。

self-attention:只关注自身内部的信息。无视时序和序列化,每一个self-attention可以并行。。(attention is all your need。。 一个self-attention就是一个单元) 内部:每一个词之间都互相计算。。

一般用于序列任务。
给定一组向量集合values,以及一个向量query,attention机制就是根据该query计算values的加权求和的机制。 (1)计算values中每个value的权值, (2)然后加权求和。
也可以说,query的输出关注了原文的不同部分。

attention的变体

  1. 求权值 上的创新。
  2. 加权求和 上的创新。
  3. 两种结合的创新

加权求和计算方式的变体
soft attention: 三种, 还包括 global attention 动态attention, 最常见的attention,求权值,然后加权求和。(每个单词都是一个权值)要考虑每个时刻的输出h,计算量会很大。
hard attention: 权值只有1/0, 选择或者对齐为1,别的都为0.

local attention(半软半硬): 设置窗口,对窗口内的encoder计算权值, 窗口外都是0.
global attention: 全部求权值,

静态attention:全部共用一个权值。

在这里插入图片描述
更加特殊的attention:
self attention:自注意力,又称内部注意力,关注句子本身,从句子内部提取相关有用的信息。用来处理自己,从句子中提取关注信息。
在这里插入图片描述
key-value attention:

multi-head attention:
多个self-attention的结合。。。

之前只进行一次线性变换,这里进行h次,所以叫多头,把h次的结果进行拼接,再进行一次得到多头attention的结果。 允许模型在不同的表示子空间里学习。
每一次attention的结果就是一个向量,concat将每一头的向量进行拼接,得到一个完整的向量,进行wx + b的线性变换输出最终的向量结果。

multi-head self attention: 多头注意力和自注意力机制结合。
https://www.cnblogs.com/rosyYY/p/10115424.html
在这里插入图片描述
传统Encoder-Decoder框架:把encoder的最后一个状态作为decoder的输入(可能作为初始化,也可能作为每一时刻的输入),encoder的state有限,存储不了太多信息,并且decoder的每一步骤只和这个state有关,与之前的输入都没关系。 attention机制,根据时刻不同,每一时刻的输入也不同。

Transformer: 优化Encoder-Decoder结构,加入三个attention。

优化器 Optimizer

不管是机器学习,还是深度学习,都会要用到优化器(也可以叫优化算法),去寻找模型的最优解。

神经网络中常用的几种优化器

https://blog.csdn.net/weixin_40170902/article/details/80092628

1)梯度下降法(GD,Gradient Descent): 最基本的方法,分为三种:标准梯度下降(GD), 随机梯度下降(Stochastic GD), 批量梯度下降法(Batch GD)
在这里插入图片描述
从公式看,沿着梯度的方向,不断减小模型参数,最小化代价函数。(策略理解:每一步的参考,当前位置最陡的方向(梯度),从而迈出下一步)
缺点:训练速度慢, 每走一步都要计算调整下一步的方向,数据集较大时,没输入一个样本都要更新一次参数,每次迭代都要遍历所有样本。训练及其缓慢。花费很长时间才能收敛。
**容易陷入局部最优解:**因为视野有限,如果遇到平坦的洼地,会误以为到达最低点,不再继续往下走,就陷入局部最优,不再继续更新。

2)批量梯度下降法(Batch GD)
批量训练样本总数为n,模型参数更新与全部输入样本的代价函数和(批量或全局误差)有关, 批量输入的调整,而不是每一个样本输入都调整。大大加快了训练速度。
选择
总体平均梯度最小的方向
进行梯度下降。
优点:比起GD,训练速度大大加快,每次下降方向都很正确。
在这里插入图片描述
3)随机梯度下降法(SGD)
在这里插入图片描述
在这里插入图片描述
is是随机选择的一个样本,gt是根据这个随机样本计算的一个随机选择的梯度方向,

评价: SGD是一个盲人下山,梯度计算要求不高(计算很快),不管怎么走,都能到达终点,都会收敛。
训练速度快,对于大型数据集,随机取几百个数据点,计算梯度更新模型参数,不用遍历全部,。
随机选择梯度时,会
引入噪声,梯度方向不一定正确,

还是没能克服局部最优。

动量优化算法

2种方法, 标准动量法, 牛顿动量法。
提升训练速度, 保证收敛。

自适应学习率优化算法

学习率对模型学习很重要,自适应更新学习率。提高训练速度。

AdaGrad算法,RMSProp算法,Adam算法以及AdaDelta算法。
1)AdaGrad
独立地适应所有模型参数的学习率,缩放每个参数反比于其所有梯度历史平均值总和的平方根。
历史代价梯度大的,学习率会变小; 反之,学习率会变大。
在这里插入图片描述
适合数据分布不平衡,比较稀疏的数据集。
评价: 可以自动调节学习率,但是,多次迭代学习率会趋近于0,

2)RMSProp
在AdaGrad基础上修改,梯度积累。 修改为:指数加权的移动平均。 取了平均,所以**避免学习率越来越低,**并且能自适应调节学习率。
在这里插入图片描述
RMSProp 目前已经是有效、实用的深度神经网络优化算法, 从业者常用的优化算法之一。

以上两种优化算法,都需要制定全局学习率。

3)AdaDelta
在这里插入图片描述
结合两种算法, 每次参数更新的步长,
不需要设置一个默认的全局学习率。
在模型初期和中期,AdaDelta表现很好,加速效果不错,训练速度快。 后期的时候,模型会反复在局部最小值附近抖动。

4)Adam
在这里插入图片描述
m、v分别是一阶动量项和二阶动量项, 还有各自的修正值,

Adam被认为对超参数的选择相当鲁棒,也需要设置初始学习率。

优化器选择:
具有自适应学习率的优化器表现很鲁棒。

流行的,SGD, 具有动量的SGD, RMSProp, 具有动量的Adam、 AdaDelta。

  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值