Отчет по лабораторной работе #3 выполнил(а):
- Амбрушкевич Артем Антонович
- РИ-211002
Отметка о выполнении заданий (заполняется студентом):
Задание | Выполнение | Баллы |
---|---|---|
Задание 1 | * | 60 |
Задание 2 | * | 20 |
Задание 3 | # | 20 |
знак "*" - задание выполнено; знак "#" - задание не выполнено;
Работу проверили:
- к.т.н., доцент Денисов Д.В.
- к.э.н., доцент Панов М.А.
- ст. преп., Фадеев В.О.
Структура отчета
- Данные о работе: название работы, фио, группа, выполненные задания.
- Цель работы.
- Задание 1.
- Код реализации выполнения задания. Визуализация результатов выполнения (если применимо).
- Задание 2.
- Код реализации выполнения задания. Визуализация результатов выполнения (если применимо).
- Выводы.
Познакомиться с программными средствами для создания системы машинного обучения и ее интеграции в Unity.
Ход работы:
-
Создал новый пустой 3D проект на Unity.
-
Скачал папку с ML агентом.
-
В созданный проект добавил ML Agent.
-
Далее запустил Anaconda Prompt для возможности запуска команд через консоль, создал виртуальную среду и ввёл следующие команды для создания и активации нового ML-агента, а также для скачивания необходимых библиотек.
conda create -n MLAGENT python=3.6.13
conda activate MLAGENT
pip install mlagents==0.28.0
pip install torch~=1.7.1 -f https://download.pytorch.org/whl/torch_stable.html
Перешел в папку с unity-проектомcd /d H:\ВУЗ\3 семестр\Дата сайнс в примерах и задачах\lab-3\MLAtest-lab-3
-
Создал на сцене плоскость, куб и сферу. Создал простой C# скрипт-файл и подключил его к сфере. Скрипт:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
public class RollerAgent : Agent
{
Rigidbody rBody;
// Start is called before the first frame update
void Start()
{
rBody = GetComponent<Rigidbody>();
}
public Transform Target;
public override void OnEpisodeBegin()
{
if (this.transform.localPosition.y < 0)
{
this.rBody.angularVelocity = Vector3.zero;
this.rBody.velocity = Vector3.zero;
this.transform.localPosition = new Vector3(0, 0.5f, 0);
}
Target.localPosition = new Vector3(Random.value * 8-4, 0.5f, Random.value * 8-4);
}
public override void CollectObservations(VectorSensor sensor)
{
sensor.AddObservation(Target.localPosition);
sensor.AddObservation(this.transform.localPosition);
sensor.AddObservation(rBody.velocity.x);
sensor.AddObservation(rBody.velocity.z);
}
public float forceMultiplier = 10;
public override void OnActionReceived(ActionBuffers actionBuffers)
{
Vector3 controlSignal = Vector3.zero;
controlSignal.x = actionBuffers.ContinuousActions[0];
controlSignal.z = actionBuffers.ContinuousActions[1];
rBody.AddForce(controlSignal * forceMultiplier);
float distanceToTarget = Vector3.Distance(this.transform.localPosition, Target.localPosition);
if(distanceToTarget < 1.42f)
{
SetReward(1.0f);
EndEpisode();
}
else if (this.transform.localPosition.y < 0)
{
EndEpisode();
}
}
}
- Объекту «сфера» добавил компоненты Rigidbody, Decision Requester, Behavior Parameters и настроил их.
- В корень проекта добавил файл конфигурации нейронной сети
rollerball_config.yaml
. - Запустил работу ml-агента:
mlagents-learn rollerball_config.yaml --run-id=RollerBall --force
- Вернулся в проект Unity, запустил сцену, проверил работу ML-Agent’a.
- Сделал 3 копии модели «Плоскость-Сфера-Куб», запустил симуляцию сцены и наблюдал за результатом обучения модели.
- Сделал 9 копии модели «Плоскость-Сфера-Куб», запустил симуляцию сцены и наблюдал за результатом обучения модели.
- Сделал 27 копии модели «Плоскость-Сфера-Куб», запустил симуляцию сцены и наблюдал за результатом обучения модели.
- После завершения обучения проверил работу модели.
- Выводы из 1 задания: успешно подключил ML-агент, успешно обучил модель и протестировал её.
Подробно описать каждую строку файла конфигурации нейронной сети. Самостоятельно найти информацию о компонентах Decision Requester, Behavior Parameters, добавленных на сфере.
- содержимое файла конфигурации
behaviors: RollerBall: trainer_type: ppo hyperparameters: batch_size: 10 buffer_size: 100 learning_rate: 3.0e-4 beta: 5.0e-4 epsilon: 0.2 lambd: 0.99 num_epoch: 3 learning_rate_schedule: linear network_settings: normalize: false hidden_units: 128 num_layers: 2 reward_signals: extrinsic: gamma: 0.99 strength: 1.0 max_steps: 500000 time_horizon: 64 summary_freq: 10000
Ссылка на документацию ml-агента - https://github.com/Unity-Technologies/ml-agents/blob/main/docs/Training-Configuration-File.md
trainer_type
- (по умолчанию = ppo) Тип используемого тренера: ppo, sac, или poca.hyperparameters
(гиперпараметры):batch_size
- количество опытов в каждой итерации градиентного спуска. Это всегда должно быть в несколько раз меньше, чемbuffer_size.buffer_size
- количество опытов, которые необходимо собрать перед обновлением модели политики. Соответствует тому, сколько опыта должно быть собрано, прежде чем мы будем изучать или обновлять модель.learning_rate
- начальная скорость обучения для градиентного спуска. Соответствует силе каждого шага обновления градиентного спуска. Обычно это значение следует уменьшать, если обучение нестабильно, а вознаграждение не увеличивается постоянно.beta
- сила регуляризации энтропии, которая делает политику «более случайной». Это гарантирует, что агенты должным образом исследуют пространство действия во время обучения. Увеличение этого параметра обеспечит выполнение большего количества случайных действий.epsilon
- влияет на скорость изменения политики во время обучения. Соответствует допустимому порогу расхождения между старой и новой политикой при обновлении градиентного спуска. Установка небольшого значения этого параметра приведет к более стабильным обновлениям, но также замедлит процесс обучения.lambd
- параметр регуляризации (лямбда), используемый при расчете обобщенной оценки преимущества ( GAE ). Это можно рассматривать как то, насколько агент полагается на свою текущую оценку стоимости при вычислении обновленной оценки стоимости.num_epoch
- количество проходов через буфер опыта при выполнении оптимизации градиентного спуска. Чем больше размер партии, тем больше это допустимо. Уменьшение этого параметра обеспечит более стабильные обновления за счет более медленного обучения.learning_rate_schedule
- определяет, как скорость обучения изменяется с течением времени. (linear скорость обучения уменьшается линейно, достигая 0 на max_steps, сохраняя при этом constant скорость обучения постоянной для всего тренировочного прогона.)
network_settings
(сетевые настройки):normalize
- (по умолчанию = false) Применяется ли нормализация к входным данным векторных наблюдений. Эта нормализация основана на скользящем среднем и дисперсии векторного наблюдения. Нормализация может быть полезна в случаях со сложными задачами непрерывного управления, но может быть вредна для более простых задач дискретного управления.hidden_units
- (по умолчанию = 128) Количество единиц в скрытых слоях нейронной сети. Соответствуют количеству единиц в каждом полносвязном слое нейронной сети. Для простых задач, где правильное действие представляет собой простую комбинацию входных данных наблюдения, это значение должно быть небольшим. Для задач, где действие представляет собой очень сложное взаимодействие между переменными наблюдения, это значение должно быть больше.num_layers
- (по умолчанию = 2) Количество скрытых слоев в нейронной сети. Соответствует количеству скрытых слоев после ввода наблюдения или после кодирования CNN визуального наблюдения. Для простых задач меньше слоев, скорее всего, будут обучать быстрее и эффективнее. Для более сложных задач управления может потребоваться больше слоев.
reward_signals
- позволяет задавать настройки как для внешних (т. е. основанных на среде), так и для внутренних сигналов вознаграждения.extrinsic
- настройки для внешних.gamma
- (по умолчанию = 0.99) Фактор скидки для будущих вознаграждений, поступающих из окружающей среды. Это можно рассматривать как то, как далеко в будущем агент должен заботиться о возможных вознаграждениях. В ситуациях, когда агент должен действовать в настоящем, чтобы подготовиться к вознаграждению в отдаленном будущем, это значение должно быть большим.strength
- (по умолчанию = 1.0) Коэффициент, на который умножается вознаграждение, данное средой. Типичные диапазоны будут варьироваться в зависимости от сигнала вознаграждения.
max_steps
- Общее количество шагов (т. е. собранных наблюдений и предпринятых действий), которые необходимо выполнить в среде (или во всех средах при параллельном использовании нескольких) перед завершением процесса обучения.time_horizon
- (по умолчанию = 64) Сколько шагов опыта необходимо собрать для каждого агента, прежде чем добавить его в буфер опыта. Когда этот предел достигается до конца эпизода, оценка значения используется для прогнозирования общего ожидаемого вознаграждения из текущего состояния агента. Таким образом, этот параметр является компромиссом между менее предвзятой, но более высокой оценкой дисперсии.summary_freq
- Количество опытов, которое необходимо собрать перед созданием и отображением статистики обучения. Это определяет детализацию графиков в Tensorboard.
DecisionRequester - компонент, который автоматически запрашивает решения для экземпляра агента через регулярные промежутки времени. Должен быть прикреплён к тому же [GameObject], что и компонент Agent. Компонент DecisionRequester предоставляет удобный и гибкий способ запуска процесса принятия решения агентом. Без DecisionRequester реализация вашего агента должна вручную вызывать функцию RequestDecision().
BehaviorParameters - компонент для настройки поведения экземпляра агента и свойств мозга. Во время выполнения этот компонент генерирует объекты политики агента в соответствии с настройками, указанными в редакторе.
В результате проделанной работы я на простом примере научился пользоваться ml-агентом, узнал что такое машинное обучение и опробовал его в деле, научился настраивать и активировать виртуальную среду в anaconda, также научился добавлять библиотеки в Unity.
BigDigital Team: Denisov | Fadeev | Panov