Source code for d3rlpy.algos.plas

from typing import Any, Dict, Optional, Sequence

from ..argument_utility import (
    ActionScalerArg,
    EncoderArg,
    QFuncArg,
    RewardScalerArg,
    ScalerArg,
    UseGPUArg,
    check_encoder,
    check_q_func,
    check_use_gpu,
)
from ..constants import IMPL_NOT_INITIALIZED_ERROR, ActionSpace
from ..dataset import TransitionMiniBatch
from ..gpu import Device
from ..models.encoders import EncoderFactory
from ..models.optimizers import AdamFactory, OptimizerFactory
from ..models.q_functions import QFunctionFactory
from .base import AlgoBase
from .torch.plas_impl import PLASImpl, PLASWithPerturbationImpl


[docs]class PLAS(AlgoBase): r"""Policy in Latent Action Space algorithm. PLAS is an offline deep reinforcement learning algorithm whose policy function is trained in latent space of Conditional VAE. Unlike other algorithms, PLAS can achieve good performance by using its less constrained policy function. .. math:: a \sim p_\beta (a|s, z=\pi_\phi(s)) where :math:`\beta` is a parameter of the decoder in Conditional VAE. References: * `Zhou et al., PLAS: latent action space for offline reinforcement learning. <https://arxiv.org/abs/2011.07213>`_ Args: actor_learning_rate (float): learning rate for policy function. critic_learning_rate (float): learning rate for Q functions. imitator_learning_rate (float): learning rate for Conditional VAE. actor_optim_factory (d3rlpy.models.optimizers.OptimizerFactory): optimizer factory for the actor. critic_optim_factory (d3rlpy.models.optimizers.OptimizerFactory): optimizer factory for the critic. imitator_optim_factory (d3rlpy.models.optimizers.OptimizerFactory): optimizer factory for the conditional VAE. actor_encoder_factory (d3rlpy.models.encoders.EncoderFactory or str): encoder factory for the actor. critic_encoder_factory (d3rlpy.models.encoders.EncoderFactory or str): encoder factory for the critic. imitator_encoder_factory (d3rlpy.models.encoders.EncoderFactory or str): encoder factory for the conditional VAE. q_func_factory (d3rlpy.models.q_functions.QFunctionFactory or str): Q function factory. batch_size (int): mini-batch size. n_frames (int): the number of frames to stack for image observation. n_steps (int): N-step TD calculation. gamma (float): discount factor. tau (float): target network synchronization coefficiency. n_critics (int): the number of Q functions for ensemble. target_reduction_type (str): ensemble reduction method at target value estimation. The available options are ``['min', 'max', 'mean', 'mix', 'none']``. update_actor_interval (int): interval to update policy function. lam (float): weight factor for critic ensemble. warmup_steps (int): the number of steps to warmup the VAE. beta (float): KL reguralization term for Conditional VAE. use_gpu (bool, int or d3rlpy.gpu.Device): flag to use GPU, device ID or device. scaler (d3rlpy.preprocessing.Scaler or str): preprocessor. The available options are `['pixel', 'min_max', 'standard']`. action_scaler (d3rlpy.preprocessing.ActionScaler or str): action preprocessor. The available options are ``['min_max']``. reward_scaler (d3rlpy.preprocessing.RewardScaler or str): reward preprocessor. The available options are ``['clip', 'min_max', 'standard']``. impl (d3rlpy.algos.torch.bcq_impl.BCQImpl): algorithm implementation. """ _actor_learning_rate: float _critic_learning_rate: float _imitator_learning_rate: float _actor_optim_factory: OptimizerFactory _critic_optim_factory: OptimizerFactory _imitator_optim_factory: OptimizerFactory _actor_encoder_factory: EncoderFactory _critic_encoder_factory: EncoderFactory _imitator_encoder_factory: EncoderFactory _q_func_factory: QFunctionFactory _tau: float _n_critics: int _target_reduction_type: str _update_actor_interval: int _lam: float _warmup_steps: int _beta: float _use_gpu: Optional[Device] _impl: Optional[PLASImpl] def __init__( self, *, actor_learning_rate: float = 1e-4, critic_learning_rate: float = 1e-3, imitator_learning_rate: float = 1e-4, actor_optim_factory: OptimizerFactory = AdamFactory(), critic_optim_factory: OptimizerFactory = AdamFactory(), imitator_optim_factory: OptimizerFactory = AdamFactory(), actor_encoder_factory: EncoderArg = "default", critic_encoder_factory: EncoderArg = "default", imitator_encoder_factory: EncoderArg = "default", q_func_factory: QFuncArg = "mean", batch_size: int = 100, n_frames: int = 1, n_steps: int = 1, gamma: float = 0.99, tau: float = 0.005, n_critics: int = 2, target_reduction_type: str = "mix", update_actor_interval: int = 1, lam: float = 0.75, warmup_steps: int = 500000, beta: float = 0.5, use_gpu: UseGPUArg = False, scaler: ScalerArg = None, action_scaler: ActionScalerArg = None, reward_scaler: RewardScalerArg = None, impl: Optional[PLASImpl] = None, **kwargs: Any ): super().__init__( batch_size=batch_size, n_frames=n_frames, n_steps=n_steps, gamma=gamma, scaler=scaler, action_scaler=action_scaler, reward_scaler=reward_scaler, kwargs=kwargs, ) self._actor_learning_rate = actor_learning_rate self._critic_learning_rate = critic_learning_rate self._imitator_learning_rate = imitator_learning_rate self._actor_optim_factory = actor_optim_factory self._critic_optim_factory = critic_optim_factory self._imitator_optim_factory = imitator_optim_factory self._actor_encoder_factory = check_encoder(actor_encoder_factory) self._critic_encoder_factory = check_encoder(critic_encoder_factory) self._imitator_encoder_factory = check_encoder(imitator_encoder_factory) self._q_func_factory = check_q_func(q_func_factory) self._tau = tau self._n_critics = n_critics self._target_reduction_type = target_reduction_type self._update_actor_interval = update_actor_interval self._lam = lam self._warmup_steps = warmup_steps self._beta = beta self._use_gpu = check_use_gpu(use_gpu) self._impl = impl def _create_impl( self, observation_shape: Sequence[int], action_size: int ) -> None: self._impl = PLASImpl( observation_shape=observation_shape, action_size=action_size, actor_learning_rate=self._actor_learning_rate, critic_learning_rate=self._critic_learning_rate, imitator_learning_rate=self._imitator_learning_rate, actor_optim_factory=self._actor_optim_factory, critic_optim_factory=self._critic_optim_factory, imitator_optim_factory=self._imitator_optim_factory, actor_encoder_factory=self._actor_encoder_factory, critic_encoder_factory=self._critic_encoder_factory, imitator_encoder_factory=self._imitator_encoder_factory, q_func_factory=self._q_func_factory, gamma=self._gamma, tau=self._tau, n_critics=self._n_critics, target_reduction_type=self._target_reduction_type, lam=self._lam, beta=self._beta, use_gpu=self._use_gpu, scaler=self._scaler, action_scaler=self._action_scaler, reward_scaler=self._reward_scaler, ) self._impl.build() def _update(self, batch: TransitionMiniBatch) -> Dict[str, float]: assert self._impl is not None, IMPL_NOT_INITIALIZED_ERROR metrics = {} if self._grad_step < self._warmup_steps: imitator_loss = self._impl.update_imitator(batch) metrics.update({"imitator_loss": imitator_loss}) else: critic_loss = self._impl.update_critic(batch) metrics.update({"critic_loss": critic_loss}) if self._grad_step % self._update_actor_interval == 0: actor_loss = self._impl.update_actor(batch) metrics.update({"actor_loss": actor_loss}) self._impl.update_actor_target() self._impl.update_critic_target() return metrics
[docs] def get_action_type(self) -> ActionSpace: return ActionSpace.CONTINUOUS
[docs]class PLASWithPerturbation(PLAS): r"""Policy in Latent Action Space algorithm with perturbation layer. PLAS with perturbation layer enables PLAS to output out-of-distribution action. References: * `Zhou et al., PLAS: latent action space for offline reinforcement learning. <https://arxiv.org/abs/2011.07213>`_ Args: actor_learning_rate (float): learning rate for policy function. critic_learning_rate (float): learning rate for Q functions. imitator_learning_rate (float): learning rate for Conditional VAE. actor_optim_factory (d3rlpy.models.optimizers.OptimizerFactory): optimizer factory for the actor. critic_optim_factory (d3rlpy.models.optimizers.OptimizerFactory): optimizer factory for the critic. imitator_optim_factory (d3rlpy.models.optimizers.OptimizerFactory): optimizer factory for the conditional VAE. actor_encoder_factory (d3rlpy.models.encoders.EncoderFactory or str): encoder factory for the actor. critic_encoder_factory (d3rlpy.models.encoders.EncoderFactory or str): encoder factory for the critic. imitator_encoder_factory (d3rlpy.models.encoders.EncoderFactory or str): encoder factory for the conditional VAE. q_func_factory (d3rlpy.models.q_functions.QFunctionFactory or str): Q function factory. batch_size (int): mini-batch size. n_frames (int): the number of frames to stack for image observation. n_steps (int): N-step TD calculation. gamma (float): discount factor. tau (float): target network synchronization coefficiency. n_critics (int): the number of Q functions for ensemble. target_reduction_type (str): ensemble reduction method at target value estimation. The available options are ``['min', 'max', 'mean', 'mix', 'none']``. update_actor_interval (int): interval to update policy function. lam (float): weight factor for critic ensemble. action_flexibility (float): output scale of perturbation layer. warmup_steps (int): the number of steps to warmup the VAE. beta (float): KL reguralization term for Conditional VAE. use_gpu (bool, int or d3rlpy.gpu.Device): flag to use GPU, device ID or device. scaler (d3rlpy.preprocessing.Scaler or str): preprocessor. The available options are `['pixel', 'min_max', 'standard']`. action_scaler (d3rlpy.preprocessing.ActionScaler or str): action preprocessor. The available options are ``['min_max']``. reward_scaler (d3rlpy.preprocessing.RewardScaler or str): reward preprocessor. The available options are ``['clip', 'min_max', 'standard']``. impl (d3rlpy.algos.torch.bcq_impl.BCQImpl): algorithm implementation. """ _action_flexibility: float _impl: Optional[PLASWithPerturbationImpl] def __init__( self, *, actor_learning_rate: float = 1e-4, critic_learning_rate: float = 1e-3, imitator_learning_rate: float = 1e-4, actor_optim_factory: OptimizerFactory = AdamFactory(), critic_optim_factory: OptimizerFactory = AdamFactory(), imitator_optim_factory: OptimizerFactory = AdamFactory(), actor_encoder_factory: EncoderArg = "default", critic_encoder_factory: EncoderArg = "default", imitator_encoder_factory: EncoderArg = "default", q_func_factory: QFuncArg = "mean", batch_size: int = 100, n_frames: int = 1, n_steps: int = 1, gamma: float = 0.99, tau: float = 0.005, n_critics: int = 2, target_reduction_type: str = "mix", update_actor_interval: int = 1, lam: float = 0.75, action_flexibility: float = 0.05, warmup_steps: int = 500000, beta: float = 0.5, use_gpu: UseGPUArg = False, scaler: ScalerArg = None, action_scaler: ActionScalerArg = None, reward_scaler: RewardScalerArg = None, impl: Optional[PLASWithPerturbationImpl] = None, **kwargs: Any ): super().__init__( actor_learning_rate=actor_learning_rate, critic_learning_rate=critic_learning_rate, imitator_learning_rate=imitator_learning_rate, actor_optim_factory=actor_optim_factory, critic_optim_factory=critic_optim_factory, imitator_optim_factory=imitator_optim_factory, actor_encoder_factory=actor_encoder_factory, critic_encoder_factory=critic_encoder_factory, imitator_encoder_factory=imitator_encoder_factory, q_func_factory=q_func_factory, batch_size=batch_size, n_frames=n_frames, n_steps=n_steps, gamma=gamma, tau=tau, n_critics=n_critics, target_reduction_type=target_reduction_type, update_actor_interval=update_actor_interval, lam=lam, warmup_steps=warmup_steps, beta=beta, use_gpu=use_gpu, scaler=scaler, action_scaler=action_scaler, reward_scaler=reward_scaler, impl=impl, **kwargs, ) self._action_flexibility = action_flexibility def _create_impl( self, observation_shape: Sequence[int], action_size: int ) -> None: self._impl = PLASWithPerturbationImpl( observation_shape=observation_shape, action_size=action_size, actor_learning_rate=self._actor_learning_rate, critic_learning_rate=self._critic_learning_rate, imitator_learning_rate=self._imitator_learning_rate, actor_optim_factory=self._actor_optim_factory, critic_optim_factory=self._critic_optim_factory, imitator_optim_factory=self._imitator_optim_factory, actor_encoder_factory=self._actor_encoder_factory, critic_encoder_factory=self._critic_encoder_factory, imitator_encoder_factory=self._imitator_encoder_factory, q_func_factory=self._q_func_factory, gamma=self._gamma, tau=self._tau, n_critics=self._n_critics, target_reduction_type=self._target_reduction_type, lam=self._lam, beta=self._beta, action_flexibility=self._action_flexibility, use_gpu=self._use_gpu, scaler=self._scaler, action_scaler=self._action_scaler, reward_scaler=self._reward_scaler, ) self._impl.build()