Maneiras de consumir texto com modelos Tensorflow Decision Forest

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

Fundo

Os algoritmos de aprendizado de floresta de decisão funcionam de maneira diferente dos modelos baseados em descida gradiente, 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, nos referiremos a um conjunto de dados com esses recursos e presumiremos que estamos prevendo se um usuário comprará um produto específico:

Recurso 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 está, mas não é tokenizado neste exemplo. “Descrição do Produto” é um recurso da linguagem natural, que possui propriedades diferentes dos outros recursos, porque esperamos que o vocabulário seja grande (ou ilimitado), que a ordem das palavras seja importante e que tenha outras propriedades semânticas e lexicais inerentes ao linguagem. As estratégias que descrevemos abaixo são apropriadas para todos esses recursos, mas terão compensações diferentes para cada um deles.

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 possuem 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 relacionamentos de token <> rótulo Generalização
Múltiplos Categóricos Mais rápido (++) Mais rápido (++) Limitado Limitado (+)
multi-quente Rápido (+) Rápido (assumindo tamanho de vocabulário relativamente pequeno) (++) Bom Limitado (+)
Conjuntos categóricos Mais rápido (+++) Mais lento (+) Melhor Limitado (++)
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 vocabulário dramaticamente maior, o que pode torná-los impraticáveis ​​devido ao custo de treinamento.

Estratégias desanimadas

Codificação one-hot/multi-hot/Saco de palavras

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

Por exemplo, se o vocabulário tiver 4 itens e for indexado 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 da floresta de decisão são aprendidas em recursos individuais, isso é menos dispendioso no momento do treinamento do que os conjuntos categóricos.
  • Ao contrário do primeiro, não precisa de nenhum recorte ou preenchimento, e os tokens têm a mesma semântica entre os exemplos (ou seja, “TV” será constante nas divisões, independentemente da posição).

Contras

  • Essa estratégia geralmente leva a divisões altamente desequilibradas e esparsas, 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 altamente esparsas generalizam pior que árvores balanceadas, geralmente resultando em um modelo menos preciso.
  • Não leva em consideração informações posicionais. Isso pode prejudicar o desempenho dos recursos de linguagem natural.
  • Aprender divisões numéricas em dados categóricos não é ideal; existem otimizações para encontrar divisões categóricas que não são aproveitadas aqui.
  • A complexidade computacional do treinamento aumenta linearmente com o número de itens de vocabulário (cada um deles será 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 overfitting), isso torna o treinamento de vocabulários com mais de 5 mil itens muito lento.
  • O consumo de memória de treinamento será de 1 byte (para one-hot) ou 4 bytes (para contagens) por item de vocabulário por exemplo, pois no momento da indexação os dados serão armazenados como uma versão densa dos dados esparsos. Isso pode crescer proibitivamente para vocabulários e conjuntos de dados maiores.

Vários recursos categóricos com 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 seja um recurso separado e independente. No exemplo acima, se “Compras anteriores” tiver no máximo 5 tokens, podemos criar os recursos f1...f5 representando os tokens 1-5 e descartar quaisquer 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ântica adicional (como ordem de compra no exemplo) de forma mais natural do que outros métodos.

Contras

  • Adiciona semântica aos tokens preenchidos “ausentes” que servirão como ruído para o modelo. Isto 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 o recurso for [“A”, “B”] a previsão será diferente da previsão para [“B”, “A”], e se este último nunca foi visto 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 da posição.
  • Por padrão, cada token será representado por um recurso com um vocabulário diferente. Mesmo se você forçar 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 aprender separadamente para cada posição do token.

Melhores estratégias

Conjuntos Categóricos

Conjuntos categóricos ( https://arxiv.org/pdf/2009.09991.pdf ) são representações de recursos padrão do TF-DF para texto esparso. Um conjunto categórico é efetivamente um pacote de palavras, ignorando duplicatas e ordem. 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 (veja 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 one-hot podem aprender as mesmas informações. No entanto, veja o exemplo a seguir, onde a árvore está tentando aprender a seguinte função:

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

Neste 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 “alta”, “divisão” e “jogo”, e precisaria encontrar nós folha razoáveis ​​para todas as disjunções possíveis dessas categorias (ou seja, “alta” e não “velocidade”). Na prática, a codificação one-hot leva a árvores altamente desequilibradas que não podem ser otimizadas de forma eficiente pelos algoritmos de aprendizagem florestal de decisão de melhor desempenho.

Prós

  • Melhor no aprendizado de informações complicadas para florestas de decisão.
  • Altamente eficiente para servir (pode ser servido com QuickScorer, que pode servir árvores grandes em até menos de microssegundos por exemplo). A complexidade do tempo de atendimento é linear no número de itens do conjunto categórico de cada exemplo, que na prática é muito menor 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 de escalas divididas 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 ambientes práticos. Observe que essa velocidade de treinamento pode ser melhorada ajustando a fração de amostragem do algoritmo ganancioso, mas pode atingir uma qualidade abaixo do ideal.

Incorporações

As redes neurais têm apresentado desempenho de última geração 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 ​​​​de maneira muito diferente internamente. Observe que aqui nos referimos a “incorporação” como qualquer codificação de rede neural, por exemplo, a saída de camadas transformadoras/convolucionais/recorrentes.

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 sentenças semelhantes são próximos no espaço euclidiano demonstrou ser bem transferida entre 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, as árvores de decisão usam incorporações como recursos numéricos individuais e aprendem partições alinhadas aos eixos desses recursos individuais 1 . Isso significa que é quase impossível utilizar a mesma informação semântica – um produto escalar ou uma multiplicação de matrizes, por exemplo, não pode ser representado com um conjunto de divisões alinhadas aos eixos. Além disso, ao contrário das redes neurais, que podem atualizar os embeddings por meio de gradiente descendente durante o treinamento, os algoritmos padrão de aprendizado de floresta de decisão são não diferenciáveis, o que significa que os embeddings devem permanecer congelados. Observe que há trabalhos ( https://arxiv.org/pdf/2007.14761.pdf, por exemplo) sobre florestas de decisão diferenciáveis. No entanto, talvez em parte porque na prática nem todos os bits de informação numa incorporação são realmente utilizados, mesmo por redes neurais, esta 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 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 aproveitar informações de outro conjunto de dados (pré-treinamento para aprendizagem por transferência).

Contras

  • Não é bom para memorizar informações - as divisões podem causar classificações confusas ou alta sensibilidade ao fraseado (ou seja, “o roteador é ótimo” versus “um ótimo roteador”) produzirá embeddings diferentes, que podem ser próximos no espaço euclidiano, mas não necessariamente ter semelhanças. características numéricas.
  • Mais lento para servir, porque a passagem completa do codificador precisa ser feita no momento da inferência. A latência real depende muito da arquitetura que produziu os embeddings; isto é, um codificador de transformador normalmente será muito mais lento do que uma pesquisa de tabela de incorporação bruta com pooling médio.

Notas


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