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

举报
GeorgePanda 发表于 2026/06/09 14:19:21 2026/06/09
【摘要】 【算法】强化学习中奖励和损失函数的关系奖励是环境的"评分",损失函数是优化器的"指导手册"。奖励告诉我们"什么好什么坏",损失函数告诉优化器"如何调整神经元的权重,让好的动作更可能发生"。在强化学习中,奖励是目标,损失函数是手段,两者缺一不可。 一、前言概念作用对象用途来源奖励 (Reward)策略(Policy)评估动作好坏环境给出损失函数 (Loss)神经网络参数更新网络权重基于奖励构...

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

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

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

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

一、前言

概念 作用对象 用途 来源
奖励 (Reward) 策略(Policy) 评估动作好坏 环境给出
损失函数 (Loss) 神经网络参数 更新网络权重 基于奖励构造

详细解释

┌─────────────────────────────────────────────────────────────────┐
│                     强化学习训练流程                              │
├─────────────────────────────────────────────────────────────────┤
│                                                                 │
│   环境 (Environment)                                            │
│      ↓ 给出奖励 r                                               │
│   奖励信号: "这个动作得10分"                                     │
│      ↓                                                          │
│   策略网络 (Policy Network) ← 神经网络,需要训练                  │
│      ↓ 构造损失函数                                              │
│   损失 = -log(π(a|s)) * Advantage  ← 把奖励转化为梯度            │
│      ↓ 反向传播                                                  │
│   优化器更新网络参数 (weights/biases)                            │
│      ↓                                                          │
│   策略改进: 更好的动作获得更高概率                                │
│                                                                 │
└─────────────────────────────────────────────────────────────────┘

二、损失函数是给谁用的?

损失函数是给优化器用的,用来更新神经网络的参数(weights和biases)。

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)
                                   ↓
                              狗学会更好地"坐下"

关键要点

问题 答案
损失函数给谁用? 优化器,用来更新网络参数
奖励给谁用? 策略,用来评估动作好坏
两者关系? 奖励是信号,损失是基于奖励构造的可微分函数
没有损失函数能训练吗? 不能,因为需要梯度来更新参数
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。