Почему точность проверки колеблется?

31

У меня есть четырехслойный CNN для прогнозирования ответа на рак с использованием данных МРТ. Я использую активацию ReLU для введения нелинейностей. Точность и потеря поезда монотонно увеличиваются и уменьшаются соответственно. Но точность моего теста начинает сильно колебаться. Я попытался изменить скорость обучения, уменьшить количество слоев. Но это не останавливает колебания. Я даже прочитал этот ответ и попытался следовать указаниям в этом ответе, но снова не повезло. Может ли кто-нибудь помочь мне понять, где я иду не так?

Скриншот

Raghuram
источник
Да, я прочитал этот ответ. Перетасовка данные проверки не помогают
Raghuram
4
Поскольку вы не поделились своим фрагментом кода, поэтому я не могу сказать, что не так в вашей архитектуре. Но на вашем снимке экрана, видя вашу тренировку и точность проверки, совершенно ясно, что ваша сеть перегружена. Было бы лучше, если бы вы поделились своим фрагментом кода здесь.
Наина
сколько образцов у вас есть? может быть, колебания не очень значительны. Кроме того, точность является ужасной мерой
rep_ho
Может ли кто-нибудь помочь мне проверить, хорошо ли использовать ансамблевый подход, когда точность проверки колеблется? потому что я был в состоянии управлять своим колебанием validation_accuracy по ансамблю с хорошим значением.
Sri2110

Ответы:

27

Если я правильно понимаю определение точности, точность (% точек данных, классифицированных правильно) будет меньше, чем, скажем, MSE (среднеквадратическая ошибка). Вот почему вы видите, что ваш lossбыстро растет, а точность колеблется.

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

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

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

Что касается вашего случая, ваша модель не правильно регламентирована, возможные причины:

  • недостаточно данных, слишком много места
  • заказ
  • нет / неправильно масштабирование / нормализация
  • скорость обучения: слишком велика, поэтому SGD прыгает слишком далеко и пропускает область вблизи локальных минимумов. Это было бы крайним случаем «недостаточной подгонки» (нечувствительности к самим данным), но могло бы генерировать (своего рода) «низкочастотный» шум на выходе путем скремблирования данных с входа - вопреки интуитивной перестройке, это было бы как всегда угадывать головы при предсказании монеты. Как указал @JanKukacka, достижение минимума в области «слишком близко» может привести к переобучению, поэтому, если слишком мал, он будет чувствителен к «высокочастотному» шуму в ваших данных. должна быть где-то посередине.ααα

Возможные решения:

  • получить больше данных (или искусственно расширить набор существующих)
  • играть с гиперпараметрами (например, увеличить / уменьшить емкость или срок регуляризации)
  • регуляризация : попробуй бросить, рано остановить и т. д.
dk14
источник
Относительно: «Потери измеряются более точно, они более чувствительны к шумному предсказанию, потому что они не подавляются сигмоидами / порогами», я согласен с отсутствием порога, но если вы используете, например, двоичную кросс-энтропию в качестве функции потерь, сигмоида по-прежнему играет роль.
Жубарб
1
Относительно скорости обучения и sgd, пропускающих минимумы: достижение минимума, скорее всего, означало бы переоснащение (потому что это минимум на тренировочном наборе)
Ян Кукацка
@Berkmeister true, я немного перефразировал (см. Редактирование). Я думал, что увеличение потерь - это признак того, что функция не была раздавлена.
dk14
@ JanKukacka ты имеешь в виду глобальные минимумы? Я имел в виду локальные минимумы (на самом деле около локальных минимумов) - в том смысле, что если они слишком далеки от каких-либо минимумов, тогда они были бы недостаточно подходящими. Возможно, я должен описать это более тщательно (см. Редактирование), спасибо.
dk14
@ dk14 Я предполагаю, что на практике невозможно достичь глобального минимума, поэтому я имею в виду локальные минимумы. Если вы находитесь слишком далеко, возможно, вы недостаточно приспособлены, но если вы слишком близки, то, скорее всего, это слишком. У Морица Хардта есть интересная работа «Тренируйся быстрее, лучше обобщай: устойчивость стохастического градиентного спуска» ( arxiv.org/abs/1509.01240 ), устанавливающая границы между тренировкой и ошибкой тестирования при тренировке с SGD.
Ян Кукацка
6

Этот вопрос устарел, но публикуем его, поскольку на него еще не было указано:

Возможность 1 : Вы применяете какую-то предварительную обработку (нулевое значение, нормализация и т. Д.) Либо к своему обучающему набору, либо к набору проверки, но не к другому. ,

Возможность 2 : Если вы построили несколько слоев, которые по-разному работают во время обучения и выведения с нуля, ваша модель может быть неправильно реализована (например, обновляется ли среднее значение скользящего среднего и стандартное отклонение для нормализации партии во время обучения? При использовании отсева правильно масштабируются весы во время тренировки). статистические выводы?). Это может быть в том случае, если ваш код реализует эти вещи с нуля и не использует встроенные функции Tensorflow / Pytorch.

Возможность 3: Переоснащение, как все отметили. Я нахожу другие два варианта более вероятными в вашей конкретной ситуации, так как ваша точность проверки застряла на 50% с эпохи 3. В общем, я бы больше беспокоился о переобучении, если бы это происходило на более поздней стадии (если у вас нет очень специфической проблемы) под рукой).

Soroush
источник
У меня возникла проблема, которая похожа, но не полностью, подробнее здесь: stackoverflow.com/questions/55348052/… В моем случае, у меня действительно стабильно высокая точность данных испытаний, а во время обучения - точность проверки «(не потеря) выше, чем точность обучения. Но тот факт, что он никогда не сходится и не колеблется, заставляет меня думать о переоснащении, в то время как некоторые предполагают, что это не так, поэтому мне интересно, если это так, и каково оправдание, если это не так.
DUSA
1
Это, безусловно, наиболее правдоподобное объяснение данных ответов. Обратите внимание на то, что высокий импульс нормализации партии (например, 0,999 или даже значение по умолчанию Keras 0,99) в сочетании с высокой скоростью обучения также может привести к очень разному поведению в обучении и оценке, поскольку статистика уровней сильно отстает. В этом случае уменьшение импульса до 0,9 должно помочь. У меня была такая же проблема, как у OP, и это помогло.
Кристьян
5

Добавление к ответу @ dk14. Если вы все еще видите колебания после правильной регуляризации вашей модели, это может быть возможными причинами:

  • Использование случайной выборки из вашего набора проверки: это означает, что ваш набор проверки на каждом шаге оценки отличается, так же как и ваша потеря проверки.
  • Использование взвешенной функции потерь (которая используется в случае сильно несбалансированных проблем класса). На этапе поезда вы взвешиваете свою функцию потерь на основе весов классов, а на этапе разработки вы просто вычисляете невзвешенные потери. В этом случае, хотя ваша сеть вступает в конвергенцию, вы можете увидеть много колебаний в потере проверки после каждого шага поезда. Но если вы ждете более широкой картины, вы можете увидеть, что ваша сеть на самом деле сходится к минимуму с затуханием колебаний (см. Прикрепленные изображения для одного такого примера).введите описание изображения здесьвведите описание изображения здесь
bitspersecond
источник
2

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

keramat
источник
1

Ваша точность проверки по проблеме бинарной классификации (я полагаю) колеблется около 50%, что означает, что ваша модель дает совершенно случайные прогнозы (иногда она правильно угадывает несколько образцов больше, иногда несколько образцов меньше). Как правило, ваша модель не лучше, чем подбрасывание монеты.

{0;1}

В любом случае, как уже отмечали другие, ваша модель испытывает серьезное переоснащение. Я предполагаю, что ваша проблема слишком сложна , то есть очень трудно извлечь нужную информацию из ваших данных, и такая простая обученная end-end 4-слойная сеть не имеет возможности ее изучить .

Ян Кукацка
источник
0

Есть несколько способов попробовать в вашей ситуации. Во-первых, попробуйте увеличить размер пакета, что поможет мини-пакету SGD меньше блуждать. Во-вторых, настройка скорости обучения, вероятно, установить ее меньше. В-третьих, попробуйте другой оптимизатор, например Adam или RMSProp, которые могут адаптировать скорость обучения к функциям. Если возможно, попробуйте увеличить ваши данные. Наконец, попробуйте байесовские нейронные сети с помощью аппроксимации отсева, очень интересная работа Ярина Гал https://arxiv.org/abs/1506.02158

pateheo
источник
0

Вы пробовали меньшую сеть? Учитывая, что точность обучения может достигать> 0,99, в вашей сети, по-видимому, достаточно подключений, чтобы полностью смоделировать ваши данные, но у вас могут быть посторонние подключения, которые обучаются случайным образом (например, переобучение).

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

teter123f
источник