[Перевод] Возможно, вам не нужно машинное обучение


Машинное обучение — модная технология, поэтому её часто используют в ситуации, когда существует более простое, эффективное и надёжное решение. На днях мне попался наглядный и забавный пример: «Нейросетевые машины и генетические алгоритмы». Всю эту навороченную систему легко заменить простым многочленом без потери функциональности. Машинное обучение тут явный перебор.
Выше показана моя реализация с многочленом. Жена нарисовала фон. Никакого поиска пути, машинки просто катаются «по рельсам», так сказать.

Не хочу придираться к этому конкретному проекту. Вероятно, автор стремился применить нейросеть к чему-нибудь. Многие из моих собственных проектов — не более чем средство попробовать что-то новое. Поэтому могу его понять. Но в профессиональной среде следует относиться к этому более скептически. Например, не использовать для выборочного распределения машинное обучение, если подходит квазислучайная последовательность.

На видео у машинки есть радиус поворота, минимальная и максимальная скорости (я сохранил эти параметры в собственной симуляции). Есть пять датчиков — вперёд, по диагоналям, влево и вправо — каждый измеряет расстояние до ближайшей стены. Они подаются в трёхслойную нейросеть, а на выдаче мы получаем необходимое ускорение/торможение и поворот руля. Звучит круто!

4a637a2d07acb7c95304ed8cc1cc5be3.svg

Ключевая особенность нейросетей в том, что выходы являются нелинейной функцией входов. Однако управление двумерным автомобилем достаточно простое. Здесь более чем достаточно линейной функции, а нейронные сети не нужны. Вот мои уравнения:

рулевое управление = C0*input1 - C0*input3
ускорение/торможение = C1*input2


Достаточно всего трёх значений на входе. Расстояние до стены впереди определяет показатель газ/торможение, а две диагонали определяют поворот руля. И два коэффициента C0 и C1. Оптимальные значения зависят от компоновки трассы и конфигурации автомобиля, но в моей модели достаточно хорошо подходят практически любые значения от 0 до 1. Здесь вопрос не столько об аварийности, сколько о скорости прохождения трассы.

Длина красных линий — это три входных значения:


Очевидно, многочлены вычисляются гораздо быстрее нейросети, при этом они понятнее и проще в отладке. Я могу уверенно рассуждать обо всём диапазоне возможных входных значений, а не беспокоиться, что нейронка странно реагирует на непроверенные входные сигналы.

Программа случайным образом генерирует коэффициенты для исследования пространства. Для гонки на скорости я бы запустил несколько тысяч тестов и выбрал оптимальные коэффициенты. Например, вот оптимальные коэффициенты для быстрого прохождения трассы, описанной в начале статьи:

C0 = 0.896336973, C1 = 0.0354805067


Многие коэффициенты подходят, но некоторые дают более высокую скорость. Если бы я разрабатывал ИИ для гоночного симулятора, то заезд ботов мог бы выглядеть так:

Если хотите поиграть сами, вот исходный код на C для движка ИИ и визуализации:

aidrivers.с

Трассы можно нарисовать в любом редакторе, цвета указаны в заголовке файла с исходным кодом.

См. также:
Нет, вам не нужно машинное обучение. Вам нужен SQL

© Habrahabr.ru