- 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:
- Ein Wort, auf das Klammern folgen, ist Code
- Ein vollständig großgeschriebenes Wort ist Code
- 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:
- Vorverarbeitung: Die Nachricht wird in eine Token-Sequenz umgewandelt
- 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
Hacker-News-Kommentare
Dieser Beitrag behandelt Tests oder Trainingsdaten kaum
Dieser Beitrag ist interessant, wenn man ihn als Methode zum Aufbau neuronaler Netze für praktische Aufgaben liest
Es gibt das Universal Approximation Theorem für neuronale Netze
Dieser Beitrag behandelt tiefgehende mathematische Konzepte zu RNNs, liefert aber interessante Ideen
Es gibt die Meinung, dass man sich fragt, ob RNNs vollständig durch Transformer ersetzt wurden
Es lohnt sich, Genetic Programming anzusehen
Dieser Beitrag behandelt RNNs als Lernerfahrung und vergleicht sie mit den RNNs in PyTorch
RNNs können beliebige Berechnungen ausführen, sind aber nicht praktisch
Es gibt die Meinung, dass neuronale Netze zunehmend wie Code aussehen werden