Интерпретация тензорных участков

Я все еще новичок в tensorflow и я пытаюсь понять, что происходит, во время обучения моих моделей. Вкратце, я использую slim модели с предварительной подготовкой ImageNet сделать finetuning на моем наборе данных. Вот несколько графиков, извлеченных из тензорной доски для двух отдельных моделей:

Model_1 (InceptionResnet_V2)

Начальный реснет V2

Model_2 (InceptionV4)

InceptionV4

Пока что обе модели имеют плохие результаты на валидационных наборах (Среднее значение Az (Площадь под кривой ROC) = 0,7 для Model_1 & 0,79 для Model_2). Моя интерпретация этих графиков заключается в том, что веса не меняются по сравнению с мини-партиями. Это только уклоны, которые изменяются по мини-партиям, и это может быть проблемой. Но я не знаю, где искать, чтобы проверить этот момент. Это единственное толкование, которое я могу придумать, но оно может быть неправильным, учитывая тот факт, что я все еще новичок. Можете ли вы поделиться со мной своими мыслями? Не стесняйтесь просить больше участков в случае необходимости.

РЕДАКТИРОВАТЬ: Как вы можете видеть на графиках ниже, кажется, что веса практически не меняются с течением времени. Это применяется ко всем другим весам для обеих сетей. Это привело меня к мысли, что где-то есть проблема, но я не знаю, как ее интерпретировать.

InceptionV4 weights

InceptionV4 весов

InceptionResnetV2 weights

InceptionResnetV2 весов

РЕДАКТИРОВАТЬ 2: Эти модели были впервые обучены в ImageNet, и эти графики являются результатами настройки их на моем наборе данных. Я использую набор данных из 19 классов с примерно 800000 изображений в нем. Я занимаюсь проблемой классификации по нескольким меткам и использую sigmoid_crossentropy в качестве функции потерь. Классы сильно разбалансированы. В таблице ниже мы показываем процент присутствия каждого класса в 2 подмножествах (поезд, проверка):

Objects     train       validation
obj_1       3.9832 %    0.0000 %
obj_2       70.6678 %   33.3253 %
obj_3       89.9084 %   98.5371 %
obj_4       85.6781 %   81.4631 %
obj_5       92.7638 %   71.4327 %
obj_6       99.9690 %   100.0000 %
obj_7       90.5899 %   96.1605 %
obj_8       77.1223 %   91.8368 %
obj_9       94.6200 %   98.8323 %
obj_10      88.2051 %   95.0989 %
obj_11      3.8838 %    9.3670 %
obj_12      50.0131 %   24.8709 %
obj_13      0.0056 %    0.0000 %
obj_14      0.3237 %    0.0000 %
obj_15      61.3438 %   94.1573 %
obj_16      93.8729 %   98.1648 %
obj_17      93.8731 %   97.5094 %
obj_18      59.2404 %   70.1059 %
obj_19      8.5414 %    26.8762 %

Значения гиперпарама:

batch_size=32
weight_decay = 0.00004 #'The weight decay on the model weights.'
optimizer = rmsprop
rmsprop_momentum = 0.9 
rmsprop_decay = 0.9 #'Decay term for RMSProp.'

learning_rate_decay_type =  exponential #Specifies how the learning rate is decayed
learning_rate =  0.01 #Initial learning rate.
learning_rate_decay_factor = 0.94 #Learning rate decay factor
num_epochs_per_decay = 2.0 #'Number of epochs after which learning rate

Что касается разреженности слоев, вот несколько примеров разреженности слоев для обеих сетей:

sparsity (InceptionResnet_V2) 

sparsity (InceptionV4)

РЕДАКТИРОВАНИЕ 3: Вот графики потерь для обеих моделей:

Losses and regularization loss (InceptionResnet_V2) 

Losses and regularization loss (InceptionV4) 

1 ответ

Я согласен с вашей оценкой - вес не сильно меняется в зависимости от мини-партии. Похоже, они несколько меняются.

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

Если я не ошибаюсь, оба они изначально проходили обучение в ImageNet. Если ваши изображения находятся в совершенно другой области, чем в ImageNet, это может объяснить проблему.

Уравнения backprop облегчают изменение смещений при определенных диапазонах активации. ReLU может быть равен единице, если модель очень разрежена (т. Е. Если у многих слоев значения активации равны 0, то веса будут трудно корректировать, но смещения не будут). Кроме того, если активации находятся в диапазоне [0, 1]градиент по отношению к весу будет выше, чем градиент по отношению к смещению. (Вот почему сигмоид является плохой функцией активации).

Это также может быть связано с вашим уровнем считывания - в частности, с функцией активации. Как вы рассчитываете ошибку? Это проблема классификации или регрессии? Если это вообще возможно, я рекомендую использовать что-то кроме sigmoid в качестве финальной функции активации. Тан может быть немного лучше. Линейное считывание иногда также ускоряет обучение (все градиенты должны "проходить" через слой считывания. Если производная слоя считывания всегда 1 - линейная - вы "пропускаете больше градиента", чтобы отрегулировать веса дальше вниз). модель).

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

В конечном счете, я думаю, что ваша модель просто пытается учиться. Я столкнулся с очень похожими гистограммами Переучивания Inception. Я использовал набор данных из примерно 2000 изображений, и я изо всех сил пытался увеличить его точность до 80% (как это происходит, набор данных был сильно смещен - эта точность была примерно так же хороша, как случайное угадывание). Это помогло, когда я установил постоянные переменные свертки и внес изменения только в полностью связанный слой.


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

С этой новой информацией я бы предложил снизить начальную скорость обучения. У меня есть двоякое рассуждение здесь:

(1) это мой собственный опыт. Как я уже говорил, я не особенно знаком с RMSprop. Я использовал его только в контексте DNC (хотя DNC с сверточными контроллерами), но мой опыт подтверждает то, что я собираюсь сказать. Я думаю .01 высока для обучения модели с нуля, не говоря уже о тонкой настройке. Это определенно высоко для Адама. В некотором смысле, начинание с небольшой скорости обучения является "тонкой" частью тонкой настройки. Не заставляйте весы сдвигаться так сильно. Особенно, если вы настраиваете всю модель, а не последний (несколько) слоев.

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

Как я уже упоминал (неоднократно), я не очень знаком с RMSprop. Но, поскольку вы уже выполняете много обучающих итераций, начните с низких, низких и низких начальных ставок и продолжайте расти. Я имею ввиду, посмотри как 1e-8 работает. Вполне возможно, что модель не будет реагировать на обучение с такой низкой скоростью, но сделает что-то вроде неформального поиска гиперпараметра со скоростью обучения. По моему опыту с начала с использованием Адама, 1e-4 в 1e-8 работал хорошо.

Другие вопросы по тегам