【算法】强化学习中奖励和损失函数的关系

【算法】强化学习中奖励和损失函数的关系

奖励是环境的"评分",损失函数是优化器的"指导手册"。

奖励告诉我们"什么好什么坏",损失函数告诉优化器"如何调整神经元的权重,让好的动作更可能发生"。

在强化学习中,奖励是目标,损失函数是手段,两者缺一不可。

一、前言

概念 作用对象 用途 来源
奖励 (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)
                                   ↓
                              狗学会更好地"坐下"

关键要点

问题 答案
损失函数给谁用? 优化器,用来更新网络参数
奖励给谁用? 策略,用来评估动作好坏
两者关系? 奖励是信号,损失是基于奖励构造的可微分函数
没有损失函数能训练吗? 不能,因为需要梯度来更新参数
相关推荐
To_OC4 小时前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与9 小时前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络13 小时前
论最小 Agent 计算机的形态
算法
kisshyshy1 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷2 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络2 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法
复杂网络2 天前
基于 Stable Diffusion 架构的视觉大模型代表性工作与原理深度解析
算法
MrZhao4002 天前
Agent Loop 如何用 Hook 扩展:权限、日志与工具拦截
算法
MrZhao4002 天前
Agent 为什么需要 Skills:别把所有知识都塞进 system prompt
算法