אסימון טרנספורמטור והטמעת מיקום עם מודיעין נתונים של Keras PlatoBlockchain. חיפוש אנכי. איי.

אסימון שנאי והטמעת מיקום עם Keras

מבוא

יש הרבה מדריכים המסבירים כיצד פועלים שנאים, ולבניית אינטואיציה על מרכיב מרכזי שלהם - הטבעת אסימון ומיקום.

הטמעת אסימונים פוזיציונית אפשרה לשנאים לייצג יחסים לא נוקשים בין אסימונים (בדרך כלל, מילים), וזה הרבה יותר טוב במודל הדיבור מונע ההקשר שלנו במודלים של שפות. למרות שהתהליך פשוט יחסית, הוא גנרי למדי, והיישמים הופכים במהירות ללוחות הגנה.

במדריך הקצר הזה, נסקור כיצד אנו יכולים להשתמש ב-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.

בול זמן:

עוד מ Stackabuse