1. 程式人生 > >Reinforcement Learning強化學習系列之五:值近似方法Value Approximation

Reinforcement Learning強化學習系列之五:值近似方法Value Approximation

引言

前面說到了強化學習中的蒙特卡洛方法(MC)以及時序差分(TD)的方法,這些方法針對的基本是離散的資料,而一些連續的狀態則很難表示,對於這種情況,通常在強化學習裡有2中方法,一種是針對value function的方法,也就是本文中提到的值近似(value approximation);另一種則是後面要講到的policy gradient。

值近似的方法

這裡寫圖片描述
值近似的方法根本上是使用一個值函式來近似表示該狀態的返回值,對於狀態S,在一個序列中間,我們使用一個引數函式v^(S,w)來近似表示觀測到的真實值vπ(S),學習使用普通的梯度下降的方式進行,對於一個觀察序列的每一個step均可以作為一個訓練的過程。當然這個值函式可以加上動作

a表示成為Q函式的近似v^(S,a,w)

示例

這裡寫圖片描述
問題描述:一個汽車從谷底向上開,但是汽車的馬力不足以支撐其到終點,因此最好的策略是需要先開到谷底的左邊然後再加速,利用一部分慣性到達終點。

  1. 這裡面的狀態可以描述為:(xt),(xt^)
  2. 動作空間為3個,1,0,1,分別表示全力向左,不動和全力向右
  3. 狀態序列更新的方式為:
    xt+1=bound[xt+xt+1^]
    xt+1^=bound[xt^+0.001A
    0.0025cos(3xt)]

這裡bound表示其約束範圍,橫軸座標xt的範圍是1.5xt0.5,速度的範圍是0.07xt^0.07,當xt行到最座標的時候,將會被置零。

在本示例中,將使用Q-learning的值近似方法,採用的線性函式來表示Q函式。

實驗環境

實驗將基於openAI所提供的gym包的mountaincar-v0這一個環境,openAI提供了很多的遊戲環境,都可以進行相關的強化學習實驗。
openAI目前支援mac OS 和Linux環境,可以直接使用pip install gym的方式安裝其最新的版本的gym,但是對於python2.7來說,安裝最新的版本0.9.6,可能會出現cannot import name spaces

的問題,選擇安裝0.9.5則沒有這個問題

關鍵程式碼

class Estimator(object):
    def __init__(self):
        self.models=[]
        for _ in range(env.action_space.n):
            model = SGDRegressor(learning_rate="constant")
            model.partial_fit([self.feature_state(env.reset())],[0])
            self.models.append(model)

    def predict(self,s,a=None):
        s=self.feature_state(s)
        if a:
            return self.models[a].predict([s])[0]
        else:
            return [self.models[m].predict([s])[0] for m in range(env.action_space.n)]

    def update(self,s,a,target):
        s=self.feature_state(s)
        self.models[a].partial_fit([s],[target])

    def feature_state(self,s):

        return featurizer.transform(scaler.transform([s]))[0]

def make_epsilon_greedy_policy(estimator,nA,epsilon):

    def epsilon_greedy_policy(observation):

        best_action = np.argmax(estimator.predict(observation))
        A =np.ones(nA,dtype=np.float32)*epsilon/nA
        A[best_action] += 1-epsilon
        return A

    return epsilon_greedy_policy


def Q_learning_with_value_approximation(env,estimator,epoch_num
                                        ,discount_factor=1.0, epsilon=0.1, epsilon_decay=1.0):

    # stats = plotting.EpisodeStats(
    #     episode_lengths=np.zeros(epoch_num),
    #     episode_rewards=np.zeros(epoch_num))
    for i_epoch_num in range(epoch_num):

        policy = make_epsilon_greedy_policy\
            (estimator,env.action_space.n,epsilon*epsilon_decay**i_epoch_num)
        state = env.reset()

        for it in itertools.count():

            action_probs = policy(state)
            action = np.random.choice(np.arange(len(action_probs)), p=action_probs)

            next_state,reward,done,_=env.step(action)
            q_values_next = estimator.predict(next_state)
            td_target = reward + discount_factor * np.max(q_values_next)
            estimator.update(state, action, td_target)

            # stats.episode_rewards[i_epoch_num] += reward
            # stats.episode_lengths[i_epoch_num] = it
            print("\rStep {} @ Episode {}/{}".format(it, i_epoch_num + 1, epoch_num))

            if done:
                print it
                break
            state = next_state

其中,將兩個狀態引數使用RBF核函式進行轉換為一維長度為400的特徵向量,使用的普通的SGDRegressor。

結果

執行100代後的函式cost值為
這裡寫圖片描述

程式碼連結

相關推薦

Reinforcement Learning強化學習系列近似方法Value Approximation

引言 前面說到了強化學習中的蒙特卡洛方法(MC)以及時序差分(TD)的方法,這些方法針對的基本是離散的資料,而一些連續的狀態則很難表示,對於這種情況,通常在強化學習裡有2中方法,一種是針對value function的方法,也就是本文中提到的值近似(value

Reinforcement Learning強化學習系列MC prediction

引言 這幾個月一直在忙找工作和畢業論文的事情,部落格擱置了一段時間,現在稍微有點空閒時間,又啃起了強化學習的東西,今天主要介紹的是強化學習的免模型學習free-model learning中的最基礎的部分蒙特卡洛方法(Monte Carlo),並以21點遊戲作

Reinforcement Learning強化學習系列之一model-based learning

前言 在機器學習和深度學習坑裡呆了有一些時日了,在阿里實習過程中,也感覺到了工業界和學術界的一些迥異,比如強化學習在工業界用的非常廣泛,而自己之前沒有怎麼接觸過強化學習的一些知識,所以感覺還是要好好的補一補更新一下自己的知識庫,以免被AI時代拋棄。 強化

Netty4.0學習筆記系列自定義通訊協議

實現的原理是通過Encoder把java物件轉換成ByteBuf流進行傳輸,通過Decoder把ByteBuf轉換成java物件進行處理,處理邏輯如下圖所示: 傳輸的Java bean為Person: package com.guowl.testobjcoder

強化學習系列蒙特卡羅方法(Monte Carlo)

一、前言 在強化學習系列(四):動態規劃中,我們介紹了採用DP (動態規劃)方法求解environment model 已知的MDP(馬爾科夫決策過程),那麼當environment model資訊不全的時候,我們會採用什麼樣的方法求解呢?蒙特卡洛方法(Mon

深入理解Tomcat系列Context容器和Wrapper容器

ssa stream servlet實例 可用 igel sse ould rip alt 前言 Context容器是一個Web項目的代表,主要管理Servlet實例,在Tomcat中Servlet實例是以Wrapper出現的。如今問題是怎樣才幹通過C

數據庫面試系列mysql的存儲引擎

當前 查看 efault 表鎖 blog 如果 show 事務 測試 mysql的默認存儲引擎是innoDB,是唯一一個支持事務和支持外鍵的存儲引擎, 可以通過:show variables like ‘default_storage_engine‘;查看當前數據庫到默認引

Office 365 系列創建新用戶

office365 創建賬號、分配許可 本章節跟大家分享怎麽去創建新用戶、分配許可以及修改用戶後綴和電子郵件地址。 登錄 Office 365 管理中心,點擊“用戶”--“活動用戶”--“+添加用戶”; 參照截圖,輸入對應的姓名、顯示名、登錄名、密碼等信息點擊“添加”

mongo 3.4分片集群系列詳解平衡器

大致 mongos 搭建 一次 相對 時間 表示 部分 man 這個系列大致想跟大家分享以下篇章(我會持續更新的↖(^ω^)↗): 1、mongo 3.4分片集群系列之一:淺談分片集群 2、mongo 3.4分片集群系列之二:搭建分片集群--哈希分片 3、mongo 3.4

大數據學習系列 ----- Hive整合HBase圖文詳解

scala direct ont 增加 pac hadoop2 exe dfs- min 引言 在上一篇 大數據學習系列之四 ----- Hadoop+Hive環境搭建圖文詳解(單機) 和之前的大數據學習系列之二 ----- HBase環境搭建(單機) 中成功搭建了Hive

Spark2.0機器學習系列7 MLPC(多層神經網絡)

element nbsp hid 隨機梯度下降 support file dict 分類器 希望 Spark2.0 MLPC(多層神經網絡分類器)算法概述 MultilayerPerceptronClassifier(MLPC)這是一個基於前饋神經網絡的分類器,它是一種在

多線程系列Balking 模式

實現 vat 正常 bject ret .get 完全 .data 工具 一,什麽是Balking模式 如果現在不合適執行這個操作,或者沒必要執行這個操作,就停止處理,直接返回。在Balking模式中,如果守護條件不成立,就立即中斷處理。 二,例子: 定期將當前數據內容寫入

[Reinforcement Learning] 強化學習介紹

nes function ssi 屬於 發展 當前 nts view 方式 隨著AlphaGo和AlphaZero的出現,強化學習相關算法在這幾年引起了學術界和工業界的重視。最近也翻了很多強化學習的資料,有時間了還是得自己動腦筋整理一下。 強化學習定義 先借用維基百科上對強

Memcached學習筆記同一臺Windows機器中啟動多個Memcached服務

如果手頭上只有一臺機器,又想做多節點測試咋辦? 這就需要在一臺機器上啟動多個Memcached服務了。 假設Memcached在如下目錄:C:\memcached\memcached.exe 在CMD中執行如下命令即可再安裝一個Memcached服務(記得換個埠號啊!): sc cr

Kubernetes系列使用yaml檔案建立service向外暴露服務

Service和Pod的理論介紹,方便繼續下去 Pod是有生命週期的,使用凡人皆有一死來描述pod很貼切,當一個工作節點(node)銷燬時,節點上執行的pods也會被銷燬, ReplicationController會動態地在其他節點上建立Pod來保持應用程式的執行,每一個Pod都有一個

Spring Boot 系列Spring Boot 通過devtools進行熱部署

前面已經分享過四篇學習文章: 1、Spring Boot 系統之一:Spring Boot 入門 2、Spring Boot 系統之二:Spring Boot 修改預設埠號和context path 3、Spring Boot 系統之三:Spring Boot 整合JdbcTemplat

碼農裝13寶典系列Ubuntu自定義字型縮放級別

目前主流顯示器都有一個很高的解析度,而使用預設的解析度會使字型顯示過小,單純地調整解析度又容易讓字看起來發虛。 系統提供了一個字型縮放級別調整的功能。Windows初始化時就已經為使用者設定好了,而Ubuntu只有兩個選項:100%、200%,顯然不能滿足需求。 那怎麼辦? 這裡需要

Jenkins學習使用Opening Robot Framework report failed問題

一、Jenkins中Robot Framework Plugin已經安裝好,結果收集正確,只是構建log.html、report.html等日誌檔案無法開啟檢視: 點選Open report.html和Open log.html無法開啟,提示如下錯誤: * Verify th

輕鬆上雲系列阿里雲容災與備份方案

災備能力是各類雲產品能力與穩定性非常重要的衡量指標,猶記得某友商雲因為資料丟失被索賠1000多萬的慘痛教訓。保障企業業務穩定、IT系統功能正常、資料安全十分重要。因此可以同時保障資料備份與系統、應用容災的災備解決方案應勢而生,且發展迅速。 下面我們來看,在阿里雲和阿里雲產品都有哪些災備的解決方案和能力。

Docker系列Volume 卷的使用——以Redis為例

簡介 卷在Docker裡非常重要,在系統之三中提到過,Docker利用聯合載入技術在root檔案系統層上載入更多的只讀檔案系統,這裡簡稱聯合檔案系統(Union File System),卷是在一個或者多個容器內被選定的目錄,可以繞過這個聯合檔案系統為Docker提供持久資