JAX base
JAX
学习资料:
https://www.zhihu.com/column/c_1729967479470804992 从入门到jax神经网络手写数字识别 对应的github仓库
https://space.bilibili.com/478929155/search?keyword=jax b站上的视频讲解,挺好懂的。
12345678910111213141516171819202122232425import jaximport jax.numpy as jnpfrom jax import jit, grad, vmap# 原始函数def f(x): return jnp.sin(x) + x**2# 1. 求导f_grad = grad(f)# 2. 向量化f_grad_batch = vmap(f_grad)# 3. 编译加速f_grad_batch_jit = jit(f_grad_batch)# 创建一批数据x_batch = jnp.linspace(0, 10, 10000000) # 10000个样本# 调用y_batch = f_grad ...
Python Multiprocess
Pyhton Multiprocess
众所周知,py因为有GIL的存在,导致python的多线程并不能真正实现多线程的效果。python的多进程可以有效的解决这个问题。python的多进程是通过multiprocessing模块来实现的。
一个用cond条件变量实现生产者消费者的例子
producer consumer
下面是完全用 Process 子类,并结合双 Condition 的“满/空”优化,同时保留了:
with cond: 自动加锁/解锁
while 循环防虚假唤醒
notify_all() 精准唤醒
子类化封装,可复用、清晰
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889from multiprocessing import Process, Condition, ...
C++ Embedding Python
C++ Embedding Python
c++编译链接 背景知识
cpp流程如下
我们想做的是在python中调用cpp的函数。
我们把cpp搞成动态链接库so,然后在python里import这个so文件,来调用写好的cpp函数。
链接器作用
头文件和链接
为什么 .h 和 .cpp 要分开写
静态和动态编译
pybind11 在py中嵌入cpp函数
常见方式
我们尽量选择pybind11来做python和cpp的交互。
我们马上做两个更实用的例子:
1. 绑定一个完整的 C++类(class) 给Python用
2. 让Python的 numpy数组直接传给C++加速处理(比如矩阵运算)
(全部用pybind11,保持代码极短极优雅🌟)
🛠️ 第一个例子:绑定一个C++类到Python
Step 1. 写一个简单的C++类
新建 example.cpp
123456789101112131415161718192021#include <pybind11/pybind11.h>class Adder {public: A ...
Python tips
Python Tips
对于mypy静态检验,我们该怎么严谨的写py code
使用logging来标注info和debug信息,可以一键屏蔽debug信息
类方法 @classmethod
绑定之后,就不用传入self了 变成对这个类的元变量的函数
包的绝对导入和相对导入
py判断数据类型
callable 让类的实例可以像函数一样被调用
函数传参顺序
map返回的是惰性对象
需要list()隐式遍历来转换为list
ABC基类+@abstractmethod 强制实现虚接口
Pandas Tips
Pandas Tips
series本来就是像dict,安全的获取元素方式
series的运算最重要是自动更具index对齐
当我们想要删除nan时
当我们指定index和columns时,效果不一样,index是替换,columns是保留/选择
列的删除和添加
pandas浅拷贝和Copy on write
遇到list里面还有其他指针的可变对象时,需要deepcopy。
常见的切片,取col操作都是COW的,真正共享底层内存需要直接对df.value进行操作。
用df.assign()来添加列 配合lambda函数
挑选子集
注意直接df[]可以是col,也可以返回是row的切片组合df。
df的运算
describe()简单总结每一列的情况
sort和query
单元素快速数据访问
筛选过滤
要注意下面这种情况,不要连着用,不然解释器不知道你对第一个副本做还是对原始df做
使用df.loc明确说
pandas的缺失元素
强制统一col的元素和顺序 目的是对 ...
生成式奖励模型的几种方法
生成式奖励模型的几种方法
简要讨论link
列出的这几篇论文是2024年最新的生成式奖励模型(Generative Reward Models, GRM)方向的重要工作。下面我会逐条为你展开讲解每一篇的核心思路、方法结构、创新点和关键词,
🧠 生成式奖励模型(GRM)背景介绍
传统奖励模型(如 InstructGPT 使用的)大多是:
在 LLM 后面加一个 MLP(value head)
输出一个 scalar 值作为 reward
通常使用 pairwise 偏好数据 + ranking loss 或 DPO 来训练
但这些模型有几个问题:
不可解释(只是一个分数,没有理由)
结构封闭(需要改模型结构)
鲁棒性差(容易受样本偏差影响)
于是最近兴起了一类新的范式:生成式奖励模型(Generative Reward Model),即:
利用 LLM 原有的生成能力,输出语言化的评价(评语、判断、Yes/No、分数等),作为奖励模型。
1️⃣ Beyond Scalar Reward Model: Learning Generative Judge from Pr ...
Let’s Verify Step by Step
Let’s Verify Step by Step
更多细节
Problem:数学问题。
Solution:解题的过程/步骤。
Answer:数学答案。
Generator:在复杂任务场景中,需要一系列的推导步骤才能得到答案。为每个复杂问题Problem生成一系列解题步骤Solution和最终答案Answer。每个Solution之间按照换行符进行分隔。
Reward Model:奖励模型(也可以视为验证器verifier),对生成的内容进行评判,分为以下两种结果奖励监督模型ORM和过程奖励监督模型PRM。
ORMs:结果监督奖励模型(Outcome-supervised),只对完整答案进行评分。
PRMs:过程监督奖励模型 ( process-supervised),可以对每个解题步骤进行评分。
Generator和Reward Model关系:
训练阶段:作为RLHF中的reward模型,提升LLM(Generator)对齐效果。
推理阶段:作为Verification验证模型,对Generator生成的多个候选进行重排序,确保LLM输出更高的一致性和准确性,eg :re ...
Generative Verifiers, Reward Modeling as Next-Token Prediction
Generative Verifiers: Reward Modeling as Next-Token Prediction
过去的几种奖励模型
Background
这篇文章是Generative RM的一个变种,目标用微调过的RM预测客观问题答案的对错。对于数学、逻辑推理等领域的问题,通常存在一套客观的标准或规则判断答案的正确性,但准确判断的成本不一定低;比如有多种解法的几何证明题,或者一些结果正确过程错误的解答等,故也可以用RM去做这类客观问题的批量回答评分。
Step 1
这里我们对原始llm利用标记的数据做sft,帮助其更好地对齐输出。
Step 2
更进一步,我们可以认为LLM的生成能力和判别能力是相互促进的;模型本身有能力生成正确答案的话,对于答案判别的准确度也会更高。因此我们可以直接把y+y^+y+拿来训练模型,提高模型的生成能力;
为什么还要分成两个 loss 项,LSFT(θ,Dverify)\mathcal{L}_{\text{SFT}}(\theta, D_{\text{verify}})LSFT(θ,Dverify) 和 λLSFT(θ,Dcor ...
LoRA
LoRA
背景
神经网络包含很多全连接层,其借助于矩阵乘法得以实现,然而,很多全连接层的权重矩阵都是满秩的。当针对特定任务进行微调后,模型中权重矩阵其实具有很低的本征秩(intrinsic rank)。
因此,论文的作者认为权重更新的那部分参数矩阵尽管随机投影到较小的子空间,仍然可以有效的学习,可以理解为针对特定的下游任务这些权重矩阵就不要求满秩。
技术原理
LoRA 论文,该方法的核心思想就是通过低秩分解来模拟参数的改变量,从而以极小的参数量来实现大模型的间接训练。
在涉及到矩阵相乘的模块,在原始的 PLM 旁边增加一个新的通路,通过前后两个矩阵 A,B 相乘,第一个矩阵 A 负责降维,第二个矩阵 B 负责升维,中间层维度为 r,从而来模拟所谓的本征秩(intrinsic rank)。
可训练层维度和预训练模型层维度一致为 d,先将维度 d 通过全连接层降维至 r,再从 r 通过全连接层映射回 d 维度,其中,r<<dr<<dr<<d,r 是矩阵的秩,这样矩阵计算就从 dxdd x ddxd 变为 dxr+rxdd x r + r x ddx ...
GRPO
GRPO
传统PPO方法:
这里的AtA_tAt是GAE。
GAE 介绍
在PPO(Proximal Policy Optimization)算法中,GAE(Generalized Advantage Estimation) 是一个用于估计 优势函数(advantage function) 的技术,它的目的是在偏差和方差之间找到一个好的折中,以获得更稳定和高效的策略梯度估计。
在策略梯度方法中,策略更新的方向取决于 Advantage,它表示“当前动作比平均水平好多少”。
形式上,优势函数为:
At=Q(st,at)−V(st)A_t = Q(s_t, a_t) - V(s_t)
At=Q(st,at)−V(st)
但直接估计 QQQ 或 AAA 会有高方差,影响训练稳定性,于是引入 GAE 来更好地估算 AtA_tAt。
GAE 提供了一种通过时间差分(TD)来估计 advantage 的方式。它引入一个超参数 λ∈[0,1]\lambda \in [0, 1]λ∈[0,1],来平衡偏差与方差。
定义 TD 残差(Temporal Difference Residu ...