Глава 3. Вводим нелинейность: теперь не только взвешенные суммы
133
Листинг 3.7.
Код вычисления и визуализации кривой ROC и ее AUC
Стоит отметить в листинге 3.7 вызов функции
tf.tidy()
. Она гарантирует, что па
мять после тензоров, созданных внутри переданной в нее анонимной функции, будет
должным образом освобождена и они не будут занимать память WebGL. В браузере
TensorFlow.js не может повлиять на выделяемую для пользовательских тензоров па
мять в основном изза отсутствия финализации объектов в JavaScript и сборки мусора
для текстур WebGL, лежащих в основе тензоров TensorFlow.js. Если не очистить долж
ным образом подобные промежуточные тензоры, произойдет утечка памяти WebGL.
А если такие утечки памяти будут продолжаться в течение долгого времени, то в кон
це концов они приведут к ошибкам нехватки памяти WebGL. Раздел Б.3 содержит
подробное руководство по управлению памятью в TensorFlow.js. А в разделе Б.5 вы
найдете упражнения на эту тему. Внимательно изучите эти разделы, если собираетесь
описывать пользовательские функции на основе композиции функций TensorFlow.js.
3.2.4. Бинарная перекрестная энтропия
До сих пор мы говорили о нескольких различных метриках, количественно выра
жающих разные аспекты качества работы бинарного классификатора, в частности
о безошибочности, точности и полноте (см. табл. 3.3). Но мы не затрагивали важную
134
Часть II • Введение в TensorFlow.js
метрику, дифференцируемую и способную генерировать градиенты, подходящие для
обучения модели на основе градиентного спуска. Мы говорим о
binaryCrossentropy
,
мельком упомянутой в листинге 3.5:
model.compile({
optimizer: 'adam',
loss: 'binaryCrossentropy',
metrics: ['accuracy']
});
Прежде всего вы можете задать вопрос: почему просто не взять безошибочность,
точность, полноту или даже, например, AUC и не использовать их в качестве функ
ции потерь? В конце концов, эти метрики вполне понятны. Кроме того, в задачах
регрессии выше мы использовали в качестве функции потерь MSE, тоже понятную
метрику. Дело в том, что ни одна из этих метрик бинарной классификации не дает
необходимых для обучения градиентов. Возьмем, например, безошибочность:
чтобы понять, почему она не подходит для генерирования градиентов, достаточно
осознать, что для ее вычисления необходимо определить, какие из предсказаний
модели позитивные, а какие — негативные (см. первую строку табл. 3.3). Для этого
нужно воспользоваться
пороговой функцией
(thresholding function), которая бы
преобразовывала выходной сигнал сигмафункции модели в бинарные предска
зания. В этом и кроется корень проблемы: хотя пороговая функция (
ступенчатая
функция
, говоря более строгим языком) дифференцируема почти везде («почти»,
поскольку она не дифференцируема в «точке скачка» 0,5), ее производная везде
равна нулю (рис. 3.7)! Что же будет, если попытаться произвести обратное рас
пространение ошибки через такую пороговую функцию? Все градиенты в конце
концов превратятся в нули, поскольку в определенный момент значения градиентов
умножаются на нулевые производные ступенчатой функции. Проще говоря, если
в качестве функции потерь используется безошибочность (точность, полнота, AUC
Рис. 3.7.
Ступенчатая функция, используемая для преобразования вероятности, получаемой
на выходе модели бинарной классификации, дифференцируема почти везде. К сожалению,
градиент (производная) во всех точках, где она дифференцируема, равен нулю
Do'stlaringiz bilan baham: |