強化學習:策略梯度概念

2.策略梯度方法

目標是使策略 不斷更新,回報更高。

計算每一個軌跡的回報,和對應的概率
目標是使回報高的軌跡概率應該高。這樣整個策略的期望回報也會高。

什么是策略期望回報?
就是用這個策略跑了若干個軌跡,得到回報,然后求平均

2.1 策略梯度的主要原理

![外鏈圖片轉存失敗,源

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

    # 1. 采樣一個完整的 episodelog_probs = []  # 存儲每個 (s_t, a_t) 的 log π(a_t|s_t)rewards = []    # 存儲每個時間步的獎勵 r_twhile not done:action_probs = policy_net(state_tensor)  # π(a|s)action = sample_action(action_probs)     # a_t ~ π(a|s)log_prob = torch.log(action_probs[action])  # log π(a_t|s_t)log_probs.append(log_prob)next_state, reward, done = env.step(action)rewards.append(reward)# 2. 計算每個時間步的折扣回報 G_tdiscounted_rewards = compute_discounted_rewards(rewards, gamma=0.99)# 3. 計算策略梯度損失policy_loss = []for log_prob, G_t in zip(log_probs, discounted_rewards):policy_loss.append(-log_prob * G_t)  # 負號因為 PyTorch 默認做梯度下降# 4. 反向傳播total_loss = torch.stack(policy_loss).sum()  # 求和所有時間步的損失optimizer.zero_grad()total_loss.backward()  # 計算梯度 ?θ J(θ)optimizer.step()       # 更新 θ ← θ + α ?θ J(θ)

2.2 Reinforce 算法,也稱為蒙特卡洛策略梯度,是一種策略梯度算法,它使用來自整個 episode 的估計回報來更新策略參數

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as Fclass PolicyNetwork(nn.Module):"""策略網絡,輸入狀態,輸出動作概率"""def __init__(self, state_dim, action_dim, hidden_dim=64):super(PolicyNetwork, self).__init__()self.fc1 = nn.Linear(state_dim, hidden_dim)self.fc2 = nn.Linear(hidden_dim, action_dim)def forward(self, x):x = F.relu(self.fc1(x))x = F.softmax(self.fc2(x), dim=-1)return xdef reinforce(env, policy_net, optimizer, num_episodes=1000, gamma=0.99):"""REINFORCE算法實現參數:env: 環境policy_net: 策略網絡optimizer: 優化器num_episodes: 訓練episode數量gamma: 折扣因子返回:每個episode的獎勵列表"""episode_rewards = []for episode in range(num_episodes):state = env.reset()log_probs = []rewards = []# 采樣一個完整的episodedone = Falsewhile not done:# 將狀態轉換為tensorstate_tensor = torch.FloatTensor(state).unsqueeze(0)  # shape: (1, state_dim)# 通過策略網絡獲取動作概率action_probs = policy_net(state_tensor)  # shape: (1, action_dim)# 從概率分布中采樣一個動作action = torch.multinomial(action_probs, 1).item()# 也可以# dist = torch.distributions.Categorical(action_probs)# action = dist.sample()  # 標量值# 計算動作的log概率log_prob = torch.log(action_probs.squeeze(0)[action])  # shape: scalar# 執行動作next_state, reward, done, _ = env.step(action)# 存儲log概率和獎勵log_probs.append(log_prob)rewards.append(reward)# 更新狀態state = next_state# 計算episode的折扣回報discounted_rewards = []R = 0for r in reversed(rewards):R = r + gamma * Rdiscounted_rewards.insert(0, R)# 標準化折扣回報(減少方差)discounted_rewards = torch.FloatTensor(discounted_rewards)discounted_rewards = (discounted_rewards - discounted_rewards.mean()) / (discounted_rewards.std() + 1e-9)# 計算策略梯度損失policy_loss = []for log_prob, R in zip(log_probs, discounted_rewards):policy_loss.append(-log_prob * R)  # 負號因為我們要最大化回報# 反向傳播optimizer.zero_grad()policy_loss = torch.stack(policy_loss).sum()  # shape: scalarpolicy_loss.backward()optimizer.step()# 記錄總獎勵episode_rewards.append(sum(rewards))return episode_rewards

開始以為policy_loss 計算的是策略梯度,感覺很不合理,其實不是的,差了一個求導呢。

在這里插入圖片描述

在這里插入圖片描述

總結,policy_loss 的梯度 和 目標函數的梯度符號相反。
兩者的梯度 符號相反。因此最大化目標函數等于最小化policy_loss

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909220.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909220.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909220.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java 中高級開發崗技能與面試要點梳理

目錄 一、核心技術深度掌握 (一)Java 語言高階特性 JVM 底層原理剖析 并發編程高級應用 Java 新特性實戰 (二)主流框架與中間件精通 Spring 生態全面掌控 分布式中間件實戰精通 (三)數據庫與存儲優化專家 SQL 與 ORM 高級應用 分庫分表實戰 NoSQL 實戰(Elas…

職場生存發展指南 | 邊界 / 責任 / 社交 / 情緒

注:本文為“職場生存發展”相關合輯。 略作重排,未整理去重。 如有內容異常,請看原文。 職場生存發展指南 | 邊界 / 責任 / 社交 / 情緒 職場如江湖,充滿機遇與挑戰。在單位中立足,需深諳生存智慧——既要守住底線、…

vue3 daterange正則踩坑

<el-form-item label"空置時間" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"開始日期" end-placeholder"結束日期" clearable :editable"fal…

linux中執行腳本命令的source和“.”和“./”的區別

在 Linux 或類 Unix 系統中&#xff0c;source、. 和 ./ 的使用場景各有不同&#xff0c;以下詳細介紹何時使用它們&#xff1a; 命令用途適合場景source和“.”等效。腳本在當前 shell 環境中執行并影響當前 shell 的狀態和環境變量 1. 加載環境變量配置文件&#xff0c;無需…

games101 hw1

原理 背景 將三維空間中一個旋轉的三角形&#xff0c;顯示在屏幕上。 假設三角形初始點位為 v0(2.0, 0.0, ?2.0), v1(0.0, 2.0, ?2.0), v2(?2.0, 0.0, ?2.0), 你需要將這三個點的坐標變換為屏幕坐標并在屏幕上繪制出對應的線框三角形。 mvp AI回答&#xff1a; 在計算機…

Mybatis逆向工程詳解(附源碼文件)動態創建實體類、條件擴展類、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的學習進度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步楊帆旗航。 那么接下來就給大家出一期有關 Mybatis 逆向工程的教學&#xff0c;希望能對大家有所幫助&#xff0c;也特別歡迎大家指點不足之處&#xff0c;小生很樂意接受正確的建議&…

android studio中修改java邏輯對應配置的xml文件

在android studio新建一個activity&#xff0c;自動生成一個xml&#xff0c;可以更改到另一個xml嗎&#xff1f; 可以。 新建一個activity&#xff1a; 如下 上圖中的activity_second為xml文件&#xff0c;SecondActivity為java文件。點擊后&#xff0c; AndroidManifest.x…

@SchedulerLock處理Spring Task在分布式環境下的重復執行問題

本文大綱&#x1f4d6; 1、背景&#x1f342;2、SchedulerLock注解3、實現原理 1、背景&#x1f342; Spring生態下&#xff0c;日常開發定時任務&#xff0c;使用Spring Task框架還是很常見的選擇&#xff0c;但Spring Task并不是為分布式環境設計的&#xff0c;分布式環境下…

Prompt工程指南中文版

Prompt-Engineering-Guide-zh Prompt工程指南中文版 github 本文翻譯改編自 Dair-ai/Prompt-Engineering-Guide 中文原帖地址為 大型語言模型Prompt書寫指南 為了方便理解以及補充缺少的知識點&#xff0c;內容有所添改。除非另有說明&#xff0c;本文中所有的例子都是使用te…

「pandas 與 numpy」數據分析與處理全流程【數據分析全棧攻略:爬蟲+處理+可視化+報告】

- 第 106 篇 - Date: 2025 - 06 - 12 Author: 鄭龍浩&#xff08;仟墨&#xff09; 文中使用的所有文件在文章頂部的資源展示 數據分析與處理 「pandas 與 numpy」 文章目錄 數據分析與處理 「pandas 與 numpy」一了解數據處理1 數據處理2 數據分析第三方庫 二 numpy1 基本介紹…

Fastapi + vue3 自動化測試平臺(6):AI + Web UI的完美結合

&#x1f916;? AI Web自動化革命&#xff1a;用自然語言重塑測試體驗&#xff01; 基于FastAPI Vue3的下一代Web自動化測試平臺誕生&#xff01;將大語言模型 與 Web UI自動化深度結合&#xff0c;讓測試腳本維護進入自然語言時代 —— 告別繁瑣代碼&#xff0c;擁抱智能測…

【QT】 QGraphicsItem 獲取點坐標的幾種方法

目錄 1. 獲取圖元在場景中的位置 對于 QGraphicsEllipseItem&#xff08;點圖元&#xff09; 2. 從 QMap 獲取所有點坐標 3. 響應點擊事件獲取坐標 4. 獲取選中點的坐標 5. 坐標轉換說明 注意事項 在 Qt 圖形視圖框架中&#xff0c;從 QGraphicsItem&#xff08;特別是點…

伊吖學C筆記(6、數、求和、排列)

一、數 1.自然數、奇偶數 自然數也就是非負整數&#xff0c;C的循環語句很容易輸出自然數&#xff0c;比如&#xff1a;輸出100以內的自然數。 奇數、偶數也都是自然數&#xff1a; 2. 約數、因數 題目&#xff1a;一個數如果恰好等于它的因子之和&#xff0c;這個數就稱為“…

SpringMVC與Struts2對比教學

SpringMVC 和 Struts2 就像武林中的兩大門派&#xff0c;雖然都是處理 Web 請求的高手&#xff08;MVC 框架&#xff09;&#xff0c;但招式風格和內功心法大不相同。來&#xff0c;咱們用最接地氣的方式掰扯掰扯&#xff0c;保準你笑著記住&#xff01; 核心區別一句話概括&a…

Nginx配置指南與最佳實踐

Nginx 的配置文件通常位于 /etc/nginx/nginx.conf&#xff0c;并通過 include 指令加載其他目錄&#xff08;如 /etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/&#xff09;中的配置片段。以下是一個結構化指南&#xff1a; 核心配置結構 # 全局配置 (主上下文) user nginx…

Apache 反向代理Unity服務器

Apache 反向代理Unity服務器 前言項目使用PHPStudy開啟服務修改配置文件修改配置負載均衡&#xff08;可選&#xff09;重啟 總結 前言 使用Unity開了個后臺服務器&#xff0c;但是另一個Java服務器進行大量異步請求時會導致服務器回復過慢&#xff0c;所以開一個Apache緩沖一…

【力扣 簡單 C++】94. 二叉樹的中序遍歷

目錄 題目 解法一&#xff1a;遞歸 解法二&#xff1a;迭代 解法三&#xff1a;Morris遍歷 題目 解法一&#xff1a;遞歸 class Solution { private:void traverse(TreeNode* root, vector<int>& inorder){if (!root)return;traverse(root->left, inorder);i…

idea2024版本設置TODO快捷鍵

直接開干&#xff1a; 首先打開File–>Settings…–>Editor–>Live Templates 復制文本&#xff1a;//wk TODO $data$ 定義自定義todo使用范圍&#xff1a; 設置自定義todo的過濾器&#xff1a; 正式開始設置todo的過濾器&#xff1a; 復制文本&#xff1a; \bwk TO…

云原生核心技術 (12/12): 終章:使用 GitLab CI 將應用自動部署到 K8s (保姆級教程)

大家好&#xff0c;歡迎來到《云原生核心技術》系列的最終章&#xff01; 我們一起走過了漫長而充實的旅程。從 Docker 的集裝箱&#xff0c;到 K8s 這座自動化的數字港口&#xff1b;從部署單個 Pod&#xff0c;到構建復雜的有狀態應用。現在&#xff0c;我們站在了實現全自動…

DEVICENET轉MODBUS TCP網關連接ABB機器人配置案例

在工業自動化場景中&#xff0c;DeviceNet和Modbus TCP是兩種常見的通信協議。DeviceNet通常用于連接現場設備&#xff08;如傳感器、執行器等&#xff09;&#xff0c;而Modbus TCP則廣泛應用于以太網環境下的遠程監控和數據采集。當需要將基于DeviceNet協議的ABB機器人集成到…