午夜视频在线网站,日韩视频精品在线,中文字幕精品一区二区三区在线,在线播放精品,1024你懂我懂的旧版人,欧美日韩一级黄色片,一区二区三区在线观看视频

分享

DRL:強化學(xué)習(xí)理論基礎(chǔ)與實例

 15所 2020-10-16
  • 強化學(xué)習(xí)和監(jiān)督學(xué)習(xí)、無監(jiān)督學(xué)習(xí)的區(qū)別
  • RL解決什么問題
  • RL如何解決問題
  • 實例視頻
  • openAI and DeepMind
  • 馬爾科夫
  • 時序差分(Temporal-Difference)
  • 分類Model-freeModel-base基于概率基于價值回合更新單步更新在線學(xué)習(xí) on-Policy離線學(xué)習(xí) off-Policy
  • Q-learning
  • Q-learning 實例
  • Q-learning 算法更新
  • Q-learning 思維決策
  • sarsa 思維決策
  • DQN 算法更新
  • DQN 神經(jīng)網(wǎng)絡(luò) (Tensorflow)

learning route

  • AI = DL(Deep Learning) + RL(Reinforcement Learning) == DRL(Deep Reinforcement Learning)
  • 什么是強化學(xué)習(xí)? 強化學(xué)習(xí)是學(xué)習(xí)該如何去做(learning what to do)即學(xué)習(xí)如何從一個狀態(tài)映射到某一個行為,來最大化某一個數(shù)值的獎勵信號。強化學(xué)習(xí)算法主體是智能體,環(huán)境是老師,老師僅僅是評分,不告訴智能體為什么錯,為什么對?智能體不斷的試錯,不斷的嘗試,累計經(jīng)驗,學(xué)習(xí)經(jīng)驗。記住高分的行為,避免低分的行為。強化學(xué)習(xí)作為一門靈感來源于心理學(xué)中的行為主義理論的學(xué)科,其內(nèi)容涉及概率論、統(tǒng)計學(xué)、逼近論、凸分析、計算復(fù)雜性理論、運籌學(xué)等多學(xué)科知識,難度之大,門檻之高,導(dǎo)致其發(fā)展速度特別緩慢。
  • 強化學(xué)習(xí)特征: 試錯:agent需要不斷的嘗試,通過reward的反饋學(xué)習(xí)策略。延遲獎勵:某一時刻action可能會對后面時刻reward有影響。
  • 強化學(xué)習(xí)局限性 強化學(xué)習(xí)非常依賴狀態(tài)state的概念,state既是策略函數(shù)和價值函數(shù)的輸入,又是環(huán)境模型model的輸入和輸出。
  • 強化學(xué)習(xí)適合解決什么問題 強化學(xué)習(xí)適合于解決模型未知,且當(dāng)前決策會影響環(huán)境狀態(tài)的(序列)決策問題。

強化學(xué)習(xí)和監(jiān)督學(xué)習(xí)、無監(jiān)督學(xué)習(xí)的區(qū)別

  • 監(jiān)督學(xué)習(xí)一般有標(biāo)簽信息,而且是單步?jīng)Q策問題,比如分類問題。監(jiān)督學(xué)習(xí)的樣本一般是獨立 同分布的。
  • 無監(jiān)督學(xué)習(xí)沒有任何標(biāo)簽信息,一般對應(yīng)的是聚類問題。
  • 強化學(xué)習(xí)介于監(jiān)督和無監(jiān)督學(xué)習(xí)之間,每一步?jīng)Q策之后會有一個標(biāo)量的反饋信號,即回報。通過最大化回報以獲得一個最優(yōu)策略。因此強化學(xué)習(xí)一般是多步?jīng)Q策,并且樣本之間有強的相關(guān)性。
  • 強化學(xué)習(xí)的損失函數(shù) 累計回報:依賴于不同的問題設(shè)定,累積回報具有不同的形式。比如對于有限長度的MDP問題直接用回報和作為優(yōu)化目標(biāo)。對于無限長的問題,為了保證求和是有意義的,需要使用折扣累積回報或者平均回報。
  • 深度學(xué)習(xí)算是函數(shù): 多個獨立同分布樣本預(yù)測值和標(biāo)簽值的誤差,需要最小化。強化學(xué)習(xí) 的損失函數(shù)是軌跡上的累積和,需要最大化。

強化學(xué)習(xí)

RL解決什么問題

  • 就是需要連續(xù)不斷地做出決策,才能實現(xiàn)最終目標(biāo)的問題。

RL如何解決問題

  • 強化學(xué)習(xí)算法是根據(jù)與環(huán)境的交互產(chǎn)生的反饋,從而達到最終目標(biāo)

實例

實例視頻

  • 1.機器人炒股
  • 模擬人工障礙
  • 學(xué)習(xí)抓取東西
  • 學(xué)會抓取
  • 學(xué)穿衣服

openAI and DeepMind

  • https:///
  • openai:開源庫 gym

基礎(chǔ)

  • 基礎(chǔ)概念: state、 action、 reward function value function 、policy、modle of the environment
  • 在炒股機器人中: 動作(action)是買還是賣,或者更具體的,買多少,賣多少。狀態(tài)(state)是機器人對環(huán)境的觀察,這就非常多樣,比如說某支股票的漲跌現(xiàn)狀、各種技術(shù)面的特征、基本面的特征等等。獎勵(reward function)是機器人每做一次買賣決策之后,帶來的實際收益;回報(return):一般用表示,形式化定義: ,回報的定義很有趣,即某一系列決策后,長期的獎勵累加,我們給后面的獎勵一個折扣系數(shù),即對未來可能賺的錢,我們的興趣相對少一些;價值函數(shù)(value function)是我們對回報的期望,用來衡量處于某個狀態(tài)有多好;環(huán)境模型(model)用來模擬環(huán)境的行為,給定一個狀態(tài)和動作,模型可以預(yù)測下一個狀態(tài)和獎勵。也就是說,如果我們有一個環(huán)境模型,那么每次機器人做了一次交易之后,我們就可以預(yù)測出它的下一個狀態(tài)是什么,收到的獎勵有多少(這個觀點在炒股票這個例子中聽起來不太可行)。policy:狀態(tài)到行為的映射,定義agent在某一個狀態(tài)下應(yīng)該如何采取行為,state-> action
  • 構(gòu)建智能體
import randomclass Environment:    def __init__(self):        self.steps_left = 100    def get_observation(self):        return [0.00.00.0]    def get_actions(self):        return [01]    def is_done(self):        return self.steps_left == 0    def action(self, action):        if self.is_done():            raise Exception('Game is over')        self.steps_left -= 1        return random.random()class Agent:    def __init__(self):        self.total_reward = 0.0    def step(self, env):        current_obs = env.get_observation()        actions = env.get_actions()        reward = env.action(random.choice(actions))        self.total_reward += rewardif __name__ == '__main__':    env = Environment()    agent = Agent()    while not env.is_done():        agent.step(env)    print('Total reward got: %.4f' % agent.total_reward)
  • 智能體驗示
import gymif __name__ == '__main__':    env = gym.make('CartPole-v0')    env = gym.wrappers.Monitor(env, 'recording')    total_reward = 0.0    total_steps = 0    obs = env.reset()    while True:        action = env.action_space.sample()        obs, reward, done, _ = env.step(action)        total_reward += reward        total_steps += 1        if done:            break    print('Episode done in %d steps, total reward %.2f' % (total_steps, total_reward))    env.close()    env.env.close()
  • 模型
import torchimport torch.nn as nnclass OurModule(nn.Module):    def __init__(self, num_inputs, num_classes, dropout_prob=0.3):        super(OurModule, self).__init__()        self.pipe = nn.Sequential(            nn.Linear(num_inputs, 5),            nn.ReLU(),            nn.Linear(520),            nn.ReLU(),            nn.Linear(20, num_classes),            nn.Dropout(p=dropout_prob),            nn.Softmax(dim=1)        )    def forward(self, x):        return self.pipe(x)if __name__ == '__main__':    net = OurModule(num_inputs=2, num_classes=3)    print(net)    v = torch.FloatTensor([[23]])    out = net(v)    print(out)    print('Cuda's availability is %s' % torch.cuda.is_available())    if torch.cuda.is_available():        print('Data from cuda: %s' % out.to('cuda'))

馬爾科夫

  • Markov Reward Processes(MRPs)
  • Markov Decision Processes (MDPs) 解決辦法 動態(tài)規(guī)劃(Dynamic Programming):理論上完美,但需要很強的算力和準(zhǔn)確的環(huán)境model。蒙特卡洛(Monte Carlo Methods):不需要模型,可操作性強,但不太適合一步一步的增量計算。差分學(xué)習(xí)(Temporal-Difference Learning):不需要模型,也是增量式的,但分析起來很復(fù)雜。
  • POMDP:部分可觀測馬爾科夫決策問題。
  • 馬爾科夫過程表示一個狀態(tài)序列,每一個狀態(tài)是一個隨機變量,變量之間滿足馬爾科夫性,表示為 一個元組<S, P>,S是狀態(tài),P表示轉(zhuǎn)移概率。
  • MDP表示為一個五元組<S, A, P, R, >,S是狀態(tài)集合,A是動作集合,P表示轉(zhuǎn)移概率,即模型, R是回報函數(shù),表示折扣因子。

時序差分(Temporal-Difference)

  • 時序差分是強化學(xué)習(xí)的核心觀點。
  • 時序差分是DP和MC方法的結(jié)合。
  • TD往往比MC高效;TD和MC都使用經(jīng)驗(experience)來解決預(yù)測問題。

強化學(xué)習(xí)方法

分類

Model-free

  • 不理解環(huán)境
  • Q learning, Sarsa, Policy Gradients

Model-base

  • 理解環(huán)境

基于概率

  • 基于概率是強化學(xué)習(xí)中最直接的一種, 他能通過感官分析所處的環(huán)境, 直接輸出下一步要采取的各種動作的概率, 然后根據(jù)概率采取行動, 所以每種動作都有可能被選中, 只是可能性不同.
  • 連續(xù)的動作基于概率的方法是有效的
  • Policy Gradients,

基于價值

  • 基于價值的方法輸出則是所有動作的價值, 我們會根據(jù)最高價值來選擇動作, 相比基于概率的方法, 基于價值的決策部分更為鐵定, 毫不留情, 就選價值最高的。
  • 連續(xù)的動作基于價值的方法是無能為力的
  • Q learning, Sarsa
  • Actor-Critic, actor 會基于概率做出動作, 而 critic 會對做出的動作給出動作的價值, 這樣就在原有的 policy gradients 上加速了學(xué)習(xí)過程.

回合更新

  • 學(xué)習(xí)效率低
  • Monte-carlo learning 和基礎(chǔ)版的 policy gradients

單步更新

  • 學(xué)習(xí)效率高
  • Qlearning, Sarsa, 升級版的 policy gradients 等

在線學(xué)習(xí) on-Policy

  • 智能體:邊玩邊總結(jié)學(xué)習(xí)
  • 最典型的在線學(xué)習(xí)就是 Sarsa

離線學(xué)習(xí) off-Policy

  • 智能體:從歷史的記錄中學(xué)習(xí),看別人的棋譜
  • 最典型的離線學(xué)習(xí)就是 Q learning, 后來人也根據(jù)離線學(xué)習(xí)的屬性, 開發(fā)了更強大的算法, 比如讓計算機學(xué)會玩電動的 Deep-Q-Network.

Q-learning

Q-learning

  • 2da3885da644cb681fcc4adb2be47ac7.png Q learning 的迷人之處就是 在 Q(s1, a2) 現(xiàn)實 中, 也包含了一個 Q(s2) 的最大估計值, 將對下一步的衰減的最大估計和當(dāng)前所得到的獎勵當(dāng)成這一步的現(xiàn)實, 很奇妙吧. 最后我們來說說這套算法中一些參數(shù)的意義. Epsilon greedy 是用在決策上的一種策略, 比如 epsilon = 0.9 時, 就說明有90% 的情況我會按照 Q 表的最優(yōu)值選擇行為, 10% 的時間使用隨機選行為. alpha是學(xué)習(xí)率, 來決定這次的誤差有多少是要被學(xué)習(xí)的, alpha是一個小于1 的數(shù). gamma 是對未來 reward 的衰減值.
  • 572458142e9790b40543a859135490c5.png 重寫一下 Q(s1) 的公式, 將 Q(s2) 拆開, 因為Q(s2)可以像 Q(s1)一樣,是關(guān)于Q(s3) 的, 所以可以寫成這樣, 然后以此類推, 不停地這樣寫下去, 最后就能寫成這樣, 可以看出Q(s1) 是有關(guān)于之后所有的獎勵, 但這些獎勵正在衰減, 離 s1 越遠的狀態(tài)衰減越嚴(yán)重. 不好理解? 行, 我們想象 Qlearning 的機器人天生近視眼, gamma = 1 時, 機器人有了一副合適的眼鏡, 在 s1 看到的 Q 是未來沒有任何衰變的獎勵, 也就是機器人能清清楚楚地看到之后所有步的全部價值, 但是當(dāng) gamma =0, 近視機器人沒了眼鏡, 只能摸到眼前的 reward, 同樣也就只在乎最近的大獎勵, 如果 gamma 從 0 變道 1, 眼鏡的度數(shù)由淺變深, 對遠處的價值看得越清楚, 所以機器人漸漸變得有遠見, 不僅僅只看眼前的利益, 也為自己的未來著想.

Q-learning 實例

# -*- coding:utf-8 -*-# /usr/bin/python'''-------------------------------------------------   File Name   :  Q_learning_class   Description :  AIM:                   Functions: 1.                              2.    Envs        :  python ==                   pip install numpy pandas  -i https://pypi.douban.com/simple    Author      :  errol   Date        :  2020/5/18  14:35   CodeStyle   :  規(guī)范,簡潔,易懂,可閱讀,可維護,可移植!-------------------------------------------------   Change Activity:          2020/5/18 : 新建-------------------------------------------------'''import timeimport numpy as npimport pandas as pdnp.random.seed(2) # 隨機因子class QL(object):    def __init__(self,):        '''        定義變量        '''        self.N_STATES = 6 # 探索世界的寬度        self.ACTIONS = ['left''right']  # 智能體的行為        self.EPSILON = 0.9 # 貪婪度        self.LR = 0.2 # 學(xué)習(xí)率        self.GAMMA = 0.9 # 獎勵遞減值        self.MAX_EPISODES = 13 # 最大回合數(shù)        self.FRESH_TIME = 0.3 # 移動每步的時間    def build_q_label(self,n_states,actions):        '''         Q values (行為值) 放在 q_table        :param n_states: 狀態(tài)        :param actions: 行為        :return: table        '''        table = pd.DataFrame(np.zeros((n_states, len(actions))),  # q_table 全 0 初始            columns=actions,)  # columns 對應(yīng)的是行為名稱)        # print('table\n'table)        return table    # 某個state地點,選擇行為    def choose_action(self,state, q_table):        '''        智能體選擇動作:嚴(yán)格意義上講,智能體在前期探索階段需要把貪婪值設(shè)低些,隨著時間的增長貪婪值增加。        本例子:固定成 EPSILON = 0.9, 90% 的時間是選擇最優(yōu)策略, 10% 的時間來探索.        :param state: 狀態(tài)        :param q_table: 行為表        :return: action_name 行為名字        '''        state_actions = q_table.iloc[state, :]  # 選出這個 state 的所有 action 值        if (np.random.uniform() > self.EPSILON) or (state_actions.all() == 0):  # 非貪婪 or 或者這個 state 還沒有探索過            action_name = np.random.choice(self.ACTIONS)        else:            action_name = state_actions.idxmax()    # 貪婪模式        return action_name    def get_env_feedback(self,S,A):        '''        環(huán)境也要給我們的行為一個反饋, 反饋出下個 state (S_) 和 在上個 state (S) 做出 action (A) 所得到的 reward (R)        本例子:O一定到T得到獎勵R = 1,其他都是R=0.01        :param S:state        :param A: action        :return: R : 獎勵        '''        # This is how agent will interact with the environment        if A == 'right':  # move right            if S == self.N_STATES - 2:  # terminate                S_ = 'terminal'                R = 1            else:                S_ = S + 1                R = 0.01   # 越向右獎勵就獲得        else:  # move left            R = 0            if S == 0:                S_ = S  # reach the wall                R  = 0 # 撞墻獎勵設(shè)置為0            else:                S_ = S - 1                R  = -0.01 # 向左 獎勵倒扣        return S_, R    def update_env(self,S, episode, step_counter):        '''        環(huán)境更新        :param S: state        :param episode:  回合數(shù)        :param step_counter: 步驟數(shù)        :return:        '''        # This is how environment be updated        env_list = ['-']*(self.N_STATES-1) + ['T']   # '---------T' our environment        if S == 'terminal':            interaction = 'Episode %s: total_steps = %s' % (episode+1, step_counter)            print('\r{}'.format(interaction), end='')            time.sleep(2)            print('\r                                'end='')        else:            env_list[S] = 'o'            interaction = ''.join(env_list)            print('\r{}'.format(interaction), end='')            time.sleep(self.FRESH_TIME)    def qlearing(self):        '''        主函數(shù):循環(huán)        :return:        '''        q_table = self.build_q_label(self.N_STATES,self.ACTIONS) # 初始化q_table        print('q_table:\n',q_table)        for episode in range(self.MAX_EPISODES): # 回合            step_counter = 0            S = 0  # 回合初始位置            is_terminated = False  # 是否回合結(jié)束            self.update_env(S, episode, step_counter)  # 環(huán)境更新            while not is_terminated:                A = self.choose_action(S, q_table)  # 選行為                S_, R = self.get_env_feedback(S, A)  # 實施行為并得到環(huán)境的反饋                print('\n S',S,'\n A',A)                q_predict = q_table.loc[S, A]  # 估算的(狀態(tài)-行為)值                if S_ != 'terminal':                    q_target = R + self.GAMMA * q_table.iloc[S_, :].max()  # 實際的(狀態(tài)-行為)值 (回合沒結(jié)束)                else:                    q_target = R  # 實際的(狀態(tài)-行為)值 (回合結(jié)束)                    is_terminated = True  # terminate this episode                q_table.loc[S, A] += self.LR * (q_target - q_predict)  # q_table 更新                S = S_  # 探索者移動到下一個 state                self.update_env(S, episode, step_counter + 1)  # 環(huán)境更新                step_counter += 1        return q_tableif __name__ == '__main__':    new = QL()    q_table = new.qlearing()    print('\r\nQ-table:\n')    print(q_table)

Q-learning 算法更新

# -*- coding:utf-8 -*-# /usr/bin/python'''-------------------------------------------------   File Name   :  main   Description :  AIM:                   Functions: 1.                              2.    Envs        :  python ==                   pip install  -i https://pypi.douban.com/simple    Author      :  errol   Date        :  2020/5/17  22:06   CodeStyle   :  規(guī)范,簡潔,易懂,可閱讀,可維護,可移植!-------------------------------------------------   Change Activity:          2020/5/17 : 新建-------------------------------------------------'''from maze_env import Mazefrom RL_brain import QLearningTabledef update():    for episode in range(100):        # initial observation        observation = env.reset()        while True:            # fresh env            env.render()            # RL choose action based on observation            action = RL.choose_action(str(observation))            # RL take action and get next observation and reward            observation_, reward, done = env.step(action)            # RL learn from this transition            RL.learn(str(observation), action, reward, str(observation_))            # swap observation            observation = observation_            # break while loop when end of this episode            if done:                break    # end of game    print('game over')    env.destroy()if __name__ == '__main__':    env = Maze()    RL = QLearningTable(actions=list(range(env.n_actions)))    env.after(100, update)    env.mainloop()

Q-learning 思維決策

# -*- coding:utf-8 -*-# /usr/bin/python'''-------------------------------------------------   File Name   :  RL_brain   Description :  AIM:                   Functions: 1. 大腦更新                             2.    Envs        :  python ==                   pip install  -i https://pypi.douban.com/simple    Author      :  errol   Date        :  2020/5/17  22:03   CodeStyle   :  規(guī)范,簡潔,易懂,可閱讀,可維護,可移植!-------------------------------------------------   Change Activity:          2020/5/17 : 新建-------------------------------------------------'''import numpy as npimport pandas as pdclass QLearningTable:    def __init__(self, actions, learning_rate=0.01, reward_decay=0.9, e_greedy=0.9):        self.actions = actions  # a list        self.lr = learning_rate        self.gamma = reward_decay        self.epsilon = e_greedy        self.q_table = pd.DataFrame(columns=self.actions, dtype=np.float64)    def choose_action(self, observation):        self.check_state_exist(observation)        # action selection        if np.random.uniform() < self.epsilon:            # choose best action            state_action = self.q_table.loc[observation, :]            # some actions may have the same value, randomly choose on in these actions            action = np.random.choice(state_action[state_action == np.max(state_action)].index)        else:            # choose random action            action = np.random.choice(self.actions)        return action    def learn(self, s, a, r, s_):        self.check_state_exist(s_)        q_predict = self.q_table.loc[s, a]        if s_ != 'terminal':            q_target = r + self.gamma * self.q_table.loc[s_, :].max()  # next state is not terminal        else:            q_target = r  # next state is terminal        self.q_table.loc[s, a] += self.lr * (q_target - q_predict)  # update    def check_state_exist(self, state):        if state not in self.q_table.index:            # append new state to q table            self.q_table = self.q_table.append(                pd.Series(                    [0]*len(self.actions),                    index=self.q_table.columns,                    name=state,                )            )

Sarsa

  • 與Q-Learning的不同:離線學(xué)習(xí),
  • Sarsa:是實施每個估計,在線學(xué)習(xí),’保命為主‘

sarsa 思維決策

Sarsa(lambda)

  • 回合更新
  • lambda 是腳步衰減值, 都是一個在 0 和 1 之間的數(shù),認(rèn)為距離獎勵越遠的步驟越不重要。
  • 如果 lambda = 0, Sarsa-lambda 就是 Sarsa, 只更新獲取到 reward 前經(jīng)歷的最后一步.
  • 如果 lambda = 1, Sarsa-lambda 更新的是 獲取到 reward 前所有經(jīng)歷的步.

DQN

  • Deep Q Network 簡稱為 DQN. Google Deep mind 團隊就是靠著這 DQN 使計算機玩電動玩得比我們還厲害
  • Q learning 是一種 off-policy 離線學(xué)習(xí)法, 它能學(xué)習(xí)當(dāng)前經(jīng)歷著的, 也能學(xué)習(xí)過去經(jīng)歷過的, 甚至是學(xué)習(xí)別人的經(jīng)歷. 所以每次 DQN 更新的時候, 我們都可以隨機抽取一些之前的經(jīng)歷進行學(xué)習(xí).
  • Fixed Q-targets 也是一種打亂相關(guān)性的機理。

DQN 算法更新

  • Q learning 主框架上加了些裝飾.這些裝飾包括: 記憶庫 (用于重復(fù)學(xué)習(xí))神經(jīng)網(wǎng)絡(luò)計算 Q 值暫時凍結(jié) q_target 參數(shù) (切斷相關(guān)性)

DQN 神經(jīng)網(wǎng)絡(luò) (Tensorflow)

OpenAI gym 環(huán)境庫

  • python --version python=2.7 $ pip install gympython=3.5 $ pip install gym
  • os
# MacOS:$ brew install cmake boost boost-python sdl2 swig wget# Ubuntu 14.04:$ apt-get install -y python-numpy python-dev cmake zlib1g-dev libjpeg-dev xvfb libav-tools xorg-dev python-opengl libboost-all-dev libsdl2-dev swig

Prioritized Experience Replay (DQN)

  • 使用 Prioritized replay, 就會重視這種力量的, 但值得學(xué)習(xí)的樣本.

Dueling DQN

  • 它將每個動作的 Q 拆分成了 state 的 Value 加上 每個動作的 Advantage.

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多