Неудивительно, что каждая из отдельных сетей дает лучшую производительность на соответствующем тренировочном наборе, на котором она была обучена. Но эти значения ошибки прогнозирования вводят в заблуждение, потому что минимизация ошибки на обучающем наборе является некорректной задачей. Ваша конечная цель — максимизировать эффективность обобщения вашей модели, чтобы она хорошо работала с новыми данными, которые она не видела во время обучения. Представьте себе сеть, которая просто запоминает каждый из символов и, таким образом, работает как хеш-таблица. Такая сеть дала бы 0 ошибок на обучающих данных, но плохо работала бы на других данных.
Одним из способов измерения эффективности обобщения является выделение части (например, 10 %) доступных данных и использование ее в качестве набора тестов. Вы не используете этот тестовый набор во время обучения, только для измерения.
Далее следует проверить топологию вашей сети. Сколько скрытых слоев и сколько нейронов на скрытый слой вы используете? Убедитесь, что ваша топология достаточно велика, чтобы она могла справиться со сложностью вашей проблемы.
Также обратите внимание на другие методы повышения эффективности обобщения вашей сети, такие как регуляризация L1 (вычитание небольшой фиксированной суммы из абсолютного значения ваших весов после каждого шага обучения), регуляризация L2< /em> (вычитание небольшого процента веса после каждого шага тренировки) или Dropout (случайное переключение отключать скрытые юниты во время обучения и уменьшать вектор веса вдвое, как только обучение закончено). Кроме того, вам следует рассмотреть более эффективные алгоритмы обучения, такие как RPROP- или RMSProp, а не простое обратное распространение (см. Курс Джеффри Хинтона по нейронным сетям). Вам также следует рассмотреть набор данных MNIST, содержащий записанные числа 0-9, для тестирования вашей установки (вы должны легко получить менее 300 неправильных классификаций в тестовом наборе).
Чтобы ответить на ваш первоначальный вопрос о том, как пропустить определенные выходные нейроны, вы можете создать собственный модуль слоя. Взгляните на SoftmaxLayer, но перед применением функции активации softmax установите все выходные нейроны в 0, которые принадлежат классам, которые вы хотите пропустить. Вам нужно манипулировать переменной outbuf
в _forwardImplementation
. Если вы хотите использовать это во время обучения, обязательно установите для этих классов сигнал ошибки равным нулю, прежде чем распространять ошибку на предыдущий уровень (путем манипулирования _backwardImplementation
). Это может быть полезно, например. если у вас есть неполные данные и вы не хотите выбрасывать каждую выборку, содержащую только одно значение NaN. Но в вашем случае вам это на самом деле не нужно.
person
schreon
schedule
23.03.2013