rlContinuousDeterministicActor
R2026bDeterministic actor with a continuous action space for reinforcement learning agents
Since R2022a
Description
This object implements a function approximator to be used as a deterministic actor
within a reinforcement learning agent with a continuous action space. A continuous
deterministic actor takes an environment observation as input and returns as output an action
that is a parameterized deterministic function of the observation, thereby implementing a
parameterized deterministic policy. After you create an
rlContinuousDeterministicActor object, use it to create a suitable agent,
such as rlDDPGAgent. For more
information on creating actors and critics, see Create Actors, Critics, and Policy Objects.
Creation
Syntax
Description
creates a continuous deterministic actor object using the deep neural network
actor = rlContinuousDeterministicActor(net,observationInfo,actionInfo)net as underlying approximation model. For this actor,
actionInfo must specify a continuous action space. The network
input layers are automatically associated with the environment observation channels
according to the dimension specifications in observationInfo. The
network must have a single output layer with the same data type and dimensions as the
action specified in actionInfo.
creates a continuous deterministic actor object using a custom basis function as
underlying approximation model. The first input argument is a two-element cell array
whose first element is the handle actor = rlContinuousDeterministicActor({basisFcn,W0},observationInfo,actionInfo)basisFcn to a custom basis
function and whose second element is the initial weight vector W0.
This function sets the ObservationInfo and
ActionInfo properties of actor to the
observationInfo and actionInfo input
arguments, respectively.
specifies names of the observation input layers (for network-based approximators) or
sets the actor = rlContinuousDeterministicActor(___,Name=Value)UseDevice property using one or more name-value arguments.
Specifying the input layer names allows you explicitly associate the layers of your
network approximator with specific environment channels. For all types of approximators,
you can specify the device where computations for actor are
executed, for example, UseDevice="gpu".
Input Arguments
Deep neural network used as the underlying approximation model within the actor, specified as follows:
Array of
LayerobjectslayerGraphobjectDAGNetworkobjectSeriesNetworkobjectdlnetworkobject
Note
Among the different network representation options, dlnetwork is preferred, since it has built-in validation checks and supports automatic differentiation. If you pass another network object as an input argument, it is internally converted to a dlnetwork object. However, best practice is to convert other representations to dlnetwork explicitly before using them to create a critic or an actor for a reinforcement learning agent. You can do so using dlnet=dlnetwork(net), where net is any Deep Learning Toolbox™ neural network object. The resulting dlnet is the dlnetwork object that you use for your critic or actor. This practice allows a greater level of insight and control for cases in which the conversion is not straightforward and might require additional specifications.
The network must have as many input layers as the number of environment observation channels (with each input layer receiving input from an observation channel), and a single output layer returning the action.
rlContinuousDeterministicActor objects support recurrent deep
neural networks. For an example, see Create Deterministic Actor from Recurrent Neural Network.
The learnable parameters of the actor are the weights of the deep neural network. For a list of deep neural network layers, see List of Deep Learning Layers. For more information on creating deep neural networks for reinforcement learning, see Create Actors, Critics, and Policy Objects.
Example: net = dlnetwork([featureInputLayer(2) fullyConnectedLayer(10)
reluLayer fullyConnectedLayer(1)]) creates the dlnetwork
object net.
Custom basis function, specified as a function handle to a user-defined MATLAB
function. The user defined function can either be an anonymous function or a function
on the MATLAB path. The action to be taken based on the current observation, which is
the output of the actor, is the vector a = W'*B, where
W is a weight matrix containing the learnable parameters and
B is the column vector returned by the custom basis
function.
Your basis function must have the following signature.
B = myBasisFunction(obs1,obs2, ...,obsN)
Here, obs1 to obsN are inputs in the same
order and with the same data type and initial dimensions as the environment
observation channels defined in observationInfo. Since the
training algorithm normally executes on batches of observations and actions at the
same time, these inputs must also have an additional (last) batch dimension.
Example: @(obs1,obs2,obs3) [obs3(2,1,:)*obs1(1,1,:)^2;
abs(obs2(5,1,:)+obs3(1,1:))]
Initial value of the basis function weights W, specified as a
matrix having as many rows as the length of the vector returned by the basis function
and as many columns as the dimension of the action space.
Example: W0 = rand(2,1)
Observation specifications, specified as an rlFiniteSetSpec
or rlNumericSpec
object or an array containing any combination of such objects. Each element in the array defines
the properties of an environment observation channel, such as its dimensions, data
type, and name.
This argument sets the ObservationInfo property.
Example: observationInfo=[rlNumericSpec([2 1]) rlFiniteSetSpec([-1
1])]
Action specifications, specified as an rlNumericSpec
object. This object defines the properties of the environment action channel, such as
its dimensions, data type, and name.
This argument sets the ActionInfo property.
Note
For this approximator object, only one action channel is allowed.
Example: actionInfo=rlNumericSpec([1 2])
Name-Value Arguments
Specify optional pairs of arguments as
Name1=Value1,...,NameN=ValueN, where Name is
the argument name and Value is the corresponding value.
Name-value arguments must appear after other arguments, but the order of the
pairs does not matter.
Example: UseDevice="gpu"
Network input layers names corresponding to the environment observation channels,
specified as a string array or a cell array of strings or character vectors. The
function assigns, in sequential order, each environment observation channel specified in
observationInfo to each layer whose name is specified in the
array assigned to this argument. Therefore, the specified network input layers, ordered
as indicated in this argument, must have the same data type and dimensions as the
observation channels, as ordered in observationInfo.
This name-value argument is supported only when the approximation model is a deep neural network.
Example: ObservationInputNames={"obsInLyr1_airspeed","obsInLyr2_altitude"}
Computation device used for training and simulation, specified as
"cpu" or "gpu". By default, the approximator
uses "cpu" for training and simulation. This argument sets the
UseDevice property.
Example: UseDevice="gpu"
Properties
This property is read-only.
Observation specifications, specified as an rlFiniteSetSpec
or rlNumericSpec
object or an array containing any combination of such objects. Each element in the array defines
the properties of an environment observation channel, such as its dimensions, data type,
and name.
When you create the approximator object, the constructor function sets the
ObservationInfo property to the input argument
observationInfo.
You can extract observationInfo from an existing environment,
function approximator, or agent using getObservationInfo. You can also construct the specifications manually
using rlFiniteSetSpec
or rlNumericSpec.
This property is read-only.
Action specifications, specified as an rlNumericSpec
object. This object defines the properties of the environment action channel, such as
its dimensions, data type, and name.
Note
For this approximator object, only one action channel is allowed.
When you create the approximator object, the constructor function sets the
ActionInfo property to the input argument
actionInfo.
You can extract ActionInfo from an existing environment,
approximator object, or agent using getActionInfo. You can also construct the specification manually using
rlNumericSpec.
Normalization method, returned as an array in which each element (one for each input
channel defined in the observationInfo and
actionInfo properties, in that order) is one of the following
values:
"none"— Do not normalize the input."rescale-zero-one"— Normalize the input by rescaling it to the interval between 0 and 1. The normalized input Y is (U–Min)./(UpperLimit–LowerLimit), where U is the nonnormalized input. Note that nonnormalized input values lower thanLowerLimitresult in normalized values lower than 0. Similarly, nonnormalized input values higher thanUpperLimitresult in normalized values higher than 1. Here,UpperLimitandLowerLimitare the corresponding properties defined in the specification object of the input channel."rescale-symmetric"— Normalize the input by rescaling it to the interval between –1 and 1. The normalized input Y is 2(U–LowerLimit)./(UpperLimit–LowerLimit) – 1, where U is the nonnormalized input. Note that nonnormalized input values lower thanLowerLimitresult in normalized values lower than –1. Similarly, nonnormalized input values higher thanUpperLimitresult in normalized values higher than 1. Here,UpperLimitandLowerLimitare the corresponding properties defined in the specification object of the input channel.
Note
When you specify the Normalization property of
rlAgentInitializationOptions, normalization is applied only to
the approximator input channels corresponding to rlNumericSpec specification objects in which both the
UpperLimit and LowerLimit properties
are defined. After you create the agent, you can use the setNormalizer function to assign normalizers that use any
normalization method. For more information on normalizer objects, see rlNormalizer.
Example: myActor.Normalization = "rescale-symmetric" sets to
"rescale-symmetric" the Normalization
property of the function approximator myActor.
Computation device used to perform operations such as gradient computation, parameter
update and prediction during training and simulation, specified as either
"cpu" or "gpu".
The "gpu" option requires both Parallel Computing Toolbox™ software and a CUDA® enabled NVIDIA® GPU. For more information on supported GPUs see GPU Computing Requirements (Parallel Computing Toolbox).
You can use gpuDevice (Parallel Computing Toolbox) to query or select a local GPU device to be
used with MATLAB®.
Note
Training or simulating an agent on a GPU involves device-specific numerical round-off errors. Because of these errors, you can get different results on a GPU and on a CPU for the same operation.
To scale up the number of environment simulations by using parallel processing over
multiple cores, you do not need to use this property. Instead, set the
UseParallel training option to "on" or
"auto". For more information about training using multicore
processors and GPUs for training, see Train Agents Using Parallel Computing and GPUs.
Example: myCritic.UseDevice = "gpu" sets to "gpu"
the UseDevice property of the function approximator
myCritic.
Learnable parameters of the approximator object, specified as a cell array of
dlarray objects. This property contains the learnable parameters of
the approximation model used by the approximator object.
Example: myActor.Learnables =
{dlarray(rand(256,4)),dlarray(rand(256,1))} sets the learnable parameters
of the function approximator myActor.
State of the approximator object, specified as a cell array of
dlarray objects. For dlnetwork-based models, this
property contains the Value column of the
State property table of the dlnetwork model.
The elements of the cell array are the state of the recurrent neural network used in the
approximator (if any), as well as the state for the batch normalization layer (if
used).
For model types that are not based on a dlnetwork object, this
property is an empty cell array, since these model types do not support states.
Example: myCritic.State={dlarray(rand(256,1)),dlarray(rand(256,1))}
sets the state of the function approximator myCritic.
Object Functions
rlDDPGAgent | Deep deterministic policy gradient (DDPG) reinforcement learning agent |
rlTD3Agent | Twin-delayed deep deterministic (TD3) policy gradient reinforcement learning agent |
getAction | Obtain action from agent, actor, or policy object given environment observations |
evaluate | Evaluate function approximator object given observation (or observation-action) input data |
gradient | (Not recommended) Evaluate gradient of function approximator object given observation and action input data |
accelerate | (Not recommended) Option to accelerate computation of gradient for approximator object based on neural network |
getLearnableParameters | Obtain learnable parameter values from agent, function approximator, or policy object |
setLearnableParameters | Set learnable parameter values of agent, function approximator, or policy object |
setModel | Set approximation model in function approximator object |
getModel | Get approximation model from function approximator object |
Examples
Create an observation specification object (or alternatively use the getObservationInfo function to extract the specification object from an environment). For this example, define the observation space as a continuous four-dimensional space, so that there is a single observation channel that carries a column vector containing four doubles.
obsInfo = rlNumericSpec([4 1]);
Create an action specification object (or alternatively use the getActionInfo function to extract the specification object from an environment). For this example, define the action space as a continuous two-dimensional space, so that the action channel carries a column vector containing two doubles.
actInfo = rlNumericSpec([2 1]);
A continuous deterministic actor implements a parameterized deterministic policy for a continuous action space. This actor takes the current observation as input and returns as output an action that is a deterministic function of the observation.
To model the parameterized policy within the actor, use a neural network with one input layer (which receives the content of the environment observation channel, as specified by obsInfo) and one output layer (which returns the action to the environment action channel, as specified by actInfo).
Define the network as an array of layer objects, and get the dimension of the observation and action spaces from the environment specification objects.
net = [
featureInputLayer(obsInfo.Dimension(1))
fullyConnectedLayer(32)
reluLayer
fullyConnectedLayer(actInfo.Dimension(1))
];Convert the network to a dlnetwork object and display the number of learnable parameters.
net = dlnetwork(net); summary(net)
Initialized: true
Number of learnables: 226
Inputs:
1 'input' 4 features
Create the actor object with rlContinuousDeterministicActor, using the network and the observation and action specification objects as input arguments. The network input layer is automatically associated with the environment observation channel according to the dimension specifications in obsInfo.
actor = rlContinuousDeterministicActor( ... net, ... obsInfo, ... actInfo)
actor =
rlContinuousDeterministicActor with properties:
ObservationInfo: [1×1 rl.util.rlNumericSpec]
ActionInfo: [1×1 rl.util.rlNumericSpec]
Normalization: "none"
UseDevice: "cpu"
Learnables: {4×1 cell}
State: {0×1 cell}
To check your actor, use the getAction function to return the action from a random observation, using the current network weights.
act = getAction(actor, ...
{rand(obsInfo.Dimension)});
act{1}ans = 2×1 single column vector
-0.0684
-0.2538
You can now use the actor (along with a critic) to create an agent for the environment described by the given specification objects. Examples of agents that can work with continuous action and observation spaces, and use a continuous deterministic actor, are rlDDPGAgent and rlTD3Agent.
For more information on creating approximator objects such as actors and critics, see Create Actors, Critics, and Policy Objects.
Create an observation specification object (or alternatively use the getObservationInfo function to extract the specification object from an environment). For this example, define the observation space as a continuous four-dimensional space, so that there is a single observation channel that carries a column vector containing four doubles.
obsInfo = rlNumericSpec([4 1]);
Create an action specification object (or alternatively use the getActionInfo function to extract the specification object from an environment). For this example, define the action space as a continuous two-dimensional space, so that the action channel carries a column vector containing two doubles.
actInfo = rlNumericSpec([2 1]);
A continuous deterministic actor implements a parameterized deterministic policy for a continuous action space. This actor takes the current observation as input and returns an action as output.
To model the parameterized policy within the actor, use a neural network with one input layer (which receives the content of the environment observation channel, as specified by obsInfo) and one output layer (which returns the action to the environment action channel, as specified by actInfo).
Define the network as an array of layer objects, and get the dimension of the observation and action spaces from the environment specification objects. Name the network input layer obsInLyr so you can later explicitly associate it to the observation input channel.
net = [
featureInputLayer(obsInfo.Dimension(1),Name="obsInLyr")
fullyConnectedLayer(16)
reluLayer
fullyConnectedLayer(actInfo.Dimension(1))
];Convert the network to a dlnetwork object, and display the number of learnable parameters.
net = dlnetwork(net); summary(net)
Initialized: true
Number of learnables: 114
Inputs:
1 'obsInLyr' 4 features
Create the actor object with rlContinuousDeterministicActor, using the network, the observation and action specification objects, and the name of the network input layer to be associated with the environment observation channel.
actor = rlContinuousDeterministicActor(net, ... obsInfo,actInfo, ... Observation="obsInLyr")
actor =
rlContinuousDeterministicActor with properties:
ObservationInfo: [1×1 rl.util.rlNumericSpec]
ActionInfo: [1×1 rl.util.rlNumericSpec]
Normalization: "none"
UseDevice: "cpu"
Learnables: {4×1 cell}
State: {0×1 cell}
To check your actor, use the getAction function to return the action from a batch of 10 random observations, using the current network weights.
robs = rand([obsInfo.Dimension 10]);
act = getAction(actor,{robs});Display the fifth element of the action batch.
act{1}(5)ans = single
0.4152
You can now use the actor (along with a critic) to create an agent for the environment described by the given specification objects. Examples of agents that can work with continuous action and observation spaces, and use a continuous deterministic actor, are rlDDPGAgent and rlTD3Agent.
For more information on creating approximator objects such as actors and critics, see Create Actors, Critics, and Policy Objects.
Create an observation specification object (or alternatively use the getObservationInfo function to extract the specification object from an environment). For this example, define the observation space as consisting of two environment channels, the first containing a two-by-two continuous matrix and the second containing a scalar that can be only 0 or 1.
obsInfo = [rlNumericSpec([2 2])
rlFiniteSetSpec([0 1])];Create a continuous action space specification object (or alternatively use the getActionInfo function to extract the specification object from an environment). For this example, define the action space as a continuous three-dimensional space, so that the environment action channel carries a column vector containing three doubles.
actInfo = rlNumericSpec([3 1]);
A continuous deterministic actor implements a parameterized deterministic policy for a continuous action space. This actor takes a batch of observations as inputs and returns a corresponding batch of actions that are a deterministic function of the observations.
To model the parameterized policy within the actor, use a custom basis function. The function must have two input arguments, each receiving the content of an environment observation channel, as specified by obsInfo.
Note that using local functions to implement a custom basis function is not recommended if you want to save an agent and load it later. This is because local functions are available only in the file in which they are defined, and when you load an agent in the workspace the function is no longer available to the agent. Additionally, local functions are not supported for code generation.
Write a simple custom basis function as a string (alternatively, write your own custom basis function in a file).
str = "function out = myBasisFcn(obsA,obsB)" + newline + ... " out = [obsA(1,1,:).*obsB(1,1,:).^2;" + newline + ... " obsA(2,1,:).*obsB(1,1,:).^2;" + newline + ... " obsA(1,2,:).^2+obsB(1,1,:);" + newline + ... " obsA(2,2,:).^2-obsB(1,1,:)];" + newline + ... "end"
str =
"function out = myBasisFcn(obsA,obsB)
out = [obsA(1,1,:).*obsB(1,1,:).^2;
obsA(2,1,:).*obsB(1,1,:).^2;
obsA(1,2,:).^2+obsB(1,1,:);
obsA(2,2,:).^2-obsB(1,1,:)];
end"
Here, the first two dimensions of the observations are the ones defined in the obsInfo elements, while the third dimension is the batch dimension. Since the training algorithm normally executes on batches of observations and actions at the same time, you have to keep the batch dimension into account when writing your custom basis function. For each element of the batch dimension, the function returns a vector of four elements
Write the string to the myBasisFcn.m file and check that the file exists.
fid=fopen("myBasisFcn.m","w"); fwrite(fid,str,"char"); fclose(fid); exist("myBasisFcn.m","file")
ans = 2
The output of the actor is the vector W'*myBasisFcn(obsA,obsB), which is the action taken as a result of the given observation. The weight matrix W contains the learnable parameters and must have as many rows as the length of the basis function output and as many columns as the dimension of the action space.
Define an initial parameter matrix.
W0 = rand(4,3);
Create the actor. The first argument is a two-element cell containing both the handle to the custom function and the initial weight matrix. The second and third arguments are, respectively, the observation and action specification objects.
actor = rlContinuousDeterministicActor({@myBasisFcn,W0},obsInfo,actInfo)actor =
rlContinuousDeterministicActor with properties:
ObservationInfo: [2×1 rl.util.RLDataSpec]
ActionInfo: [1×1 rl.util.rlNumericSpec]
Normalization: ["none" "none"]
UseDevice: "cpu"
Learnables: {[3×4 dlarray]}
State: {}
To check your actor, use the getAction function to return the action from a given observation, using the current parameter matrix.
a = getAction(actor,{rand(2,2),0})a = 1×1 cell array
{3×1 double}
a{1}ans = 3×1
0.5097
0.4915
0.5625
a = getAction(actor,{rand(2,2),-1});
a{1}ans = 3×1
2.1162
0.8687
2.2511
Note that the actor does not enforce the set constraint for the discrete set elements.
Return a batch of actions resulting from a batch of 5 observations.
obs1 = rand([obsInfo(1).Dimension 5]);
obs2 = rand([obsInfo(2).Dimension 5]);
act = getAction(actor,{obs1,obs2});Display the fourth element in the batch.
act{1}(:,4)ans = 3×1
0.1812
0.0628
0.2245
You can now use the actor (along with a critic) to create an agent for the environment described by the given specification objects. Examples of agents that can work with a mixed observation space, a continuous action space, and use a continuous deterministic actor, are rlDDPGAgent and rlTD3Agent.
For more information on creating approximator objects such as actors and critics, see Create Actors, Critics, and Policy Objects.
Create observation and action information. You can also obtain these specifications from an environment. For this example, define the observation space as a continuous four-dimensional space, so that a single observation channel carries a column vector containing four doubles, and the action space as a continuous two-dimensional space, so that the action channel carries a column vector containing two doubles.
obsInfo = rlNumericSpec([4 1]); actInfo = rlNumericSpec([2 1]);
A continuous deterministic actor implements a parameterized deterministic policy for a continuous action space. This actor takes the current observation as input and returns as output an action that is a deterministic function of the observation.
To model the parameterized policy within the actor, use a neural network with one input layer (which receives the content of the environment observation channel, as specified by obsInfo) and one output layer (which returns the action to the environment action channel, as specified by actInfo).
Define the network as an array of layer objects, and get the dimension of the observation and action spaces from the environment specification objects. Because this network is recurrent, use a sequenceInputLayer as the input layer and include at least one lstmLayer.
net = [
sequenceInputLayer(obsInfo.Dimension(1))
fullyConnectedLayer(10)
reluLayer
lstmLayer(8,OutputMode="sequence")
fullyConnectedLayer(20)
fullyConnectedLayer(actInfo.Dimension(1))
tanhLayer
];Convert the network to a dlnetwork object and display the number of learnable parameters.
net = dlnetwork(net); summary(net)
Initialized: true
Number of learnables: 880
Inputs:
1 'sequenceinput' Sequence input with 4 channels
Create a deterministic actor representation for the network.
actor = rlContinuousDeterministicActor( ... net, ... obsInfo, ... actInfo);
To check your actor, use the getAction function to return the action from a random observation, given the current network weights.
a = getAction(actor, ...
{rand(obsInfo.Dimension)});
a{1}ans = 2×1 single column vector
-0.0742
0.0158
You can use dot notation to extract and set the current state of the recurrent neural network in the actor.
actor.State
ans = 2×1 cell array
{8×1 dlarray}
{8×1 dlarray}
actor.State = {
dlarray(-0.1*rand(8,1))
dlarray(0.1*rand(8,1))
};To evaluate the actor using sequential observations, use the sequence length (time) dimension. For example, obtain actions for a batch of 5 independent sequences each one consisting of 9 sequential observations.
[action,state] = getAction(actor, ...
{rand([obsInfo.Dimension 5 9])});Display the action corresponding to the seventh element of the observation sequence in the fourth sequence.
action = action{1};
action(1,1,4,7)ans = single
-0.2408
Display the updated state of the recurrent neural network.
state
state = 2×1 cell array
{8×5 single}
{8×5 single}
You can now use the actor (along with a critic) to create an agent for the environment described by the given specification objects. Examples of agents that can work with continuous action and observation spaces, and use a continuous deterministic actor, are rlDDPGAgent and rlTD3Agent.
For more information on input and output format for recurrent neural networks, see the Algorithms section of lstmLayer. For more information on creating approximator objects such as actors and critics, see Create Actors, Critics, and Policy Objects.
Extended Capabilities
GPU Arrays
Accelerate code by running on a graphics processing unit (GPU) using Parallel Computing Toolbox™.
Version History
Introduced in R2022a
See Also
Functions
Objects
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)