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

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

Основная цель предлагаемой функции потерь — улучшить обучение моделей нейронных сетей, и мы покажем это на задаче распознавания именованных объектов (NER), но вы можете применить тот же принцип к любой другой задаче классификации. Используя теоретически обоснованный набор функций, кросс-энтропию (CE) и среднюю абсолютную ошибку(MAE), мы представляем гибкий метод обучения устойчивости к шуму. Вдобавок к этому мы применяем сглаживание меток, чтобы мы могли откалибровать модель в качестве дополнительного метода регуляризации, что также имеет решающее значение для надежной оценки неопределенности. Наша функция потерь может быть легко интегрирована в существующую архитектуру, предлагая практичное и эффективное решение для широкого спектра сценариев с зашумленными данными.

В этой статье мы подробно рассмотрим функцию потерь Smooth Generalized Cross-Entropy (SGCE), изложив ее теоретические основы, объяснив, зачем она нужна и как она работает. Для этого мы будем обучать модель на основе distilbert на общедоступном наборе данных CoNLL-2003. Полный код вы найдете в блокноте Colab здесь.

Давайте начнем!

Немного контекста

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

Даже соблюдая множество мер предосторожности при настройке данных, вы столкнетесь с шумом, который помешает вам достичь целевой точности, к которой вы стремитесь.

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

Теперь, что может быть чем-то еще, что может способствовать усилению смещения и/или шума? Сама функция потерь!

Стандарт: кросс-энтропийные (CE) потери

В настоящее время основной потерей при обучении модели Transformer является кросс-энтропия (CE), взгляните на код тренера HuggingFace, это вариант по умолчанию и единственный вариант для задач классификации, которые модели возвращают по умолчанию, когда вы запускаете их функцию forward. Других потерь для этой задачи нет.

К счастью, вы все еще можете переопределить функцию compute_loss Trainer и реализовать собственную потерю, которую мы увидим позже.

Теперь, что делает кросс-энтропия? Он измеряет несоответствие между предсказанными вероятностями модели и истинными вероятностями меток, которые вы можете использовать, чтобы понять, где происходит ошибка в предсказаниях модели. Cross-Entropy просто записывается следующим образом:

Теперь давайте посмотрим на его производную (по θ), которая выглядит следующим образом:

Все хорошо, пока вы не заметите этот термин:

Если вы следили за тем, что говорилось о шуме в начале, этот термин должен вас шокировать — это взвешивающий термин!

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

Все хорошо, пока вы не вспомните, что ни один набор производственных данных не является абсолютно беспристрастным или свободным от шума. А какие шумные примеры даны нашей модели? Их сложно изучить, потому что они могут противоречить истинному распределению, которое вы пытаетесь изучить. Это означает, что мы не хотим, чтобы потеря сосредоточилась на шуме, и пытались заставить модель изучить их любой ценой!

Хорошо, теперь, когда вы боитесь за свои данные, что нам делать? 😱

Давайте попробуем противоположный подход, проповедующий утопию равного отношения к нашим обучающим образцам, и посмотрим, что получится!

Утопия равенства: потеря средней абсолютной ошибки (MAE)

Как мы делаем потери, которые будут относиться к нашим образцам одинаково? Не смотрите дальше средней абсолютной ошибки (MAE)потери!

Давайте посмотрим, как это выглядит:

Примечание. Обратите внимание, что MAE эквивалентна Unhinged Loss с точностью до константы пропорциональности. Поэтому вместо этого мы будем использовать Unhinged Loss для простоты, так как они достигают того же результата, но мы продолжим называть его средней абсолютной ошибкой (MAE).

Что делает эта потеря, довольно просто: она вычисляет расстояние между вашей выборкой и основной истиной.

Посмотрим на его производную:

Что мы сразу замечаем, так это отсутствие весового члена!

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

Это означает, что эти потери теоретически устойчивы к шуму, поскольку они будут гораздо меньше зависеть от шума, чем потери CE!

Жесткая правда

Потеря MAE, кажется, решает проблему в контексте шума, но на самом деле все обстоит иначе:

Действительно, потери MAE на самом деле работают намного хуже в большинстве контекстов, включая шумовые сценарии, по сравнению с потерями CE

Это облом.

Но подумайте об этом, важно задать следующий вопрос: Какие предположения вы делаете, когда хотите тренироваться на наборе данных?

Потеря CE принимает идеальное предположение о том, что данные идеальны.

Идеальное средство:

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

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

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

Компромисс: общая потеря кросс-энтропии (GCE)

Обе вышеупомянутые функции потерь имеют свои плюсы и минусы, которые мы можем использовать в разных контекстах. Давайте просто объединим их!

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

Потери обобщенной кросс-энтропии (GCE) определяются следующим образом:

Ну, технически эта функция взята из страницы 214 «Анализ трансформаций» Д. Р. Кокс и Г. Э. П. Бокс (Неужели Давно потерянные братья наконец-то нашли друг друга и за пределами Оперы?😀) в Journal of the Royal Statistical Society. Серия Б (Методическая), Том. 26, №2. (1964). На самом деле это отрицание преобразования Бокса-Кокса.

А теперь его производная, как бы нам до сих пор не нравилось на них смотреть 😀:

Мы можем ясно видеть, что предлагаемая функция потерь эквивалентна CE для q -> 0 и становится потерей MAE, когда q -> 1.

Это действительно обобщение как потерь CE, так и потерь MAE, поскольку оно сочетает в себе оба их свойства взвешенным образом.

Вы заметите параметр q, который на самом деле означает: Какую степень дискриминации CE вы хотитеVSКакую степень помехоустойчивости обеспечивает MAE?

Или, другими словами: Каков примерно предполагаемый уровень шума в вашем текущем наборе данных?

Это довольно компромиссный вариант, поскольку мы можем позволить себе немного более длительную сходимость, когда много шума и все это настраивается!

Давайте реализуем это

Мы собираемся проверить эту потерю на практике, внедрив ее и опробовав на общедоступном наборе данных CoNLL-2003. Вы также можете попробовать это на своем собственном наборе данных.

Возможная реализация в PyTorch может быть следующей (вы можете найти полный блокнот, чтобы попробовать его самостоятельно, здесь):

class GCELoss(nn.Module):
    def __init__(self, q=0.5, ignore_index=-100):
        super(GCELoss, self).__init__()

        self.q = q
        self.ignore_index = ignore_index

        self.eps = 1e-8

    def forward(self, logits, targets):
        valid_idx = targets != self.ignore_index
        logits = logits[valid_idx] + self.eps
        targets = targets[valid_idx]

        # Optimization: use PyTorch's Cross-Entropy when q = 0 (much faster)
        if self.q == 0:
            # Single-class case
            if logits.size(-1) == 1:
                ce_loss = nn.BCEWithLogitsLoss(reduction='none')
                loss = ce_loss(logits.view(-1), targets.float())
            else:
                # Multi-class case
                ce_loss = nn.CrossEntropyLoss(ignore_index=self.ignore_index, reduction='none')
                loss = ce_loss(logits, targets)

            loss = (loss.view(-1) + self.eps).mean()
        else:
            # The actual Generalized Cross-Entropy Loss in case q > 0

            # Handle the same cases as above
            if logits.size(-1) == 1:
                pred = torch.sigmoid(logits)
                pred = torch.cat((1 - pred, pred), dim=-1)
            else:
                pred = F.softmax(logits, dim=-1)

            # The numerator part of the GCE loss
            numerator = (pred ** self.q)

            # Make the numerator more numerically stable (this is not in the original loss)
            pred = (numerator + self.eps).where(pred >= 0, -((pred.abs() ** self.q) + self.eps))
 
            # The denominator part of the GCE loss
            loss = (1. - pred) / (self.q  + self.eps)

            # Mean reduction to collapse the loss into a single number
            loss = (loss + self.eps).mean()

        return loss

Класс GCELoss наследуется от класса nn.Module, который является базовым классом для всех модулей PyTorch. При инициализации класс принимает два параметра:

  • q: управляет расчетным уровнем шума.
  • ignore_index: по умолчанию -100 и игнорирует вклад специальных токенов, таких как отступы и т. д.

Затем мы реализуем потерю и включаем оптимизацию для случая q = 0, поэтому мы используем оптимизированную и уже существующую реализацию Cross-Entropy от PyTorch. Мы также делаем потери более стабильными в числовом выражении для некоторых случаев, когда они могут выводить NaN.

Обучение модели

Весь код доступен здесь, так что вы можете воспроизвести все эксперименты.

Модель обучается в нескольких контекстах: от отсутствия шума (равномерный шум) добавляется к шуму «все, что вы можете съесть» с параметром n, который будет представлять уровень шума, и мы пробуем несколько значений параметра q во всех этих контекстах.

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

Из того, что мы видим, потери падают очень быстро, а затем неуклонно снижаются, когда задействовано не так много шума. Более того, чем шумнее становятся условия, тем медленнее снижаются потери.

Теперь добавим на график кросс-энтропийные потери и сравним:

Масштабы обеих потерь совершенно разные, и мы видим, что потери CE имеют больший динамический диапазон. На самом деле это может быть лучше с точки зрения численной стабильности, но мы не заметили никаких проблем, связанных с этим, во время обучения. В конце концов, разница только в масштабе, так как поведение и форма потери остаются прежними.

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

Тестирование модели

Теперь вы можете задаться вопросом:

Но разве мы только что забыли о потере MAE (q = 1,0) в этом сравнении?

Ну, не совсем, но поскольку все модели, созданные этой потерей, никогда не сходятся в каждом сценарии, который мы пробовали… упс…

Реальность такова, что на самом деле требуется гораздо больше времени, чтобы эта потеря действительно сошлась по сравнению с любой другой потерей, которая вносит даже малейшее смещение, то есть q < 1.0.

Тем не менее, давайте посмотрим на окончательные результаты тестов f1 (включая результаты MAE😉) со всем диапазоном значений, которые мы тестировали до сих пор:

Теперь мы можем начать делать некоторые выводы об использовании параметра q этой потери. Кажется, что когда наш набор данных чист и не содержит ненадежных источников, мы можем просто положиться на старую добрую кросс-энтропийную потерю, которая остается сильной. Тем не менее, потери GCE по-прежнему очень близки к ним для q значений ниже 0.6 включительно.

Однако все резко меняется в шумных условиях, когда мы видим, что потери CE не так хороши, и нам начинают нужны большие значения q для борьбы с шумом. Интересно, что если у вас есть статистически значимый шум, использование больших значений q напрямую работает лучше всего. Это означает, что q не совсем линейно пропорционально количеству шума n, как мы ожидали. Эти результаты могут отличаться в зависимости от уровня шума, поэтому во время обучения рекомендуется оптимизировать параметр q. Наконец, всякий раз, когда потери GCE приближаются к потерям MAE, все, что они производят, не сходятся за разумное время.

В целом, начиная с 20 % шума, мы начинаем видеть некоторые выигрыши в диапазоне от 0,5 балла до 6+ баллов в сценариях с самым сильным шумом без каких-либо других изменений, кроме использования потери GCE.

Жесткая правда, снова

Обобщенная кросс-энтропия дает неплохой прирост точности в шумных условиях, что характерно для большинства реальных сценариев, и нам просто нужно поменять местами потери CE на потери GCE, звучит очень удобно.

Так чем же мы могли быть недовольны на этот раз?

Калибровка достоверности модели!

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

К сожалению, калибровка модели не часто упоминается, но на самом деле очень важна!

Зная это, мы собираемся изучить, как (не)калиброванные наши обученные модели используют графики надежности на наборе данных CoNLL-2003.

Давайте сначала посмотрим на графики надежности, так как их легче всего понять. Если модель выдает достоверность 0,5 для своего вывода, то точность должна быть 0,5. Если он выводит 1,0, то это должен быть идеальный ответ модели с точностью 1,0.

На приведенном ниже графике показана модель, обученная с шумом n=0.6, поэтому сценарий с сильным шумом:

Этот график должен показывать, что достоверность должна быть равна точности (но в данном случае это не так).

Давайте объясним это немного подробнее, здесь вы можете увидеть 10 красных полос, помеченных как "Пробел", 10 (или меньше) синих полос, помеченных как "Вывод", и диагональная серая линия:

  • Синие полосы – это достоверность модели при определенном уровне точности.
  • Красные полосы показывают, чего не хватает модели по сравнению с идеально откалиброванной моделью.
  • Диагональная серая линия показывает, где должны заканчиваться все синие полосы на каждой отметке достоверности, чтобы представить идеально откалиброванную модель.

Давайте возьмем еще один пример, чтобы сделать это как можно более ясным. Если мы посмотрим на ось достоверности на синей полосе на отметке 0,5, то увидим, что почти каждый раз, когда модель выдает ответ с достоверностью 0,5, это на самом деле идеальный ответ с точностью 1,0, то же самое для достоверности 0,3 до 0,7. И после этого мы видим только красные столбцы, что означает, что модель никогда не выдает ничего с уверенностью выше 0,7, даже если выдает полностью правильный ответ.

Это очень плохо! Это означает, что модель на самом деле имеет очень хорошие оценки, но мы не можем быть уверены в производственной среде, если она продолжает показывать случайный уровень достоверности между 0,3 и 0,7. По сути, это вопрос модели: «Вы уверены в своем выходе?» а затем большую часть времени просто отвечает «Мех 🤷», даже если это правильный ответ. Модель не уверена в себе!

Теперь, когда проблема ясна, давайте углубимся в нее.

Оглядываясь назад на приведенный выше график, мы также можем вычислить метрики Ожидаемая ошибка калибровки (ECE) и Максимальная ошибка калибровки (MCE). Эти показатели измеряют соответственно ожидаемую и наихудшую ошибку калибровки, которая представляет собой разницу между ожидаемой точностью и ожидаемой достоверностью.

Для тестового набора у нас есть ECE 0,56 и MCE 0,60. Чем ниже, тем лучше, так что мы все еще можем сделать лучше.

Может ли здесь помочь общая кросс-энтропия?

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

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

Точно так же давайте посмотрим на значения ECE и MCE:

  • Для теста n = 0,6 и q = 0,6: ECE – 0,11, а MCE – 0,21.
  • Для теста n = 0,6 и q = 0,8: ECE – 0,023, а MCE – 0,30.
  • Для проверки n = 0,6 и q = 0,6: ECE составляет 0,11, а MCE составляет 0,25.
  • Для проверки n = 0,6 и q = 0,8: ECE – 0,013 и MCE – 0,24.

Ясно, что модель гораздо лучше откалибрована с использованием обобщенной кросс-энтропийной потери. Ожидаемая ошибка уменьшается в 24 раза, а максимальная ошибка — в 2–3 раза. Мы также заметили, что более высокое значение q, по-видимому, помогает как для тестовой, так и для проверочной калибровки, а это означает, что свойства MAE выравниваются. логиты во время обучения, как мы и ожидали.

Расширение потерь: гладкая обобщенная кросс-энтропия (S-GCE)

Приведенные выше графики и метрики выглядят значительно лучше, но зачем останавливаться на достигнутом?

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

Сглаживание меток

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

Взгляните на этот красивый пример рисунка, изображающий нейронную сеть, делающую прогноз на основе транзакционных данных:

Банковская транзакция может содержать несколько сущностей, которые могут быть организацией, местоположением и т. д.

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

Проблема в том, что модель будет обучена быть самоуверенной, поскольку это является целью обучения. Вам понадобится почти идеальный набор данных, сбалансированный и с хорошими метками, чтобы модель узнала, что в 50% случаев одна метка по сравнению с другой уравновешивает вероятности, давая более откалиброванную модель. Но это часто не так, особенно в крупномасштабных наборах данных, и все, что нарушает этот хороший баланс в наборе данных, приведет к отклонению модели от требуемой калибровки.

Теперь давайте представим, что мы могли бы распределить вероятности следующим образом:

Распределение вероятностей на самом деле сгладит их. Это означает, что во время обучения вместо того, чтобы всегда пытаться предсказать максимальную вероятность для наиболее вероятной конечной метки, мы допустим некоторую неопределенность, которая немного увеличит вероятности для каждой другой метки, сохраняя высокую вероятность для большинства. скорее всего один, но уже не 100% вероятность.

Кроме того, в случае распознавания именованных объектов (NER) мы можем сглаживать интервалы, как показано выше, поскольку иногда даже помеченные данные, которые у нас есть, не уверены, когда объект запускается или останавливается. Поэтому, чтобы помочь с этим, мы позволяем вероятностям распространяться и загрязнять токены непосредственно вокруг них. Можно было бы распределить по нескольким токенам, но это кажется полезным только в доменах, где данные очень неоднозначны.

Выполнение

Вот полностью прокомментированный код для увеличения потери с помощью описанного выше подхода (целый блокнот, чтобы попробовать его самостоятельно, здесь):

class SGCELoss(nn.Module):
    def __init__(self, q=0.5, smoothing=0.1, ignore_index=-100):
        super(SGCELoss, self).__init__()

        self.q = q
        self.smoothing = smoothing

        self.ignore_index = ignore_index

        self.eps = 1e-8

    def forward(self, logits, targets):
        valid_idx = targets != self.ignore_index
        logits = logits[valid_idx] + self.eps
        targets = targets[valid_idx]

        # Optimization: use PyTorch's Cross-Entropy when q = 0 (much faster)
        if self.q == 0:
            # Single-class case
            if logits.size(-1) == 1:
                ce_loss = nn.BCEWithLogitsLoss(reduction='none')
                loss = ce_loss(logits.view(-1), targets.float())
            else:
                # Multi-class case
                # PyTorch implements label smoothing for the CE loss by default
                ce_loss = nn.CrossEntropyLoss(ignore_index=self.ignore_index, reduction='none', label_smoothing=self.smoothing)
                loss = ce_loss(logits, targets)

            loss = (loss.view(-1) + self.eps).mean()
        else:
            # The actual Smooth Generalized Cross-Entropy Loss in case q > 0

            # Handle the same cases as above
            if logits.size(-1) == 1:
                pred = torch.sigmoid(logits)
                pred = torch.cat((1 - pred, pred), dim=-1)
            else:
                pred = F.softmax(logits, dim=-1)

            # The numerator part of the GCE loss
            numerator = (pred ** self.q)

            # Make the numerator more numerically stable (this is not in the original loss)
            pred = (numerator + self.eps).where(pred >= 0, -((pred.abs() ** self.q) + self.eps))
 
            # The denominator part of the GCE loss
            loss = (1. - pred) / (self.q  + self.eps)

            # Here we construct the array we want to write the smoothing into
            pre_smoothed = pred.new_ones(pred.size()) * self.smoothing / (pred.size(-1) - 1.)

            # Given the targets' positions, we write the smoothing factors in the correct spot 
            # (inverted because if we have smoothing=0.1, then the highest probability will be 0.9 and 
            # the remaining 0.1 will be scattered)
            pre_smoothed = pre_smoothed.scatter_(-1, targets.unsqueeze(-1), (1.0 - self.smoothing))

            # Apply the smoothing 
            smoothed = pre_smoothed * loss
            
            # Mean reduction to collapse the loss into a single number
            loss = (smoothed + self.eps).mean()

        return loss

Опять же, мы повторно используем реализацию PyTorch по умолчанию для потерь CE и параметра сглаживания меток.

Что касается фактической части потерь Smooth Generalized Cross-Entropy (S-GCE), мы должны реализовать ее вручную. Сначала мы создаем массив pre_smoothed, который будет содержать преобразование сглаживания. Мы берем массив targets, который содержит индекс наземных целей, и используем эти индексы для записи коэффициентов сглаживания 1.0 - smoothing. Мы инвертируем параметр сглаживания, потому что если у нас есть, например, smoothing=0.1, то мы хотим, чтобы самая высокая вероятность, то есть 1.0, стала 0.9, то есть 1.0 - 0.1. Наконец, мы применяем этот массив, умножая его на потери по целям.

Обучение большего количества моделей

Ниже вы увидите график ожидаемой ошибки калибровки (ECE) в зависимости от уровня шума данных (n) для нескольких точно настроенных моделей на основе дистилляторов:

Графики определенно показывают, что без шума потери CE по-прежнему очень хороши для калибровки модели, если набор данных сделан правильно. К сожалению, мы показываем, что показатели потерь CE в среднем очень быстро ухудшаются для шумных сценариев. Это означает, что потери очень чувствительны к шуму, как мы объясняли ранее, поскольку они будут сосредоточены на изучении некоторых из этих плохих выборок, которые могут запутать модель и создать дисбаланс в распределении достоверности модели, даже если точность очень высока.

Другое дело, что даже при использовании сглаживания с потерями ХЭ мы не в состоянии уменьшить погрешность калибровки.

Средний случай важен, но также важно свести к минимуму наихудший сценарий, поэтому давайте посмотрим на максимальную ошибку калибровки (MCE):

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

В то время как CE и MCE объединяют статистику бинов в простую скалярную метрику, которая помогает нам визуализировать множество различных тренировок, диаграммы надежности позволяют просматривать статистику каждого бина одновременно. Итак, давайте рассмотрим некоторые из них и только тестовый набор, чтобы не загромождать вещи:

В сильно зашумленном контексте потери SGCE намного лучше откалиброваны и улучшаются с коэффициентом сглаживания около 0.1 < s < 0.2, в то время как потери CE на самом деле не улучшаются, поскольку они уже борются с изучением шума в первую очередь.

Теперь, если шума нет, все по-другому:

Потери CE лучше калибровать неявно, так как они лучше узнают правильно сбалансированные данные и не пытаются ослабить несуществующий шум. Потери SGCE нуждаются в низком значении q, чтобы работать аналогично, что в основном просто аппроксимирует потери CE.

Итак, как мы видим, потери SGCE намного лучше как по точности, так и по метрикам калибровки почти во всех сценариях. И в любом случае это может стать потерей CE с q=0, так что это действительно обобщение потери CE.

Интуиция

Почему сглаживание работает? Интуиция подсказывает, что сглаживание также пытается обеспечить более равные шансы для каждой метки появиться в прогнозе, который актуален, чем больше неправильно маркированных данных у нас есть:

Это тот же принцип, что и свойство MAE на уровне выборки, но здесь мы делаем это на уровне токена!

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

Примечание о дистилляции модельных знаний

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

Как замечено, это, вероятно, вызвано тем, что модели, обученные со сглаживанием и без него, имеют разные масштабы своих вложений (как мы можем видеть на графиках). Без сглаживания представления имеют гораздо более высокие абсолютные значения, которые могут представлять собой чрезмерно уверенные прогнозы, в то время как обученные модели со сглаживанием будут иметь семантически похожие выборки, встроенные в более плотные кластеры, что означает, что они в конечном итоге будут сопоставлены с аналогичными логитами.

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

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

Вам решать погрузиться глубже и посмотреть, какое объяснение может быть лучшим 😁

Лично я думаю, что эту проблему также можно объяснить нашими нынешними методами дистилляции, которые обычно используют дивергенцию Кульбака-Лейблера (КЛ) с уклонением от нуля (отличная статья, если вы не знаете разницы), которая попытается распределите примерное распределение учителей Q(x) по кластерам.

В нашем случае, если сглаживание сузит кластеры, то Q(x) будет очень разбросан и фактически не будет аппроксимировать предсказания модели студента. На самом деле это будет аппроксимировать то, что было бы непрерывным представлением модели, обученной без сглаживания, поскольку мы потеряли непрерывность между классами, если вы помните 😀

Мы не погружались в дистилляцию после обучения потерь SGCE, но я полагаю, что использование обратной дивергенции KL может помочь решить проблему и подобрать что-то, что работает:

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

Другой идеей может быть попытка чередовать подгонку модели с использованием прямой и обратной дивергенции KL, чтобы смешать их преимущества (аналогично тому, как мы смешали свойства CE и MAE). если это кажется довольно вычислительно интенсивным.

Это закончилось длинной заметкой о дистилляции, но если у кого-то есть лучшее объяснение, пожалуйста, дайте мне знать 😄

Заключение

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

Теперь давайте подытожим все из этого поста:

  • Обобщенная кросс-энтропийная потеря (GCE) представляет собой обобщение как кросс-энтропийной(CE)потери, так и среднего абсолютного Ошибка (MAE)
  • Параметр q обычно используется в диапазоне от 0 до 1, и получить приблизительное значение можно, ответив на вопрос: «Какую степень подавления шума я хочу использовать во время тренировки?»
  • Калибровка достоверности очень важна для реальных производственных сценариев.
  • Smooth Generalized Cross-Entropy(SGCE)является расширением функции потерь, которое обеспечивает еще более качественную калибровку без дополнительных хитростей (таких как температура масштабирование), используя параметр сглаживания s между 0 и 1
  • Сглаживание — это принцип, аналогичный свойству MAE, который работает на уровне образца, но на уровне токена.
  • Потеря кросс-энтропии (CE),котораяэквивалентна гладкой обобщенной кросс-энтропии(SGCE)с q=0, по-прежнему хороший выбор для чистых наборов данных
  • Потеря средняя абсолютная ошибка (MAE) — плохой выбор для большинства наборов данных.
  • Код доступен здесь
  • Дистилляция после сглаживания до сих пор является предметом исследований 😀

Если вам понравилось читать эту статью, не стесняйтесь подписываться и оставлять комментарии, если у вас есть какие-либо вопросы!