Transformer炼丹小记--大即是好
前言记一次人工神经网络课程大作业。
代码仓库在此:https://github.com/Very-White/2025_final_project 。
模型权重在此:https://www.modelscope.cn/models/SuperBaiBaiBai/zh-en-transformer 。
训练小记在此之前,我以为凭借自己的炼丹经验,训练一个Transformer是轻而易举的事情。没想到为训练一个好的模型耗费了那么多精力,不过也学习到了很多训练技巧。
刚开始,我简单用预先提供的脚本进行训练,里面没有warmup,数据集很小(一个是10k,一个是100k),没有梯度检查点,甚至是将数据集全部加载进内存的。结果马上就过拟合了:
val_loss在下降一点后急速攀升,导致我一度以为是我超参数设置错了。于是我调整超参数再训练了几次,但效果不佳,仍旧过拟合。根据之前对Transformer的了解(从李沐老师视频中学习的),我知道Transformer的预设更少,所以需要用大的数据集才能训练好。于是我换用了当时我觉得比较大的100k数据集(10倍诶!可是10k数据集的10倍)。结果 ...
并行算法笔记
基础概念并发计算、并行计算与分布式计算
特性
并发计算
并行计算
分布式计算
任务执行方式
交替执行
同时执行
分布执行
资源管理
共享资源
独立资源
分散资源
主要目标
提高响应性
提高性能
提高可扩展性和容错性
典型应用
操作系统、Web服务器
科学计算、图像处理
云计算、分布式数据库
冯·诺依曼架构主存:存储指令和数据的集合,每个位置有地址和内容。
CPU:
控制单元:决定程序中哪条指令被执行。
算术逻辑单元(ALU):执行实际指令。
关键术语:
寄存器:CPU中非常快的存储部分。
程序计数器:存储下一条指令的地址。
总线:连接CPU和内存的硬件。
瓶颈问题:内存访问速度远低于CPU处理速度,导致CPU等待数据。
进程与线程进程:正在执行的计算机程序的实例。
组件:可执行程序、内存块、资源描述符、安全信息、进程状态。
多任务:通过时间片轮转,让单个处理器系统看起来同时运行多个程序。
线程:进程内的独立执行单元。
优势:当一个线程阻塞时,其他线程可以继续运行。
操作:
创建线程:称为forking。
终止线程:称为joining。
...
编译原理
概述编译的几个阶段C/C++编译的几个阶段是:
预处理:汇合源程序,展开宏定义,生成.i文件
编译:处理后的源文件到汇编代码文件
汇编:汇编代码文件到目标文件/机器指令文件
连接:连接库代码从而生成可执行(executable)文件
编译过程编译过程分为:
前端(分析):对源程序,识别语法结构信息,理解语义信息,反馈出错信息
词法分析
语法分析
语义分析
后端(综合):综合分析结果,生成语义上等价于源程序的目标程序
中间代码生成
代码优化
目标代码生成
词法分析针对token
语法分析针对语句
语义分析针对整个程序
中间代码生成也就是生成一个等价的、易于优化的中间表示
代码优化删掉不必要的代码
目标代码生成生成汇编
语言和文法基础语言和文法的直观概念程序设计语言包括:语法和语义
语法:是一组规则,用它可以形成和产生一个合适的程序
语义:定义程序的意义
文法:是语言语法的描述工具,实现用有穷的规则把语言的无穷句子集描述出来。比如<句子>=<主语><谓语>,可以用右端的符号串代替=的左端
符号和符号串字母表:字母表是元素 ...
s1:Simple test-time scaling为什么有效?
前言这是我最近读到的两篇很有意思的论文:《s1: Simple test-time scaling》和《Does Reinforcement Learning Really Incentivize Reasoning Capacity in LLMs Beyond the Base Model?》,里面的结论刷新了我之前的看法,恰好之前做了一次论文分享,就将分享的内容整理为文字,主要是结合后一篇论文谈谈我对前一篇论文的想法。
研究背景在OpenAI-o1出来之前,提升大模型的能力主要是在训练的时候加大计算量以及投入。o1的出现提示人们可以通过加大测试的时候的计算量得到更好的效果(test-time scaling)。
作者想要找到一个最简单的方法来实现测试时扩展和强大的推理性能。
研究过程o1对比普通模型最大的区别就是有一个思考过程,并且o1在回答问题的时候输出的时间更长,输出的token更多。
一般思考模型进行思考的时候<think>和</think>来包围思考过程,用<answer></answer>来包围答案,一是一般思考的过程集中 ...
目标检测论文阅读笔记(1)
R-CNN
参考视频:【入门级目标检测发展概述及概念简介】
视觉定位+深度学习的经典论文。做法也是经典的2-Stage方法,先生成一系列的候选框,然后将候选框进行裁剪。之后将每个裁剪后图片通过CNN去预测类别,从而得到不同类别的检测框。
但主要问题是:
直接裁剪图像,再送到CNN开销比较大。论文中2k张图片,假设裁剪后的图片是1KB,那2k张都是将近2MB了。batch size更大的时候这样裁剪更低效。所以之后的Fast R-CNN等优化方法都在特征上进行裁剪。在图片上裁剪的少之又少了。
RP总会有重叠的,之后难以避免要用到NMS(非极大值抑制)来去掉冗余框,也就避免不了NMS的缺点:耗时长和对人物重合效果不好。
CNN的输出类别是固定的,所以类别是有限的,对新的类别又要重新训练。
RetinaNet
参考视频:【入门级目标检测发展概述及概念简介】
像论文中所说:当时在生成候选框(RP)阶段,很多2-Stage方法可以通过一些算法,迅速将候选物体位置的数量缩小到少数(例如,1-2k),过滤掉大多数背景样本。但是1-Stage方法就没法过滤,因为一阶段方法不生成RP,它必须 ...
目标检测入门
基础概念目标
检测任务一般分为两步:
检测出预测框(回归)
将预测框中的物体分类(分类)
同时用到了回归和分类。比如在这张图中就需要框出人和猫两个检测框,然后再对检测框做分类
所以标签(ground_truth)需要检测框坐标(bbox)和类别标签。类别标签有一个集合,比如有80个类别,模型就只会在图像中检测出这80个类别。
一些概念Region proposals(RP)
中文叫做备选框。输入一张图像,可以得到很多候选框,每一个候选框可以看成一个被检测出来的目标,之后这些候选框就被拿去分类。就可以知道这个候选框对应的类别。就完成了目标检测的任务
IoUIoU的计算公式为两个框的交集除以并集
NMS(non-maximum suppression)
中文叫非极大值抑制。因为一个人可能有多个框都预测到这一个人,所以要用一种方法合并这些框,或者说叫过滤冗余框。
但NMS也有缺点,比如两个人重叠在一起了,就有可能被NMS过滤成同一个人。
分类1-Stage和2-Stage1-Stage的模型分为Anchor-based和Anchor-free的。Anchor-based相当于用预定 ...
从策略梯度到GRPO
策略梯度
参考:B站视频
基础概念经验轨迹$τ$
智能体可以感知到当前的环境状态,然后作出行为,会影响环境的状态并从环境中得到奖励。这里将状态表示为$s$,智能体的行为表示为$a$,智能体得到的奖励为$r$。
那么智能体与环境交互一次的经验轨迹为 $ \tau = s_0, a_0, r_1, s_1, \cdots, a_{T - 1}, r_T, s_T $,其中 $ T $ 为终止时刻。就是状态、智能体采取的动作、智能体得到的奖励、下一状态……的一个数列。
经验轨迹的概率 $ P_\theta(\tau) $经验轨迹出现的概率由环境和智能体两部分决定:
\begin{align*}
P_\theta(\tau) &= p(s_0) \cdot \pi_\theta(a_0 \mid s_0) \cdot p(s_1 \mid s_0, a_0) \cdot \pi_\theta(a_1 \mid s_1) \cdots \pi_\theta(a_{T - 1} \mid s_{T - 1}) \cdot p(s_T \mid s_{T - 1}, a_{T - 1}) \\
...
解决DeepSpeed offload时找不到动态库的问题
问题在DeepSpeed Offload时候需要编译并加载一个动态库,使得Adam优化器可以从GPU卸载到CPU。可以用以下方法测试编译是否成功:
12import deepspeeddeepspeed.ops.op_builder.CPUAdamBuilder().load()
我刚开始的时候遇到了报错,提示找不到其中的一个动态链接库:
1/home/xxx/miniconda3/envs/Visual-RFT/bin/../lib/gcc/x86_64 - conda - linux - gnu/11.2.0/../../../../x86_64 - conda - linux - gnu/bin/ld: cannot find - lcurand: No such file or directory
解决方案如果要编译动态库,需要用到CUDA Toolkit,而且要是官网下载的(Conda/Pytorch安装的CUDA Toolkit是不全的)。
所以需要:
下载安装CUDA Toolkit
设置环境变量让DeepSpeed可以找到(因为我是非ROOT用户安装的,我装在了~/C ...
用fast-reid提取人物特征
前言最近要做人物的识别,有些图片没有正脸,所以要用到ReID相关的技术(有正脸就很好处理,用人脸检测现在有很多现成的库)。在网上找了一圈没找到很适合入门的教程,于是打算在这里写一下我是怎么用fast-reid库来做人物的特征向量的提取的。方便之后的人入坑。
现成的reid的库我就只找到了torchreid和fast-reid。前者我尝试了,但没跑起来,而且代码好久没维护了,fast-reid是京东近年来发布的,品质更有保障,所以就选了后者。
环境配置fast-reid并不像一些Python包可以直接用pip install fastreid安装,它的项目地址中并没有提到能用pip直接安装,所以装起来有点麻烦。
安装依赖首先先创建一个虚拟环境,.venv或者conda都可以。然后安装一些依赖(fast-reid需要用到,在项目的文档里也提到了):
Pytorch ≥ 1.6
torchvision(装和Pytorch版本兼容的)
yacs
gdown
sklearn
termcolor
tabulate
faiss
前面七个每个都用pip install packet_nam ...
博客搬家记
起因原先的博客运行在我的Windows笔记本上,因为平时不怎么用该笔记本,传输文件都用ToDesk,不是很方便。更重要的是,如果哪天它坏掉了,那我就得重新配置一次环境,还要重新配置一次Hexo。环境还是小事,Windows备份也麻烦,如果哪天磁盘坏了,写过的博客就整个不见了。
总之,想着不能让我的博客绑定在这个Windows笔记本上。痛定思痛😭,决定将其整个环境搬迁到Docker当中。
迁移过程服务器的选择因为:
需要配置Docker以及Node.js环境,我不想在自己笔记本上装太多东西。
需要让女友也能将博客上传。
所以我选择将Hexo博客运行在一个服务器上。搜索了一圈,发现阿里云天工开物计划可以白嫖服务器。配置还不错:
2核CPU
2G内存
50G硬盘
每月20G免费流量
自带公网IP
最重要的是免费,还是包年的。于是我打算把Hexo部署在上面。
领取的方法可见《如何白嫖阿里云服务器?》
打包Hexo博客迁移的第一步就是把原先的博客整个打包,我把整个Hexo博客都存在了一个Blog文件夹下,所以只需要把这个文件夹压缩就好了。
除了写的博客以外,另一个需要迁移的就是Hexo ...