2 puan yazan GN⁺ 2024-07-02 | 1 yorum | WhatsApp'ta paylaş
  • İnsanlar spaghetti code yönetmekte pek iyi değil
  • Araştırma projelerinde, ham veriden bilgi çıkaran programlar yazmak sık görülen bir durum
  • Veriler net bir spesifikasyonu izlemez
  • Örnekler:
    • Haber makalelerinden şirketleri ve yöneticileri tespit etmek
    • Kamu tedarik sözleşmelerini hizmet türüne göre etiketlemek
    • Mühendisler arasındaki mesajlarda program kodunu tespit etmek

Mesajlarda program kodunu tespit etme

  • Kod incelemesi sırasında, bir mesajın program koduna atıfta bulunup bulunmadığını tespit etme problemini ele alıyor
  • Örnek mesajlar:
    • 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

Karar kuralı fikri

  • Basit kurallar kullanarak program kodu ile normal İngilizceyi ayırmaya yönelik bir yaklaşım
  • Kurallar:
    1. Sonrasında parantez gelen kelime koddur
    2. Tamamı büyük harfli kelime koddur
    3. İngilizce olmayan kelime koddur
  • Her kuralın artıları ve eksileri:
    • Kural 1: Basit ama bariz pozitif örnekleri kaçırıyor
    • Kural 2: Büyük harfli kısaltmaları yanlışlıkla program kodu olarak sınıflandırıyor
    • Kural 3: Mühendislik terimlerini yanlışlıkla program kodu olarak sınıflandırıyor

Elle yazılmış algoritma

  • Basit bir algoritmanın yeterince iyi çalışabileceğine karar verilmiş
  • Bir mesajın kod içerip içermediği iki adımda belirleniyor:
    1. Ön işleme: Mesajı bir token dizisine dönüştürmek
    2. Çıkarım: Kod içerip içermediğine karar vermek için token dizisine kuralları uygulamak
  • Python ile uygulanmış örnek:
    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  
    

Sinir ağının yardımı

  • contains_code ve process, durum makinesi olarak bir RNN içine kodlanabilir
  • Daha iyi bir algoritma bulmak için RNN kullanılabilir

Genel fikir

  • RNN, koşullu olasılığı yaklaşıklar
  • Her token için bir durum vektörü hesaplanır
  • Son durum temel alınarak mesaj sınıflandırılır

Python koduna matematiksel bakış

  • RNN'in Kural 1'i nasıl kodladığını açıklıyor
  • Her token ikili vektör olarak temsil edilir
  • Kuralı uygulamak için gizli durum hesaplanır

Ağı eğitme

  • RNN'i eğitmek için aktivasyon fonksiyonu ReLU olarak değiştiriliyor
  • PyTorch kullanılarak eğitilebilir

Daha verimli uygulamaya sahip mimari

  • PyTorch'ta sağlanan Elman RNN gibi mimariler kullanılıyor
  • Elman RNN'de her gizli katman, hem önceki katmanı hem de mevcut katmanı girdi olarak kullanır

Daha kararlı gradyanlara sahip mimari

  • Uzun mesajlarda gradyan 0'a yaklaşarak sorun çıkarır
  • GRU veya LSTM gibi mimariler daha iyi performans gösterebilir

Veri odaklı disiplin

  • RNN, spaghetti code ile daha iyi başa çıkar
  • Veri odaklı disiplini zorunlu kılarak problemi netleştirir

GN⁺ görüşü

  • Bu makale, RNN kullanarak karmaşık problemleri çözme yöntemini iyi açıklıyor
  • RNN kullanmak kod bakımını kolaylaştırabilir
  • PyTorch gibi araçlarla verimli uygulamalar geliştirilebilir
  • GRU veya LSTM gibi mimarileri değerlendirmek gerekiyor
  • Veri odaklı yaklaşım problem çözümünde faydalı

1 yorum

 
GN⁺ 2024-07-02
Hacker News yorumu
  • Bu yazı test veya eğitim verisi hakkında çok fazla şey söylemiyor

    • Kodun anlaşıldığını düşündüğümüzün nedeni, genelleştirilmiş özellikleri gayriresmî olarak kanıtlamış olmamız
    • Sinir ağlarında sorun, yeni girdilere nasıl genelleme yapacağını bilemememiz
    • Özellikleri iyi tanımlayabiliyorsanız, çok sayıda test verisi üretmek için özellik tabanlı testler yazabilirsiniz
    • Bu bir kanıt değildir ama bir başlangıç noktası olabilir
    • Spagetti koda ya da sinir ağlarına bel bağlamak benzer şeyler olabilir
    • Sinir ağını eğitmek yerine özellik tabanlı testler yazabilirsiniz
    • Yine de koda daha çok güvenirim gibi geliyor, çünkü debug edilebilir
  • Bu yazı, pratik işler yapmak için sinir ağı kurma yöntemi olarak okunursa ilgi çekici

    • Yazar, rastgele girdileri ayrıştırma gibi zor bir problemi ele alıyor
    • Bunu çözmek için sinir ağı öneriyor ama bu hâlâ anlaşılması zor
    • Okunması zor kod yerine anlayabildiğiniz kod daha iyi olabilir
  • Sinir ağları için Evrensel Yaklaştırma Teoremi (Universal Approximation Theorem) vardır

    • Ancak bu tür yaklaştırmaları öğrenebileceğimize dair bir teorem yok
  • Bu yazı RNN hakkında derin matematiksel kavramlara giriyor ama ilginç fikirler sunuyor

    • Girdi dizelerini karakter karakter işleme yaklaşımı güçlü
    • İnce bir giriş/çıkış mantığı yazılıyor ve gerisini algoritma hallediyor
  • RNN'in transformer tarafından tamamen yerinin alınıp alınmadığını merak eden bir görüş var

  • Genetic Programming'e bakmaya değer

    • Matematik gerektirmiyor ve programları AST olarak yeniden birleştirip optimize ediyor
    • Neyin optimize edileceğini seçebilirsiniz (ör. hız, program uzunluğu, karmaşık yapıların en aza indirilmesi vb.)
  • Bu yazı RNN'i bir öğrenme deneyimi olarak ele alıyor ve PyTorch'un RNN'i ile karşılaştırıyor

    • Ağa neden üç gizli katman eklemek gerektiğini soruyor
  • RNN'ler keyfî hesaplamalar yapabilir ama pratik değildir

    • Bu yazı bir durum makinesini öğrenme yöntemini ele alıyor; Python'ın gerçek anlamını öğrenmek ise zor
  • Sinir ağlarının giderek daha çok kod gibi görüneceğine dair bir görüş var

    • MOE tarzı modelleri fonksiyon çağrılarına dönüştürmenin bir sonraki büyük yenilik olacağı söyleniyor