transformer的扩展

bert

  • bert是有一个固定的词表(不把words当成tokens,而是将wordpieces(是一种subword)当做tokens)中的,预训练模型中有词表中的embedding和所有层的参数。
  • base的是12层的encoder,和transformer中的encoder只有在模型输出部分不一样,其他地方全都一样。
  • 在分类任务中,输入的第一个符号是[CLS],我们只用将这个位置的embedding(768维)传递给用于分类的单层前向神经网络即可,因为是fine-turn所以用于分类的网络要尽可能的简单。

masked language model

  • 按理说因为有self-attention的原因,每个单词都能看到其他单词的信息,因此transformer不能当做语言的encoder的(根据中心词预测其他词,或者根据其他词预测中心词),因此作者想到的解决方法是mask掉这个词的位置,然后预测出这个mask掉的词。

双句子任务

  • 有一些任务的输入时两个句子(比如说是判断两个句子是不是互为复述),因此需要训练过程中加入两个句子来训练的任务,bert使用的方法是两个句子中间加入[sep]进行分割,预训练的任务也是,预测A句子是否在B句子的前面,这有就能捕获两个句子之间的依赖关系了。
  • 同时要注意的是为了适用于双语的句子,bert加入了segment embeddings,句子1segment embedding0,句子2segment embedding1,如果输入只有一种句子,那么就只用一种segment embedding

其他的使用bert的方式

  • 使用encoder的不同的位置用于不同的任务。
  • 也可以使用bert提取了句子中每个词的表示,然后用于你自己的任务中,就像命名实体识别一样。
  • 但是使用哪些embedding是最好的?还是无法得知的,论文中给出了命名实体识别任务中的6种使用embedding的方式,可以看到,concat最后四层的embedding的效果是最好的。

fineturn时候的参数

  • 这些参数再所有task上都表现的不错
    • Batch Size: 16, 32
    • Learning Rate: 5e-5, 3e-5, 2e-5
    • Number of epochs: 3, 4

lr 3e-5,epoch 4 ,bs 32

  • finetune的脚本
export BERT_BASE_DIR=/downloaded_model_path/bert
export GLUE_DIR=/downloaded_data_path/glue
export BERT_OUTPUT_DIR=/trained/model/bert/

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=$BERT_OUTPUT_DIR

用bert提取单词的表示(像elmo一样)

echo 'Who was Jim Henson ? ||| Jim Henson was a puppeteer' > input.txt

python extract_features.py \
  --input_file=input.txt \
  --output_file=$BERT_OUTPUT_DIR/output.jsonl \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --layers=-1,-2,-3,-4 \
  --max_seq_length=128 \
  --batch_size=8
  • 得到的文件里面就是对应单词的各个层的参数。
- features
  - token: Token value (e.g. Who)
  - layers
    - index: Layer number (from -1 to -4) per token
    - values: Vector values. Default model dimension is 768
  • 一些超参数,使用bert训练自己的模型的时候可能会用到
    • data_dir: Data directionary
    • task_name: Specific what task do you use. Specific tasks processors are ready for use. Possible task_name are “cola”, “mnli”, “mrpc” and “xnli”. You can implement your own data processor by extending DataProcessor class.
    • do_train: Include training step. Any one of do_train , do_eval or do_test have to been enabled.
      一些补充
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容