mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
101 lines
8.2 KiB
Markdown
101 lines
8.2 KiB
Markdown
# 1. Tokenizing
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Tokenizing
|
||
|
||
**Tokenizing** είναι η διαδικασία διάσπασης δεδομένων, όπως το κείμενο, σε μικρότερα, διαχειρίσιμα κομμάτια που ονομάζονται _tokens_. Κάθε token ανατίθεται σε έναν μοναδικό αριθμητικό αναγνωριστικό (ID). Αυτό είναι ένα θεμελιώδες βήμα στην προετοιμασία του κειμένου για επεξεργασία από μοντέλα μηχανικής μάθησης, ειδικά στην επεξεργασία φυσικής γλώσσας (NLP).
|
||
|
||
> [!TIP]
|
||
> Ο στόχος αυτής της αρχικής φάσης είναι πολύ απλός: **Διαίρεσε την είσοδο σε tokens (ids) με κάποιον τρόπο που έχει νόημα**.
|
||
|
||
### **How Tokenizing Works**
|
||
|
||
1. **Splitting the Text:**
|
||
- **Basic Tokenizer:** Ένας απλός tokenizer μπορεί να διασπάσει το κείμενο σε μεμονωμένες λέξεις και σημεία στίξης, αφαιρώντας τα κενά.
|
||
- _Example:_\
|
||
Κείμενο: `"Hello, world!"`\
|
||
Tokens: `["Hello", ",", "world", "!"]`
|
||
2. **Creating a Vocabulary:**
|
||
- Για να μετατραπούν τα tokens σε αριθμητικά IDs, δημιουργείται ένα **λεξιλόγιο**. Αυτό το λεξιλόγιο απαριθμεί όλα τα μοναδικά tokens (λέξεις και σύμβολα) και αναθέτει σε κάθε ένα έναν συγκεκριμένο ID.
|
||
- **Special Tokens:** Αυτά είναι ειδικά σύμβολα που προστίθενται στο λεξιλόγιο για να χειριστούν διάφορα σενάρια:
|
||
- `[BOS]` (Beginning of Sequence): Υποδεικνύει την αρχή ενός κειμένου.
|
||
- `[EOS]` (End of Sequence): Υποδεικνύει το τέλος ενός κειμένου.
|
||
- `[PAD]` (Padding): Χρησιμοποιείται για να κάνει όλες τις ακολουθίες σε μια παρτίδα του ίδιου μήκους.
|
||
- `[UNK]` (Unknown): Αντιπροσωπεύει tokens που δεν είναι στο λεξιλόγιο.
|
||
- _Example:_\
|
||
Αν το `"Hello"` έχει ανατεθεί ID `64`, `","` είναι `455`, `"world"` είναι `78`, και `"!"` είναι `467`, τότε:\
|
||
`"Hello, world!"` → `[64, 455, 78, 467]`
|
||
- **Handling Unknown Words:**\
|
||
Αν μια λέξη όπως το `"Bye"` δεν είναι στο λεξιλόγιο, αντικαθίσταται με `[UNK]`.\
|
||
`"Bye, world!"` → `["[UNK]", ",", "world", "!"]` → `[987, 455, 78, 467]`\
|
||
_(Υποθέτοντας ότι το `[UNK]` έχει ID `987`)_
|
||
|
||
### **Advanced Tokenizing Methods**
|
||
|
||
Ενώ ο βασικός tokenizer λειτουργεί καλά για απλά κείμενα, έχει περιορισμούς, ειδικά με μεγάλα λεξιλόγια και την επεξεργασία νέων ή σπάνιων λέξεων. Οι προηγμένες μέθοδοι tokenization αντιμετωπίζουν αυτά τα ζητήματα διασπώντας το κείμενο σε μικρότερες υπομονάδες ή βελτιστοποιώντας τη διαδικασία tokenization.
|
||
|
||
1. **Byte Pair Encoding (BPE):**
|
||
- **Purpose:** Μειώνει το μέγεθος του λεξιλογίου και χειρίζεται σπάνιες ή άγνωστες λέξεις διασπώντας τις σε συχνά εμφανιζόμενα ζεύγη byte.
|
||
- **How It Works:**
|
||
- Ξεκινά με μεμονωμένους χαρακτήρες ως tokens.
|
||
- Συγχωνεύει επαναληπτικά τα πιο συχνά ζεύγη tokens σε ένα μόνο token.
|
||
- Συνεχίζει μέχρι να μην μπορούν να συγχωνευτούν περισσότερα συχνά ζεύγη.
|
||
- **Benefits:**
|
||
- Εξαλείφει την ανάγκη για ένα token `[UNK]` καθώς όλες οι λέξεις μπορούν να αναπαρασταθούν συνδυάζοντας υπάρχοντα υπολέξεις.
|
||
- Πιο αποδοτικό και ευέλικτο λεξιλόγιο.
|
||
- _Example:_\
|
||
`"playing"` μπορεί να διασπαστεί σε `["play", "ing"]` αν το `"play"` και το `"ing"` είναι συχνές υπολέξεις.
|
||
2. **WordPiece:**
|
||
- **Used By:** Μοντέλα όπως το BERT.
|
||
- **Purpose:** Παρόμοιο με το BPE, διασπά τις λέξεις σε υπομονάδες για να χειριστεί άγνωστες λέξεις και να μειώσει το μέγεθος του λεξιλογίου.
|
||
- **How It Works:**
|
||
- Ξεκινά με ένα βασικό λεξιλόγιο από μεμονωμένους χαρακτήρες.
|
||
- Προσθέτει επαναληπτικά την πιο συχνή υπολέξη που μεγιστοποιεί την πιθανότητα των δεδομένων εκπαίδευσης.
|
||
- Χρησιμοποιεί ένα πιθανοτικό μοντέλο για να αποφασίσει ποιες υπολέξεις να συγχωνεύσει.
|
||
- **Benefits:**
|
||
- Ισορροπεί μεταξύ του να έχει ένα διαχειρίσιμο μέγεθος λεξιλογίου και να αναπαριστά αποτελεσματικά τις λέξεις.
|
||
- Χειρίζεται αποδοτικά σπάνιες και σύνθετες λέξεις.
|
||
- _Example:_\
|
||
`"unhappiness"` μπορεί να διασπαστεί σε `["un", "happiness"]` ή `["un", "happy", "ness"]` ανάλογα με το λεξιλόγιο.
|
||
3. **Unigram Language Model:**
|
||
- **Used By:** Μοντέλα όπως το SentencePiece.
|
||
- **Purpose:** Χρησιμοποιεί ένα πιθανοτικό μοντέλο για να προσδιορίσει το πιο πιθανό σύνολο υπολέξεων.
|
||
- **How It Works:**
|
||
- Ξεκινά με ένα μεγάλο σύνολο πιθανών tokens.
|
||
- Αφαιρεί επαναληπτικά tokens που λιγότερο βελτιώνουν την πιθανότητα του μοντέλου για τα δεδομένα εκπαίδευσης.
|
||
- Ολοκληρώνει ένα λεξιλόγιο όπου κάθε λέξη αναπαρίσταται από τις πιο πιθανές υπομονάδες.
|
||
- **Benefits:**
|
||
- Ευέλικτο και μπορεί να μοντελοποιήσει τη γλώσσα πιο φυσικά.
|
||
- Συχνά οδηγεί σε πιο αποδοτικές και συμπαγείς διασπάσεις.
|
||
- _Example:_\
|
||
`"internationalization"` μπορεί να διασπαστεί σε μικρότερες, σημασιολογικά χρήσιμες υπολέξεις όπως `["international", "ization"]`.
|
||
|
||
## Code Example
|
||
|
||
Ας κατανοήσουμε αυτό καλύτερα από ένα παράδειγμα κώδικα από [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
|
||
```python
|
||
# Download a text to pre-train the model
|
||
import urllib.request
|
||
url = ("https://raw.githubusercontent.com/rasbt/LLMs-from-scratch/main/ch02/01_main-chapter-code/the-verdict.txt")
|
||
file_path = "the-verdict.txt"
|
||
urllib.request.urlretrieve(url, file_path)
|
||
|
||
with open("the-verdict.txt", "r", encoding="utf-8") as f:
|
||
raw_text = f.read()
|
||
|
||
# Tokenize the code using GPT2 tokenizer version
|
||
import tiktoken
|
||
token_ids = tiktoken.get_encoding("gpt2").encode(txt, allowed_special={"[EOS]"}) # Allow the user of the tag "[EOS]"
|
||
|
||
# Print first 50 tokens
|
||
print(token_ids[:50])
|
||
#[40, 367, 2885, 1464, 1807, 3619, 402, 271, 10899, 2138, 257, 7026, 15632, 438, 2016, 257, 922, 5891, 1576, 438, 568, 340, 373, 645, 1049, 5975, 284, 502, 284, 3285, 326, 11, 287, 262, 6001, 286, 465, 13476, 11, 339, 550, 5710, 465, 12036, 11, 6405, 257, 5527, 27075, 11]
|
||
```
|
||
## Αναφορές
|
||
|
||
- [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch)
|
||
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|