Почему нейронные сети с одинаковыми свойствами отличаются?
Вступление
Я очень плохо знаком с искусственным интеллектом, машинным обучением и нейронной сетью.
Я попытался закодировать некоторые вещи с помощью библиотеки 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, у вас есть функция отрицания. Эта нейронная сеть будет превосходить любую большую сеть как по скорости обучения, так и по точности. Любая сеть с большим количеством узлов (и, следовательно, весов) должна выработать тонкий баланс всех весов, пока не найдет тот, который представляет концепцию "отрицание" - возможно, в нейронной сети будет много нулей (то есть "игнорировать этот вход" ") и один путь, который делает отрицание.
В качестве пищи для дальнейшей работы: нейронные сети хороши с нечеткими данными и менее хороши для получения функций алгебры вплоть до десятой цифры.