【算法】强化学习中奖励和损失函数的关系
奖励是环境的"评分",损失函数是优化器的"指导手册"。
奖励告诉我们"什么好什么坏",损失函数告诉优化器"如何调整神经元的权重,让好的动作更可能发生"。
在强化学习中,奖励是目标,损失函数是手段,两者缺一不可。
一、前言
| 概念 | 作用对象 | 用途 | 来源 |
|---|---|---|---|
| 奖励 (Reward) | 策略(Policy) | 评估动作好坏 | 环境给出 |
| 损失函数 (Loss) | 神经网络参数 | 更新网络权重 | 基于奖励构造 |
详细解释
┌─────────────────────────────────────────────────────────────────┐
│ 强化学习训练流程 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 环境 (Environment) │
│ ↓ 给出奖励 r │
│ 奖励信号: "这个动作得10分" │
│ ↓ │
│ 策略网络 (Policy Network) ← 神经网络,需要训练 │
│ ↓ 构造损失函数 │
│ 损失 = -log(π(a|s)) * Advantage ← 把奖励转化为梯度 │
│ ↓ 反向传播 │
│ 优化器更新网络参数 (weights/biases) │
│ ↓ │
│ 策略改进: 更好的动作获得更高概率 │
│ │
└─────────────────────────────────────────────────────────────────┘
二、损失函数是给谁用的?
损失函数是给优化器用的,用来更新神经网络的参数(weights和biases)。
python
import torch
import torch.nn as nn
import torch.optim as optim
class PolicyNetwork(nn.Module):
def __init__(self, state_dim, action_dim):
super().__init__()
self.fc = nn.Sequential(
nn.Linear(state_dim, 64),
nn.ReLU(),
nn.Linear(64, action_dim),
nn.Softmax(dim=-1)
)
def forward(self, state):
return self.fc(state)
# 创建网络
policy_net = PolicyNetwork(state_dim=4, action_dim=2)
# 优化器 - 这里用损失函数来更新网络参数!
optimizer = optim.Adam(policy_net.parameters(), lr=0.01)
# 训练步骤
def update_policy(states, actions, rewards):
"""
损失函数的作用:告诉优化器如何调整网络参数
"""
# 前向传播:获取动作概率
action_probs = policy_net(states)
# 选择实际执行的动作的概率
selected_probs = action_probs.gather(1, actions.unsqueeze(1))
# 构造损失函数:奖励高的动作,增大其概率
# 注意:奖励是环境的信号,损失是基于奖励构造的
loss = -torch.log(selected_probs) * rewards # 负对数似然 × 奖励
loss = loss.mean()
# 反向传播:计算梯度
optimizer.zero_grad()
loss.backward() # ← 这里计算每个参数的梯度!
# 优化器更新参数:调整weights和biases
optimizer.step() # ← 这里实际更新神经网络参数!
return loss.item()
三、形象比喻

想象你在教一只狗(神经网络)做动作:
环境(主人) 狗的大脑(神经网络)
↓ ↓
"坐下给10分"(奖励) 损失函数:"这次得分10分,
↓ 要增强这个动作的概率"
↓ ↓
反向传播:调整神经元连接强度
(改变weights/biases)
↓
狗学会更好地"坐下"
关键要点
| 问题 | 答案 |
|---|---|
| 损失函数给谁用? | 优化器,用来更新网络参数 |
| 奖励给谁用? | 策略,用来评估动作好坏 |
| 两者关系? | 奖励是信号,损失是基于奖励构造的可微分函数 |
| 没有损失函数能训练吗? | 不能,因为需要梯度来更新参数 |
