нейронная сеть продолжает воспроизводить базовый классификатор - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь обучить сеть для проблемы двоичной классификации.(Это коннет, использующий керасы в R, для распознавания изображений, задача классификации человеческих белков в Kaggle, если быть точным, но я не думаю, что детали здесь чрезвычайно важны. И это произошло с совершенно другой проблемой, которую яМы уже работали над решением проблемы мультиклассификации с текстовыми данными и с другим программным обеспечением (Spark), поэтому я оставлю этот вопрос в общих чертах.)

Мои обучающие примеры помечены '0' и '1' .В тренировочных данных больше 0, чем 1.Сети, которые я тренирую (используя двоичную кроссентропию в качестве моей функции потерь), продолжают воспроизводить базовый классификатор;то есть классификатор, который все время предсказывает '0', независимо от входных данных теста.

Меня совсем не удивляет, почему это иногда случается.Во-первых, существует множество конфигураций сети, которые воспроизводят этот классификатор;например, не составит труда спроектировать сеть, которая будет постоянно выводить '0' независимо от ввода.И, во-вторых, любая такая конфигурация, без сомнения, является локальным минимумом для функции потерь в ландшафте потерь, и нахождение локальных минимумов для функции потерь - это именно то, что мы просим сделать эти нейронные сети.Таким образом, мы не можем винить их за то, что они иногда придумывают эту «несколько хорошую» конфигурацию после тренировки.Но эта проблема была особенно постоянной для меня.

МОЙ ВОПРОС : является ли эта «регрессия к исходному уровню» распространенной проблемой в глубоком обучении, и каковы некоторые способы «наилучшей практики»или избежать этого, или бороться с этим?

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

1) Повышение сложности сети (добавление большего количества слоев, больше нейронов на слой, больше фильтров в случае с коннететами и т. Д.).Это очевидный первый ход;может быть, сеть просто недостаточно «умна», даже при наилучшем обучении, чтобы различать «0» и «1», и поэтому базовый уровень - это лучшее, на что можно надеяться, что эта сетевая архитектура может быть достигнута.

Это я пробовал.Я даже попробовал предварительно обученный коннет с двумя плотно соединенными слоями и 41 миллионами обучаемых параметров.Тот же результат.

2) Изменение функции потерь.Я попробовал это, и это не помогло.Примечательно, что когда я тренируюсь с loss = binary_crossentropy (когда ваша метрика - точность), она создает базовый классификатор для этой метрики (предсказывая все 0).И когда я тренируюсь с loss = F1_score, он производит базовый классификатор для этой метрики (предсказывая все 1).Итак, опять же, эта вещь, очевидно, делает то, что должна, находя хороший локальный минимум;это просто ужасное решение (очевидно).

3) Просто обучите все заново (с другой случайной начальной конфигурацией).Я попробовал это, и это не помогло;он продолжает воспроизводить базовый уровень.Таким образом, базовая линия не просто появляется из-за неудачи, она кажется вездесущей.

4) Отрегулируйте скорость обучения.Пробовал это, не повезло.И действительно, нет никаких оснований ожидать, что это поможет;если он обнаружил базовый уровень раньше, замедление скорости обучения, вероятно, не поможет «отыскать» его.

Кто-нибудь еще сталкивался с этой проблемой?И как ты с этим справился?

1 Ответ

0 голосов
/ 03 января 2019

Я не уверен, что это лучший способ, но я могу поделиться некоторыми своими впечатлениями.

Во-первых, лучше сделать такое же количество образцов с меткой «0» и «1» -помеченные сэмплы

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

...