Descubriendo AWS DeepRacer: Liga Estudiantes, Dudas
Tags: alianzatechskills2jobs
Published: 2024-01-17 16:36:59

---
series: Descubriendo AWS DeepRacer
---

Edición: Germán Arrocha (AWS) y Guillermo Ruiz (AWS)

En los últimos días, aquellos que estáis participando en la Liga de Estudiantes nos habéis formulado una serie de preguntas sobre lo que se puede y no se puede modificar en el servicio DeepRacer.

Actualmente, la **AWS Student League** (ojo, esto no aplica si estáis usando el servicio DeepRacer fuera de la Liga de Estudiantes) **sólo permite cambiar la función de recompensa** y todos los participantes usarán los mismos valores para el **Espacio de Acciones** y para los **hiperparámetros** de entrenamiento del modelo.
De este modo se intenta que todos tengan las mismas herramientas, y abstraerse de estos parámetros que son más avanzados.
 
Existe una forma de saber qué valores son los que se están utilizando descargando el modelo de la consola tras el entrenamiento.
 
Si descomprimimos el fichero **<nombre_modelo>.tar.gz** en un directorio, dentro encontraremos dos ficheros .json:

- model_metadata.json
- worker_0.multi_agent_graph_0.json
 
Dentro de estos ficheros podemos ver qué valores se han usado. Hemos creado dos modelos para verlo: uno con el algoritmo **PPO (Proximal Policy Optimization)** y otro con **SAC (Soft Actor Critic)**.

> **PPO** es un algoritmo de aprendizaje por refuerzo que ayuda a que nuestro vehículo aprenda a tomar decisiones óptimas, ajustando las acciones tomadas en función de las recompensas recibidas. Esto lo hace manteniendo las actualizaciones "cercanas" a la política anterior para evitar cambios drásticos. Es como aprender a conducir un coche de carreras ajustando su velocidad y dirección poco a poco para mejorar.

> **SAC** es otro algoritmo de aprendizaje por refuerzo. A diferencia de PPO, SAC es más flexible y permite aprender de manera más suave y eficiente. SAC se enfoca en maximizar tanto las recompensas como la entropía, lo que significa que busca aprender a tomar decisiones efectivas mientras mantiene la exploración. Imagina que mientras conduces tu coche, no solo quieres ganar, sino también experimentar cosas nuevas en el transcurso del aprendizaje.

En cuanto a el **Action Space**, para ambos algoritmos es el mismo:

```
{
  "action_space" : {
    "steering_angle" : {
      "high" : 30.0,
      "low" : -30.0
    },
    "speed" : {
      "high" : 1.0,
      "low" : 0.5
    }
  },
  "sensor" : [ "FRONT_FACING_CAMERA" ],
  "neural_network" : "DEEP_CONVOLUTIONAL_NETWORK_SHALLOW",
  "version" : "4",
  "training_algorithm" : "clipped_ppo",
  "action_space_type" : "continuous"
}
```

Recordad que el **action_space** define el espacio de acciones disponibles para el modelo. En nuestro caso, se utiliza un espacio continuo,  donde el ángulo de dirección (steering_angle) oscila entre -30.0 grados a 30.0 grados y la velocidad (speed) en un rango de 0.5 a 1.0 m/s.
 
Esta limitación en la velocidad significa que el modelo no podrá superar la marca de 1 m/s durante la simulación, ya que ese es el límite superior. Si deseamos motivar al modelo a aumentar la velocidad utilizando el parámetro 'speed', es esencial tener en cuenta que no puede exceder ese valor máximo. Por ejemplo, si multiplicamos la recompensa por la velocidad, el modelo intentará aumentar la velocidad, pero si queremos penalizar velocidades por debajo de un valor específico, este valor debe ser menor que 1 m/s.
 
En cuanto a los **hyperparameters**, en el segundo fichero podéis encontrar algunos valores, aunque realmente no podéis modificarlos.
 
Para el caso de **SAC**:
 
```
"DeepRacerRacetrackEnvParameters" {
    "agents_params": {
        "0": {
            "algorithm": {
                "act_for_full_episodes": false,
                "apply_gradients_every_x_episodes": 5,
                "discount": 0.999,
                "distributed_coach_synchronization_type": {
                    "_value_": "sync",
                    "_name_": "SYNC",
                    "__objclass__": "<enum 'DistributedCoachSynchronizationType'>"
                },
                "heatup_using_network_decisions": false,
                "in_action_space": null,
                "load_memory_from_file_path": null,
                "n_step": -1,
                "num_consecutive_playing_steps": {
                    "_num_steps": 1,
                    "__class__": "EnvironmentSteps"
                },
                "num_consecutive_training_steps": 1,
                "num_steps_between_copying_online_weights_to_target": {
                    "_num_steps": 20,
                    "__class__": "EnvironmentSteps"
                },
                "rate_for_copying_weights_to_target": 1,
                "share_statistics_between_workers": true,
                "store_transitions_only_when_episodes_are_terminated": false,
                "supports_parameter_noise": false,
                "use_accumulated_reward_as_measurement": false,
                "use_deterministic_for_evaluation": true,
                "__class__": "SoftActorCriticAlgorithmParameters"
            },
```
 
Para **PPO**:
 

```
"DeepRacerRacetrackEnvParameters" {
    "agents_params": {
        "0": {
            "algorithm": {
                "act_for_full_episodes": true,
                "apply_gradients_every_x_episodes": 5,
                "beta_entropy": 0.01,
                "clip_likelihood_ratio_using_epsilon": 0.2,
                "clipping_decay_schedule": {
                    "current_value": 1,
                    "initial_value": 1,
                    "__class__": "ConstantSchedule"
                },
                "discount": 0.999,
                "distributed_coach_synchronization_type": {
                    "_value_": "sync",
                    "_name_": "SYNC",
                    "__objclass__": "<enum 'DistributedCoachSynchronizationType'>"
                },
                "estimate_state_value_using_gae": true,
                "gae_lambda": 0.95,
                "heatup_using_network_decisions": false,
                "in_action_space": null,
                "load_memory_from_file_path": null,
                "n_step": -1,
                "normalization_stats": null,
                "num_consecutive_playing_steps": {
                    "_num_steps": 20,
                    "__class__": "EnvironmentEpisodes"
                },
                "num_consecutive_training_steps": 1,
                "num_episodes_in_experience_replay": 1000000,
                "num_steps_between_copying_online_weights_to_target": {
                    "_num_steps": 20,
                    "__class__": "EnvironmentEpisodes"
                },
                "optimization_epochs": 10,
                "policy_gradient_rescaler": {
                    "_value_": 8,
                    "_name_": "GAE",
                    "__objclass__": "<enum 'PolicyGradientRescaler'>"
                },
                "rate_for_copying_weights_to_target": 1.0,
                "share_statistics_between_workers": true,
                "store_transitions_only_when_episodes_are_terminated": false,
                "supports_parameter_noise": false,
                "use_accumulated_reward_as_measurement": false,
                "use_kl_regularization": false,
                "__class__": "ClippedPPOAlgorithmParameters"
            },
```

A grandes rasgos, algunos de los elementos clave son:

**agents_params**: Esta sección parece definir parámetros específicos para los agentes de aprendizaje.

**algorithm**: Dentro de cada agente, se especifica el algoritmo de aprendizaje utilizado.  "SoftActorCriticAlgorithmParameters", para el algoritmo SAC, y "ClippedPPOAlgorithmParameters" para PPO.

Dentro de **algorithm**, hay varias configuraciones específicas del algoritmo, como la frecuencia con la que se aplican gradientes, el descuento aplicado a las recompensas futuras, la sincronización entre agentes, el uso de memoria y otros parámetros relacionados con la forma en que los agentes aprenden y toman decisiones.

Por ejemplo, **use_deterministic_for_evaluation** se refiere a si se deben tomar decisiones determinísticas o estocásticas durante la evaluación del modelo.

Además, se observa la configuración de **num_steps_between_copying_online_weights_to_target**, que indica con qué frecuencia se copian los pesos de la red neuronal en línea (online) a la red objetivo (target). Por ejemplo, si esta configuración se establece en 20, significa que después de cada 20 pasos de entrenamiento (o 20 episodios), los pesos de la red en línea se copiarán a la red objetivo. Esto ayuda a estabilizar y acelerar el proceso de entrenamiento al garantizar que la red objetivo se mantenga actualizada con los avances de la red en línea, pero no se actualice en cada paso para evitar fluctuaciones abruptas.

En definitiva, el fichero contiene información detallada sobre cómo se configuran y entrenan los agentes de aprendizaje automático que controlan los vehículos en el entorno DeepRacer. Y aunque nos hemos adentrado en detalles que están fuera del alcance de la competición, nunca está de más conocer los distintos componentes de los modelos de entrenamiento. Nos vemos en la siguiente!

Únete a la comunidad de desarrolladores de AWS para aprender más: https://dev.to/aws-espanol/impulsa-tu-carrera-unete-a-la-comunidad-de-desarrolladores-de-aws-en-iberia-user-groups-h0m