Сходимость функции стоимости в Tensorflow с использованием softmax_cross_entropy_with_logits и «мягких» меток / целей - PullRequest
0 голосов
/ 20 мая 2018

Я обнаружил, что, вероятно, редкий случай в Tensorflow, но я пытаюсь обучить классификатор (линейный или нелинейный), используя расхождение KL (перекрестная энтропия) в качестве функции стоимости в Tensorflow, с мягкими целями / метками (метки, которые формируют правильное распределение вероятностей, но не являются «жесткими» 1 или 0).

Однако ясно (признаки хвоста), что что-то определенно не так.Я пробовал как линейные, так и нелинейные (плотные нейронные сети) формы, но независимо от того, что я всегда получаю одно и то же конечное значение для своей функции потерь независимо от сетевой архитектуры (даже если я тренирую только смещение).Кроме того, функция стоимости сходится очень быстро (в течение примерно 20-30 итераций), используя L-BFGS (очень надежный оптимизатор!).Еще один признак того, что что-то не так, это то, что я не могу переопределить данные, и набор проверки, по-видимому, имеет точно такое же значение потерь, что и обучающий набор.Однако странным образом я вижу некоторые улучшения, когда я увеличиваю размер архитектуры сети и / или изменяю потери регуляризации.Точность также улучшается с этим (хотя не до такой степени, что я доволен этим или это, как я ожидаю).

Это работает, как и ожидалось, когда я использую точно такой же код, но отправляю метки с горячим кодированием (не мягкие цели).Пример функции стоимости из обучения, взятого из Tensorboard, показан ниже.Может кто-нибудь подать мне какие-нибудь идеи?

enter image description here

1 Ответ

0 голосов
/ 20 мая 2018

Ах, мой друг, у вас проблема в том, что с мягкими целями, особенно теми, которые не близки к 1 или нулю, кросс-энтропийная потеря существенно не меняется при улучшении алгоритма.Одна вещь, которая поможет вам понять эту проблему, - это взять пример из ваших данных обучения и вычислить энтропию .... тогда вы будете знать, какое минимальное значение может иметь ваша функция стоимости.Это может пролить свет на вашу проблему.Итак, для одного из ваших примеров, скажем, целевые значения [0.39019628, 0.44301641, 0.16678731].Хорошо, используя формулу для кросс-энтропии

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

, но затем используя цели "y_" вместо прогнозируемых вероятностей "y", мы получаем истинное значение энтропии 1.0266190072458234.Если ваши прогнозы немного отклоняются от цели ... допустим, они равны [0,39511779, 0,44509024, 0,15979198], то перекрестная энтропия равна 1,026805558049737.

Теперь, как и в случае большинства сложных проблем, это не так.только одна вещь, но комбинация вещей.Функция потерь реализована правильно, но вы допустили «ошибку» в том, что вы должны делать в 99,9% случаев при обучении алгоритмам глубокого обучения… вы использовали 32-битные операции с плавающей запятой.Тем не менее, в этом конкретном случае вы исчерпаете значащие цифры, которые 32-разрядный код с плавающей запятой может представить задолго до того, как ваш алгоритм обучения сойдет к хорошему результату.Если я использую ваши точно такие же данные и код, но меняю только типы данных на 64-битные числа с плавающей точкой, вы увидите ниже, что результаты намного лучше - ваш алгоритм продолжает хорошо тренироваться после 2000 итераций, и вы увидите, что он отражаетсяв твоей точности.На самом деле, вы можете видеть с наклона, если поддерживается 128-битная плавающая точка, вы можете продолжить обучение и, возможно, увидеть преимущества от этого.Вам, вероятно, не понадобится такая точность в ваших окончательных весах и смещениях ... только во время обучения, чтобы поддержать постоянную оптимизацию функции стоимости.

enter image description here

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