Thinking Progress Vectors: «смуга завантаження» для моделей міркування, прочитана за статтею й кодом
Моделі міркування думають довго й нічого не показують, поки думають. Thinking Progress Vectors, або TPV, - дослідницький репозиторій, що намагається зчитати смугу прогресу просто зі прихованих станів моделі й тим самим сигналом змусити її думати менше. Я прочитав статтю та кожен скрипт. Нічого з цього я не запускав.

Моделі міркування думають довго й нічого не показують, поки думають. Thinking Progress Vectors, або TPV, - дослідницький репозиторій, що намагається зчитати смугу прогресу просто зі прихованих станів моделі й тим самим сигналом змусити її думати менше. Я прочитав статтю та кожен скрипт. Нічого з цього я не запускав.
Коротко
Репозиторій супроводжує статтю «Overclocking LLM Reasoning» (arXiv 2506.07240, червень 2025). Лінійний регресор на прихованих станах останнього шару оцінює, наскільки далеко модель просунулася в токенах міркування. Якщо під час генерації додавати цей вектор, помножений на число alpha, міркування стає коротшим. Стаття повідомляє про помітний виграш за малих лімітів токенів на математичних бенчмарках, але за більших лімітів і на меншій моделі виграш зменшується або зникає. Потрібні відкриті ваги та GPU, готового вектора й інтерфейсу немає, а ліцензія забороняє комерційне використання. Для цього огляду код ніхто не запускав.
Що стверджує стаття
Автори - Рой Айзенштадт, Ітамар Зимерман і Ліор Вольф, указано Тель-Авівський університет (Зимерман також IBM Research). Я читав версію v1 від 8 червня 2025 року, позначену як препринт на рецензуванні. Відправна точка - відома проблема: модель, що думає надто мало, не вловлює складності задачі, а та, що думає надто довго, може ходити по колу, сумніватися в собі й впертися в ліміт.
Тверджень два. Перше: модель зберігає внутрішню оцінку того, наскільки далеко вона просунулася у фазі міркування, а проста лінійна проєкція останнього прихованого шару цю оцінку відновлює. Вектор проєкції автори називають вектором прогресу міркування. Друге: цей сигнал причинний. Якщо під час генерації зсувати прихований стан уздовж вектора, модель завершує міркування раніше. Це називається overclocking, «розгін».
Усе перевірено на двох дистильованих моделях DeepSeek-R1, 32B на основі Qwen і 8B на основі Llama, та на двох математичних бенчмарках, Math-500 і GSM-8K. Цей обсяг важливий для всього, що написано нижче.
Конвеєр крок за кроком
README розкладає роботу на чотири скрипти. Ось що робить кожен, як я прочитав код.
- generate_tpv_data.py. Завантажує модель у половинній точності, збирає запит «{problem}, please reason step by step, and put your final answer within \boxed{}», завершує його відкривним тегом міркування й семплує відповіді. Типові значення збігаються зі статтею: 30 задач Math-500, по 5 семплів, температура 0,6, top-p 0,95, seed 42. Через generate від Hugging Face запитуються всі приховані стани, а зберігається вектор останнього шару для кожного згенерованого токена.
- prepare_tpv_dataset.py. Відкидає семпли з помилками чи без файлів, потім шукає закривний тег міркування серед згенерованих токенів. Семпл, у якому міркування так і не закрилося, пропускається. В решти токен номер j із N отримує мітку j/N, тож мітка зростає від майже 0 до рівно 1. Поділ на навчання й тест (80/20, seed 42) робиться за задачами, тому одна задача не потрапляє в обидві частини.
- train_tpv.py. Підганяє лінійну модель замкненим розв’язком: H транспонована на H плюс крихітний epsilon (за замовчуванням 1e-10) на одиничну матрицю, проти міток. Вільного члена немає. Скрипт друкує середньоквадратичну помилку на навчанні й тесті та малює діаграму розсіювання. Збережений вектор ваг і є TPV.
- tpv_intervention.py. Завантажує модель і вектор, реєструє хук і генерує жадібним декодуванням. За замовчуванням це модель Llama 8B, alpha 100 і 2048 нових токенів.
Хук: що насправді робить втручання
Усе втручання - один forward-хук на model.model.norm, фінальному шарі нормалізації декодерної моделі Hugging Face. Після роботи цього шару хук копіює його вихід і додає alpha, помножене на TPV, до останньої позиції токена. У статті це записано як h_alpha = h + alpha на theta, тому передбачений прогрес theta на h зростає на alpha, помножене на квадрат довжини theta.
Місце обрано навмисно. Стаття пояснює, що останній прихований шар стоїть після шарів уваги, тож ключі й значення, збережені в кеші для попередніх токенів, не зачіпаються. Зсув впливає лише на вибір наступного токена. Але цей токен стає входом наступного кроку, тож ефект накопичується протягом усієї фази міркування. Коли генерація закінчується, хук знімається в блоці finally.
Дві практичні примітки з коду. Alpha не переноситься між моделями: розмір вектора залежить від того, як навчали регресор, тому 100 означає різне для кожної моделі й кожного навчального набору. А вектор - звичайний float32, що додається до станів у половинній точності; у реальному запуску я б це перевірив.
Чим насправді є «смуга завантаження» в репозиторії
Стаття показує інтерактивну смугу прогресу й посилається на сторінку проєкту з прикладами. У самому репозиторії такого інтерфейсу немає. Моніторинг закінчується графіком регресії: діаграма розсіювання передбаченої та справжньої позиції для 1000 тестових токенів, поверх неї лінія експоненційного згладжування (коефіцієнт 0,1) за точками, відсортованими за справжньою позицією. Цей графік перевіряє регресор. Це не жива смуга над реальною генерацією.
Щоб отримати смугу в інтерфейсі, її треба збудувати самому: запустити модель локально, на кожному кроці брати останній прихований стан, множити на вектор, згладжувати ряд і малювати. Стаття додає, що невелика рекурентна мережа (одношаровий GRU) може замінити експоненційне згладжування й дає меншу помилку і в навченому, і в zero-shot режимі. Цей варіант описано в статті, а чи шукав я його в репозиторії - ні, не шукав.
Цифри зі статті
Стаття порівнює TPV з трьома базовими варіантами за фіксованих лімітів токенів: базова модель, найкоротший із п’яти семплів за температури 0,6 і промпт, що просить модель бути стислою та зупинитися. Рахуються правильні відповіді. У таблиці нижче кількість правильних відповідей на Math-500 для п’яти рядків, як надруковано в статті. Нічого з цього я не перераховував.
| Метод | 32B: 512 | 32B: 1024 | 32B: 2048 | 8B: 512 | 8B: 1024 | 8B: 2048 |
|---|---|---|---|---|---|---|
| Базова модель | 36 | 154 | 278 | 6 | 47 | 112 |
| Температура (найкоротший із 5) | 54 | 146 | 294 | 29 | 95 | 137 |
| Стислий промпт | 53 | 211 | 316 | 50 | 107 | 153 |
| TPV alpha 100 | 100 | 201 | 284 | 26 | 70 | 102 |
| TPV alpha 100 + стислий промпт | 148 | 256 | 300 | 91 | 124 | 142 |
Як читати ці цифри
На моделі 32B за ліміту 512 токенів TPV з alpha 100 підіймає кількість правильних відповідей з 36 у базової моделі до 100 і обходить обидва базові варіанти (54 і 53). Це головний результат, і він великий. Автори також повідомляють, що TPV разом зі стислим промптом працює найкраще, до 148 на 512 токенах. За їхнім прочитанням, методи доповнюють один одного.
Деінде картина менш рівна. На 2048 токенах на тій самій моделі самий стислий промпт дає 316, а самий TPV 284, і автори самі про це пишуть. На моделі 8B самий TPV з alpha 100 випереджає базову модель за 512 і 1024 токенів, але поступається обом базовим варіантам за кожного ліміту Math-500, а за 2048 токенів отримує 102 проти 112 у базової моделі. Alpha 5 на цій моделі майже нічого не змінює.
Твердження про ефективність скромніше й чіткіше. За alpha 100 на моделі 8B разом зі стислим промптом на GSM-8K, як сказано в статті, середня довжина міркування падає приблизно з 500 токенів до менш ніж 350, тобто на 30%. Розібраний у статті приклад із розсадженням за столом: початкове міркування виходить за 2048 токенів, а зі зсувом відповідь 720 отримано за 806 токенів.
Де доказів мало
Це мої власні оцінки за прочитанням статті, а не результати запусків. Навчальні вибірки малі: 30 задач для дослідження моніторингу та 80 задач Math-500 для регресора в оцінці, і кожен навчальний семпл - міркування, що завершилося. Довгих прогонів, які так і не закрилися, в даних немає, а саме з ними смузі прогресу найважче.
До того ж ціль - відносна позиція, а не залишок роботи. Дві задачі з розв’язком у 400 і в 4000 токенів обидві закінчуються на 1,0. Смуга на 50% каже, що модель пройшла половину того, що зрештою напише, а не скільки це триватиме. А сама стаття в розділі про обмеження перелічує решту: лише математика, немає дослідження побічних ефектів для зв’язності й фактичної точності, потрібен доступ до прихованих станів, не розглядаються широта пошуку та невизначеність.
Ще одне застереження. Швидше не означає краще на важких задачах. Модель, яку підштовхують перестати сумніватися в собі, перестане й перевіряти себе. Стаття повідомляє про незмінну частку помилок, але її власні таблиці показують більше неправильних відповідей (відповіли мінус вірно) у деяких рядках, наприклад 2 у базової 32B на Math500 при 512 токенах проти 6 у TPV при alpha 100, і помітно більше розв’язаних задач. Я нічого не запускав, тож це прочитання авторів, а не моя перевірка.
Порівняння зі звичайними індикаторами прогресу
Сьогоднішні сигнали прогресу для моделей міркування здебільшого зовнішні щодо моделі: індикатор обертання, лічильник часу, кількість токенів чи коротке резюме думок на цей момент. Таблиця порівнює їх з TPV за тим, що кожен може чесно сказати користувачеві. Це мій власний аналіз, і він описує види індикаторів, а не конкретні продукти.
| Індикатор | Що повідомляє користувачеві | Потрібні приховані стани | Головна слабкість |
|---|---|---|---|
| Індикатор обертання | Щось виконується | Ні | Нічого не каже про тривалість |
| Лічильник часу | Скільки вже триває | Ні | Не передбачає кінець |
| Лічильник токенів | Скільки думок написано | Ні | Довжина - це не прогрес |
| Резюме думок на цей момент | Що модель зараз розглядає | Ні | Це теж вивід моделі, і він може бути хибним |
| Смуга TPV | Оцінка частки вже зробленого міркування | Так, потрібні відкриті ваги | Лише відносна позиція, перевірено тільки на математиці |
Ліцензія та ціна запуску
README і файл LICENSE вказують CC BY-NC-SA 4.0, а заголовки коду додають, що для комерційного використання потрібна окрема ліцензія правовласника, названого в README. У метаданих самого GitHub ліцензія значиться як «Other». Простіше кажучи: вивчайте, відтворюйте й діліться змінами на тих самих умовах, але не будуйте на цьому продукт без угоди.
У статті сказано, що кожен експеримент ішов на одній GPU A100 і тривав не більше двох днів. requirements.txt - перелік команд conda та pip для Python 3.10, PyTorch 2.3.1 з CUDA 12.1, accelerate, bitsandbytes, datasets і ще кількох пакетів. transformers, який імпортує кожен скрипт, там не вказано, тому за чистого встановлення його доведеться додати. Останній коміт від 7 липня 2025 року, а на момент перевірки у репозиторії був один автор, 56 зірок і одне відкрите завдання.
Для кого це
Підійде дослідникам і ентузіастам, які запускають відкриті моделі міркування локально й хочуть вивчати сигнали прогресу або перевірити твердження про «розгін» на власних задачах. А також тим, хто будує локальний інтерфейс для інференсу й шукає основу для смуги прогресу, якщо некомерційна ліцензія їх влаштовує.
Не підійде тим, хто користується розміщеною моделлю міркування через API, бо методу потрібні приховані стани. Не підійде команді, якій потрібна комерційна функція без ліцензії. І не підійде тим, хто чекає готовий продукт: тут немає навченого вектора, інтерфейсу й тестів.
На практиці: не зроблено
Я не встановлював це й не запускав жодного скрипта, тож в огляді немає вимірів часу, графіків і виводів. Якби я перевіряв, то навчив би вектор на моделі 8B, побудував смугу на запитах не з математики й порівняв alpha 0, 5 і 100 на задачах, де відповідь можна перевірити. Це план, а не результат, і якщо в наступному випуску з’явиться результат, я скажу про це прямо.
Джерела та обмеження
Кожне твердження вище взято зі статті (повний текст, v1) або з репозиторію на коміті, указаному у списку джерел, який я прочитав 4 жовтня 2026 року. Код не запускався.
- https://github.com/royeisen/reasoning_loading_bar
- https://github.com/royeisen/reasoning_loading_bar/blob/master/LICENSE
- https://github.com/royeisen/reasoning_loading_bar/blob/master/tpv_intervention.py
- https://github.com/royeisen/reasoning_loading_bar/blob/master/requirements.txt
- https://github.com/royeisen/reasoning_loading_bar/blob/master/README.md
- https://github.com/royeisen/reasoning_loading_bar/blob/master/train_tpv.py
- https://github.com/royeisen/reasoning_loading_bar/blob/master/prepare_tpv_dataset.py
- https://github.com/royeisen/reasoning_loading_bar/blob/master/generate_tpv_data.py
- https://arxiv.org/abs/2506.07240
- https://arxiv.org/pdf/2506.07240