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

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

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

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

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

一、前言

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

关键要点

问题 答案
损失函数给谁用? 优化器,用来更新网络参数
奖励给谁用? 策略,用来评估动作好坏
两者关系? 奖励是信号,损失是基于奖励构造的可微分函数
没有损失函数能训练吗? 不能,因为需要梯度来更新参数
相关推荐
米尔的可达鸭19 分钟前
深入操作系统 Socket 底层:套接字控制块、FD映射、阻塞IO核心完整实现
arm开发·数据结构·websocket·网络协议·算法·架构·安全架构
tachibana227 分钟前
hot100 课程表(207)
java·数据结构·算法·leetcode
神仙别闹29 分钟前
编写基于C++ Huffman 算法的无损压缩程序和解压程序
java·c++·算法
大鱼>42 分钟前
宠物活动轨迹追踪系统:GPS/BDS+UWB+BLE多定位融合方案
人工智能·深度学习·算法·iot·宠物
旖-旎1 小时前
《LeetCode 646 最长数对链 || LeetCode 1143 最长公共子序列》
c++·算法·leetcode·动态规划
Frostnova丶1 小时前
(15)LeetCode 189. 轮转数组
数据结构·算法·leetcode
Lumos1862 小时前
故障保护与鲁棒性(十七)
算法
手写码匠2 小时前
从零实现大模型推理引擎:Continuous Batching 与动态调度系统深度解析
人工智能·深度学习·算法·aigc
wabs6662 小时前
关于单调栈【力扣503.下一个更大元素II的思考】
算法·单调栈
c238562 小时前
下篇:伸缩魔法!进阶吃透可变滑动窗口篇
c++·算法