Обновить
256K+

Алгоритмы *

Все об алгоритмах

274,62
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

От ручных правил к модели: как автоматизировать субсидии, если нельзя просаживать метрики в A/B

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели5.6K

Привет! Я Арина Сокова, аналитик в Авито Подработке. Мы отвечаем за то, чтобы смены на платформе закрывались, исполнители и заказчики находили друг друга, а платформа не тратила на продвижение сервиса слишком много. В статье расскажу, что такое субсидии в Авито Подработке, и как мы перешли от ручного назначения субсидий по бизнес-правилам к автоматической системе.

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

Читать далее

Новости

Как я создал свою мини‑Вселенную

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели14K

Привет, читатель!

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

Читать далее

От CTR до сделок: как в Авито устроены ML-модели монетизации

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели7.2K

Всем привет! Меня зовут Алина Бабенко, я acting DS-менеджер в Авито. Наша команда занимается моделями монетизации в поиске и рекомендациях: мы оцениваем ожидаемую выручку от действий пользователей и используем её в ранжировании. В этой статье я расскажу, какие модели используем для расчёта ожидаемой выручки, как оцениваем их качество, а также зачем корректируем ставки.

Материал будет полезен дата-сайентистам и тимлидам, которые работают с монетизацией на маркетплейсах и в сервисах для объявлений.

Читать далее

RGB‑значения нужно нормализовать делением на 255 или на 256?

Время на прочтение8 мин
Охват и читатели71K

Допустим, вы пишете программу для обработки изображений. Программа получает изображение, преобразует его в значения с плавающей запятой, выполняет обработку и сохраняет изменённые пиксели на диск в виде 8-битных цветов. Сегодня я хочу рассмотреть вопрос преобразования целых значений в значения с плавающей запятой. Существует два решения, которые на Python и NumPy выглядят так:

Стандартное деление на 255

pixels = img / 255.0
result = process(pixels)
output = np.trunc(result * 255 + 0.5)

Альтернативное деление на 256

pixels = (img + 0.5) / 256.0
result = process(pixels)
output = np.trunc(result * 256)

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

# Ограничение и преобразование в 8 бит
output_8bit = output.clip(0, 255).astype(np.uint8)

В стандартном случае целочисленный 0 соответствует 0.0, а 255 соответствует 1.0. Это работает абсолютно нормально и именно так всё реализовано в GPU. В альтернативном случае прибавляется смещение на 0,5 и деление происходит на 256, поэтому целочисленный 0 соответствует 0.5/256=0.001953125. Это неудобно, потому что код обработки изображений, например, без знания константы не сможет обнаруживать чёрные пиксели. Из‑за этого мы привязываем логику к 8-битным значениям, даже если вычисления выполняются с плавающей запятой. В стандартном решении всегда можно предполагать, что чёрный соответствует 0.0.

Однако некоторых программистов всё равно притягивает альтернативное решение. В чём дело? Чем оно им так нравится?

Читать далее

Iron Core. Часть 6: Затянувшаяся революция

Время на прочтение16 мин
Охват и читатели7.7K

Перед вами шестая и заключительная часть (а вот первая, вторая, третья, четвёртая и пятая) серии статей, посвящённых информационным технологиям в авиаперевозках. Сегодня мы поговорим об изменениях, происходящих в этой сфере. Системы, построенные на базе стандарта NDC, вот уже 14 лет пытаются вытеснить традиционные GDS. Этого до сих пор, в полной мере, не произошло. У такого положения дел есть определённые политико-экономические причины. Здесь же автор расскажет о том, что он, благодаря инциденту с птицей, узнал о системах, которые вот уже много лет пытаются заменить.

Читать далее

Когда подписи недостаточно: как мы расчищали «серую зону» в Поиске по картинкам

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели8.7K

Исторически в Яндекс Картинках релевантность документа оценивалась по двум сигналам: насколько запросу подходит само изображение и насколько — текст, связанный с этим изображением. Такой подход позволяет учесть контент картинки и не провалиться на визуально трудноотличимых объектах, однако он же порождает проблему: в «серой зоне», когда текстовая релевантность не сонаправлена с картиночной, становится неочевидно, как именно агрегировать сигналы в финальный скор релевантности.

Привет! Я Константин Николаев, занимаюсь внедрением нейротехнологий в Поиске по картинкам. В этой статье я расскажу, как наша команда научила модели смотреть на картинку и читать текст документа одновременно: начали с тяжёлой мультимодальной VLM ради максимального качества, а затем дистиллировали её в набор лёгких моделей — по одной под каждую стадию пайплайна. Что из этого удалось довести до realtime‑поиска с десятками тысяч запросов в секунду и как совместный анализ двух модальностей добавил 5% релевантных картинок в топ выдачи — под катом.

Читать далее

Типизация документов без OCR и нейросетей: 99.79% точности за 3 мс

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели14K

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

Читать далее

Собирали по частям, теряли по-крупному: почему новый сборщик мусора откатили в Python 3.14.5

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели9.4K

В Python 3.14.0 (октябрь 2025-го) разработчики заменили классический иерархический сборщик мусора на инкрементальный – обещали более короткие паузы на больших свалках. Но уже в 3.14.5 (май 2026-го) это решение полностью откатили.

Что пошло не так? И почему альтернативный сборщик даже не сделали переключаемой опцией, как в Java или Go?

Разбираемся на бенчмарках, запустив локально обе версии интерпретатора.

Читать далее

Нейросеть, которую почти не учат или что такое резервуарные вычисления

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели13K

В машинном обучении есть негласный договор. Если хочешь чтобы сеть работала - обучи все веса. Итеративно, через обратное распространение ошибки, тысячи шагов градиентного спуска. А вот к резервуарным вычислениям этот договор применяется с обратной логикой. Подавляющее большинство весов генерируются случайно и никогда не меняются. Обучается только один выходной слой. 

И это, как ни странно, работает.

Начнем, впрочем, говорить про проблему - иначе непонятно, зачем вообще идти на такой компромисс.

Рекуррентные нейросети придуманы для последовательных данных - временных рядов, речи, текста. В отличие от обычных сетей, у них есть интересное состояние. Выход на шаге t зависит не только от входа на шаге t, но и от всего что было до. Это делает их мощными - и одновременно очень неудобными в обучении.

Обучают РНС через BPTT - метод обратного распространения ошибки по времени. Собственно, алгоритм раскрывает сеть во времени. Берет все T шагов, строит граф вычислений и считает градиент через него. На каждом шаге градиент проходит через матрицу весов W. Если W перемножать саму на себя T раз подряд - при собственных значениях меньше 1 произведение стремится к нулю экспоненциально. При больше 1 - к бесконечности.

Первое называется затуханием градиента, второе - взрывом градиента. И это, кстати, нюанс.

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

Читать далее

Iron Core. Часть 5: Столкновение с птицей в Терминале №2

Время на прочтение10 мин
Охват и читатели9.2K

Публикуем перевод пятой части из серии статей (вот первая, вторая, третья и четвёртая), посвящённой информационным технологиям в авиаперевозках. Сегодня поговорим о задержанном стыковочном рейсе, об отстранённом от полётов Boeing 787-8, и о том, что сделала 60-летняя система после того, как в аэропорту Хитроу всё пошло наперекосяк.

Читать далее

99-й перцентиль за 20 мс: T-Digest и магия сжатых распределений

Уровень сложностиСложный
Время на прочтение12 мин
Охват и читатели9.6K

Представим, что у вас есть сервер, который обрабатывает и анализирует 100.000 RPS. Вам нужно высчитать и показать на дашборде 99-й перцентиль задержки — значение, выше которого только 1% самых медленных запросов. Если вы сохраните все 100 000 чисел за секунду, через час это 360 миллионов чисел. Через день — 8.6 миллиардов. Каждый раз хранить, сортировать и высчитывать? Нереально долго и ресурсозатратно.

Но для этой задачи существует алгоритм T-Digest. Вместо того, чтобы хранить все числа, он группирует их в кластеры — центроиды. А все дело в том, что кластеры на краях распределения (там, где наши хвосты) он делает маленькими и точными, а в центре — большими и «приблизительными». В результате для 100 000 точек нам нужно всего ~100 центроидов вместо 100 000 чисел. Это в сотни раз меньше памяти. И притом что ошибка при вычислении 95-го перцентиля в среднем составляет всего 0.001–0.06% (в зависимости от параметра сжатия).

В этой статье я разберу математику алгоритма, почему алгоритм такой быстрый и малозатратный, разберём графики и бенчмарки, а также покажу реализацию алгоритма на C.

Читать далее

Стохастический клеточный автомат на системе типов

Уровень сложностиСредний
Время на прочтение19 мин
Охват и читатели12K

Давайте разберёмся, как алгорифмы Маркова и pattern matching в WL позволяют генерировать лабиринты, реки, падающий песок и другие клеточные автоматы с помощью системы типов

Читать далее

Эволюция поиска вакансий в Авито Работе: ML-оптимизации и инсайты из АБ-тестов

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели11K

Привет! Меня зовут Вадим Вахрушев, я старший DS-инженер в Авито, занимаюсь задачами поиска. В статье расскажу, как устроено ранжирование в Авито Работе: какие ML-модели помогают создавать выдачу вакансий, и какие инсайты мы вынесли из нескольких показательных АБ-тестов.

Думаю, статья будет в первую очередь интересна ML-инженерам, которым важно разобраться, как поисковое ранжирование адаптируется под конкретную бизнес-вертикаль. Если хочется узнать про поиск в Авито в целом, загляните в обзорную статью — «Как работает поисковое ранжирование для миллионов объявлений Авито». В этом материале я сфокусируюсь именно на специфике вакансий.

Читать далее

Ближайшие события

Как выбрать OCR в 2026-м: тестируем девять моделей на трех движках инференса на рукописном русском

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели11K

Вам нужен OCR. В техобзорах рекомендуют Tesseract, на Хабре все пишут про VLM, идете на Hugging Face — там PaddleOCR-VL, DeepSeek-OCR, Dots.OCR, Qwen2.5-VL, и каждая называет себя SOTA. Прибавим к этому vLLM, SGLang, TGI, Native HF Transformers, и вот вы зависли между десятками комбинаций. Мы протестировали девять моделей на трех движках инференса на рукописном русском и отразили в таблице, какая модель под какую задачу лучше подходит.

Велком под кат за таблицей и историей ее создания

Читать далее

Реверс алгоритма из прошивки устройства на базе ARM-процессора

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели12K

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

Читать далее

Рефлексия в C++26 на примере сериализации и десериализации JSON

Уровень сложностиСредний
Время на прочтение25 мин
Охват и читатели9.8K

Всем привет! Меня зовут Тимур, я работаю в YADRO, и уже больше двух месяцев мой системный компилятор — gcc16. В новом стандарте добавили очень много, и сегодня я расскажу вам о некоторых обновлениях. В основном о рефлексии, но также будет немного и о контрактах.

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

Читать далее

Доверьтесь компилятору: C++23 против трюков из 90-х

Уровень сложностиСредний
Время на прочтение21 мин
Охват и читатели22K

Как часто вы слышали: «Не доверяй компилятору, пиши вручную»? Похоже, эту идеологию пора сдавать в архив.

Автор специально собрал примеры, в которых «умный» код современного C++ либо проигрывает наивному, либо не даёт выигрыша, но при этом ухудшает читаемость и мешает оптимизатору. Тут и легендарный Q_rsqrt, и бит-хаки для подсчёта единичек, и вездесущие const&, и даже опасные фокусы с фильтрацией диапазонов. Всё с воспроизводимыми бенчмарками на Clang 21 и Ryzen 9. Если вы готовы пересмотреть багаж старых привычек – просим под кат.

Читать далее

Языковая Модель без магии: Крошечная Language Model на чистом Node.js

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели10K

Мы создаем крошечную языковую модель с нуля на чистом Node.js без использования TensorFlow или PyTorch, реализуя нейроны, автоград, эмбеддинги, механизм самовнимания (self-attention), полносвязную сеть (FFN), обратное распространение ошибки и SFT, одновременно наблюдая за тем, как отдельные веса и целые матрицы изменяются в процессе обучения

Это не новая GPT и не прод ML...

Iron Core. Часть 4: Путь от GDS до выхода на посадку

Время на прочтение11 мин
Охват и читатели8.9K

Перед вами четвёртый материал (вот первый, второй и третий) из серии статей, посвящённых информационным технологиям в авиаперевозках. Наша сегодняшняя тема — DCS (Departure Control System, система контроля отправки пассажиров).

Что произошло в 05:30, когда я вошёл в аэропорт Нагпура и GDS выбыла из игры?

Читать далее

Как у алгоритмов снижения размерности получается вас обмануть. Что происходит внутри PCA, t‑SNE и UMAP

Время на прочтение17 мин
Охват и читатели18K

Сколько глаз у человека? Два.

А в сфере машинного обучения модели умеют видеть любую сразу тысячей или миллионами глаз. Мы живем в 3-х мерном пространстве(3D), и видим 2-х мерную картину мира. Модель, в свою очередь, обитает в цифровом пространстве. Она может видеть ваши 2D фото, 3D модель в Blender сразу со всех сторон и спокойно построить параллелепипед в 15D. 

Мы отлично ориентируемся в двух измерениях, немного хуже в трех, а дальше - ВСЁ. 
То, что вышло за пределы привычного куба, перестает быть геометрией в нашем земном понимании. 

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

Для этой задачи разработаны специальные алгоритмы. Самыми известными из них сегодня стали PCAt-SNE и UMAP. Несмотря на схожий результат в виде разноцветной двумерной карты, внутри они основаны на разных математических идеях.  И сегодня мы узнаем на каких

Читать далее
1
23 ...