No momento, estou jogando com Restricted Boltzmann Machines e, como estou nisso, gostaria de tentar classificar dígitos manuscritos com ele.
O modelo que criei agora é um modelo generativo bastante sofisticado, mas não sei como ir mais longe.
Em este artigo a palavra autor, que depois de criar um bom modelo generativo, um " então treina um classificador discriminativo (ie, classificador linear, Support Vector Machine) no topo da RBM utilizando as amostras rotuladas " e estados furtherly " desde que você propagar o vetores de dados para as unidades ocultas do modelo RBM para obter vetores de unidades ocultas ou uma representação de nível superior dos dados ". O problema é que não tenho certeza se entendi direito.
Isso significa que tudo o que preciso fazer é propagar a entrada para as unidades ocultas e aí tenho meu recurso RBM para classificação?
Alguém pode me explicar esse processo?
fonte
Respostas:
Revisão de Máquinas Boltzmann Restritas
Uma máquina Boltzmann restrita (RBM) é um modelo generativo , que aprende uma distribuição de probabilidade sobre a entrada. Isso significa que, após ser treinado, o RBM pode gerar novas amostras a partir da distribuição de probabilidade aprendida. A distribuição de probabilidade sobre as unidades visíveis é dada por p ( v ∣ h ) = V ∏ i = 0 p ( v i ∣ h ) , onde p ( v i ∣ h ) = σ ( a i + Hv
Usando RBMs para classificação
Esse vetor oculto é apenas uma versão transformada dos dados de entrada - isso não pode classificar nada por si só. Para fazer uma classificação, você treinaria qualquer classificador (classificador linear, SVM, uma rede neural de feedforward ou qualquer outra coisa) com o vetor oculto em vez dos dados de treinamento "brutos" como entradas.
Se você estiver construindo uma rede de crenças profundas (DBN) - que foi usada para pré-treinar redes neurais profundas de feed-forward de uma maneira não supervisionada - você pegaria esse vetor oculto e o usaria como entrada para um novo RBM, que você empilha no topo disso. Dessa forma, você pode treinar a rede camada por camada até atingir o tamanho desejado, sem precisar de dados rotulados. Por fim, você adicionaria, por exemplo, uma camada softmax ao topo e treinaria toda a rede com retropropagação em sua tarefa de classificação.
fonte
@hbaderts descreveu todo o fluxo de trabalho perfeitamente. No entanto, pode não fazer sentido se você é completamente novo nessa idéia. Portanto, vou explicá-lo da maneira leiga (portanto, omitirei detalhes):
Pense nas redes profundas como uma função para transformar seus dados. Exemplos de transformações incluem normalização, registro de dados etc. As redes profundas que você está treinando têm várias camadas. Cada uma dessas camadas é treinada usando algum tipo de algoritmo de aprendizado. Para a primeira camada, você passa os dados originais como entrada e tenta obter uma função que retornará esses "mesmos dados originais" que a saída. No entanto, você não obtém a saída perfeita. Portanto, você está obtendo uma versão transformada de sua entrada como a saída da primeira camada.
Agora, para a segunda camada, você pega esses "dados transformados" e os passa como entrada e repete todo o processo de aprendizado. Você continua fazendo isso para todas as camadas da sua rede profunda.
Na última camada, o que você obtém é uma "versão transformada" dos seus dados de entrada originais. Isso pode ser pensado na abstração de nível superior dos dados de entrada originais. Observe que você ainda não usou as etiquetas / saída em sua rede profunda. Portanto, tudo até este ponto é aprendizado não supervisionado. Isso é chamado de pré-treinamento em camadas.
Agora, você deseja treinar um modelo de classificador / regressão e esse é um problema de aprendizado supervisionado. A maneira como você alcança esse objetivo é pegar a "versão final transformada" da sua entrada original da última camada da sua rede profunda e usá-las como entrada para qualquer classificador (por exemplo, classificador knn / classificador softmax / regressão logística etc.). Isso é chamado de empilhamento.
Ao treinar esse classificador / aluno da última etapa, você propaga todo o seu aprendizado em toda a rede. Isso garante que você possa aprender com os rótulos / saídas e modificar os parâmetros em camadas aprendidos de acordo.
Portanto, depois de treinar seu modelo generativo, pegue a saída do seu modelo generativo e use-o como entrada para um classificador / aluno. Deixe o erro fluir por toda a rede enquanto o aprendizado continua, para que você possa modificar o parâmetro em camadas aprendido nas etapas anteriores.
fonte
Você pode treinar RBMs empilhados em suas imagens e, em seguida, treinar o RBM final em uma concatenação da saída da pilha RBM e dos rótulos. Então você pode realmente usar o RBM para classificação. Este artigo de Hinton ++ explica essa abordagem Um algoritmo de aprendizado rápido para redes de crenças profundas , também é possível ver esta demonstração
fonte