Rede Neural analisar dados de seqüência de caracteres?

28

Então, estou começando a aprender como uma rede neural pode operar para reconhecer padrões e categorizar entradas, e vi como uma rede neural artificial pode analisar dados de imagem e categorizar as imagens ( demo com convnetjs ), e a chave é reduzir a amostra da imagem e cada pixel estimula um neurônio de entrada na rede.

No entanto, estou tentando entender se isso é possível com entradas de string? O caso de uso que eu tenho é um "mecanismo de recomendação" para filmes que um usuário assistiu. Os filmes têm muitos dados de sequência (título, enredo, tags), e eu poderia imaginar "reduzir a amostragem" do texto para algumas palavras-chave que descrevem esse filme, mas mesmo se eu analisar as cinco principais palavras que descrevem esse filme, eu acha que precisaria de neurônios de entrada para cada palavra em inglês para comparar um conjunto de filmes? Eu poderia limitar os neurônios de entrada apenas às palavras usadas no conjunto, mas poderia crescer / aprender adicionando novos filmes (o usuário assiste a um novo filme, com novas palavras)? A maioria das bibliotecas que eu vi não permite adicionar novos neurônios após o treinamento do sistema?

Existe uma maneira padrão de mapear dados de cadeia / palavra / caractere para entradas em uma rede neural? Ou uma rede neural realmente não é a ferramenta certa para o trabalho de analisar dados de string como este (qual é a melhor ferramenta para correspondência de padrões em dados de string)?

Meia-noite
fonte

Respostas:

19

Usar uma rede neural para prever dados de linguagem natural pode ser uma tarefa complicada, mas existem métodos testados e verdadeiros para torná-lo possível.

No campo Processamento de linguagem natural (PNL), o texto é frequentemente representado usando o modelo de pacote de palavras. Em outras palavras, você tem um vetor de comprimento n , em que n é o número de palavras em seu vocabulário e cada palavra corresponde a um elemento no vetor. Para converter texto em dados numéricos, basta contar o número de ocorrências de cada palavra e colocar esse valor no índice do vetor que corresponde à palavra. A Wikipedia faz um excelente trabalho ao descrever esse processo de conversão. Como o comprimento do vetor é fixo, é difícil lidar com novas palavras que não são mapeadas para um índice, mas existem maneiras de ajudar a atenuar esse problema ( hash do recurso de pesquisa ).

Esse método de representação tem muitas desvantagens - não preserva a relação entre palavras adjacentes e resulta em vetores muito esparsos. Observar n-gramas ajuda a resolver o problema de preservar os relacionamentos das palavras, mas, por enquanto, vamos nos concentrar no segundo problema, a esparsidade.

É difícil lidar diretamente com esses vetores esparsos (muitas bibliotecas de álgebra linear fazem um trabalho ruim ao lidar com entradas esparsas); portanto, o próximo passo é a redução da dimensionalidade. Para isso, podemos nos referir ao campo da modelagem de tópicos : Técnicas como Alocação de Dirichlet Latente (LDA) e Análise Semântica Latente (LSA) permitem a compressão desses vetores esparsos em vetores densos, representando um documento como uma combinação de tópicos. Você pode corrigir o número de tópicos usados ​​e, ao fazê-lo, corrigir o tamanho do vetor de saída produzido pelo LDA ou LSA. Esse processo de redução de dimensionalidade reduz drasticamente o tamanho do vetor de entrada enquanto tenta perder uma quantidade mínima de informações.

Finalmente, depois de todas essas conversões, você pode alimentar as saídas do processo de modelagem de tópicos nas entradas da sua rede neural.

Madison May
fonte
1
Let me know if you have further questions and I'll do my best to provide some more detail.
Madison May
Obrigado, isso me dá ótimos termos para continuar explorando!
MidnightLightning
Aliás, posso me relacionar com o "hash de recursos", pois isso parece muito semelhante a um filtro de bloom , com o qual estou familiarizado ao trabalhar com código de criptomoeda. Pergunto-me se é mais eficaz para ter uma função hash relacionar um recurso de entrada para várias posições de índice (Bloom-filtro de estilo) ao invés de necessidade de uma segunda função hash para definir o sinal de um índice ...
MidnightLightning
6

Ambas as respostas de @Emre e @Madison May destacam a questão em questão. O problema é representar sua string como um vetor de recurso para entrada no NN.

Primeiro, o problema depende do tamanho da string que você deseja processar. Seqüências longas que contêm tokens (geralmente palavras) geralmente são chamadas de documentos nessa configuração. Existem métodos separados para lidar com tokens / palavras individuais.

Existem várias maneiras de representar documentos. Muitos deles fazem a suposição de palavras-chave . Os tipos mais simples representam o documento como um vetor da contagem de palavras ou termo frequência (tf). Para eliminar os efeitos do tamanho do documento, geralmente as pessoas preferem normalizar pelo número de documentos em que um termo aparece, frequência do documento ( tf-idf ).

Outra abordagem é a modelagem de tópicos, que aprende uma representação latente de baixa dimensão dos dados. LDA e LSI / LSA são escolhas típicas, mas é importante lembrar que isso não é supervisionado. A representação aprendida não será necessariamente ideal para qualquer aprendizado supervisionado que você esteja fazendo com o seu NN. Se você deseja fazer a modelagem de tópicos, também pode tentar modelos de tópicos supervisionados .

Para palavras individuais, você pode usar o word2vec , que utiliza NNs para incorporar palavras em um espaço de tamanho arbitrário. A semelhança entre dois vetores de palavras neste espaço aprendido tende a corresponder à semelhança semântica.

Uma abordagem pioneira mais recente é a dos vetores de parágrafos , que primeiro aprendem um modelo de palavra semelhante ao word2vec e depois constroem essa representação para aprender uma representação distribuída de conjuntos de palavras (documentos de qualquer tamanho). Isso mostrou resultados de ponta em muitas aplicações.

Ao usar NNs na PNL, as pessoas geralmente usam arquiteturas diferentes, como Redes Neurais Recorrentes (como redes de Memória de Longo Prazo ). Em alguns casos, as pessoas até usaram redes neurais convolucionais no texto.

jamesmf
fonte
Eu acho que o word2Vec é realmente a resposta mais precisa para a pergunta. Há um muito bom tutorial Kaggle sobre como treinar e uso um: kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner
Obrigado, eu esqueci o link word2vec, vou acrescentar um (além do que você listar aqui!)
jamesmf
3

Este não é um problema sobre redes neurais em si, mas sobre a representação de dados textuais no aprendizado de máquina. Você pode representar os filmes, elenco e tema como variáveis ​​categóricas. O enredo é mais complicado; você provavelmente desejaria um modelo de tópico para isso, mas deixaria isso de fora até você entender o jeito. É exatamente essa "amostra reduzida" textual que você mencionou.

Dê uma olhada neste tutorial para aprender como codificar variáveis ​​categóricas para redes neurais. E boa sorte!

Emre
fonte
Vale ressaltar que isso não é explicitamente um problema em todo o aprendizado de máquina, mas apenas quando se trata de gerar vetores de recursos, que não são onipresentes no aprendizado de máquina.
Slater Victoroff
Que tipo de aprendizado de máquina não usa recursos?
Emre
A floresta aleatória é um bom exemplo de algo para o qual não é um problema obter um vetor de característica do tipo que você vê nas redes neurais. Muitos métodos não supervisionados também funcionam com palavras brutas em vez de vetores de recursos. Nota: Eu não disse que existem métodos que não usam recursos, apenas que existem métodos que não dependem de vetores estritamente estruturados.
Slater Victoroff
Não sei o que você quer dizer com "estritamente estruturado".
Emre
estritamente estruturado é um vector de 1d do unint8 em oposição a uma lista que contém um dicionário, uma matriz de ponderação, e uma série de cordas
Slater Victoroff
0

Eu tentei as duas maneiras a seguir para implementação trial-n-test de redes neurais com texto. O último funciona razoavelmente bem, mas com limitações.

  1. Crie vocabulário usando word2vect ou NLTK / tokens de palavras personalizadas e atribua um índice a cada palavra. É este índice que representa a palavra como número.

    Desafios:

    • Os índices devem ser "normalizados" usando a escala de recursos.
    • Se a saída da rede neural tiver uma leve variação, a saída poderá ser um índice para palavras inesperadas (por exemplo, se a saída esperada for 250; mas a NN emitir 249 ou 251, poderá ser uma saída próxima do contexto numérico; mas são índices para palavras diferentes). NN recorrente para gerar índice de saída pode ser aproveitado aqui.
    • Se novas palavras forem adicionadas ao vocabulário, os índices de token deverão ser redimensionados. O modelo treinado com valores escalados anteriormente pode se tornar inválido e deve ser treinado novamente.
  2. Use matriz de identidade, por exemplo, para palavras "n", use matriz "nx n" ou (n-1 x n-1) em que cada linha e coluna representa uma palavra. Coloque "1" na célula de interseção e "0" nos locais de descanso. ( referência )

    Desafios:

    • Todo valor de entrada e saída é o vetor "nx 1". Para um vocabulário de tamanho grande, é uma computação volumosa e mais lenta.
    • Se novas palavras forem adicionadas ao vocabulário, a matriz de identidade (ou seja, vetor de palavras) deve ser recalculada. O modelo treinado com vetores calculados anteriormente pode se tornar inválido e deve ser treinado novamente.
ak2205
fonte