当前位置: 首页 > article >正文

关于 NLP 深度学习的核心流程

在这里插入图片描述

基本流程实现的先后顺序(每一步都包含很多技术点):

选定语言模型结构

关于语言模型:

  • 作用
    判断那一句话相对更合理,相对不合理的会得到较底的分值:
    挑选成句概率分值最高的
  • 评价指标:PPL(Perplexity) 困惑度
    • 评估一个语言模型在给定数据集上的预测效果
    • PPL 值与成句概率成反比(PPL 越小,成句概率越高)
  • 模型分类
    • SLM 统计语言模型
      ngram
    • NLM 神经语言模型(2003)
      RNN(循环神经网络)
      LSTM(RNN 进阶版)
      CNN(卷积神经网络)
      GRU
    • PLM 预训练语言模型(2018)
      • 基于 Transformer 架构
        • BERT(预训练模型)
          生成式任务是逐词预测,bert 是预测缺失的词或者句子前后关系
        • GPT
          生成式模型
        • 一系列类 bert 模型
    • LLM 大语言模型(2023)
      GhatGPT

收集标注数据

  • 样本数据
  • 预测数据

forward 正向传播

  1. 模型超参数随机初始化
  • 训练轮数:epoch_num
  • 每次训练样本个数:batch_size
  • 样本文本长度:window_size
  • 学习率:lr
  • 隐藏层:hidden_size
  • 模型层数:layer_num
  1. 构建词表
    load_vocab

  2. 构建数据集
    dataset

  3. 模型组成

    1. 离散值连续化(可选)

      • Padding(可选)
        • 将不同长度的文本补齐或截断到统一长度
        • 使得不同长度的文本可以放在同一个batch内运算
        • 补齐所使用的token需要有对应的embedding向量
      • embedding 层
        • 作用:
          • 将字符转为向量
            将离散型的输入数据(如单词、类别等)映射到连续的向量空间中
          • 核心
            将离散值转化为向量
        • 形状:[vocab_dim, hidden_size]
          hidden_size 是embedding 的下一层模型的输入形状
    2. 模型结构处理连续数据

    3. pooling 池化层
      embedding 结果要先转置后才能 pooling
      embedding.transpose(1,2)

      • 作用
        • 降低后续网络层的输入维度
        • 缩减模型大小
          -提高计算速度
        • 提高鲁棒性,防止过拟合
      • 分类
        • 平均池化
        • 最大池化
    4. 全连接层

      • 作用
        1. 将前面层提取到的特征进行组合和加权
        2. 参数可通过反向传播学习,适应不同数据和任务
        3. 提高模型的表示能力
          • 更好地捕捉数据中的复杂模式和关系
          • 通过堆叠多个全连接层,结合非线性激活函数,模型就可以学习更复杂的非线性映射
        4. 分类与回归
          • 分类任务中
            1. 将特征映射到不同类别的概率分布上
            2. 方便模型对输入进行分类
          • 回归任务中
            生成连续值的预测
      • 参数
        1. 权重(Weights)
          • 是模型中每个神经元或连接的参数
          • 权重矩阵定义了输入和输出之间的关系
        2. 偏置(Biases)
          额外参数,与权重一起用于计算激活函数的输入
    5. 激活函数(可选)
      不会改变输入内容的形状

      • 作用
        1. 引入非线性变换
          • 全连接层仅可线性变换
          • 将激活函数结果传递给下一个全连接层,可在学习复杂任务时,更好的表达数据的抽象特征
        2. 约束输出范围
        3. 提高模型的数值稳定性
      • 常用激活函数
        • Sigmoid
        • tanh
          RNN 自带一个 tanh
        • Relu
          可以防止梯度消失问题
        • Gelu
    6. Normalization 归一化层(可选)
      对输入数据进行归一化处理,使其具有零均值和单位方差,加速模型训练过程,提高模型稳定性和收敛速度

    • 代码
      from torch.nn import BatchNorm1d
      self.bn1 = BatchNorm1d(50)
    • 分类
      • 批量归一化 batch normalization
        对每一层的向量求平均,再求标准差,之后进行公式计算,获得可训练参数
        • 样本与其他样本归一化,适合 cv
        • 适合两张图片之间相似度评价
      • 层归一化 layer normalization
        纵向向量求平均,再求标准差,之后进行公式计算,获得可训练参数
        • 样本内进行归一化,适合 nlp
        • 适合文本
    1. dropout 层(可选)
      • 代码
        from torch.nn import Dropout
        self.dropout = Dropout(0.5)
      • 是一种常用的正则化技术
        • 作用
          • 减少神经网络的过拟合
          • 提高模型的泛化能力
          • 强制网络学习更加健壮和泛化的特征
          • 减少神经元之间的依赖关系
          • 使得网络更加鲁棒
        • 在训练期间
          • 随机“丢弃”一些神经元
            以一定的概率(通常在0.2到0.5之间)随机地将隐藏单元的输出置为零
          • 保持总体期望值不变
            将其余值按比例进行缩放
        • 在测试期间
          Dropout不会应用,而是将所有神经元的输出乘以保留概率,以保持输出的期望值
  4. 获取预测值

  5. 计算 loss
    是指预测值与样本真实值之间的loss计算。

    • 常见 loss 函数
      • 均方差(MSE)
        回归场景
      • 交叉熵(Cross Entropy)
        分类场景
      • BCE 0/1损失
        分类场景,一般输入为 sigmod 的输出
      • 指数损失
      • 对数损失
      • Hinge损失

backward 反向传播

  1. Optimizer 优化器
    • Adam

      • SGD 进阶版
      • 在模型的权重没有收敛之前(没有训练到预期结果之前),不断循环计算,历史每轮的梯度都参与计算。
      • 可无脑选择使用的优化器。是非常好的baseLine,一般出问题,不会因为adam 出问题。
      • 特点
        在这里插入图片描述
      • 实现
        在这里插入图片描述
        • 一阶动量
          历史 n 轮梯度差值
        • 二阶动量
          历史 n 轮梯度的平方差
        • 避免由于一阶动量与二阶动量初始值为零向量,引起参数估计偏向于 0 的问题
          • 一阶动量偏差修正
            一阶动量历史累计值/(1-超参数 t 次方)
          • 二阶动量偏差修正
            二阶动量历史累计值/(1-超参数 t 次方)
        • 权重更新
    • SGD
      计算逻辑:新权重 = 旧权重 - 学习率 * 梯度

    1. optmi->梯度归零
      optimizer.zero_grad()
    2. loss->反向传播,计算梯度
      loss.backward()
    3. optim->更新权重
      optimizer.step()

使用模型预测真实场景


http://www.kler.cn/a/313744.html

相关文章:

  • Redis - 集群(Cluster)
  • Nuxt 版本 2 和 版本 3 的区别
  • 在Java中使用ModelMapper简化Shapefile属性转JavaBean实战
  • Flink_DataStreamAPI_输出算子Sink
  • 鸿蒙自定义UI组件导出使用
  • FreeRTOS学习13——任务相关API函数
  • 虚拟现实与PD协议快充
  • thinkphp 做分布式服务+读写分离+分库分表(分区)(后续接着写)
  • 【网络安全的神秘世界】攻防环境搭建及漏洞原理学习
  • LeetCode 459.重复的子字符串
  • 计算机网络分类
  • Ubuntu 22.04 源码下载、编译
  • 经典sql题(二)求连续登录最多天数用户
  • 将编程融入日常生活:编程游戏化学习
  • 内网穿透软件有哪些?
  • 搜维尔科技:工程师已经解决OptiTrack捕捉过程中肘部不自然的弯曲
  • 十五,Spring Boot 整合连接数据库(详细配置)
  • 金仓数据库 KingbaseES参考手册-(8.函数(三))
  • 在HTML中添加图片
  • Oracle 数据库常用命令与操作指南
  • 安全装备检测系统源码分享
  • 【Python报错已解决】To update, run: python.exe -m pip install --upgrade pip
  • sqlgun靶场通关攻略
  • 代码随想录算法训练营day39
  • 【C/C++语言系列】浅拷贝和深拷贝
  • php curl发送get、post请求