Mengenal Transformer, LLM, dan ChatGPT

Tulisan ini ingin memperkenalkan cara kerja ChatGPT. Tidak terlalu teknis, tapi juga tidak terlalu awam. Untuk yang ingin mempelajari lebih dalam lagi sampai detailnya, akan saya berikan link-link yang bisa dipelajari di akhir. Tulisan ini juga bukan tulisan praktis sekedar bagaimana memakai ChatGPT dengan prompt tertentu.

Memahami sedikit dasar teori bisa membuat kita paham batasan dan keanehan ChatGPT, misalnya: kenapa ChatGPT selalu menyatakan bahwa ada 3 huruf “n” dalam kata “banana”, kenapa bingung jika percakapannya panjang, kenapa hasilnya tidak selalu sama, kenapa jawabannya kadang ngawur.

Selain itu semoga dengan membaca tulisan ini jadi bisa lebih memahami berbagai informasi yang sering disebutkan ketika ada yang merilis saingan baru (atau versi baru ChatGPT), misalnya apa itu jumlah parameter dan panjang konteks.

Dihasilkan ChatGPT dengan prompt “Generate simple disney like illustration for this topic “Transformer, LLM, and ChatGPT”


Berbagai istilah

Saya sederhanakan beberapa definisi sebelum masuk ke pembahasan GPT:

  • Artificial Intelligence adalah bagaimana mensimulasikan kecerdasan manusia di mesin. Caranya terserah, bisa menggunakan database, menggunakan if, menggunakan pendekatan matematika, dsb. Intinya: bagaimana caranya seolah-olah supaya sebuah mesin terlihat “pintar”.
  • Machine learning adalah pendekatan AI di mana kita tidak memberi tahu bagaimana caranya melakukan sesuatu, tapi dengan memberi contoh. Misalnya: ini contoh foto-foto X-ray pasien yang jantungnya bermasalah, ini contoh foto-foto yang tidak bermasalah, belajarlah supaya bisa membedakan keduanya. Harapannya adalah: jika diberi foto baru, akan bisa memberi tahu apakah pasien jantungnya bermasalah.
  • Neural network adalah salah satu pendekatan untuk machine learning (akan dibahas di tulisan ini). Contoh pendekatan lain: Genetic Algorithm, Support-vector machines, dsb.
  • Deep Learning adalah jika neural networknya memiliki banyak “hidden layer” (akan dijelaskan nanti).
  • Large Language Model adalah neural network yang dilatih dengan teks yang sangat banyak (ratusan gigabyte hingga puluhan terabyte) dalam bahasa manusia.

Ada bagian yang sulit dijelaskan yaitu: GPT (Generative Pre-Trained Transformer), yang akan dijelaskan di artikel ini. GPT ini merupakan Large Language Model (LLM) menggunakan arsitektur Transformer (transformer ini akan dijelaskan nanti, tidak bisa singkat penjelasannya).

Tujuan akhir banyak peneliti AI adalah AGI (Artificial general intelligence), atau kecerdasan buatan yang bisa melakukan apapun yang bisa dilakukan manusia ataupun binatang. Ada yang menganggap bahwa GPT ini adalah salah satu jalan ke AGI, dan ada yang menganggap GPT ini akan mentok di satu titik.

Artificial Neural Network (ANN)

Artificial Neural Network (jaringan syaraf tiruan) adalah salah satu pendekatan AI. Sesuai namanya: sebuah jaringan terdiri dari banyak elemen, dalam kasus ini elemennya adalah neuron.

Saya akan menjelaskan bagian ini agak teknis dibandingkan bagian lain, karena inilah blok pembangun semuanya. Supaya bisa memahami apa itu “parameter” ketika membaca bahwa GPT-3 memiliki “175 milyar parameter”.

Neuron

Di berbagai teks tentang neural network, sebuah neuron (atau kadang disebut juga perceptron) digambarkan seperti ini: sebuah fungsi dengan banyak input, dan satu output.

Sebuah neuron dalam artificial neural network

Supaya lebih mudah, coba saya kurangi dulu inputnya hanya 2: x1 dan x2 saja, dan sekarang jadi seperti ini. Simbol sigma (yang artinya adalah penjumlahan) di dalam saya gantikan juga dengan perhitungannya, yaitu sekedar x1 dikalikan w1 dan x2 dikalikan w2, dan semuanya dijumlahkan, ditambah dengan bias b. Jadi tidak ada perhitungan rumit dalam sebuah neuron ketika sedang bekerja.

Karena weight ini bisa banyak, biasanya semua operasi dilakukan dalam bentuk perkalian matriks.

Nah sekarang activation function itu apa? Ini sekedar fungsi yang memetakan hasil perhitungan ke range tertentu. Bisa saja activation functionnya dihapus (istilahnya: identity activation function), tapi ini akan menyulitkan proses belajar.

Beberapa nama fungsi yang sering dipakai adalah sigmoid dan ReLU (fungsi lain lengkapnya bisa dilihat di Wikipedia). Dulu di paper perceptron pertama, yang dipakai adalah Heaviside step function (Heaviside ini nama matematikawan). Intinya: jika hasil perhitungan tadi kurang dari 0, hasilnya adalah 0, dan jika lebih dari 0, hasilnya adalah 1.

Sekarang fungsi yang lazim dipakai adalah sigmoid. Alasan sederhana kenapa fungsi ini dipakai adalah: akan mempermudah proses training neural network. Intinya: apapun inputnya (misalnya: harga rumah yang besar), outputnya adalah angka antara 0 dan 1.

Output antara 0 dan 1 ini biasanya artinya adalah probabilitas sesuatu, karena outputnya adalah probabilitas, maka tidak pasti jawabannya adalah itu.

Apa istimewanya neuron?

Dengan mengubah-ubah nilai w0, w1 dan b, kita bisa mensimulasikan beberapa gerbang logika dengan satu neuron (beberapa gerbang seperti XOR, butuh beberapa neuron).

Bukan cuma gerbang logika saja, ternyata banyak fungsi lain bisa disimulasikan dengan mengubah w0, w1, dan b. Angka-angka ini (weight dan bias) yang disebut sebagai parameter dalam neural network (kadang weight dan bias ini disebut sebagai “weight” saja) .

Di contoh tadi saya cuma memakai dua input saja, jadi weight-nya cuma 2 dan 1 bias, kalau neuronnya banyak, weightnya dan biasnya juga banyak. Output dari sebuah neuron bisa jadi input untuk neuron lain, membentuk suatu jaringan.

Dalam contoh di atas, weight dan bias untuk masing-masing neuron biasanya berbeda. Untuk beberapa neuron saja, jumlahnya parameternya sudah banyak. Di bagian pertama, saya sebutkan output neuron cuma satu, nah di gambar di atas, outputnya seolah banyak, tapi tidak demikian, output sebuah neuron tetap cuma 1, tapi nilai yang sama ini jadi input untuk neuron yang lain.

Bisa dilihat di gambar di atas, bahwa tiap neuron hanya melakukan perhitungan sederhana. Input akan diproses dan menghasilkan a1 sampai a3. Nilai a1, a2, a3 dari output neuron pertama, akan jadi input untuk semua hidden layer (semua neuron biru di gambar di atas), dan tiap neuron di hidden layer melakukan perhitungan yang serupa (nilai weight dan biasnya berbeda di tiap neuron), sampai akhirnya ada output c1 dan c2.

Perhatikan juga bahwa ada perkalian dengan weight dan penjumlahan dengan bias, jadi semakin banyak parameter neural network, semakin banyak perkalian. Contohnya: untuk model yang memiliki milyaran parameter, berarti harus ada banyak sekali perkalian. Secara praktis: model yang parameternya banyak, butuh hardware yang lebih besar untuk bisa menjalankannya, dan tentunya juga butuh memori yang lebih besar.

Input dan output

Setelah tahu bahwa neural network bisa disambung membentuk jaringan, bagaimana contoh real input dan outputnya. Biasanya contoh paling sederhana adalah MNIST, yang berisi contoh tulisan tangan digit 0-9, hitam putih dengan resolusi 28×28 piksel (jadi ada 784 piksel dalam satu contoh).

Untuk membuat neural network yang paling sederhana, yang bisa dilakukan adalah: tiap piksel jadi input x1 sampai x784 (jadi ada 784 neuron dalam input layer), ada banyak neuron dalam hidden layer, dan di akhir ada 10 neuron yang jadi output.

Untuk layer input: karena gambarnya hitam putih, maka tiap piksel akan menjadi 0 atau 1.

Setiap neuron terhubung ke layer berikutnya, supaya sederhana, hanya sebagian koneksi saja digambarkan

Jika output neuron (dalam gambar di atas adalah kolom paling kanan berwarna orange) berlabel “0” nilainya 1.0, dan neuron lain nilainya “0” maka kita bisa menyimpulkan: pasti ini angka 0.

Atau mungkin ada input gambar yang membingungkan, tidak jelas antara angka “4” dan “9”. Mungkin outputnya akan seperti ini: 4 mungkin 0.4 dan output untuk 9 mungkin 0.6 (dalam kasus ini: tidak yakin antara 4 atau 9, tapi probabilitasnya lebih besar angka 9).

Sebagai catatan: ini adalah pendekatan yang paling sederhana, masih ada pendekatan lain yang akurasinya lebih tinggi. Untuk pengenalan yang lebih gambar kompleks, akan ada layer pemrosesan lain (biasanya Convolutional network dipakai untuk pemrosesan gambar).

Hasil akhir pemrosesan gambar outputnya serupa dengan di atas: ada banyak output neuron yang memberikan probabilitas jenis gambarnya dan seberapa yakin pengenalannya. Jadi ada output neuron yang berisi apakah ini motor? apakah ini orang? dst.

Dalam kasus pengenalan gambar, outputnya lebih banyak: apakah di titik X,Y ada objek Z, dan kemungkinannya berapa persen. Dari informasi itu, kita bisa membentuk bounding box (kotak yang membatasi objek).

Kemungkinan orang dan motor sangat tinggi

Neural network saja kurang efisien

Teorinya: dengan Neural network saja, semua pemrosesan akan bisa dilakukan. Tapi kenyataannya, banyak hal akan lebih efisien jika ada pemrosesan tambahan.

Contoh yang mudah dijelaskan adalah ketika mengolah gambar. Ada bagian yang bernama convolution layer yang bisa dipakai agar pengenalan gambar bisa leih cepat dan juga akurat.

Sebagai manusia, kita tahu bahwa sulit memahami gambar satu piksel demi satu piksel. Tiap kali melihat satu piksel di gambar, kita perlu melihat piksel di sekitarnya. Dari melihat piksel sekitarnya, kita bisa melihat apakah ini mulai membentuk sebuah garis lurus, melengkung, dsb. Lalu dari bagian-bagian kecil ini kita bisa mulai memahami gambar secara keseluruhan.

Secara umum dalam sebuah arsitektur AI, kadang ada layer lain, selain neural network. Untuk ChatGPT, layer ini adalah self-attention. Tiap layer ini juga memiliki parameter/weight. Jadi jumlah parameter sebuah model bukan cuma yang ada di neural network, tapi juga yang ada di layer lain.

Training

Bagaimana kita bisa memberikan weight dan bias untuk tiap neuron? jawabannya adalah dengan training. Jika hanya satu neuron, kita bisa mengeset manual satu per satu nilai weight-nya (contohnya: jika ingin sekedar membuktikan neuron bisa mengemulasi gerbang logika), tapi jika ada ribuan, ini sulit sekali.

Cara yang dilakukan adalah: kita masukkan input contoh tulisan tangan angka “0”, kita harapkan output pertama (berlabel “0”) nilainya maksimal, dan yang lain minimal. Dengan menggunakan backpropagation, kita ubah nilai weight (w) dan bias (b) sedemikian hingga nilainya outputnya akan semakin dekat dengan nilai yang kita harapkan. Di sinilah kita memakai kalkulus (jadi segala macam pelajaran tentang differensial terpakai di sini).

Meski bagian menjalankan neural network (istilahnya: inference) untuk mendapatkan hasil sangat sederhana, bagian yang sulit adalah melakukan trainingnya. Kesulitan training ini dari mulai pengumpulan data, pembersihan data, pemahaman teori matematika, resource hardware, dan waktu yang dibutuhkan tidak sebentar (bisa berbulan-bulan untuk LLM, kalau sekedar mengenali digit trainingnya dalam hitungan detik).

Model

Saya menyebutkan kata “model” beberapa kali tanpa memberi definisi, dalam AI, model meliputi banyak hal:

  • parameter neural network
  • struktur neural network (bisa berupa deskripsi lengkap tiap layernya atau kode program yang bisa melakukan inferensi berdasarkan parameter neural network)
  • data training
  • cara training (termasuk segala informasinya: misalnya berapa lama proses trainingnya, hyperparameternya, dsb)

Tapi dalam LLM, karena data training sangat besar, butuh waktu lama dan mahal, biasanya orang menerima bahwa sebuah model LLM hanya berupa file parameter dan struktur neural networknya saja.

Memproses Teks

Masalah pertama dalam membuat neural network yang memproses teks adalah: bagaimana mengubah kata-kata menjadi bilangan? lalu seperti apa outputnya neural network ini? karena output neural network biasanya hanya sekedar probabilitas sesuatu.

Pertama perlu dilihat dulu beberapa contoh pemrosesan teks yang ingin bisa kita lakukan:

  • Analisis sentimen, misalnya apakah sebuah posting sosmed nadanya positif atau negatif (atau mungkin kategori lain: apakah ini posting normal atau mengandung SARA, pornografi)
  • Merangkum paragraf menjadi kalimat.
  • Ekstraksi nama dari teks. Misalnya apakah sebuah posting sosmed menyebut merk tertentu (misalnya untuk filtering sosial media)
  • Menerjemahkan teks dari satu bahasa ke bahasa lain
  • Auto complete

Perhatikan bahwa sebagian besar yang disebutkan di atas (kecuali analisis sentimen): inputnya adalah sekuens (kata-kata dalam urutan tertentu), dan outputnya juga adalah sekuens. Neural network sederhana biasa tidak bisa menangani input dan output berbentuk sekuens.

Tokenization

Sebelum masuk ke pemrosesannya, mari pikirkan dulu bagian inputnya.

Cara yang dipilih saat ini agar efisien adalah dengan tokenization, sebuah kalimat dipotong menjadi token. Kata-kata atau suku kata yang umum akan direpresentasikan menjadi satu token. Ada banyak cara memotong input menjadi token, di sini saya memakai tokenizer yang dipakai di GPT-3.5/GPT-4 (yang dipakai juga oleh ChatGPT). Tokenizernya bisa dicoba sendiri di URL ini:

OpenAI Tokenizer

Contohnya seperti ini: “My name is Yohanes Nugroho”, akan ditokenisasi seperti ini: “My” “name” , dan “is” semuanya dihitung 1 token terpisah, dan nama saya dipotong jadi 6 token.

Mari kita coba kata “bananas”, ini cuma jadi 2 token (banana hanya 1 token).

Saya akan lompat sedikit ke pengetahuan praktis. Jadi kalau tahu bahwa input itu tidak diproses per huruf, apa gunanya untuk kita? kita jadi tahu keterbatasan pemrosesan model yang memakai tokenisasi.

Karena GPT tidak melihat input huruf per huruf, tapi per token, jika kita memiliki pertanyaan yang berhubungan dengan memproses huruf per huruf, hasilnya ada kemungkinan salah. Misalnya jika ditanya berapa N dalam banana, jawabanya 3. Tergantung kata yang ditanyakan, bisa benar, bisa salah. Contoh pemrosesan lain yang bisa salah: meminta GPT membalik kata, enkripsi sederhana (mengganti satu huruf dengan huruf lain).

https://chat.openai.com/share/6b8db102-8a8a-4cf4-af13-250ced26a6c1

Di masa depan, pemrosesan per karakter akan dilakukan, sehingga kesalahan seperti ini lebih kecil kemungkinannya. Tapi secara umum LLM juga tidak bisa berhitung, jadi jangan menggunakan LLM untuk sesuatu yang butuh perhitungan matematika.

LLM bisa menjawab berbagai penjumlah dan perkalian dengan benar, jika kebetulan ada di data training. Perhitungan sederhana sangat sering muncul di data training jadi sering benar. Tapi intinya: LLM tidak punya mekanisme melakukan komputasi aritmatika.

Saat ini berbagai implementasi LLM juga memiliki batasan “context-length”, yaitu total jumlah input dan output token. Jadi misalnya batasannya adalah 512 token, dan pertanyaan kita panjang (misalnya 400 token), maka jawabannya maksimum 112 token, antara akan sangat pendek atau terpotong. Saat ini GPT3.5 (versi gratis) maksimum hanya bisa memproses 4096 token (ada versi API yang bisa 32000 token, dan bahkan 128000 token untuk versi GPT-4 terbaru). Nanti akan saya jelaskan sedikit bagaimana batasan token ini diakali.

Embedding

Setelah mengolah input dalam bentuk token, proses yang dilakukan berikutnya adalah embedding, yaitu mengubah input menjadi bentuk vektor (atau sederhananya: array bilangan).

Saya berikan contoh sederhana seperti ini: kita diminta mengklasifikasikan berbagai benda. Ada banyak cara mengklasifikasinnya: dari harganya, dari kegunaannya, dari beratnya, dari warnanya, dsb. Ada ribuan cara untuk mengklasifikasikan ini.

Andaikan kita mengklasifikasikan hanya dari berat, ukuran, dan warna, kita bisa membentuk angka (100, 1, 0) dengan arti: berat sekali (100), ukurannya kecil (1) dan warnanya hitam (0, dengan skala 0 hitam sampai 255 putih).

Angka-angka tadi membentuk yang namanya “vektor”. Andaikan kita tidak diberitahu apa itu kategori yang dipakai, dan kita diberi 3 vektor dari 3 benda, pertama A: (100, 1, 0), B: (99,2,0), dan C (50, 50, 50). Kita langsung tahu bahwa A dan B itu pasti lebih serupa daripada A dengan C atau B dengan C, karena “jarak”-nya lebih kecil. Definisi “jarak” ini ada banyak (ada banyak formula yang bisa mendefinisikan jarak).

Sebuah neural network bisa diajari untuk mengklasifikasikan kata menjadi vektor .Kita tidak tahu apa kategori yang dipakai oleh neural network, tapi kata yang serupa vektornya akan serupa. Ini istilahnya adalah “word embedding”, representasi vektor dari suatu kata.

Tapi satu kata saja kadang kurang berguna, kita kadang ingin embedding untuk satu kalimat atau bahkan satu paragraf. Misalnya kalimat “Saya makan ikan laut” dan “seafood aku santap” akan memiliki vektor yang berdekatan (walau urutan kata dan pilihan katanya berbeda).

Kegunaan Embedding

Tergantung training yang dilakukan, kalimat “Joe Biden adalah Presiden Amerika” dan pertanyaan “Siapakah presiden Amerika” bisa memiliki vektor yang berdekatan. Ini bisa digunakan untuk mencari jawaban dari pertanyaan.

Berbagai perusahaan (termasuk juga OpenAI) menyediakan layanan membuat embedding. Kita kirimkan sebuah kalimat atau paragraf, dan hasilnya akan mendapatkan vektor (serangkaian angka). Kita bisa mengulangi ini untuk mendapatkan vektor setiap paragraf.

Setelah mendapatkan ini, kita bisa menyimpan vektornya dalam sebuah database (istilahnya vector database). Sekarang kita bisa melakukan pencarian pada dokumen yang kita miliki. Pencariannya dilakukan dengan mencari vektor yang jaraknya paling dekat, jadi hasilnya bukan sekedar berdasarkan pencocokan teks, tapi berdasarkan semantik.

Embedding ini juga dipakai di banyak aplikasi AI lain, misalnya di stable diffusion yang bisa menghasilkan gambar sesuai instruksi yang kita berikan. Bahkan di ChatGPT 4 yang baru, elemen gambar juga bisa diubah menjadi vector embedding, sehingga gambar bisa menjadi input.

Transformer

Ini topik tersulit yang sepertinya tidak akan bisa saya jelaskan secara sederhana, tapi akan saya coba. Mungkin di tulisan lain saya akan membahas teknisnya lebih dalam.

Salah satu alasah sulitnya memahami Transformer adalah: tidak intuitif. Untuk pemrosesan gambar, visualisasi mudah dilakukan, tapi tidak untuk teks.

Seperti telah dijelaskan, bahwa proses pertama adalah tokenization, dimana input diubah menjadi token. Berikutnya input ini masuk ke layer word embedding, yang akan menghasilkan vektor embedding. Setelah itu arsitektur self-attention yang akan bekerja.

Karena Transformer ini cukup rumit, mari kita mundur sejenak ke metode sebelumnya yang lebih sederhana RNN: recursive neural network. Jika kita punya sebuah kalimat dan ingin mengoutputkan kalimat lain (misalnya terjemahan), maka cara sederhana adalah: input seluruh kalimat, tapi fokus ke kata pertama, dan network akan mengeluarkan output kata pertama. Berikutnya kita masuk ke kata kedua, jalankan lagi neural network untuk kata kedua, dst.

Kelemahan RNN adalah: lambat, karena neural network ini perlu dijalankan berkali-kali untuk tiap input dalam kalimat. Selain itu cara tersebut ternyata kurang bagus hasilnya, karena kata-kata dalam sebuah kalimat saling berhubungan. Ada trik untuk menghubungkan output pertama dengan input berikutnya, tapi inipun tidak bisa menyelesaikan maslah karena jarak kata yang bisa jauh.

Sebuah kalimat bisa panjang, dan kata-kata di depan bisa berhubungan dengan belakang. Misalnya: “Pak Dodi sudah datang. <Teks panjang tentang tampang pak dodi>…. tadi dia hampir terlambat”. Kata “dia” di sini merujuk ke Pak Dodi, yang disebut di awal kalimat.

Transformer

Dalam model transformer, input diberi informasi posisi dalam teks (positional encoding). Jadi seluruh input bisa diproses sekaligus tanpa lewat neural network berkali-kali.

Transformer memakai mekanisme yang disebut dengan “self-attention” untuk “memahami” konteks dalam kalimat. Sederhananya seperti ini: layer embedding yang pertama sifatnya hanya statik, token diubah menjadi vektor tanpa memahami sebuah kalimat (hanya word embedding). Di layer transformer, embedding ini diproses lagi: untuk tiap “kata” dan akan berubah sesuai dengan konteks kalimatnya.

Di dalam transformer, akan dilakukan transformasi teks sesuai data training yang diberikan. Misalnya untuk penerjemahan, maka yang dilakukan adalah mentransformasi informasi dari satu bahasa ke bahasa lain. Untuk GPT yang dilakukan adalah melakukan “autocomplete” dari sebuah teks.

Output dari self-attention ini bentuknya vektor, yang kemudian perlu dikembalikan lagi dalam bentuk teks per kata dengan neural network lagi. Output dari transformer ini bentuknya adalah probabilitas, kita bisa mengambil kata dengan probabilitas paling tinggi, atau sedikit random (ini sebabnya outpunya tidak selalu sama). Setelah selesai mengoutputkan satu kata, kata ini dipakai untuk menentukan kata berikutnya yang akan dioutputkan.

Secara umum model transformer ini akan mengeluarkan output sepanjang konteksnya, tapi ada token khusus (stop token), yang akan menghentikan outputnya.

Large Language Model

Ketika model transformer diberikan input teks yang besar, maka model ini bisa “belajar” melakukan autocomplete berdasarkan data latihannya.

Model GPT pertama hanyalah autocomplete sederhana. Model GPT-1 ini terbuka (bisa didownload gratis), dan hanya memiliki 120 juta parameter. Model ini hanya dilatih dengan data dari buku yang jumlahnya terbatas.

Data yang diberikan untuk training GPT-1 hanya 40 GB dan parameter model di akhir hanya 120 juta parameter. Jika tiap parameter adalah floating point 16 bit (butuh 2 byte per parameter), maka parameternya total hanya 240 megabyte. Terlihat bahwa proses training ini seperti “mengkompres” input menjadi data yang kecil. Tentunya dengan data sekecil itu, model tidak akan bisa menghasilkan teks yang persis seperti inputnya.

Intinya: jangan berharap sebuah LLM bisa memberikan fakta yang sangat akurat. Pengetahuannya hanyalah hasil “mengkompres” data input yang sangat besar.

Sesuai namanya: Generative Pretrained Transformer. GPT ini menghasilkan (generate) teks, dengan data hasil yang sudah ditrain (pre-trained), dan menggunakan arsitektur Transformer.

GPT-1 ini bisa dicoba online di:

https://huggingface.co/openai-gpt

Contoh input yang bisa diberikan misalnya “The capital of Indonesia is ” dan GPT-1 akan melengkapi kalimatnya. Model ini bisa membuat kalimat, yang kadang koheren, tapi kadang tidak masuk akal.

GPT-1

GPT-2 memiliki hampir 1.2 milyar parameter, GPT-2 ini bisa melengkapi kalimat lebih panjang, dan hasilnya lebih masuk akal. GPT-2 bisa dicoba di:

Write With Transformer (huggingface.co)

GPT-2

Dari contoh di atas: intinya adalah model akan melakukan “autocomplete” berdasarkan latihan yang diberikan.

Perlu dicatat juga: semakin besar model, dan semakin besar data trainingnya, semakin “pintar” modelnya (prediksi teksnya akan lebih baik). Jadi saat ini banyak perusahan yang berlomba melakukan training. GPT-3 memiliki 175 milyar parameter. Tidak diketahui betapa besar parameter GPT-4, karena sifatnya tertutup dan OpenAI tidak memberikan informasinya.

Chat Model

Model yang sekedar melakukan autocomplete, bisa dilatih agar menghasilkan teks dalam format tertentu. Jadi setelah dilakukan training dengan banyak teks dari berbagai buku, berita, dsb, bisa dilakukan fine-tuning tahap berikutnya dengan data percakapan, misalnya bentuknya seperti ini:

Q: pertanyaan1
A: jawaban1

Q: pertanyaan2
A: jawaban2

Q: pertanyaan3
A: <autocomplete>

Dengan fine-tuning ini , auto complete akan berusaha melengkapi kalimatnya dengan jawaban.

Tentunya dari sekian kemungkinan jawaban random yang mungkin diberikan, ada yang lebih disukai manusia. Di sinilah RLHF (Reinforcement Learning from human feedback) berperan supaya jawabannya lebih sesuai harapan. Intinya: jika language model menghasilkan sekian teks, manusia akan memberikan ranking yang mana yang disukai. Neural network LLM akan ditune lagi supaya teks sejenis yang disukai manusia yang akan dioutputkan.

GPT-3.5 adalah GPT3 yang dilatih dengan kemampuan untuk melakukan chat.

RLHF untuk Llama2

Sebagai catatan: meskipun GPT ini tadinya hanya untuk menghasilkan teks, tapi ternyata bisa dipakai untuk task lain, misalnya untuk mengetahui apakah sebuah kalimat itu sentimennya positif atau negatif. Ini dimungkinkan dengan training teks seperti ini:

Teks: Filmnya bagus
Sentimen: positif
Teks: Adegannya lambat banget, sampe tidur
Sentimen: negatif
Teks: saya suka aktingnya
Sentimen: <autocomplete>

ini juga bisa dilakukan untuk task penerjemahan, meringkas teks, ekstraksi nama, semua bisa dilakukan dengan GPT.

Perlu diperhatikan bahwa GPT ini sejauh ini hanya merupakan model autocomplete saja, tidak memiliki kemampuan “berpikir” atau logika. Kadang kalimatnya sangat bagus sehingga terlihat memiliki logika, tapi kebetulan saja pertanyaannya ada di data training. Pertanyaan yang dibalik sering tidak bisa dijawab dengan benar.

The Reversal Curse:
LLMs trained on “A is B” fail to learn “B is A”

ChatGPT4 saat ini bisa menjawab dengan benar karena menggunakan Bing search, tapi ChatGPT 3 masih tetap salah, padahal bisa membetulkan typo Marry (seharusnya bukan dua “r”). Bahkan jika tanpa typo, jawabannya tetap sama.

Untuk saat ini, sampai ada perbaikan dalam LLM, kita perlu menggunakan teknik tertentu untuk mendapatkan jawaban yang kita inginkan, inilah yang sekarang disebut Prompt Engineering.

Teks Panjang

Ketika kita melakukan chat dengan ChatGPT, yang terjadi adalah: pertanyaan user dikirimkan, jawaban diterima. Lalu ketika user mengetikkan pertanyaan tambahan, maka pertanyaan awal dan jawaban awal tadi dikirimkan lagi plus pertanyaan baru. Jadi ChatGPT ini tidak punya “ingatan”, setiap kali harus diberi tahu percakapannya sejauh ini seperti apa.

Bagaimana ChatGPT dan sistem lain bisa memproses teks yang panjang kalau panjang konteksnya (jumlah token input + output) terbatas? Triknya adalah meringkas percakapan sebelumnya.

Jika chat sudah mendekati batas maksimum token, maka chat di awal akan diringkas. Misalnya “User tadi bertanya soal makanan di chiang mai, dan sudah dijawab dengan daftar makanan: a,b, dan c”. Tapi tentunya ringkasan ini lama-lama akan terlalu besar, dan akhirnya model akan mulai “lupa” dengan berbagai detail fakta yang ada.

Sebagai catatan: OpenAI memiliki model ChatGPT (untuk pengguna) dan API (untuk developer). OpenAI bisa mengubah-ubah parameter, dan panjang konteks ChatGPT sewaktu-waktu. Untuk API-nya, kita bisa memilih dengan tepat model yang mana dan panjang konteks berapa.

Saat ini GPT-4 memiliki panjang konteks 128K, artinya saya bisa mengirimkan buku singkat ke GPT-4, dan akan bisa menjawab (hampir) semua detail mengenai buku tersebut.

Kegunaan dan keterbatasan LLM

LLM adalah mesin autocomplete, yang (saat ini) tidak memproses input per karakter, tapi per token, lalu menghasilkan output berdasarkan parameter yang tersimpan (jadi tidak bisa tahu data terbaru, hanya data ketika dilatih), dan tidak bisa melakukan komputasi matematika.

LLM sangat bagus dalam mentransformasi teks dan mengahasilkan teks. Transformasi ini bisa berupa: translasi (antar bahasa manusia, atau format berbagai format teks seperti XML dan JSON), ekstraksi informasi, peringkasan teks.

LLM juga bisa kreatif menghasilkan berbagai jenis teks karena kebanyakan teks (cerita, buku, puisi, dan bahkan posting blog semacam ini), semuanya kontennya cukup mirip (cukup bisa diprediksi) dan LLM bisa membuat variasi secara random.

Meski tidak bisa berhitung, dan tidak bisa mengakses informasi terbaru, tapi jika LLM ini disambungkan dengan program lain atau jika dipanggil berkali-kali, maka kemampuannya menjadi sangat menakjubkan.

Saat ini hal yang akan saya bahas ini diimplementasikan di ChatGPT-4, dan tidak di ChatGPT 3.5.

Jika model diberi persoalan fisika, maka LLM bisa menghasilkan teks persamaan apa yang perlu digunakan, dan angka apa yang perlu dimasukkan ke rumus tersebut. Tapi LLM tidak bisa menghitung hasilnya. Ini sekedar menggunakan kemampuan LLM untuk translasi teks (dari soal cerita menjadi rumus)

Lalu LLM bisa diminta menerjemahkan rumus menjadi kode program. Kode program ini kemudian bisa dijalankan (misalnya kode Python), lalu outputnya dijadikan teks baru, yang dimasukkan ke LLM lagi untuk menghasilkan teks jawaban akhir.

Demikian juga dengan mencari informasi terbaru. Jika ditanya sesuatu (siapakah pacar Leonardi Di Caprio saat ini), maka pertanyaan ini bisa diubah dulu menjadi: “apakah pertanyaan berikut ini butuh informasi terbaru dari internet? : <pertanyaan> “. Model bisa mengkategorikan “ya” (karena ada kata “saat ini”). Ini menggunakan kemampuan LLM untuk mengkategorikan teks.

Jika jawaban adalah iya, maka pemrosesan berikutnya bisa dilakukan “Untuk pertanyaan berikut ini query apa yang bisa ditanyakan ke search engine untuk menjawab pertanyaannya: <pertanyaan>”. Di sini LLM berfungsi untuk jadi keyword generator.

Lalu output dari pertanyaan tersebut (berupa query Google), akan ditanyakan ke search engine. Hasil search engine (berupa teks), bisa ditanyakan ke LLM, seperti ini: “berikut ini adalah hasil pencarian internet tentang Leonardo DiCaprio: <teks hasil dari Google/Bing>, jawab pertanyaan berikut dari user:”.

Dengan menyambung input LLM, kita bisa mendapatkan output yang sangat cerdas. Menyambung input dan output ini dilakukan oleh kode program biasa jadi outputnya tidak murni hasil satu kali bertanya pada LLM saja walau seolah-olah di mata user, ini adalah hasil jawaban langsung dari LLM.

ChatGPT plusini saat ini sudah digabungkan dengan pengenalan suara, dan juga text to speech, serta Dall-E untuk menghasilkan gambar. ChatGPT sekarang bisa “mendengar”, “berbicara”, dan juga “menggambar”. Di masa depan kemampuannya mungkin akan lebih semakin baik.

Sebuah LLM bisa juga dilatih untuk satu topik tertentu, misalnya untuk menghasilkan kode program dalam bahasa pemrograman tertentu, atau untuk menjawab pertanyaan medis saja. Sebuah sistem bisa terdiri dari banyak LLM yang menjawab pertanyaan yang sama, lalu output terbaik diberikan ke user. Atau ada LLM pertama yang menentukan LLM mana yang akan menjawab sebuah pertanyaan dari user.

Mencoba sendiri LLM di rumah

Bagian inferensi LLM mudah dilakukan di rumah, atau bahkan di ponsel. Tapi bagian training butuh hardware yang mahal. Saat ini ada beberapa model yang sifatnya open source. Parameter-nya bisa didownload, kode programnya bisa didownload, dan bisa dijalankan di komputer lokal.

Training

Secara sederhana: training sulit dilakukan di rumah, bisa sih, tapi sangat terbatas jika dananya terbatas.

Mari kita ambil contoh model yang populer: Llama2 dari Facebook. Beberapa versi dirilis, mulai dari 7 milyar (7B) parameter, sampai 70 milyar. Melatih model dengan 70 milyar parameter butuh dana sekitar 2 juta USD, dan waktu beberapa belas hari. Bayangkan ChatGPT yang modelnya beberapa kali lipat lebih besar: butuh waktu berbulan-bulan (atau butuh komputer/GPU yang banyak jika ingin lebih singkat), butuh dana puluhan hingga ratusan milyar untuk melakukan training.

Kita bisa melatih language model dengan teks yang tidak terlalu besar, misalnya ada model TinyStories yang membuat cerita anak-anak sederhana (untuk anak usia 3-4 tahun). Model ini cuma punya 33 juta parameter, dan hanya dilatih pada teks yang relatif kecil.

https://huggingface.co/roneneldan/TinyStories-33M

Di model TinyStories yang kecil ini, misalnya kita menyebut nama “Indonesia”, maka itu akan dianggap nama orang atau benda, karena tidak pernah melihat itu di data trainingnya.

Kita bisa melakukan fine-tuning terhadap model yang besar ini supaya bisa lebih akurat memproses data tertentu. Training yang tidak butuh resource banyak adalah dengan metode LORA/qLORA, tapi ini pun tetap butuh graphic card yang cukup bagus.

Inference

Melakukan inference artinya sekedar menjalankan LLM. Dengan mendownload parameter (biasanya dari Huggingface) dan salah satu program untuk menjalankan modelnya (misalnya yang sering dipakai adalah llama.cpp), kita tinggal menjalankan programnya.

Tidak dibutuhkan komputer dengan spesifikasi sangat tinggi, karena sekarang kebanyakan model sudah ada versi yang sudah dikuantisasi (quantized). Tadi saya sebutkan bahwa parameter umumnya adalah floating point 16 bit (2 byte). Ini bisa dikurangi akurasinya menjadi 1 byte supaya ukurannya tinggal setengahnya. Bahkan ternyata jika dikurangi jadi 4 bit juga masih cukup akurat (jadi tinggal seperempat ukuran aslinya). Lalu ada pendekatan lain lagi: ternyata weight di bagian tertentu bisa dikurangi jadi 2 bit, dan sisanya 4 bit.

Asalkan kita memiliki memori yang cukup besar, maka llama.cpp bisa berjalan cukup bagus. Berikut ini contoh saya menjalankan llama.cpp, di mini PC dengan prosessor Intel N100 dan RAM 16GB, harga mini PC (sudah termasuk RAM dan storagenya) ini hanya 120 USD saja (kurang dari 2 juta rupiah):

Model yang saya jalankan adalah mistral 7B (7 milyar parameter) yang sudah dikuantisasi (nama filenya mistral-7b-v0.1.Q5_0.gguf). Ukuran file parameter 4.7GB. Perhatikan bahwa teks yang dihasilkan ini cukup baik (memiliki struktur bahasa Inggris yang benar), walau beberapa fakta ngawur.

Masih banyak model lain yang bisa dicoba, misalnya ada yang khusus dilatih menerjemahkan teks manusia menjadi kode program.

Contoh menjalankan llama.cpp dengan Mistral

Kode llama.cpp dirancang supaya bisa berjalan cepat di PC biasa, tapi jadi agak rumit. Jika ingin memahami setiap langkah dengan lebih baik, kode llama2.c lebih mudah dibaca. Kodenya kurang dari 1000 baris C, dan tidak memakai library apapun. Jumlah baris itu termasuk juga kode untuk meload file parameter dari file, dan juga semua fungsi dasar (seperti perkalian matriks).

Jika ingin mencari aplikasi yang lebih gampang dipakai, ada LM Studio, atau yang open source ada ollama dan ollama-webui.

Jika ingin melihat pembahasan mendalam versi video, ada video dari penulis llama2.c (Andrej Karpathy). Beberapa link lain untuk belajar transformer yang menurut saya menarik:

Penutup

LLM ini mungkin akan menjadi jalan untuk AGI, mungkin juga tidak. Tapi yang jelas masih banyak pengembangan LLM di masa depan:

  • Training data yang lebih besar masih bisa dilakukan, karena sejauh ini: semakin besar jumlah data training dan semakin besar jumlah parameter, modelnya semakin pintar
  • LLM bisa dihubungkan dengan berbagai sistem lain supaya lebih pintar

Masih banyak juga tantangan lain, baik teknis maupun non teknis:

  • Bagaimana membuat AI yang tidak mudah dihack (misalnya dengan prompt injection attack)
  • Bagaimana kita bisa yakin bahwa hasilnya benar
  • Bagaimana agar output AI netral tidak mengikuti pandangan politik tertentu?
  • Bagaimana supaya AI tidak membunuh seluruh umat manusia?
  • Jika AI bisa mengerjakan banyak hal, apa yang akan dilakukan manusia?

Berbagai konsep transformer sudah ada sejak bertahun-tahun yang lalu, tapi ChatGPT merupakan teknologi yang masih sangat baru, baru akan berusia setahun akhir bulan ini. Masih banyak pengembangan yang bisa dinantikan di masa depan. Mari kita bersiap menghadapi masa depan dengan memahami teknologi ini.

Satu tanggapan pada “Mengenal Transformer, LLM, dan ChatGPT”

Tinggalkan Balasan

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.