- İ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:
- Sonrasında parantez gelen kelime koddur
- Tamamı büyük harfli kelime koddur
- İ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:
- Ön işleme: Mesajı bir token dizisine dönüştürmek
- Çı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
Hacker News yorumu
Bu yazı test veya eğitim verisi hakkında çok fazla şey söylemiyor
Bu yazı, pratik işler yapmak için sinir ağı kurma yöntemi olarak okunursa ilgi çekici
Sinir ağları için Evrensel Yaklaştırma Teoremi (Universal Approximation Theorem) vardır
Bu yazı RNN hakkında derin matematiksel kavramlara giriyor ama ilginç fikirler sunuyor
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
Bu yazı RNN'i bir öğrenme deneyimi olarak ele alıyor ve PyTorch'un RNN'i ile karşılaştırıyor
RNN'ler keyfî hesaplamalar yapabilir ama pratik değildir
Sinir ağlarının giderek daha çok kod gibi görüneceğine dair bir görüş var