1.softmax Դ?码讲뽲??
2.如何理解深度学习源码里经常出现的logits?
3.[fastllm]cuda-kernels源码解析
4.(论文加源码)基于deap的四分类脑电情绪识别(一维CNN+LSTM和一维CNN+GRU
5.GroupSoftmax:利用COCO和CCTSDB训练83类检测器
6.(论文加源码)基于连续卷积神经网络(CNN)(SVM)(MLP)提取脑电微分熵特征的DEAP脑电情绪识别
softmax Դ?뽲??
源码解读系列将深入探讨Megatron的预训练部分代码,聚焦于模型并行策略。码讲在上一篇文章中,码讲我们详细介绍了如何在分布式环境中初始化模型,码讲包括按照DP/TP/PP对进程进行分组,码讲并为每个进程分配GPU。码讲closest源码接下来,码讲我们将探索如何将模型进行切分,码讲并将其整合到分布式环境定义好的码讲DP/TP/PP组中。
在Megatron中,码讲通过预先设定的码讲DP/TP/PP组,我们能够将模型进行有效的码讲切割。这种切割方法既考虑了模型的码讲并行性,又兼顾了内存和计算资源的码讲优化。为了实现这一目标,码讲我们需要在CPU上定义并初始化模型,然后将其搬运到当前进程所对应的GPU上。
模型切割的核心思想是面向进程编程,这意味着我们的脚本处理的是发生在单个进程上的任务。这样做的好处是,我们只需维护一份脚本,然后将其部署到不同机器的GPU上执行,从而实现全局并行计算。然而,每个进程处理的模型部分不同,比如在GPT模型中,预处理层涉及词嵌入计算,而后续层则涉及到softmax和损失函数的计算。为了解决模型差异性问题,我们可以通过进程ID来控制随机种子的设定,确保模型初始化的一致性。
在分布式训练中,随机种子的设定至关重要,它直接影响到模型的复现性。例如,当我们采用激活检查点技术来节省内存时,在反向传播过程中需要重新计算前向传播得到的激活值,此时就需要确保模型能够完全复现前向过程的初始化结果。通过设定不同的随机种子,我们能够确保每个模型部分在切割后仍能保持初始化的搜索图片的源码独立性和一致性。
在模型切割部分,我们有两种主要的初始化方式:先进行整体初始化再进行切割(称为“CPU上的初始化”),以及直接在GPU上进行局部初始化(称为“在GPU上的初始化”)。这两种方式的核心区别在于随机种子的设定策略。正确选择随机种子的策略,对于确保模型的复现性至关重要。
模型并行框架在Megatron中通过预定义的函数实现,例如在megatron/training.py中的pretrain函数。这个函数作为模型并行的入口,主要包含了模型架构定义、模型切割、设置优化器和学习率调整等关键步骤。在具体实现中,模型切割主要通过定义预处理层(pre_process)和后处理层(post_process)来完成,这有助于确保模型切割后首尾层和中间层的架构一致性。
在分布式模型中,如CodeGeeX,模型的切割遵循特定的策略,以确保模型在不同GPU上的并行执行。每个进程对应模型的一部分,通过AllReduce操作确保模型输出的完整性,以便下一层能够接收正确的输入。同时,每个进程负责独立计算模型的一部分,从而实现高效的并行处理。
在Megatron中,模型切割部分涉及到一系列的类定义和函数实现,包括MegatronModule、Embedding、VocabParallelEmbedding、ParallelSelfAttention等。这些类和函数在模型切割、并行层和交叉熵计算等方面发挥着关键作用。例如,MegatronModule类确保了模型的输入和输出层共用词嵌入,以满足特定的并行要求。同时,模型中的注意力层(如ParallelSelfAttention)通过“列切割”和“行切割”策略实现高效的并行计算。
模型的智力游戏html源码最后一层,即交叉熵的计算,同样通过类定义实现。在Megatron中,交叉熵计算通过平行化处理来优化内存使用和加速计算。通过将计算逻辑进行精简和优化,Megatron能够实现高效的并行交叉熵计算,以满足大规模模型训练的需求。
总之,Megatron的模型并行策略通过一系列的代码实现,旨在优化大规模模型的训练过程,提高计算效率和资源利用。通过合理地切割模型、设置随机种子、实现并行层和交叉熵计算,Megatron能够在分布式环境中实现高效、稳定的模型训练。
如何理解深度学习源码里经常出现的logits?
深度学习的秘钥:揭示logits的真面目
在深度学习的源码世界中,logits一词频繁出现,它似乎隐藏着某种魔力。那么,logits究竟是什么?它与我们熟知的概率计算有何关联?让我们一探究竟,揭示这个术语背后的深层含义。(p - 李航《统计学习方法》)
首先,logits是概率学中的一个重要概念,它并非简单的对数,而是事件发生与不发生比值的对数形式。想象一下,当某个事件发生的概率为p时,其logits可以这样表示:\[ \text{ logits} = \log\left(\frac{ p}{ 1-p}\right) \](p - TensorFlow官方文档)
当我们将logits与深度学习中的softmax层联系起来,你会发现它们之间的紧密关系。softmax层的作用是将一组未归一化的数值(即logits)转换为一个概率分布,确保所有概率值之和为1。在TensorFlow中,我们通常称这些未经过归一化的数值为logits,而不是它们的数学定义。
实际上,logits在深度学习模型中扮演着未加工的概率值角色,它们是概率分布的起点。softmax层通过对logits进行加和运算,appcan如何导入源码将其转变为一个清晰、可解释的概率矩阵。理解这一点至关重要,因为logits的计算结果直接影响着模型的决策过程和最终预测。
总结来说,logits在深度学习中是未归一化的概率表示,它们是softmax函数运算的起点,是模型输出概率分布的基础。掌握这个概念,就能更好地解析和解读源码中的logits,从而深入理解模型的工作原理。(p - TensorFlow官方教程)
[fastllm]cuda-kernels源码解析
在fastllm中,CUDA-kernels的使用是关键优化点之一,主要涉及以下几个高频率使用的kernel:gemv_int4、gemv_int8、gemm_int8、RMSNorm、softmax、RotatePosition2D、swiglu等。其中,gemm是计算密集型的,而其余大部分都是内存受限型。利用量化bit进行计算,比原始的torch转为浮点数更快,同时,没有进行融合操作,为后续优化留下了空间。
gemv_int4 kernel:主要用于实现float*int4的GEMV乘积,其中偏置值设定为最小值。在计算中,矩阵被划分为不同的tile,不同tile之间并行操作。在遍历m/2的过程中,找到对应int4值的位置,通过保存的mins找到最小值minv。同一组的两个int4值共享同一个minv,计算结果的最终和被保存在sdata[0]上,用于更新对应m列位置的开源区块链源码output值。结果向量为n*1。
gemv_int8 kernel:在功能上与gemv_int4类似,但偏置值由保存的minv变为了zeros。
gemm_int8 kernel:此kernel负责计算n*m矩阵与m*k矩阵的乘积。计算过程涉及多个tile并行,block内部保存的是部分和。考虑到线程数量限制,通常会有优化空间。最终结果通过为单位进行更新。
layerNorm实现:此kernel实现layernorm计算,通过计算均值和方差来调整数据分布。计算中,sdata存储所有和,sdata2存储平方和。每个block内计算部分和后,规约得到全局的均值和方差,从而更新output。
RMS kernels解析:RMSNorm kernel实现RMS归一化,通过计算输入的平方和和均值,进而更新output。
softmax kernels解析:计算输入的softmax值,涉及最大值查找、指数计算和规约求和等步骤,以防止浮点数下溢。
RotatePosition2D Kernels解析:用于旋转位置编码,线程展开成三层循环。LlamaRotatePosition2D、NearlyRotatePosition和RotatePosition2D在旋转方式上有所区别,体现在不同的位置上进行计算。
AttentionMask Kernels解析:对输入按照mask掩码置值,普通mask直接置为maskv,而Alibimask则是置为相对位置的值之和。具体含义可能涉及空间上的概念,但文中未详细说明。
swiglu kernels解析:作为激活函数,这些kernel在原地操作中执行常见函数,线程足够使用,直接按照公式计算即可。
综上所述,fastllm中CUDA-kernels的使用旨在通过优化计算过程和内存操作,提升模型的计算效率,实现更高效的推理和训练。
(论文加源码)基于deap的四分类脑电情绪识别(一维CNN+LSTM和一维CNN+GRU
研究介绍
本文旨在探讨脑电情绪分类方法,并提出使用一维卷积神经网络(CNN-1D)与循环神经网络(RNN)的组合模型,具体实现为GRU和LSTM,解决四分类问题。所用数据集为DEAP,实验结果显示两种模型在分类准确性上表现良好,1DCNN-GRU为.3%,1DCNN-LSTM为.8%。
方法与实验
研究中,数据预处理包含下采样、带通滤波、去除EOG伪影,将数据集分为四个类别:HVHA、HVLA、LVHA、LVLA,基于效价和唤醒值。选取个通道进行处理,提高训练精度,减少验证损失。数据预处理包括z分数标准化与最小-最大缩放,以防止过拟合,提高精度。实验使用名受试者的所有预处理DEAP数据集,以::比例划分训练、验证与测试集。
模型结构
采用1D-CNN与GRU或LSTM的混合模型。1D-CNN包括卷积层、最大池层、GRU或LSTM层、展平层、密集层,最终为4个单元的密集层,激活函数为softmax。训练参数分别为.和.。实验结果展示两种模型的准确性和损失值,1DCNN-LSTM模型表现更优。
实验结果与分析
实验结果显示1DCNN-LSTM模型在训练、验证和测试集上的准确率分别为.8%、.9%、.9%,损失分别为6.7%、0.1%、0.1%,显著优于1DCNN-GRU模型。混淆矩阵显示预测值与实际值差异小,F1分数和召回值表明模型质量高。
结论与未来工作
本文提出了一种结合1D-CNN与GRU或LSTM的模型,用于在DEAP数据集上的情绪分类任务。两种模型均能高效地识别四种情绪状态,1DCNN-LSTM表现更优。模型的优点在于简单性,无需大量信号预处理。未来工作将包括在其他数据集上的进一步评估,提高模型鲁棒性,以及实施k-折叠交叉验证以更准确估计性能。
GroupSoftmax:利用COCO和CCTSDB训练类检测器
在CV领域,工程师常利用YOLO、Faster RCNN、CenterNet等检测算法处理业务数据,旨在优化模型性能。然而,当模型在实际业务中发挥作用时,CEO的质疑往往紧随而来。为解决这一问题,我们设计了GroupSoftmax交叉熵损失函数,以解决模型训练的三大挑战。该函数允许类别合并,形成新的组合类别,从而在训练时计算出各类别对应梯度,完成网络权重更新。理论上,GroupSoftmax交叉熵损失函数兼容多种数据集联合训练。
我们利用了COCO和CCTSDB数据集,基于Faster RCNN算法(SyncBN),联合训练了一个包含类的检测器。在COCO_minival测试集上,使用GroupSoftmax交叉熵损失函数训练的模型在mAP指标上提升了0.7个点,达到.3,相比原始Softmax交叉熵损失函数,性能显著提升。此外,我们还训练了一个trident*模型,6个epoch在COCO_minival测试集上的mAP为.0,充分验证了GroupSoftmax交叉熵损失函数的有效性。
基于SimpleDet检测框架,我们实现了mxnet版本的GroupSoftmax交叉熵损失函数,并在GitHub上开源了源码。GroupSoftmax交叉熵损失函数的原理在于允许类别合并形成群组,计算群组类别概率的交叉熵损失,进而对激活值进行梯度计算。具体而言,当目标类别属于某个群组类别时,其梯度为群组类别梯度与子类别预测概率的比值。这样,GroupSoftmax交叉熵损失函数在处理类别合并情况时,能够有效更新网络权重。
实现GroupSoftmax交叉熵损失函数时,需要注意以下几点:
1. 对于未标注类别的数据集,可理解为与背景组成新的群组类别。
2. 在两阶段检测算法中,RPN网络应根据数据集特性调整为多分类,以适应模型训练需求。
3. 联合训练COCO和CCTSDB数据集时,最终分类任务为1+类,未标注类别的数据集可与背景组成组合类别。
4. 编写CUDA代码时,计算群组类别概率时,需加微小量避免分母为0导致的计算错误。
(论文加源码)基于连续卷积神经网络(CNN)(SVM)(MLP)提取脑电微分熵特征的DEAP脑电情绪识别
在本文中,我们采用连续卷积神经网络(CNN)对DEAP数据集进行脑电情绪识别。主要内容是将脑电信号在频域分段后提取其微分熵特征,构建三维脑电特征输入到CNN中。实验结果表明,该方法在情感识别任务上取得了.%的准确率。
首先,我们采用5种频率带对脑电信号进行特化处理,然后将其转换为**的格式。接着,我们提取了每个脑电分段的微分熵特征,并对其进行了归一化处理,将数据转换为*N*4*的格式。在这一过程中,我们利用了国际-系统,将一维的DE特征变换为二维平面,再将其堆叠成三维特征输入。
在构建连续卷积神经网络(CNN)模型时,我们使用了一个包含四个卷积层的网络,每个卷积层后面都添加了一个具有退出操作的全连接层用于特征融合,并在最后使用了softmax层进行分类预测。模型设计时考虑了零填充以防止立方体边缘信息丢失。实验结果表明,这种方法在情感识别任务上表现良好,准确率为.%。
为了对比,我们还编写了支持向量机(SVM)和多层感知器(MLP)的代码,结果分别为.%和.%的准确率。实验结果表明,连续卷积神经网络模型在DEAP数据集上表现最好。
总的来说,通过结合不同频率带的信号特征,同时保持通道间的空间信息,我们的三维脑电特征提取方法在连续卷积神经网络模型上的实验结果显示出高效性。与其他相关方法相比,该方法在唤醒和价分类任务上的平均准确率分别达到了.%和.%,取得了最佳效果。
完整代码和论文资源可以在此获取。
Gumbel-Softmax的MindSpore实现
在一段时间的间隔后,我将注意力转向了MindSpore的相关内容。起因是一位同学询问关于模型迁移的问题,目标是诺亚的一篇ICML论文《SparseBERT: Rethinking the Importance Analysis in Self-attention》中使用了Pytorch特有的Gumbel-Softmax实现,但该实现难以直接移植到MindSpore。因此,我针对这个问题进行了深入研究,并撰写了一篇关于如何在MindSpore中实现Gumbel-Softmax的文章。
Gumbel-Softmax是一种离散采样的可微近似方法,常用于生成模型中,如GAN和VAE,它解决了离散分布采样不可微的问题。具体来说,它通过Gumbel-Max trick和softmax函数构建了一个连续分布,近似离散类别分布,允许反向传播。Gumbel分布通过从均匀分布中随机抽取并计算得出,而Softmax则用于近似argmax操作。
在MindSpore的实现中,我参考了Pytorch的源码和Tensorflow的手写实现,对三个关键点进行了适配,并通过单元测试验证了正确性。测试包括输出的one-hot特性、采样值分布以及与softmax概率的一致性。最终,我用MindSpore实现的Gumbel-Softmax应用于VAE实验,结果与Pytorch版本的Loss下降趋势基本一致,展示了其在实际应用中的可行性。
尽管这篇文章拖延了很长时间,但为了满足对Gumbel-Softmax需求的开发者,我会将其添加到MindSpore的主要仓库中,供更多人使用和开发。如果你对这个功能感兴趣,可以下载代码进行训练对比,或尝试将其应用到其他GAN网络中。