优化器
Adam
- 实现简单,计算高效,对内存需求少
- 超参数具有很好的解释性,且通常无需调整或仅需很少的微调
- 更新的步长能够被限制在大致的范围内(初始学习率)
- 能够表现出自动调整学习率
- 很适合应用于大规模的数据及参数的场景
- 适用于不稳定目标函数
- 适用于梯度稀疏或梯度存在很大噪声的问题
网络模型
RNN 循环神经网络
主要思想:将整个序列划分成多个时间步,将每个时间步的信息依次输入模型,同时将模型输出的结果传给下一个时间步 公式:
本质:两个线性层加和,再过一个tanh激活函数
import torch.nn as nn
output, h = nn.RNN(input_size, hidden_size, bias=False, batch_first=True)
- input_size: 输入维度(输入的x的向量维度)
- hidden_size: 隐单元个数(相当于上图中h的维度)
- bias: 是否有公式中的b(偏移)
- batch_first: 一般过RNN之前会先过Embedding层,而Embedding层输出是batch_size * sentence_length * embedding_dimention,当batch_first为True时,默认第一维是batch_size,batch_size一般是指几个,比如3 * 2 * 8,就是3个2行8列的矩阵
输出
- output:每一个时间步的输出
- h:最后一个时间步的输出(可用来代替pooling池化层)
归一化层 Normalization
归一化的目的【来源:文心一言】:
- 数据标准化:归一化是一种将数据转换到统一范围或尺度的方法,这有助于消除不同特征之间的尺度差异。在NLP中,文本数据通常包含各种形式的特征,如词频、TF-IDF值、词嵌入等,这些特征的尺度可能差异很大。归一化可以确保这些特征在模型中具有相似的权重,从而提高模型的稳定性和性能。
- 提高模型收敛速度:归一化后的数据具有更一致的分布,这有助于优化算法更快地找到最优解。在训练NLP模型时,归一化可以加速模型的收敛过程,减少训练时间。
- 防止梯度消失或爆炸:在某些深度神经网络中,特别是在使用激活函数(如ReLU)时,未归一化的输入可能导致梯度消失或爆炸问题。归一化可以帮助缓解这些问题,使模型训练更加稳定。
- 提高模型泛化能力:归一化有助于减少模型对特定数据分布的依赖,从而提高模型的泛化能力。这意味着模型在处理未见过的数据时表现会更好。
- 方便特征比较:归一化后的特征值更容易进行比较和解释。这对于理解模型如何处理不同的文本特征以及调整模型参数非常有帮助
batch normalization
不同样本的第1...n位置值求平均
一般应用于图像任务
layer normalization
同一个样本内的值求平均
一般应用在NLP任务
Dropout层
作用:减少过拟合 原理:按照指定概率,随机丢弃一些神经元(将其设置为0),其余元素乘以1/(1-p)进行放大
相当于只看到问题的一部分,就要求模型可以预测出正确值,对模型提出了更高的要求,减少过拟合(只要看到了某些样本就固定预测出某个结果),增加模型的泛化性