
Apa itu token vocab special token serta padding pada model bahasa merupakan tahapan awal dari model bahasa yang pasti akan kita jumpai pertama kali karena termasuk dalam tahap pra pengolahan!
Model bahasa adalah sistem komputasional yang dirancang untuk memahami dan menghasilkan teks bahasa manusia. Tujuan utamanya adalah untuk memprediksi kemungkinan urutan kata berikutnya dalam sebuah teks. Model bahasa dapat digunakan untuk berbagai tugas dalam pemrosesan bahasa alami, seperti penerjemahan mesin, pengenalan ucapan, analisis sentimen, dan lain-lain.
Berikut adalah beberapa komponen utama dan teknik yang digunakan dalam pembangunan model bahasa:
- Arsitektur Model: Model bahasa dapat dibangun dengan menggunakan berbagai arsitektur seperti:
- Feedforward Neural Networks: Ini adalah jaringan saraf biasa dengan lapisan-lapisan tersembunyi yang berurutan. Namun, mereka kurang efektif dalam menangani urutan kata dalam teks.
- Recurrent Neural Networks (RNNs): RNNs dirancang untuk menangani urutan data, seperti teks, dengan menggunakan “memori” internal untuk menyimpan informasi dari urutan sebelumnya. Namun, RNNs sering mengalami masalah hilangnya gradien (vanishing gradient problem) ketika urutan menjadi panjang.
- Long Short-Term Memory (LSTM) Networks: LSTM adalah jenis RNN yang ditingkatkan, dirancang untuk mengatasi masalah hilangnya gradien dengan menggunakan gerbang (gate) yang memungkinkan sel-sel memori untuk “memutus” atau “mengingat” informasi sepanjang urutan.
- Gated Recurrent Units (GRUs): GRUs adalah varian lain dari RNN yang menyederhanakan struktur LSTM dengan hanya menggunakan dua jenis gerbang.
- Transformer: Transformer adalah arsitektur yang relatif baru dalam model bahasa, yang terdiri dari lapisan-lapisan self-attention dan lapisan-lapisan feedforward. Transformer telah terbukti sangat efektif dalam tugas-tugas pemrosesan bahasa dan telah menjadi dasar bagi banyak model bahasa canggih saat ini, seperti GPT (Generative Pre-trained Transformer).
- Pelatihan: Model bahasa sering kali dipelajari pada tugas yang disebut “language modeling”. Dalam tugas ini, model dihadapkan pada urutan kata dan diberi tugas untuk memprediksi kata berikutnya berdasarkan konteks sebelumnya. Model diperbarui melalui proses pembelajaran berbasis gradien, di mana perbedaan antara prediksi model dan label yang sebenarnya (yaitu kata berikutnya) digunakan untuk menyesuaikan parameter model agar meminimalkan kesalahan.
- Tokenisasi dan Vocab: Sebelum diproses oleh model, teks biasanya dipecah menjadi token-token dan dikonversi menjadi representasi numerik yang dapat dipahami oleh model. Tokenisasi adalah proses mengidentifikasi unit-unit dasar dalam teks seperti kata, karakter, atau sub-kata. Vocabulary adalah kumpulan semua token yang dikenali oleh model.
- Pre-training dan Fine-tuning: Model bahasa sering kali dilatih secara pre-trained (pra-pelatihan) pada dataset besar yang melibatkan tugas language modeling atau tugas-tugas lain seperti penerjemahan atau pengenalan entitas bernama. Setelah pre-training, model dapat disesuaikan lebih lanjut dengan fine-tuning pada dataset yang lebih kecil atau tugas spesifik.
Apa itu token dan vocab pada model bahasa
Contents
Dalam konteks model bahasa, “token” dan “vocab” adalah konsep yang sangat penting.
- Token: Token merujuk pada unit-unit dasar yang digunakan dalam pemrosesan bahasa oleh model. Token bisa berupa kata, karakter, sub-kata (seperti potongan kata yang dihasilkan oleh tokenisasi sub-word), atau bahkan frasa dalam beberapa kasus. Dalam pemrosesan bahasa, teks biasanya dipecah menjadi token-token ini sebagai langkah awal dalam analisisnya. Tokenisasi adalah proses mengonversi teks menjadi token-token ini. Contoh token adalah “dog”, “cat”, “running”, “!”, “123”, dan sebagainya.
- Vocabulary (Vocab): Vocabulary (kosa kata) adalah kumpulan semua token yang dapat dikenali oleh model bahasa. Ini adalah daftar lengkap dari semua kata atau token yang mungkin ditemui oleh model selama pelatihan atau penggunaan. Ukuran vocab dapat bervariasi tergantung pada kompleksitas model dan sumber data pelatihan. Pemilihan vocab yang tepat sangat penting karena akan mempengaruhi kinerja dan efisiensi model. Vocab juga memungkinkan model untuk mengonversi token ke dalam representasi numerik yang diperlukan untuk pemrosesan oleh model, seperti embedding.
Ketika model bahasa dilatih, bagian penting dari proses pelatihan adalah membangun vocabulary yang sesuai dengan data yang digunakan. Ini berarti memilih token-token yang paling mungkin muncul dan relevan dalam data. Selama penggunaan model, token dalam input teks kemudian dibandingkan dengan vocab untuk mengonversinya menjadi representasi yang dapat diproses oleh model. Jadi, token dan vocab adalah konsep-konsep yang sangat mendasar namun penting dalam pemodelan bahasa.
Tentang Token pada ChatGPT
ChatGPT, seperti GPT-3 dari OpenAI, menggunakan tokenisasi berbasis byte pair encoding (BPE) sebagai bagian dari proses tokenisasi. BPE adalah teknik tokenisasi yang umum digunakan dalam pemrosesan bahasa alami dan telah terbukti efektif dalam menangani kosakata yang besar dengan efisien.
Implementasi spesifik dari tokenisasi BPE yang digunakan oleh ChatGPT mungkin berbeda-beda tergantung pada detail implementasi yang digunakan oleh pengembangnya. Namun, pada dasarnya, BPE beroperasi dengan cara membagi teks menjadi potongan-potongan yang lebih kecil, yang biasanya disebut sebagai “sub-word units”, seperti potongan kata, karakter, atau kombinasi karakter. BPE kemudian membangun kosakata berdasarkan potongan-potongan ini, dengan memberikan preferensi kepada potongan-potongan yang paling umum dalam data pelatihan. Hal ini memungkinkan BPE untuk menangani kosakata yang besar dengan cara yang efisien, sambil mempertahankan fleksibilitas dalam menangani kata-kata yang tidak terlihat dalam data pelatihan.
Keseluruhan proses tokenisasi dengan BPE memungkinkan model seperti ChatGPT untuk menerima dan menghasilkan teks dalam bentuk token-token sub-word, yang kemudian digunakan sebagai input untuk proses lebih lanjut, seperti pemrosesan dan generasi bahasa.
Lebih lanjut kalian bisa baca Byte-Pair Encoding tokenization https://huggingface.co/learn/nlp-course/en/chapter6/5
Tapi tenang saja! kita tidak akan membuat model bahasa untuk tujuan umum seperti chatgpt yang dapat mengolah beragam tujuan, namun hanya membuat model bahasa dengan tujuan khusus seperti Membuat Model Bahasa menggunakan Deep Learning
ataupun untuk translate suatu bahasa
Membuat Token dari Awal
Untuk membuat token sangat mudah, secara default pytorch sudah dilengkapi dengan tokenizer english, namun kalian jangan kuatir, bisa kok membuat token dengan memecah kalimat menjadi huruf/kata.
cara pertama
"ini adalah model bahasa".strip().split()
menghasilkan token sebagai berikut
['ini', 'adalah', 'model', 'bahasa']
cara kedua
bisa juga dengan cara berikut jika menggunakan bahasa english
tokenizer = torchtext.data.utils.get_tokenizer('basic_english') tokenizer("the cat eat mouse")
hasilnya
['the', 'cat', 'eat', 'mouse']
cara ketiga
atau menggunakan library spacy, tapi kalian wajib install spacy
pip install spacy
setelah itu kalian wajib download corpus english nya
python -m spacy download en_core_web_sm
kita gunakan saja seperti berikut
tokenizer_src = get_tokenizer('spacy', language='en_core_web_sm')
kita coba
tokenizer_src("the cat eat mouse")
Membuat Vocab
Merupakan kumpulan kosa kata ataupun karakter juga bisa simbol, mari kita pahami kalimat berikut
kalimat = "chatGPT adalah model bahasa besar yang banyak digunakan saat ini. Model bahasa ini merupakan buatan dari OpenAI"
Bila kita split menggunakan cara pertama,
kalimat.strip().split() Out[146]: ['chatGPT', 'adalah', 'model', 'bahasa', 'besar', 'yang', 'banyak', 'digunakan', 'saat', 'ini.', 'Model', 'bahasa', 'ini', 'merupakan', 'buatan', 'dari', 'OpenAI']
maka kata “ini.” akan menjadi sebuah token harusnya “ini.” padahal ini harus dipisah
mari kita gunakan cara kedua
tokenizer = torchtext.data.utils.get_tokenizer('basic_english') tokenizer(kalimat) Out[148]: ['chatgpt', 'adalah', 'model', 'bahasa', 'besar', 'yang', 'banyak', 'digunakan', 'saat', 'ini', '.', 'model', 'bahasa', 'ini', 'merupakan', 'buatan', 'dari', 'openai']
kalian bisa melihat semuanya dibuat lower
Mari kita buat contoh lebih baik, 2 kalimat diatas akan dijadikan paragraf
paragraf = ["chatGPT adalah model bahasa besar yang banyak digunakan saat ini.","Model bahasa ini merupakan buatan dari OpenAI"]
kemudian kita akan membuat function inline
tokenize_data = lambda kalimat, tokenizer: tokenizer(kalimat)
selanjutnya kita akan membuat fungsi iterator
def yield_token(paragraf,tokenize_data,tokenizer): for kalimat in paragraf: yield tokenize_data(kalimat,tokenizer)
mari kita panggil
a = iter(yield_token(paragraf,tokenize_data,tokenizer))
mari kita panggil next
next(a) Out[190]: ['chatgpt', 'adalah', 'model', 'bahasa', 'besar', 'yang', 'banyak', 'digunakan', 'saat', 'ini', '.'] next(a) Out[191]: ['model', 'bahasa', 'ini', 'merupakan', 'buatan', 'dari', 'openai']
membuat vocab dengan minimal frekuensi = 2
vocab = torchtext.vocab.build_vocab_from_iterator(yield_token(paragraf,tokenize_data,tokenizer), min_freq=2)
artinya hanya akan ada 3 token saja yang dimasukan kedalam vocab karena 3 token tersebut sering muncul sebanyak 2 kali
print(vocab.get_itos())
hasilnya
['bahasa', 'ini', 'model']
mari kita coba
prompt = "model bahasa" tokens = tokenizer(prompt) index = [vocab[t] for t in tokens] print(index)
akan menghasilkan
[2, 0]
yang artinya model menempati no index 2 pada vocab dan bahasa menempati no index 0 pada vocab.
Special token
Apa itu special token? misalkan ada token yang tidak tercantum di vocab! pasti akan error. Perhatikan error token indonesia yang memang tidak tercantum di vocab
prompt = "model bahasa indonesia" tokens = tokenizer(prompt) indices = [vocab[t] for t in tokens] print(indices) Traceback (most recent call last): Cell In[200], line 3 indices = [vocab[t] for t in tokens] Cell In[200], line 3 in <listcomp> indices = [vocab[t] for t in tokens] File ~/anaconda3/lib/python3.11/site-packages/torchtext/vocab/vocab.py:65 in __getitem__ return self.vocab[token] RuntimeError: Token indonesia not found and default index is not set
Untuk hal tersebut kita membutuhkan beberapa token seperti
- <unk> unknown untuk token yang tidak diketahui
- <pad> padding untuk padding –> nanti akan dijelaskan lebih lanjut
- <bos> begin of sentence untuk mengawali sebuah kalimat
- <eos> end of sentence
mari kita buat
special_symbols = ['<unk>', '<pad>', '<bos>', '<eos>'] UNK_IDX = 0 # UNKOWN --> token yang tidak ada dalam vocab PAD_IDX = 1 # PADDING --> token buat padding BOS_IDX = 2 # BEGIN OF SENTENCE EOS_IDX = 3 # END OF SENTENCE
mari kita ulangi lagi dengan special token diatas
vocab = torchtext.vocab.build_vocab_from_iterator(yield_token(paragraf,tokenize_data,tokenizer), min_freq=1, specials=special_symbols,special_first=True)
keyword special_first merupakan UNK_IDX secara default semua token yang tidak diketahui akan menempati index 0. Jangan lupa tambahkan
vocab.set_default_index(UNK_IDX)
mari kita coba
prompt = "<bos> model bahasa indonesia <eos>" tokens = tokenizer(prompt) indices = [vocab[t] for t in tokens] print(indices) [2, 6, 4, 0, 3]
sudah paham ya mengapa hasilnya 2, 6, 4, 0, dan 3
Padding
Padding merupakan operasi penambahan agar semuanya berukuran sama. Perhatikan kata berikut
Misalnya, jika kita memiliki dua teks dalam satu batch:
- “Saya suka makan”
- “Dia tidur”
Dan teks pertama memiliki panjang 3 kata dan teks kedua memiliki panjang 2 kata, kita dapat menambahkan padding token (misalnya, [PAD] ) ke teks kedua sehingga panjangnya menjadi 3, sehingga kedua teks memiliki panjang yang sama:
- “Saya suka makan”
- “Dia tidur [PAD]”
Dengan demikian, kedua teks memiliki panjang yang sama, dan kita dapat menyusunnya ke dalam satu batch untuk proses pelatihan atau inferensi model bahasa. Setelah proses ini selesai, padding token biasanya diabaikan saat memasukkan input ke dalam model sehingga model bahasa bisa menggunakan input beragam panjang kalimat yang berbeda-beda.
Sebelum lanjut, kita akan menambahkan special token yaitu BOS dan EOS serta mengubah kalimat menjadi token tensor menggunakan fungsi berikut
import torch def tensor_transform(token_ids): return torch.cat((torch.tensor([BOS_IDX]), #pertama torch.tensor(token_ids), # teks utama torch.tensor([EOS_IDX]))) #terakhir tensor = tensor_transform(indices) print(tensor)
Mari kita coba saja. Perhatikan berikut paragraf berikut
paragraf = ["chatGPT adalah model bahasa besar.","Model bahasa ini merupakan buatan dari OpenAI"] batch = [] for prompt in paragraf: tokens = tokenizer(prompt) indices = [vocab[t] for t in tokens] tensor = tensor_transform(indices) batch.append(tensor) print(batch)
menghasilkan tensor yang mempunyai ukuran yang berbeda-beda
[ tensor([2, 0, 0, 6, 4, 0, 0, 3]), tensor([2, 6, 4, 5, 0, 0, 0, 0, 3]) ]
kalian bisa melihat bahwa ukuran tensor tersebut berbeda-beda, padahal untuk input model transformer harus mempunyai ukuran yang sama! untuk itu kita butuh padding
from torch.nn.utils.rnn import pad_sequence final_batch = pad_sequence(batch, padding_value=PAD_IDX, batch_first=True) print(final_batch)
hasilnya
tensor([ [2, 0, 0, 6, 4, 0, 0, 3, 1], [2, 6, 4, 5, 0, 0, 0, 0, 3] ])
akan ditambahkan PAD_IDX dengan index 1
Tokenizer yang cepat dan nggak pakai mikir sampai ke padding
Sebenarnya untuk mempermudah, kalian bisa menggunakan library dari transformer
https://huggingface.co/docs/transformers/en/quicktour
from transformers import AutoTokenizer checkpoint = 'bert-base-cased' tokernizer = AutoTokenizer.from_pretrained(checkpoint) data = ["kea makan", "Do you like cat too?"] tokernizer(data,padding = True, truncation=True,return_tensors='pt')
hasilnya
{'input_ids': tensor([[ 101, 146, 1176, 5855, 102, 0, 0, 0], [ 101, 2091, 1128, 1176, 5855, 1315, 136, 102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1]])}
input_ids: seringkali merupakan satu-satunya parameter yang diperlukan untuk diteruskan ke model sebagai masukan. Itu adalah indeks token, representasi numerik dari token yang membangun urutan yang akan digunakan sebagai masukan oleh model.
Mari kita coba dengan model yang lain
from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained("google-bert/bert-base-cased") sequence = "A Titan RTX has 24GB of VRAM" tokenized_sequence = tokenizer.tokenize(sequence) print(tokenized_sequence) inputs = tokenizer(sequence) print(inputs["input_ids"])
['A', 'Titan', 'R', '##T', '##X', 'has', '24', '##GB', 'of', 'V', '##RA', '##M'] [101, 138, 18696, 155, 1942, 3190, 1144, 1572, 13745, 1104, 159, 9664, 2107, 102]
itu sudah termasuk special token seperti BOS dan EOS
kita ubah lagi menjadi token
decoded_sequence = tokenizer.decode(inputs["input_ids"]) print(decoded_sequence)
[CLS] A Titan RTX has 24GB of VRAM [SEP]
ternyata menggunakan CLS sebagai spesial token nya dan SEP
Sebagai informasi diatas tokenizer diatas mempunyai informasi sebagai berikut
tokenizer Out[29]: BertTokenizer(name_or_path='google-bert/bert-base-cased', vocab_size=28996, model_max_length=512, is_fast=False, padding_side='right', truncation_side='right', special_tokens={'unk_token': '[UNK]', 'sep_token': '[SEP]', 'pad_token': '[PAD]', 'cls_token': '[CLS]', 'mask_token': '[MASK]'}, clean_up_tokenization_spaces=True)
CLS itu classify https://h2o.ai/wiki/classify-token/
Mari kita coba menggunakan bahasa indonesia, agak aneh nanti hasil token nya
sequence = "monyet makan pisang" tokenized_sequence = tokenizer.tokenize(sequence) print(tokenized_sequence) inputs = tokenizer(sequence) print(inputs["input_ids"]) decoded_sequence = tokenizer.decode(inputs["input_ids"]) print(decoded_sequence)
hasil
['mon', '##ye', '##t', 'ma', '##kan', 'p', '##isan', '##g'] [101, 19863, 4980, 1204, 12477, 8752, 185, 21599, 1403, 102] [CLS] monyet makan pisang [SEP]
ref: https://huggingface.co/docs/transformers/en/tokenizer_summary
https://huggingface.co/docs/transformers/v4.38.2/en/model_doc/bert#transformers.BertModel