Modificação do código-fonte Bert para concluir tarefas de classificação múltipla

(Autor: mestre de dados Chen Yujue )

Por muito tempo, usei expressões regulares para processar a classificação de texto, mas as expressões regulares precisam ser mantidas com frequência.Se o modelo SMS for atualizado, é necessário considerar a adição do novo modelo à expressão regular. Na verdade, isso é bastante trabalhoso. Embora possamos usar pyltp para substituir alguns nomes de organizações/pessoas no texto e, em seguida, desduplicar o texto para limpar relativamente fácil de extrair modelos regulares, mas depois que houver mais categorias e fontes, é precisa ser processado e testado. A quantidade de templates ainda é muito grande, então pensei, posso rotular o texto que foi classificado com expressões regulares e a classificação identificada por expressões regulares, e então usar o bert para classificar o texto, então que não preciso atualizar as expressões regulares manualmente La.

Mas sobre o bert, existem muitas maneiras de usá-lo na Internet.Existe o bert4keras desenvolvido por Su Jianlin, e o código encontrado na Internet também foi executado com sucesso, mas você ainda não conhece os detalhes. Portanto, quero encontrar um script que possa usar o código-fonte para modelagem. A documentação oficial está anexada aqui: https://github.com/google-research/bert

O documento oficial está realmente escrito de forma muito clara. Para fazer tarefas de classificação, você só precisa ler a seção Tarefas de classificação de frases (e pares de frases). Vejamos as partes principais:

export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12
export GLUE_DIR=/path/to/glue

python run_classifier.py \
  --task_name=MRPC \
  --do_train=true \
  --do_eval=true \
  --data_dir=$GLUE_DIR/MRPC \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --max_seq_length=128 \
  --train_batch_size=32 \
  --learning_rate=2e-5 \
  --num_train_epochs=3.0 \
  --output_dir=/tmp/mrpc_output/

Defina o caminho do modelo pré-treinado bert como BERT_BASE_DIR (o link também é fornecido no documento oficial do modelo pré-treinado, você mesmo pode encontrá-lo, eu uso Harbin Institute of Technology, https://github.com/ ymcui/Chinese-BERT- wwm# Download do modelo chinês, este endereço é encontrado no git do bert4keras de Su Jianlin), o arquivo do modelo baixado, após a descompactação, a estrutura é a seguinte: bert_model.ckpt é um arquivo de ponto de verificação, que registra
insira a descrição da imagem aqui
o parâmetros de peso do modelo, incluindo três arquivos (I Baixei um modelo de pré-treinamento de outras fontes antes e encontrei um bug. Ao ler os três arquivos do ckpt, eles serão lidos uniformemente. Não consegui lê-los antes , porque meu arquivo .ckpt.data, o nome é .ckpt(1).data, e posteriormente alterado para .ckpt. Isso mostra tensorflow.python.framework.errors_impl.datalosserror: unable to open table fileque isso ocorre porque o arquivo ckpt não está totalmente carregado e o meta e o índice não estão carregados . Referência da solução: https://blog.csdn.net/ Zhang_xi_xi_94/article/details/81293048. Na verdade, ckpt consiste em três arquivos, desde que não haja caracteres extras no meio, os sufixos secundários dos três arquivos são os mesmos.)

bert_model.json é a estrutura da rede e vocab.txt é o dicionário do modelo.

GLUE_DIR é o caminho da amostra de entrada. No código-fonte bert, existem tipos fixos de dados de entrada que podem ser processados. Se o seu tipo de dados de entrada não estiver entre eles, você mesmo precisará escrever um processador de processamento de dados, o que requer alteração o código-fonte. O processador embutido pode processar conjuntos de dados XNLI/MultiNLI/MRPC/CoLA.

O resto dos parâmetros são mais convencionais.

Quando se trata de classificação, você pode escrevê-lo diretamente como no site oficial. Depois de adicionar seu próprio processador, passe parâmetros para o script para chamar diretamente o script para classificação de texto. Você também pode copiar diretamente o script run_classifier.py e escrever os parâmetros diretamente no script.In, (ou seja, gravar os parâmetros até a morte), execute o script diretamente sem passar parâmetros.

Uma coisa a observar durante a execução é que o bert usa tpu por padrão. Embora exista um parâmetro para definir se deve usar tpu para treinamento do modelo, mesmo que o parâmetro esteja definido como Falso, o estimador usado no código é tf.contrib.tpu .TPUEstimatorSpec , quando você só tem cpu ou gpu, você precisa mudar esta parte para tf.estimator.EstimatorSpec.

Na verdade, este é o conteúdo. Quanto ao que o ajuste fino faz, na verdade é adicionar uma nova camada de modelo ao modelo bert pré-treinado para realizar sua tarefa. Por exemplo, se você fizer classificação, adicione uma nova camada para bert. softmax ou sigmoid.

Para a implementação do código específico, consulte https://github.com/javaidnabi31/Multi-Label-Text-classification-Using-BERT/blob/master/multi-label-classification-bert.ipynb e o site oficial Sim, este git pode ser usado diretamente, não há bug, só precisa modificar a parte dos dados de leitura, o site oficial é usado para entender o código.

Depois que o código foi alterado, usei-o para treinamento. No início, recebi menos de 3W de mensagens de texto, que foram marcadas. O tamanho do lote é 32, a taxa de aprendizado é 4e-5, NUM_TRAIN_EPOCHS = 1,0, max_seq_length é 128, e eu tenho 11 classificações, e meu conjunto de dados de trem tem 11 classificações diferentes de texto, mas há apenas 1 categoria no teste, porque não selecionei aleatoriamente o conjunto de treinamento e o conjunto de teste. Acontece que a classificação não é tão eficaz quanto a regularização. Então, ajustei os parâmetros, aumentei as amostras de treinamento + teste para 6W e selecionei aleatoriamente o treinamento e o teste para garantir que as amostras em ambos os conjuntos de dados fossem ricas, o tamanho do lote foi alterado para 256, a taxa de aprendizado foi aumentada para 2e-5 , e NUM_TRAIN_EPOCHS = 2.0, max_seq_length é alterado para 50 (porque os meus são todos textos curtos, a maioria deles não chega a 128 palavras, se convertido em um vetor com comprimento de 128, os seguintes são todos 0, o que pode afetar o julgamento), o efeito é melhor do que a divisão regular Agora, pode substituir completamente a regularidade.

Referências:

  1. https://github.com/google-research/bert Documento oficial do bert
  2. https://blog.csdn.net/HGlyh/article/details/106744286 (Usando bert4keras desenvolvido por Su Jianlin, a implementação é relativamente simples, você pode tentar este primeiro)
  3. https://github.com/javaidnabi31/Multi-Label-Text-classification-Using-BERT/blob/master/multi-label-classification-bert.ipynb De acordo com o run_classifier.py oficial modificado para fazer script de classificação múltipla, siga O roteiro original ainda está um pouco diferente, talvez porque o oficial fez algumas alterações, ou o próprio blogueiro fez algumas alterações
  4. https://blog.csdn.net/weixin_37947156/article/details/84877254 Análise oficial de uso do código-fonte run_classifier.py, algum conteúdo se sobrepõe ao github oficial
  5. https://github.com/ymcui/Chinese-BERT-wwm#%E4%B8%AD%E6%96%87%E6%A8%A1%E5%9E%8B%E4%B8%8B%E8%BD %BD (download de vários modelos bert chineses do Harbin Institute of Technology, baixados por Su Jianlin's bert4keras sang)

Acho que você gosta

Origin blog.csdn.net/weixin_39750084/article/details/108122492
Recomendado
Clasificación