Author: informatika

C++ untuk Pemrograman ML & AI

C++ telah berkembang jauh sejak pertama kali diluncurkan sebagai perluasan bahasa C yang mendukung pendekatan berorientasi objek pada tahun 1980-an. Evolusi C++ beberapa dasawarsa terakhir membuat bahasa ini menjadi bahasa yang lebih menarik dan modern. Versi C++11 membawa fitur modern seperti auto, lambda, dan smart pointer; lalu C++20 memperkenalkan modul, pengelolaan range, dan fungsi coroutines; hingga C++23 yang menangani data berdimensi banyak untuk pengelolaan tensor dan matriks. Versi C++26 yang masih dalam perancangan disusun dengan tambahan concurrency dan parallelism, reflection (semacam introspection), dan pattern matching, yang membuat C++ menjadi lebih dinamis.

Kemajuan fitur-fitur itu membuat C++ makin mudah digunakan dalam pengembangan sistem yang berkaitan dengan pembelajaran mesin (machine learning), pembelajaran mendalam (deep learning), dan kecerdasan buatan (AI). Bahasa ini memberikan kendali penuh atas penggunaan memori dan sumber daya komputasi, sangat penting untuk aplikasi yang memerlukan kecepatan tinggi dan efisiensi. Walaupun tidak memiliki pustaka bawaan untuk ML atau AI, C++ memberi dasar yang kuat untuk membangun pustaka atau sistem AI yang stabil, cepat, dan siap digunakan dalam skala besar.

Bahasa semacam Python yang telah menjadi pilihan banyak programmer ML/AI, tetap menjadi pilihan utama untuk belajar dan membuat prototipe karena sintaksnya yang ringkas dan pustaka siap pakainya yang sangat banyak. Namun, dalam pengembangan perangkat lunak AI berkinerja tinggi, Python biasanya hanya menjadi antarmuka depan saja, sementara proses yang berat dijalankan di balik layar oleh sistem yang ditulis dalam C++. Pemahaman atas kedua bahasa ini sangat berguna: Python untuk eksperimen dan pengujian cepat, C++ untuk penerapan nyata yang efisien dan kuat.

Pemanfaatan C++ dalam dunia AI dapat dilihat pada berbagai perangkat lunak ternama seperti TensorFlow, PyTorch (LibTorch), TensorRT, ONNX Runtime, hingga OpenCV. Semuanya menggunakan C++ di bagian dalamnya untuk menjamin kecepatan dan ketepatan proses.

Di sisi lain, C++ tetap dapat digunakan untuk belajar, bereksperimen, atau secara profesional membangun berbagai model kecerdasan buatan, termasuk regresi linear, klasifikasi, hingga jaringan syaraf. Ini berguna bagi kita yang ingin bereksplorasi dengan C++ untuk memahami konsep AI dari dasar, atau ingin membuat sistem AI kecil yang dapat dijalankan di perangkat terbatas.

Salah satu contoh yang menarik adalah penerapan jaringan syaraf tiruan sederhana, yaitu MLP satu lapis tersembunyi, dengan menggunakan C++ murni. Dengan hanya mengandalkan vektor dari STL dan fungsi-fungsi matematika dasar, kita dapat membangun sistem yang belajar menyelesaikan masalah XOR.

// Kode MLP XOR
// Copyrights (c) Informatika.AI, 2025

#include <vector>
#include <cmath>
#include <random>
#include <print>
#include <cstdio>

using namespace std;

// Sigmoid dan turunannya
float sigmoid(float x) {
    return 1.0f / (1.0f + exp(-x));
}

float sigmoid_derivative(float x) {
    float s = sigmoid(x);
    return s * (1.0f - s);
}

// Acak bobot awal
float rand_weight() {
    static mt19937 rng(42);
    static uniform_real_distribution<float> dist(-1.0f, 1.0f);
    return dist(rng);
}

// Struktur data untuk satu sample
struct Sample {
    vector<float> input;
    float target;
};

int main() {
    vector<Sample> dataset = {
        {{0.0f, 0.0f}, 0.0f},
        {{0.0f, 1.0f}, 1.0f},
        {{1.0f, 0.0f}, 1.0f},
        {{1.0f, 1.0f}, 0.0f}
    };

    constexpr float lr = 0.1f;
    constexpr int epochs = 10000;

    // Inisialisasi bobot
    float w_ih[2][2]; // 2 input → 2 hidden
    float b_h[2];     // bias hidden
    float w_ho[2];    // hidden → output
    float b_o;        // bias output

    for (int i = 0; i < 2; ++i) {
        b_h[i] = rand_weight();
        w_ho[i] = rand_weight();
        for (int j = 0; j < 2; ++j)
            w_ih[j][i] = rand_weight();
    }
    b_o = rand_weight();

    for (int epoch = 0; epoch < epochs; ++epoch) {
        for (const auto& sample : dataset) {
            // Forward
            float h_raw[2], h_act[2];
            for (int i = 0; i < 2; ++i) {
                h_raw[i] = b_h[i];
                for (int j = 0; j < 2; ++j)
                    h_raw[i] += sample.input[j] * w_ih[j][i];
                h_act[i] = sigmoid(h_raw[i]);
            }

            float o_raw = b_o;
            for (int i = 0; i < 2; ++i)
                o_raw += h_act[i] * w_ho[i];
            float o_act = sigmoid(o_raw);

            float error = sample.target - o_act;
            float d_o = error * sigmoid_derivative(o_raw);
            float d_h[2];
            for (int i = 0; i < 2; ++i)
                d_h[i] = d_o * w_ho[i] * sigmoid_derivative(h_raw[i]);

            // Update bobot
            for (int i = 0; i < 2; ++i)
                w_ho[i] += lr * d_o * h_act[i];
            b_o += lr * d_o;

            for (int i = 0; i < 2; ++i) {
                for (int j = 0; j < 2; ++j)
                    w_ih[j][i] += lr * d_h[i] * sample.input[j];
                b_h[i] += lr * d_h[i];
            }
        }

        if (epoch % 1000 == 0)
            print("Epoch {}\n", epoch);
    }

    // Evaluasi
    print("\n=== Evaluasi XOR ===\n");
    for (const auto& sample : dataset) {
        float h_act[2];
        for (int i = 0; i < 2; ++i) {
            float h_raw = b_h[i];
            for (int j = 0; j < 2; ++j)
                h_raw += sample.input[j] * w_ih[j][i];
            h_act[i] = sigmoid(h_raw);
        }

        float o_raw = b_o;
        for (int i = 0; i < 2; ++i)
            o_raw += h_act[i] * w_ho[i];
        float o_act = sigmoid(o_raw);

        print("Input: {} {} → Output: {:.4f} (Target: {})\n",
              int(sample.input[0]), int(sample.input[1]), o_act, int(sample.target));
    }

    return 0;
}

Dalam program ini, kita dapat melihat bagaimana data diproses maju (forward pass), kesalahan dihitung, lalu bobot diperbarui melalui proses penurunan gradien (backpropagation). Contoh ini menunjukkan bahwa tanpa bantuan kepustakaan eksternal, C++ tetap dapat menjadi sarana belajar AI yang mudah dan mendalam.

Pengkodean

Pengkodean (coding) adalah pengubahan data atau informasi dari satu bentuk ke bentuk lain. Tujuan utama adalah untuk membuat informasi dapat dikomunikasikan atau diolah. Tujuan tambahan adalah untuk membuat pengolahan atau pengiriman informasi ini lebih efektif, efisien, dan aman. Claude Shannon menggagas bahwa pengkodean dapat meningkatkan efisiensi komunikasi, serta memungkinkan deteksi dan koreksi kesalahan selama proses komunikasi.

Kita melakukan pengkodean dalam hidup kita sehari-hari. Mengubah isi pikiran dan perasaan menjadi kata-kata dalam bahasa lisan adalah pengkodean. Mengubah kata-kata yang terucap menjadi pesan tertulis dengan huruf-huruf adalah pengkodean. Huruf adalah kode yang melambangkan suara atau makna. Untuk melakukan pengkodean, kita memerlukan perjanjian atau kesepakatan yang dapat disebarkan juga melalui pengajaran. Kata-kata dan huruf-huruf adalah kode. Anak kecil belajar bicara dan belajar menulis — mereka belajar melakukan pengkodean.

Aktivitas yang berkaitan dengan penyusunan makna dari sebuah kode adalah hal yang menarik untuk dikaji. Kita akan diskusikan dalam post berikutnya.

Contoh kode lain adalah isyarat, seperti isyarat kedipan mata dan gerakan tangan, isyarat asap yang digunakan suku-suku tradisional, isyarat warna lampu lalu lintas dan tanda-tanda lalu lintas.

Sandi Morse adalah contoh lain, yang menggantikan huruf dan angkat dengan tanda titik (•) dan garis (—). Sandi Morse memungkinkan komunikasi dilakukan saat suara manusia dan huruf tidak mudah dikirimkan karena berbagai halangan. Dengan tanda titik dan garis, Sandi Morse memungkinkan kita mengirimkan informasi melalui suara peluit, kedipan cahaya lampu, gerakan tongkat atau bendera, ketukan di dinding, kedipan mata, hingga pengiriman sinyal listrik melalui kabel. Metode terakhir ini disebut dengan telegrafi, yaitu mengirimkan pesan yang telah disandikan agar dapat dikirimkan sebagai sinyal elektrik.

Banyak teknologi lain yang kemudian diturunkan dari pengkodean semacam ini. Di abad ke-20, sistem komputer menggunakan kode ASCII untuk mengkodekan huruf, angka, dan tanda-tanda lain ke dalam deretan 7 atau 8 bilangan biner (binary digit / bit). Pengkodean yang memanfaatkan angka semacam ini disebut pengkodean angka, atau digital coding.

Pemanfaatan rangkaian listrik untuk mengolah bilangan biner dipaparkan dalam tesis dari Claude Shannon, yang dianggap tesis terpenting di abad ke-20. Shannon dianggap sebagai Perintis Teknologi Digital. Penjelajahan Shannon lebih lanjut atas pemanfaatan kode digital mendorongnya menemukan banyak hal menarik dalam teknologi digital, termasuk nilai informasi (yang dikaitkan dengan konsep entropi), penyamaran informasi (kriptografi), efisiensi informasi (dikaitkan dengan konsep redundansi), hingga kapasitas komunikasi informasi — yang membuatnya disebut sebagai Penemu Teori Informasi.

Shannon mengukur nilai informasi berdasarkan tingkat ketidakpastian sebuah pesan, atau yang dinamai dengan entropi. Jika suatu pesan dapat diramalkan dengan mudah, maka entropinya rendah, atau nilai informasinya rendah. Namun jika pesan tersebut sulit diprediksi, entropinya dan nilai informasinya menjadi tinggi. Contoh awamnya: berita bahwa “nilai dollar meningkat sedikit terhadap rupiah” memiliki nilai yang kecil dan umumnya dianggap kewajaran; namun berita bahwa “nilai rupiah meningkat kuat terhadap dollar” akan dianggap sebagai berita besar yang harus disebarluaskan. Seperti juga dalam contoh itu, pengkodean pesan dengan entropi tinggi memerlukan lebih banyak bit atau simbol, sedangkan pesan dengan entropi rendah dapat dikodekan dengan simbol yang lebih sedikit. Hal ini sebenarnya telah diterapkan pada Sandi Morse, dimana huruf yang sering digunakan (misalnya E, I, S, T, A, N) memiliki kode yang lebih pendek daripada huruf yang jarang digunakan (misalnya Q, Z, X).

Shannon juga memperkenalkan teknik deteksi dan koreksi kesalahan dalam komunikasi digital. Saat pesan dikirim melalui jaringan komunikasi, pesan dapat rusak atau berubah sebagian akibat gangguan di saluran. Dengan beberapa metode matematika, Shannon menunjukkan bahwa kita dapat memuat bit tambahan ke dalam pesan, sehingga jika terjadi kesalahan, kita dapat mendeteksi dan memperbaikinya. Setelah Shannon, banyak inovator yang mengembangkan teknologi ini secara lebih baik dan lebih efektif.

Pengkodean kemudian diterapkan dalam berbagai aspek teknologi. Pengkodean digunakan dalam format gambar seperti JPEG, yang dapat menyimpan gambar dengan ukuran file yang kecil; atau format suara seperti MP3 yang meredam frekuensi suara yang kurang terdengar, sehingga ukuran file dapat diperkecil. berkurang tanpa mengorbankan kualitas suara yang didengar manusia. Kode ASCII dan Unicode digunakan di dunia komputer untuk menyimpan huruf, angka, dan simbil dalam bentuk angka.

Contoh pengkodean data adalah saat kita menggunakan internet. Internet memecah data kita menjadi paket-paket kecil yang masing-masing dilengkapi dengan bit tambahan untuk pemeriksaan kesalahan. Dengan teknologi ini, data yang diterima dapat dipastikan kebenarannya, dan digabungkan kembali untuk menjadi informasi seperti yang dikirimkan. Contoh lain adalah pemanfaatan barcode dan QR Code yang merupakan pengkodean berbasis visual, dimana warna hitam-putih digunakan sebagai angka atau teks.

© 2025 Informatika

Theme by Anders NorénUp ↑