Шаг 1. Поговорим о нейронах и методах прямого распространения
Прежде чем начать разговор о нейросетях и о том, как создать и обучить нейросеть, нужно сначала немного разобраться с тем, что такое один нейрон. Здесь всё достаточно просто: нейрон принимает несколько значений, а возвращает только одно, что значит, что он похож на функцию.
Теперь для наилучшего понимания давайте посмотрим на картинку ниже. Там показан круг — это искусственный нейрон. Что он делает? Он получает 5, а возвращает 1. Под вводом понимается сумма трёх синапсов, соединённых с нейроном (это три стрелки слева).
В левой части у нас находятся два входных значения (выделены зелёным цветом) и одно смещение (выделено коричневым цветом).
Входные данные могут быть численными представлениями 2-х различных свойств. К примеру, когда создаёшь спам-фильтр, они могут означать наличие больше чем одного слова, написанного прописными буквами, и наличие слова «Виагра».
Также следует понимать, что входные значения умножаются на собственные так называемые «веса» — в нашем случае это 7 и 3 (выделены синим).
Позже полученные значения складываются со смещением, и получается число 5, которое у нас выделено красным. Именно так и выглядит ввод искусственного нейрона.
Идём далее. Нейрон выполняет вычисление, выдавая выходное значение. Мы получили 1, так как именно единице равно округлённое значение сигмоиды в точке 5. Если, опять же, вспомнить про спам-фильтр, то факт вывода единицы означал бы, что текст был помечен нейроном в качестве спама.
Объединив эти нейроны, вы получите в итоге прямо распространяющуюся нейросеть. В ней процесс идёт от ввода к выводу и через нейроны, которые соединены синапсами.
Для наилучшего понимания этого процесса посмотрите серию видео на английском, от Welch Labs.
Среда для разработки
- mlagents
- numpy (не выше 1.19.4)
- torch (не ниже 1.7.1)
- CUDA Toolkit
Шаг 2. Сигмоида
Прежде чем приступить к следующему шагу, было бы неплохо ознакомиться с 4-й неделей курса по Machine Learning от Coursera — она как раз посвящена нейросетям и помогла бы вам разобраться в особенностях и принципах их работы. Да, этот курс слишком сильно углубляется в математику, плюс основан на Octave, хотя многие предпочитают язык программирования Python. Но все же там можно почерпнуть много полезных знаний.
Вернёмся к нашей сигмоиде. Дело в том, что она фигурирует во многих аспектах нейронных сетей. Её описание вы можете посмотреть, к примеру, здесь. Но на одной теории, сами понимаете, далеко не уедешь. Именно поэтому для наилучшего понимания следует создавать её самостоятельно. Чтобы это сделать, необходимо написать реализацию алгоритма логистической регрессии, использующего сигмоиду.
Если честно, это может занять целый день, причём результат будет далёк от идеального. Вот, к примеру, как с этим справился Per Harald Borgen, англоязычная статья которого стала основой материала, который вы сейчас читаете. Но главное здесь не в том, чтобы сделать всё идеально, а в том, чтобы разобраться, как всё работает. И понять, как устроена сигмоида.
Шаг 3. О методе обратного распространения ошибки
Понимание принципа работы нейронной сети, начиная от ввода, заканчивая выводом, вряд ли вызовет у вас затруднения. Намного тяжелее понять, каким образом нейронная сеть обучается, используя для этого наборы данных. Один из применяемых принципов называют методом обратного распространения ошибки.
Если говорить коротко, то вы оцениваете, насколько сильно ошиблась нейросеть, а потом изменяете вес входных значений (на первой картинке это синие числа).
Собственно говоря, процесс движется от конца к началу, ведь мы начинаем с конца сети и смотрим, как сильно догадка сети отклоняется от истины. Затем мы двигаемся назад, изменяя веса, и так до тех пор, пока не дойдём до ввода. А для вычисления всего этого вручную вам потребуется знание математического анализа. Однако вы можете на заморачиваться и использовать библиотеки, которые всё посчитают за вас.
Если вас интересуют англоязычные источники, которые помогут разобраться в данном методе, то хорошо известны следующие: • A Step by Step Backpropagation Example; • Hacker’s guide to Neural Networks; • Using neural nets to recognize handwritten digits.
Однако учтите, что читая первые 2 статьи, вам обязательно придётся кодить самому, что поможет в дальнейшем. Избегать этого не рекомендуется, ведь в нейронных сетях невозможно разобраться, не практикуя. В 3-й статье находится материал размером с книгу, больше напоминающую энциклопедию. Зато в ней даны подробные разъяснения важнейших принципов работы нейронных сетей. К примеру, вы изучите такие определения, как функция стоимости, градиентный спуск, функция активации, скрытые слои, выходные и входные слои и т. д. После освоения такого материала вы достигнете более высокого уровня понимания.
Шаг 4. Создание своей нейросети. Как написать нейронную сеть? Пишем и обучаем
Читая разные статьи и руководства, вы так или иначе будете создавать небольшие нейросети. Сегодня сказано и рассказано много о соответствующих моделях, задачах и способах их решения. Некоторые статьи являются сложными, а некоторые простыми, понятными для любого человека. И все это очень эффективно для процесса обучения.
Пример очень полезной информации можно найти здесь. В этом материале удивительное количество знаний сжато до 11 строк кода.
Прочитав вышеупомянутую статью и реализовав приведённые в ней примеры самостоятельно, вы закроете много пробелов в знаниях, а когда всё получится, почувствуете себя суперчеловеком)).
Что ещё? Ну, при реализации многих примеров используются векторные вычисления, поэтому понимание линейной алгебры тоже потребуется. Если же интересуют нейронные сети посложнее, то вот вам новое руководство.
С его помощью вы сможете как написать свою нейросеть, так и поэкспериментировать с уже созданными. Довольно забавным бывает найти нужный набор данных, а потом проверить разные предположения с помощью нескольких нейросетей.
Создаем нейронную сеть в Unity
public override void CollectObservations(VectorSensor sensor) { (); (); }
public override void OnActionReceived(ActionBuffers actions) { float moveX =; float moveZ =; float moveSpeed = 1f; += new Vector3(moveX, 0, moveZ) * * moveSpeed; }
public override void Heuristic(in ActionBuffers actionsOut) { ActionSegment<float> continuousActions =; continuousActions[0] = («Horizontal»); continuousActions[1] = («Vertical»); } private void OnTriggerEnter(Collider other) { if (<Goal>(out Goal goal)) { SetReward(+1f); EndEpisode(); } if (<Wall>(out Wall wall)) { SetReward(-1f); EndEpisode(); } }
Часто задаваемые вопросы о создании нейросети
Вопрос: С чего начать создание своей первой нейросети?
Ответ: Начните с изучения основ линейной алгебры, математического анализа и языка программирования Python, затем переходите к простейшим архитектурам, например, перцептрону.
Вопрос: Можно ли создать нейросеть без знания математики?
Ответ: Базовое понимание математики (производные, матричные операции) необходимо для понимания принципов обучения, но некоторые высокоуровневые библиотеки позволяют экспериментировать с готовыми блоками.
Вопрос: Какой язык программирования лучше всего подходит?
Ответ: Python является де-факто стандартом благодаря обширным библиотекам (TensorFlow, PyTorch), но нейросети можно писать на C++, Java, JavaScript и даже в средах вроде Unity.
Вопрос: Что такое метод обратного распространения ошибки?
Ответ: Это ключевой алгоритм обучения, который вычисляет градиент функции потерь по весам сети, начиная с выходного слоя и двигаясь назад, чтобы минимизировать ошибку.
Вопрос: Зачем нужна функция активации (сигмоида)?
Ответ: Функция активации, такая как сигмоида, добавляет нелинейность в модель, позволяя сети обучаться и представлять сложные зависимости между данными.
Вопрос: Что такое эпоха и итерация в обучении?
Ответ: Итерация — это один шаг обновления весов на одном пакете данных. Эпоха — это полный проход всего набора данных для обучения через нейросеть.
Вопрос: Как понять, что нейросеть переобучилась?
Ответ: Главный признак — высокая точность на обучающих данных и низкая на проверочных (валидационных). Помогают методы регуляризации и dropout.
Вопрос: Можно ли обучить нейросеть на обычном компьютере?
Ответ: Да, для небольших сетей и датасетов достаточно CPU. Для более сложных моделей желательно использовать GPU или облачные сервисы.
Вопрос: Что такое среда разработки и какую выбрать?
Ответ: Это набор инструментов для написания кода. Для начала подойдут Jupyter Notebook для экспериментов и PyCharm/VSCode для больших проектов.
Вопрос: Где взять данные для обучения нейросети?
Ответ: Используйте открытые датасеты (Kaggle, UCI Repository), собирайте свои данные или применяйте методы аугментации для увеличения существующих наборов.
Краткий чек-лист: путь от идеи до рабочей нейросети
- Четко сформулируйте задачу, которую должна решать нейросеть (классификация, регрессия, генерация).
- Изучите математические основы: линейную алгебру, теорию вероятностей и основы матанализа.
- Выберите и установите язык программирования (рекомендуется Python) и среду разработки.
- Установите необходимые библиотеки для машинного обучения (NumPy, TensorFlow/PyTorch).
- Найдите или создайте размеченный набор данных для обучения и тестирования.
- Определитесь с архитектурой сети (количество слоев, нейронов, функций активации).
- Реализуйте алгоритм прямого распространения (forward pass).
- Реализуйте функцию потерь для оценки ошибки сети.
- Реализуйте алгоритм обратного распространения ошибки (backpropagation) для обновления весов.
- Настройте гиперпараметры: скорость обучения, размер пакета, количество эпох.
- Запустите процесс обучения и отслеживайте метрики на тренировочном и валидационном наборах.
- Примените методы борьбы с переобучением (регуляризация, dropout), если это необходимо.
- Протестируйте окончательную модель на отдельном тестовом наборе данных.
- Оптимизируйте код и модель для повышения скорости и точности.
- Задокументируйте процесс, параметры модели и полученные результаты.



























