首页 > 其他分享 >动手深度学习pytorch 8-章

动手深度学习pytorch 8-章

时间:2023-08-03 20:44:15浏览次数:32  
标签:梯度 模型 动手 pytorch 参数 深度 序列 GPU 文本

1.  序列模型

  a)自回归模型  对见过的数据建模

  b)马尔可夫模型

  c)因果关系

2. 单机多卡并行

  数据并行和模型并行: 数据并行,将小批量分成n块,每个GPU拿到完整参数计算,性能更好。模型并行,将模型分成n块,每个GPU拿到一块模型计算前向和方向结果,用于单GPU放不下

  小批量分到多GPU计算后,模型结果怎么合到一块:

  当一个模型的训练过程中使用了多GPU进行小批量计算后,各个GPU上的模型参数会不同步更新,所以我们需要将不同GPU上的模型参数聚合(或者说“平均”)到一起,得到全局的模型参数。这个过程称为模型参数的"平均(averaging)"或者"聚合(aggregation)"。

 常用的多GPU模型参数聚合方法有两种:

  1. 同步聚合:各GPU完成一个小批量计算后,立即将模型参数同步到其他GPU上。这种方法简单易行,但是由于频繁的通信开销,训练速度会受到较大影响。

  2. 异步聚合:各GPU独立完成一定次数的小批量计算后,再将模型参数聚合至全局。这种方法可以减少通信开销,提高训练速度,但是模型参数的异步更新也可能影响模型的收敛。一般来说,同步聚合方法更容易实现,但是异步聚合方法的训练速度会更快。两者需要在训练速度和模型性能之间进行权衡。

  具体来说,模型参数的聚合步骤主要如下:

  1. 各GPU分别完成一定数量的小批量训练,获得局部的模型参数。

  2. 使用MPI或其他通信库,收集各GPU上的局部模型参数。

  3. 计算各GPU局部模型参数的平均值,作为全局模型参数。

  4. 将全局模型参数广播回各GPU,替换其局部模型参数。

  5. 各GPU继续基于新的全局模型参数进行小批量训练。

  6. 不断重复以上步骤,直到训练结束。

在代码实现上,我们主要需要:  

  1. 使用torch.nn.DataParallel将模型分配到多GPU上。

  2. 继续正常的小批量训练流程,DataParallel会自动在各GPU上拷贝模型并分发输入。

  3. 定期使用model.module.averaging_parameters()来聚合和广播模型参数。

  4. 调用model.eval()和model.train()来切换模型状态。

所以,多GPU训练模型参数的聚合主要依靠DataParallel自动完成模型的分发和聚合,编写多GPU训练代码时主要需要在样本输入和模型参数聚合之间切换模型状态即可。

3. 解析文本常见预处理

  1. 将⽂本作为字符串加载到内存中。

  2. 将字符串拆分为词元(如单词和字符)。

  3. 建⽴⼀个词表,将拆分的词元映射到数字索引。
  4. 将⽂本转换为数字索引序列,⽅便模型操作。

4. 常⽤的词元化⽂本的⽅法。

  1. N-gram:将文本分割成N个词组成的序列。如2-gram,3-gram等。这是一种简单但有效的方法,可以捕获词与词之间的临近依赖关系。但无法效果地建模长距离依赖。

  2. Bag-of-words:将文本视为词频向量,忽略词序和语义相关性。这种方法可以高效表示文本主题,但无法表示语义。

  3. TF-IDF:在Bag-of-words的基础上,通过词频-逆文本频率权重对词进行加权,以过滤掉常见词并强调主题词。这是一种常用的文本主题表示方法。

  4. 基于窗口的方法:通过滑动窗口对词序列进行捕获,如skip-gram和CBOW模型。这类方法可以学习到词与词之间的距离依赖和语义相关性,但是无法建模长序列上下文。

  5. 基于主题的方法:使用潜在语义模型(LSA)、潜在狄利克雷分配(LDA)等对文本进行主题建模。这可以发现文本的潜在语义主题和结构,但主题数量和内容需要人工指定与解释。

  6. 神经网络方法:使用CNN、RNN和自注意力网络对文本进行表示学习。这类方法可以自动学习文本的特征表示,并建模长距离依赖和语义,是近年较为流行的文本表示方法。但是模型较为复杂,需要大量数据进行训练。 

  7. 预训练语言模型:使用BERT、GPT等预训练好的语言模型,通过微调来获得文本的表示。这是一种需要较少数据和精调的表征学习方法,可以学习到语义丰富的文本表示,但表示含义需要结合具体模型来理解。

  所以,总体来说,文本表示学习有多种方法,需要根据实际任务的要求来选择。近年,神经网络和预训练语言模型较为流行,可以学习到语义丰富的文本表示,但模型也较为复杂。词元化方法如N-gram和TF-IDF由于效果简单也仍有较广泛的应用。

5. 理解列表推导式

  eg:  tokens = [token for line in tokens for token in line]

6. 语言模型

  应用:预训练、生成文本、判断多个序列哪个更常见

  语言模型估计文本序列的联合概率

  使用统计方法时常采用n元语法

7.detach()操作原理

  它将计算图中当前节点的子图分离出来,使其不再跟踪梯度信息。这意味着处于分离节点及其子节点的变量不再受到反向传播的影响,其梯度不会被更新。

  这通常用在以下情况:1. 当你不想变量被反向传播过程更新梯度时。例如,当变量是临时变量,用于联结两个网络部分,但自身不需要优化。2. 当你想重复使用一个子图,而不让其梯度累积。例如,在循环神经网络中,在每个时间步重复使用同一个子图,这时需要在每个时间步调用.detach(),否则梯度会不停累积,最终导致梯度爆炸。3. 当你想停止梯度向后流动时。通过.detach()可以阻断梯度传播,使其不再向后流入网络。

  所以,detach的主要作用是控制梯度流和参数的更新。它可以临时阻断梯度的跟踪和更新,在需要的时候重新启用。这为许多复杂模型的构建提供了更高的灵活性,可以按需控制优化的过程。当调用.detach()后,对应节点的梯度将不再被更新,但其参数的值依然可以改变。只是这种改变不再受梯度的影响。它的值变化完全依赖于其前向传播的输入。这意味着我们可以通过.detach()临时“固定”某个节点的参数值,使其不被梯度更新,然后在需要的时候通过前向传播来更新该节点,重新启用梯度跟踪。

8. GRU

⻔控循环单元具有以下两个显著特征:
• 重置⻔有助于捕获序列中的短期依赖关系;
• 更新⻔有助于捕获序列中的⻓期依赖关系。

重置⻔打开时,⻔控循环单元包含基本循环神经⽹络;更新⻔打开时,⻔控循环单元可以跳过⼦序列。

9. 时间序列预测和字符序列预测的LSTM模型结构主要区别

1. 隐藏层数量:

- 时间序列预测:通常只使用1-2层隐藏层即可,因为时间序列的数据本质较简单,不需要过深的网络。

- 字符序列预测:通常使用3-4层甚至更多层的隐藏层,因为字符序列之间的对应关系较复杂,需要更深的网络进行建模。

2. 隐藏层宽度:

- 时间序列预测:隐藏层宽度比较小即可,一般32-128个神经元。

- 字符序列预测:为了表达字符之间的复杂关系,隐藏层宽度需要较大,常使用256-1024个神经元或更多。

3. 其他结构:

- 时间序列预测:模型结构比较简单,一般只使用LSTM层与全连接层,没有额外结构。

- 字符序列预测:除LSTM层外,常加入CNN层用于字符嵌入、注意力机制用于学习字符重要性、循环噪声或dropout用于正则化等结构。

4. 训练技巧:

- 时间序列预测:主要使用滑动窗口技巧,较少特殊训练技巧。

- 字符序列预测:常使用字符嵌入、标定类别平滑、beam search解码、ensembling等特殊训练技巧。

标签:梯度,模型,动手,pytorch,参数,深度,序列,GPU,文本
From: https://www.cnblogs.com/dwletsgo/p/17348408.html

相关文章

  • 计算二叉树的高度/深度
    计算二叉树的高度/深度默认根结点层次为1。如果为空树,高度为0;如果不是空树,树的高度就是左右子树中高度的较大者+1(+1是包含当前层次的高度)。//计算树的高度intTreeHeight(BTNode*root){ if(root==NULL) { return0; } //左右子树中的较大者+1返回 returnTreeHeight......
  • 二叉树的最小深度
    所以,如果左子树为空,右子树不为空,说明最小深度是1+右子树的深度。反之,右子树为空,左子树不为空,最小深度是1+左子树的深度。最后如果左右子树都不为空,返回左右子树深度最小值+1。1intminshendu(Node*node){2if(node==nullptr)return0;3if(node......
  • 求二叉树的最大深度
    此为有返回值的递归问题先确定终止条件(如果一个树为空树,它的高度就是0,我们直接返回0,根本不用递归)写出通式(1+max(左子树的最大深度,右子树的最大深度)规模更小的子问题),将通式写在return里面1intmaxshendu(Node*node){2if(node==nullptr)return0;3retur......
  • TabR:检索增强能否让深度学习在表格数据上超过梯度增强模型?
    这是一篇7月新发布的论文,他提出了使用自然语言处理的检索增强RetrievalAugmented技术,目的是让深度学习在表格数据上超过梯度增强模型。检索增强一直是NLP中研究的一个方向,但是引入了检索增强的表格深度学习模型在当前实现与非基于检索的模型相比几乎没有改进。所以论文作者提出......
  • 《深度管理》读书笔记1
    书籍信息参考:https://book.douban.com/subject/30258984/ 一 “赢得漂亮”意味着你能长时间地维持优秀的业绩,因为你拒绝屈服于严酷而招致压力的捷径,暂时将他人当成业绩的牺牲品。你需要让精力充沛、鼓足干劲的人们共同工作。你的策略的强大取决于你的团队在第一线的执行力,要......
  • 剑指 Offer 55 - I. 二叉树的深度
    输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树[3,9,20,null,null,15,7],3/\920/\157返回它的最大深度3。使用递归回溯/***Definitionfor......
  • 【雕爷学编程】Arduino动手做(180)---Seeeduino Lotus开发板
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • OpenCV实战:从图像处理到深度学习的全面指南
    本文深入浅出地探讨了OpenCV库在图像处理和深度学习中的应用。从基本概念和操作,到复杂的图像变换和深度学习模型的使用,文章以详尽的代码和解释,带领大家步入OpenCV的实战世界。1.OpenCV简介什么是OpenCV?OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和......
  • 1、深度学习pytroch的张量使用
    1、构建项目 2、给项目命名和指定解释器,解释器用我们的虚拟环境 3.创建包 4、创建文件 ......
  • 基于ResNet-101深度学习网络的图像目标识别算法matlab仿真
    1.算法理论概述       介绍ResNet-101的基本原理和数学模型,并解释其在图像识别中的优势。然后,我们将详细介绍如何使用深度学习框架实现ResNet-101,并在图像数据集上进行训练和测试。最后,我们将总结本文的主要内容并提出进一步的研究方向。 1.1、ResNet-101的基本原理......