2 puntos por GN⁺ 2024-07-02 | 1 comentarios | Compartir por WhatsApp
  • Los humanos son malos para gestionar código espagueti
  • En proyectos de investigación, a menudo se escriben programas para extraer información de datos en bruto
  • Los datos no siguen especificaciones claras
  • Ejemplos:
    • Identificar empresas y ejecutivos en artículos de noticias
    • Etiquetar contratos de compras públicas por tipo de servicio
    • Identificar código de programa en mensajes entre ingenieros

Detección de código de programa en mensajes

  • Resolver el problema de detectar si un mensaje hace referencia a código de programa durante una revisión de código
  • Mensajes de ejemplo:
    • 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

Idea de reglas de decisión

  • Un enfoque para distinguir entre código de programa e inglés común usando reglas simples
  • Reglas:
    1. Una palabra seguida de paréntesis es código
    2. Una palabra en mayúsculas es código
    3. Una palabra que no es inglés es código
  • Ventajas y desventajas de cada regla:
    • Regla 1: simple, pero omite casos positivos evidentes
    • Regla 2: clasifica erróneamente abreviaturas en mayúsculas como código de programa
    • Regla 3: clasifica erróneamente términos de ingeniería como código de programa

Algoritmo escrito a mano

  • Se concluye que un algoritmo simple puede funcionar suficientemente bien
  • Se decide si un mensaje contiene código en dos pasos:
    1. Preprocesamiento: convertir el mensaje en una secuencia de tokens
    2. Inferencia: aplicar reglas a la secuencia de tokens para decidir si incluye código
  • Ejemplo implementado en 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  
    

Ayuda de las redes neuronales

  • Es posible codificar contains_code y process como una RNN en forma de máquina de estados
  • Se puede usar una RNN para encontrar un algoritmo mejor

Idea general

  • Una RNN aproxima probabilidades condicionales
  • Calcula un vector de estado para cada token
  • Clasifica el mensaje con base en el estado final

El código Python visto con matemáticas

  • Se explica cómo una RNN codifica la regla 1
  • Cada token se representa como un vector binario
  • Se calcula el estado oculto para aplicar la regla

Entrenamiento de la red

  • Para entrenar la RNN, la función de activación se cambia a ReLU
  • Se puede entrenar usando PyTorch

Arquitectura con una implementación más eficiente

  • Usar arquitecturas provistas por PyTorch, como Elman RNN
  • En Elman RNN, cada capa oculta usa como entrada tanto la capa previa como la capa actual

Arquitectura con gradientes más estables

  • En mensajes largos, los gradientes se acercan a 0 y eso causa problemas
  • Arquitecturas como GRU o LSTM pueden mostrar mejor rendimiento

Disciplina orientada a los datos

  • Las RNN manejan mejor el código espagueti
  • Obligan una disciplina orientada a los datos, lo que aclara el problema

Opinión de GN⁺

  • Este artículo explica bien cómo usar RNN para resolver problemas complejos
  • Usar RNN facilita el mantenimiento del código
  • Herramientas como PyTorch permiten implementaciones eficientes
  • Hay que considerar arquitecturas como GRU o LSTM
  • Un enfoque orientado a los datos es útil para resolver problemas

1 comentarios

 
GN⁺ 2024-07-02
Comentarios de Hacker News
  • Este artículo no trata mucho sobre pruebas ni datos de entrenamiento

    • La razón por la que se piensa que el código se entiende es porque se demostraron informalmente propiedades generalizadas
    • En el caso de las redes neuronales, el problema es que no se puede saber cómo generalizarán ante nuevas entradas
    • Si se pueden definir bien las propiedades, se pueden escribir pruebas basadas en propiedades para generar muchos datos de prueba
    • Esto no es una demostración, pero puede ser un punto de partida
    • Depender de código espagueti o de redes neuronales puede ser algo parecido
    • En lugar de entrenar una red neuronal, se pueden escribir pruebas basadas en propiedades
    • Aun así, probablemente confiaría más en el código, porque se puede depurar
  • Este artículo es interesante si se lee como una forma de construir una red neuronal para realizar una tarea práctica

    • El autor aborda el difícil problema de analizar entradas arbitrarias
    • Propone una red neuronal para resolverlo, pero sigue siendo difícil de entender
    • Puede ser mejor tener código entendible que código difícil de leer
  • Existe el teorema de aproximación universal (Universal Approximation Theorem) para redes neuronales

    • Pero no existe un teorema que diga que esas aproximaciones puedan aprenderse
  • Este artículo trata conceptos matemáticos profundos sobre RNN, pero ofrece ideas interesantes

    • El enfoque de procesar la cadena de entrada carácter por carácter es potente
    • Se escribe una lógica delgada de entrada/salida y el algoritmo se encarga del resto
  • Hay opiniones que se preguntan si las RNN han sido reemplazadas por completo por los transformadores

  • Vale la pena revisar la programación genética (Genetic Programming)

    • No requiere matemáticas y optimiza recombinando programas como AST
    • Se puede elegir qué optimizar (por ejemplo: velocidad, longitud del programa, minimización de estructuras complejas, etc.)
  • Este artículo trata la RNN como una experiencia de aprendizaje y la compara con la RNN de PyTorch

    • Se pregunta por qué hay que agregar tres capas ocultas a la red
  • Las RNN pueden realizar cómputo arbitrario, pero no son prácticas

    • Este artículo trata sobre cómo aprender una máquina de estados, y aprender el significado real de Python es difícil
  • Hay opiniones de que las redes neuronales se verán cada vez más como código

    • Convertir modelos estilo MOE en llamadas a funciones será la próxima gran innovación