关于 NLP 应用方向与深度训练的核心流程
文章目录
- 主流应用方向
- 核心流程(5步)
- 1.选定语言模型结构
- 2.收集标注数据
- 3.forward 正向传播
- 4.backward 反向传播
- 5.使用模型预测真实场景
主流应用方向
- 文本分类
- 文本匹配
- 序列标注
- 生成式任务
核心流程(5步)
基本流程实现的先后顺序(每一步都包含很多技术点):
1.选定语言模型结构
- 语言模型作用
判断那一句话相对更合理,相对不合理的会得到较底的分值,需要挑选成句概率分值最高的。 - 评价指标:PPL(Perplexity) 困惑度
- 评估一个语言模型在给定数据集上的预测效果
- PPL 值与成句概率成反比(PPL 越小,成句概率越高)
- 模型分类
- SLM 统计语言模型
ngram - NLM 神经语言模型(2003)
RNN(循环神经网络)
LSTM(RNN 进阶版)
CNN(卷积神经网络)
GRU - PLM 预训练语言模型(2018)
- 基于 Transformer 架构
- BERT(预训练模型)
生成式任务是逐词预测,bert 是预测缺失的词或者句子前后关系 - GPT
生成式模型 - 一系列类 bert 模型
- BERT(预训练模型)
- 基于 Transformer 架构
- LLM 大语言模型(2023)
GhatGPT
- SLM 统计语言模型
2.收集标注数据
- 样本数据
- 预测数据
3.forward 正向传播
- 模型超参数随机初始化
- 训练轮数:epoch_num
- 每次训练样本个数:batch_size
- 样本文本长度:window_size
- 学习率:lr
- 隐藏层:hidden_size
- 模型层数:layer_num
-
构建词表
load_vocab -
构建数据集
dataset -
模型组成
-
离散值连续化(可选)
- Padding(可选)
- 将不同长度的文本补齐或截断到统一长度
- 使得不同长度的文本可以放在同一个batch内运算
- 补齐所使用的token需要有对应的embedding向量
- embedding 层
- 作用:
- 将字符转为向量
将离散型的输入数据(如单词、类别等)映射到连续的向量空间中 - 核心
将离散值转化为向量
- 将字符转为向量
- 形状:[vocab_dim, hidden_size]
hidden_size 是embedding 的下一层模型的输入形状
- 作用:
- Padding(可选)
-
模型结构处理连续数据
-
pooling 池化层
embedding 结果要先转置后才能 pooling
embedding.transpose(1,2)
- 作用
- 降低后续网络层的输入维度
- 缩减模型大小
-提高计算速度 - 提高鲁棒性,防止过拟合
- 分类
- 平均池化
- 最大池化
- 作用
-
全连接层
- 作用
- 将前面层提取到的特征进行组合和加权
- 参数可通过反向传播学习,适应不同数据和任务
- 提高模型的表示能力
- 更好地捕捉数据中的复杂模式和关系
- 通过堆叠多个全连接层,结合非线性激活函数,模型就可以学习更复杂的非线性映射
- 分类与回归
- 分类任务中
- 将特征映射到不同类别的概率分布上
- 方便模型对输入进行分类
- 回归任务中
生成连续值的预测
- 分类任务中
- 参数
- 权重(Weights)
- 是模型中每个神经元或连接的参数
- 权重矩阵定义了输入和输出之间的关系
- 偏置(Biases)
额外参数,与权重一起用于计算激活函数的输入
- 权重(Weights)
- 作用
-
激活函数(可选)
不会改变输入内容的形状
- 作用
- 引入非线性变换
- 全连接层仅可线性变换
- 将激活函数结果传递给下一个全连接层,可在学习复杂任务时,更好的表达数据的抽象特征
- 约束输出范围
- 提高模型的数值稳定性
- 引入非线性变换
- 常用激活函数
- Sigmoid
- tanh
RNN 自带一个 tanh - Relu
可以防止梯度消失问题 - Gelu
- 作用
-
Normalization 归一化层(可选)
对输入数据进行归一化处理,使其具有零均值和单位方差,加速模型训练过程,提高模型稳定性和收敛速度
- 代码
from torch.nn import BatchNorm1d
self.bn1 = BatchNorm1d(50)
- 分类
- 批量归一化 batch normalization
对每一层的向量求平均,再求标准差,之后进行公式计算,获得可训练参数- 样本与其他样本归一化,适合 cv
- 适合两张图片之间相似度评价
- 层归一化 layer normalization
纵向向量求平均,再求标准差,之后进行公式计算,获得可训练参数- 样本内进行归一化,适合 nlp
- 适合文本
- 批量归一化 batch normalization
- dropout 层(可选)
- 代码
from torch.nn import Dropout
self.dropout = Dropout(0.5)
- 是一种常用的正则化技术
- 作用
- 减少神经网络的过拟合
- 提高模型的泛化能力
- 强制网络学习更加健壮和泛化的特征
- 减少神经元之间的依赖关系
- 使得网络更加鲁棒
- 在训练期间
- 随机“丢弃”一些神经元
以一定的概率(通常在0.2到0.5之间)随机地将隐藏单元的输出置为零 - 保持总体期望值不变
将其余值按比例进行缩放
- 随机“丢弃”一些神经元
- 在测试期间
Dropout不会应用,而是将所有神经元的输出乘以保留概率,以保持输出的期望值
- 作用
- 代码
-
-
获取预测值
-
计算 loss
是指预测值与样本真实值之间的loss计算。- 常见 loss 函数
- 均方差(MSE)
回归场景 - 交叉熵(Cross Entropy)
分类场景 - BCE 0/1损失
分类场景,一般输入为 sigmod 的输出 - 指数损失
- 对数损失
- Hinge损失
- 均方差(MSE)
- 常见 loss 函数
4.backward 反向传播
- Optimizer 优化器
-
Adam
- SGD 进阶版
- 在模型的权重没有收敛之前(没有训练到预期结果之前),不断循环计算,历史每轮的梯度都参与计算。
- 可无脑选择使用的优化器。是非常好的baseLine,一般出问题,不会因为adam 出问题。
- 特点
- 实现
- 一阶动量
历史 n 轮梯度差值 - 二阶动量
历史 n 轮梯度的平方差 - 避免由于一阶动量与二阶动量初始值为零向量,引起参数估计偏向于 0 的问题
- 一阶动量偏差修正
一阶动量历史累计值/(1-超参数 t 次方) - 二阶动量偏差修正
二阶动量历史累计值/(1-超参数 t 次方)
- 一阶动量偏差修正
- 权重更新
- 一阶动量
-
SGD
计算逻辑:新权重 = 旧权重 - 学习率 * 梯度
- optmi->梯度归零
optimizer.zero_grad() - loss->反向传播,计算梯度
loss.backward() - optim->更新权重
optimizer.step()
-
5.使用模型预测真实场景
经过前4步,得到训练好的模型,将模型投放到真实场景进行预测。