Maneiras de consumir texto com modelos de floresta de decisão do Tensorflow

Esta é uma página de Markdown de documentação. Para obter mais informações, consulte a Referência de marcação (go / documentation-reference) e o Guia de estilo da documentação (go / documentation-style).

Fundo

Os algoritmos de aprendizagem da floresta de decisão funcionam de maneira diferente dos modelos baseados em gradiente descendente, como redes neurais ou preditores lineares. Essas diferenças se manifestam em uma variedade de decisões de modelagem, mas são especialmente pronunciadas quando um conjunto de dados contém recursos categóricos de comprimento variável, como recursos de texto tokenizados, que tendem a exigir engenharia de recursos específicos da arquitetura. Este guia descreve as compensações entre diferentes estratégias de engenharia de recursos para recursos de texto em modelos de floresta de decisão.

Nas seções a seguir, vamos nos referir a um conjunto de dados com esses recursos e supor que estamos prevendo se um usuário vai comprar um produto específico:

Característica ID do usuário Compras anteriores Título do Produto Descrição do produto
Dados de exemplo 1234 [“TV”, “Vácuo”] "Roteador Wi-Fi" “Este roteador é ...”


Neste exemplo, “Compras anteriores” é um recurso de texto esparso (ou um conjunto de itens categóricos). “Título do produto” também, mas não é tokenizado neste exemplo. “Descrição do produto” é um recurso de linguagem natural, que possui propriedades diferentes dos outros recursos, porque esperamos que o vocabulário seja grande (ou ilimitado), para que a ordem das palavras importe e tenha outras propriedades semânticas e lexicais inerentes ao língua. As estratégias que descrevemos abaixo são apropriadas para todos esses recursos, mas terão diferentes compensações para cada um.

Referência rápida

A melhor solução, se o custo de treinamento e inferência não for uma preocupação, é usar conjuntos categóricos e embeddings pré-treinados para cada recurso de texto, uma vez que eles têm pontos fortes e fracos complementares. Recomendamos isso, a menos que uma das restrições mencionadas abaixo esteja presente.

Velocidade de inferência Velocidade de treinamento Capacidade de memorizar relações de token <> rótulo Generalização
Múltiplos categóricos Mais rápido (++) Mais rápido (++) Limitado Limitada (+)
multiquente Rápido (+) Rápido (assumindo um tamanho de vocabulário relativamente pequeno) (++) Boa Limitada (+)
Conjuntos categóricos Mais rápido (+++) Mais lento (+) Melhor Limitada (++)
incorporação Mais lento (assumindo operações de codificador não triviais, como multiplicações de matrizes) (+ a +++) Mais rápido (assumindo o tamanho do vocabulário >> dimensão de incorporação) (+++) Ruim Bom (++ a +++)

N-Gramas

N-gramas (por exemplo, {"o", "gato", "é", "azul"} -> {"<iniciar> o", "o gato", "o gato é", "é azul", "azul < end> "}) pode ser benéfico em muitos casos e capturar informações lexicais locais. Eles são suportados em todos os métodos abaixo, mas têm o custo de um tamanho de vocabulário dramaticamente maior, o que pode torná-los impraticáveis ​​devido ao custo de treinamento.

Estratégias desencorajadas

Codificação One-hot / Multi-hot / Bag of Words

A codificação one-hot é uma estratégia clássica para densificar texto esparso. Aqui, assumimos uma extensão em que um recurso de texto esparso é representado por uma vetorização multi-hot (1s para todos os tokens contidos) ou baseada em contagem (a contagem para cada token no vocabulário).

Por exemplo, se o vocabulário for 4 itens e indexados como [“TV”, “Vácuo”, “Wifi”, “Roteador”], o recurso “Compras anteriores” seria um vetor denso <1, 1, 0, 0 >. Se as contagens fossem levadas em consideração e o recurso fosse [“TV”, “TV”, “Vácuo”], seria <2, 1, 0, 0>.

Prós

  • Como as divisões de floresta de decisão são aprendidas em recursos individuais, isso é menos caro no tempo de treinamento do que os conjuntos categóricos.
  • Ao contrário do anterior, não precisa de nenhum recorte ou preenchimento, e os tokens têm a mesma semântica nos exemplos (ou seja, “TV” será constante nas divisões, independentemente da posição).

Contras

  • Essa estratégia geralmente leva a divisões esparsas e altamente desequilibradas, o que pode tornar os algoritmos de aprendizagem DF mais lentos para convergir ou abaixo da média. Isto é porque:
    • Mais divisões são necessárias para aprender as mesmas informações
    • Árvores muito esparsas generalizam pior do que árvores equilibradas, geralmente resultando em um modelo menos preciso.
  • Não leva em consideração as informações de posição. Isso pode prejudicar o desempenho de recursos de linguagem natural.
  • Aprender divisões numéricas em dados categóricos é abaixo do ideal; há otimizações para localizar divisões categóricas que não são aproveitadas aqui.
  • A complexidade computacional do treinamento é escalonada linearmente com o número de itens do vocabulário (que serão cada um consumido como um recurso numérico). Na prática, a menos que o conjunto de dados seja muito pequeno (nesse caso, vocabulários grandes podem encorajar o sobreajuste), isso torna os vocabulários de> 5k itens muito lentos para treinar.
  • O consumo de memória de treinamento será de 1 byte (para one-hot) ou 4 bytes (para contagens) por item do vocabulário por exemplo, já que no momento da indexação, os dados serão armazenados como uma versão densa dos dados esparsos. Isso pode ficar proibitivamente grande para vocabulários e conjuntos de dados maiores.

Vários recursos categóricos com um comprimento fixo

Como os recursos categóricos podem ser aprendidos com eficiência por algoritmos de floresta de decisão, uma maneira natural de consumir tokens esparsos é preencher / recortar de forma que haja um número fixo de tokens de entrada por exemplo, e cada posição do token é um recurso separado e independente. No exemplo acima, se "Compras anteriores" tiver no máximo 5 tokens, podemos criar recursos f1 ... f5 representando tokens 1-5 e descartar todos os tokens> 5 e adicionar valores ausentes para exemplos onde houver <5.

Prós

  • Isso é eficiente para treinar.
  • Isso pode não prejudicar a qualidade do modelo se houver uma variação baixa no número de tokens por exemplo e os tokens forem independentes.
  • Isso pode capturar semânticas adicionais (como pedido de compra no exemplo) mais naturalmente do que outros métodos.

Contras

  • Adiciona semântica a tokens preenchidos “ausentes” que servirão como ruído para o modelo. Isso será especialmente pronunciado se houver uma grande variação no número de tokens por exemplo, o que pode acontecer, por exemplo, com o recurso “Descrição do Produto”.
  • As árvores aprendidas serão altamente sensíveis à ordenação, ou seja, se a característica for ["A", "B"], a previsão será diferente da previsão para ["B", "A"], e se esta última nunca foi vista nos dados, o modelo não será capaz de generalizar a partir do primeiro. Em geral, isso exigirá muito mais dados para aprender a invariância de posição.
  • Por padrão, cada token será representado por um recurso com um vocabulário diferente. Mesmo que você force a implementação a considerar o mesmo conjunto de itens de vocabulário por recurso, f1 = ”TV” será um item de vocabulário diferente de f2 = ”TV”. Isso significa que o algoritmo será menos eficiente em aprender a relação entre o token “TV” e o rótulo - ele terá que aprendê-lo separadamente para cada posição do token.

Melhores estratégias

Conjuntos Categóricos

Conjuntos categóricas ( https://arxiv.org/pdf/2009.09991.pdf ) são TF-DFS representação recurso padrão para texto escassa. Um conjunto categórico é efetivamente um saco de palavras, ignorando duplicatas e ordenação. Por exemplo, o recurso “A TV é a melhor” seria representado pelo conjunto categórico {“melhor”, “é”, “a”, “TV}.

O divisor de conjunto categórico nativo, de acordo com benchmarks em uma variedade de tarefas (consulte o artigo), geralmente supera recursos categóricos multi-hot e de comprimento fixo. Em teoria, tanto as divisões de conjuntos categóricos quanto as divisões booleanas em recursos codificados de um ponto podem aprender as mesmas informações. No entanto, tome o seguinte exemplo, em que a árvore está tentando aprender a seguinte função:

if description contains “high” AND “speed” AND “gaming”:
  return True

Nesse caso, o divisor de conjunto categórico nativo aprenderá 1 divisão, onde {“alta”, “velocidade”, “jogo”} => Verdadeiro.

Uma representação única exigiria 3 divisões, em "alto", "divisão" e "jogo", e precisaria encontrar nós de folha razoáveis ​​para todas as disjunções possíveis dessas categorias (ou seja, "alto" e não "velocidade"). Na prática, a codificação one-hot leva a árvores altamente desequilibradas que não podem ser otimizadas com eficiência pelos algoritmos de aprendizagem de floresta de decisão de melhor desempenho.

Prós

  • Melhor no aprendizado de informações de saco de palavras para florestas de decisão.
  • Altamente eficiente para servir (pode ser servido com QuickScorer, que pode servir árvores grandes em até sub-microssegundos por exemplo). A complexidade do tempo de serviço é linear no número de itens no conjunto categórico de cada exemplo, que na prática é muito menor do que o tamanho do vocabulário.
  • Otimiza um único vocabulário por recurso, para que a semântica seja compartilhada.

Contras

  • O custo de treinar um conjunto categórico divide escalas com num_examples * tamanho do vocabulário, tão semelhante ao algoritmo one-hot, o tamanho do vocabulário treinável pode ser bastante pequeno (N mil) em configurações práticas. Observe que essa velocidade de treinamento pode ser melhorada ajustando a fração de amostragem do algoritmo guloso, mas pode atingir qualidade abaixo do ideal.

Embeddings

Redes Neurais exibiram desempenho de ponta em uma variedade de tarefas de PNL, e embeddings pré-treinados consumidos como recursos numéricos empiricamente também funcionam bem com algoritmos de floresta de decisão, apesar dos recursos serem usados ​​internamente de forma muito diferente. Observe que aqui nos referimos a "incorporação" como qualquer codificação de rede neural, por exemplo, a saída das camadas transformador / convolucional / recorrente.

O uso de embeddings pré-treinados funciona bem com redes neurais em parte porque a inicialização de um espaço vetorial onde tokens ou frases semelhantes estão próximos no espaço euclidiano demonstrou uma boa transferência entre as tarefas de PNL, e os gradientes dessa inicialização são menores e mais rápidos para convergir do que uma inicialização totalmente aleatória. No entanto, árvores de decisão usar embeddings como recursos numéricos individuais, e aprender partições alinhado ao eixo dessas características individuais 1 . Isso significa que é quase impossível utilizar a mesma informação semântica - um produto escalar ou uma multiplicação de matriz, por exemplo, não pode ser representado com um conjunto de divisões alinhadas ao eixo. Além disso, ao contrário das redes neurais, que podem atualizar os embeddings por meio de gradiente descendente durante o treinamento, os algoritmos de aprendizagem de floresta de decisão padrão não são diferenciáveis, o que significa que os embeddings devem permanecer congelados. Note-se que há trabalho ( https://arxiv.org/pdf/2007.14761.pdf, por exemplo) sobre as florestas decisão diferenciáveis. No entanto, talvez em parte porque, na prática, nem todos os bits de informação em um embedding são realmente utilizados, mesmo por redes neurais, essa estratégia ainda funciona bem com florestas de decisão.

Prós:

  • Pode lidar com tamanhos de vocabulário muito maiores - uma vez que uma incorporação é efetivamente uma densificação em um pequeno número de dimensões de incorporação, é improvável que o número de recursos de entrada para a floresta de decisão aumente dramaticamente.
  • Pode generalizar melhor, em teoria, uma vez que embeddings semelhantes podem compartilhar conjuntos de partições. Observe que uma grande ressalva aqui é que, como mencionado acima, as transformações de base ou rotações no espaço vetorial podem ter dois embeddings semelhantes ser completamente diferentes no espaço particionado alinhado ao eixo para florestas de decisão.
  • Pode encapsular naturalmente a recorrência / ordem das palavras, por exemplo, se o codificador contiver convoluções, atenção ou um RNN.
  • Pode alavancar informações de outro conjunto de dados (pré-treinamento para aprendizagem por transferência).

Contras

  • Não é bom em memorizar informações - as divisões podem causar classificações difusas ou alta sensibilidade ao fraseado (ou seja, "o roteador é ótimo" vs "um ótimo roteador") irá produzir embeddings diferentes, que podem estar próximos no espaço euclidiano, mas não necessariamente semelhantes recursos numéricos.
  • Mais lento para servir, porque toda a passagem direta do codificador precisa ser feita no momento da inferência. A latência real é altamente dependente da arquitetura que produziu os embeddings; ou seja, um codificador de transformador normalmente será muito mais lento do que uma consulta de tabela de incorporação bruta com agrupamento médio.

Notas


  1. Habilitar divisões oblíquas pode permitir o aprendizado de informações não alinhadas ao eixo, mas ainda será em uma base dimensão a dimensão.