通俗易懂讲透 Q-Learning:从零学会强化学习核心算法
通俗易懂讲透 Q-Learning:从零学会强化学习核心算法
Q-Learning 是无模型、基于价值迭代的经典强化学习算法,核心就是让智能体通过不断试错,记住每个状态下做什么动作收益最大,最终学到最优决策策略。
一、先搞懂:Q-Learning 到底在干什么?
用迷宫寻宝一句话概括:
你在迷宫里找出口,每走一步都有奖励/惩罚,Q-Learning 就是帮你记一本“行动账本”,记录在哪个位置、往哪边走最划算,越走越聪明。
核心逻辑(3 步走)
- 探索:一开始瞎走,试试不同方向
- 记录:把每一步的好坏记在账本里(Q 值)
- 利用:后面按账本选最优动作,少走弯路
最终目标:让智能体拿到最大的累计奖励。
二、关键概念:一看就懂
1. Q 值(动作价值函数)
- 全称:Q(s, a)
- 含义:在状态 s下,做动作 a未来能拿到的总收益
- 简单说:这个位置做这个动作“值不值”
2. 贝尔曼方程(Q 更新的依据)
这是 Q-Learning 的数学灵魂,不用怕,拆解开很简单:
Q(s, a) = 当前奖励 r + γ × 下一个状态的最大Q值- r:做完动作立刻拿到的奖励
- γ(折扣因子):未来奖励的重要程度(0~1)
- 接近1:更看重长远收益
- 接近0:只看眼前好处
3. Q 值更新公式(最重要!)
Q(s,a) = Q(s,a) + α × [ r + γ×maxQ(s',a') − Q(s,a) ]- α(学习率):每次更新改多少(0~1)
- 大:学得快,容易震荡
- 小:学得稳,速度慢
- maxQ(s’,a’):下一个状态里,最好动作的 Q 值
一句话理解:用“新的更好估计”去修正“旧的估计”。
4. 探索 vs 利用(核心矛盾)
- 探索(Explore):随机选动作,找新路线
- 利用(Exploit):按账本选最优动作
- ε-贪心策略:
- ε概率随机探索
- 1−ε概率选最优动作
- 常用:训练初期ε大,后期ε慢慢减小
三、Q-Learning 标准流程(背下来也能用)
- 初始化 Q 表
所有状态-动作对的 Q 值初始化为 0 或小随机数。 - 循环多轮训练(episode)
- 把智能体放回起点
- 用 ε-贪心选动作
- 执行动作,拿到奖励 r 和新状态 s’
- 按公式更新 Q 值
- 把当前状态换成新状态
- 收敛后输出最优策略
每个状态直接选 Q 值最大的动作。
伪代码(极简版)
初始化 Q 表全为0 设置 α, γ, ε for 每一轮训练: 初始化状态 s while 没到终点: 用ε-贪心选动作 a 执行a,得到r, s' 更新 Q(s,a) s = s'四、实战案例:用 Q-Learning 走迷宫
我们用一个9行8列迷宫,手把手跑通代码,本科生/研究生都能直接跑。
1. 迷宫环境定义
- 0:可走路径
- 1:墙(障碍物)
- 起点:(0, 0)
- 终点:(8, 0)
2. 奖励规则(关键!)
- 到终点:+10 奖励
- 撞墙:-1 惩罚
- 每走一步:-0.1(鼓励快点到终点)
3. 完整可运行代码(Python)
importnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlib.animationasanimation# 迷宫环境类classMaze:def__init__(self,maze):self.maze=np.array(maze)self.n_rows,self.n_cols=self.maze.shape self.start=(0,0)self.goal=(8,0)self.state=self.startdefreset(self):self.state=self.startreturnself.statedefstep(self,action):row,col=self.state# 0上 1右 2下 3左ifaction==0:row=max(0,row-1)elifaction==1:col=min(self.n_cols-1,col+1)elifaction==2:row=min(self.n_rows-1,row+1)elifaction==3:col=max(0,col-1)self.state=(row,col)# 奖励设置ifself.state==self.goal:reward=10done=Trueelifself.maze[row,col]==1:reward=-1done=Trueelse:reward=-0.1done=Falsereturnself.state,reward,done# Q-Learning 智能体classQLearning:def__init__(self,env,alpha=0.1,gamma=0.9,epsilon=0.3,episodes=1000):self.env=env self.alpha=alpha self.gamma=gamma self.epsilon=epsilon self.episodes=episodes# Q表:行×列×4个动作self.q_table=np.zeros((env.n_rows,env.n_cols,4))self.path_per_episode=[]defchoose_action(self,state):ifnp.random.rand()<self.epsilon:returnnp.random.choice(4)else:row,col=statereturnnp.argmax(self.q_table[row,col])deftrain(self):forepisodeinrange(self.episodes):state=self.env.reset()done=Falsepath=[state]whilenotdone:action=self.choose_action(state)next_state,reward,done=self.env.step(action)row,col=state next_r,next_c=next_state# Q值更新self.q_table[row,col,action]+=self.alpha*(reward+self.gamma*np.max(self.q_table[next_r,next_c])-self.q_table[row,col,action])state=next_state path.append(state)self.path_per_episode.append(path)ifstate==self.env.goal:print(f"第{episode+1}轮到达终点!")# 迷宫布局maze=[[0,1,0,0,0,0,1,0],[0,1,0,1,1,0,1,0],[0,0,0,0,1,0,0,0],[1,1,1,0,1,1,1,1],[0,0,0,0,0,0,0,0],[0,1,1,1,1,1,1,1],[0,0,0,0,0,0,0,0],[1,1,1,1,1,1,1,0],[0,0,0,0,0,0,0,0]]# 初始化环境与智能体env=Maze(maze)agent=QLearning(env,episodes=1000)agent.train()# 动态可视化训练过程fig,ax=plt.subplots(figsize=(8,8))defupdate(frame):path=agent.path_per_episode[frame]render=env.maze.copy()for(r,c)inpath:render[r,c]=2ax.clear()ax.imshow(render,cmap="coolwarm",vmin=0,vmax=2)ax.set_title(f"训练轮次:{frame+1}")ax.text(0,0,"S",color="white",fontweight="bold")ax.text(0,8,"G",color="white",fontweight="bold")returnax ani=animation.FuncAnimation(fig,update,frames=len(agent.path_per_episode),repeat=False)plt.show()4. 代码说明(一看就懂)
- Maze 类:管迷宫环境,负责移动、给奖励
- QLearning 类:管智能体,选动作、更新 Q 表
- 可视化:动态展示每一轮的行走路径,越到后面路径越短、越直
五、Q-Learning 优缺点(面试/论文必背)
优点
- 无模型:不用知道环境规则,直接交互学习
- 简单稳定:公式清晰,容易实现
- 收敛保证:满足条件时一定能学到最优策略
缺点
- 维度灾难:状态/动作一多,Q 表巨大存不下
- 收敛慢:高维空间需要大量训练
- 连续空间不行:只能处理离散状态/动作
六、适用场景与实际应用
适用前提
- 状态和动作必须离散
- 有明确奖励/惩罚
- 能充分探索状态空间
实际落地场景
- 游戏 AI:走迷宫、贪吃蛇、简单棋类
- 机器人路径规划:AGV 小车、避障导航
- 资源调度:数据中心负载、带宽分配
- 广告/推荐:优化投放策略、点击率最大化
七、总结(最核心的 3 句话)
- Q-Learning =记 Q 表 + 按贝尔曼方程更新
- 动作选择靠ε-贪心平衡探索与利用
- 适合离散、小状态空间,大场景用 DQN 改进
