מבוא
יש הרבה מדריכים המסבירים כיצד פועלים שנאים, ולבניית אינטואיציה על מרכיב מרכזי שלהם - הטבעת אסימון ומיקום.
הטמעת אסימונים פוזיציונית אפשרה לשנאים לייצג יחסים לא נוקשים בין אסימונים (בדרך כלל, מילים), וזה הרבה יותר טוב במודל הדיבור מונע ההקשר שלנו במודלים של שפות. למרות שהתהליך פשוט יחסית, הוא גנרי למדי, והיישמים הופכים במהירות ללוחות הגנה.
במדריך הקצר הזה, נסקור כיצד אנו יכולים להשתמש ב-KerasNLP, התוסף הרשמי של Keras, לביצוע
PositionEmbedding
וTokenAndPositionEmbedding
.
KerasNLP
KerasNLP היא תוספת אופקית ל-NLP. נכון לכתיבת שורות אלה, הוא עדיין צעיר מאוד, בגרסה 0.3, והתיעוד עדיין קצר למדי, אבל החבילה כבר יותר מסתם שמישה.
הוא מספק גישה לשכבות Keras, כגון TokenAndPositionEmbedding
, TransformerEncoder
ו TransformerDecoder
, מה שהופך את בניית שנאים מותאמים אישית לקלה מאי פעם.
כדי להשתמש ב-KerasNLP בפרויקט שלנו, אתה יכול להתקין אותו באמצעות pip
:
$ pip install keras_nlp
לאחר היבוא לפרויקט, אתה יכול להשתמש בכל keras_nlp
שכבה כשכבת Keras סטנדרטית.
טוקניזציה
מחשבים עובדים עם מספרים. אנו משמיעים את מחשבותינו במילים. כדי לאפשר למחשב לעבור אותם, נצטרך למפות מילים למספרים בצורה כלשהי.
דרך נפוצה לעשות זאת היא פשוט למפות מילים למספרים כאשר כל מספר שלם מייצג מילה. קורפוס של מילים יוצר אוצר מילים, וכל מילה באוצר המילים מקבל אינדקס. כך, אתה יכול להפוך רצף של מילים לרצף של מדדים המכונה אסימונים:
def tokenize(sequence):
return tokenized_sequence
sequence = ['I', 'am', 'Wall-E']
sequence = tokenize(sequence)
print(sequence)
לאחר מכן ניתן להטמיע את רצף האסימונים הזה לתוך וקטור צפוף שמגדיר את האסימונים במרחב סמוי:
[[4], [26], [472]] -> [[0.5, 0.25], [0.73, 0.2], [0.1, -0.75]]
זה נעשה בדרך כלל עם Embedding
שכבה ב-Keras. רובוטריקים אינם מקודדים רק באמצעות תקן Embedding
שִׁכבָה. הם מופיעים Embedding
ו PositionEmbedding
, ומוסיפים אותם יחד, תוך עקירת ההטבעות הרגילות לפי מיקומן בחלל הסמוי.
עם KerasNLP - הופעה TokenAndPositionEmbedding
משלב הטבעת אסימון רגיל (Embedding
) עם הטבעה במיקום (PositionEmbedding
).
Embedding של מיקום
בואו נסתכל PositionEmbedding
ראשון. הוא מקבל טנזורים וטנזורים מרופטים, ומניח שהמימד הסופי מייצג את התכונות, בעוד שהמימד השני-לאחרון מייצג את הרצף.
# Seq
(5, 10)
# Features
השכבה מקבלת א sequence_length
ארגומנט, המציין, ובכן, את אורך רצף הקלט והפלט. בוא נמשיך ונטמיע במיקום טנזור אחיד אקראי:
seq_length = 5
input_data = tf.random.uniform(shape=[5, 10])
input_tensor = keras.Input(shape=[None, 5, 10])
output = keras_nlp.layers.PositionEmbedding(sequence_length=seq_length)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
model(input_data)
זו התוצאה:
<tf.Tensor: shape=(5, 10), dtype=float32, numpy=
array([[ 0.23758471, -0.16798696, -0.15070847, 0.208067 , -0.5123104 ,
-0.36670157, 0.27487397, 0.14939266, 0.23843127, -0.23328197],
[-0.51353353, -0.4293166 , -0.30189738, -0.140344 , -0.15444171,
-0.27691704, 0.14078277, -0.22552207, -0.5952263 , -0.5982155 ],
[-0.265581 , -0.12168896, 0.46075982, 0.61768025, -0.36352775,
-0.14212841, -0.26831496, -0.34448475, 0.4418767 , 0.05758983],
[-0.46500492, -0.19256318, -0.23447984, 0.17891657, -0.01812166,
-0.58293337, -0.36404118, 0.54269964, 0.3727749 , 0.33238482],
[-0.2965023 , -0.3390794 , 0.4949159 , 0.32005525, 0.02882379,
-0.15913549, 0.27996767, 0.4387421 , -0.09119213, 0.1294356 ]],
dtype=float32)>
TokenAndPositionEmbedding
הטמעת אסימון ומיקום מסתכם בשימוש Embedding
על רצף הקלט, PositionEmbedding
על האסימונים המוטבעים, ולאחר מכן הוספת שתי התוצאות הללו יחד, למעשה עקירת הטבעות האסימון במרחב כדי לקודד את מערכות היחסים המשמעותיות היחסיות שלהם.
זה יכול להיעשות מבחינה טכנית כך:
seq_length = 10
vocab_size = 25
embed_dim = 10
input_data = tf.random.uniform(shape=[5, 10])
input_tensor = keras.Input(shape=[None, 5, 10])
embedding = keras.layers.Embedding(vocab_size, embed_dim)(input_tensor)
position = keras_nlp.layers.PositionEmbedding(seq_length)(embedding)
output = keras.layers.add([embedding, position])
model = keras.Model(inputs=input_tensor, outputs=output)
model(input_data).shape
הכניסות מוטמעות, ולאחר מכן מוטמעות במיקום, ולאחר מכן הן מתווספות יחד, ויוצרות צורה מוטבעת מיקוםית חדשה. לחלופין, אתה יכול למנף את TokenAndPositionEmbedding
שכבה, שעושה זאת מתחת למכסה המנוע:
עיין במדריך המעשי והמעשי שלנו ללימוד Git, עם שיטות עבודה מומלצות, סטנדרטים מקובלים בתעשייה ודף רמאות כלול. תפסיק לגוגל פקודות Git ולמעשה ללמוד זה!
...
def call(self, inputs):
embedded_tokens = self.token_embedding(inputs)
embedded_positions = self.position_embedding(embedded_tokens)
outputs = embedded_tokens + embedded_positions
return outputs
זה עושה את זה הרבה יותר נקי לביצוע TokenAndPositionEmbedding
:
seq_length = 10
vocab_size = 25
embed_dim = 10
input_data = tf.random.uniform(shape=[5, 10])
input_tensor = keras.Input(shape=[None, 5, 10])
output = keras_nlp.layers.TokenAndPositionEmbedding(vocabulary_size=vocab_size,
sequence_length=seq_length,
embedding_dim=embed_dim)(input_tensor)
model = keras.Model(inputs=input_tensor, outputs=output)
model(input_data).shape
הנתונים שהעברנו לשכבה מוטבעים כעת במרחב סמוי של 10 ממדים:
model(input_data)
<tf.Tensor: shape=(5, 10, 10), dtype=float32, numpy=
array([[[-0.01695484, 0.7656435 , -0.84340465, 0.50211895,
-0.3162892 , 0.16375223, -0.3774369 , -0.10028353,
-0.00136751, -0.14690581],
[-0.05646318, 0.00225556, -0.7745967 , 0.5233861 ,
-0.22601983, 0.07024342, 0.0905793 , -0.46133494,
-0.30130145, 0.451248 ],
...
הולך רחוק יותר - פרויקט יד מקצה לקצה
האופי הסקרן שלך גורם לך לרצות ללכת רחוק יותר? אנו ממליצים לבדוק את שלנו פרויקט מודרך: "כתוביות תמונה עם רשתות CNN ושוטרים עם קרס".
בפרויקט מודרך זה – תלמדו כיצד לבנות מודל כיתוב תמונה, המקבל תמונה כקלט ומייצר כיתוב טקסטואלי כפלט.
תלמד כיצד:
- עיבוד מוקדם של טקסט
- הוקטור קלט טקסט בקלות
- עבודה עם
tf.data
API ובניית מערכי נתונים בעלי ביצועים - בנה רובוטריקים מאפס עם TensorFlow/Keras ו-KerasNLP - התוספת האופקית הרשמית ל-Keras לבניית דגמי NLP חדישים
- בנו ארכיטקטורות היברידיות שבהן הפלט של רשת אחת מקודד עבור אחרת
כיצד אנו ממסגרים כיתוב תמונה? רובם רואים בזה דוגמה ללמידה עמוקה גנרטיבית, מכיוון שאנו מלמדים רשת ליצור תיאורים. עם זאת, אני אוהב להסתכל על זה כדוגמה של תרגום מכונה עצבית - אנחנו מתרגמים את התכונות החזותיות של תמונה למילים. באמצעות תרגום, אנו מייצרים ייצוג חדש של התמונה, במקום רק מייצרים משמעות חדשה. הצפייה בו כתרגום, ורק על ידי יצירת הרחבה, מבצעת את המשימה באור שונה, והופכת אותה לקצת יותר אינטואיטיבית.
מסגור הבעיה כבעיה של תרגום מקלה להבין באיזו ארכיטקטורה נרצה להשתמש. רובוטריקים המקודדים בלבד מעולים בהבנת טקסט (ניתוח סנטימנטים, סיווג וכו') מכיוון שמקודדים מקודדים ייצוגים משמעותיים. דגמי מפענח בלבד מתאימים לדור (כגון GPT-3), מכיוון שמפענחים מסוגלים להסיק ייצוגים משמעותיים לרצף אחר עם אותה משמעות. התרגום נעשה בדרך כלל על ידי ארכיטקטורת מקודד-מפענח, כאשר המקודדים מקודדים ייצוג משמעותי של משפט (או תמונה, במקרה שלנו) ומפענחים לומדים להפוך את הרצף הזה לייצוג משמעותי נוסף שניתן לפרשנות עבורנו (כגון משפט).
מסקנות
רובוטריקים עשו גל גדול מאז 2017, ומדריכים נהדרים רבים מציעים תובנה לגבי אופן הפעולה שלהם, ובכל זאת, הם עדיין היו חמקמקים עבור רבים בגלל התקורה של יישומים מותאמים אישית. KerasNLP מטפל בבעיה זו, ומספק אבני בניין המאפשרות לך לבנות מערכות NLP גמישות ועוצמתיות, במקום לספק פתרונות ארוזים מראש.
במדריך זה, בדקנו את הטבעת האסימון והמיקום עם Keras ו-KerasNLP.