docstr: Train a reward model to be used by the doubly-robust estimator
  
  :param epochs: The total number of epochs to use for training a reward model
  :return: None
docstr_tok: ["Train","a","reward","model","to","be","used","by","the","doubly-robust","estimator",":","param","epochs",":","The","total","number","of","epochs","to","use","for","training","a","reward","model",":","return",":","None"]
code: def improve_reward_model(self, epochs: int):
      """
      Train a reward model to be used by the doubly-robust estimator
  
      :param epochs: The total number of epochs to use for training a reward model
      :return: None
      """
      batch_size = self.ap.network_wrappers["reward_model"].batch_size
  
      # this is fitted from the training dataset
      for epoch in range(epochs):
          loss = 0
          total_transitions_processed = 0
          for i, batch in enumerate(
              self.call_memory(
                  "get_shuffled_training_data_generator", batch_size
              )
          ):
              batch = Batch(batch)
              loss += self.get_reward_model_loss(batch)
              total_transitions_processed += batch.size
  
          log = OrderedDict()
          log["Epoch"] = epoch
          log["loss"] = loss / total_transitions_processed
          screen.log_dict(log, prefix="Training Reward Model")
  
imports: from collections import OrderedDict
  from typing import Union, List
  import numpy
  from rl_coach.agents.agent import Agent
  from rl_coach.core_types import ActionInfo, StateType, Batch
  from rl_coach.filters.filter import NoInputFilter
  from rl_coach.logger import screen
  from rl_coach.memories.non_episodic.prioritized_experience_replay import PrioritizedExperienceReplay
  from rl_coach.spaces import DiscreteActionSpace
  from copy import deepcopy, copy
label_desc: Use image node_id 12 for calling the ValueOptimizationAgent obj's underlying member method code with example usage: obj.improve_reward_model(epochs) without return types