Обучение простой нейронной сети

По примеру из видео на ютубе решил сделать первую нейросеть, чтобы на практике понять принципы обучения подобных нейросетей. Суть задачи проста - на входе 9 нейронов в каждый из которых попадает значение 0 или 1. Входные данные описывают собой 3х3 квадрат. На выходе 2 нейрона, один отвечает за присутствие вертикальной линии длинной 3 клетки в данном квадрате, другой за горизонтальную линию такой же длинны. В качестве набора для обучения даю либо 6, либо 21 подобных квадратов в каждом из которых есть хоть одна линия (вертикальная или горизонтальная). Спустя несколько часов или дней залипания я довел до разума алгоритм и разобрался с подбором коэффициентов, проанализировал лучшие результаты. График в целом очень похож на стандартные случаи обучения нейросетей, единственное возможно на входном массиве длинной 21 элемент бывают более длинные плато. Они также есть и на 6, но там оно, что логично не такое долгое по количеству итераций. Веса обучаются нормально, значение среднеквадратичной ошибки сильно приближено к нулю (1/1000 после 5 тыс. итераций прогона массива). Количество нейронов в скрытых слоях - 4 и 3 в двух скрытых слоях. Пробовал изменять количество нейронов и лучших результатов не получал даже на большем количестве итераций. Проблемы начинаются когда обученная нейросеть начинает работать с случайным набором данных. В пике значение среднеквадратичной ошибки не падает ниже 0.15, а угадывание ответов при 200 итерациях на случайных наборах данных не превышает 80%, то есть 320 правильных ответов против 80 неправильных (поскольку угадываются оба значения выходных нейронов - имеем х2 ответов). Я понимаю что с учетом начального датасета это больше похоже на справедливый результат, поскольку нейросеть была обучена на работу с конкретным набором данных, тут же ей пихают абсолютно другие данные, которые она до этого не видела и соответственно определенные последствия обучения на изначальном датасете могут мешать в конечном результате. Однако распределение нулей и единиц в подобном массиве квадрата 3х3 имеет всего 512 различных вариантов. Соответственно нет никакого смысла в нейросети если я просто дам ей выучить все ответы, чтобы получить нужный мне результат. Отсюда возникает вопрос от начинающего кодера: какие ухищрения и методы есть в машинном обучении чтобы улучшить подобный алгоритм и добиться лучших результатов обучения? Я слышал о распределении нейронов по группам, так например можно было бы связать входные нейроны с 6-ю нейронами в скрытом слое, каждый из которых будет отвечать за ту или иную линию. Вот только это все равно что дать готовый ответ на задачу, насколько я понимаю. В следствии своей неопытности и поверхностного понимания работы нейросетей интересуюсь данной темой у более опытных специалистов. Заранее спасибо. 2000 итераций на датасете из 6 входных массивов


Ответы (0 шт):