ליבות קוונטיות
מבוא לליבות קוונטיות
"שיטת הליבה הקוונטית" מתייחסת לכל שיטה שמשתמשת במחשבים קוונטיים להערכת ליבה. בהקשר זה, "ליבה" תתייחס למטריצת הליבה או לאיבריה הבודדים. נזכיר כי מיפוי מאפיינים הוא מיפוי מ- ל- כאשר בדרך כלל ומטרת המיפוי היא לאפשר הפרדה של קטגוריות הנתונים על ידי היפרמישור. פונקציית הליבה מקבלת וקטורים במרחב המאפיינים ומחזירה את המכפלה הפנימית שלהם, כלומר עם . בגישה הקלאסית, אנו מתעניינים במיפויי מאפיינים שעבורם קל לחשב את פונקציית הליבה. לעיתים קרובות המשמעות היא מציאת פונקציית ליבה שניתן לכתוב את המכפלה הפנימית שלה במרחב המאפיינים בעזרת וקטורי הנתונים המקוריים, מבלי לבנות את ו- בפועל. בשיטת הליבות הקוונטיות, מיפוי המאפיינים מתבצע על ידי Circuit קוונטי, והליבה מוערכת באמצעות מדידות על אותו Circuit והסתברויות המדידה היחסיות.
בשיעור זה נבחן את העומק של Circuits קידוד מוכנים מראש שמשתמשים בשזירה ניכרת ונשווה אותם לעומק של Circuits שנבנה בעצמנו. אין בכך המלצה לשיטה מסוימת. ייתכן שתגלו כי Circuits מוכנים מראש עמוקים מדי, ושרמת השזירה ב-Circuit המותאם אישית אינה מספקת. שוב, אלו מוצגים אך ורק כדי לאפשר לכם לחקור.
לפני שנעבור על הערכת מטריצת ליבה בפירוט, נסכם את זרימת העבודה תוך שימוש בשפה של תבניות Qiskit.
שלב 1: מיפוי קלטים קלאסיים לבעיה קוונטית
- קלט: מערך נתוני אימון
- פלט: Circuit מופשט לחישוב איבר של מטריצת ליבה
בהינתן מערך הנתונים, נקודת ההתחלה היא קידוד הנתונים ל-Circuit קוונטי. במילים אחרות, עלינו למפות את הנתונים שלנו למרחב הילברט של מצבי המחשב הקוונטי. אנו עושים זאת על ידי בניית Circuit תלוי-נתונים. יש דרכים רבות לעשות זאת, והשיעור הקודם תיאר מספר אפשרויות. אפשר לבנות Circuit משלכם לקידוד הנתונים, או להשתמש במיפוי מאפיינים מוכן כמו zz_feature_map. בשיעור זה נעשה את שניהם.
שימו לב שכדי לחשב איבר בודד של מטריצת הליבה, נרצה לקודד שתי נקודות שונות, כדי שנוכל להעריך את המכפלה הפנימית שלהן. זרימת עבודה של ליבה קוונטית מלאה תכלול כמובן מכפלות פנימיות רבות בין וקטורי נתונים ממופים, כמו גם שיטות למידת מכונה קלאסיות. אך השלב הבסיסי שחוזר על עצמו הוא הערכת איבר בודד של מטריצת הליבה. לשם כך בוחרים Circuit קוונטי תלוי-נתונים וממפים שני וקטורי נתונים למרחב המאפיינים.

לצורך יצירת מטריצת ליבה, אנו מתעניינים בעיקר בהסתברות למדוד את המצב , שבו כל ה-Qubits נמצאים במצב . כדי לראות מדוע, נשים לב שה-Circuit האחראי לקידוד ומיפוי של וקטור נתונים אחד ניתן לכתיבה כ-, וזה האחראי לקידוד ומיפוי של הוא , ונסמן את המצבים הממופים
מצבים אלה הם המיפוי של הנתונים למימדים גבוהים יותר, כך שאיבר הליבה הרצוי הוא המכפלה הפנימית
אם נפעיל על המצב ההתחלתי את שני ה-Circuits ו-, ההסתברות למדוד את המצב היא
זהו בדיוק הערך שאנו רוצים (עד ). שכבת המדידה של ה-Circuit שלנו תחזיר הסתברויות מדידה (או "מעין-הסתברויות", אם משתמשים בשיטות מסוימות להפחתת שגיאות). ההסתברות שמעניינת אותנו היא זו של מצב האפס, .
שלב 2: אופטימיזציה של הבעיה לביצוע קוונטי
- קלט: Circuit מופשט, לא מותאם ל-Backend ספציפי
- פלט: Circuit יעד ואובייקט Observable, מותאמים ל-QPU הנבחר
בשלב זה נשתמש בפונקציה generate_preset_pass_manager מ-Qiskit כדי לציין שגרת אופטימיזציה ל-Circuit שלנו ביחס למחשב הקוונטי האמיתי שעליו מתכננים להריץ את הניסוי. מגדירים optimization_level=3, כלומר נשתמש במנהל ה-Pass המוגדר מראש שמספק את רמת האופטימיזציה הגבוהה ביותר. בהקשר זה, "אופטימיזציה" מתייחסת לאופטימיזציה של יישום ה-Circuit על מחשב קוונטי אמיתי. זה כולל שיקולים כמו בחירת Qubits פיזיים שיתאימו ל-Qubits ב-Circuit הקוונטי המופשט כך שימזערו את עומק ה-Gate, או בחירת Qubits פיזיים עם שיעורי שגיאות נמוכים ככל האפשר. אין לכך קשר ישיר לאופטימיזציה של בעיית למידת המכונה (כמו במייעלים קלאסיים דוגמת COBYLA).
בהתאם לאופן שבו תממשו את שלב 2, ייתכן שתצטרכו לבצע אופטימיזציה של ה-Circuit יותר מפעם אחת, שכן כל זוג נקודות המעורבות באיבר מטריצה מניב Circuit שונה שיש למדוד.
שלב 3: ביצוע באמצעות Primitives של Qiskit Runtime
- קלט: Circuit יעד
- פלט: התפלגות הסתברויות
השתמשו ב-Primitive מסוג Sampler מ-Qiskit Runtime כדי לשחזר התפלגות הסתברות של מצבים שהתקבלו מדגימת ה-Circuit. שימו לב שאפשר לראות זאת מכונה "התפלגות מעין-הסתברות", מונח רלוונטי כשרעש הוא גורם בעיה וכאשר מוסיפים שלבים נוספים, כמו בהפחתת שגיאות. במקרים כאלה, סכום כל ההסתברויות עשוי שלא להיות שווה בדיוק ל-1; ומכאן "מעין-הסתברות".
שלב 4: עיבוד לאחר-מדידה, החזרת התוצאה בפורמט קלאסי
- קלט: התפלגות הסתברויות
- פלט: איבר בודד של מטריצת ליבה, או מטריצת ליבה שלמה אם חוזרים על התהליך
מחשבים את ההסתברות למדוד על ה-Circuit הקוונטי וממלאים את מטריצת הליבה במיקום המתאים לשני וקטורי הנתונים שנעשה בהם שימוש. כדי למלא את מטריצת הליבה כולה, צריך להריץ ניסוי קוונטי עבור כל איבר. ברגע שיש בידינו מטריצת ליבה, נוכל להשתמש בה באלגוריתמים רבים של למידת מכונה קלאסית שמקבלים pre-calculated kernels. לדוגמה: qml_svc = SVC(kernel="precomputed"). לאחר מכן נוכל להשתמש ב-workstreams קלאסיים כדי להחיל את המודל על נתוני הבדיקה שלנו ולקבל ציון דיוק. בהתאם לשביעות רצוננו מציון הדיוק, ייתכן שנצטרך לחזור ולעיין בהיבטים של החישוב שלנו, כגון מיפוי המאפיינים.
סיכום השיעור
בשיעור זה נבצע שלבים אלה בכמה דרכים כדי למקסם את השימוש היעיל בזמן על מחשבים קוונטיים אמיתיים. נחיל שיטת ליבה קוונטית על: