Degrade İlkesi Türetmeyi Anlama


19

Kökeni kaynak Andrej Karpathy blogundan , Politika Gradyanının çok basit bir örneğini yeniden oluşturmaya çalışıyorum . Bu makalede, ağırlık listesi ve Softmax aktivasyonu içeren CartPole ve Politika Gradyanı ile örnek bulacaksınız. İşte mükemmel çalışan CartPole politika gradyanının yeniden oluşturulmuş ve çok basit bir örneği .

import gym
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
import copy

NUM_EPISODES = 4000
LEARNING_RATE = 0.000025
GAMMA = 0.99


# noinspection PyMethodMayBeStatic
class Agent:
    def __init__(self):
        self.poly = PolynomialFeatures(1)
        self.w = np.random.rand(5, 2)

    def policy(self, state):
        z = state.dot(self.w)
        exp = np.exp(z)
        return exp/np.sum(exp)

    def __softmax_grad(self, softmax):
        s = softmax.reshape(-1,1)
        return np.diagflat(s) - np.dot(s, s.T)

    def grad(self, probs, action, state):
        dsoftmax = self.__softmax_grad(probs)[action,:]
        dlog = dsoftmax / probs[0,action]
        grad = state.T.dot(dlog[None,:])
        return grad

    def update_with(self, grads, rewards):

        for i in range(len(grads)):
            # Loop through everything that happend in the episode
            # and update towards the log policy gradient times **FUTURE** reward

            total_grad_effect = 0
            for t, r in enumerate(rewards[i:]):
                total_grad_effect += r * (GAMMA ** r)
            self.w += LEARNING_RATE * grads[i] * total_grad_effect
            print("Grads update: " + str(np.sum(grads[i])))



def main(argv):
    env = gym.make('CartPole-v0')
    np.random.seed(1)

    agent = Agent()
    complete_scores = []

    for e in range(NUM_EPISODES):
        state = env.reset()[None, :]
        state = agent.poly.fit_transform(state)

        rewards = []
        grads = []
        score = 0

        while True:

            probs = agent.policy(state)
            action_space = env.action_space.n
            action = np.random.choice(action_space, p=probs[0])

            next_state, reward, done,_ = env.step(action)
            next_state = next_state[None,:]
            next_state = agent.poly.fit_transform(next_state.reshape(1, 4))
            grad = agent.grad(probs, action, state)

            grads.append(grad)
            rewards.append(reward)

            score += reward
            state = next_state

            if done:
                break

        agent.update_with(grads, rewards)
        complete_scores.append(score)

    env.close()
    plt.plot(np.arange(NUM_EPISODES),
             complete_scores)
    plt.savefig('image1.png')


if __name__ == '__main__':
    main(None)

resim açıklamasını buraya girin

.

.

Soru

Yapmaya çalışıyorum, neredeyse aynı örnek ama Sigmoid aktivasyonu ile (sadece basitlik için). Tüm yapmam gereken bu. Modeldeki aktivasyonu 'den' softmaxe değiştirin sigmoid. Hangi kesin olarak çalışmalıdır (aşağıdaki açıklamaya göre). Ancak Politika Degrade modelim hiçbir şey öğrenmiyor ve rastgele duruyor. Herhangi bir öneri?

import gym
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures

NUM_EPISODES = 4000
LEARNING_RATE = 0.000025
GAMMA = 0.99


# noinspection PyMethodMayBeStatic
class Agent:
    def __init__(self):
        self.poly = PolynomialFeatures(1)
        self.w = np.random.rand(5, 1) - 0.5

    # Our policy that maps state to action parameterized by w
    # noinspection PyShadowingNames
    def policy(self, state):
        z = np.sum(state.dot(self.w))
        return self.sigmoid(z)

    def sigmoid(self, x):
        s = 1 / (1 + np.exp(-x))
        return s

    def sigmoid_grad(self, sig_x):
        return sig_x * (1 - sig_x)

    def grad(self, probs, action, state):
        dsoftmax = self.sigmoid_grad(probs)
        dlog = dsoftmax / probs
        grad = state.T.dot(dlog)
        grad = grad.reshape(5, 1)
        return grad

    def update_with(self, grads, rewards):
        if len(grads) < 50:
            return
        for i in range(len(grads)):
            # Loop through everything that happened in the episode
            # and update towards the log policy gradient times **FUTURE** reward

            total_grad_effect = 0
            for t, r in enumerate(rewards[i:]):
                total_grad_effect += r * (GAMMA ** r)
            self.w += LEARNING_RATE * grads[i] * total_grad_effect


def main(argv):
    env = gym.make('CartPole-v0')
    np.random.seed(1)

    agent = Agent()
    complete_scores = []

    for e in range(NUM_EPISODES):
        state = env.reset()[None, :]
        state = agent.poly.fit_transform(state)

        rewards = []
        grads = []
        score = 0

        while True:

            probs = agent.policy(state)
            action_space = env.action_space.n
            action = np.random.choice(action_space, p=[1 - probs, probs])

            next_state, reward, done, _ = env.step(action)
            next_state = next_state[None, :]
            next_state = agent.poly.fit_transform(next_state.reshape(1, 4))

            grad = agent.grad(probs, action, state)
            grads.append(grad)
            rewards.append(reward)

            score += reward
            state = next_state

            if done:
                break

        agent.update_with(grads, rewards)
        complete_scores.append(score)

    env.close()
    plt.plot(np.arange(NUM_EPISODES),
             complete_scores)
    plt.savefig('image1.png')


if __name__ == '__main__':
    main(None)

Tüm öğrenmeyi planlamak rastgele kalır. Hiçbir şey hiper parametreleri ayarlamaya yardımcı olmaz. Örnek görüntünün altında.

resim açıklamasını buraya girin

Kaynaklar :

1) Derin Takviye Öğrenme: Piksel Pong

2) Cartpole ve Doom ile Politika Degradelerine Giriş

3) Politika Degradelerinin Türetilmesi ve REINFORCE Uygulanması

4) Günün Makine Öğrenme Hüneri (5): Log Türev Hüner 12


GÜNCELLEME

Aşağıdaki cevap grafikten biraz iş yapabilir gibi görünüyor. Ancak bu günlük olasılığı değil ve politikanın gradyanı bile değil. Ve RL Gradyan Politikası'nın tüm amacını değiştirir. Lütfen yukarıdaki referansları kontrol edin. Resmin ardından bir sonraki ifademiz.

resim açıklamasını buraya girin

Politikamın (yalnızca ağırlık ve sigmoidetkinleştirme) Günlük işlevinin Gradyanını almam gerekiyor .


4
Çoğunlukla teorik bir soru olduğu için bu soruyu Veri Bilimi Stack Exchange'de yayınlamanızı öneririm (Stack Overflow esas olarak kodlama soruları içindir). Ayrıca bu alanda bilgili daha fazla kişiye ulaşacaksınız.
Gilles-Philippe Paillé

@ Gilles-PhilippePaillé Sorunu temsil eden bir kod ekledim. Yapmam gereken şey, sadece bazı parçaları etkinleştirme ile düzeltmek. Lütfen güncellenmiş cevabı kontrol edin.
GensaGames

1
Politika Degradelerini Türetmek için , aynı türden düzenlemelerin çalışma örneğine sahip referans makale, Umarım ayrıntılı olarak öğrenirsiniz: medium.com/@thechrisyoon/… .
Muhammed Usman

@MuhammadUsman. Bilgi için teşekkürler. Bu kaynağı kırmızıyım. Şu anda ben den değişim aktivasyonu çalışıyorum, berrak ve form Yukarıdaki örnek var softmaxiçin signmoid. Yukarıdaki örnekte yapmam gereken tek şey bu.
GensaGames

2
@JasonChia sigmoid [0, 1], pozitif eylem olasılığı olarak yorumlanabilecek gerçek aralıkta gerçek sayı üretir (örneğin, CartPole'de sağa dönün). Daha sonra negatif etki olasılığı (sola dönün) olur 1 - sigmoid. Bu olasılıkların toplamı 1'dir. Evet, bu standart bir kutuplu kart ortamıdır.
Pavel Tyshevskyi

Yanıtlar:


8

Sorun gradyöntemdir.

def grad(self, probs, action, state):
    dsoftmax = self.sigmoid_grad(probs)
    dlog = dsoftmax / probs
    grad = state.T.dot(dlog)
    grad = grad.reshape(5, 1)
    return grad

Orijinal kodda Softmax, CrossEntropy kayıp fonksiyonu ile birlikte kullanıldı. Aktivasyonu Sigmoid olarak değiştirdiğinizde, uygun kayıp fonksiyonu Binary CrossEntropy olur. Şimdi, gradyöntemin amacı kayıp fonksiyon wrt gradyanını hesaplamaktır. ağırlıklar. Ayrıntıları vurgulayarak , (probs - action) * stateprogramınızın terminolojisinde uygun gradyan verilir . Son şey eksi işareti eklemek - kayıp fonksiyonunun negatifini en üst düzeye çıkarmak istiyoruz.

gradBöylece uygun yöntem:

def grad(self, probs, action, state):
    grad = state.T.dot(probs - action)
    return -grad

Eklemek isteyebileceğiniz bir diğer değişiklik, öğrenme oranını artırmaktır. LEARNING_RATE = 0.0001ve NUM_EPISODES = 5000aşağıdaki grafiği üretecek:

Ortalama ödülle bölüm adedini düzeltin

Ağırlıklar sıfır ortalama ve küçük varyansla Gauss dağılımı kullanılarak başlatılırsa yakınsama çok daha hızlı olacaktır:

def __init__(self):
    self.poly = PolynomialFeatures(1)
    self.w = np.random.randn(5, 1) * 0.01

resim açıklamasını buraya girin

GÜNCELLEME

Sonuçları yeniden oluşturmak için tam kod eklendi:

import gym
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures

NUM_EPISODES = 5000
LEARNING_RATE = 0.0001
GAMMA = 0.99


# noinspection PyMethodMayBeStatic
class Agent:
    def __init__(self):
        self.poly = PolynomialFeatures(1)
        self.w = np.random.randn(5, 1) * 0.01

    # Our policy that maps state to action parameterized by w
    # noinspection PyShadowingNames
    def policy(self, state):
        z = np.sum(state.dot(self.w))
        return self.sigmoid(z)

    def sigmoid(self, x):
        s = 1 / (1 + np.exp(-x))
        return s

    def sigmoid_grad(self, sig_x):
        return sig_x * (1 - sig_x)

    def grad(self, probs, action, state):
        grad = state.T.dot(probs - action)
        return -grad

    def update_with(self, grads, rewards):
        if len(grads) < 50:
            return
        for i in range(len(grads)):
            # Loop through everything that happened in the episode
            # and update towards the log policy gradient times **FUTURE** reward

            total_grad_effect = 0
            for t, r in enumerate(rewards[i:]):
                total_grad_effect += r * (GAMMA ** r)
            self.w += LEARNING_RATE * grads[i] * total_grad_effect


def main(argv):
    env = gym.make('CartPole-v0')
    np.random.seed(1)

    agent = Agent()
    complete_scores = []

    for e in range(NUM_EPISODES):
        state = env.reset()[None, :]
        state = agent.poly.fit_transform(state)

        rewards = []
        grads = []
        score = 0

        while True:

            probs = agent.policy(state)
            action_space = env.action_space.n
            action = np.random.choice(action_space, p=[1 - probs, probs])

            next_state, reward, done, _ = env.step(action)
            next_state = next_state[None, :]
            next_state = agent.poly.fit_transform(next_state.reshape(1, 4))

            grad = agent.grad(probs, action, state)
            grads.append(grad)
            rewards.append(reward)

            score += reward
            state = next_state

            if done:
                break

        agent.update_with(grads, rewards)
        complete_scores.append(score)

    env.close()
    plt.plot(np.arange(NUM_EPISODES),
             complete_scores)
    plt.savefig('image1.png')


if __name__ == '__main__':
    main(None)

Çok teşekkür ederim. Bu çözümü daha sonra deneyeceğim.
GensaGames

Fonksiyonum için böyle bir türetmeyi nereden aldığınızdan emin değilim. Yukarıdaki resmi kontrol edebileceğiniz gibi. Politikanın günlüğünün gradyanını almam gerekecekti . Benim durumumda Politika basitçe ağırlıkları ile sigmoid. Ancak yanıttaki gradyanınız, gradyanımla hiçbir ilgisi olmamalıdır. Sağ?
GensaGames

Hangi eylemin gerçekleştirildiği hakkında hiçbir bilgi eklemediğinize dikkat edin. Politika Degradeleri (slayt 13) hakkındaki bu derse göre , güncelleme gibi görünmelidir (action - probs) * sigmoid_grad(probs), ancak sigmoid_gradsigmoid gradyanla ilgili kaybolan sorun nedeniyle atladım.
Pavel Tyshevskyi

Buradaki en önemli nokta, ağırlıkları değiştirmek istediğimiz yönü göstermektir. Eğer daha yakın olmak action = 1istiyorsak , ağırlıkları arttırıyoruz (pozitif gradyan). Eğer daha yakın olmak istiyorsak , ağırlıkları azaltıyoruz (negatif gradyan). probs1action=0probs0
Pavel Tyshevskyi

1
Her durumda, yukarıdaki değişiklikler hiç çalışmıyor, tüm dosyayı paylaşabilir misiniz? Aynı zamanda, net bir örnek yapmak istiyorum ve bu durumda kaybolan sorunu umursamıyorum. Ve (action - probs)bu aynı ağırlıkları değiştirmenin başka bir yolu.
GensaGames
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.