深度學習入門Day10:深度強化學習原理與實戰全解析

一、開篇:智能決策的科學與藝術

在前九天的學習中,我們掌握了處理各種數據類型的深度學習方法,但這些都屬于"被動學習"——模型從靜態數據中學習模式。今天,我們將進入一個全新的領域:強化學習(Reinforcement Learning, RL)。這是一種讓智能體通過與環境交互來學習最優決策的范式,更接近人類和動物的自然學習方式。

從AlphaGo戰勝世界冠軍到自動駕駛汽車的決策系統,從游戲AI到機器人控制,強化學習正在創造著一個又一個突破。

二、強化學習基礎:理解MDP框架

2.1 什么是馬爾可夫決策過程(MDP)?

馬爾可夫決策過程是強化學習的數學基礎,它描述了一個智能體在環境中做決策的完整框架。MDP包含五個核心要素:

1. 狀態(State):環境當前情況的描述
2. 動作(Action):智能體可以執行的操作
3. 獎勵(Reward):環境對智能體動作的反饋
4. 狀態轉移概率:執行動作后狀態轉換的規律
5. 折扣因子(γ):權衡即時獎勵與未來獎勵的重要性

馬爾可夫性質:當前狀態包含所有歷史信息,未來只依賴于當前狀態而不依賴于過去的狀態序列。這是MDP的核心假設。

2.2 關鍵概念詳解

價值函數(Value Function):衡量在某個狀態(或狀態-動作對)下,智能體能夠獲得的期望累積獎勵。分為狀態價值函數V(s)和動作價值函數Q(s,a)。

貝爾曼方程:價值函數的遞歸定義,表達了當前價值與后續狀態價值之間的關系。這是強化學習算法的理論基礎。

探索與利用的權衡:智能體需要平衡嘗試新動作(探索)和選擇已知好動作(利用)之間的矛盾。這是強化學習獨有的挑戰。

三、深度Q學習:價值學習的革命

3.1 從Q-Learning到Deep Q-Network

Q-Learning是一種傳統的強化學習算法,它通過維護一個Q表格(狀態-動作值表)來學習最優策略。但在復雜環境中,狀態空間可能非常大,表格方法不再可行。

Deep Q-Network (DQN):2015年DeepMind提出的革命性算法,用神經網絡近似Q函數,解決了高維狀態空間的問題。DQN的核心創新:

1. 經驗回放(Experience Replay):存儲轉移樣本并在訓練時隨機采樣,打破數據間的相關性
2. 目標網絡(Target Network):使用獨立的網絡計算目標Q值,提高訓練穩定性

3.2 DQN實現詳解

神經網絡架構:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass DQN(nn.Module):def __init__(self, state_size, action_size):super(DQN, self).__init__()# 輸入層:狀態維度,輸出層:動作維度self.fc1 = nn.Linear(state_size, 64) ?# 第一全連接層self.fc2 = nn.Linear(64, 64) ? ? ? ? ?# 第二全連接層self.fc3 = nn.Linear(64, action_size) # 輸出每個動作的Q值def forward(self, x):# 前向傳播過程x = F.relu(self.fc1(x)) ?# 第一層+ReLU激活x = F.relu(self.fc2(x)) ?# 第二層+ReLU激活return self.fc3(x) ? ? ? # 輸出Q值,不需要激活函數

經驗回放緩沖區:

from collections import deque
import randomclass ReplayBuffer:def __init__(self, capacity=10000):self.buffer = deque(maxlen=capacity) ?# 固定大小的循環隊列def push(self, state, action, reward, next_state, done):# 存儲轉移樣本:(s, a, r, s', done)self.buffer.append((state, action, reward, next_state, done))def sample(self, batch_size):# 隨機采樣一批經驗return random.sample(self.buffer, batch_size)def __len__(self):return len(self.buffer)

目的:解決數據相關性數據效率問題

  • 打破相關性:在在線學習中,相鄰的經驗樣本(s_t, a_t, r_t, s_{t+1})是高度相關的。直接用它們順序訓練網絡會導致訓練不穩定且容易陷入局部最優。通過隨機采樣一批過去的經驗,可以打破這種相關性,使訓練過程更加平滑穩定。
  • 提高數據效率:每一個經驗樣本都可以被多次使用,而不是用一次就丟棄,極大地提高了數據的利用效率。

實現細節

  • 使用?deque?并設置?maxlen?實現了一個固定大小的循環隊列(FIFO)。當緩沖區滿時,最舊的經驗會被自動移除。

  • sample(batch_size)?方法是我們從緩沖區中隨機抽取一個小批量經驗用于訓練的關鍵。

3.3 完整訓練算法

def train_dqn(env, agent, target_net, optimizer,?episodes=1000, batch_size=64, gamma=0.99,update_target_every=100):"""DQN訓練循環env: Gym環境agent: 在線Q網絡target_net: 目標Q網絡"""replay_buffer = ReplayBuffer()epsilon = 1.0 ?# 初始探索率eps_min = 0.01 ?# 最小探索率eps_decay = 0.995 ?# 探索率衰減for episode in range(episodes):state = env.reset()total_reward = 0done = Falsewhile not done:# ε-greedy探索策略if random.random() < epsilon:action = env.action_space.sample() ?# 隨機探索else:with torch.no_grad():state_tensor = torch.FloatTensor(state).unsqueeze(0)q_values = agent(state_tensor)action = q_values.argmax().item() ?# 選擇最優動作# 執行動作并觀察結果next_state, reward, done, _ = env.step(action)replay_buffer.push(state, action, reward, next_state, done)total_reward += rewardstate = next_state# 經驗回放更新if len(replay_buffer) >= batch_size:batch = replay_buffer.sample(batch_size)states, actions, rewards, next_states, dones = zip(*batch)# 轉換為張量states = torch.FloatTensor(states)actions = torch.LongTensor(actions).unsqueeze(1)rewards = torch.FloatTensor(rewards)next_states = torch.FloatTensor(next_states)dones = torch.BoolTensor(dones)# 計算當前Q值current_q = agent(states).gather(1, actions)# 計算目標Q值(使用目標網絡)with torch.no_grad():next_q = target_net(next_states).max(1)[0]target_q = rewards + gamma * next_q * (~dones)# 計算損失并更新loss = F.mse_loss(current_q.squeeze(), target_q)optimizer.zero_grad()loss.backward()optimizer.step()# 更新目標網絡if episode % update_target_every == 0:target_net.load_state_dict(agent.state_dict())# 衰減探索率epsilon = max(eps_min, epsilon * eps_decay)print(f"Episode {episode}, Reward: {total_reward}, Epsilon: {epsilon:.3f}")

四、策略梯度方法:直接優化策略

4.1 從價值學習到策略學習

與DQN等價值學習方法不同,策略梯度方法直接學習策略函數π(a|s),即狀態到動作的映射。這類方法的優勢:

1. 更適合連續動作空間
2. 能學習隨機策略
3. 更好的收斂特性

4.2 REINFORCE算法

REINFORCE是最基礎的策略梯度算法,使用蒙特卡洛方法估計梯度:

class PolicyNetwork(nn.Module):def __init__(self, state_size, action_size):super(PolicyNetwork, self).__init__()self.fc1 = nn.Linear(state_size, 64)self.fc2 = nn.Linear(64, 64)self.fc3 = nn.Linear(64, action_size)def forward(self, x):x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))return F.softmax(self.fc3(x), dim=-1) ?# 輸出動作概率def compute_returns(rewards, gamma=0.99):"""計算累積回報"""returns = []G = 0for r in reversed(rewards):G = r + gamma * Greturns.insert(0, G)return returns

4.3 演員-評論家架構

演員-評論家(Actor-Critic)方法結合了策略梯度和價值學習的優點:
- 演員(Actor):學習策略函數,決定執行什么動作
- 評論家(Critic):學習價值函數,評估動作的好壞

class ActorCritic(nn.Module):def __init__(self, state_size, action_size):super(ActorCritic, self).__init__()# 共享特征提取層self.fc1 = nn.Linear(state_size, 64)self.fc2 = nn.Linear(64, 64)# 演員網絡(策略)self.actor = nn.Linear(64, action_size)# 評論家網絡(價值)self.critic = nn.Linear(64, 1)def forward(self, x):x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))policy = F.softmax(self.actor(x), dim=-1)value = self.critic(x)return policy, value

五、實戰應用:OpenAI Gym環境

5.1 CartPole平衡任務

CartPole是一個經典的強化學習測試環境:控制小車保持桿子平衡。

import gymdef run_cartpole():env = gym.make('CartPole-v1')state_size = env.observation_space.shape[0]action_size = env.action_space.n# 初始化網絡agent = DQN(state_size, action_size)target_net = DQN(state_size, action_size)target_net.load_state_dict(agent.state_dict())optimizer = torch.optim.Adam(agent.parameters(), lr=1e-3)# 開始訓練train_dqn(env, agent, target_net, optimizer, episodes=500)# 測試訓練效果test_agent(env, agent)def test_agent(env, agent):state = env.reset()total_reward = 0while True:env.render() ?# 顯示環境with torch.no_grad():state_tensor = torch.FloatTensor(state).unsqueeze(0)action = agent(state_tensor).argmax().item()state, reward, done, _ = env.step(action)total_reward += rewardif done:breakprint(f"測試得分: {total_reward}")env.close()

5.2 訓練效果分析

在CartPole環境中,成功標準通常是連續100回合平均得分達到195以上。通過調整超參數和訓練策略,我們可以觀察到:

1. 探索率衰減:初期高探索率幫助發現好策略,后期低探索率穩定性能
2. 目標網絡更新頻率:影響訓練穩定性的關鍵參數
3. 批大小和學習率:需要仔細調優以獲得最佳性能

六、學習總結與明日計劃

6.1 今日核心成果

? 理解馬爾可夫決策過程的基本概念 ?
? 掌握價值函數、貝爾曼方程等理論基礎 ?
? 實現深度Q網絡及其關鍵組件(經驗回放、目標網絡) ?
? 了解策略梯度方法和演員-評論家架構 ?
? 在CartPole環境中成功訓練智能體 ?

6.2 關鍵問題記錄

? 如何設計合適的獎勵函數引導智能體學習 ?
? 超參數調優的系統性方法 ?
? 從仿真環境到真實應用的遷移挑戰 ?

6.3 明日學習重點

- 元學習基礎概念與算法框架
- 模型無關元學習(MAML)原理與實現
- 少樣本學習在實際任務中的應用
- 快速適應新任務的能力構建

七、資源推薦與延伸閱讀

1. OpenAI Spinning Up:最好的強化學習入門教程,包含理論解釋和代碼實現
2. 強化學習導論:Richard Sutton的經典教材,被譽為"強化學習圣經"
3. DeepMind強化學習課程:DeepMind研究人員的視頻講解
4. Stable Baselines3:基于PyTorch的強化學習算法庫,包含多種先進算法實現

八、工程實踐建議

1. 獎勵設計原則:
- 獎勵應該與最終目標一致
- 避免稀疏獎勵問題(提供中間獎勵)
- 適當縮放獎勵數值范圍

2. 超參數調優指南:

參數推薦范圍作用
學習率1e-4 ~ 1e-3控制參數更新步長
折扣因子γ0.9 ~ 0.99未來獎勵的重要性
回放緩沖區大小1e4 ~ 1e6經驗存儲容量
目標網絡更新頻率100 ~ 1000步控制訓練穩定性

3. 調試與監控指標:
# 關鍵監控指標
- 回合獎勵(Episode Reward)
- Q值損失(Q-value Loss)
- 探索率(Epsilon)
- 平均Q值(Average Q-value)
- 策略熵(Policy Entropy)- 對于策略梯度方法

下篇預告:《Day11:元學習入門—讓模型學會如何學習》 ?
將探索如何讓機器學習模型具備快速適應新任務的能力,實現真正的"學會學習"!我們將學習MAML等元學習算法,并實現少樣本學習系統。

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

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

相關文章

Jenkins Pipeline(二)-設置Docker Agent

設計流水線的目的是更方便地使用 Docker鏡像作為單個 Stage或整個流水線的執行環境。 1.安裝必要插件 在Jenkins服務器上已經安裝了插件。 Docker PipelinePipeline Maven IntegrationPipeline Maven Plugin API 如果插件缺少什么&#xff0c;再次檢查并安裝即可。 2. 配…

神經網絡|(十六)概率論基礎知識-伽馬函數·中

【1】引言 前序學習進程中&#xff0c;已經初步了解了伽馬函數&#xff0c;認識到nnn的階乘計算可以轉化為&#xff1a; n!n!?limk→∞kn?k!(nk)!limk→∞kn?k!?n!(nk)!limk→∞kn?k!(n1)(n2)...(nk)n!n! \cdot lim_{k\rightarrow\infty}\frac{k^n\cdot k!}{(nk)!}\\lim_…

設計模式Books Reading

文章目錄 設計模式 創建型設計模式 工廠方法 示例說明 工廠方法模式結構 案例偽代碼 工廠方法模式適合應用 實現方式 工廠方法模式優缺點 與其他模式的關系 概念示例 抽象工廠 抽象工廠模式結構 抽象工廠模式適合應用場景 實現方式 抽象工廠模式優缺點 與其他模式的關系 代碼示…

接吻數問題:從球體堆疊到高維空間的數學奧秘

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1 接吻數問題概述 接吻數問題&#xff08;Kissing Number Problem&am…

深度學習③【卷積神經網絡(CNN)詳解:從卷積核到特征提取的視覺革命(概念篇)】

文章目錄先言1. 卷積核&#xff1a;特征檢測的魔法窗口1.1什么是卷積核&#xff1a;可學習的特征檢測器1.2可視化理解&#xff1a;邊緣檢測、紋理提取、特征發現1.3代碼實現&#xff1a;使用PyTorch定義和初始化卷積層2. 卷積運算的數學原理2.1.離散卷積計算&#xff1a;滑動窗…

當不想安裝telnet或nc時,可使用 Linux 系統默認自帶的bash原生網絡功能或ping(輔助判斷)測試連通性

1. 用bash原生/dev/tcp測試端口&#xff08;無需任何工具&#xff09;bashshell 內置了/dev/tcp虛擬設備&#xff0c;可直接通過腳本測試端口是否能連接&#xff0c;執行以下命令&#xff08;替換數據庫 IP 和端口&#xff09;&#xff1a;# 格式&#xff1a;echo > /dev/tc…

【STM32外設】ADC

聲明&#xff1a;上圖是STM32產品型號各字段含義&#xff0c;本文基于STM32F103 1、ADC的一些概念 常規通道(常規組)和注入通道(注入組)&#xff08;regular channels and injected channels&#xff09;ADC支持的外部通道總共16個&#xff08;且被3個ADC共享&#xff0c;ADC12…

Aha Moment——啊哈時刻!

1. 理解面試官的意圖面試官問你“Aha moment”&#xff0c;其實是想知道&#xff1a;你是否真正理解這個概念&#xff1a;不只是背定義&#xff0c;而是理解其為什么重要。你如何發現它&#xff1a;考察你的數據分析方法論和技術能力&#xff08;用了哪些數據、指標、模型&…

RAG教程5:多表示索引和ColBERT

文章目錄 導入依賴包 多表示索引 ColBERT 導入依賴包 %pip install youtube-transcript-api pytube多表示索引 from langchain_community.document_loaders import WebBaseLoader from langchain_text_splitters import RecursiveCharacterTextSplitterloader = WebBaseL

來自火山引擎的 MCP 安全授權新范式

資料來源&#xff1a;火山引擎-開發者社區 本文旨在深入剖析火山引擎 Model Context Protocol (MCP) 開放生態下的 OAuth 授權安全挑戰&#xff0c;并系統闡述火山引擎為此構建的多層次、縱深防御安全方案。面對由 OAuth 2.0 動態客戶端注冊帶來的靈活性與潛在風險&#xff0c;…

瑞芯微RK3506開發板PWM輸入捕獲驅動調試記錄

本文演示PWM輸入信號采集&#xff0c;基于觸覺智能RK3506開發板。配置為&#xff1a; 3核Cortex-A7Cortex-M0多核異構處理器 主要接口&#xff1a;2路CAN FD&#xff0c;5路串口&#xff0c;RGB、MIPI、音頻、USB2.0 OTG等、板載雙百兆網口4G星閃SLEWiFi6BLE5.2。 PWM信號簡…

PHP的header()函數分析

PHP的header()函數是HTTP協議交互的核心工具&#xff0c;它通過直接操縱響應頭實現服務器與客戶端之間的元數據通信。作為PHP原生函數&#xff0c;其設計初衷是處理HTTP協議層的關鍵操作&#xff0c;包括狀態碼設置、內容類型聲明和緩存控制等基礎功能。在Web開發中&#xff0c…

根據并發和響應延遲,實現語音識別接口自動切換需求

根據并發和響應延遲&#xff0c;語音識別接口自動 切換需求 需求描述&#xff1a; 當請求的語音識別的請求數量大于3或者請求語音識別接口3秒不可達無響應&#xff0c;切換備用語音識別接口 科大訊飛語音識別作為備用接口 科大訊飛的API文檔: 進入訊飛開放平臺的網頁&#…

程序員之電工基礎-CV程序解決目標檢測

一、背景 興趣愛好來了&#xff0c;決定研發一個產品。涉及到電工和機械等知識&#xff0c;所以記錄一下相關的基礎知識。今天的內容又回到了我的主營板塊&#xff01;&#xff01;哈哈&#xff01;&#xff01;為后續整體集成做準備&#xff0c;先測試目標檢測部分的能力。 二…

B樹的概述以及插入邏輯

一&#xff0c;B樹的概述1.B樹(B-樹)又稱多路平衡查找樹&#xff0c;B樹所有節點中孩子數量的最大值n稱為B樹的階&#xff0c;通常用m表示比如當m為2就是常見的二叉樹一顆m階的B樹定義如下&#xff1a;1)每個結點最多有m-1個關鍵字&#xff1b;2)根節點最少可以只有1個關鍵字;3…

如何用 Kotlin 在 Android 手機開發一個小鬧鐘、計時器、秒表

以下是在 Android 上用 Kotlin 開發小鬧鐘、計時器和秒表的方法&#xff0c;分為核心功能實現和界面設計兩部分&#xff1a; 鬧鐘功能實現 AlarmManager 和 BroadcastReceiver // 設置鬧鐘 val alarmManager getSystemService(Context.ALARM_SERVICE) as AlarmManager val i…

LeetCode Hot 100 第8天

1. 73 矩陣置零&#xff08;記錄標識&#xff09; 鏈接&#xff1a;題目鏈接 題解&#xff1a; 題解 時間復雜度O(n*m)&#xff1a; 方案1(空間復雜度O(n m))&#xff1a;matrix[i][j] 0&#xff0c;意味著 第i行、第j列所有元素都要置為0&#xff1b;維護能置為0行、列的集…

Python OpenCV圖像處理與深度學習:Python OpenCV開發環境搭建與入門

Python OpenCV入門&#xff1a;環境設置 學習目標 通過本課程&#xff0c;學員們將學習在Windows、macOS和Linux操作系統上安裝Python和OpenCV&#xff0c;配置開發環境&#xff0c;以及如何使用Jupyter Notebook和PyCharm等集成開發環境&#xff08;IDE&#xff09;進行基本操…

【論文閱讀】SegCLIP:用于高分辨率遙感圖像語義分割的多模態視覺語言和快速學習

【論文閱讀】SegCLIP&#xff1a;用于高分辨率遙感圖像語義分割的多模態視覺語言和快速學習 文章目錄【論文閱讀】SegCLIP&#xff1a;用于高分辨率遙感圖像語義分割的多模態視覺語言和快速學習一、介紹二、聯系工作三、方法四、實驗結果**數據集**SegCLIP: Multimodal Visual-…

Anaconda、OpenCV安裝配置方法

目錄 1.Anaconda安裝 1.1 國內鏡像軟件下載 1.2 點擊exe&#xff0c;一路下一步安裝 1.3 檢查安裝情況 1.3.1 安裝前后系統環境變量變化對比 1.3.2 查看安裝路徑和版本 1.4 Anaconda自帶的python版本查看命令如下&#xff1a; 1.5 修改鏡像地址&#xff0c;加快下載包的…