Интерпретация тензорных графиков

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

Model_1 (InceptionResnet_V2)

Начальный resnet V2

Model_2 (InceptionV4)

InceptionV4

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

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

InceptionV4 weights

InceptionV4 weight

InceptionResnetV2 weights

InceptionResnetV2 weights

EDIT2: Эти модели были впервые обучены на ImageNet, и эти графики являются результатом их финализации на моем наборе данных. Я использую набор данных из 19 классов с примерно 800000 изображениями в нем. Я делаю проблему с несколькими метками, и я использую sigmoid_crossentropy как функцию потери. Классы сильно неуравновешены. В приведенной ниже таблице мы показываем процент присутствия каждого класса в двух подмножествах (поезд, проверка):

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)

введите описание изображения здесь

EDITED3: Вот графики потерь для обеих моделей:

Losses and regularization loss (InceptionResnet_V2) 

введите описание изображения здесь

Losses and regularization loss (InceptionV4) 

введите описание изображения здесь

Ответ 1

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

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

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

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

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

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

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


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

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

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

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

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