Mot clé : lesson

Les leçons permettent de découper l’enseignement d’un concept en phases. Le découpage d’un curriculum en phases est utile dans les cas suivants :

  • Croissance manuelle du curriculum : l’IA commence par des tâches plus faciles et finit par des tâches plus difficiles.
  • Randomisation de domaine : les conditions de démarrage pour l’IA sont randomisées pour chaque épisode.

Des leçons bien structurées peuvent réduire le temps total nécessaire à l’entraînement de l’IA sur un concept.

Usage

Vous pouvez utiliser plusieurs leçons au sein d’un curriculum. Quand un curriculum comprend plusieurs leçons, celles-ci sont exécutées dans l’ordre dans lequel elles sont déclarées.

Une clause scenario peut être utilisée afin de restreindre le simulateur pour la leçon associée. Quand la clause scenario est utilisée, les leçons suivantes doivent réduire de manière incrémentielle les restrictions de sorte que l’espace d’exploration devienne plus grand et que le concept associé soit plus difficile à maîtriser.

Par exemple, une contrainte de plage utilisée dans un scénario de leçon donné doit être égale à la contrainte de scénario correspondante utilisée dans une leçon précédente ou être moins restrictive que cette contrainte.

Paramètres d’entraînement pour une leçon

Vous pouvez ajuster les paramètres d’entraînement suivants pour la leçon avec la clause training :

Paramètre Valeurs Default Description
LessonRewardThreshold number None Valeur de récompense minimale qui compte comme une réussite.
LessonSuccessThreshold number<0 .. 1> 0,90 (90 %) Taux de réussite minimal pour terminer la leçon.
LessonAssessmentWindow Number.UInt32 30 Nombre d’épisodes par évaluation. Utilisé pour calculer LessonRewardThreshold et LessonSuccessThreshold.

Les valeurs de paramètre spécifiées au niveau de la leçon remplacent toutes les valeurs éventuellement spécifiées au niveau du programme.

Par exemple :

concept MyConcept(input: SimState): BrainAction {
  curriculum {
    training {
      EpisodeIterationLimit: 250,
      TotalIterationLimit: 100000
    }

    ...

    lesson MyLesson {
      training {
        LessonRewardThreshold: 120
      }
    }
  }
}

LessonRewardThreshold

Prise en charge uniquement pour le curriculum basé sur les fonctions de récompense et de fin.

Quand une fraction suffisante des épisodes de test d’une évaluation (comme indiqué par LessonSuccessThreshold) atteint ou dépasse la valeur LessonRewardThreshold, le moteur d’entraînement considère la leçon comme terminée et passe à la leçon suivante du curriculum.

Si la définition de la leçon n’inclut pas de seuil de récompense, le moteur d’entraînement utilise un test de convergence générale pour déterminer à quel moment la leçon est terminée.

LessonSuccessThreshold

Quand le taux de réussite de l’épisode dans une évaluation dépasse la valeur LessonSuccessThreshold, le moteur d’entraînement considère la leçon comme terminée et passe à la leçon suivante du curriculum.

La valeur doit être comprise entre 0 et 1 et représente une fraction cible.

LessonAssessmentWindow

Définit le nombre d’épisodes de test par évaluation. Les évaluations sont des groupes d’épisodes de test régulièrement exécutés pour évaluer l’IA pendant l’entraînement. Les transitions de leçon basées sur les paramètres LessonSuccessThreshold et LessonRewardThreshold sont évaluées après chaque évaluation. L’arrêt automatique de l’entraînement (voir NoProgressIterationLimit) est également basé sur les performances de l’évaluation.

Exemple multi-leçon

Dans cet exemple, les leçons scindent en deux phases la tâche consistant à jouer au jeu d’arcade classique Breakout :

  • ConstantBreakout : entraîne l’IA avec un paramètre de configuration fixe.
  • VaryBreakout : entraîne l’IA avec un paramètre de configuration variable.

Le type spécifié après le jeton scenario dans l’exemple doit être compatible avec le type de configuration défini dans la déclaration de simulateur (BreakoutConfig).

# Type definitions
type BreakoutConfig {
  level: Number.UInt16,
  paddle_width: number<1 .. 4>,
  bricks_percent: number
}

type PlayerMove number<Left = -1, Stay = 0, Right = 1>

type GameState {
  pixels: number<84, 336>[1024][1024]
}

# Graph definition
graph (input: GameState) {
  concept HighScore(input): PlayerMove {
    curriculum {
      source simulator (action: PlayerMove, config: BreakoutConfig): GameState {}

      # First lesson
      lesson ConstantBreakout {
        scenario {
          level: 1,
          paddle_width: 4,
          bricks_percent: 1
        }

        training {
          LessonRewardThreshold: 120
        }
      }

      # Second lesson
      lesson VaryBreakout {
        scenario {
          level: Number.UInt16<1 .. 100>,
          paddle_width: number<1 .. 4>,
          bricks_percent: number<0.1 .. 1 step 0.01>
        }

        training {
          LessonRewardThreshold: 160
        }
      }
    }
  }
}