Почему нейронные сети с одинаковыми свойствами отличаются?

Вступление

Я очень плохо знаком с искусственным интеллектом, машинным обучением и нейронной сетью.

Я попытался закодировать некоторые вещи с помощью библиотеки FANN (Fast Artificial Neural Network) (C++) для тестирования возможностей системы такого типа.

программирование

Я сделал небольшой фрагмент кода, который генерирует учебный файл для обработки контролируемого обучения. Я уже провел некоторый тест, но он помог понять ту же проблему, что и между организацией скрытых слоев и способностью ИИ.

Чтобы объяснить мои наблюдения, я буду использовать обозначение ABC-[...]-X, чтобы изобразить конфигурацию входных нейронов A, B нейронов на первом скрытом слое, C нейронов на втором, ... и X выходных нейронов.

В этом тесте обучающие данные представляли собой случайный результат 2k работающей функции NOT (f(0)=1; f(1)=0) (эквивалент "!" Во многих языках). Также обратите внимание, что Epoch представляет собой 1 тренировочный тест по всем данным обучения. "ИИ" будет представлять собой обученный ИНС.

В данных обучения не было ошибок.

Вы можете найти весь исходный код на моем GitHub Repo.

Больше не лучше

Во-первых, я заметил, что система 1-1-1 более мощная в 37 эпох, чем 1-[50 слоев 5 нейронов]-1 в 20 тысячах эпох (0,0001 ошибок по сравнению с 0,25).

Мое первое, хотя было то, что второму ИИ нужно больше тренироваться, потому что нужно свести к минимуму больше затрат, но я не уверен, что это единственная причина.

Это побудило меня попробовать некоторые тесты с одинаковым общим количеством нейронов.

Равно не равно

Конфигурация 1-2-2-1 кажется более эффективной, чем 1-4-1

На самом деле, когда я запускаю тест на этих двух разных конфигурациях, я получаю эти выходные данные (программа тестирования написана самостоятельно). Это два разных теста, "9**" - текущий индекс теста.

Тест состоит в том, чтобы дать AI случайное значение от 0 до 1 и распечатать вывод. Каждый тест проводился отдельно.

// 1-2-2-1
[936]Number : 0.000000, output : 1.000000
[937]Number : 1.000000, output : 0.009162
[938]Number : 0.000000, output : 1.000000
[939]Number : 0.000000, output : 1.000000
[940]Number : 1.000000, output : 0.009162
[941]Number : 0.000000, output : 1.000000
[942]Number : 0.000000, output : 1.000000

// 1-4-1
[936]Number : 0.000000, output : 1.000000
[937]Number : 0.000000, output : 1.000000
[938]Number : 1.000000, output : 0.024513
[939]Number : 0.000000, output : 1.000000
[940]Number : 0.000000, output : 1.000000
[941]Number : 1.000000, output : 0.024513
[942]Number : 1.000000, output : 0.024513

Вы можете заметить, что первый конфиг дает результат ближе к 0, чем второй. (0,009162 против 0,024513). Это не проблема кодирования IEEE, и эти 2 значения не меняются, если я запускаю другой тест.

В чем причина этого? Попробуем разобраться.

  • Сколько "синапсов" у нас в первом конфиге?

первый

first[0]->second[0]
first[0]->second[1]

затем

second[0]->third[0]
second[0]->third[1]
second[1]->third[0]
second[1]->third[1]

окончательный

third[0]->first[0]
third[1]->first[0]

Таким образом, мы получаем общее количество синапсов 2 + 4 + 2 = 8. (и так 8 различных весовых возможностей).

  • Как насчет второй конфигурации?

первый

first[0]->second[0]
first[0]->second[1]
first[0]->second[2]
first[0]->second[3]

окончательный

second[0]->third[0]
second[1]->third[0]
second[2]->third[0]
second[3]->third[0]

Таким образом, мы получаем в общей сложности 4 + 4 = 8 синапсов. (еще 8 различных весовых возможностей).

И в обеих системах у нас есть 4 функции активации (1 для каждого нейрона).

Как мы можем получить значительную разницу возможностей с одинаковыми свойствами?

1 ответ

В общем, наличие большого количества узлов и весов может привести к чрезмерной специализации нейронной сети. В некотором экстремальном примере: если у вас есть несколько тысяч изображений, нейронная сеть с миллиардом миллиардов узлов (и многими другими весами) будет рисковать изучением каждого пикселя в ваших тренировочных данных вместо того, чтобы находить понятия "глаз", " уши ", ... которые составляют" лицо ". Поэтому, когда вы представляете эту сверхспециализированную нейронную сеть с различными изображениями, она не будет работать на них (или, по крайней мере, не очень хорошо). Он не выработал абстрактные понятия (например, "у кошки есть уши и глаза", а у "дома есть окна").

Хотя в ваших тестах особо нечего делать, вы все равно можете увидеть некоторый (незначительный) эффект этого.

Те же свойства: количество весов одинаково, но структура различна. Нейронная сеть, состоящая из прямой линии узлов (1-1-1-...-1), будет вести себя совершенно иначе, чем более компактная (1-20-1). Сеть 1-1-1 -...- 1 может даже не узнать, что может изучить сеть 1-20-1 (хотя существуют некоторые правила относительно количества узлов / весов, которые вам необходимы для изучения булевой алгебры, хотя я не помню их).

Я подозреваю, что "1-4-1" показывает большее отклонение от ожидаемого результата, так как на каждый промежуточный узел влияет больше весов - чем больше весов, чтобы получить право на узел, тем дольше будет проходить обучение.

В сети 1-2-2-1 первый промежуточный уровень имеет только один весовой коэффициент в качестве входных данных на узел, второй промежуточный уровень имеет 2 весовых коэффициента на узел, а выходной уровень имеет два весовых коэффициента на узел. Таким образом, самое большее, вы можете "шевелиться" по двум значениям на промежуточный узел.

Я не знаю деталей вашей нейронной сети (функция, к которой применяется вес), но если вы подумаете о следующем примере, это может прояснить ситуацию:

  • давайте предположим, что функция f (вес, вход) = вход * вес + константа
  • далее наша сеть 1-1 (т.е. она имеет один вес для определения)

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

В качестве пищи для дальнейшей работы: нейронные сети хороши с нечеткими данными и менее хороши для получения функций алгебры вплоть до десятой цифры.

Другие вопросы по тегам