2 Punkte von GN⁺ 2024-07-02 | 1 Kommentare | Auf WhatsApp teilen
  • Menschen sind schlecht darin, Spaghetti-Code zu verwalten
  • In Forschungsprojekten schreibt man oft Programme, die aus Rohdaten Informationen extrahieren
  • Die Daten folgen keiner klaren Spezifikation
  • Beispiele:
    • Unternehmen und Führungskräfte in Nachrichtenartikeln identifizieren
    • Öffentliche Beschaffungsverträge nach Art der Dienstleistung labeln
    • Programmcode in Nachrichten zwischen Ingenieuren erkennen

Programmcode in Nachrichten erkennen

  • Es geht darum, während eines Code-Reviews zu erkennen, ob eine Nachricht auf Programmcode verweist
  • Beispielnachrichten:
    • 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

Idee für Entscheidungsregeln

  • Ein Ansatz, der mit einfachen Regeln zwischen Programmcode und normalem Englisch unterscheidet
  • Regeln:
    1. Ein Wort, auf das Klammern folgen, ist Code
    2. Ein vollständig großgeschriebenes Wort ist Code
    3. Ein nicht englisches Wort ist Code
  • Vor- und Nachteile der einzelnen Regeln:
    • Regel 1: einfach, übersieht aber offensichtliche positive Fälle
    • Regel 2: klassifiziert Akronyme in Großbuchstaben fälschlich als Programmcode
    • Regel 3: klassifiziert Engineering-Begriffe fälschlich als Programmcode

Handgeschriebener Algorithmus

  • Es wird angenommen, dass ein einfacher Algorithmus gut genug funktionieren kann
  • In zwei Schritten wird entschieden, ob eine Nachricht Code enthält:
    1. Vorverarbeitung: Die Nachricht wird in eine Token-Sequenz umgewandelt
    2. Inferenz: Auf die Token-Sequenz werden Regeln angewendet, um zu entscheiden, ob sie Code enthält
  • Ein in Python implementiertes Beispiel:
    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  
    

Hilfe durch neuronale Netze

  • contains_code und process als Zustandsmaschine lassen sich als RNN kodieren
  • Mit einem RNN lässt sich ein besserer Algorithmus finden

Allgemeine Idee

  • Ein RNN approximiert bedingte Wahrscheinlichkeiten
  • Für jedes Token wird ein Zustandsvektor berechnet
  • Auf Basis des finalen Zustands wird die Nachricht klassifiziert

Python-Code aus mathematischer Sicht

  • Es wird erklärt, wie ein RNN Regel 1 kodiert
  • Jedes Token wird als binärer Vektor dargestellt
  • Der versteckte Zustand wird berechnet, um die Regel anzuwenden

Training des Netzwerks

  • Um das RNN zu trainieren, wird die Aktivierungsfunktion auf ReLU geändert
  • Das Training ist mit PyTorch möglich

Architekturen mit effizienterer Implementierung

  • Verwendung von Architekturen, die PyTorch bereitstellt, etwa ein Elman-RNN
  • Beim Elman-RNN verwendet jede Hidden-Layer sowohl die vorherige als auch die aktuelle Schicht als Eingabe

Architekturen mit stabileren Gradienten

  • Bei langen Nachrichten können Gradienten gegen 0 gehen und Probleme verursachen
  • Architekturen wie GRU oder LSTM können bessere Leistung zeigen

Datenzentrierte Disziplin

  • RNNs gehen besser mit Spaghetti-Code um
  • Eine datenorientierte Disziplin macht das Problem klarer

Meinung von GN⁺

  • Dieser Artikel erklärt gut, wie sich komplexe Probleme mit RNNs lösen lassen
  • Mit RNNs wird die Wartung des Codes einfacher
  • Mit Tools wie PyTorch ist eine effiziente Implementierung möglich
  • Architekturen wie GRU oder LSTM sollten in Betracht gezogen werden
  • Ein datenorientierter Ansatz ist für die Problemlösung nützlich

1 Kommentare

 
GN⁺ 2024-07-02
Hacker-News-Kommentare
  • Dieser Beitrag behandelt Tests oder Trainingsdaten kaum

    • Der Grund, warum man glaubt, Code zu verstehen, ist, dass man verallgemeinerte Eigenschaften informell bewiesen hat
    • Bei neuronalen Netzen ist das Problem, dass man nicht weiß, wie sie auf neue Eingaben verallgemeinern werden
    • Wenn sich Eigenschaften gut definieren lassen, kann man eigenschaftsbasierte Tests schreiben und viele Testdaten erzeugen
    • Das ist zwar kein Beweis, könnte aber ein Ausgangspunkt sein
    • Sich auf Spaghetti-Code oder neuronale Netze zu verlassen, könnte ähnlich sein
    • Statt neuronale Netze zu trainieren, könnte man eigenschaftsbasierte Tests schreiben
    • Ich würde dem Code wahrscheinlich immer noch mehr vertrauen, weil man ihn debuggen kann
  • Dieser Beitrag ist interessant, wenn man ihn als Methode zum Aufbau neuronaler Netze für praktische Aufgaben liest

    • Der Autor behandelt das schwierige Problem, beliebige Eingaben zu parsen
    • Zur Lösung schlägt er neuronale Netze vor, aber das bleibt weiterhin schwer zu verstehen
    • Verständlicher Code könnte besser sein als schwer lesbarer Code
  • Es gibt das Universal Approximation Theorem für neuronale Netze

    • Es gibt jedoch kein Theorem, das besagt, dass man solche Approximationen lernen kann
  • Dieser Beitrag behandelt tiefgehende mathematische Konzepte zu RNNs, liefert aber interessante Ideen

    • Der Ansatz, Eingabestrings zeichenweise zu verarbeiten, ist leistungsfähig
    • Man schreibt eine schlanke Ein-/Ausgabelogik, und der Algorithmus erledigt den Rest
  • Es gibt die Meinung, dass man sich fragt, ob RNNs vollständig durch Transformer ersetzt wurden

  • Es lohnt sich, Genetic Programming anzusehen

    • Es braucht keine Mathematik und optimiert Programme durch Rekombination als AST
    • Man kann auswählen, was optimiert werden soll (z. B. Geschwindigkeit, Programmlänge, Minimierung komplexer Strukturen usw.)
  • Dieser Beitrag behandelt RNNs als Lernerfahrung und vergleicht sie mit den RNNs in PyTorch

    • Es wird gefragt, warum dem Netzwerk drei Hidden Layers hinzugefügt werden müssen
  • RNNs können beliebige Berechnungen ausführen, sind aber nicht praktisch

    • Dieser Beitrag behandelt, wie man State Machines lernt, während es schwierig ist, die tatsächliche Semantik von Python zu lernen
  • Es gibt die Meinung, dass neuronale Netze zunehmend wie Code aussehen werden

    • Der nächste große Durchbruch wird sein, MOE-Style-Modelle in Function Calls umzuwandeln