Как заменить tenorflow softmax max для генерации одного горячего вектора на выходном слое нейронной сети? - PullRequest
1 голос
/ 01 июля 2019

Для задачи классификации функция softmax используется в последнем слое нейронной сети.
Я хочу заменить слой softmax на слой max, который генерирует один горячий вектор с одним, установленным на индекс, где произошло максимальное значение, и установить все остальные записи на ноль.

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

Если не могут быть получены точные 0 и 1, значения должны быть достаточно близкими.

Я думал применить softmax несколько раз, но это не рекомендуется, и я не понимаю причину этого.

Пожалуйста, предложите дифференцируемое решение.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

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

0 голосов
/ 01 июля 2019

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

Интуитивно, это не имеет смысла, если вы просто обрезаете все значения до 0 или 1

ОБНОВЛЕНИЕ В ОТВЕТЕ НА КОММЕНТАРИИ:

Вы могли всегда используйте такую ​​операцию в расчете метрика .Это даст вам «более точное представление» о производительности во время обучения (но не будет использоваться для обучения - просто сообщать вам результаты).

Просто невозможно использовать его для функции потери / цели, поскольку это не то, как работает обучение нейронной сети.Я постараюсь объяснить немного.

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

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

Теперь вместо гладкой плоскости представьте поверхность, которая является абсолютно плоской, за исключением одного края утеса.Неважно, где вы стоите на этом плане, вы не можете знать, в каком направлении вступить. Если вы находитесь вдали от края утеса, все ровно.Даже если вы находитесь на краю обрыва, вы все равно не знаете, в каком направлении (у вас, вероятно, есть 180 градусов), чтобы добраться до самой низкой точки.

Имеет ли это смысл?Без гладкой сплошной поверхности мы не можем использовать стратегию маленьких шагов вниз?

...