在python中记录/存储强化学习实验的结果/指标的好方法?

时间:2016-10-29 12:34:41

标签: python logging analytics reinforcement-learning

我目前正在OpenAI gym等环境中尝试不同的RL算法。目前我只使用自己实现的环境和代码,因为它有助于我了解事情是如何运作的。

现在我正在寻找一种记录和存储在多集剧集中创建的所有数据的好方法。

一些例子:

  • 访问过的州
  • 失去我的神经网络
  • 步数/剧集
  • 每次奖励奖励

我考虑过使用python日志记录模块,尽管它可能用于不同的用途。此外,我还考虑使用观察者模式将事件(代理人采取行动,新状态,剧集结束等)推送给我作为观察员附加的不同记录器。

是否有更好的方法来实现此功能? 或者也许我可以从中学到一些很好的示例代码?

使用记录模块是个好主意吗?我认为这可能是有益的,因为我可以控制记录的内容或打开或关闭登录。但如果我使用观察者模式,我真的不需要这个。

此致 大卫

1 个答案:

答案 0 :(得分:1)

大多数人根据他们的需要从头开始实施这些实验。您可能希望引用BURLAP(一种流行的Java RL库)构建其绘图的方式(它不会记录,但在任何一种情况下都需要相同的信息)。示例实验设置为here

通常情况下,我会创建一个课程,让我能够快速获取某些观察序列的手段/信心,无论是剧集奖励还是评估步骤等等。

from typing import List

import numpy as np
import scipy as scipy
import scipy.stats


class ExperimentLog():
    def __init__(self, series: List[float], signfigance_level: float):
        self.means = []
        self.variances = []
        self.confidences = []
        self.n = 1
        self.current_observation_num = 0
        self.series = series
        self.signfigance_level = signfigance_level

    def observe(self, value: float):
        mean = None
        variance = None
        if self.current_observation_num > len(self.means) - 1:
            self.means.append(0.0)
            self.variances.append(0.0)
            mean = 0.0
            variance = 0.0
        else:
            mean = self.means[self.current_observation_num]
            variance = self.variances[self.current_observation_num]

        delta = value - mean
        mean += delta / self.n
        variance += delta * (value - mean)

        self.means[self.current_observation_num] = mean
        self.variances[self.current_observation_num] = variance
        self.current_observation_num += 1

    def finalize_confidences(self):
        assert self.n > 1
        self.variances = [variance / (self.n - 1) for variance in
                          self.variances]

        for (mean, variance) in zip(self.means, self.variances):
            crit = scipy.stats.t.ppf(1.0 - self.signfigance_level, self.n - 1)
            width = crit * np.math.sqrt(variance) / np.math.sqrt(self.n)
            self.confidences.append(width)

    def observe_trial_end(self):
        self.n += 1
        self.current_observation_num = 0

我直接在学习或评估循环中填充它。然后将它保存到文件很简单:

def save(name, log: ExperimentLog, out_dir: str, unique_num: int = 0):

    out_prefix = out_dir

    if not os.path.exists(out_prefix):
        os.makedirs(out_prefix)
    filename = str(experiment_num) + "_" + str(num_trials) + "_" + name + str(unique_num) + ".csv"
    full_out_path = os.path.join(out_prefix, filename)
    if log.n > 1:
        log.finalize_confidences()
        data = np.c_[(log.series, log.means, log.variances, log.confidences)]
    else:
        data = np.c_[(log.series, log.means)]
    np.savetxt(full_out_path, data,
               fmt=["%d", "%f", "%f", "%f"],
               delimiter=",")