Criando um modelo Markov de entropia máxima a partir de um classificador de entropia máxima de várias entradas existente

9

Estou intrigado com o conceito de um modelo de entropia máxima de Markov (MEMM) e estou pensando em usá-lo para um etiquetador de parte do discurso (POS). No momento, estou usando um classificador convencional de máxima entropia (ME) para marcar cada palavra individualmente. Isso usa vários recursos, incluindo as duas tags anteriores.

Os MEMMs usam o algoritmo Viterbi para encontrar o caminho ideal através da cadeia de Markov (ou seja, para encontrar um conjunto ótimo completo de tags para a sentença, em vez dos ótimos individuais para cada palavra). Lendo sobre isso, parece ter uma maravilhosa elegância e simplicidade. No entanto, cada estágio depende apenas dos "resultados" do estágio anterior (ou seja, conforme uma Cadeia de Markov).

No entanto, meu modelo ME usa os dois estágios anteriores (ou seja, as tags das duas palavras anteriores). Parece que tenho duas abordagens possíveis:

  • Como na implementação convencional do Viterbi, use um conjunto de caminhos armazenados de acordo com um estágio (o anterior). Meu classificador ME usaria este e um estágio 'congelado' antes disso (congelado no caminho em consideração) para produzir a função de transferência.

  • Ou escrevo o algoritmo para acompanhar dois estágios. Isso é mais complicado e não seria mais um verdadeiro modelo de Markov, porque cada função de transferência (ou seja, do modelo ME) dependeria dos dois estágios anteriores e não de um estágio.

Parece-me que o segundo será mais preciso, embora mais complicado.

Ainda não encontrei exemplos disso durante minha pesquisa na literatura. Foi tentado? A abordagem em dois estágios melhorou a precisão geral?

winwaed
fonte

Respostas:

4

(Esta é realmente uma pergunta real que estou enfrentando, e o site do ML StackExchange foi lançado no momento perfeito: fiz alguns dias de leitura de livros e pesquisa on-line e estava prestes a começar a implementar. Aqui estão meus resultados. eles não são rigorosos, acho que respondem à minha própria pergunta. Deixarei a pergunta em aberto por enquanto, caso alguém tenha alguma contribuição útil, tenha tentado algo semelhante ou tenha algumas referências úteis.)

Ok, nos últimos dias, eu codifiquei isso. O código não é muito eficiente - muita criação e cópia de coleções, mas o objetivo do exercício era ver se funcionaria e como funciona.

Estou dividindo meus dados aleatoriamente em duas listas: dados de treinamento e dados de teste. Estou executando os dados de teste através do tagger convencional de máxima entropia POS; e meu novo etiquetador MEMM. Portanto, eles veem os mesmos dados de teste, permitindo comparações diretas - devido à aleatoriedade nos dados escolhidos, vejo alguma variação entre os testes (normalmente cerca de 0,2-0,4%).

O primeiro teste usa um etiquetador MEMM com um único estágio (ou seja, uma verdadeira cadeia de Markov). Isso consistentemente teve um desempenho melhor do que o simples marcador ME em cerca de 0,1-0,25%.

Em seguida, tentei a abordagem em duas etapas, que parece ser mais correta. No entanto, os resultados foram ainda mais marginais. Frequentemente, os resultados seriam idênticos; ocasionalmente, seria ligeiramente inferior, mas provavelmente na maioria das vezes era ligeiramente melhor (então +/- 0,05%).

O etiquetador MEMM está lento. Ok, eu não apliquei nenhuma otimização, mas o estágio 1 (verdadeira cadeia de Markov) é N vezes mais lento (onde N = Número de etiquetas) porque esse é o número de caminhos que são transferidos entre cada etapa. A implementação em dois estágios é N * N mais lenta (devido ao maior número de caminhos transferidos). Embora as otimizações possam melhorar as coisas, isso provavelmente é muito lento para a maioria das aplicações práticas.

Uma coisa que estou tentando é aplicar um limite de probabilidade menor aos caminhos. Ou seja. os caminhos de Viterbi são removidos durante cada iteração, com todos os caminhos abaixo de uma certa probabilidade (atualmente Log (caminho total P) <- 20,0) são removidos. Isso corre um pouco mais rápido, mas permanece a questão de saber se vale a pena. Eu acho que provavelmente não é.

Por que não vemos nenhuma melhoria? Acho que isso se deve principalmente à maneira como as tags POS se comportam e ao modelo Maximum Entropy. Embora o modelo utilize recursos com base nas duas tags anteriores, a tag anterior imediata é muito mais importante em comparação com a anterior. Intuitivamente, isso faria sentido para o idioma inglês (por exemplo, um adjetivo geralmente é seguido por um substantivo ou outro adjetivo, mas isso realmente não depende do que era antes do adjetivo).

winwaed
fonte