2 pontos por GN⁺ 2025-05-17 | 1 comentários | Compartilhar no WhatsApp
  • Uma breve introdução à estrutura e ao objetivo da máquina de Boltzmann
  • Define a função de energia e a distribuição de probabilidade com fórmulas
  • Deduz as regras de atualização de pesos e vieses por meio de derivação
  • Explica o método de aproximação da expectativa do modelo com fase positiva·negativa e amostragem de Gibbs
  • Por fim, organiza de forma geral o algoritmo de Divergência Contrastiva (Contrastive Divergence)

Máquina de Boltzmann e o conceito de Contrastive Divergence

  • Na máquina de Boltzmann, há uma camada de entrada (visible layer), uma camada oculta (hidden layer), além da matriz de pesos que as conecta e dos vetores de viés de cada uma das duas camadas

Função de energia e distribuição de probabilidade

  • A função de energia é definida em forma matricial da seguinte maneira

    E(v, h) = -ΣiΣj wij vi hj - Σi bi vi - Σj cj hj
    • v: vetor da camada visível, h: vetor da camada oculta, w: pesos, b/c: vieses de cada camada
  • A distribuição conjunta da máquina de Boltzmann é

    P(v, h) = (1/Z) * exp(-E(v, h))
    • Z (função de partição) tem o papel de normalizar a distribuição de probabilidade

Log-verossimilhança (log-likelihood) e derivação

  • O treinamento avança maximizando a verossimilhança dos dados de treino

    log(P(v)) = log(Σh exp(-E(v, h))) - log(Z)
  • A derivada parcial da log-verossimilhança em relação ao peso wij é

    ∂(log P(v))/∂wij = <vi hj>dados - <vi hj>modelo
    • < · >dados: expectativa em relação aos dados reais
    • < · >modelo: expectativa em relação aos dados gerados pelo modelo

Regras de aprendizado de pesos e vieses

  • Os pesos e vieses são atualizados da seguinte forma
    • Δwij = η(<vi hj>dados - <vi hj>modelo)
    • Δbi = η(<vi>dados - <vi>modelo)
    • Δcj = η(<hj>dados - <hj>modelo)
    • η é a taxa de aprendizado

Algoritmo de Contrastive Divergence

  • Como a expectativa do modelo < · >modelo é difícil de calcular diretamente, usa-se amostragem de Gibbs
  • A Contrastive Divergence faz a aproximação com o seguinte procedimento
    1. Fase positiva: amostra-se a camada oculta h(0) a partir de P(h | v(0)=dados)
    2. Fase negativa: repetição de amostragem de Gibbs por k vezes
    • Alternadamente, amostra-se v(t+1) ~ P(v | h(t)) e h(t+1) ~ P(h | v(t))
  • No momento da atualização, usa-se a diferença entre a expectativa dos dados e a expectativa do modelo
    • Δwij = η(<vi hj>dados - <vi hj>modelo)
    • Δbi = η(<vi>dados - <vi>modelo)
    • Δcj = η(<hj>dados - <hj>modelo)

Resumo

  • A essência do aprendizado da máquina de Boltzmann, como modelo baseado em energia, é reduzir a diferença de expectativa entre os dados reais e a distribuição gerada pelo modelo
  • Contrastive Divergence é o método central de treinamento que torna possível aproximar essa diferença de forma rápida e eficiente
  • Por meio da amostragem de Gibbs, ela faz a ponte entre a distribuição do modelo e os dados reais e, ao repetir esse processo, atualiza pesos e vieses para que a máquina de Boltzmann possa representar bem os dados

1 comentários

 
GN⁺ 2025-05-17
Comentários do Hacker News
  • Pelo que entendo, o Harmonium (Smolensky) foi a primeira restricted Boltzmann machine, e o conceito era maximizar a “harmony” em vez de minimizar a “energy”. Quando Smolensky, Hinton e Rumelhart colaboraram, eles chamavam isso de “goodness of fit”. O artigo sobre o Harmonium é realmente uma leitura impressionante. Hinton virou um superstar da IA, e Smolensky escreveu um livro longo relacionado à linguística. Fico curioso se alguém conhece mais dessa história

  • Artigo interessante sobre David Ackley. Também vale a pena conferir o T2 Tile Project

    • O ponto principal é que muita gente participa desses avanços importantes. Estudantes de pós-graduação contribuem demais, e o trabalho que eles fazem depois evolui ainda mais. Não entendo por que nos EUA pesquisa é vista como desperdício, mesmo tendo impulsionado tanto o avanço de tudo
  • Sou o autor. Obrigado pelos muitos comentários, não esperava que isso fosse ficar tão popular. Estou corrigindo typos, espaçamento, problemas de rolagem etc.; obrigado por avisarem

    • Correção dos typos concluída, agora ficou bem melhor de ver no celular
  • Confundi o título com "A Tiny Boltzmann Brain". Meu cérebro natural resolveu imediatamente essa confusão. Imaginei que fosse um experimento para testar se dar pesos aleatórios a um modelo minúsculo poderia fazer algo significativo. Quanto menor o modelo, maior seria proporcionalmente a chance de surgir algo interessante por geração aleatória. Meu palpite estava errado, mas sigo firme. Proponho uma nova família de modelos chamada “Unbiased-Architecture Instant Boltzmann Model” (UA-IBM). Imagino que, quando existir um computador quântico grande o suficiente, será possível colocar todo o dataset, todos os parâmetros do modelo e a arquitetura em superposição de estados quânticos e fazer inferência de uma vez só. Alguém aí tem qubits sobrando para testar isso? (Aliás, é irônico que tudo seja quântico, mas ainda seja difícil aproveitar isso de forma realmente útil. E fico imaginando que tipo de sociedade e trajetória tecnológica uma civilização alienígena teria se evoluísse de um único sensor quântico para seres com um sistema nervoso inteiramente quântico)

    • Coitadas das formas de vida quânticas. Estariam condenadas a sempre esperar cálculos demorados, sem conseguir acessar modelos computacionais mais rápidos do que a própria velocidade de pensamento
    • Aponto que computadores quânticos não funcionam assim
  • A explicação está muito boa. Só como observação, a rolagem com o mouse está sensível demais (imagino que no celular esteja ok). Era incômodo porque a cada rolagem pulava para a primeira ou para a última página. Ainda bem que com o teclado dava para ler tudo normalmente

  • Se entendi certo, ao contrário das redes neurais usadas hoje, aqui é preciso usar gibbs sampling para atualizar os pesos, em vez de um forward/backward pass baseado em gradiente. Fico curioso se alguém sabe o motivo

    • Também acho que o gibbs sampling é usado para aproximar o valor esperado da distribuição do modelo. Para calcular o gradiente da log likelihood, é preciso integrar sobre a distribuição, e isso não dá para fazer diretamente. É parecido com usar MCMC em VAE para tirar amostras representativas. Em deep learning, estimamos o gradiente com batches do dataset, mas no RBM é necessário o valor esperado da distribuição probabilística modelada explicitamente
    • Não sou especialista, mas tive alguma formação formal na área bayesiana. Gibbs costuma ser usado quando o gradiente não é claro ou quando você quer reconstruir a própria distribuição. Como cada nó visible depende dos nós hidden, e os hidden também influenciam os visible, o gradiente fica muito complexo. Então usar gibbs sampling com base na marginal likelihood é bem mais simples
    • Posso estar errado, mas acho que é por causa da estrutura não direcionada do RBM. Diferente de uma feed-forward network, não dá para montar um computational graph
  • Esse texto me trouxe lembranças. Em 1990, implementei em C uma Boltzmann machine e um perceptron, criando nós de rede neural em arrays com void pointers. Naquela época, os usos de “IA” eram coisas como prever a próxima nota em melodias MIDI ou reconhecer formatos de notas musicais como minim, crotchet e quaver em uma grade de pontos 5x9. Uma taxa de reconhecimento de 85% já era considerada suficientemente “boa”

    • Engraçado reconhecer formatos de notas musicais em uma grade de pontos 5x9. Passa uma sensação de implementar tudo do zero, parecida com os exemplos de redes neurais do 3Blue1Brown. Combinando com algo como Chuck, hoje em dia daria até para fazer um programa desses no navegador, no lado do cliente
    • Também fiquei curioso se o resultado soava musical
  • O texto foi fácil e claro. Trouxe muita nostalgia. Fazendo um jabá sem vergonha, eu tinha feito um vídeo visualizando o processo de treinamento de um RBM

  • Demo realmente muito limpa. Lembro de ter assistido várias aulas sobre Boltzmann machine nas aulas de redes neurais do Geoff Hinton. Um ponto a observar é que uma explicação do tipo “restricted Boltzmann machine não tem conexão entre neurônios visible e hidden” está errada. Pode dar a entender que os nós visible e hidden não estão conectados entre si. O correto é que não há conexões dentro do mesmo tipo, ou seja, nem entre visible nem entre hidden. Outra forma de dizer isso é que os nós visible e hidden não têm conexões internas com nós do mesmo tipo

    • Quando li “neurônios visible/hidden não têm conexões internas”, fiquei confuso pensando então qual seria a diferença para um MLP. Mas depois percebi tarde demais que eu precisava rolar para cima até a introdução. E concordo plenamente que reimplementar ou consertar rolagem não costuma ser uma boa ideia