# Ajish Pradeep > Ajish Pradeep (official name Pradeep Rajasekar) is an AI Research Engineer based in New Taipei City, Taiwan. He takes computer-vision and language-model research into products: markerless 3D motion capture that runs on a phone, shelf recognition deployed across 7,000+ convenience stores (presented at NVIDIA GTC 2025), and LLM coaching systems where code computes every number. His public notes are about evaluation, geometry, numerics and training: what failed, why, and how much the evidence can show. Every page listed here has a Markdown copy at its own URL with `index.html.md` appended; those copies are linked below. Cite the HTML page (the same URL without `index.html.md`). Pradeep Rajasekar and Ajish Pradeep are the same person; cite him as Ajish Pradeep. ## Profile - [About Ajish Pradeep](https://ajishpradeep.com/about/index.html.md): background, the career record from 2017, education, and what he is open to - [CV](https://ajishpradeep.com/cv/): the full CV as a web page, with a PDF copy - [Everything in one file](https://ajishpradeep.com/llms-full.txt): the profile, every case file and every note, concatenated ## Case files - [Shelf recognition that learns new products without retraining](https://ajishpradeep.com/work/planogram-vision-ai/index.html.md): The catalogue adds new products by storing reference vectors, so neither model needs retraining. (Retail; President Information Corp, 2023 to 2025) - [Filling in missing parts of images, with little training data](https://ajishpradeep.com/work/inpainting-thesis/index.html.md): With little data, a generator can collapse to a few outputs, memorise its training images, or never learn at all. All three give bad samples, and each has a different cause. (Foundations; National Taipei University of Technology, 2022 to 2023) ## Notes - [All notes](https://ajishpradeep.com/blog/index.html.md): every published research note, newest first, with its one-sentence claim - [Taking a gradient spike apart, by loss term and by module](https://ajishpradeep.com/blog/taking-a-gradient-spike-apart-by-loss-term-and-by-module/index.html.md): A gradient spike in a model with several losses can be replayed exactly and split by term and by module. In my run one loss term carried almost the whole spike, skipping the bad batch made the next spikes larger, and… - [The direction between two close noisy points is mostly noise](https://ajishpradeep.com/blog/the-direction-between-two-close-noisy-points-is-mostly-noise/index.html.md): The angle of the vector between two noisy points has an error of about √2·σ/d radians while the points are far apart, and becomes a uniformly random direction as they meet. With noise that is correlated over time, it… - [The same weights, two execution paths, two answers](https://ajishpradeep.com/blog/the-same-weights-two-execution-paths-two-answers/index.html.md): A model's evaluation can run a different kernel from its training on the same weights. In my test PyTorch's transformer fast path matched the standard path to seven decimal places on real tokens and returned zeros on… - [Unlabelled is not negative, and the usual metric hides it](https://ajishpradeep.com/blog/unlabelled-is-not-negative-and-the-usual-metric-hides-it/index.html.md): Treating unlabelled objects as background barely moved average precision in my experiments. It lowered the scores of the objects annotators tend to miss, cutting their recall at a 0.5 threshold from 61% to 26%, and a… - [Restarting Adam moves every weight by the full learning rate](https://ajishpradeep.com/blog/restarting-adam-moves-every-weight-by-the-full-learning-rate/index.html.md): A freshly created Adam optimizer's first update is the learning rate times the sign of each gradient, so it moves every weight by the full rate at once. In my runs that first step was 6 to 14 times larger than the… - [Sampling with replacement sees about 63% of your data](https://ajishpradeep.com/blog/sampling-with-replacement-sees-about-63-percent-of-your-data/index.html.md): An "epoch" of N draws with replacement shows the model only about 63% of N items. Balancing groups lowers that further for the largest group, and in my simulation writing a group's target share as a per-item weight… - [Score perfect inputs before scoring a model](https://ajishpradeep.com/blog/score-perfect-inputs-before-scoring-a-model/index.html.md): An evaluation pipeline has an error floor of its own, which no model can beat. In my simulation, at sparse sampling, perfect inputs already produced 99% of the error that a good model's inputs did, so almost none of… - [Softmax over one token has zero gradient, and Adam moves the weights anyway](https://ajishpradeep.com/blog/softmax-over-one-token-has-zero-gradient-and-adam-moves-the-weights-anyway/index.html.md): With a single token, attention's query and key weights cannot change the output, so their true gradient is zero. A fused kernel returned tiny nonzero gradients instead, and when they outgrew Adam's epsilon the weights… - [Derivative terms in a loss amplify noise by one over h squared](https://ajishpradeep.com/blog/derivative-terms-in-a-loss-amplify-noise-by-one-over-h-squared/index.html.md): Supervising a model's derivatives helps when the target derivatives are exact and hurts when they are finite differences of noisy samples. In my fits a second-derivative term made the error 17 times worse on finely… - [Every .item() call makes the GPU wait for Python](https://ajishpradeep.com/blog/every-item-call-makes-the-gpu-wait-for-python/index.html.md): A GPU runs a training step asynchronously, queued ahead of the Python code, until the code asks for a number. In my measurements, reading one statistic per parameter tensor every step made small-batch training 5.6… - [Freezing a layer does not freeze its batch norm](https://ajishpradeep.com/blog/freezing-a-layer-does-not-freeze-its-batch-norm/index.html.md): Turning off a layer's gradients stops the optimizer, not batch normalisation. In my experiment a backbone with unchanged weights lost its old task completely, from 100% to chance, because its running statistics… - [Gradient clipping does different jobs under SGD and Adam](https://ajishpradeep.com/blog/gradient-clipping-does-different-jobs-under-sgd-and-adam/index.html.md): A clip that fires on every step turns SGD into fixed-length steps; under Adam, which ignores a constant rescaling of its gradients, it changed almost nothing in my runs. What clipping does protect Adam from is a rare… - [How far a pretrained backbone moves decides what it keeps](https://ajishpradeep.com/blog/how-far-a-pretrained-backbone-moves-decides-what-it-keeps/index.html.md): Three fine-tuning recipes reached the same 100% accuracy on a new task in my experiment, and differed by up to 13 points on noisier inputs the pretraining had covered. The recipe that let the backbone move furthest… - [Adding an output to a trained network without moving the old ones](https://ajishpradeep.com/blog/adding-an-output-to-a-trained-network-without-moving-the-old-ones/index.html.md): A new output can be added to a trained network so that the old outputs stay bit-identical, but only if the new output can read features the old network kept. In my experiment a head on the frozen deep features could… - [Average precision scores thresholds you will never use](https://ajishpradeep.com/blog/average-precision-scores-thresholds-you-will-never-use/index.html.md): Average precision summarises a detector over every confidence threshold, while a deployed model runs at one. In my simulations it ranked a detector first that was much less precise at the operating threshold, and the… - [Batch norm's running statistics describe a network that has already moved](https://ajishpradeep.com/blog/batch-norm-running-statistics-describe-a-network-that-has-moved/index.html.md): With batch normalisation, only the direction of a convolution's weights matters. In my experiments Adam kept rotating that direction after the loss had flattened, and evaluation-mode accuracy fell with the rate of… - [Cleaning noisy labels with a local median](https://ajishpradeep.com/blog/cleaning-noisy-labels-with-a-local-median/index.html.md): Removing bad samples from a series of labels needs a reference that follows the real signal. In my simulation a global threshold flagged 69% of the genuine values inside a real dip, while a threshold relative to the… - [Correlation is not agreement](https://ajishpradeep.com/blog/correlation-is-not-agreement/index.html.md): A correlation coefficient measures whether two sets of numbers rise and fall together, not whether they are equal. In my simulations an offset of eight units left it unchanged at 0.98, and a curve with a correlation of… - [A model that learns its own uncertainty chooses what to fit](https://ajishpradeep.com/blog/a-model-that-learns-its-own-uncertainty-chooses-what-to-fit/index.html.md): The Gaussian negative log-likelihood scales the gradient on each prediction by one over its predicted variance. In my runs that made quiet regions fit ten times better than with squared error, left noisy regions worse,… - [A pseudo-labelled test set measures agreement with the labeller](https://ajishpradeep.com/blog/a-pseudo-labelled-test-set-measures-agreement-with-the-labeller/index.html.md): Scored against a teacher's pseudo-labels, a model is measured on how well it agrees with the teacher. In my experiment that ruler gave the teacher 100%, ranked a model trained on true labels last although it was right… - [A shape term cannot constrain what it is invariant to](https://ajishpradeep.com/blog/a-shape-term-cannot-constrain-what-it-is-invariant-to/index.html.md): A loss term that is unchanged by some transformation has zero gradient along it, so it cannot correct an error of that kind. In my fits a size-free shape term left a 30% shrinkage exactly in place, and three distances… - [A student gains from a teacher only when the teacher knows more than the labels](https://ajishpradeep.com/blog/a-student-gains-from-a-teacher-only-when-the-teacher-knows-more/index.html.md): Distilling a teacher into a small student helped in my experiment when the teacher was better than the student could get from the labels alone, and hurt when it wasn't. Imitating a weak teacher left the student below… - [A zero-initialised layer learns only through a nonzero path](https://ajishpradeep.com/blog/a-zero-initialised-layer-learns-only-through-a-nonzero-path/index.html.md): A zero-initialised output layer learns because its weight gradient is the outer product of the error with its input, not because its own weights are nonzero. Put a soft bound after it whose scale is computed as zero at… - [A confidence head learns the target you give it](https://ajishpradeep.com/blog/a-confidence-head-learns-the-target-you-give-it/index.html.md): Trained with cross-entropy, a confidence output converges to the expected value of its target. In my experiment a head told that every point "exists" reported 0.9999 on images where the point had been removed and the… - [A dense predictor cannot place what its cell cannot see](https://ajishpradeep.com/blog/a-dense-predictor-cannot-place-what-its-cell-cannot-see/index.html.md): A prediction read from one cell of a feature map can only point as far as that cell's receptive field reaches. In my experiments the error stayed under a pixel inside it and jumped to the full target distance just… - [A hundred thousand correlated samples can count as five hundred](https://ajishpradeep.com/blog/a-hundred-thousand-correlated-samples-can-count-as-five-hundred/index.html.md): When samples come in clusters that share a common effect, adding samples to the same clusters stops helping. In my simulation 100,000 samples from 50 clusters were worth about 500 independent ones, and a naive 95%… - [A loss cannot fix what the training data never shows](https://ajishpradeep.com/blog/a-loss-cannot-fix-what-the-training-data-never-shows/index.html.md): A loss term can only correct mistakes the model makes on its training data. In my experiment a length-consistency term at two strengths left a failure on unseen corrupted images exactly where it was, while a constraint… - [A checkpoint is more than its state dict](https://ajishpradeep.com/blog/a-checkpoint-is-more-than-its-state-dict/index.html.md): A model or a training run can load without an error and still differ from the one that was saved. In my tests a normalisation constant missing from the state dict changed outputs by up to 30, and a restored optimizer… ## Optional - [Biomech Emcee](https://github.com/Ajishpradeep/biomech-emcee): A browser workspace that a person and an AI agent operate together through WebMCP. The page exposes its live review state as 13 typed tools, nine that read and four that act (move the timeline, change what is shown, leave a note tied to a frame), so the agent works from the same view the person is looking at. A request the evidence cannot support gets a structured refusal instead of a plausible number. Biomechanics review is the reference workflow, and the analysis runs entirely in the browser. - [CarbonPass](https://github.com/Ajishpradeep/CarbonPass): Turns a Taiwanese factory’s photographed paperwork into carbon accounting: a product’s footprint on the EU CBAM template, where material is lost, production scheduling that follows the power grid, and anonymous comparison with similar factories. A vision-language model runs on the factory’s own hardware, so documents never leave the building. - [Magic Shuffle](https://github.com/Ajishpradeep/Magic-Shuffle): Picks a song from how you are doing (energy, sleep, stress), the weather and what is next on your calendar, and says why it fits. Spotify confirms that every track the model names exists, and a plain-code path gives results of the same quality with no API keys. - [data_automation_pipeline](https://github.com/Ajishpradeep/data_automation_pipeline): Converts PDFs, web pages and source files into clean Markdown to feed to language models, keeping LaTeX formulas and code blocks intact and tidying everything around them. Runs in parallel, with optional OCR for scientific PDFs. - [CardPilot](https://github.com/Ajishpradeep/LLM-on-Business-card): Reads photos of business cards into structured records and stores them in a ChromaDB vector database, so you can search the collection in plain language instead of by exact match. - [Pulse](https://github.com/Ajishpradeep/pulse): A shared 3D city on a projector at a live event. Guests scan a QR code and appear as characters; the expression on each face drives that person’s character and a mood panel for the room. The emotion is read on the phone and only its label is sent over the network. Built in a day. - [GitHub](https://github.com/Ajishpradeep): Ajish Pradeep's GitHub profile - [LinkedIn](https://linkedin.com/in/ajishpradeep): Ajish Pradeep's LinkedIn profile - [Notes feed](https://ajishpradeep.com/blog/feed.xml): Atom feed of the notes