Apa itu token vocab special token serta padding pada model bahasa

By | March 9, 2024
1,051 Views

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:

  1. 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).
  2. 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.
  3. 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.
  4. 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

Dalam konteks model bahasa, “token” dan “vocab” adalah konsep yang sangat penting.

  1. 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.
  2. 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

  1. <unk> unknown untuk token yang tidak diketahui
  2. <pad> padding untuk padding –> nanti akan dijelaskan lebih lanjut
  3. <bos> begin of sentence untuk mengawali sebuah kalimat
  4. <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:

  1. “Saya suka makan”
  2. “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:

  1. “Saya suka makan”
  2. “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

ref: https://medium.com/@lokaregns/preparing-text-data-for-transformers-tokenization-mapping-and-padding-9fbfbce28028

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