Thinking Progress Vectors: פס טעינה למודלי היגיון, כפי שנקרא מהמאמר ומהקוד
מודלי היגיון חושבים זמן רב ולא מראים לכם דבר בינתיים. Thinking Progress Vectors, או TPV, הוא מאגר מחקר שמנסה לקרוא פס התקדמות ישירות מהמצבים החבויים של המודל, ולהשתמש באותו אות כדי לגרום לו לחשוב פחות. קראתי את המאמר ואת כל הסקריפטים. לא הרצתי דבר מזה.

מודלי היגיון חושבים זמן רב ולא מראים לכם דבר בינתיים. Thinking Progress Vectors, או TPV, הוא מאגר מחקר שמנסה לקרוא פס התקדמות ישירות מהמצבים החבויים של המודל, ולהשתמש באותו אות כדי לגרום לו לחשוב פחות. קראתי את המאמר ואת כל הסקריפטים. לא הרצתי דבר מזה.
בקצרה
המאגר מלווה את המאמר "Overclocking LLM Reasoning" (arXiv 2506.07240, יוני 2025). מסווג ליניארי על המצבים החבויים בשכבה האחרונה מעריך כמה המודל התקדם בטוקני החשיבה שלו. הוספת הווקטור הזה, מוכפל במספר בשם alpha, בזמן היצירה מקצרת את החשיבה. המאמר מדווח על שיפורים גדולים בתקציבי טוקנים קטנים במבחני מתמטיקה, אבל השיפורים מצטמצמים או מתהפכים בתקציבים גדולים יותר ובמודל הקטן. נדרשים משקלים פתוחים וכרטיס מסך, לא מצורפים וקטור מאומן וממשק, והרישיון אוסר שימוש מסחרי. איש לא הריץ את הקוד לסקירה הזו.
מה המאמר טוען
המאמר נכתב על ידי רוי אייזנשטדט, איתמר זימרמן וליאור וולף, ומשויך לאוניברסיטת תל אביב (זימרמן גם ב-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, זרע 42. הוא מבקש מ-generate של Hugging Face את כל המצבים החבויים ושומר את וקטור השכבה האחרונה של כל טוקן שנוצר.
- prepare_tpv_dataset.py - משמיט דגימות עם שגיאות או קבצים חסרים, ואז מחפש את תג סגירת החשיבה בין הטוקנים שנוצרו. דגימה שהחשיבה שלה לא נסגרת אף פעם מדולגת. בשאר, טוקן מספר j מתוך N מקבל את התווית j/N, כך שהתווית עולה מכמעט 0 ועד בדיוק 1. החלוקה לאימון ולמבחן (80/20, זרע 42) נעשית לפי בעיה, ולכן אותה בעיה אינה מופיעה בשני הצדדים.
- train_tpv.py - מתאים מודל ליניארי בפתרון סגור: H משוחלף כפול H ועוד epsilon זעיר (1e-10 כברירת מחדל) כפול מטריצת היחידה, מול התוויות. אין איבר חופשי. הסקריפט מדפיס שגיאה ריבועית ממוצעת באימון ובמבחן ומצייר תרשים פיזור. וקטור המשקלים השמור הוא ה-TPV.
- tpv_intervention.py - טוען את המודל ואת הווקטור, רושם הוק ויוצר בפענוח חמדני. ברירת המחדל היא מודל Llama 8B, alpha=100 ו-2048 טוקנים חדשים.
ההוק: מה ההתערבות עושה באמת
כל ההתערבות היא הוק מעבר קדימה אחד על 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". בפשטות: ללמוד, לשחזר ולשתף שינויים באותם תנאים, אבל לא לבנות עליו מוצר בלי הסכם.
המאמר אומר שכל ניסוי רץ על כרטיס A100 אחד ונמשך עד יומיים. הקובץ requirements.txt הוא רשימת פקודות conda ו-pip עבור Python 3.10, PyTorch 2.3.1 עם CUDA 12.1, accelerate, bitsandbytes, datasets וכמה חבילות נוספות. הוא לא כולל את transformers, שכל סקריפט מייבא, ולכן התקנה נקייה תצטרך להוסיף אותה. הקומיט האחרון הוא מ-7 ביולי 2025, ובעת הבדיקה היה למאגר תורם אחד, 56 כוכבים ובעיה פתוחה אחת.
למי זה מתאים
זה מתאים לחוקרים ולמתעסקים שמריצים מודלי היגיון בעלי משקלים פתוחים מקומית ורוצים לחקור אותות התקדמות או לבדוק את טענת ה-overclocking על המשימות שלהם. וגם למי שבונה ממשק הסקה מקומי ומחפש נקודת פתיחה לפס התקדמות ומסתדר עם רישיון לא מסחרי.
זה לא מתאים למי שמשתמש במודל היגיון מתארח דרך 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