2 pontos por GN⁺ 2024-08-20 | 1 comentários | Compartilhar no WhatsApp
  • É um experimento para classificar cerca de 8,4 milhões de PDFs do SafeDocs usando metadados de URL, em vez do conteúdo original, com o objetivo de etiquetar um grande corpus documental a um custo realista
  • Em vez dos 8 TB de PDFs completos, usa cerca de 8 GB de metadados e rótulos gerados por LLM, aplicando uma abordagem teacher/student no estilo FineWeb à classificação de URLs de PDFs
  • Um único classificador de deep learning ficou em 59,14% de acurácia com Alibaba-large-gte-1.5, mas a combinação de embeddings de URL com XGBoost chegou a 85,26% após busca de hiperparâmetros
  • Um ensemble de XGBoost e LinearRegressor baseado em TF-IDF também registrou 67,52% e 70,68%, respectivamente, mostrando que abordagens tradicionais simples de NLP superaram a linha de base inicial de deep learning
  • O conjunto final de rótulos, embeddings, informações de download da base original e o código foram publicados, podendo ser reutilizados em experimentos de classificação de PDFs ou em pipelines de dados para modelos VLM/Omni

Corpus de PDFs SafeDocs e objetivo da classificação

  • Common Crawl é um arquivo da web da internet e, ao encontrar um PDF, salva apenas o primeiro 1 MB do arquivo completo e corta o restante
  • SafeDocs ou CC-MAIN-2021-31-PDF-UNTRUNCATED é um corpus criado ao buscar novamente os PDFs de um snapshot do Common Crawl para obter versões não truncadas
  • Esse dataset é composto por cerca de 8,4 milhões de PDFs e tem tamanho total de 8 TB descompactado
  • O objetivo é classificar os PDFs com rótulos temáticos
    • Ex.: um PDF de Linear Algebra vira Math
    • Ex.: um livro-texto de Anatomy vira Medicine

Criando rótulos com metadados de URL

  • Em vez de processar diretamente os 8 TB do conteúdo completo, o trabalho usa os metadados do dataset original
    • Os metadados têm cerca de 8 GB de texto
    • A principal coluna é url
  • O nome do arquivo na URL serve como pista para inferir a natureza do documento
    • Ex.: Introduction_to_Python_Programming_-_WEB.pdf
    • Esse nome sugere que o arquivo provavelmente é um documento educacional ou técnico
  • O método de rotulagem foi inspirado na abordagem do FineWeb
    • Um LLM atua como teacher, gerando rótulos a partir de texto não estruturado
    • Um classificador menor, o student, é treinado com esses rótulos gerados
  • Usando este prompt e o Llama-3-70B via API da together, foram gerados os 100 mil rótulos iniciais
  • Como a distribuição dos rótulos era desbalanceada e havia muitas classes pequenas, rótulos com menos de 250 ocorrências foram agrupados em other
  • Depois, foram selecionadas no máximo 5.000 amostras por rótulo para equilibrar a base, resultando em um dataset final rotulado com 59 mil exemplos

Tentativa de fine-tuning de modelo de embeddings

  • A primeira abordagem foi processar o texto das URLs com um modelo de embeddings e fazer fine-tuning para o problema de classificação
  • O FineWeb Edu usou snowflake-arctic-embed-m, mas o experimento também considerou modelos bem colocados no Massive Text Embeddings Benchmark
  • Como modelos de cerca de 7B parâmetros pareceram pouco práticos para classificar rapidamente 8 milhões de PDFs, foram testadas alternativas menores
    • Stella_en_400M
    • gte-large-1.5
    • Arctic Embed
    • all-mpnet-base
    • distillbert
    • flant-t5-small
    • bert-base-uncased
  • Com Hugging Face, o modelo-base foi mantido congelado e apenas os embeddings e a cabeça de classificação foram treinados, permitindo rodar até em notebook
  • Nessa abordagem, o melhor modelo foi Alibaba-large-gte-1.5, com 59,14% de acurácia

Elevando o desempenho com XGBoost

  • A segunda abordagem não usa diretamente o modelo de embeddings como classificador; em vez disso, gera embeddings das URLs e os usa como entrada do XGBoost
  • Após converter o texto em embeddings, o XGBoost é treinado como se fossem dados tabulares
  • Foram gerados embeddings para todos os links de PDF, totalizando cerca de 40 GB descompactados
  • Em vez de um único classificador grande, foram treinados classificadores binários por classe
  • O desempenho médio do modelo de embeddings com XGBoost foi o seguinte
    • accuracy: 0.839750
    • precision: 0.859758
    • recall: 0.819733
    • f1: 0.838937
  • Essa abordagem obteve uma acurácia 24,83 p.p. superior à abordagem inicial de deep learning

Resultados com TF-IDF e LinearRegressor

  • A terceira abordagem cria características de texto com TF-IDF, sem embeddings de deep learning, e então treina o modelo
  • TF-IDF dá pesos maiores a palavras frequentes em um documento específico, mas raras no corpus total
  • O desempenho do XGBoost com TF-IDF foi o seguinte
    • accuracy: 0.675200
    • precision: 0.683185
    • recall: 0.646316
    • f1: 0.662497
  • Também foi testado um ensemble de LinearRegressor baseado em TF-IDF
    • accuracy: 0.706802
    • precision: 0.723558
    • recall: 0.663038
    • f1: 0.690286
  • As duas abordagens superaram a linha de base inicial de deep learning, de 59,14%

Nova tentativa de deep learning com mais rótulos gerados por LLM

  • Foi definida uma meta de 70% de acurácia para o classificador único de deep learning, e mais rótulos foram gerados
  • Os rótulos adicionais somaram 400 mil, gerados com Llama3.1-7B
    • O motivo para usar um modelo menor do que antes foi reduzir o custo de inferência
  • Os experimentos mostraram que mais dados levaram a melhor desempenho
  • Inspirado por The Llama 3 Herd of Models, da Meta, o trabalho testou roberta-base e o já usado gte-large
  • O gte-large atingiu até 69,22% de acurácia no dataset de treino

Desempenho final por modelo

  • Os resultados dos experimentos foram os seguintes
Model Name Accuracy
gte-large naïve (59k labels) 59.14%
XGBoost embeddings 83.97%
XGBoost Tf-Idf 67.52%
LinearRegressor Tf-Idf 70.68%
gte-large naïve (400k labels) 69.22%
XGBoost Embeddings HyperParameter Sweep 85.26%
  • No fim, o melhor modelo foi o de XGBoost com embeddings
  • O modelo de embeddings com XGBoost após busca de hiperparâmetros alcançou o melhor resultado, com 85,26% de acurácia

Classificação do corpus completo e visualização

  • O código final tem uma estrutura simples: carrega os embeddings na memória e faz as previsões
  • A previsão de rótulos para todo o conjunto de PDFs levou cerca de 1 hora
    • Não houve configuração para execução em GPU, então a GPU não foi usada
  • Os resultados previstos e os embeddings foram visualizados com PCA e UMAP
  • O PCA visualizou cerca de 8,5 milhões de pontos do dataset inteiro em uma única imagem
  • O UMAP foi executado alugando uma máquina maior
    • Azure Standard_E48s_v3
    • 48 núcleos
    • 384 GB de RAM
    • 768 GB de disco
    • O UMAP conseguiu processar até 6,5 milhões de pontos; acima disso, o limite de memória já ficava muito próximo

Dados e código publicados

  • O dataset final está disponível neste repo do Hugging Face
  • Se você precisar apenas dos embeddings, eles podem ser baixados neste dataset do Kaggle
  • As informações de download do dataset original SafeDocs estão neste bucket S3
  • O código de classificação está no caminho classify_metadata do monorepo no GitHub
  • Como PDFs misturam dados e imagens, a avaliação é que eles podem ser usados com mais frequência em pipelines de treinamento de modelos VLM/Omni

1 comentários

 
GN⁺ 2024-08-20
Opiniões no Hacker News
  • Por volta de 2009, fiz um trabalho de visualização semelhante com cerca de 5,7 milhões de artigos de pesquisa (PDFs, corpus privado) de editoras científicas como Elsevier e Springer
    Newton, G., A. Callahan & M. Dumontier. 2009. Semantic Journal Mapping for Search Visualization in a Large Scale Article Digital Library. Second Workshop on Very Large Digital Libraries at the European Conference on Digital Libraries (ECDL) 2009. https://lekythos.library.ucy.ac.cy/bitstream/handle/10797/14...
    Eu sou o primeiro autor

    • Imagino que tenha dado um trabalho enorme minerar todos esses artigos
      Se o benchmark de 2009 foi de 13 horas, fico curioso para saber quanto tempo o cálculo levaria hoje
      Hoje em dia, acho que todo mundo simplesmente jogaria esses dados no UMAP
    • Fico curioso sobre como se define a ordem dos autores
      E também se o ampersand & tem um significado diferente de and, ou se é apenas formato de citação
  • Uma das vantagens dos embeddings que se discute menos hoje em dia é que é possível aplicar técnicas tradicionais de modelagem estatística quase diretamente, e, de quebra, evitar as sutilezas e armadilhas de pré-processamentos comuns de NLP, como stemming
    Este artigo mostra especialmente bem por que usar embeddings de LLM logo como primeira etapa de NLP, sobretudo para documentos longos, é uma abordagem prática

    • Você quer dizer que dá para aplicar técnicas estatísticas aos próprios embeddings? Fico curioso para saber como isso funciona
  • Sou o autor. Não esperava que este post chegasse ao topo do HN; podem me perguntar qualquer coisa

    • Fico curioso se há materiais recomendados para aprender esse tipo de análise
      Dei uma olhada no código e vi muita coisa que não conheço; parece que, mais do que Python em si, há muitas técnicas de análise que eu desconheço
    • Você mencionou a acurácia de várias técnicas usadas; poderia explicar melhor como essa acurácia foi calculada?
      Os PDFs já estavam classificados?
  • Foi um texto interessante e cheio de detalhes. Mas, ao fazer aprendizado binário um-contra-todos, equilibrar as classes e usar a probabilidade máxima na inferência pode ser problemático, porque as probabilidades podem não ficar bem calibradas
    Fico curioso se vocês fazem calibração de probabilidade separadamente antes de aplicar argmax

  • Em 2006 já havia várias coleções de torrents de 1 TB de livros didáticos
    Imagino que hoje o tamanho e a quantidade sejam ainda maiores

    • Isso foi antes de virar algo sistemático acumular esse tipo de material e criar negócios meio ambíguos em cima disso
      Lembro que, até 2008, era muito mais fácil encontrar livros didáticos, manuais de soluções, PDFs relacionados e outros materiais do que 6 a 8 anos depois
      A maior diferença é que vários sites como o Chegg começaram a sugar esse material e revendê-lo de alguma forma
    • Pessoalmente, tenho cerca de 350 GB de manuais de serviço, datasheets, catálogos e periódicos antigos
      A maior parte é material de eletrônica e engenharia, que baixei de torrents há uns 2 anos, quando queria brincar com GraphQL e dados de OSR
    • Se quiser, no Anna's Archive há muitos torrents na casa das dezenas de TB
  • Tenho algo entre 20 e 40 TB de PDFs (antes da deduplicação)
    8 TB é bastante, mas não chega nem perto do volume total de PDFs que existe no mundo

    • Fico curioso sobre o que você coleciona. É principalmente espelhar coisas como o LibGen?
      Eu também tenho uma coleção razoável de ebooks, PDFs e mangás que juntei para ler, mas não consigo imaginar o tamanho de uma biblioteca de 20 TB
    • Fico curioso se você pretende disponibilizar isso publicamente. Ou isso não é permitido nesse dataset?
      Com certeza existem muito mais PDFs do que 8 TB. Provavelmente há muita duplicação aí, mas, por ter muitas imagens, acho que a deduplicação não funcionaria tão bem
  • É um texto interessante e divertido. Testei várias soluções de LLM/IA generativa para extrair dados tabulares de PDFs, mas os resultados ficaram aquém do esperado
    Elas vão bem em extrair strings de texto ou fazer resumos, por exemplo responder qual é o valor total ou quando foi impresso, mas ainda cometem bastante erro ao extrair de forma confiável para CSV

  • Muito legal. Na Airtrain também verificamos que embeddings são muito valiosos para criar modelos de classificação
    Se você quiser mexer com muito texto e embeddings, recentemente deduplicamos e geramos embeddings de todo o fineweb-edu (também mencionado no texto) e colocamos o dataset resultante no Hugging Face: https://huggingface.co/datasets/airtrain-ai/fineweb-edu-fort...

  • Ideia muito bacana. Não tenho tido muito tempo livre ultimamente, mas há pouco tempo pensei em fazer um projeto parecido, embora diferente
    Eu queria criar uma ferramenta open source para baixar dados de séries temporais úteis para ciências sociais. Por exemplo, séries temporais de comentários em redes sociais sobre preços de alimentos
    Acho que os LLMs abriram vários novos ângulos de pesquisa que ainda não são muito explorados
    Se um dia eu tocar esse projeto paralelo, talvez aproveite algumas boas ideias daqui

  • Excelente trabalho. Vocês combinaram várias abordagens, de modo parecido com o que bibliotecas nacionais às vezes fazem. Eu também já usei todo tipo de embeddings → classificadores e LDA
    Fiquei curioso sobre o prompt: https://github.com/snat-s/m/blob/main/classify_metadata/prom...
    Isso não é, na prática, parecido com dar um prompt pedindo para classificar por tipo de URL?