【LLM强化学习】Deep使用的强化学习方法 GRPO 理论理解与实践
一、写在前面
预训练 赋予了 LLMs 广阔的知识和强大的语言能力,但模型本身并不知道 什么是好的,什么是坏的,什么是符合人类偏好的。我们需要 引导 LLMs 学习人类的价值观,理解指令背后的意图,并生成更安全、更可靠、更符合人类期望的文本。强化学习(Reinforcement Learning,RL) 提供了一种强大的工具来实现这一目标,特别是 基于人类反馈的强化学习 (Reinforcement Learning from Human Feedback, RLHF),已经成为提升 LLMs 性能和对齐人类偏好的关键技术。
二、传统 RL 方法及其在 LLM 后训练中的应用
传统强化学习 (Traditional Reinforcement Learning) 的核心思想是让 智能体 (Agent) 在 环境 (Environment) 中不断试错学习,通过 奖励 (Reward) 信号来指导策略优化,最终学习到在特定环境中采取最优行动策略。其基本原理可以用以下流程概括:
-
智能体与环境交互 (Agent-Environment Interaction): 智能体观察环境状态 (State),并根据当前策略 (Policy) 选择一个行动 (Action);环境接收行动后,转移到新的状态,并给智能体一个奖励 (Reward)。
-
策略优化 (Policy Optimization): 智能体根据环境反馈的奖励信号,调整自身策略,使其在未来能够获得更高的累积奖励 (Cumulative Reward)。
应用于 LLM 后训练 (Post-Training) 时,传统 RL 方法的流程通常如下:
-
定义环境 (Environment): LLM 本身充当环境。输入 prompt 作为环境状态,LLM 生成的 response 作为环境的下一步状态。
-
定义智能体 (Agent): 策略模型 (Policy Model),即待优化的 LLM 模型,充当智能体。它的目标是学习一个策略,使其能够根据输入 prompt 生成高质量的 response。
-
定义行动空间 (Action Space): LLM 的行动空间是 词汇表 (Vocabulary)。每一步,LLM 从词汇表中选择一个 token 作为输出。
-
定义奖励函数 (Reward Function): 奖励函数用于评估 LLM 生成的 response 的质量。在 RLHF 中,奖励通常来自 人类反馈 (Human Feedback) 或 奖励模型 (Reward Model) 的打分。奖励值越高,表示 response 越符合人类偏好。
-
策略优化算法 (Policy Optimization Algorithm): 常用的策略优化算法包括 策略梯度 (Policy Gradient) 方法,如 REINFORCE、Actor-Critic、以及 近端策略优化 (PPO) 等。这些算法利用奖励信号来更新策略模型,使其生成更高奖励的 responses。
以 PPO 为例,其应用于 LLM 后训练的过程大致如下:
-
数据收集 (Data Collection): 使用 策略模型 (Policy Model) 对 prompt 进行采样,生成 responses,并使用 奖励模型 (Reward Model) 对 responses 进行打分,获取奖励值。
-
训练 Critic 网络 (Train Critic Network): 使用收集到的数据,训练 价值函数 (Value Function) 或 Critic 网络,用于评估当前策略的价值,预测未来累积奖励。
-
策略更新 (Policy Update): 使用 PPO 算法,结合 奖励值 和 Critic 网络的评估,更新 策略模型 (Policy Model) 的参数。PPO 通过引入 重要性采样 (Importance Sampling) 和 裁剪函数 (Clip Function) 等技术,提高了策略更新的稳定性和效率。
-
迭代训练 (Iterative Training): 重复步骤 1-3,不断迭代训练,直至策略模型性能收敛或达到预设的训练目标。
三、传统 RL 方法应用于 LLM 的挑战
尽管传统 RL 方法为 LLM 后训练提供了有效的框架,但在实际应用中,仍然面临诸多挑战:
- 计算开销巨大: LLMs 参数量庞大,训练一个 PPO 的 critic 网络以及进行多次策略更新迭代,计算成本非常高昂。
- 训练不稳定: PPO 训练过程对超参数敏感,容易出现训练崩溃或性能震荡。
- 奖励函数设计困难: 为 LLMs 设计一个能够准确反映人类偏好的奖励函数并非易事,不恰当的奖励函数反而会误导模型。
为了解决这些问题,DeepSeek-AI 团队在 DeepSeek-V2 和 DeepSeek-V3 模型中采用了 Group Relative Policy Optimization (GRPO) - 群组相对策略优化 算法。GRPO 是一种 无 critic (critic-free) 的强化学习方法,它巧妙地利用 群组排序 (group ranking) 的思想,实现了更稳定、更高效的 LLM 强化学习。
四、GRPO 理论:相对排序,无需 Critic
GRPO 的核心思想是 相对比较 (relative comparison) 和 群组优化 (group optimization)。它摒弃了传统 RL 方法中复杂的 critic 网络,转而直接比较 同一 prompt 下不同 response 之间的优劣,并以此作为优化策略的信号。
1 相对排序的思想
想象一下,你正在教一个小孩子画画。与其告诉他“这幅画值 8 分,那幅画值 9 分”这种绝对分数,不如直接告诉他“这幅画比那幅画画得更好”。对于 LLMs 来说,也是如此。人类更擅长进行相对判断,而非绝对评分。GRPO 正是借鉴了这种思想,让模型学习 response 之间的相对排序关系,而非绝对的奖励值。
例如,对于同一个问题 “请写一首关于秋天的诗歌”,模型可能会生成以下三个 response:
- Response 1: 秋风瑟瑟,落叶飘零。
- Response 2: 秋天来了,树叶黄了,天气凉了。
- Response 3: 枫叶如丹,层林尽染,雁字南归,秋意阑珊。
如果让人类来评价,我们可能会认为 Response 3 比 Response 1 和 Response 2 更好,而 Response 1 又比 Response 2 更好。GRPO 的目标就是让模型学习到这种 排序关系:Response 3 > Response 1 > Response 2。
2 无 Critic 的优势
传统 RL 方法,如 PPO,需要训练一个 Critic 网络 来评估当前策略的价值,并辅助策略更新。然而,Critic 网络的训练往往不稳定,且容易与 Policy 网络产生耦合,影响整体训练效果。
GRPO 巧妙地 避免了 Critic 网络的训练。它直接利用 response 的相对排序信息 来更新 Policy 网络,简化了训练流程,提高了训练稳定性。
3 GRPO 的目标函数
GRPO 的目标函数旨在最大化 群组内相对优势 (group relative advantage),并同时加入 KL 散度惩罚项 (KL divergence penalty),防止策略更新过大。
GRPO 的目标函数可以用以下公式表示:
J_GRPO(θ) = E[q ~ P(Q), {o_i}_i=1^G ~ π_θ_old(O|q)] [ 1/G * Σ_{i=1}^G ( min( ratio(θ, θ_old, o_i) - A_i, clip(ratio(θ, θ_old, o_i), 1-ε, 1+ε) - A_i ) - β * D_KL(π_θ || π_ref) ) ]
公式解读:
- E[ … ]: 期望值,表示对 prompt 分布 P(Q) 和 response 群组 {o_i}_i=1^G 求期望。
- q ~ P(Q): 从 prompt 分布 P(Q) 中采样一个 prompt q。
- {o_i}_i=1^G ~ π_θ_old(O|q): 使用旧策略模型 π_θ_old 对 prompt q 进行采样,生成一个包含 G 个 response 的群组 {o_i}_i=1^G。
- ratio(θ, θ_old, o_i) = π_θ(o_i|q) / π_θ_old(o_i|q): 重要性采样率,表示新策略模型 π_θ 生成 response o_i 的概率与旧策略模型 π_θ_old 生成 response o_i 的概率之比。
- A_i: 第 i 个 response o_i 的相对优势 (advantage),由群组内 responses 的
相关文章:
【LLM强化学习】Deep使用的强化学习方法 GRPO 理论理解与实践
一、写在前面 预训练 赋予了 LLMs 广阔的知识和强大的语言能力,但模型本身并不知道 什么是好的,什么是坏的,什么是符合人类偏好的。我们需要 引导 LLMs 学习人类的价值观,理解指令背后的意图,并生成更安全、更可靠、更符合人类期望的文本。强化学习(Reinforcement Learn…...
初阶c语言(练习题,猜随机数,关机程序)
目录 第一题,使用函数编写一个随机数,然后自己猜,猜随机数 第二道题(关机程序) 实现代码(关机程序) 实现代码(猜数字) 前言: 学习c语言,学习…...
TypeScript 与后端开发Node.js
文章目录 一、搭建 TypeScript Node.js 项目 (一)初始化项目并安装相关依赖 1、创建项目目录并初始化2、安装必要的依赖包 (二)配置 TypeScript 编译选项(如模块解析方式适合后端) 二、编写服务器代码 &a…...
基于SSM+uniapp的鲜花销售小程序+LW示例参考
1.项目介绍 系统角色:管理员、商户功能模块:用户管理、商户管理、鲜花分类管理、鲜花管理、订单管理、收藏管理、购物车、充值、下单等技术选型:SSM,Vue(后端管理web),uniapp等测试环境&#x…...
数据开放共享和平台整合优化取得实质性突破的智慧物流开源了
智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…...
2025互联网医院系统源码解析:AI陪诊问诊APP的未来发展
2025年,AI陪诊问诊APP将如何在技术上创新,如何推动互联网医院的进一步发展,成为了我们今天探讨的核心内容。在本文中,我们将通过源码解析,深入分析这一前沿技术的未来发展趋势,帮助广大从业者更好地理解这一…...
【NLP 22、语言模型 language model】
有时候我也想听听,我在你心里,是什么样子 —— 25.1.12 一、什么是语言模型 语言是灵活的,也是有规律的 了解一门语言的人可以判断一句话是否“合理” 通俗来讲,语言模型用来评价一句话(句子可以看作是字的组合)是否“合理”或…...
(萌新入门)如何从起步阶段开始学习STM32 —— 0.碎碎念
目录 前言与导论 碎碎念 所以,我到底需要知道哪些东西呢 从一些基础的概念入手 常见的工具和说法 ST公司 MDK5 (Keil5) CubeMX 如何使用MDK5的一些常用功能 MDK5的一些常见的设置 前言与导论 非常感谢2301_77816627-CSDN博客的提问,他非常好奇…...
Eclipse:关闭多余的工具条
Eclipse默认的工具条非常多,可以通过如下方法选择关闭一些不常用的: 1.选择菜单Window -> Perspective -> Customize Perspective 2.根据需要勾选Toolbar Visbility下面的工具条项...
Git标签管理:从基础到高阶自动化实践
引言 在软件发布过程中,88%的生产事故与版本标记错误相关。Git标签(Tag)作为版本控制的关键锚点,不仅是发布流程的里程碑,更是代码审计和问题追溯的重要依据。本文将深入Git标签的底层机制,揭示企业级标签…...
【第3章:卷积神经网络(CNN)——3.6 CNN的高级特性与优化策略】
在2012年ImageNet竞赛的颁奖现场,当AlexNet以超出第二名10%的惊人准确率夺冠时,整个计算机视觉界都意识到:这个叫CNN的架构正在重写游戏规则。十年后的今天,当我们站在YOLOv8、Vision Transformer等新架构的肩膀上回望,会发现经典CNN的进化史就是一部浓缩的深度学习发展史…...
【R语言】非参数检验
一、Mann-Whitney检验 在R语言中,Mann-Whitney U检验(也称为Wilcoxon秩和检验)用于比较两个独立样本的中位数是否存在显著差异。它是一种非参数检验,适用于数据不满足正态分布假设的情况。 1、独立样本 # 创建两个独立样本数据…...
250214-java类集框架
单列集合是list和set,list的实现类有ArrayList和LinkedList,前者是数组实现,后者是链表实现。list和set,前者有序、可重复,后者无序不可重复。 1.单列集合 1.1. list java.util.List接口继承自Collection接口&#…...
集成测试总结文档
1. 集成测试的定义 集成测试(Integration Testing)是在单元测试之后,将多个独立的软件模块或组件组合在一起进行测试的过程,目的是验证这些模块之间的接口、数据传递、协作逻辑是否符合设计要求,并发现因集成引发的缺…...
POI 的 Excel 读写操作教程
POI 的 Excel 读写操作教程 一、POI 简介 Apache POI 是一款在 Java 开发中广受欢迎的开源库,主要用于处理各种 Microsoft Office 文件格式,Excel 文件便是其中之一。凭借其功能强大的 API,POI 不仅支持对 Excel 文件的读取、写入和修改&am…...
ROS2 话题通信
1. 基本概念 发布-订阅模型:节点间通过话题(Topic)异步通信,发布者(Publisher)发送消息,订阅者(Subscriber)接收消息。 话题(Topic):…...
【学习资源】时间序列数据分析方法(1)
时间序列数据分析是一个有趣的话题,让我们多花一些时间来研究。此篇为第一篇文章。主要介绍特征提取方法、深度学习时序数据分析模型、参考资源。期望能帮助大家解决工业领域的相关问题。 1 特征提取方法:信号处理 (来源:INTELLIGENT FAULT DIAGNOSIS A…...
Hadoop集群安装与配置指南(CentOS 7)
Hadoop集群安装与配置指南(CentOS 7) 一、虚拟机准备 安装虚拟机软件 下载VMware或VirtualBox,完成安装并激活。 注意:选择NAT模式,配置子网IP(如192.168.10.0)。 CentOS 7安装 下载CentOS 7…...
Streamlit与Qlib:量化投资策略可视化实战
Streamlit与Qlib:量化投资策略可视化实战 1. 项目背景 在量化投资领域,数据可视化是理解和展示投资策略的关键。本文将详细介绍如何使用Streamlit和Qlib构建一个交互式的量化投资策略可视化应用。 2. 环境准备 2.1 安装依赖 # 安装必要的库 pip ins…...
Ceph集群搭建2025(squid版)
squid版本维护年限 apt install -y cephadmecho >> "deb http://mirrors.163.com/ceph/debian-squid/ bookworm main" echo >> "deb-src http://mirrors.163.com/ceph/debian-squid/ bookworm main"#安装源 cephadm install #开始初始化一个最…...
机器学习实战(3):线性回归——预测连续变量
第3集:线性回归——预测连续变量 在机器学习的世界中,线性回归是最基础、最直观的算法之一。它用于解决回归问题,即预测连续变量(如房价、销售额等)。尽管简单,但线性回归却是许多复杂模型的基石。今天我们…...
【AI-34】机器学习常用七大算法
以下是对这七大常用算法的浅显易懂解释: 1. k 邻近算法(k - Nearest Neighbors,KNN) 想象你在一个满是水果的大广场上,现在有个不认识的水果,想知道它是什么。k 邻近算法就是去看离这个水果最近的 k 个已…...
【漫话机器学习系列】093.代价函数和损失函数(Cost and Loss Functions)
代价函数和损失函数(Cost and Loss Functions)详解 1. 引言 在机器学习和深度学习领域,代价函数(Cost Function)和损失函数(Loss Function)是核心概念,它们决定了模型的优化方向。…...
ThreadLocal为什么会内存溢出
每个线程(Thread 对象)内部维护一个 ThreadLocalMap,用于存储该线程的所有 ThreadLocal 变量的键值对: ThreadLocalMap虽然是ThreadLocal的静态内部类,但是Thread 对象的属性,当线程存活时ThreadLocalMap不会被回收。 Key:ThreadLocal 实例的 弱引用(WeakReference)。…...
LabVIEW 天然气水合物电声联合探测
天然气水合物被认为是潜在的清洁能源,其储量丰富,预计将在未来能源格局中扮演重要角色。由于其独特的物理化学特性,天然气水合物的探测面临诸多挑战,涉及温度、压力、电学信号、声学信号等多个参数。传统的人工操作方式不仅效率低…...
【记忆化搜索】最长递增子序列
文章目录 300. 最长递增子序列解题思路:递归 -> 记忆化搜索 300. 最长递增子序列 300. 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除&am…...
Tomcat的升级
一、为什么Tomcat需要升级 在生产环境中,我们都会指定对应的Tomcat版本进行安排配置,但是由于Tomcat厂商对于小版本的更新迭代会将一些Bug修复,这个时候在生产中出现问题/预防出现问题,可以通过小版本的升级解决前提:…...
4-制作UI
创建模块文件夹 Unity编辑器->Tools->YIUI自动化工具,在新增模块名称那里输入模块名字并点击创建。便可看到在GameRes/YIUI文件夹下有新建的文件夹与内容了。里面包含图集、预制体、Sprites。如果进行预制体的修改,则需要双击进入再修改࿰…...
零基础学习人工智能
零基础学习人工智能是一个既充满挑战又极具潜力的过程。以下是一份详细的学习指南,旨在帮助零基础的学习者有效地踏入人工智能领域。 一、理解基本概念 在学习人工智能之前,首先要对其基本概念有一个清晰的认识。人工智能(AI)是…...
vue3+element-plus中的el-table表头和el-table-column内容全部一行显示完整(hook函数)
hook函数封装 export const useTableColumnWidth _this > {const { refTable } _thisconst columnWidthObj ref()const getTableColumnWidth cb > {nextTick(() > {columnWidthObj.value {}// 获取行rowsconst tableEle refTable?.refBaseTable?.$elif (!tab…...
