Выпадение с плотно связанным слоем - PullRequest
2 голосов
/ 05 апреля 2020

Я использую модель логов enet для одного из моих проектов и испытываю некоторые трудности с использованием регуляризации.

Без какой-либо регуляризации уменьшается как проверка, так и потеря обучения (MSE). Потеря тренировки уменьшается быстрее, что приводит к некоторому переоснащению финальной модели.

Поэтому я решил использовать dropout, чтобы избежать перегрузки. При использовании Dropout потери как при проверке, так и при обучении уменьшаются примерно до 0,13 в течение первой эпохи и остаются постоянными в течение примерно 10 эпох.

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

Так что для меня кажется, что выпадение действительно не работает.

Если я переключусь на регуляризацию L2, я смогу избежать переобучения, но я бы предпочел использовать Dropout в качестве регуляризатора.

Теперь мне интересно, испытывал ли кто-нибудь подобное поведение?

Я использую выпадение как в плотном блоке (слой узких мест), так и в переходном блоке (коэффициент отсева = 0,5):

def bottleneck_layer(self, x, scope):
    with tf.name_scope(scope):
        x = Batch_Normalization(x, training=self.training, scope=scope+'_batch1')
        x = Relu(x)
        x = conv_layer(x, filter=4 * self.filters, kernel=[1,1], layer_name=scope+'_conv1')
        x = Drop_out(x, rate=dropout_rate, training=self.training)

        x = Batch_Normalization(x, training=self.training, scope=scope+'_batch2')
        x = Relu(x)
        x = conv_layer(x, filter=self.filters, kernel=[3,3], layer_name=scope+'_conv2')
        x = Drop_out(x, rate=dropout_rate, training=self.training)

        return x

def transition_layer(self, x, scope):
    with tf.name_scope(scope):
        x = Batch_Normalization(x, training=self.training, scope=scope+'_batch1')
        x = Relu(x)
        x = conv_layer(x, filter=self.filters, kernel=[1,1], layer_name=scope+'_conv1')
        x = Drop_out(x, rate=dropout_rate, training=self.training)
        x = Average_pooling(x, pool_size=[2,2], stride=2)

        return x

Ответы [ 2 ]

4 голосов
/ 05 апреля 2020

Без какой-либо регуляризации уменьшается как валидация, так и потеря обучения (MSE). Потеря тренировки уменьшается быстрее, что приводит к некоторому переоснащению финальной модели.

Это не переоснащение.

Переоснащение начинается, когда ваша потеря при проверке начинает расти, а ваша потеря при обучении продолжает уменьшаться; вот его контрольная подпись:

enter image description here

Изображение адаптировано из записи Википедии о переоснащении - разные вещи могут l ie по горизонтальной оси, например, глубина или количество повышенных деревьев, число нейронных net подходящих итераций и т. д. c.

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

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

, где, фактически говоря, данные проверки действительно являются невидимыми данными.

Так что для меня кажется, что выпадение не действительно работает ,

Это вполне может иметь место - отсев не ожидается , который будет работать всегда и для любой проблемы.

0 голосов
/ 05 апреля 2020

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

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

Если вы хотите использовать другой метод вместо выпадания, я бы рекомендовал использовать слой Gaussian Noise.
Keras - https://keras.io/layers/noise/
TensorFlow - https://www.tensorflow.org/api_docs/python/tf/keras/layers/GaussianNoise

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...