Yeniden Oynatma Tamponları
Takviye öğrenme algoritmaları, bir ortamda bir ilkeyi yürütürken deneyim yörüngelerini depolamak için tekrar arabellekleri kullanır. Eğitim sırasında, temsilcinin deneyimini "yeniden oynatmak" için, yeniden oynatma tamponları, yörüngelerin bir alt kümesi (sıralı bir alt küme veya bir örnek) için sorgulanır.
Bu çalışmada, ortak bir API paylaşan python destekli ve tensorflow destekli olmak üzere iki tür yeniden oynatma tamponunu keşfediyoruz. Aşağıdaki bölümlerde, API'yi, tampon uygulamalarının her birini ve veri toplama eğitimi sırasında bunların nasıl kullanılacağını açıklıyoruz.
Henüz yapmadıysanız tf-agent'ları kurun.
Replay Buffer sınıfı aşağıdaki tanım ve yöntemlere sahiptir:
Yeniden yürütme arabelleği nesnesi başlatıldığında, data_spec öğelerin data_spec gerektirdiğine dikkat edin. Bu TensorSpec , tampona eklenecek yörünge öğelerinin TensorSpec karşılık gelir. Bu özellik, genellikle bir temsilcinin, eğitim sırasında temsilcinin beklediği şekilleri, türleri ve yapıları tanımlayan agent.collect_data_spec bakılarak elde edilir (daha sonra daha fazlası için)
TFUniformReplayBuffer , TF-Agent'larda en sık kullanılan yeniden oynatma arabelleğidir, bu nedenle onu TFUniformReplayBuffer kullanacağız. TFUniformReplayBuffer , destek arabelleği depolaması tensorflow değişkenleri tarafından yapılır ve bu nedenle hesaplama grafiğinin bir parçasıdır.
Tampon, öğe gruplarını depolar ve parti segmenti başına maksimum kapasite max_length öğelerine sahiptir. Bu durumda, toplam ara bellek kapasitesi batch_size x max_length elemanları. Arabellekte depolanan öğelerin tümü, eşleşen bir veri spesifikasyonuna sahip olmalıdır. Veri toplama için yeniden oynatma arabelleği kullanıldığında, özellik, aracının veri toplama özelliğidir.
Bir TFUniformReplayBuffer oluşturmak için TFUniformReplayBuffer :
arabelleğin saklayacağı veri öğelerinin özellikleri
tamponun batch size karşılık gelen parti boyutu
parti segmenti başına max_length eleman sayısı
Burada oluşturma örneğidir TFUniformReplayBuffer örnek veri özellikleri ile batch_size 32 ve max_length 1000 civarındadır.
Tekrar tampon elemanları eklemek için, kullandığımız add_batch(items) yöntemi items öğe toplu temsil tensörlerinin bir liste / demet / yuva tamponuna ilave edilir. items her bir öğesinin batch_size değerine eşit bir dış boyutu olmalıdır ve kalan boyutlar öğenin veri spesifikasyonuna uymalıdır (yeniden oynatma arabelleği yapıcısına iletilen veri özellikleriyle aynı).
İşte bir grup öğe eklemenin bir örneği
TFUniformReplayBuffer veri okumanın üç yolu vardır:
get_next() - tampondan bir örnek döndürür. Örnek parti boyutu ve döndürülen zaman adımı sayısı, bu yönteme argümanlar aracılığıyla belirtilebilir.
as_dataset() - yeniden oynatma arabelleğini tf.data.Dataset olarak döndürür. Daha sonra bir veri kümesi yineleyicisi oluşturulabilir ve arabellekteki öğelerin örnekleri arasında yineleme yapılabilir.
gather_all() - arabellekteki tüm öğeleri [batch, time, data_spec] şeklinde bir Tensör olarak döndürür
Aşağıda, bu yöntemlerin her birini kullanarak tekrar arabelleğinden nasıl okuma yapılacağına dair örnekler verilmiştir:
PyUniformReplayBuffer aynı functionaly sahiptir TFUniformReplayBuffer ancak bunun yerine tf değişkenlerin, 's veri numpy dizilerde saklanır. Bu arabellek, grafik dışı veri toplama için kullanılabilir. Destek depolamasının numpy'de olması, bazı uygulamaların Tensorflow değişkenleri kullanmadan veri işleme (öncelikleri güncellemek için dizin oluşturma gibi) yapmasını kolaylaştırabilir. Ancak, bu uygulama Tensorflow ile grafik optimizasyonlarından yararlanamayacak.
Aşağıda, aracının politika yörünge özelliklerinden bir PyUniformReplayBuffer örneğini oluşturmaya ilişkin bir örnek verilmiştir:
Eğitim sırasında yeniden oynatma tamponlarını kullanma
Artık bir tekrar tamponu oluşturmayı, ona öğeler yazmayı ve ondan okumayı bildiğimize göre, aracılarımızın eğitimi sırasında yörüngeleri depolamak için kullanabiliriz.
İlk olarak, veri toplama sırasında yeniden oynatma arabelleğinin nasıl kullanılacağına bakalım.
TF-Agent'larda, bir ortamda deneyim toplamak için bir Driver (daha fazla ayrıntı için Sürücü eğitimine bakın) kullanıyoruz. Bir Driver kullanmak için, Driver bir yörünge aldığında yürütmesi için bir işlev olan bir Observer belirleriz.
Bu nedenle, yeniden oynatma arabelleğine yörünge öğeleri eklemek için, tekrar arabelleğine bir (toplu) öğe eklemek için add_batch(items) i çağıran bir gözlemci add_batch(items) .
Aşağıda TFUniformReplayBuffer ile TFUniformReplayBuffer bir örneğini TFUniformReplayBuffer . Önce bir ortam, bir ağ ve bir ajan oluşturuyoruz. Sonra bir TFUniformReplayBuffer oluşturuyoruz. Tekrar arabelleğindeki yörünge öğelerinin özelliklerinin, temsilcinin veri toplama özelliğine eşit olduğuna dikkat edin. Daha sonra, add_batch sırasında verileri toplayacak sürücü için gözlemci olarak add_batch yöntemini belirledik:
Bir tren adımı için verileri okuma
Tekrar arabelleğine yörünge öğeleri ekledikten sonra, bir tren adımı için girdi verisi olarak kullanmak üzere tekrar arabelleğinden yörünge gruplarını okuyabiliriz.
Aşağıda, bir eğitim döngüsündeki tekrar arabelleğinden yörüngeler üzerinde nasıl eğitim yapılacağına dair bir örnek verilmiştir: