Нейросеть «воздерживается». Как лечить?

— Какова вероятность того, что выйдя из дома, вы встретите во дворе настоящего динозавра?
— 50%: или встречу, или не встречу.

Сделал нейросеть в Encog 3 Workbench. Архитектура — обычная «Feedforward neural network». 89 входов, 60 нейронов в первом скрытом слое, 31 во втором скрытом слое (количество нейронов в скрытых слоях выбрано простым усреднением, может надо как по другому — буду благодарен за совет), 2 выхода. Функции активации пробовал как ActivationTANH (от -1 до 1) так и ActivationSigmoid (от 0 до 1). Учу методом Resilient Propagation.

Правильные ответы (желаемые уровни для двух выходных нейронов) в основной своей массе кучкуются около двух уровней.

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

Пробовал упрощать задачу с попытки вычислить значение характеристики до логического отнесения к той или иной группе, округлив все ответы в обучающих данных до 0 или 1 — всё равно выдаёт ответы около 0.5 в таком случае.

Что я делаю не так? Означает ли это, что на основании выбранных входных данных в принципе невозможно автоматически судить о значении искомых или просто это нужно делать иначе?

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

Заранее спасибо.
  • Вопрос задан
  • 5454 просмотра
Решения вопроса 1
@kmike
Хорошо бы проверить, что при тренировке ошибок не сделали (не перепутаны ли входные данные, нормализованы ли они и т.д.). Например, если данные не нормализованы, и какая-нибудь малозначительная переменная принимает большие значения, то получится, что нейросеть будет в основном эту переменную учитывать, и результат будет зависеть почти только от нее (а т.к. на самом деле результат от нее не зависит, то для уменьшения ошибки сеть может «скатиться» к 0.5 или какому-то другому значению).

Дальше, вы пишете, что «округляли значения до 0 или 1» — ваши «кластеры значений» — это < 0.5 и > 0.5? «Кучкуются около 2 уровней» — около 0 и 1, или около каких-то других? Какой смысл имеют выходные переменные, там точно уровень имеет значение? ну там x1=0.1, x2=0.3, x3=1 и можно ли сказать, что в каком-то смысле x3 > x2 > x1, и что «еще немного, и x2 стал бы x1»? Если на самом деле там не непрерывная входная переменная, то можно попробовать заменить ее на несколько логических («вероятности принадлежности к кластерам значений») — в тренировочных данных они 0 или 1 будут, т.к. эти для тестовых данных известно, принадлежит значение к кластеру или нет (это то же самое, что вы сделали, или нет?).

Параметры сети (количество нейронов, функции активации) можно подбирать так, чтоб уменьшалась ошибка кросс-валидации (проверив в конце на неиспользованном наборе данных, что оверфиттинга по параметрам сети не случилось), но это уже детали.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Richard_Ferlow
Веб-программист
Как бы в это погрузиться, чтобы это не казалось записками на непонятном языке непонятно о чем?
Ответ написан
Комментировать
AMar4enko
@AMar4enko
Я не в курсе функционала Encog 3 Workbench, но вот пара трюков, которые в свое время использовал я:

  • для сигмоиды я входные и выходные данные нормализовал в диапазон, в котором сигмоида имеет отличную от нуля производную (например 0.1 — 0.9 для выходных и соответствующие им для входных).
  • у меня структура сети не была строго детерминированной изначально. Я брал один скрытый слой, добавлял нейрон, связывая его со всеми нейронами входа и всеми нейронами выхода и обучал. Если не мог достигнуть искомой ошибки — добавлял в этот слой еще один, также полностью связывая. Определял некое максимальное число нейронов в слое — при достижении этого количества нейронов в скрытом слое и большой ошибке добавлял еще один слой и всё по-новой. Как только приемлимая ошибка достигалась, я прореживал сеть, удаляя связи, изменение весовых коэффициентов которых мало влияло на результат.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы