DEV Community

Zahir Hadi Athallah
Zahir Hadi Athallah

Posted on

Bisakah Model 64 Juta Parameter Belajar Bernalar? - Membangun Model Bahasa 64M Parameter dari Nol

Kalau ngomongin model bahasa sekarang, yang kebayang biasanya model dengan ukuran besar. Ratusan juta, miliaran, bahkan puluhan atau ratusan miliar parameter sudah jadi hal yang biasa ketika orang membahas kemampuan reasoning, coding, atau instruction following.

Dari situ saya justru penasaran dengan arah yang sebaliknya.

Bagaimana kalau saya mencoba membuat model bahasa yang sangat kecil, di bawah 100 juta parameter?

Apakah model sekecil itu masih bisa belajar bahasa dengan baik? Bisa mengikuti instruksi? Bisa belajar matematika dasar? Bisa reasoning? Dan apakah reinforcement learning benar-benar bisa membantu model sekecil ini?

Dari pertanyaan itu, saya mulai membangun Klyra-64M.

Klyra adalah proyek riset akademik yang saya kerjakan sebagai mahasiswa Teknik Informatika di Politeknik Negeri Jakarta. Model ini saya bangun dari random initialization, jadi bukan mengambil model bahasa yang sudah pintar lalu di-fine-tune. Benar-benar mulai dari bobot acak, alias from scratch.

Saya mulai dari model yang pada dasarnya belum tahu apa-apa, lalu melatihnya sedikit demi sedikit sampai akhirnya bisa mengikuti instruksi, melakukan reasoning sederhana, dan bahkan saya bawa sampai eksperimen reinforcement learning dan policy distillation.

Di blog ini, kita akan kupas tuntas semuanya.


Mulai Membangun

Hal pertama yang menurut saya penting untuk dijelaskan adalah Klyra benar-benar dimulai dari random weights.

Pada awal training, bobot model benar-benar acak. Jadi model belum tahu struktur bahasa, belum paham bagaimana kalimat dibentuk, belum tahu cara menjawab pertanyaan, apalagi melakukan reasoning.

Setelah melakukan riset dan mencari referensi, saya menemukan repository open-source bernama MiniMind. Repository ini menyediakan implementasi model bahasa kecil beserta arsitektur awal dan pipeline yang cukup enak dipelajari.

Untuk Klyra, saya memakai konfigurasi dasar MiniMind-3 Dense dengan ukuran sekitar 64 juta parameter, lalu saya lanjutkan dengan pipeline training dan eksperimen saya sendiri.

Konfigurasi utamanya kurang lebih seperti ini:

Komponen Klyra-64M
Parameter 63.912.192
Transformer layers 8
Hidden size 768
Attention heads 8
KV heads 4
Vocabulary ~6.400
Context training 1.024 token

Jadi secara nyata jumlah parameter uniknya sekitar 63,9 juta, lalu saya bulatkan menjadi 64M.


Pretraining

Tahap pertama yang saya lakukan adalah mengajarkan bahasa kepada model.

Untuk tahap pretraining, saya menggunakan:

  • openbmb/Ultra-FineWeb-L1
  • konfigurasi CC-MAIN-2025-30

Pada tahap ini, Klyra melihat sekitar 1 miliar token.

Konfigurasi utama yang saya pakai:

Sequence length : 512
Peak LR         : 5e-4
Warmup          : 2%
Scheduler       : Cosine
Weight decay    : 0.1
Precision       : BF16
Enter fullscreen mode Exit fullscreen mode

Hasil akhirnya:

Validation Loss : 2.3649
Perplexity      : 10.643
Enter fullscreen mode Exit fullscreen mode

Tapi buat saya, bagian paling menarik sebenarnya bukan angka loss atau perplexity-nya.

Yang lebih menarik adalah melihat model yang awalnya menghasilkan token acak mulai pelan-pelan membentuk pola bahasa yang masuk akal.

Kurang lebih prosesnya seperti ini:

Random token
    ↓
Mulai mengenali pola kata
    ↓
Mulai membentuk struktur kalimat
    ↓
Bahasa mulai terbentuk
Enter fullscreen mode Exit fullscreen mode

Checkpoint dari tahap pretraining ini saya beri nama Klyra-64M-Base.

Tersedia di Hugging Face:

Klyra-64M-Base


Midtraining

Setelah tahap pretraining, Klyra sudah mulai bisa menghasilkan bahasa. Tapi saya tidak langsung masuk ke instruction tuning atau SFT.

Saya ingin memperkuat knowledge dan memperluas distribusi datanya terlebih dahulu.

Jadi saya melanjutkan training dengan sekitar 2 miliar token tambahan.

Dataset Token
DCLM-Edu 720M
FineWeb-Edu 480M
Stack-Edu 500M
FineMath 120M
InfiMM-WebMath 80M
Cosmopedia v2 100M
Total ~2B

Kalau digabung dengan pretraining sebelumnya, berarti pada titik ini Klyra sudah melihat sekitar 3 miliar token.

Pada tahap ini saya juga menaikkan context length dari 512 menjadi 1024 token, lalu menurunkan learning rate menjadi:

Peak LR : 1.5e-4
Enter fullscreen mode Exit fullscreen mode

Tujuannya bukan cuma membuat model semakin fasih, tapi juga memberi distribusi data yang lebih beragam. Di dalam campuran datanya ada konten edukasi, web text, coding, matematika, sampai data edukasi sintetis.

Checkpoint hasil tahap ini saya simpan dengan nama Klyra-64M-Midtrain.

Tersedia di Hugging Face:

Klyra-64M-Midtrain


SFT

Setelah midtraining, Klyra masih merupakan base language model.

Base model pada dasarnya belajar memprediksi token berikutnya. Jadi walaupun model sudah mulai paham pola bahasa, belum tentu dia paham bahwa ketika saya memberikan sebuah instruksi, dia harus menjawab seperti seorang assistant.

Misalnya saya memberi:

Explain binary search.

Model belum tentu langsung tahu pola respons yang saya inginkan.

Karena itu saya masuk ke tahap Supervised Fine-Tuning (SFT).

Dataset utama yang saya gunakan adalah HuggingFaceTB/smol-smoltalk.

Dataset ini kemudian saya filter lagi supaya data yang dipakai lebih bersih dan sesuai dengan format training.

Setelah filtering:

Training examples : 226.049
Evaluation        : 992
Enter fullscreen mode Exit fullscreen mode

Training dilakukan selama dua epoch menggunakan assistant-only loss.

Epoch Validation Loss Perplexity
1 1.1315 3.100
2 0.9828 2.672

Hasilnya cukup bagus, dan checkpoint ini kemudian saya beri nama Klyra-64M-Instruct.

Di tahap ini perbedaannya mulai terasa. Model yang sebelumnya lebih seperti mesin pelanjut teks mulai memahami pola percakapan:

User
  ↓
Instruction
  ↓
Assistant response
Enter fullscreen mode Exit fullscreen mode

Tapi di sini saya menemukan satu masalah yang lumayan penting.

Bisa menjawab instruksi ternyata belum tentu berarti bisa reasoning.


Reasoning

Saya sempat mencoba pendekatan reasoning yang lebih kompleks, dan ternyata hasilnya tidak terlalu bagus.

Model kecil seperti Klyra cukup sensitif terhadap distribusi training. Kalau saya terlalu agresif memasukkan reasoning data, kemampuan yang sebelumnya sudah terbentuk bisa ikut berubah, bahkan menurun.

Jadi akhirnya saya memilih pendekatan yang lebih sederhana.

Saya membuat tahap Klyra-64M-Reasoning-Fundamentals.

Tujuannya bukan membuat model langsung pintar mendadak atau langsung bisa menyelesaikan soal kompetisi yang rumit. Saya mulai dari hal-hal yang jauh lebih dasar:

  • penjumlahan,
  • pengurangan,
  • unit rate,
  • reasoning pendek,
  • logika sederhana,
  • pengetahuan sains dasar,
  • algoritma dasar.

Komposisi data training-nya:

18.000 reasoning examples
12.000 general instruction replay
---------------------------------
30.000 total
Enter fullscreen mode Exit fullscreen mode

Kenapa masih ada 12.000 general instruction replay?

Karena saya tidak ingin reasoning training membuat Klyra lupa bagaimana cara menjadi assistant. Dengan kata lain, saya mencoba menjaga supaya model tidak terlalu mudah mengalami catastrophic forgetting.

Jadi sebagian data general instruction sengaja saya putar lagi selama training.


Apakah Reasoning-nya Benar-Benar Muncul?

Setelah training selesai, saya mulai mengetesnya dengan beberapa soal sederhana.

Misalnya:

What is 17 + 28?
Enter fullscreen mode Exit fullscreen mode

Klyra menjawab:

<think>
In the ones place, 7 + 8 = 15; write 5 and carry 1.
In the tens place, 1 + 2 + carry 1 = 4.
So 17 + 28 = 45.
</think>

Final answer: 45.
Enter fullscreen mode Exit fullscreen mode

Saya coba soal unit rate:

If 3 notebooks cost $12,
how much do 5 notebooks cost at the same rate?
Enter fullscreen mode Exit fullscreen mode

Klyra:

$12 ÷ 3 = $4 per item.
5 × $4 = $20.

Final answer: $20.
Enter fullscreen mode Exit fullscreen mode

Kemudian saya coba logika sederhana:

All bloops are razzies.
Some razzies are lazzies.

Does it necessarily follow that some bloops are lazzies?
Enter fullscreen mode Exit fullscreen mode

Jawabannya:

No.
Enter fullscreen mode Exit fullscreen mode

Dengan penjelasan bahwa razzies yang merupakan lazzies tidak harus merupakan bloops.

Untuk model dengan ukuran sekitar 64 juta parameter, hasil seperti ini menurut saya lumayan menarik.

Tapi tentu belum sempurna.

Saya juga mulai melihat keterbatasannya. Reasoning Klyra masih belum stabil. Kadang dua soal dengan konsep yang sangat mirip bisa menghasilkan jawaban yang berbeda hanya karena struktur kalimatnya sedikit berubah.

Jadi saya belum menganggap Klyra sebagai model reasoning yang matang.

Dan justru di situlah eksperimennya mulai terasa menarik.


Bereksperimen dengan Reinforcement Learning

Setelah Reasoning Fundamentals, saya mulai penasaran lagi.

Apakah reinforcement learning bisa memperkuat kemampuan model ini?

Akhirnya saya membuat tiga cabang specialist:

Klyra-64M-Reasoning-Fundamentals
        │
        ├── Reasoning RL
        ├── Instruction-Following RL
        └── General-Capability RL
Enter fullscreen mode Exit fullscreen mode

Saya menggunakan pendekatan GRPO-style training dengan reward yang sebisa mungkin bisa diverifikasi secara programatik.

Reasoning RL

Untuk reasoning, saya membaginya menjadi dua tahap.

Reasoning RL1

Komposisi datanya:

1.400 GSM8K
400 SVAMP
700 RuleTaker depth-1
----------------------
2.500 prompts
Enter fullscreen mode Exit fullscreen mode

Kemudian dilanjutkan ke:

Reasoning RL2

1.200 GSM8K medium
200 SVAMP
600 RuleTaker depth-2/depth-3
-----------------------------
2.000 prompts
Enter fullscreen mode Exit fullscreen mode

Di sini saya mencoba membuat reward berdasarkan jawaban yang bisa diverifikasi.

Jadi model bukan cuma diminta menghasilkan teks reasoning yang kelihatan meyakinkan, tapi reasoning tersebut tetap harus mengarah ke jawaban yang benar.


Instruction-Following RL

Cabang kedua saya fokuskan ke kemampuan mengikuti constraint.

Saya menggunakan sekitar 2.000 verified IFEval/RLVR-style prompts.

Constraint-nya bermacam-macam. Misalnya:

  • jawab dengan format tertentu,
  • jangan gunakan kata tertentu,
  • gunakan JSON,
  • gunakan jumlah kalimat tertentu,
  • gunakan kapitalisasi tertentu,
  • jangan gunakan koma.

Kalau constraint terpenuhi, model mendapatkan reward.

Tujuannya sederhana, saya ingin model kecil ini tidak cuma menjawab, tapi benar-benar bisa mengikuti instruksi dengan lebih disiplin.


General-Capability RL

Cabang ketiga saya gunakan untuk kemampuan umum.

Datanya berasal dari training split beberapa dataset:

Dataset Prompt
ARC-Easy 700
PIQA 900
OpenBookQA 500
CommonsenseQA 900
Total 3.000

Di sini saya hanya menggunakan training split. Test split tetap saya simpan untuk evaluasi.


Sekarang Saya Punya Tiga Specialist

Setelah itu muncul masalah baru.

Saya punya:

  • reasoning specialist,
  • instruction-following specialist,
  • general-capability specialist.

Tapi tentunya saya tidak ingin berakhir dengan tiga model berbeda.

Saya ingin ketiga kemampuan itu kembali masuk ke satu model 64M.

Dari situ saya mencoba pendekatan Online Policy Distillation (OPD).

Kurang lebih strukturnya seperti ini:

                  Reasoning RL2
                      │
                      │
IF RL ───────────► OPD Student ◄──────── General RL
                      │
                      ▼
                Klyra-64M-RL-OPD
Enter fullscreen mode Exit fullscreen mode

Student-nya sendiri tidak dimulai dari salah satu specialist.

Saya memulai student lagi dari Klyra-64M-Reasoning-Fundamentals.

Lalu student belajar dari trajectory specialist yang berhasil diverifikasi.

Training OPD dilakukan selama 500 steps.

Konfigurasinya:

Batch size     : 4
Peak LR        : 8e-6
Weight decay   : 0.01
Teachers       : 3 specialist policies
Enter fullscreen mode Exit fullscreen mode

Secara teori saya ingin mendapatkan:

Reasoning
+
Instruction Following
+
General Capability
Enter fullscreen mode Exit fullscreen mode

di dalam satu model.

Ternyata hasilnya tidak sesederhana itu, hehe.


Reinforcement Learning Ternyata Tidak Otomatis Membuat Model Lebih Pintar

Setelah RL-OPD selesai, saya melakukan beberapa tes.

Dan ada beberapa hasil yang cukup bikin saya garuk kepala.

Contohnya:

What is the chemical formula for water?
Enter fullscreen mode Exit fullscreen mode

Reasoning-Fundamentals bisa menjawab:

H2O
Enter fullscreen mode Exit fullscreen mode

Tapi RL-OPD pernah menjawab:

The chemical formula for water is water.
Enter fullscreen mode Exit fullscreen mode

Saya juga mencoba:

A store has 36 red pens and twice as many blue pens.
It sells 15 blue pens.
How many blue pens remain?
Enter fullscreen mode Exit fullscreen mode

Jawaban yang benar seharusnya:

36 × 2 = 72
72 - 15 = 57
Enter fullscreen mode Exit fullscreen mode

Tapi model malah menghasilkan:

36 - 15 = 22
Enter fullscreen mode Exit fullscreen mode

Bahkan untuk instruksi sederhana seperti:

Reply with exactly this text and nothing else:
Klyra is good
Enter fullscreen mode Exit fullscreen mode

model RL-OPD juga masih bisa gagal mengikutinya.

Di sini saya mulai melihat sesuatu yang menurut saya lumayan penting.

Reinforcement learning tidak otomatis membuat semua kemampuan model meningkat.

Terutama untuk model sekecil ini.

Kalau kapasitas model terbatas, meningkatkan satu capability bisa saja mengganggu capability yang lain.

Dan menurut saya, justru ini salah satu hasil paling menarik dari seluruh eksperimen.


Lalu Bagaimana Kalau Dilihat dari Benchmark?

Saya kemudian menguji tiga checkpoint utama Klyra menggunakan:

  • ARC-Easy
  • PIQA
  • OpenBookQA
  • HellaSwag
  • Social-IQA

Klyra Benchmark

Kalau dilihat dari nilai rata-ratanya:

Instruct               : 36.63
Reasoning Fundamentals : 36.92
RL-OPD                 : 36.79
Enter fullscreen mode Exit fullscreen mode

Reasoning Fundamentals meningkatkan mean sekitar +0,29 percentage point dibanding Instruct.

Sedangkan RL-OPD turun sekitar -0,13 percentage point dibanding Reasoning Fundamentals.

Jadi secara benchmark umum, RL-OPD sebenarnya tidak jatuh jauh. Kemampuan umumnya kurang lebih masih bertahan.

Bahkan RL-OPD mencatat skor Klyra tertinggi pada:

PIQA       : 59.36
Social-IQA : 35.98
Enter fullscreen mode Exit fullscreen mode

Tapi secara aggregate score, hasilnya tetap belum mengalahkan Reasoning-Fundamentals.

Karena itu, sampai sekarang checkpoint yang paling saya rekomendasikan masih Klyra-64M-Reasoning-Fundamentals.


Apakah Klyra Model Terbaik di Bawah 100M Parameter?

Jawabannya tentu saja belum.

Saya juga tidak mau membuat klaim yang hasil benchmark-nya memang belum mendukung.

Ada beberapa model sub-100M lain yang melaporkan hasil lebih tinggi pada benchmark yang overlap, misalnya:

  • Kiyo-65M,
  • Supra-50M,
  • cRia-LM-75M,
  • Rose,
  • tinctura,
  • Surjo,
  • Veyra,
  • dan beberapa model lainnya.

Tapi ketika membandingkan model-model tersebut, saya menemukan sesuatu yang menurut saya justru lebih menarik.

Klyra dilatih dengan jumlah token yang jauh lebih sedikit.

Saat ini Klyra baru melihat sekitar ~3B cumulative pretraining + midtraining tokens.

Model Tokens

Kiyo menurut saya salah satu perbandingan yang paling menarik.

Jumlah parameternya hampir sama:

Klyra : ~63.9M
Kiyo  : ~65.0M
Enter fullscreen mode Exit fullscreen mode

Tapi training exposure-nya:

Klyra : ~3B
Kiyo  : ~80B
Enter fullscreen mode Exit fullscreen mode

Jadi Kiyo sudah melihat sekitar 26x lebih banyak token.

Dari sini saya mulai berpikir kalau bottleneck Klyra saat ini mungkin bukan cuma ukuran model.

Bisa jadi Klyra memang masih undertrained.


Data Itu Ternyata Penting Banget

Awalnya saya cukup banyak memikirkan hal-hal seperti:

  • parameter count,
  • architecture,
  • learning rate,
  • optimizer,
  • scheduler.

Dan ya, semuanya memang penting.

Tapi setelah melewati semua eksperimen ini, saya justru semakin merasa kalau data curriculum punya pengaruh yang luar biasa besar.

Contohnya saat Reasoning Fundamentals.

Daripada menggunakan reasoning data 100%, saya mencampurnya dengan:

reasoning data
+
general instruction replay
Enter fullscreen mode Exit fullscreen mode

Hasilnya terasa jauh lebih sehat.

Model bisa mendapat kemampuan reasoning tambahan tanpa langsung kehilangan kemampuan yang sebelumnya sudah terbentuk.

Sebaliknya, ketika specialization terlalu agresif, behavior model bisa berubah cukup cepat.

Untuk model kecil, efek ini menurut saya terasa jauh lebih jelas.

Kapasitasnya terbatas.

Kalau terlalu banyak capability dipaksa masuk tanpa strategi retention yang bagus, kemampuan lain bisa ikut tergeser.

Ini salah satu pelajaran terbesar yang saya dapat dari Klyra.


Kenapa Tidak Langsung Membuat Model 1B atau Lebih Besar?

Karena justru batasan 64M ini adalah bagian dari eksperimennya.

Kalau saya langsung menggunakan model miliaran parameter, tentu kemungkinan besar hasil akhirnya akan jauh lebih kuat.

Tapi pertanyaan yang ingin saya jawab bukan:

"Bagaimana cara membuat model paling pintar?"

Pertanyaannya lebih ke:

"Seberapa jauh model sekecil ini bisa saya dorong?"

Model kecil juga membuat proses eksperimen jauh lebih masuk akal buat saya.

Training lebih murah, inference lebih ringan, benchmark lebih cepat, dan ketika saya mengubah satu bagian pipeline, efeknya lebih mudah kelihatan.

Buat saya, itu yang membuat Klyra menarik sebagai sebuah eksperimen.


Apa Selanjutnya?

Setelah melihat semua hasil ini, saya justru belum terlalu tertarik langsung menambah jumlah parameter.

Saya lebih penasaran dengan satu hal:

Apa yang terjadi kalau Klyra tetap 64M, tapi dilatih jauh lebih lama?

Saat ini Klyra baru melihat sekitar 3B tokens.

Saya ingin mencoba mendorongnya ke jumlah token yang lebih besar, misalnya 5B, 10B, bahkan 20B+ cumulative training tokens, tanpa mengubah ukuran model.

Kalau foundation-nya sudah lebih kuat, baru saya ingin mencoba lagi beberapa eksperimen seperti:

  • reasoning training yang lebih matang,
  • reinforcement learning,
  • reward design yang lebih bagus,
  • distillation yang lebih seimbang,
  • coding specialization,
  • tool use,
  • longer context,
  • sampai agentic capability.

Menurut saya, eksperimen seperti itu justru akan jauh lebih menarik daripada langsung memperbesar model.


Jadi, Bisakah Model 64 Juta Parameter Belajar Bernalar?

Setelah semua eksperimen ini, jawaban saya:

Bisa, tapi kemampuannya masih terbatas dan cukup rapuh.

Klyra bisa mempelajari reasoning sederhana.

Ia bisa melakukan beberapa operasi aritmetika, memahami unit rate, menjawab beberapa soal logical deduction, dan pada beberapa soal bahkan menghasilkan reasoning step-by-step yang masuk akal.

Tapi perubahan kecil pada struktur pertanyaan masih bisa membuatnya gagal.

Dari percobaan RL, saya juga belajar kalau reinforcement learning bukan sebuah metode ajaib yang langsung membuat model jadi jauh lebih pintar.

Kadang satu capability naik.

Kadang capability lain justru turun.

Dan buat saya, justru bagian seperti ini yang bikin proyek Klyra seru.

Saya tidak membuat Klyra untuk membuktikan bahwa model 64M bisa menggantikan model miliaran parameter.

Saya membuatnya karena saya ingin tahu, kira-kira :

Seberapa banyak kemampuan yang sebenarnya bisa dibangun di dalam model sekecil ini?

Dan sejauh ini, rasanya saya baru mulai menggaruk permukaannya saja.


Penutup

Kalau ada satu hal yang paling saya rasakan selama mengerjakan Klyra, mungkin ini:

membangun model bahasa dari nol ternyata bukan cuma soal membuat model yang mengerti bahasa dan instruksi kita

Ada banyak hal kecil yang baru terasa ketika benar-benar dijalani sendiri. Mulai dari memilih data, menyusun curriculum, melihat model tiba-tiba lebih pintar di satu sisi tapi malah lupa sesuatu di sisi lain, sampai bengong ketika hasil RL yang secara teori harusnya lebih bagus ternyata jawabannya malah lebih aneh, wkwk.

Tapi justru karena itu proyek ini terasa seru.

Setiap checkpoint punya ceritanya sendiri. Ada yang berhasil, ada yang gagal, dan ada juga eksperimen yang hasil akhirnya tidak sesuai ekspektasi tetapi malah memberi insight baru.

Saya masih ingin melihat seberapa jauh model 64M ini bisa berkembang kalau diberi data yang lebih banyak, training yang lebih matang, dan eksperimen yang lebih rapi.

Mungkin nantinya hasilnya tetap mentok.

Mungkin juga ada sesuatu yang menarik setelah 10B atau 20B token.

Saya sendiri belum tahu.

Dan menurut saya, justru itu bagian terbaiknya.

Klyra-64M hanya proyek iseng semata. Sampai ketemu di eksperimen berikutnya. :)

Top comments (0)