RLHF微调算法
RLHF微调算法 基本概念 RLHF算法全称Reinforcement Learning from Human Feedback,即基于人类偏好的强化学习算法,依赖一个奖励模型通过强化学习将的模型的输出和人类偏好对齐。 RLHF的核心步骤分为三步: 监督微调(SFT):在高质量数据上微调预训练模型 训练一个奖励模型(RM):使得该奖励模型学习到人类对于回答的偏好(这里可以和DPO做一个简单的对比区分,DPO是直接把偏好回答给出来,而RLHF是先利用已有偏好数据训练一个奖励模型,然后用这个训练好的奖励模型在剩下的数据中识别偏好) 强化学习微调(PPO):最大化奖励信号 奖励模型训练 训练奖励模型时利用一个三元组(prompt, chosen, rejected),损失函数 $$\begin{equation}\mathcal{L}_{RM}=-\mathbb{E}[\text{log}~\sigma(R(y_w|x)-R(y_l|x))]\end{equation}$$ 其中 R(y∣x)R(y|x)R(y∣x) 是奖励模型的输出 PPO 优化目标:最大化奖励信号,即...
GRPO微调算法
GRPO微调算法 基本概念 GRPO算法全称 Global Reward Preference Optimization,即全局奖励信号偏好优化,是一种利用全局奖励信号进行模型行为优化。 不同于DPO的偏好对比组合,GRPO的核心思想是为每个生成序列分配一个唯一的奖励值,用来指导模型优化的方向,这个奖励值可以用一个全局奖励模型进行分配,也可以进行人工标注评分。这样可以在一定程度上避免偏好的噪声带来影响,更适合复杂的长文本任务、多轮对话任务等。 GRPO的三元组为(prompt(问题), response(回答), reward(评分/全局奖励值)),核心损失函数为 $$\begin{equation} \mathcal{L}{\text{GRPO}} = -\mathbb{E}{(x, y) \sim \mathcal{D}} \left[ R(y|x) - \beta \cdot \text{KL}\left(\pi_\theta(y|x) \parallel \pi_{\text{ref}}(y|x)\right) \right] \end{equation}$$,...
DPO微调算法
DPO微调算法 基本概念 DPO算法全称Direct Preference Optimization,即直接偏好优化,是直接利用偏好数据将模型与人类偏好进行对齐的一种强化学习算法。DPO绕开了奖励模型的复杂机制,直接利用偏好数据通过损失函数调整模型参数,使得模型输出结果更符合人类偏好。 DPO的核心是一个三元组(prompt(问题), chosen(偏好), rejected(非偏好))和损失函数 $$\begin{equation} \mathcal{L}{\text{DPO}} = - \mathbb{E}{(x, y_w, y_l) \sim \mathcal{D}} \left[ \log \sigma \left( \beta \log \frac{\pi_\theta(y_w|x)}{\pi_{\text{ref}}(y_w|x)} \beta \log \frac{\pi_\theta(y_l|x)}{\pi_{\text{ref}}(y_l|x)} \right) \right] \end{equation}$$, 其中: ywy_wyw 和...
面经汇总
面经汇总 整合了记录的大部分面试问题 字节一面 流程:自我介绍 → 项目拷打 → 代码(leetcode原题我还做过:( → 八股 期间穿插着问了职业规划,读研(?) 项目部分 让我介绍前后端的项目 简单介绍一下 项目结构,怎么分的包、服务 抓着一个具体业务狠狠拷打(订单业务) 下单流程 怎么解决多个人同时调用业务服务的情况(应该是想问怎么解决数据同步问题,我一直回答上锁,面试官一直问我怎么加锁,否定了我原项目的方案:(,锁加在哪,最后大概可能回答了个沾边答案?(加到数据库的元祖上?一直问我怎么落实到代码层面,最后觉得可能是数据库。。),由于我一直在讲悲观锁问我还有什么办法 项目拷打了半个多小时。。 可能确实时间太长了,没问别的项目了 代码 leetcode原题 39....
差分数组
差分数组 以一个例子来了解差分数组 考虑数组arr=[1,3,7,4,8,9,10];arr=[1, 3, 7, 4, 8, 9, 10];arr=[1,3,7,4,8,9,10]; 现在将它们相邻两两作差,即右边减左边,得到数组[2,4,−3,4,1,1],[2,4,-3,4,1,1],[2,4,−3,4,1,1], 如果在原数组前面加上一个000,或者说在差分数组中补上arr[0]arr[0]arr[0], 得到差分数组diff=[1,2,4,−3,4,1,1],diff=[1,2,4,-3,4,1,1],diff=[1,2,4,−3,4,1,1], 这个数组从左往右求和即可得到原数组,有点类似积分和求导的关系。 那这么一个数组有什么用呢?现在对原数组的arr[1] 到 arr[5]arr[1]~到~arr[5]arr[1] 到 arr[5]进行逐元素加101010操作, 得到数组arr′=[1,13,17,14,18,19,10],arr'=[1,13,17,14,18,19,10],arr′=[1,13,17,14,18,19,10],...
面经概述
面经概述 第一步——准备简历 简历是求职过程中很重要的一步,好的简历可以提高初筛的通过率,也方便面试官及时发现你的亮点。通常,简历会按照如下几点进行构建: 个人基本信息:包括个人信息、联系方式、教育背景等 实习 / 工作经历:考虑到大部分人在找实习的时候应该还没有实习 / 工作经历,所以这一点就略去了,有的话写上即可,主要概括一下自己做了什么,取得了什么结果等 项目经历:对于没有实习经历的同学来说,项目经历就是简历中最重要的一部分了,基本上面试官在面试的过程中也会重点针对项目进行提问,所以项目千万不能被问穿,不会的东西一定不要往上写,可以有意的在项目经历中写一些自己熟悉的技术来引导面试官往自己熟悉的领域上提问 关于项目经历可以写哪些,有以下选择供参考: a. 课程大作业,可以包装美化一下,变成一个成熟的项目 e.g. 软工2的项目( b. 比赛项目 c. 自己复现的一些经典开源项目 d. 一些偏底层的项目,比如简单操作系统、网络协议栈等 e. 如果有同学提前进了实验室体验科研,自己跟着做的的一些成熟项目深入了解之后也可以写上去 f....
软件测试期末复习
回归测试 回归测试作为一种有效的方法,可有效保证代码修改的正确性并避免 代码修改对被测程序其他模块产生副作用;回归测试一般占软件产品测试预算的80%以上,占软件维护预算的50%以上 现有用例策略的问题 重复执行已有测试用例 用例庞大 用例冗余 用例失效 用例缺失 回归测试优化 测试用例修复 测试用例选择 测试用例扩充 测试用例缩减 测试用例优先级 随机测试 大数定律:简单地说,就是随着样本数的增加,样本的平均值会越来越接近于期望值 变异测试 变异体 基于一定的语法变换规则,通过对源程序进行程序变换得到的一系列变体 假设: 源程序不包括缺陷 变异体表达缺陷 变异得分 杀死与存活:变异体是否导致某个测试用例运行失败,即测试用例是否检测到变异体 检测到:变异体被杀死 没检测到:变异体存活 score=killkill + survive×100%score = \frac{kill}{kill~+~survive} \times...
C++期末复习——简答题部分
C++期末简答题汇总(往年) 大部分问题的答案在软件学院C++相关文章里应该都能找到答案,这里做一个合订本 C++历史 ? C和C++的关系 C++完全包含C语言成分,C++支持C所支持的全部编程技巧(C的超集);同时C++还添加了OOP支持 任何C程序都能被C++用基本相同的方法编写,并具备相同的运行效率和空间 C++还引入了重载、内联函数、异常处理等功能,对C中的过程化控制及其功能进行了扩充 C++由以下4部分有机组成 C OOP STL Inside-Model 表达式的值有哪些因素决定?表达式存在副作用吗 表达式指由操作数、操作符和标点符号(比如逗号运算符)组成的序列,代表一个计算过程 表达式的值受操作符、操作数、优先级、结合性、求值次序、副作用、短路求值和类型转换(隐式or显式)影响 副作用:改变程序状态(即可能改变操作数或其他一些变量的值) C++多态类型 静态多态 一名多用(函数重载、操作符重载) 模板编程(template)/...
C++常用map
C++使用哈希表 主要介绍map和unordered_map的使用和区别 map 底层实现是 红黑树(自平衡的二叉查找树)。 因为使用了红黑树,std::map 的元素总是 按键的顺序(升序或降序)排列。 每次插入、删除和查找元素时,红黑树会保持自平衡,以确保查找的时间复杂度为 O(log n)。 unordered_map 底层实现是 哈希表(Hash Table)。 哈希表并不保证元素按任何顺序排列,因此插入顺序和查找顺序可能是不可预测的。 插入、删除和查找元素的平均时间复杂度是 O(1),但在最坏情况下,可能会退化到 O(n),例如哈希冲突过多时。 使用语法 map<string, int> use_map;unordered_map<string, int> use_unordered;int main() { use_map["second"] = 2; use_map["first"] = 1; ...
C++容器常用操作
C++容器 本文主要介绍C++容器的常用操作及使用方法 vector 非常常用的容器 1. 基本操作 创建和初始化 std::vector<int> v; // 默认空的 vectorstd::vector<int> v(10); // 创建一个大小为 10 的 vector,元素初始化为 0std::vector<int> v(10, 5); // 创建一个大小为 10 的 vector,所有元素初始化为 5std::vector<int> v = {1, 2, 3, 4}; // 使用列表初始化 获取大小 size_t size = v.size(); // 获取 vector 的元素个数 判断是否为空 bool is_empty = v.empty(); // 如果 vector 为空,返回 true 访问元素 int first = v[0]; // 通过索引访问元素int second = v.at(1); // 使用 at() 安全访问(超出范围会抛出异常)int...