Форум программистов, компьютерный форум, киберфорум
C#: ИИ, нейросети, ML, агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 16.05.2020
Сообщений: 5

Странное поведение ошибки в нейросети

13.04.2021, 00:08. Показов 2438. Ответов 2

Студворк — интернет-сервис помощи студентам
Суть следующего характера. Изучаю обычный перцептрон. Даю на вход выборку с простой задачей. Есть два числа. Нейросеть должна выбрать большее следующим образом. Если большее число из первого нейрона то ответ 0, если из второго то ответ 1. На одном примере сводится правильно без вопросов. Но вот когда выборок становится чуток больше чем одна, то вариантов исхода становится несколько. Иногда нейросеть сводится но уже не таким плавным и красивым графиком. Вроде как эталонная сеть должна сводится по обратной экспоненте, но вместо этого она сводится "ступеньками". Заимствовал формулы из разных источников. В некоторых такой график сведения считается нормальным, но, по крайней мере, для моей задачи с 2-3 примерами это выглядит странно. Иногда нейросеть может так и остаться на одной ступеньке и никто не знает сколько еще ей надо эпох, чтобы опустить ошибку чуть ниже. Если смотреть по MSE то ошибка даже во время одного уровня уменьшается, но очень очень медленно.
Второй нюанс это резкий взрыв ошибки. Он происходит толи в самые первые эпохи, толи в какой-то момент сведения. Нейросеть начинает работать в обратную сторону и вместо того, чтобы уменьшать ошибку, начинает её увеличивать. Учитывая что это сделать намного проще то она улетает в бесконечность с вылетом исключения за пару эпох (вот тут как раз экспоненциально). Я не придумал причину по которой это может происходить но это как-то связано с ошибкой и корректировкой весов, которая при каких-то условиях "разворачивается", как будто меняет знак - на +.
Алгоритм прямого распространения работает как нужно, было проверено отладкой. Скорее всего что-то с обратным распространением, точнее в одной из формул. Как я уже сказал я пробовал формулы разных источников и я без понятия какой из них при каких условиях будет работать правильно и должен ли работать правильно в принципе.
Снизу пару графиков поведения нейросети а также код формул.
Смена гиперпараметров и структуры влияли на скорость обучения но не на поведения графика и не решали взрыв ошибки. Использую нейроны смещения для каждых слоёв кроме последнего, по очевидным причинам. Веса генерируются случайно от -0,5 до 0,5. Активатор - сигмоида. Обучение производится эпохами. Эпоха = проход по всей выборке, заведомо перемешанной с каждой новой эпохой.
P.S Работаю на не очень Sharp Develop и отладка отказывается работать при мультипотоке (нужно для отрисовки графика в реальном времени) а переходить на Visual например мне лень. Мне нужно разобраться с формулами и правильным графиком сведения.
C#
1
2
3
4
5
6
7
8
public static void FindOutputError(Neuron[] layer, double[] expectedOutputs)
        {
            for (int out_layer = 0; out_layer < layer.Length; out_layer++)
            {
                // Нужно ли тут умножать на производную?
                layer[out_layer].error = expectedOutputs[out_layer] - layer[out_layer].value;
            }
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void Backward (Neuron[] outputs, Weight[,] weights, Neuron[] inputs, ActivationType activator, double learningRate, bool bias)
        {
            for (int in_layer = 0; in_layer < inputs.Length; in_layer++)
            {
                for (int out_layer = 0; out_layer < outputs.Length - (bias ? 1 : 0); out_layer++)
                {
                    inputs[in_layer].error += weights[in_layer, out_layer].value * outputs[out_layer].error;
                }
            }
            for (int in_layer = 0; in_layer < weights.GetLength(0); in_layer++)
            {
                for (int out_layer = 0; out_layer < weights.GetLength(1); out_layer++)
                {
                    if (activator == ActivationType.Sigmoid)
                    {
                        weights[in_layer, out_layer].value += 
                        outputs[out_layer].error * SigmoidDx(outputs[out_layer].value) * inputs[in_layer].value * learningRate;
                    }
                    else if (activator == ActivationType.ReLU)
                    {
                        weights[in_layer, out_layer].value += 
                        outputs[out_layer].error * ReLUDx(outputs[out_layer].value) * inputs[in_layer].value * learningRate;
                    }
                }
            }
        }
Миниатюры
Странное поведение ошибки в нейросети   Странное поведение ошибки в нейросети   Странное поведение ошибки в нейросети  

Странное поведение ошибки в нейросети  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.04.2021, 00:08
Ответы с готовыми решениями:

Нестабильные сектора, неисправимые ошибки секторов и странное поведение харда
Необходим совет по SMART-значениям, которые я получил после проверки своего харда. Имеет смысл делать ремап или легче просто заменить...

Странное поведение VS
Все работает, однако при открытии дизайна формы пишет: Object reference not set to an instance of an object. Ссылается на: ...

Странное поведение
Всем привет,я тут новенький и прошу у вас помощи. Проблема заключается в следующем: Были проблемы с куллером видеокарты и пришлось её...

2
2645 / 1656 / 267
Регистрация: 19.02.2010
Сообщений: 4,388
13.04.2021, 01:29
Цитата Сообщение от erdze Посмотреть сообщение
Скорее всего что-то с обратным распространением
Ну да, именно с ним.
Видимо, нужно выкинуть использованные источники и поискать другие (т.к. я не представляю, как можно совершить увиденную мной ошибку после чтения правильного описания бэкпропа).
0
0 / 0 / 0
Регистрация: 16.05.2020
Сообщений: 5
13.04.2021, 15:42  [ТС]
Может есть на примете какие нибудь материалы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.04.2021, 15:42
Помогаю со студенческими работами здесь

Странное поведение if
в коде Select if CHARACTER_LENGTH(s.lname)=6 then s.lname||' '||s.fname||' '||s.mname end from stud s выдаёт ошибку ...

Странное поведение First
Приветствую всех! Есть такая выборка из основной таблицы: SELECT Поставки.Код_товара, Поставки.Срок_поставки, Поставки.Стоимость_единицы ...

странное поведение
До определенного времени мой сайт получал с Яндекса почти 2к посетителей в сутки. Но в один прекрасный день Яндекс взял и удалил все...

Странное поведение new
Объясните почему оператор new выделяет неверное количество памяти? # include &lt;iostream&gt; using namespace std; char* interpitator(...

Странное поведение if
День добрый. Работаю в VS. Столкнулся с тем, что условие if (signal.size() - len_st&gt;0) в коде используется не правильно. В этой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru