- Humanos são ruins em gerenciar código espaguete
- Em projetos de pesquisa, muitas vezes é preciso escrever programas para extrair informações de dados brutos
- Os dados não seguem especificações claras
- Exemplos:
- identificar empresas e executivos em artigos de notícias
- rotular contratos de compras públicas por tipo de serviço
- identificar código de programa em mensagens entre engenheiros
Detectando código de programa em mensagens
- Resolve o problema de detectar, durante a revisão de código, se uma mensagem faz referência a código de programa
- Mensagens de exemplo:
- 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
Ideia de regras de decisão
- Uma abordagem que usa regras simples para distinguir código de programa de inglês comum
- Regras:
- Uma palavra seguida de parênteses é código
- Uma palavra toda em maiúsculas é código
- Uma palavra que não é inglês é código
- Pontos fortes e fracos de cada regra:
- Regra 1: simples, mas perde casos positivos óbvios
- Regra 2: classifica incorretamente siglas em maiúsculas como código de programa
- Regra 3: classifica incorretamente termos de engenharia como código de programa
Algoritmo escrito à mão
- Conclui que um algoritmo simples pode funcionar bem o suficiente
- Decide em duas etapas se a mensagem contém código:
- pré-processamento: converter a mensagem em uma sequência de tokens
- inferência: aplicar regras à sequência de tokens para decidir se contém código
- Exemplo implementado em 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
Ajuda das redes neurais
- É possível codificar
contains_code e process como uma RNN, como uma máquina de estados
- Uma RNN pode ser usada para encontrar um algoritmo melhor
Ideia geral
- Uma RNN aproxima probabilidades condicionais
- Calcula um vetor de estado para cada token
- Classifica a mensagem com base no estado final
Código Python visto pela matemática
- Explica como uma RNN codifica a regra 1
- Representa cada token como um vetor binário
- Calcula o estado oculto para aplicar a regra
Treinamento da rede
- Para treinar a RNN, a função de ativação é trocada para ReLU
- É possível treinar usando PyTorch
Arquitetura com implementação mais eficiente
- Usa arquiteturas fornecidas pelo PyTorch, como a Elman RNN
- Na Elman RNN, cada camada oculta usa como entrada tanto a camada anterior quanto a camada atual
Arquitetura com gradientes mais estáveis
- Mensagens longas causam problemas porque os gradientes ficam próximos de 0
- Arquiteturas como GRU ou LSTM podem mostrar desempenho melhor
Disciplina orientada por dados
- RNNs lidam melhor com código espaguete
- Forçam uma disciplina orientada por dados, tornando o problema mais claro
Opinião do GN⁺
- Este artigo explica bem como usar RNNs para resolver problemas complexos
- Usar RNNs facilita a manutenção do código
- Ferramentas como PyTorch permitem uma implementação eficiente
- Vale considerar arquiteturas como GRU ou LSTM
- Uma abordagem orientada por dados é útil para resolver o problema
1 comentários
Opiniões no Hacker News
Este texto não aborda muito testes nem dados de treinamento
Este texto é interessante se for lido como uma forma de construir uma rede neural para realizar uma tarefa prática
Existe o Teorema da Aproximação Universal para redes neurais
Este texto trata de conceitos matemáticos profundos sobre RNN, mas oferece ideias interessantes
Há quem questione se as RNNs foram completamente substituídas pelos transformers
Vale a pena dar uma olhada em Programação Genética (Genetic Programming)
Este texto trata RNN como uma experiência de aprendizado e a compara com a RNN do PyTorch
RNNs podem executar computação arbitrária, mas não são práticas
Há uma opinião de que as redes neurais vão parecer cada vez mais com código