From ce726d938f930e1d3f751b5069210acf7abcfa74 Mon Sep 17 00:00:00 2001 From: Aner Zakobar Date: Sat, 4 Jul 2026 23:35:36 +0300 Subject: [PATCH] Citations, better flake.nix, better figure --- bibliography/thesis.bib | 40 +++ content/method/figures/roll_principle.png | Bin 85476 -> 85520 bytes content/method/figures/roll_principle.py | 12 +- content/method/method.tex | 346 +++++++++++++++------- content/related_work/related_work.tex | 109 +++++++ flake.nix | 1 + 6 files changed, 389 insertions(+), 119 deletions(-) diff --git a/bibliography/thesis.bib b/bibliography/thesis.bib index 4b608cb..47bea7f 100644 --- a/bibliography/thesis.bib +++ b/bibliography/thesis.bib @@ -1,3 +1,43 @@ +@article{tong2016neyman, + title={A survey on {Neyman--Pearson} classification and suggestions for future research}, + author={Tong, Xin and Feng, Yang and Zhao, Anqi}, + journal={{WIREs} Computational Statistics}, + volume={8}, + pages={64--81}, + year={2016}, + doi={10.1002/wics.1376}, + publisher={Wiley} +} + +@article{botev2010kde, + title={Kernel density estimation via diffusion}, + author={Botev, Z. I. and Grotowski, J. F. and Kroese, D. P.}, + journal={The Annals of Statistics}, + volume={38}, + number={5}, + pages={2916--2957}, + year={2010}, + doi={10.1214/10-aos799}, + publisher={Institute of Mathematical Statistics} +} + +@book{press2007numerical, + title={Numerical Recipes: The Art of Scientific Computing}, + author={Press, William H. and Teukolsky, Saul A. and Vetterling, William T. and Flannery, Brian P.}, + edition={3rd}, + year={2007}, + publisher={Cambridge University Press}, + address={Cambridge}, + isbn={978-0-521-88068-8} +} + +@article{chen2022beta, + title={Novel closed-form point estimators for the beta distribution}, + author={Chen, Piao and Xiao, Xun}, + journal={arXiv preprint arXiv:2210.05536}, + year={2022} +} + @article{demaine2007jigsaw, title={Jigsaw puzzles, edge matching, and polyomino packing: Connections and complexity}, author={Demaine, Erik D. and Demaine, Martin L.}, diff --git a/content/method/figures/roll_principle.png b/content/method/figures/roll_principle.png index 630ea65755dc40f993b663d005727ad65e3106ce..41c02916985d58878457b2bba184cae5c8d3e72e 100644 GIT binary patch delta 49227 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 (ljA~F0yAfwd1dzfr_njq!-8IyH?&wle+9l= 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 diff --git a/content/method/figures/roll_principle.py b/content/method/figures/roll_principle.py index 4bd0efe..e4f5c30 100644 --- a/content/method/figures/roll_principle.py +++ b/content/method/figures/roll_principle.py @@ -92,12 +92,12 @@ ax2.axhline(F1_tau, color=C_POS, linestyle="-.", linewidth=0.9, alpha=0.7) ax2.plot(tau, F0_tau, "o", color=C_NEG, markersize=5, zorder=4) ax2.plot(tau, F1_tau, "o", color=C_POS, markersize=5, zorder=4) -# Left-side y-axis labels for the intercepts -x_min = x[0] -ax2.text(x_min - 0.15, F0_tau, rf"$1-\alpha$", - fontsize=8, color=C_NEG, va="center", ha="right") -ax2.text(x_min - 0.15, F1_tau, r"$\hat{F}_1(\tau)$" + "\n(loss)", - fontsize=7.5, color=C_POS, va="center", ha="right") +# Right-side labels for the intercepts (placed where CDFs have flattened to ~1) +x_label_right = x[-1] - 0.2 +ax2.text(x_label_right, F0_tau, rf"$1-\alpha$", + fontsize=8, color=C_NEG, va="bottom", ha="right") +ax2.text(x_label_right, F1_tau, r"$\hat{F}_1(\tau)$" + "\n(loss)", + fontsize=7.5, color=C_POS, va="top", ha="right") # TPR annotation: double-headed arrow on the right + label x_bracket = tau + 1.9 diff --git a/content/method/method.tex b/content/method/method.tex index 42a51cc..6a18150 100644 --- a/content/method/method.tex +++ b/content/method/method.tex @@ -2,100 +2,49 @@ \section{Problem Formulation} \label{sec:problem-formulation} -\subsection{Imbalanced Classification and The TPR/FPR Objective} -\label{sec:imbalanced-tpr-fpr} +% Motivation for this section — why accuracy fails under class imbalance, why +% TPR@FPR gives direct operating-point control, and the Neyman-Pearson framing +% that underpins ROLL — is developed in \Cref{chapter:related_work} +% (\Cref{sec:imbalanced-tpr-fpr,sec:neyman-pearson}). This section establishes +% only the notation and objective used throughout the chapter. +Given a dataset $\mathcal{D} = \{(\mathbf{x}_i, y_i)\}_{i=1}^{n}$ with inputs +$\mathbf{x}_i \in \mathcal{X}$ and binary labels $y_i \in \{0, 1\}$, we learn a +scoring function $f_\theta : \mathcal{X} \to \mathbb{R}$ by fitting. +The positive and negative subsets of $\mathcal{D}$ are: +\[ + \mathcal{D}_1 = \{(\mathbf{x}_i, y_i) \in \mathcal{D} \mid y_i = 1\}, + \qquad + \mathcal{D}_0 = \{(\mathbf{x}_i, y_i) \in \mathcal{D} \mid y_i = 0\}. +\] +Applying a threshold $\tau$ produces predictions $\hat{y} = \mathbf{1}[f_\theta(\mathbf{x}) > \tau]$. +The \emph{true positive rate} (TPR) and \emph{false positive rate} (FPR) at $\tau$ are: +\begin{align} + \operatorname{TPR}(\tau) &= P\!\bigl(f_\theta(\mathbf{x}) > \tau \mid y = 1\bigr), \\ + \operatorname{FPR}(\tau) &= P\!\bigl(f_\theta(\mathbf{x}) > \tau \mid y = 0\bigr). +\end{align} +In our scenario, we either wish to learn $f_{\theta}$ in order to maximize $\operatorname{TPR}$ +subject to a fixed $\operatorname{FPR}$, or vice versa. Our fixed $\operatorname{TPR}$ or $\operatorname{FPR}$ +will be fixed to a value $\alpha \in (0, 1)$. -% IMPROVEMENT SUGGESTIONS: -% - Section title promises TPR/FPR but neither is formally defined here; the section -% must land on a concrete statement of the TPR@FPR objective with proper notation. -% - The inseparability tangent (paragraphs 2-3) dilutes the argument; trim to one -% sentence or move to Related Work. The cascade example in particular reads as -% background material unrelated to the TPR/FPR framing. -% - Narrative arc is currently backwards: the comment block near the end (lines -% starting 'Motivate why standard loss functions...') is a better outline than -% the prose above it. Drive the section with: accuracy is gameable under imbalance -% -> class weighting is the standard fix -> it gives no direct control over the -% operating point -> therefore we need TPR@FPR directly. -% - $\mathcal{D}_0$ and $\mathcal{D}_1$ are used but never defined; add definitions -% for the positive/negative subsets of $\mathcal{D}$ before first use. -% - Suggested arc: (1) standard setup + accuracy objective; (2) why accuracy fails -% under imbalance -- the trivial majority-class classifier; (3) standard remedies -% and why they give only indirect control; (4) formally define TPR, FPR, ROC, and -% state the target objective: maximise TPR at a fixed FPR budget $\alpha$. +Therefor, when maximizing our $\operatorname{TPR}$ subject to a fixed $\operatorname{FPR}$, we are solving for: +\begin{equation} + \max_\theta \; \operatorname{TPR}\!\bigl(\tau^*(\theta)\bigr) + \quad \text{s.t.} \quad \operatorname{FPR}\!\bigl(\tau^*(\theta)\bigr) = \alpha, + \label{eq:objective} +\end{equation} -When fitting a classifier, it is most common to try and maximize the probability -of success. That is, given some dataset -$\mathcal{D} = \{(\mathbf{x}_i, y_i)\}_{i=1}^{n}$ -with inputs $\mathbf{x}_i \in \mathcal{X}$ and binary labels $y_i \in \{0, 1\}$, we learn a scoring function $f_\theta : \mathcal{X} \to \mathbb{R}$ and apply a threshold $\tau$ to produce predictions $\hat{y} = \mathbf{1}[f_\theta(\mathbf{x}) > \tau]$. The standard objective is to minimize the probability of classification error: +where $\tau^*(\theta)$ is the threshold that achieves exactly $\operatorname{FPR} = \alpha$ +for the current model $f_\theta$. +Conversley, when we are minimizing $\operatorname{FPR}$ subject to a fixed $\operatorname{TPR}$ we are solving for: -$$\mathcal{L}(\theta) = \frac{1}{n} \sum_{i=1}^{n} \mathbf{1}[\hat{y}_i \neq y_i] = P(\hat{y} \neq y)$$ - -which is equivalent to maximizing classification accuracy $P(\hat{y} = y)$. - -For most applications, this optimization is warranted. However, there are many real-world settings in which -this type of fitting is ill-suited. - -One such application is in the case of inseparable classes. In many cases, no meaningful -separation boundary can be found between $\mathcal{D}_0$ and $\mathcal{D}_1$. In many cases, -especially in tabular datasets, there can be two data elements $i,j$ for which $\mathbf{x}_i = \mathbf{x}_j$, -however, $y_i \neq y_j$. Any deterministic classifier will have to decide whether to classify -inseparable points as one class or the other, but it remains hard to control the behavior of -a classifier while it is fitting to suggest one outcome or the other. - -The issue of inseparability becomes more apparent in certain applications where runtime is a key -and limiting factor. In many classification pipelines, a ``quick and dirty'' classifier may -filter out many candidates before an ``in depth'' classifier gives the final answer. This may be done -in events where running the full in-depth classification on all data points is not a cost-effective or time-efficient solution. -The ``quick and dirty'' classifier can be either low in parameters, making it run quickly. It may also only -make a quick decision based on part of the data point. For example, in the case of a classifier looking to flag -images of the ocean, a ``quick and dirty'' classifier may look at a very-low resolution version of the image and simply check if it is relatively ``blue''. It filters out many certain false candidates this way, then passes on the remainder to an in-depth, higher accuracy classifier. Solutions like this allow to run at near-optimal performance with lower compute resources in limited-time applications. These situations are common in large-volume image applications on the internet, as well as in astronomy/microscopy. - -Another such application is a case of highly imbalanced data. Even with separability, it is very -easy to a classifier to simply ``ignore'' the minority class. This may very likely be a local minimum -while fitting, which may be inescapable. As was once said, ``a classifier that always returns 0 is -well fitted for flagging pictures of Michael Jordan bathing in green M\&Ms''. Combined with inseparability, we see that in extreme cases, classifiers may choose to ignore, or otherwise penalize, the minority class. - -For every trained classifier, the output per model is a score (TODO rewrite and formalize). - -TODO finish this subsection - -\begin{itemize} - \item What usually happens - \begin{itemize} - \item Fitting - \item Graphing ROC and picking threshold based on tradeoff - \end{itemize} - \item Usually we compensate for poor performance with - \begin{itemize} - \item Weighting between classes - \item Possible other methods - \end{itemize} - \item Problem with this method is lack of control. -\end{itemize} - - -% Motivate why standard loss functions (cross-entropy, MSE) break down under class -% imbalance: they optimize average accuracy, which a model can game by predicting -% the majority class. Introduce concrete examples (e.g. medical diagnosis, fraud -% detection) where the cost of a false negative vastly outweighs a false positive, -% and where the practitioner needs to operate at a specific FPR budget. Argue that -% what is actually needed is direct control over TPR at a fixed FPR, not a -% surrogate that only loosely correlates with it. - - - - -\subsection{Connection to Neyman-Pearson} -\label{sec:neyman-pearson} - -% Introduce the Neyman-Pearson lemma: among all tests at a given false-positive rate, -% the likelihood-ratio test maximizes TPR. Frame ROLL as a learnable, gradient-based -% realization of this principle — rather than assuming known class-conditional -% distributions (as classical NP does), ROLL estimates them from model scores during -% training. Briefly note that existing NP-inspired methods (covered in -% \Cref{chapter:related_work}) do not support deep learning / gradient-based -% optimization; this is the gap ROLL fills. +\begin{equation} + \min_\theta \; \operatorname{FPR}\!\bigl(\tau^*(\theta)\bigr) + \quad \text{s.t.} \quad \operatorname{TPR}\!\bigl(\tau^*(\theta)\bigr) = \alpha, + \label{eq:objective} +\end{equation} +The ROLL framework, introduced in +\Cref{sec:roll-framework}, provides a method of differentiable surrogate for these objectives. %------------------------------------------------ @@ -109,7 +58,7 @@ The core idea of ROLL is as follows: when training, the user selects that they w TPR given some fixed FPR. Then, during training, on every training step, the actual TPR is calculated for the given FPR, and the fitting algorithm tries to maximize the TPR directly. This way, while training, we gain direct control over the performance at the threshold that we care about - avoiding needing to pick out a threshold later. -In Neyman-Pearson terms, our algorithm wishes to directly minimize the Type-1 error given a fixed Type-2 error, or vice versa. +In Neyman-Pearson terms~\cite{tong2016neyman}, our algorithm wishes to directly minimize the Type-1 error given a fixed Type-2 error, or vice versa. In practice, however, things are not so simple. @@ -482,23 +431,72 @@ and letting $\tau = \hat{F}_0^{-1}(\alpha) = \mu_0 + \sigma_0\sqrt{2}\,\operator \subsection{Beta ROLL} \label{sec:roll-beta} -% When scores are passed through a sigmoid they live in $[0,1]$ and a Beta -% distribution is a natural parametric fit. The integrals involve the -% regularised incomplete beta function. Discuss when Beta ROLL is preferable -% to Gaussian ROLL and what its failure modes are. +Beta ROLL applies when model scores are constrained to the open interval $(0,1)$, +as is the case when $f_\theta$ uses a sigmoid output activation. The Beta distribution +is supported on $(0,1)$ and its two shape parameters allow it to capture a wide range +of unimodal and skewed score distributions that a Gaussian cannot represent. \subsubsection{Forward} \label{sec:roll-beta-forward} -% Instantiate \eqref{eq:roll-tpr-at-fpr} under Beta-distributed scores. -% Parameters $a_k, b_k > 0$ are fitted by MLE (or method of moments). -% The CDF is the regularised incomplete beta function $I_x(a, b)$. +Given score vectors $\mathbf{s}^{(k)} \in (0,1)^{|\mathcal{B}_k|}$ for class $k$, let +$\mathbf{t}^{(k)} = \mathbf{1} - \mathbf{s}^{(k)}$ denote the complementary scores. +For any vector $\mathbf{v}$, write $\bar{v} = \frac{1}{|\mathbf{v}|}\sum_i v_i$. +We estimate the shape parameters using the closed-form log-moment estimator +of~\cite{chen2022beta}: define for each class $k$, + +\begin{equation} + D_k = \overline{s^{(k)}\!\ln s^{(k)}} - \bar{s}^{(k)}\cdot\overline{\ln s^{(k)}} + + \overline{t^{(k)}\!\ln t^{(k)}} - \bar{t}^{(k)}\cdot\overline{\ln t^{(k)}} + \label{eq:beta-denom} +\end{equation} + +\begin{equation} + \hat{a}_k = \frac{\bar{s}^{(k)}}{D_k}, \qquad \hat{b}_k = \frac{\bar{t}^{(k)}}{D_k} + \label{eq:beta-params} +\end{equation} + +These estimators follow from two simultaneous moment conditions: +$\mathbb{E}[X] = a/(a+b)$ and +$\operatorname{Cov}(X,\ln X) + \operatorname{Cov}(Y,\ln Y) = 1/(a+b)$, +where $Y=1-X\sim\operatorname{Beta}(b,a)$. +Replacing expectations by sample means and solving in closed form yields~\eqref{eq:beta-params}. + +The CDF of $\operatorname{Beta}(\hat{a}_k,\hat{b}_k)$ at $x\in(0,1)$ is the +regularised incomplete beta function: +\begin{equation} + \hat{F}_k(x) = I_x(\hat{a}_k,\hat{b}_k) + = \frac{B(x;\,\hat{a}_k,\hat{b}_k)}{B(\hat{a}_k,\hat{b}_k)}, + \qquad B(x;\,a,b) = \int_0^x u^{a-1}(1-u)^{b-1}\,\mathrm{d}u + \label{eq:beta-cdf} +\end{equation} + +Substituting into the general ROLL framework \eqref{eq:roll-tpr-at-fpr}: +\begin{equation} + \mathcal{L}_{\text{ROLL-TPR@FPR}}^{\text{BETA}}(f_\theta(\mathcal{B});\,\alpha) + = I_{\hat\tau}(\hat{a}_1,\hat{b}_1), + \qquad + \hat\tau = I^{-1}_\alpha(\hat{a}_0,\hat{b}_0) + \label{eq:roll-tpr-at-fpr-beta} +\end{equation} +where $I^{-1}_\alpha(a,b)$ denotes the $\alpha$-quantile of $\operatorname{Beta}(a,b)$. \subsubsection{Gradient Derivation} \label{sec:roll-beta-backward} -% Differentiate through $I_x$ and its inverse. Both have known derivatives; -% note any numerical considerations when $a$ or $b$ are near zero. +Unlike the Gaussian case, we do not derive closed-form gradients for Beta ROLL. +The regularised incomplete beta function $I_x(a,b)$ and its inverse are smooth +functions of all their arguments and are available as differentiable operations in +PyTorch (\texttt{torch.special.betainc} and \texttt{torch.special.betaincinv}). +Gradients of \eqref{eq:roll-tpr-at-fpr-beta} with respect to $f_\theta(\mathbf{x}_i)$ +are therefore propagated via automatic differentiation through the estimator +\eqref{eq:beta-params}, the CDF evaluation, and the quantile inversion. + +Note that the gradient balance property (\Cref{prop:gradient-balance}) does not hold +for Beta ROLL: the sigmoid activation that maps raw scores into $(0,1)$ is nonlinear, +so a uniform additive shift of the raw scores produces a non-uniform shift of the +transformed inputs, violating the translation-invariance assumption required by the +proof. \subsection{KDE ROLL} @@ -545,20 +543,20 @@ The CDF of the KDE function then becomes: \] While the CDF has a nice formula, the inverse CDF has no known closed formula. It instead must be calculated numerically. Thus, the calculation of the decision threshold $\tau$ must be achevied -using a numerical calculation algorithm. In this work, Newton Raphson is chosen. +using a numerical calculation algorithm. In this work, the Newton--Raphson method~\cite{press2007numerical} is chosen. Firstly we must calculate $\hat{F}_0^{-1}(\alpha)$ = \tau. We start with our initial guess, $\tau_0$, and for each step, calculate: \[ - \tau_{n+1} = \tau_n - \frac{\hat{F}_0(\tau_n ; \mathcal{X}_0)}{\frac{\partial \hat{F}_0(\tau_n ; \mathcal{X}_0)}{\partial \tau}} + \tau_{n+1} = \tau_n - \frac{\hat{F}_0(\tau_n ; \mathcal{X}_0) - \alpha}{\frac{\partial \hat{F}_0(\tau_n ; \mathcal{X}_0)}{\partial \tau}} \] -This step is taken until $\hat{F}_0(\tau_n ; \mathcal{B}_0) \approx \alpha$ within some acceptable error (in our case $1e-3$). +This step is taken until $\hat{F}_0(\tau_n ; \mathcal{B}_0) \approx \alpha$ within some acceptable error (in our case $1e-4$). Our derivative w.r.t. $\tau$ is \[ % - \frac{\partial \hat{F}_0(\tau_n ; \mathcal{X}_0)}{\partial \tau} = \frac{1}{\mathcal{X}_0}\sum_i \sigma'(\tau - x_i) + \frac{\partial \hat{F}_0(\tau_n ; \mathcal{X}_0)}{\partial \tau} = \frac{1}{|\mathcal{X}_0|}\sum_i \sigma'(\tau - x_i) \] At this point, we have succesfully calculated $\tau$ for which $\tau = \hat{F}_0^{-1}(\alpha ; \mathbf{X}_0)$. @@ -586,15 +584,18 @@ and has no effect on $\tau$ (which depends only on $\mathcal{B}_0$). Therefore: \[ \dfrac{\partial \hat{F}_1(\hat{F}_0^{-1}(\alpha))}{\partial f_{\theta}(\mathbf{x}_i)} = - \frac{\partial \frac{1}{|\mathcal{B}_1|}\sum_{\mathbf{x}_j \in \mathcal{B}_1} \sigma_1(f_{\theta}(\mathbf{x}_j) - \tau)}{\partial f_{\theta}(\mathbf{x}_i)} + \frac{\partial \frac{1}{|\mathcal{B}_1|}\sum_{\mathbf{x}_j \in \mathcal{B}_1} \sigma_1(\tau - f_{\theta}(\mathbf{x}_j))}{\partial f_{\theta}(\mathbf{x}_i)} \] \[ - = \frac{\partial \left(\sum_{\mathbf{x}_j \in \mathcal{B}_1 ; j \neq i} \frac{1}{|\mathcal{B}_1|}\sigma_1(f_{\theta}(\mathbf{x}_j) - \tau) + \frac{1}{|\mathcal{B}_1|}\sigma_1(f_{\theta}(\mathbf{x}_i) - \tau)\right)}{\partial f_{\theta}(\mathbf{x}_i)} + = \frac{\partial \left(\sum_{\mathbf{x}_j \in \mathcal{B}_1 ; j \neq i} \frac{1}{|\mathcal{B}_1|}\sigma_1(\tau - f_{\theta}(\mathbf{x}_j)) + \frac{1}{|\mathcal{B}_1|}\sigma_1(\tau - f_{\theta}(\mathbf{x}_i))\right)}{\partial f_{\theta}(\mathbf{x}_i)} \] +Applying the chain rule to the only $f_\theta(\mathbf{x}_i)$-dependent term, +$\frac{\partial}{\partial f_\theta(\mathbf{x}_i)}(\tau - f_\theta(\mathbf{x}_i)) = -1$: + \begin{equation} - \frac{\partial \hat{F}_1(\hat{F}_0^{-1}(\alpha))}{\partial f_{\theta}(\mathbf{x}_i)} = \frac{1}{|\mathcal{B}_1|}\sigma_1'(f_{\theta}(\mathbf{x}_i) - \tau) + \frac{\partial \hat{F}_1(\hat{F}_0^{-1}(\alpha))}{\partial f_{\theta}(\mathbf{x}_i)} = -\frac{1}{|\mathcal{B}_1|}\sigma_1'(\tau - f_{\theta}(\mathbf{x}_i)) \label{eq:kde-grad-y1} \end{equation} @@ -607,11 +608,13 @@ each factor of the chain rule separately. \medskip\noindent\textit{Derivative of $\hat{F}_1$ with respect to $\tau$.} \[ - \frac{\partial \hat{F}_1(\hat{F}_0^{-1}(\alpha))}{\partial \hat{F}_0^{-1}(\alpha)} = \frac{\partial \frac{1}{|\mathcal{B}_1|}\sum_{\mathbf{x}_j \in \mathcal{B}_1} \sigma_1(f_{\theta}(\mathbf{x}_j) - \tau)}{\partial \tau} + \frac{\partial \hat{F}_1(\hat{F}_0^{-1}(\alpha))}{\partial \hat{F}_0^{-1}(\alpha)} = \frac{\partial \frac{1}{|\mathcal{B}_1|}\sum_{\mathbf{x}_j \in \mathcal{B}_1} \sigma_1(\tau - f_{\theta}(\mathbf{x}_j))}{\partial \tau} \] +Applying the chain rule, $\frac{\partial}{\partial\tau}(\tau - f_\theta(\mathbf{x}_j)) = +1$: + \begin{equation} - = -\frac{1}{|\mathcal{B}_1|}\sum_{\mathbf{x}_j \in \mathcal{B}_1}\sigma_1'(f_{\theta}(\mathbf{x}_j) - \tau) + = +\frac{1}{|\mathcal{B}_1|}\sum_{\mathbf{x}_j \in \mathcal{B}_1}\sigma_1'(\tau - f_{\theta}(\mathbf{x}_j)) \label{eq:kde-dF1-dtau} \end{equation} @@ -670,6 +673,41 @@ by $\sigma_0'(\tau - f_{\theta}(\mathbf{x}_i))$: \label{eq:kde-grad-tau} \end{equation} +\medskip\noindent\textit{Efficient computation via the sigmoid identity.} + +Direct evaluation of \eqref{eq:kde-grad-tau} requires computing $\sigma_0'$ for every +point, then dividing by the per-point value — potentially unstable when a point is far +from $\tau$. For the sigmoid kernel, we can avoid this by exploiting the identity + +\begin{equation} + \sigma(u;\,v)\,\bigl(1 - \sigma(u;\,v)\bigr) = \frac{\sigma'(u;\,v)}{v} + \label{eq:sigmoid-identity} +\end{equation} + +which holds for all $u \in \mathbb{R}$ (proved by direct substitution: both sides equal +$\exp(-v|u|)/(1+\exp(-v|u|))^2$). Applying this with $u = \tau - f_\theta(\mathbf{x}_j)$: + +\[ + \sigma_0'(\tau - f_\theta(\mathbf{x}_j)) = v_0\,\sigma_0(\tau - f_\theta(\mathbf{x}_j)) + \,\bigl(1-\sigma_0(\tau - f_\theta(\mathbf{x}_j))\bigr) +\] + +Since $v_0$ cancels between numerator and denominator of \eqref{eq:kde-grad-tau}, +the ratio can be written entirely in terms of the sigmoid values already computed +during the forward pass: + +\begin{equation} + \frac{\partial \hat{F}_0^{-1}(\alpha ; \mathcal{B}_0)}{\partial f_\theta(\mathbf{x}_i)} + = + \frac{\sigma_0(\tau-f_\theta(\mathbf{x}_i))\,\bigl(1-\sigma_0(\tau-f_\theta(\mathbf{x}_i))\bigr)} + {\displaystyle\sum_{\mathbf{x}_j \in \mathcal{B}_0} + \sigma_0(\tau-f_\theta(\mathbf{x}_j))\,\bigl(1-\sigma_0(\tau-f_\theta(\mathbf{x}_j))\bigr)} + \label{eq:kde-grad-tau-efficient} +\end{equation} + +This avoids recomputing $\sigma_0'$ (which requires an extra exponential), instead +reusing the sigmoid activations cached from the CDF computation. + \paragraph{Combined gradient.} Substituting \Cref{eq:kde-grad-y1}, \Cref{eq:kde-dF1-dtau}, and \Cref{eq:kde-grad-tau} @@ -678,9 +716,9 @@ into \Cref{eq:roll-gradient}: \begin{equation} \frac{\partial \mathcal{L}_{\text{ROLL-TPR@FPR}}}{\partial f_\theta(\mathbf{x}_i)} = \begin{cases} - \dfrac{1}{|\mathcal{B}_1|}\,\sigma_1'(f_{\theta}(\mathbf{x}_i) - \tau) + -\dfrac{1}{|\mathcal{B}_1|}\,\sigma_1'(\tau - f_{\theta}(\mathbf{x}_i)) & \text{if } y_i = 1 \\[14pt] - -\dfrac{1}{|\mathcal{B}_1|}\!\displaystyle\sum_{\mathbf{x}_j \in \mathcal{B}_1}\!\sigma_1'(f_{\theta}(\mathbf{x}_j) - \tau) + +\dfrac{1}{|\mathcal{B}_1|}\!\displaystyle\sum_{\mathbf{x}_j \in \mathcal{B}_1}\!\sigma_1'(\tau - f_{\theta}(\mathbf{x}_j)) \;\cdot\; \dfrac{\sigma_0'(\tau - f_{\theta}(\mathbf{x}_i))}{\displaystyle\sum_{\mathbf{x}_j \in \mathcal{B}_0}\sigma_0'(\tau - f_{\theta}(\mathbf{x}_j))} & \text{if } y_i = 0 @@ -690,6 +728,88 @@ into \Cref{eq:roll-gradient}: where $\tau = \hat{F}_0^{-1}(\alpha ; \mathcal{B}_0)$. +\subsubsection{Sigmoid Kernel: Explicit Equations} +\label{sec:roll-kde-sigmoid} + +The derivations above hold for any differentiable CDF kernel $\sigma$. +In our implementation we choose the logistic sigmoid: +% +\begin{equation} + \sigma(x ; v) = \frac{1}{1 + \exp(-vx)}, + \qquad + \sigma'(x ; v) = \frac{v\,\exp(-v|x|)}{\bigl(1 + \exp(-v|x|)\bigr)^{2}} + \label{eq:sigmoid-kernel} +\end{equation} +% +where $v > 0$ is the bandwidth parameter. The derivative formula evaluates at +$|x|$ rather than $x$: since $\sigma'$ is an even function +($\sigma'(x) = \sigma'(-x)$ for any symmetric logistic), both forms are +mathematically identical, but $\exp(-v|x|) \to 0$ as $|x| \to \infty$ while +$\exp(-vx) \to \infty$ for $x \to -\infty$, so the $|x|$ form avoids +floating-point overflow when scores fall well below the threshold. + +\paragraph{Forward pass.} + +Substituting \eqref{eq:sigmoid-kernel} into the KDE CDF: +% +\begin{equation} + \hat{F}_{k}(\tau ; \mathbf{s}^{(k)}) = + \frac{1}{|\mathcal{B}_k|} + \sum_{\mathbf{x}_j \in \mathcal{B}_k} + \frac{1}{1 + \exp\!\bigl(-v_k\bigl(\tau - f_\theta(\mathbf{x}_j)\bigr)\bigr)} + \label{eq:kde-sigmoid-cdf} +\end{equation} +% +and its derivative with respect to $\tau$ — used both in the Newton--Raphson +inversion and in the gradient computation below — is: +% +\begin{equation} + \frac{\partial \hat{F}_{k}(\tau)}{\partial \tau} + = + \frac{1}{|\mathcal{B}_k|} + \sum_{\mathbf{x}_j \in \mathcal{B}_k} + \frac{v_k\,\exp\!\bigl(-v_k\bigl|\tau - f_\theta(\mathbf{x}_j)\bigr|\bigr)} + {\Bigl(1 + \exp\!\bigl(-v_k\bigl|\tau - f_\theta(\mathbf{x}_j)\bigr|\bigr)\Bigr)^{2}} + \label{eq:kde-sigmoid-pdf} +\end{equation} + +\paragraph{Gradient.} + +Define the sigmoid kernel PDF shorthand: +\begin{equation} + \varphi_k(u) \;=\; + \frac{v_k\,\exp(-v_k|u|)}{\bigl(1+\exp(-v_k|u|)\bigr)^{2}} + \label{eq:sigmoid-phi} +\end{equation} +This is simply $\sigma'(u ; v_k)$ from \eqref{eq:sigmoid-kernel}, a bell-shaped function +centred at zero with width controlled by bandwidth $v_k$. +Substituting \eqref{eq:sigmoid-kernel} into \eqref{eq:kde-grad-combined} and using this +notation, the explicit sigmoid-kernel gradient is: + +\begin{equation} + \frac{\partial \mathcal{L}_{\text{ROLL-TPR@FPR}}}{\partial f_\theta(\mathbf{x}_i)} = + \begin{cases} + -\dfrac{\varphi_1\!\left(\tau - f_\theta(\mathbf{x}_i)\right)}{|\mathcal{B}_1|} + & \text{if } y_i = 1\\[14pt] + +\,\dfrac{\displaystyle\sum_{\mathbf{x}_j \in \mathcal{B}_1} + \varphi_1\!\left(\tau - f_\theta(\mathbf{x}_j)\right)}{|\mathcal{B}_1|} + \;\cdot\; + \dfrac{\varphi_0\!\left(\tau-f_\theta(\mathbf{x}_i)\right)} + {\displaystyle\sum_{\mathbf{x}_j \in \mathcal{B}_0} + \varphi_0\!\left(\tau-f_\theta(\mathbf{x}_j)\right)} + & \text{if } y_i = 0 + \end{cases} + \label{eq:kde-sigmoid-grad} +\end{equation} + +where $\tau = \hat{F}_0^{-1}(\alpha ; \mathcal{B}_0)$. +The signs reflect the direction of each class's effect on the loss: raising a +positive-class score pushes $\hat{F}_1(\tau)$ down (gradient negative), while +raising a negative-class score shifts $\tau$ right, also lowering $\hat{F}_1(\tau)$ +(gradient positive). Positive-class samples are weighted by their individual kernel +PDF at $\tau$; negative-class samples are weighted by the mean positive-class kernel +PDF scaled by each sample's share of the negative-class kernel mass. + %------------------------------------------------ \subsection{Properties of the ROLL Formulation} @@ -879,12 +999,12 @@ concentration of gradient mass around $\tau$, with smooth decay on either side. When computing KDE, kernel selection and bandwidth estimation affect the final result greatly. Large bandwidths don't accurately track the probability distribution, while small kernels result in a very jagged CDF, which for us means very low gradient values unless unless a point is very close to the decision threshold. -Use of the Improved Sheather Jones method of kernel density estimation worked reliably well at creating very close-tracking, yet smooth CDFs. +Use of the Improved Sheather-Jones (ISJ) method~\cite{botev2010kde} of bandwidth selection worked reliably well at creating very close-tracking, yet smooth CDFs. \subsubsection{Bandwidth Scaling for KDE} \label{sec:kde-bandwidth-scaling} -While the Improved Sheather Jones method worked very well for selecting an acceptable bandwidth, this wasn't necessarily wanted during training. Near the start of the training session, scores tended to be all low. This naturally made the selected bandwidth to be too low. This caused very low training performance near the start of a training session, which could result in non-convergence of the model even after significant training epochs elapsed. +While the ISJ method worked very well for selecting an acceptable bandwidth, this wasn't necessarily wanted during training. Near the start of the training session, scores tended to be all low. This naturally made the selected bandwidth to be too low. This caused very low training performance near the start of a training session, which could result in non-convergence of the model even after significant training epochs elapsed. The solution was to use a bandwidth scheduler. Starting with large bandwidths resulted in gradients that spread out more evenly across all scores, and less non-convergence runs occurred. The bandwidth scheduler artificially scales up the bandwidth at the beginning to speed up initial training, and then tapers back to restore the intended bandwidth in order to maximize resuslts. diff --git a/content/related_work/related_work.tex b/content/related_work/related_work.tex index e43bcac..dd1bb4e 100644 --- a/content/related_work/related_work.tex +++ b/content/related_work/related_work.tex @@ -1,3 +1,112 @@ +% ============================================================ +% PLACEMENT: near the START of Ch. 2, before KDE and AUC/lit +% review sections. This is the reader's first encounter with +% the problem setting and the TPR@FPR objective. The arc +% should be: (1) standard accuracy under imbalance fails; +% (2) class-weighting is the usual fix but gives no direct +% operating-point control; (3) define TPR, FPR, ROC formally; +% (4) state the target: maximise TPR at a fixed FPR budget α. +% ============================================================ +\section{Imbalanced Classification and The TPR/FPR Objective} +\label{sec:imbalanced-tpr-fpr} + +% IMPROVEMENT SUGGESTIONS (carried over from original draft): +% - Narrative arc is currently backwards. Drive the section +% with: accuracy is gameable under imbalance -> class +% weighting is the standard fix -> it gives no direct +% control over the operating point -> therefore we need +% TPR@FPR directly. +% - The inseparability tangent (cascade-classifier example) +% dilutes the argument; trim to one sentence or cut. +% - $\mathcal{D}_0$ and $\mathcal{D}_1$ must be defined +% before first use. +% - Land the section on a concrete, formal statement of the +% TPR@FPR objective with proper notation. + +When fitting a classifier, it is most common to try and maximize the probability +of success. That is, given some dataset +$\mathcal{D} = \{(\mathbf{x}_i, y_i)\}_{i=1}^{n}$ +with inputs $\mathbf{x}_i \in \mathcal{X}$ and binary labels $y_i \in \{0, 1\}$, we learn a scoring function $f_\theta : \mathcal{X} \to \mathbb{R}$ and apply a threshold $\tau$ to produce predictions $\hat{y} = \mathbf{1}[f_\theta(\mathbf{x}) > \tau]$. The standard objective is to minimize the probability of classification error: + +$$\mathcal{L}(\theta) = \frac{1}{n} \sum_{i=1}^{n} \mathbf{1}[\hat{y}_i \neq y_i] = P(\hat{y} \neq y)$$ + +which is equivalent to maximizing classification accuracy $P(\hat{y} = y)$. + +For most applications, this optimization is warranted. However, there are many real-world settings in which +this type of fitting is ill-suited. + +One such application is in the case of inseparable classes. In many cases, no meaningful +separation boundary can be found between $\mathcal{D}_0$ and $\mathcal{D}_1$. In many cases, +especially in tabular datasets, there can be two data elements $i,j$ for which $\mathbf{x}_i = \mathbf{x}_j$, +however, $y_i \neq y_j$. Any deterministic classifier will have to decide whether to classify +inseparable points as one class or the other, but it remains hard to control the behavior of +a classifier while it is fitting to suggest one outcome or the other. + +The issue of inseparability becomes more apparent in certain applications where runtime is a key +and limiting factor. In many classification pipelines, a ``quick and dirty'' classifier may +filter out many candidates before an ``in depth'' classifier gives the final answer. This may be done +in events where running the full in-depth classification on all data points is not a cost-effective or time-efficient solution. +The ``quick and dirty'' classifier can be either low in parameters, making it run quickly. It may also only +make a quick decision based on part of the data point. For example, in the case of a classifier looking to flag +images of the ocean, a ``quick and dirty'' classifier may look at a very-low resolution version of the image and simply check if it is relatively ``blue''. It filters out many certain false candidates this way, then passes on the remainder to an in-depth, higher accuracy classifier. Solutions like this allow to run at near-optimal performance with lower compute resources in limited-time applications. These situations are common in large-volume image applications on the internet, as well as in astronomy/microscopy. + +Another such application is a case of highly imbalanced data. Even with separability, it is very +easy to a classifier to simply ``ignore'' the minority class. This may very likely be a local minimum +while fitting, which may be inescapable. As was once said, ``a classifier that always returns 0 is +well fitted for flagging pictures of Michael Jordan bathing in green M\&Ms''. Combined with inseparability, we see that in extreme cases, classifiers may choose to ignore, or otherwise penalize, the minority class. + +For every trained classifier, the output per model is a score (TODO rewrite and formalize). + +TODO finish this section + +\begin{itemize} + \item What usually happens + \begin{itemize} + \item Fitting + \item Graphing ROC and picking threshold based on tradeoff + \end{itemize} + \item Usually we compensate for poor performance with + \begin{itemize} + \item Weighting between classes + \item Possible other methods + \end{itemize} + \item Problem with this method is lack of control. +\end{itemize} + + +% Motivate why standard loss functions (cross-entropy, MSE) break down under class +% imbalance: they optimize average accuracy, which a model can game by predicting +% the majority class. Introduce concrete examples (e.g. medical diagnosis, fraud +% detection) where the cost of a false negative vastly outweighs a false positive, +% and where the practitioner needs to operate at a specific FPR budget. Argue that +% what is actually needed is direct control over TPR at a fixed FPR, not a +% surrogate that only loosely correlates with it. + + +% ============================================================ +% PLACEMENT: near the END of Ch. 2, after KDE and AUC/lit +% review sections, just before the chapter summary. This +% section bridges from prior work to the method chapter by +% framing ROLL as a learnable, gradient-based NP test. +% ============================================================ +\section{Connection to Neyman-Pearson} +\label{sec:neyman-pearson} + +% Introduce the Neyman-Pearson lemma: among all tests at a +% given false-positive rate, the likelihood-ratio test +% maximizes TPR. Frame ROLL as a learnable, gradient-based +% realization of this principle — rather than assuming known +% class-conditional distributions (as classical NP does), +% ROLL estimates them from model scores during training. +% Briefly note that existing NP-inspired methods do not +% support deep learning / gradient-based optimization; this +% is the gap ROLL fills. + +TODO write this section. + + +%------------------------------------------------ + \section{topic a} \label{sec:related_work:jigsaw_puzzles} \addcontentsline{tocheb}{section}{\protect\numberline{\secnumforhebrewtoc}{נושא א}} diff --git a/flake.nix b/flake.nix index d1c3140..045549e 100644 --- a/flake.nix +++ b/flake.nix @@ -62,6 +62,7 @@ (pkgs.texlive.combine texPkgs) pkgs.culmus pkgs.fontconfig + pkgs.poppler-utils (pkgs.python3.withPackages (ps: [ ps.sympy ps.numpy ps.matplotlib ps.scipy ])) ]; shellHook = ''