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