Функции потери и метрики
CNTK содержит ряд стандартных предопределенных функций потери (или критериев обучения для оптимизации в обучении) и метрик (или критериев оценки для отслеживания производительности). Кроме того, пользовательские функции и метрики потери можно определить как выражения BrainScript.
CrossEntropy(), CrossEntropyWithSoftmax()
Вычисляет категориальную перекрестную потерю энтропии (или просто перекрестную энтропию между двумя распределениями вероятностей).
CrossEntropy (y, p)
CrossEntropyWithSoftmax (y, z)
Параметры
y
: метки (один горячий) или более широкое распространение ссылок. Должен суммироваться до 1.p
(forCrossEntropy()
): распределение вероятностей афиши для оценки по ссылке. Должен суммироваться до 1.z
(forCrossEntropyWithSoftmax()
): входные данные в операцию Softmax для вычисления распределения вероятностей афиши для оценки по ссылке
Возвращаемое значение
Эта операция вычисляет перекрестную энтропию между двумя распределениями вероятностей y
и p
определяется следующим образом:
ce = E_y{-log p} = -sum_i y_i log p_i
с i
итерации по всем элементам y
и p
. Для CrossEntropyWithSoftmax()
этого p
вычисляется из входного параметра z
как
p = Softmax (z)
Описание
Эти функции вычисляют перекрестную энтропию двух распределений вероятностей. Категориальная перекрестная энтропия — это наиболее распространенный критерий обучения (функция потери) для одноклассовой классификации, где y
кодирует категориальную метку в виде одноразового вектора.
Другое использование — это функция потери для регрессии распределения вероятности, где y
это целевое распределение, которое p
должно совпадать.
При использовании в качестве функции потерь процесс CNTK в формате JSON суммирует значения перекрестной энтропии всех отдельных выборок в мини-бэтче и вычисляет потерю в эпоху путем агрегирования этих значений за всю эпоху.
Затем это сообщается в этой форме: L * S
где L
средняя потеря на выборку и S
количество выборок. Например, -1.213 * 3600000
означает среднюю перекрестную потерю энтропии –1,213, усредненную за эпоху 3600 000 выборок.
CrossEntropyWithSoftmax()
— это оптимизация для наиболее распространенного варианта использования категориальной перекрестной энтропии, которая использует преимущества конкретной формы Softmax.
Вместо нормализованной вероятности он принимает в качестве входного аргумента для операции Softmax, которая аналогична ненормализованной версии log Softmax, также известной как logit.
Это рекомендуемый способ CNTK для вычисления критерия категориальной перекрестной энтропии.
Обратите внимание, что категориальная перекрестная энтропия не является подходящей функцией потери для многоклассовых меток, где y
содержит более одной позиции, содержащей 1.
В этом случае рекомендуется использовать Sigmoid()
вместо Softmax с потерей Logistic()
.
См. также эту статью.
Альтернативное определение
CrossEntropyWithSoftmax()
в настоящее время является CNTK примитивом, который имеет ограничения.
Более гибкая рекомендуемая альтернатива заключается в том, чтобы определить ее вручную следующим образом:
CrossEntropyWithSoftmax (y, z) = ReduceLogSum (z) - TransposeTimes (y, z)
Разреженные метки
Чтобы вычислить перекрестную энтропию с разреженными метками (например, чтение с помощью Input
(./Inputs#input)),{..., sparse=true}
необходимо использовать альтернативную форму выше.
Softmax над тензорами с рангом>1
Чтобы вычислить CrossEntropyWithSoftmax()
значение "При применении к тензорам" ранга>1, например, где задача заключается в определении расположения в 2D-сетке, необходимо использовать еще одну альтернативную форму:
CrossEntropyWithSoftmax (y, z, axis=None) = ReduceLogSum (z, axis=axis) - ReduceSum (y .* z, axis=axis)
Эта форма также позволяет применять операцию Softmax только по определенной оси.
Например, если входные и метки имеют фигуру [10 x 20]
, а Softmax следует вычислить по каждому из 20 столбцов независимо, укажите axis=1
.
Пример
labels = Input {9000}
...
z = W * h + b
ce = CrossEntropyWithSoftmax (labels, z)
criterionNodes = (ce)
То же самое с разреженными метками:
labels = Input {9000, sparse=true}
...
z = W * h + b
ce = ReduceLogSum (z) - TransposeTimes (labels, z)
criterionNodes = (ce)
Logistic{}, WeightedLogistic{}
Вычисляет функцию логистической потери.
Logistic (y, p)
WeightedLogistic (y, p, instanceWeight)
Параметры
y
: метка с нуля, 0 или 1p
: афизорная вероятность того, что класс является классом.1
Возвращаемое значение
Вычисляет (взвешаемую) логистическую потерю, определенную следующим образом:
ll = -sum_i { y_i * log(p_i) + (1-y_i)*log(1-p_i))} * weight
(где для Logistic()
, вес равен 1).
Описание
Эта функция является функцией логистической потери.
Logistic (y, Softmax (z))
идентичен CrossEntropyWithSoftmax (y, z)
двухклассовой проблеме, где присваивается Logistic()
только одна из двух (взаимодополняющих) меток правды.
См. также эту статью об обучении многоклассовых классификаторов.
Пример
multiLabels = Input {1000} # 0 or 1 for each value
...
p = DenseLayer {1000, activation=Sigmoid} (h) # element-wise predictor for 1000 values
ll = Logistic (multiLabels, p)
trainingCriterion = (ll)
ClassificationError{}
Вычисляет частоту ошибок для прогнозирования категориальных меток. Для двоичных меток можно использовать потерю подколенного сухожилия.
ClassificationError (y, z)
Параметры
y
: категориальные метки в одно горячей формеz
: вектор оценок прогнозирования, например вероятности журналов.
Возвращаемое значение
1, если максимальное значение z
находится в позиции, где y
имеет значение 1; 0 в противном случае; суммируется по всей минибатче.
Описание
Эта функция принимает вектор задних вероятностей, логитов или других соответствующих оценок, где каждый элемент представляет соответствующую оценку класса или категории.
Функция определяет, равен ли класс с наивысшей оценкой классу, обозначаемого входными данными y
метки, путем проверки того, содержит ли позиция с наивысшей оценкой значение 1.
При использовании в качестве критерия оценки процесс ОБРАБОТКИ агрегирует все значения за эпоху и сообщает среднее значение, т. е. частоту ошибок.
ClassificationError()
нельзя использовать с разреженными метками.
Примечание. В CNTK до версии 1.7 эта операция была вызванаErrorPrediction()
.
Имя по-прежнему можно использовать, но не рекомендуется.
Пример
labels = Input {9000}
...
z = W * h + b
errs = ClassificationError (labels, z)
evaluationNodes = (errs)