- Introdução ao conceito do tipo
Uncertain<T>, uma nova abstração para lidar com incerteza no nível do código
- Esse tipo aplica a metodologia de programação probabilística para modelar a confiabilidade ou possibilidade de valores no lugar da lógica booleana tradicional
- Oferece recursos para tratar dados reais com muito ruído, como GPS e dados de sensores, por meio de distribuições de probabilidade matemáticas
- Dá suporte ao equilíbrio entre eficiência computacional e confiabilidade dos resultados com técnicas de amostragem como SPRT e métodos de Monte Carlo
- Permite integração gradual com código existente, o que o torna altamente aplicável na prática
Codificando a incerteza: a lacuna entre confiança e dados reais
- Menciona o fenômeno de muitas pessoas dependerem excessivamente de certezas
- Aponta que, com mais experiência em desenvolvimento de software, aumenta a frequência com que se diz “depende da situação”
- No código, porém, continua se repetindo o padrão de depender apenas de julgamentos de verdadeiro/falso
- Critica a realidade de, especialmente ao lidar com dados incertos como GPS, ainda se usarem apenas valores booleanos
- O modelo de programação binariza cedo demais a ‘incerteza’ do mundo real e acaba escondendo sua complexidade
Escolhendo a abstração correta
- Em 2014, a University of Washington e a Microsoft Research propuseram um conceito que reflete diretamente a incerteza no sistema de tipos
- Pelo artigo "Uncertain<T>: A First-Order Type for Uncertain Data" demonstraram que a abordagem de programação probabilística é prática
- O código que porta o conceito para Swift foi publicado no repositório do GitHub
- Com
Uncertain<T>, até o resultado de comparações é expresso como probabilidade relativa, retornando Uncertain<Bool> em vez de verdadeiro/falso
- O erro de posição de GPS é modelado de acordo com características de dados reais, como a distribuição de Rayleigh
Como diferentes operações de incerteza funcionam na prática
- Suporta vários operadores e modelos de distribuição probabilística, construindo um grafo de operações e executando amostragem apenas quando necessário
- Usa SPRT (Sequential Probability Ratio Testing) para ajustar com eficiência o número de amostras
- O código de exemplo explica a diferença no número de amostras necessárias entre comparações simples e comparações compostas
- Com essa abstração, é possível não ignorar a incerteza e usá-la naturalmente no processo de cálculo, implementando um código mais “inteligente”
Aplicação da metodologia de Monte Carlo
- Introduz amostragem de Monte Carlo para análise de distribuições de probabilidade e cálculo de valor esperado
- Na prática, é possível obter o valor esperado com facilidade simulando repetidamente os resultados de uma máquina caça-níquel
- Mesmo sem cálculos analíticos complexos, o computador pode produzir resultados realistas apenas com amostragem repetida
Modelagem rica de distribuições de probabilidade
Uncertain<T> inclui construtores para diversas distribuições de probabilidade, permitindo modelar com precisão dados do mundo real como ruído de sensores, comportamento do usuário e latência de rede
- Suporta parametrização para vários cenários, como mixture, Bernoulli, exponential e normal
- Para ajudar na compreensão intuitiva de cada distribuição, também é oferecido um projeto de visualização interativo separado
Funções estatísticas e de análise disponíveis
- Oferece várias funções estatísticas, como valor esperado, desvio padrão, intervalo de confiança, skewness, kurtosis e entropia
- O resultado das operações também permite ajustar o número de amostras, possibilitando um trade-off entre precisão e eficiência
- Com a função de distribuição acumulada (CDF), também fica fácil calcular a probabilidade de um valor estar abaixo de um determinado limite
Guia de aplicação no mundo real
- Explica problemas que podem surgir em apps quando a incerteza é ignorada (por exemplo, exibir uma velocidade de GPS absurda)
- Enfatiza a transição gradual: recomenda integrar
Uncertain<T> parcialmente, começando por caminhos críticos como medição de distância
- É possível ajustar o equilíbrio entre precisão e desempenho por meio de configurações de custo computacional, como o número de amostras
- No trabalho prático, recomenda usar ativamente ferramentas de profiling como Instruments.app
- O objetivo não é eliminar a incerteza, mas reconhecer sua existência e estabelecer um padrão de desenvolvimento para tratá-la adequadamente
Conclusão e perspectivas
- Desenvolvedores podem introduzir o tratamento de incerteza em áreas pequenas primeiro, esperando melhorias de usabilidade e redução de erros
- Ao aceitar que a certeza completa não existe, é possível elevar a qualidade do software com ferramentas e abstrações adequadas
- Na prática, a verdadeira melhoria profissional está em lidar corretamente com a incerteza que de fato existe
1 comentários
Opiniões do Hacker News
y = m * x + b: quando todos esses termos são literais, ela é apenas uma função de renderização simples; mas, se as variáveis carregarem toda a estrutura do caminho de operações do qual foram derivadas, é possível prever valores conforme a direção da computação e renderizar (forward pass), ou então obter automaticamente gradientes/derivadas e até conectá-los ao treinamento de redes neurais. Ao amostrar matematicamente esses resultados computados, torna-se possível obter os pesos que formam o modelo. Cada camada de deep learning é projetada assim, e sistemas como PyTorch conseguem compilar código ótimo apenas com a especificação da composição das operações. Ou seja, Uncertain<T> é só o ponto de partida; imaginar que toda variável numérica pode, a qualquer momento, ser definida por metadados de valores candidatos, e que esses metadados podem ser manipulados com a mesma facilidade de um valor de variável, é um experimento muito interessante(-2,2)*(-2,2)na biblioteca Boost, o resultado será(-4,4), mas em termos probabilísticos a ocorrência simultânea dos extremos é muito menos provável, então algo como(-2.35,2.35)seria mais realistacertain T