From cadcd79024e37a24e7e326c0504d247eea443b0b Mon Sep 17 00:00:00 2001 From: Nikolay Lysenko Date: Sun, 21 Jan 2024 14:22:13 +0300 Subject: [PATCH] feat: Describe ListMLELoss --- notes/all_notes_without_sorting.ipynb | 33 +++++++++++++++++++-------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/notes/all_notes_without_sorting.ipynb b/notes/all_notes_without_sorting.ipynb index 767c86b..c05ffcb 100644 --- a/notes/all_notes_without_sorting.ipynb +++ b/notes/all_notes_without_sorting.ipynb @@ -4198,11 +4198,11 @@ "\n", "#### Введение\n", "\n", - "Выборка для обучения ранжирующей модели может быть составлена не только из независимых друг от друга объектов (как это в иделае должно быть в задачах регрессии и классификации). Порой естественным образом объекты разбиваются на группы, внутри которых объекты зависимы, а ранжирование нужно только в пределах каждой из групп. Например, если пользователь листает ленту в социальной сети и какие-то элементы пропускает, а на какие-то кликает, то группой можно считать один заход пользователя в ленту, а отранжировать элементы хочется так, чтобы кликнутые элементы были сверху.\n", + "Выборка для обучения ранжирующей модели может быть составлена не только из независимых друг от друга объектов (как это в идеале должно быть в задачах регрессии и классификации). Порой естественным образом объекты разбиваются на группы, внутри которых объекты зависимы, а ранжирование нужно только в пределах каждой из групп. Например, если пользователь листает ленту в социальной сети и какие-то элементы пропускает, а на какие-то кликает, то группой можно считать один заход пользователя в ленту, а отранжировать элементы хочется так, чтобы кликнутые элементы были сверху.\n", "\n", "Если функция потерь для задачи ранжирования зависит от порядка всех объектов группы, она называется посписочной или погрупповой. В противовес им существуют поточечные функции потерь (то есть функции потерь для регрессии или классификации) и попарные функции потерь (то есть функции потерь, вычисляемые на некоторых парах объектов из одной и той же группы).\n", "\n", - "Далее все формулы будут приводиться для одной группы размера $\\vert g \\vert$, целевая переменная на $i$-м объекте которой будет обозначаться как $y_i$, а предсказание модели, по убыванию которых делается ранжирование, — как $s_i$.\n", + "Далее все формулы будут приводиться для одной группы размера $\\vert g \\vert$, целевая переменная на $i$-м объекте которой будет обозначаться как $y_i$, а предсказание модели — как $s_i$. На всякий случай напомним, что по убыванию этих предсказаний и делается ранжирование.\n", "\n", "#### Модификации поточечных функций потерь\n", "\n", @@ -4220,8 +4220,7 @@ "$$\\hat{y}_i = \\mathrm{softmax}(s)_i = \\frac{e^{s_i}}{\\sum_{j=1}^{\\vert g \\vert} e^{s_j}}.$$\n", "\n", "Вне зависимости от выбранного способа далее $\\hat{y}_i$ подставляются в формулу логарифмической функции потерь:\n", - "$$\\mathrm{LogLoss}(y, \\hat{y}) = - \\frac{1}{c} \\sum_{i=1}^{\\vert g \\vert} \\left( y_i \\log \\hat{y}_i + (1 - y_i) \\log (1 - \\hat{y}_i) \\right),$$\n", - "где $c = \\sum_{i=1}^{\\vert g \\vert} y_i$ — нормировочная константа, нужная, чтобы значения функции потерь на разных группах можно было усреднять.\n", + "$$\\mathrm{LogLoss}(y, \\hat{y}) = - \\frac{1}{\\vert g \\vert} \\sum_{i=1}^{\\vert g \\vert} \\left( y_i \\log \\hat{y}_i + (1 - y_i) \\log (1 - \\hat{y}_i) \\right).$$\n", "\n", "По-хорошему, обе этих модификации логарифмической функции потерь могли бы называться QueryLogLoss, но в документации CatBoost'а первую называют QueryCrossEntropy, а вторую — QuerySoftmax.\n", "\n", @@ -4235,17 +4234,31 @@ "\n", "Позиция $i$-го объекта в группе является разрывной функцией от вектора $s$, и при помощи данной идеи она может быть аппроксимирована так:\n", "$$\\mathrm{ApproxRank}(s)_i = 1 + \\sum_{j \\ne i} \\frac{1}{1 + \\exp\\left(\\frac{-(s_j - s_i)}{t}\\right)}.$$\n", + "Далее для краткости введём обозначение $\\pi(s)_i = \\mathrm{ApproxRank}(s)_i$, то есть $\\pi$ — отображение из вектора предсказаний в вектор приближённых позиций.\n", "\n", "Для тех матрик качества, где вся разрывность возникает только из-за позиции, этого достаточно для определения функций потерь. Так, имеем:\n", - "$$\\mathrm{ApproxNDCG}(y, s) = \\frac{1}{\\mathrm{IDCG}(y)} \\sum_{i=1}^{\\vert g \\vert} \\frac{f(y_i)}{\\log_2(1 + \\mathrm{ApproxRank}(s)_i)},$$\n", - "$$\\mathrm{ApproxMARR}(y, s) = \\frac{1}{\\sum_{i=1}^{\\vert g \\vert} y_i} \\sum_{i=1}^{\\vert g \\vert} \\frac{1}{\\mathrm{ApproxRank}(s)_i)} y_i,$$\n", - "где последняя функция потерь предполагает бинарные целевые переменные, а MARR расшифровывается как Mean Average Reciprocal Rank: отличие от MRR в том, что берутся ранги всех объектов положительного класса, а не только одного, отранжированного выше остальных. Множитель $\\frac{1}{\\sum_{i=1}^{\\vert g \\vert} y_i}$ как раз и отвечает за усреднение по ним.\n", + "$$\\mathrm{ApproxNDCG}(y, s) = - \\frac{1}{\\mathrm{IDCG}(y)} \\sum_{i=1}^{\\vert g \\vert} \\frac{f(y_i)}{\\log_2(1 + \\pi(s)_i)},$$\n", + "$$\\mathrm{ApproxMARR}(y, s) = - \\frac{1}{\\sum_{i=1}^{\\vert g \\vert} y_i} \\sum_{i=1}^{\\vert g \\vert} \\frac{1}{\\pi(s)_i} y_i,$$\n", + "где последняя функция потерь предполагает бинарные целевые переменные, а MARR расшифровывается как Mean Average Reciprocal Rank: отличие от MRR в том, что берутся ранги всех объектов положительного класса, а не только одного, отранжированного выше остальных. Множитель $\\frac{1}{\\sum_{i=1}^{\\vert g \\vert} y_i}$ как раз и отвечает за усреднение по ним. А ещё в обеих формулах у правой части изменён знак, потому что NDCG и MARR надо максимизировать, а функции потерь — минимизировать.\n", "\n", "Однако в метриках наподобие MAP разрывность также возникает из-за отсечения по какому-либо порогу. Эту разрывность тоже можно апроксимировать логистической функцией со своей температурой $\\tau$. Итого имеем:\n", - "$$\\mathrm{ApproxMAP}(y, s) = \\frac{1}{\\sum_{i=1}^{\\vert g \\vert} y_i} \\sum_{i=1}^{\\vert g \\vert} \\left(\\frac{y_i}{\\mathrm{ApproxRank}(s)_i} + \\sum_{j \\ne i} \\frac{y_i y_j}{\\mathrm{ApproxRank}(s)_i} \\frac{1}{1 + \\exp(-\\tau (\\mathrm{ApproxRank}(s)_i - \\mathrm{ApproxRank}(s)_j) )}\\right).$$\n", - "Интерпретация тут такая. Сначала, как и ранее, идёт множитель, отвечаюший за усреднение по объектам положительного класса. При суммировании по объектам ненулевой вклад внесут только объекты положительного класса, потому что $i$-е слагаемое кратно $y_i$. Если $y_i = 1$, то в выражении под суммой первый член показывает вклад $i$-го объекта в ту точность, которая возникает при проведении границы между классами после позиции $i$-го объекта, а второй член равен вкладу в эту точность тех объектов положительного класса, которые отранжированы выше $i$-го.\n", + "$$\\mathrm{ApproxMAP}(y, s) = - \\frac{1}{\\sum_{i=1}^{\\vert g \\vert} y_i} \\sum_{i=1}^{\\vert g \\vert} \\left(\\frac{y_i}{\\pi(s)_i} + \\sum_{j \\ne i} \\frac{y_i y_j}{\\pi(s)_i} \\frac{1}{1 + \\exp\\left(-\\tau (\\pi(s)_i - \\pi(s)_j)\\right)}\\right).$$\n", + "Интерпретация тут такая. Сначала, как и ранее, идёт множитель, отвечающий за усреднение по объектам положительного класса. При суммировании по объектам ненулевой вклад внесут только объекты положительного класса, потому что $i$-е слагаемое кратно $y_i$. Если $y_i = 1$, то в выражении под суммой первый член показывает вклад $i$-го объекта в ту точность, которая возникает при проведении границы между классами после позиции $i$-го объекта, а второй член равен вкладу в эту точность тех объектов положительного класса, которые отранжированы выше $i$-го.\n", "\n", - "Какая бы метрика ни приближалась, недостаток этого подхода в том, что чем ниже температура (то есть чем точнее логистическая функция приближает индикаторную функцию), тем больше становится область, в которой градиент логистической функции неинформативен. Таким образом, есть компромисс между несоответствием функции потерь метрике и возможностью успешной оптимизации." + "Какая бы метрика ни приближалась, недостаток этого подхода в том, что чем ниже температура (то есть чем точнее логистическая функция приближает индикаторную функцию), тем больше становится область, в которой градиент логистической функции неинформативен. Таким образом, есть компромисс между несоответствием функции потерь метрике и возможностью успешной оптимизации.\n", + "\n", + "#### Отрицательные прологарифмированные правдоподобия\n", + "\n", + "Как известно, логарифмическая функция потерь с точностью до константы является логарифмом правдоподобия обучающей выборки относительно распределения, задаваемого предсказанными вероятностями. В задаче ранжирования тоже бывают функции потерь, являющиеся прологарифмированным правдоподобием: на этот раз — идеального ранжирования относительно некого распределения, параметризованного вектором предсказаний $s$. Более того, в отличие от логарифмической функции потерь эти функции потерь работают не только с бинарными целевыми переменными.\n", + "\n", + "Если ранее в этой заметке индексация объектов была произвольной, теперь под $i$-м объектом будем иметь в виду объект, занимающий $i$-ю позицию в идеальном ранжировании. Если у нескольких объектов одинаковые целевые переменные, позиции между ними распределяются случайно. Более того, некоторые программные реализации даже [не фиксируют](https://www.tensorflow.org/ranking/api_docs/python/tfr/keras/losses/ListMLELoss) зерно случайности, так что значение функции потерь может меняться при неизменных входах.\n", + "\n", + "В качестве правдоподобия можно взять вероятность идеального ранжирования при сэмплировании из распределения Плакетта-Льюса:\n", + "$$\\mathbb{P}(y \\vert s) = \\prod_{i=1}^{\\vert g \\vert} \\mathrm{softmax}(s)_i = \\prod_{i=1}^{\\vert g \\vert} \\frac{\\exp(s_i)}{\\sum_{j=i}^{\\vert g \\vert} \\exp(s_j)}.$$\n", + "Из этой формулы можно увидеть интерпретацию распределения Плакетта-Льюса. На каждую текущую позицию ставится объект, просэмплированный из категориального распределения над ещё не выбранными объектами группы, где вероятности задаются применением софтмакса к тем компонентам вектора $s$, которые соответствуют этим объектам.\n", + "\n", + "Функция потерь под названием ListMLELoss в таком случае принимает вид:\n", + "$$\\mathrm{ListMLELoss}(y, s) = -\\log \\mathbb{P}(y \\vert s).$$" ] } ],