Νοημοσύνη δεδομένων Πλάτωνα.
Κάθετη Αναζήτηση & Αι.

Transformer Token και Ενσωμάτωση Θέσης με Keras

Ημερομηνία:

Εισαγωγή

Υπάρχουν πολλοί οδηγοί που εξηγούν πώς λειτουργούν οι μετασχηματιστές και για τη δημιουργία μιας διαίσθησης σε ένα βασικό στοιχείο τους – την ενσωμάτωση διακριτικού και θέσης.

Η ενσωμάτωση διακριτικών θέσης επέτρεψε στους μετασχηματιστές να αναπαριστούν μη άκαμπτες σχέσεις μεταξύ των διακριτικών (συνήθως, λέξεων), κάτι που είναι πολύ καλύτερο στη μοντελοποίηση της ομιλίας μας που βασίζεται στο πλαίσιο στη μοντελοποίηση γλώσσας. Ενώ η διαδικασία είναι σχετικά απλή, είναι αρκετά γενική και οι υλοποιήσεις γίνονται γρήγορα boilerplate.

Σε αυτόν τον σύντομο οδηγό, θα ρίξουμε μια ματιά στο πώς μπορούμε να χρησιμοποιήσουμε το 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 στρώμα στον Κερά. Οι μετασχηματιστές δεν κωδικοποιούν μόνο χρησιμοποιώντας ένα πρότυπο Embedding στρώμα. Εκτελούν Embedding και PositionEmbeddingκαι προσθέστε τα μαζί, μετατοπίζοντας τις κανονικές ενσωματώσεις από τη θέση τους στον λανθάνοντα χώρο.

Με το KerasNLP – performing TokenAndPositionEmbedding συνδυάζει κανονική ενσωμάτωση διακριτικών (Embedding) με ενσωμάτωση θέσης (PositionEmbedding).

Ενσωμάτωση θέσης

Ας ρίξουμε μια ματιά 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)>

TokenAndPosition Embedding

Η ενσωμάτωση διακριτικού και θέσης καταλήγει στη χρήση 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 στο Google και πραγματικά μαθαίνουν το!

... 
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  ],
         ...

Going Further – Hand-held End-to-End Project

Η περιπετειώδης φύση σας σας κάνει να θέλετε να πάτε παραπέρα; Σας προτείνουμε να ελέγξετε το δικό μας Καθοδηγούμενο Έργο: "Υπότιτλοι εικόνων με CNN και μετασχηματιστές με Keras".

Σε αυτό το καθοδηγούμενο έργο – θα μάθετε πώς να δημιουργείτε ένα μοντέλο υπότιτλων εικόνας, το οποίο δέχεται μια εικόνα ως είσοδο και παράγει μια λεζάντα κειμένου ως έξοδο.

Θα μάθετε πώς να:

  • Προεπεξεργασία κειμένου
  • Διανυσματική εισαγωγή κειμένου εύκολα
  • Εργαστείτε με το tf.data API και δημιουργία συνόλων δεδομένων με απόδοση
  • Κατασκευάστε μετασχηματιστές από την αρχή με τα TensorFlow/Keras και KerasNLP – η επίσημη οριζόντια προσθήκη στην Keras για την κατασκευή μοντέλων NLP τελευταίας τεχνολογίας
  • Δημιουργήστε υβριδικές αρχιτεκτονικές όπου η έξοδος ενός δικτύου κωδικοποιείται για ένα άλλο

Πώς πλαισιώνουμε τις λεζάντες εικόνων; Οι περισσότεροι το θεωρούν παράδειγμα παραγωγικής βαθιάς μάθησης, επειδή διδάσκουμε ένα δίκτυο για τη δημιουργία περιγραφών. Ωστόσο, μου αρέσει να το βλέπω ως ένα παράδειγμα νευρωνικής μηχανικής μετάφρασης – μεταφράζουμε τα οπτικά χαρακτηριστικά μιας εικόνας σε λέξεις. Μέσω της μετάφρασης, δημιουργούμε μια νέα αναπαράσταση αυτής της εικόνας, αντί να δημιουργούμε απλώς νέο νόημα. Η προβολή της ως μετάφρασης, και μόνο με παραγωγή επέκτασης, καλύπτει την εργασία με διαφορετικό πρίσμα και την κάνει λίγο πιο διαισθητική.

Η πλαισίωση του προβλήματος ως θέμα μετάφρασης καθιστά ευκολότερο να καταλάβουμε ποια αρχιτεκτονική θα θέλουμε να χρησιμοποιήσουμε. Οι μετασχηματιστές μόνο για κωδικοποιητές είναι εξαιρετικοί στην κατανόηση κειμένου (ανάλυση συναισθήματος, ταξινόμηση κ.λπ.) επειδή οι κωδικοποιητές κωδικοποιούν ουσιαστικές αναπαραστάσεις. Τα μοντέλα μόνο για αποκωδικοποιητές είναι εξαιρετικά για παραγωγή (όπως το GPT-3), καθώς οι αποκωδικοποιητές μπορούν να συνάγουν σημαντικές αναπαραστάσεις σε μια άλλη ακολουθία με το ίδιο νόημα. Η μετάφραση γίνεται συνήθως από μια αρχιτεκτονική κωδικοποιητή-αποκωδικοποιητή, όπου οι κωδικοποιητές κωδικοποιούν μια ουσιαστική αναπαράσταση μιας πρότασης (ή εικόνας, στην περίπτωσή μας) και οι αποκωδικοποιητές μαθαίνουν να μετατρέπουν αυτήν την ακολουθία σε μια άλλη ουσιαστική αναπαράσταση που είναι πιο ερμηνεύσιμη για εμάς (όπως μια πρόταση).

συμπεράσματα

Οι μετασχηματιστές έχουν κάνει ένα μεγάλο κύμα από το 2017 και πολλοί σπουδαίοι οδηγοί προσφέρουν πληροφορίες για τον τρόπο λειτουργίας τους, ωστόσο, ήταν ακόμα άπιαστοι σε πολλούς λόγω του υπερβολικού κόστους των προσαρμοσμένων υλοποιήσεων. Το KerasNLP αντιμετωπίζει αυτό το πρόβλημα, παρέχοντας δομικά στοιχεία που σας επιτρέπουν να δημιουργήσετε ευέλικτα, ισχυρά συστήματα NLP, αντί να παρέχετε προσυσκευασμένες λύσεις.

Σε αυτόν τον οδηγό, ρίξαμε μια ματιά στην ενσωμάτωση διακριτικού και θέσης με το Keras και το KerasNLP.

spot_img

Τελευταία Νοημοσύνη

spot_img

Συνομιλία με μας

Γεια σου! Πώς μπορώ να σε βοηθήσω?