Atualizando viés com RBMs (máquinas restritas de Boltzmann)


8

Sou muito novo para RBMs, tentando escrever um programa RBM agora. Desculpe se esta é uma pergunta boba e / ou já foi respondida aqui.

Li alguns artigos on-line e perguntas aqui, mas não consigo encontrar nada sobre como atualizar os preconceitos (ou pesos de preconceito). Li sobre como defini-los inicialmente. Referências passageiras a elas que devem ser atualizadas. Geoff Hinton menciona o viés, é claro, e está incluído em suas equações (eu li alguns de seus artigos, vi algumas apresentações em vídeo), mas não consigo encontrar nenhuma menção em seus artigos de viés que foram alterados uma vez definidos ou como / quando / por que fazer isso. Eu devo estar esquecendo alguma coisa!

O artigo de Edwin Chen é recomendado aqui: http://blog.echen.me/2011/07/18/introduction-to-restricted-boltzmann-machines/ Ele não menciona como atualizar / 'aprender' os vieses; eles são alterados no programa dele, mas eu não entendo o código dele. (Ele tem uma tabela com os pesos atualizados que não parecem corretos - estranhamente, isso dá um peso de viés-viés, o que quer que isso possa significar.)

Hum, então eu não sei por que isso é tão difícil de encontrar material !! Obrigado por qualquer ajuda.


Veja aqui: image.diku.dk/igel/paper/AItRBM-proof.pdf na seção 4.1 (para a derivada da probabilidade escrita nos termos de viés) e 5 (para algoritmos de ajuste aproximados).
shadowtalker

Muito obrigado! Bem, principalmente a matemática está acima da minha cabeça, mas eu entendo a linha sobre como atualizar o viés na p28 :-) e será ótimo ter isso quando eu quiser aprofundar a teoria. ps Eu consegui funcionar bem hoje, sem nenhuma unidade de polarização ou pesos. (Smolenksy que inventou deles chamou harmónios, um nome mais agradável tanto, acho que vou chamá-los assim.)
Adam P

ótimo ouvir isso! Sugiro que você escreva o que encontrou e responda sua própria pergunta aqui. Dessa forma, os outros podem procurar aqui e encontrá-lo facilmente (comentários não são pesquisados, apenas perguntas e respostas)
shadowtalker

Também aposto que se você realmente ler atentamente a matemática, descobrirá que não é tão complicado. É realmente apenas um monte de derivativos. Muitas vezes eles só jogar um monte na página de uma vez e pule as etapas, mas esses papéis não são geralmente tão esotérico exceto quando provando coisas como existência e convergência teoremas
shadowtalker

Respostas:


5

TLDR

Para divergência contrastante step, atualize o viés visível , com base no vetor de dados usando:b j dnbjd

bj(t)bj(t1)+η(djv^j(n))

Atualize o viés oculto usando:hi

ci(t)ci(t1)+η(h^i(0)h^i(n))

Onde e são os vieses após o número de atualização t, é a taxa de aprendizado, é o ésimo componente do vetor de dados e onde e são as probabilidades de a unidade oculta unidade visível estarem ativas quando o RBM for exposto aos dados e executado por etapas. Isso pressupõe um tamanho de minibatch de 1; para tamanho prático de minibatch , calcule a média das atualizações obtidas nos vetores de dados.bj(t)ci(t)ηdjjh^j(n)v^j(n)ijnkk


Explicação completa

Eu tive o mesmo problema. Uma boa maneira de pensar é que os próprios preconceitos são apenas pesos. Geralmente, nos modelos de redes neurais, o viés de uma unidade é modelado como o peso de um link que conecta a unidade em questão a uma unidade "sempre ativa", ou seja, uma unidade imaginária cuja ativação é sempre 1.

No caso do RBM, isso significa que você pensa em haver uma unidade visível extra cuja saída é sempre 1. Essa unidade visível é conectada a cada uma das unidades ocultas (como qualquer outra unidade visível) e o peso dessas conexões são os vieses das respectivas unidades ocultas. Da mesma forma, os desvios das unidades visíveis podem ser modelados imaginando uma unidade extra oculta, cujo valor é sempre um, e que se conecta a cada uma das unidades visíveis, sendo os pesos dessas conexões os desvios visíveis.

Você pode até implementar seu RBM dessa maneira, mas acho que as pessoas geralmente não fazem isso. O ponto é que, pensando dessa maneira, você pode usar (essencialmente) a mesma regra de atualização para os vieses que para os pesos, já que os vieses são apenas pesos que se conectam a unidades "sempre ativadas".

Sejamos concretos. Anotarei a regra de atualização usual da divergência contrastante step, ignorando a regularização por simplicidade. Também por simplicidade, esta regra de atualização é para um "minibatch" de 1 vetor de dados. A atualização para um minibatch com vetores é a atualização média de todos os vetores . A regra de atualização é:nkk

Wi,j(t)Wi,j(t1)+η(h^i(0)djh^i(n)vj(n))
onde:
  • Wi,j(t) é o peso que conecta a unidade visível à unidade oculta após o número de atualizaçãovjhit
  • η é a taxa de aprendizado
  • h^i(n) representa a probabilidade de unidade escondido sendo activo uma vez que a máquina tenha sido exposto a vetor de dados e evoluiu para passos. idn
    • o que significa que é apenas a ativação da unidade oculta em resposta imediata ao vetor de dados ih^i(0)i
  • j ddj é o ésimo componente do vetor de dadosjd
  • j nvj(n) é o estado da unidade visível quando a máquina é exposta ao vetor de dados e evoluída por etapas.jn

(Algumas pessoas usam para indexar as unidades visíveis para indexar as ocultas, mas ainda escrevem --- isso não importa, desde que você multiplique os valores corretos.)j W i , jijWi,j

Cuidado para distinguir o "estado" de uma unidade, indicado por ou , e a "ativação" de uma unidade, indicada como ou . O estado de uma unidade é 0 ou 1, enquanto a ativação é qualquer número real entre 0 e 1. Se a ativação for 0,8, é provável que o estado seja 1, mas 20% do tempo será 0. v ( n ) j h ( n ) i v ( n ) ihi(n)vj(n)h^i(n)v^i(n)

Ao tratar preconceitos como pesos para unidades "sempre ativadas " , você descobrirá que a equação acima simplifica os dados para atualizações de preconceitos no " TLDR ". Há uma pequena diferença, no entanto, na atualização para vieses visíveis: aqui a ativação visível é usada no lugar do estado . A ativação tem o mesmo valor esperado, mas possui uma variação menor que o estado, portanto, isso reduz o ruído no sinal de aprendizado. Consulte este guia para uma breve discussão sobre quando o uso de ativações em vez de estados é desejável.§3


Edward Newell Muito obrigado pela explicação clara! Por acaso você tem um código MATLAB para este exemplo (como descrito no blog de Edwin Chan) e você poderia compartilhar?
Bill Ancalagon o preto

Ainda bem que ajudou. Infelizmente eu só tenho uma implementação python. E, no momento, minha implementação difere da anterior (eu estava experimentando diferentes regras de atualização ...). Boa sorte!
Edward Newell
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.