2 poin oleh GN⁺ 2024-07-02 | 1 komentar | Bagikan ke WhatsApp
  • Manusia tidak pandai mengelola spaghetti code
  • Dalam proyek riset, sering kali perlu menulis program yang mengekstrak informasi dari data mentah
  • Data tidak mengikuti spesifikasi yang jelas
  • Contoh:
    • Mengidentifikasi perusahaan dan eksekutif dalam artikel berita
    • Memberi label pada kontrak pengadaan publik berdasarkan jenis layanan
    • Mengidentifikasi kode program dalam pesan antarinsinyur

Mendeteksi kode program dalam pesan

  • Menyelesaikan masalah mendeteksi apakah sebuah pesan merujuk pada kode program selama code review
  • Contoh pesan:
    • LGTM with render_ipa_alloc()
    • If the FTPSACK flag is set, then use a prespecified value
    • AFAICT there is nothing else to check (unless you can think of something)
    • Actually, debug_error() doesn’t return NULL, so we should use IS_ERROR() here
    • This fails to build on aarch64 even though it works without issue on amd64
    • I’ve added if (err) goto cleanup; but the code still leaks

Ide aturan keputusan

  • Pendekatan yang membedakan kode program dan bahasa Inggris biasa dengan menggunakan aturan sederhana
  • Aturan:
    1. Kata yang diikuti tanda kurung adalah kode
    2. Kata dengan semua huruf kapital adalah kode
    3. Kata non-Inggris adalah kode
  • Kelebihan dan kekurangan tiap aturan:
    • Aturan 1: sederhana tetapi melewatkan kasus positif yang jelas
    • Aturan 2: salah mengklasifikasikan singkatan huruf besar sebagai kode program
    • Aturan 3: salah mengklasifikasikan istilah rekayasa sebagai kode program

Algoritme yang ditulis dengan tangan

  • Disimpulkan bahwa algoritme sederhana dapat bekerja cukup baik
  • Menentukan apakah pesan mengandung kode dalam dua tahap:
    1. Pra-pemrosesan: mengubah pesan menjadi urutan token
    2. Inferensi: menerapkan aturan pada urutan token untuk menentukan apakah kode ada
  • Contoh implementasi dalam Python:
    from dataclasses import dataclass  
    
    Token = str  
    
    @dataclass  
    class State:  
        previous_was_identifier: bool = False  
        previous_was_open_paren: bool = False  
        previous_previous_was_identifier: bool = False  
        seen_code: bool = False  
    
    def contains_code(tokens: Iterable[Token]) -> bool:  
        state = State()  
        for token in tokens:  
            state = process(state, token)  
        return state.seen_code  
    
    def process(state: State, token: Token) -> State:  
        if state.seen_code:  
            return state  
        if (token == "close_paren" and state.previous_was_open_paren and state.previous_previous_was_identifier):  
            state.seen_code = True  
            return state  
        state.previous_previous_was_identifier = state.previous_was_identifier  
        state.previous_was_identifier = token in ("all_caps_identifier", "underscore_identifier", "misc_identifier")  
        state.previous_was_open_paren = token == "open_paren"  
        return state  
    

Bantuan dari jaringan saraf

  • contains_code dan process sebagai mesin status dapat dienkode sebagai RNN
  • RNN dapat digunakan untuk menemukan algoritme yang lebih baik

Gagasan umum

  • RNN mengaproksimasi probabilitas bersyarat
  • Menghitung vektor status untuk setiap token
  • Mengklasifikasikan pesan berdasarkan status akhir

Kode Python dilihat dari matematika

  • Menjelaskan bagaimana RNN mengenkode aturan 1
  • Mewakili setiap token sebagai vektor biner
  • Menghitung hidden state untuk menerapkan aturan

Melatih jaringan

  • Untuk melatih RNN, fungsi aktivasi diubah menjadi ReLU
  • Dapat dilatih menggunakan PyTorch

Arsitektur dengan implementasi yang lebih efisien

  • Menggunakan arsitektur yang disediakan PyTorch seperti Elman RNN
  • Elman RNN menggunakan input dari layer tersembunyi sebelumnya dan layer saat ini pada setiap hidden layer

Arsitektur dengan gradien yang lebih stabil

  • Pesan yang panjang menimbulkan masalah karena gradien mendekati 0
  • Arsitektur seperti GRU atau LSTM dapat menunjukkan kinerja yang lebih baik

Disiplin yang berpusat pada data

  • RNN lebih baik dalam menangani spaghetti code
  • Memperjelas masalah dengan memaksakan disiplin yang berpusat pada data

Pendapat GN⁺

  • Artikel ini menjelaskan dengan baik cara menggunakan RNN untuk menyelesaikan masalah yang kompleks
  • Menggunakan RNN membuat pemeliharaan kode lebih mudah
  • Implementasi yang efisien dimungkinkan dengan alat seperti PyTorch
  • Perlu mempertimbangkan arsitektur seperti GRU atau LSTM
  • Pendekatan yang berpusat pada data berguna untuk pemecahan masalah

1 komentar

 
GN⁺ 2024-07-02
Komentar Hacker News
  • Artikel ini tidak banyak membahas pengujian atau data pelatihan

    • Alasan kita merasa kode dapat dipahami adalah karena kita telah membuktikan properti yang digeneralisasi secara informal
    • Dalam kasus jaringan saraf, masalahnya adalah kita tidak tahu bagaimana ia akan melakukan generalisasi terhadap input baru
    • Jika properti dapat didefinisikan dengan baik, kita bisa menulis property-based testing untuk menghasilkan banyak data uji
    • Ini bukan pembuktian, tetapi bisa menjadi titik awal
    • Mengandalkan spaghetti code atau jaringan saraf mungkin terasa mirip
    • Alih-alih melatih jaringan saraf, kita bisa menulis property-based testing
    • Saya tetap akan lebih memercayai kode, karena bisa di-debug
  • Artikel ini menarik jika dibaca sebagai cara membangun jaringan saraf untuk melakukan pekerjaan yang praktis

    • Penulis membahas masalah sulit dalam mem-parsing input arbitrer
    • Ia mengusulkan jaringan saraf untuk menyelesaikannya, tetapi itu tetap sulit dipahami
    • Kode yang bisa dipahami mungkin lebih baik daripada kode yang sulit dibaca
  • Ada Universal Approximation Theorem untuk jaringan saraf

    • Namun, tidak ada teorema yang menyatakan bahwa pendekatan seperti itu dapat dipelajari
  • Artikel ini membahas konsep matematika yang mendalam tentang RNN, tetapi menawarkan ide yang menarik

    • Pendekatan yang memproses string input per karakter sangat kuat
    • Tulis logika input/output yang tipis, dan biarkan algoritma menangani sisanya
  • Ada pendapat yang bertanya-tanya apakah RNN sudah sepenuhnya digantikan oleh transformer

  • Genetic Programming layak untuk dilihat

    • Tidak memerlukan matematika, dan mengoptimalkan program dengan menyusun ulang AST
    • Kita bisa memilih apa yang ingin dioptimalkan (misalnya: kecepatan, panjang program, meminimalkan struktur yang rumit, dll.)
  • Artikel ini membahas RNN sebagai pengalaman belajar, dan membandingkannya dengan RNN di PyTorch

    • Mempertanyakan alasan harus menambahkan tiga hidden layer ke jaringan
  • RNN dapat melakukan komputasi arbitrer, tetapi tidak praktis

    • Artikel ini membahas cara mempelajari state machine, dan mempelajari makna nyata Python itu sulit
  • Ada pendapat bahwa jaringan saraf akan semakin terlihat seperti kode

    • Cara mengubah model bergaya MOE menjadi function call akan menjadi inovasi besar berikutnya