Pull to refresh

Comments 26

Полный профан в нейронных сетях (я).
Не пойму, почему в скрытом слое именно шесть нейронов? Из каких соображений выбирается это число? Что за данные идут по каждому из шести синапсов между входным и скрытым слоем? Со входом и выходом все понятно…
Я попробовал оставить всего один нейрон в скрытом слое и система тоже смогла обучиться, правда на это ушло в несколько раз больше времени.
Сам далеко не спец в теме, но могу предположить, что на скрытый слой попадают те же нормальзованные значения (-1… +1) горизонтального и вертикального расстояния от центра «птицы» до следующего препятствия (т.к ничего не сказано про входные нейроны — считаем их априори «копирующими»)

Касательно именно 6 нейронов на скрытом слое — предположу что тут замешано «восприятие» сетью положения птички, на основании входных данных (+\-напротив препятствия, +\-напротив перехода от препятствия к пролёту, напротив пролёта, не вижу препятствия).

Все изложенное — некомпетентное ИМХО и мне тоже хотелось бы услышать «правильный ответ» от разбирающихся товарищей.
Упрощенно можно рассматривать нейронную (перцептрон) сеть как систему уравнений n-ой степени. Где переменные — это входные значения, количество нейронов в слое = количество коэффициентов, веса нейронов — значения коэффициентов, а количество слоёв — степень уравнений.
Чтобы понять что мы вообще аппроксимируем нужно построить график — по оси X расстояние до отверстия, а по оси Y — расстояние до центра отверстия. Теперь на пересечении каждого значения, где нужно прыгнуть поставьте точку. Соедините точки и получившаяся фигура и будет то, что мы хотим построить.
Если вы можете без нейронной сети написать функцию, которая строит такую фигуру — вам нейронные сети не нужны. Если напишите систему уравнений, которые решают ту же задачу — тоже. Если же думать не хочется — можно задать примерную структуру системы уравнений, которая теоретически должна решать задачу (т.е. выбрать структуру нейронной сети) и пусть компьютер подбирает коэффициенты этой системы уравнений (имеется в виду процесс обучения сети).
Количество слоев выбирается исходя из сложности функции, которую мы хотим решить (аппроксимировать). Логично, что для аппроксимации прямой хватает 2-х слоёв, а вот гиперболу двумя слоями не аппроксимируешь.
Количество нейронов же обычно подбирается экспериментально. Все упирается во время обучения и итоговую точность, которую нужно получить. В общем данные, которые идут после нейронов скрытого слоя это произведение очередного коэффициента и входящего значения. Для данного случая:
A1*x + A2*x +… +A6*x = 0.5
A1*y + A2*y +… +A6*y = 0.5
где An = вес нейрона, x и y — входящие значения.

Спасибо, что-то начинает вырисовываться.

Для данного случая:
A1*x + A2*x +… +A6*x = 0.5
A1*y + A2*y +… +A6*y = 0.5

а смысл в 6 нейронах тогда?
A1*x + A2*x +… +A6*x = (A1+A2+...+A6)*x = As*x

после вычисления второго слоя применяется функция активации. Последнее время обычно используют просто зануление отрицательной части.
Да, это я как-то очень не удачно пример привёл, а отредактировать из-за премодерации никак. Не столько упростил, сколько запутал. На самом деле весов много (каждая стрелочка на картике — это коэффициент An). Можно давать им трёхзначный коэффициент A111 = вес передачи с 1-ого слоя от 1-ого входа, в 1-й нейрон второго слоя. Количество нейронов в слое влияет не столько на количество коэффициентов в уравнениях, сколько количество самих уравнений в системе. Т.е. допустим наш график — клякса. Каждая выпуклость кляксы — полуокружность. Чем точнее мы хотим её аппорксимировать сетью с двумя слоями, тем больше нам понадобится уравнений полуокружностей — т.е. больше нейронов должно быть в скрытых слоях. Можно, конечно, повышать степень (количество слоев) и описывать уже кусочками N образных кривых уравнений 3-ей степени. Поэтому и получается, что подбор структуры сети процесс творческий.

По теореме Арнольда-Колмогорова Nh = 2Ni+1; т.е. у нас 2 входа, т.е. Nh = 2*2+1 = 5. Т.е. достаточно 5-ти нейронов)

А можете рассказать подробнее, что вы имеете в виду под «достаточностью»? Закономерности в данных бывают сложные, и тогда дополнительные нейроны дадут выигрыш в качестве результата. Посмотрите также комментарий выше от Stawros.
сказано же, подбирается экспериментально)

как писали выше, можно обучить с одним скрытым нейроном, что и выходит из выше показанной формулы, но для более сложных задач, одного нейрона точно не хватит (когда уже больше одного скрытого слоя)
Это чистая эвристика. Вы можете использовать любое кол-во нейронов в скрытом слое, как и самих слоев. Вся суть НС (с учителем) в том, чтоб она аппроксимирует вход на выход. Т.е. это обычная аппроксимация функцией нескольких переменных.

> Что за данные идут по каждому из шести синапсов
это не важно, для вая НС это черный ящык. Никто не в состоянии интерпретировать внутренние данные НС. В общем случае НС внутри обощает паттерны, выделяет среди них общие и использует эти данные для следующих слоев.

Однослойные нейронные сети (с одним скрытым слоем) как в этом случае легко интерпретируются.

а что будет с сетью если добавить немножко проблем из реального мира?


например:
входа не точные и шумят, порой сильно или работают "на глаз" 100-200 пикс. например
входа имеют гистерезис т.е. из за малого выходного воздействия могут не измениться.
датчики имеют задержку по времени которая может изменяться со временем.
в популяции могут погибать так же и лидирующие особи, например с большим шансом в 20%
внешнее воздействие может не сработать или иногда сработать в обратную сторону


наверное очень сильно распухнет нейронная сеть сразу до десятков тысяч штук?
потому что появится необходимость ставить сложные узлы-фильтры входов, обвязывать обратной связью и ставить датчики на срабатывание выхода и тд и тп?
т.е. выйдет то что у меня всегда выходит — какой то адовый мегамонстр который учитывает все эти ньюансы просто в коде и HDL схеме без всяких нейронных сетей.

Видимо, сеть будет дольше учиться
после того как нейросеть научилась выигрывать в этой игре, можно ей дать другую игру? тетрис там или змейку.
есть ли практическая польза от такого обучения?
человек если хорошо играет в одну логическую игру, то он вероятно сможет хорошо играть и в другую. знания из одной игры или вида деятельности помогает в другой игре или виде деятельности.
еще такая мысль. популяции может быть несколько, у каждой популяции разные условия. потом между популяциями устраивать соревнования. или скрещивание представителей из разных популяций.
Нет, если сеть обучилась Flappy Bird, в тетрис она играть не сможет. Теоретически можно построить сеть, которая будет одним входом принимать игру (1 = тетерис / 0 = Flappy Bird), а остальными входами — параметры текущей итерации (хода в игре), но сложность обучения такой сети будет много выше, чем суммарная сложность обучения двух разных сетей (нужно не только научится играть, но и чтобы нейроны, решающие повернуть фигуру в тетрис или нет не реагировали на расстояние до центра отверстия во Flappy Bird). При этом ещё количество входов и выходов различно — строить придется с максимальным количеством входных и выходных нейронов, просто если текущая игра — Flappy Bird, то значение будет только в первом нейроне, остальные должны давать 0.
Жалко не описано, как устроен ген и механизм кроссинговера, это же самое интересное. Пойду читать код
Теперь понятно почему в моей симуляции после кучи птиц с 0 баллов одна вдруг начала играть вообще без проигрышей — похоже ее нейросеть угадала с алгоритмом
Непонятно, зачем вообще входной нейрон расстояния до объекта.
Такими темпами АСУ со своими ПИД-регуляторами скоро останутся не у дел)
Отлично! Обучаем ИИ беспилотника на игре Flappy Bird не врезаться в деревья, а потом отправляем в джунгли отстреливать повстанцев!
1. создаём исходную популяцию из 10 объектов (птиц) со случайными нейронными сетями

Под «случайными нейронными сетями» имеется в виде нейронные сети с различными структурами сети или нейронные сети одной структуры с различными весами?
Sign up to leave a comment.

Articles