- 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:
- Una palabra seguida de paréntesis es código
- Una palabra en mayúsculas es código
- 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:
- Preprocesamiento: convertir el mensaje en una secuencia de tokens
- 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
Comentarios de Hacker News
Este artículo no trata mucho sobre pruebas ni datos de entrenamiento
Este artículo es interesante si se lee como una forma de construir una red neuronal para realizar una tarea práctica
Existe el teorema de aproximación universal (Universal Approximation Theorem) para redes neuronales
Este artículo trata conceptos matemáticos profundos sobre RNN, pero ofrece ideas interesantes
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)
Este artículo trata la RNN como una experiencia de aprendizaje y la compara con la RNN de PyTorch
Las RNN pueden realizar cómputo arbitrario, pero no son prácticas
Hay opiniones de que las redes neuronales se verán cada vez más como código