Возможно, вы слышали, что нейронные сети являются « универсальными аппроксиматорами функций ». В сущности, теорема Кибенко говорит, что для любого отображения функции от реального к реальному вы можете аппроксимировать ее нейронной сетью с сигмоидальными функциями активации. Фактически, оказывается, что нейронные сети позволяют вам вычислять любую функцию, которая вычисляется на машине Тьюринга (т.е. все, что вы можете написать алгоритм для вычисления). К сожалению, эти доказательства говорят только о том, что для некоторой конечной конфигурации нейронов и весов вы можете аппроксимировать любую функцию.
Теория хороша и хороша, но ваш вопрос, кажется, больше похож на то, как на самом деле кодировать вычисление некоторой функции в набор нейронов и весов. Для иллюстрации рассмотрим простой пример - эксклюзив или. XOR принимает два входа, передает эти входы. Когда один и только один из входов активирован, то активируется выходной узел. Если оба входа не активированы, выходной узел не активируется.
Обратите внимание, что три скрытых узла делают разные вещи. Самый левый и самый правый узлы просто проходят через соответствующие входные узлы. Средний нейрон принимает два входа и как-то отрицает их, если они оба включены. Это умное объединение и рекомбинация входных данных - это, по сути, работа в нейронной сети.
Очевидно, что для более сложных функций объединение и рекомбинация должны выполняться более умными и сложными способами, но это по сути то, что происходит на низком уровне. Сумасшедшая вещь в том, что это действительно все, что вам нужно для вычисления любой вычислимой функции! С другой стороны, машины Тьюринга также оказываются обманчиво простыми ...
Проблема в том, что у нас нет способа магически генерировать нейронную сеть, которая вычисляет некоторую произвольную функцию. Доказательства только говорят нам, что есть какая-то сеть, которая могла бы это сделать. Когда мы обучаем наши нейронные сети, мы просто пытаемся найти сеть, которая довольно близка.
В контексте распознавания изображений вы можете представить шаблоны кодирования в сети. Например, чтобы распознать число «1», вы можете представить себе скрытые узлы, которые ожидают, что столбец пикселей будет в основном или полностью активирован, а соседние пиксели отключены. Этот скрытый узел может быть достаточно хорош для распознавания прямой линии в этом конкретном столбце. Сложите их вместе, и довольно скоро у вас будет множество узлов, которые делают это в достаточном количестве мест на вашем изображении, поэтому, если я покажу сети один, будет активировано достаточно скрытых узлов по прямой линии, что указывает на «1». Конечно, проблемой становится обобщение сети, чтобы она могла распознавать различный набор входных данных.
Надеюсь, это поможет вам более или менее понять, как нейронная сеть может выполнять вычисления. Однако вы столкнулись с вопросом, который довольно важен для нейронных сетей: в общем, в лучшем случае трудно понять, почему сеть выделяет определенный вывод, особенно если учесть, что для чего-то вроде распознавания изображений сети обычно достаточно большой, чтобы людям было трудно понять каждую из движущихся частей машины. Еще более усложняет дело то, что в большинстве случаев нейронные сети на самом деле не имеют одного скрытого узла для каждой маленькой функции, которую сеть может узнать о данных. Вместо этого обнаружение чего-то вроде прямой линии для классификации числа «1» будет происходить нецентрализованно по многим скрытым узлам. Другие алгоритмы,
Если вы хотите больше читать, я настоятельно рекомендую прочитать этот урок на ai junkie. В нем рассказывается об основных принципах работы нейронной сети и даже приводится простой пример кода, позволяющий нейронным сетям вести танк к цели. Учебное пособие, однако, не охватывает обратное распространение, которое на сегодняшний день является наиболее распространенным способом обучения нейронных сетей, и вместо этого использует простой генетический алгоритм. Как только он начнет говорить о генетике, я думаю, вы можете перестать читать ...