- 博客(138)
- 收藏
- 关注
原创 reward model
也就是将IXC-2.5最后一层的MLP去掉,换成score head,对于reward model,输入就是prompt和response,输出就是score;关于PPO的部分,尊重的是传统的PPO的做法,唯一让人不解的是:这里不同于游戏,不需要很多step才得到最终奖励,为什么还需要训练critic model,以及采样数据可以边训练边采样也很方便,为什么还要用一个专门的actor去采样?1.用这个reward model,采用PPO的RL训练了IXC-2.5-Chat,用户体验明显提升;
2025-02-17 15:11:21
555
原创 RL--2
强化学习当中最难的两个点是:2.agent的行为会影响到之后看到的东西,所以agent要学会探索世界;关于强化学习的不同类型,可以分为以下三种:一种是policy based:可以理解为它是去学习一个很强的actor,由actor去指导下一步的行动;一种是value-based:学习一个好的critic,这个critic其实就是价值函数,由价值函数去指导做下一步的行动;还有一种是当下最流行的二者结合的方法叫actor+critic,也是PPO 用的方法;
2025-02-17 00:03:38
893
原创 RL基础概念
我们的policy是根据价值函数获得的,这里要注意的是,policy并不等价于采取价值最大化的行动;这里可以举个老虎机的例子,比如两个老虎机,一个均值100,一个均值500,一开始我在均值100的老虎机1得到了90的奖励,在均值500的老虎机2得到了10块的奖励,那我后面就一直采取老虎机1玩么?不同的环境有不同的行为空间,有些环境中动作是离散的,而对于真实物理环境的robot,动作是连续的,动作空间是否连续对于RL算法有着深远的影响;首先reward依赖于当前的状态,当前的行动和下一时刻的状态;
2025-02-13 17:03:59
308
原创 大模型训练中如何找到内存泄漏
2.如果我们某个Tensor在计算图中的前向计算,但是没有参与反向更新参数,可能会导致内存泄漏,因为pytorch的内存管理机制是反向传播后释放计算图中的Tensor;前者代表正在使用的内存,后者代表使用的内存峰值,如果两个iter之间的比值是个固定值,代表该句以上没有内存泄漏,如果不稳定,则代表有内存泄漏;就是从训练起始的地方打印torch.cuda.memory_allocated()/torch.cuda.max_memory_allocated()的比值,
2025-01-14 20:55:25
365
原创 daily paper 12/05
1.25%的LLM tokens是有效的,其他的都是没太大用处;3.减少text token或者image token放在早期的layers来做会影响精度,也就意味着减少image token放在后面的layers来做可以保持住精度,因为LLM前几层主要在cross image和text,后面几层主要focas在text token的优化上。也是减少tokens数目的剪枝,是通过对于image tokens的Linear+softmax(可学习)得到重要性排序;用蒸馏的方法压缩VLM;
2024-12-05 16:53:23
193
原创 minicpm-v
从以上这张图来看,达到gpt4v性能所需的模型体量越来越小;(还是模型越大性能越好);minicpm-2.5的优势主要在于:1.在opencompass上的评分性能优于gpt4v;2可在端侧部署;3.强大的ocr能力;4.支持30多种语言;
2024-10-10 16:29:45
724
1
原创 python不用ide也能进行调试
使用 import pdb 和 pdb.set_trace() 是一种有效的调试方法,可以帮助你深入检查代码的执行过程和状态。import pdb 和 pdb.set_trace() 是 Python 中用于调试代码的工具。调用 pdb.set_trace() 后,程序的执行会暂停,允许你检查当前的变量状态、调用栈等信息。pdb.set_trace() 是一个函数调用,当程序执行到这一行时,会触发调试器进入交互模式。通过 import pdb 语句,你可以引入这个模块,从而使用其提供的调试功能。
2024-10-09 10:46:50
750
原创 pytorch--流水线并行
为了构建PipelineStage,需要提供包含了nn.Parameters and nn.Buffers的nn.Module,同时定义了能够执行对应stage的forward函数。流水线并行(pipelining )部署实施起来非常困难,因为这需要根据模型的weights把模型分块(通常涉及到对源码的修改),此外,分布式的调度和数据流的依赖也是要考虑的点;PipelineStage需要知道输入输出的shape大小,方便创建通信缓存,shapes必须是固定大小的,也就是训练执行的时候它不能是变化的;
2024-09-20 17:33:34
1020
原创 multimodel ocr dataset
再finetune阶段是混合的策略,对于需要高分辨率的任务,比如说图表,就采用的分辨率HD55,,有一些是origin_size。当固定token数目的时候,是否使用换行符\n影响不大,但是tokens数目非常动态的时候,不使用换行符会导致性能降低;在其他任务上,提升分辨率带来的收益比较小,但是对于ocr任务而言,提升分辨率带来的收益比较大;然后为了保留图片的2D信息,每一行结束的时候有个\n的分隔符,不同view之间有个sp分割符。blip3训练的时候没有带上框,论文里面说可以训练下带上框的潜力;
2024-08-19 16:03:28
907
原创 NLP大模型的训练
接下来会在特定任务上进行finetune==>supervised finetuning (SFT)这里列举两种:MLM和NSP,NSP由于在某些论文中被证明是无效的,所以用的少;1.先进行通用任务的训练;无监督的样本是无穷无尽的;
2024-04-22 10:44:14
505
原创 代码规范工具
然后可以在pre-commit的config里面配置需要的代码规范;这样子代码检查的规范的执行就会注册在git的hook当中。有些规范不会帮你修改,只会报错,比如flake8;然后可以在代码仓里面配置pre-commit。commit的时候会触发hook帮你检查;有些规范可以帮你修改,
2024-03-15 15:21:31
786
原创 关于- bounding box reparameterization
因为detr以及大部分detr的变体都是将box的x,y,w,h映射到[0~1]之间;这样对于小目标的检测的话就会比较困难,因为损失被大目标主导了,
2024-03-13 09:52:06
454
原创 Group DETR
所以groupDETR提出的方法是在训练的时候用多组query,每组内仍然保持一对一匹配,推理的时候只用任意一组query就可以不用NMS了;1.如果增加query的数量,是可以提升检测性能的,但是计算开销也会增大,原因在于query个数越多,越容易命中目标;2.如果改成一对多的匹配,比如把一个gt匹配上2个positive box,可以加速收敛,提升一点性能;groupDETR要解决的问题是:既能够一对多的匹配,又能够不用NMS,节约计算开销;但是会导致使用的时候需要用到NMS;
2024-02-22 16:14:28
543
原创 mmdetection及mmengine源码结构
mmdet的注册机机制是基于装饰器实现的,Register这个类中有一个装饰器函数register_module(),通过这个装饰器函数可以把类/函数装入到Register这个类的成员变量_module_dict中,_module_dict的目的是维护每个注册器中的类和函数到字符串的映射;个人感觉跟C++中的虚函数的概念和目的是有区别的,虚函数的目的是相同的函数名,不同的对象会调用不同的虚函数实现;然后我们就可以把需要的函数/类注册到对应的register的_module_dict里面;
2023-10-17 15:15:33
646
原创 transformer比CNN好在哪里
1.Dynamic比static好:transformer的参数是随着输入变化的,不像CNN是fixed住的;动态参数提取特征的能力会更强,所以很多CNN也在朝Dynamic的方向发展,比如Dynamic cov,Dynamic relu;2.attention机制更关注不同feature之间的相对关系,对于绝对的value值并不敏感(对于形变和噪声不敏感),所以相对于CNN具有更好的普适性;而CNN更关注对于局部的描述(类似于传统算法中的特征点提取);(在此过程中也会损失掉分辨率);
2023-07-10 14:56:47
1185
原创 Tensor core原理
Tensor core是nvidia底层执行运算的硬件单元,不同于nvidia以往的cuda core(全浮点型),Tensor core是近几年推出来的、混合精度的、将累加和累乘放在一起的计算硬件;混合精度指的是在输入、输出的时候使用FP16,计算的时候使用FP32;在GPU编程中,"kernel"一词有特定的含义,与计算机操作系统中的内核不同。在GPU编程中,"kernel"是指在并行计算中由多个线程同时执行的函数。它是在GPU上执行的并行计算任务的入口点。
2023-06-28 14:33:44
8809
3
原创 swin-transformer在Jeston Nx部署
1.arm\x86-64的区别指令集不一样2.arm架构上的conda要安装miniforge3.arm上的ubuntu的软件管理器是pacman,这个安装起来也有点麻烦,因为这个库有一些前置依赖库pkg-config;4.如果dockerfile里面的CMD和entrypoint什么都没写的,直接docker run起来的容器会很快退出,而且没有log,如果要在容器中停留比较久的话需要-it进入交互式界面;6.cmake。
2023-06-27 11:17:35
618
3
原创 关于深度学习训练的工程技巧
符号位表示数的正负,指数位用于表示数的指数部分,尾数位用于表示数的尾数部分。线性层和卷积层,本质上都是线性操作,卷积层相当于共享参数的线性操作,但是self-attention是高阶的非线性操作,ResNet是由齐次运算堆叠而成,关注局部区域,而transformer是由非齐次运算堆叠而成,关注更大区域和更高的语义,齐次和非齐次运算的雅可比矩阵有非常不同的特性,会导致不同的优化难度;雅可比矩阵的连乘可以得到对某个参数的导数,根据该导数可以对该参数进行更新,关于具体的更新方式,不同的优化器有不同的方式;
2023-06-20 19:19:02
837
原创 视觉目标检测及分割任务中使用解耦头的好处
什么是解耦头?在做实例分割时,我们需要输出分类置信度图和实例mask图;在做目标检测时,我们需要输出目标的分类和边框位置;所以,这两类任务都需要输出分类和位置!采用两个不同的头解耦输出分类和位置,称为decoupled;其中目标检测的解耦头如下图所示:solov2的解耦头如下图所示:为什么要用到解耦头?因为分类和定位的关注点不同!分类更关注目标的纹理内容!定位更关注目标的边缘信息!如上图所示分类更关注中心的内容区域,而边框回归更关注边缘信息!有实验表明使用解耦头之后目标检测任务
2022-02-07 22:35:16
8167
原创 两个不规则的box求取IOU-python
第一步:构造该框以四条线段表示该框,构造一个二进制的mask因为框里的像素只需满足四个公式,在L4的下面,在L2的上面,在L1的左边,在L3的右边第二步:相与和相或两框的mask相与求交集,相或求交集,载相除得到iouimport osimport numpy as npdef get_k(x1,y1,x2,y2,x3,y3,x4,y4): k1=(y2-y1)/(x2-x1) k2=(y3-y2)/(x3-x2) k3=(y4-y3)/(x4-x3) k4=.
2022-01-26 23:15:30
3744
原创 PSPNet--语义分割网络
简介作者认为不同像素之间的语义信息是有关联的,比如车不可能在水里;所以利用全局像素的语义对单个像素的语义进行调整是有必要的;也就是要用到attention机制;PSPNet的attention是通过不同尺度的pooling+upsample+contact实现的;网络结构这篇文章讲述了具体的细节以及实验结果:https://zhuanlan.zhihu.com/p/97706803...
2022-01-17 16:25:47
912
原创 本质矩阵 基础矩阵 单应性矩阵
单应性矩阵表示同一个平面在不同相机的图像坐标系下的变换;三个矩阵之间的关系单应性矩阵虽然跟本质矩阵同为点在像素坐标系下的变换,但是单应性是中的点是共面的;本质矩阵与基础矩阵如下图所示:其中E为本质矩阵,KKK及K′K^{'}K′是两个相机的内参,F为基础矩阵,我们可以这么理解:本质矩阵是一个三维点在相机坐标系下的变换,A相机坐标系下的三维点经过内参的转置变换可以其在A相机图像坐标系的位置,经过基本矩阵获得其在B相机图像坐标系的位置,再经过B的内参,获得其在B相机坐标系下的位置;...
2021-12-14 17:14:44
3082
原创 P3P求解相机姿态原理介绍
简介首先,PnP算法是利用相机内参、瞄点在图像坐标系以及对应世界坐标系下的位置 ,求取相机在真实坐标系下姿态的问题 ;其本质上是求解相机坐标系到世界坐标系的变换;p3p利用三个点对,余弦定理来求解 ,可以求出4个解,所以至少需要四个点对才能求取出没有歧义的解;其求解过程可以分为两个步骤1.根据余弦定理估计投射线的长度;2.计算方向参数;我们首先需要知道的是P3P并不是直接根据3D-2D点求出相机位姿矩阵,而是先求出对应的2D点在当前相机坐标系下的3D坐标,然后根据世界坐标系下的3D坐标和当
2021-12-14 15:38:12
4753
原创 残差/shortcur/Resnet 究竟好在哪里
为什么要使用残差?众所周知,更深的网络会遇到退化问题,即在网络的层数达到最大值后,随着网络深度的增加,准确性会降低。并且这种准确性的降低不是由于训练集的过度拟合;因为训练误差开始增加。然而,可以证明(并且作者确实证明了)如果较浅的网络以一定的精度执行,那么任何较深的网络至少可以与较浅的网络一样好。额外的层可以只是恒等映射(什么也不做),并给出与浅层网络相同的结果。但是实验中并不是这样的。这表明优化器难以通过多个非线性层学习恒等映射。残差的本质是将恒等映射变成了残差拟合;深度学习网络在层数加深的过程中,
2021-12-14 14:44:44
1356
原创 简单易懂--可形变卷积deformable convolution
可形变卷积解决什么问题?1.很多目标物体的形状不是固定的,比如纸袋子,再比如动物跑跳、睡觉情况下会有不同的形状,简言之,目标除了光照、位置会发生变化,还有形变!传统CNN对应位置采用固定的系数去卷积,对于形变物体就会缺少建模和表达能力,所以需要可形变卷积!什么是可形变卷积?下图当中a是普通卷积;b,c,d是可形变卷积,可以看到不是固定对应位置的卷积;每个待卷积的点的位置会发生偏移!且偏移不固定!这个偏移也是网络要学习的!可形变卷积如何实现的?其是在卷积核参数的基础上,加上了偏移量参数δx\de
2021-12-13 21:20:18
2789
原创 RANSAC如何动态更新最大迭代次数
简介:RANSAC的流程是:1.随机取一组点model_points,求解出模型方程;model_points为求取模型的最小点数;2.计算满足该模型方程的点数占总点数的比例(即内点占比);3.若内点占比满足一定阈值,或者当前迭代次数大于最大值,则停止迭代;4.若当前内点占比大于当前统计得到的最大内点占比,则根据内点占比更新最大迭代次数;5.继续迭代;那么最大迭代次数是如何更新的?首先,RANSAC的目的是找出内点占比最大的模型;假设当前统计的最大内点占比是(1-ep),也就是对应的外点占
2021-12-13 10:37:11
1500
原创 SeNet--通道注意力卷积
简介SeNet是一种通道注意力卷积,通俗的讲,就是对每层特征图求平均值,得到(N,C,1,1),然后经过全连接得到对应系数(N,C,1,1),再乘到原始的特征图上(N,C,H,W);原理上是挑选出更需要关注的特征,特征图是由卷积核卷积得到,有的卷积核关注横向的梯度,有的关注纵向的梯度,每个卷积核提取的特征不同,如果一个卷积核的系数值比较小,特征图的值也就比较小,也就意味着这个卷积核没有那么重要,那么SENet就希望缩小不重要的特征的系数,增大重要特征的系数;网络流程图介绍SeNet是放在卷积之后,对
2021-12-07 11:11:54
2850
1
原创 多线程与多进程
简介操作系统最小分配资源的单位是进程,操作系统的最小调度单位是线程;一个程序的执行就是一个进程,一个进程可以包含多个线程,单个CPU内核只能执行一个进程;多进程才是真正的并发操作,多线程如果仅仅使用同一个CPU内核,仍然是多线程之间的交替执行,不是真正的并发;每个进程会被分配独立的内存空间;多进程之间的内存共享往往比较麻烦~一个进程下的多线程内存共享,但是如果做到内存同步需要用到锁机制;多进程之间的内存共享的话可以用队列;python的多进程可通过multiprocessing实现多线程可通
2021-11-26 09:52:05
175
原创 稀疏光流与稠密光流
稀疏光流光流用在目标追踪过程中,基于上一帧的位置,预测目标在下一帧的位移;该预测基于的先验条件如下:1.上一帧跟当前帧拍摄的时差较小,物体的位移不大;2.某点像素(待检测目标上)周围的像素与该点具有相同的位移;3.亮度恒定,上一帧与当前帧的变化不大;具体步骤:1.在上一帧中目标所在的区域内提取N个特征点;2.在每个特征点周围划取5*5的像素大小稠密光流稀疏光流在上一帧检测出来的目标区域内利用若干个特征点计算位移;...
2021-11-25 15:44:55
3302
原创 OCRNet
简介这是HRNet+TRansformer在语义分割方面的应用;最近的研究中,把TRansformer用在语义分割中的很多,因为不同位置不同实例的语义是有相关联性的,比如说飞机不可能在厕所里面等等;这是OCRNet官方的解读:https://zhuanlan.zhihu.com/p/43902175网络结构直接上网络结构:OCR 方法的实现主要包括3个阶段:(1) 根据网络中间层的特征表示估测一个粗略的语义分割结果作为 OCR 方法的一个输入 ,即软物体区域(Soft Object Regi
2021-11-05 17:09:05
2830
原创 PSA极化注意力机制:Polarized Self-Attention: Towards High-quality Pixel-wise Regression
摘要在计算机视觉任务中,语义分割和关键点检测是具有挑战的,因为既要尽量保持高分辨率、又要考虑计算量,以及尽量连接全局信息得到结果。由于提取全局信息的有效性以及对全局像素special的注意力,attention机制在计算机视觉领域变得非常的流行。CNN本身是卷积共享的核,且具有平移不变性,也就代表其是local且丧失special注意力的。但是long-range的attention参数量大,训练耗时长且难以收敛;很多学者都在研究轻便易于训练的attention机制。本文提出了一种极化注意力机制,其优势在
2021-11-05 15:14:06
9570
7
原创 vit-transformer模型结构及源码解读
vit简介vit模型是transformer在图像分类领域的首次成功尝试;但是其需要基于大量数据去预训练模型;除了训练难度,现有的 Visual Transformer 参数量和计算量多大,比如 ViT 需要 18B FLOPs 在 ImageNet 达到 78% 左右 Top1,但是 CNN 模型如 GhostNet 只需 600M FLOPs 可以达到 79% 以上 Top1。vit网络结构源码解读import torchfrom torch import nnfrom einops
2021-11-01 20:20:18
5537
原创 Transformer
Transformer简介什么是TransformerTransformer是基于self-attention注意力机制的一种网络结构,同时其网络结构也沿用了seq2seq的主体结构,由Encoder-Decoder流程组成,包含了multi-head(多个self-attention并行堆叠而成)、加入了位置信息编码,以及mask;Transformer的应用或者目的是什么Transformer最早的提出是由谷歌2017年的一篇论文–Attention is All your need;其提出的
2021-11-01 17:13:41
3764
原创 self-attention
self-attention简介什么是self-attention?self-attention顾名思义,就是自注意力机制,简单理解,就是将输入乘以一个矩阵(attention mask),获得输出的过程。那么这个attention mask怎么获得呢?attention mask也是根据输入本身得到的,1.可以通过对输入进行神经网络变换得到;2。大部分通过点积的方式(矩阵相乘,即经典的q,k,v);self-attention的目的是什么?其目的在于:1.融合全局信息对当前的像素信息进行编码;2.
2021-11-01 15:24:53
1359
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人