自然语言处理

T5(Transfer Text-to-Text Transfo

2022-06-12  本文已影响0人  晓柒NLP与药物设计

论文链接:https://arxiv.org/abs/1910.10683

代码链接:https://github.com/google-research/text-to-text-transfer-transformer

导言:一个统一框架,靠着大力出奇迹,将所有 NLP 任务都转化成 Text-to-Text(文本到文本)任务

T5多任务概述图

比如英德翻译任务,只需将训练数据集的输入部分前加上translate English to German即可。假设需要翻译That is good,那么先转换成translate English to German:That is good.输入模型,之后就可以直接输出德语翻译Das ist gut.。对于需要输出连续值的STS(文本语义相似度任务),也是直接输出文本。通过这样的方式就能将NLP任务都转换成Text-to-Text形式,也就可以用同样的模型,同样的损失函数,同样的训练过程,同样的解码过程来完成所有NLP任务


1.1 模型结构

T5模型采用Transformer的encoder-decoder结构,GPT采用的是Transformer的decoder结构,BERT采用的是Transformer的encoder结构
T5模型图

T5模型和原始的Transformer结构基本一致,具体的做了如下几点改动:


1.2 数据来源:Colossal Clean Crawled Corpus (C4)

T5作者选取了Common Crawl数据集,这个数据集每周大约爬取20TB的WEB数据。虽然数据集已经抽取了文本,但实际上并不干净,里面还包含了很多非自然语言的东西,比如错误消息、菜单、重复文本,于是对数据进行了比较细致的处理:
经过上述处理后最终生成了750GB的数据集C4,并且在TensorFlow Datasets进行开源

1.3 任务以及训练格式

1.3.1 输入输出模型

1.3.2 预训练过程

之后是对预训练目标的大范围探索,具体做了哪些实验,下面这张图就能一目了然

预训练模型的预训练范式总览

总共从四个层面来进行比较:

预训练模式输入输出样式举例

1.3.3 模型参数量

最后就是结合上面所有实验结果,训练了不同规模几个模型,由小到大:

T5模型参数量表

1.3.4 训练结论

在本文中所有的实验,作者列出了一个给定实验的压缩结果的表格

2.1 T5模型的使用

pip install transformers==4.2.0
pip install sentencepiece==0.1.94
model = T5ForConditionalGeneration.from_pretrained('t5-large')
tokenizer = T5Tokenizer.from_pretrained('t5-large')</pre>
# print(model.config)
T5Config {
  "_name_or_path": "t5-large",
  "architectures": [
    "T5WithLMHeadModel"
  ],
  "d_ff": 4096,                      # 每个T5Block中feed forward layer的size
  "d_kv": 64,                        # 每个attention head的key、query、value的size。d_kv必须等于d_model/num_heads
  "d_model": 1024,                   # 每个encoder layers和pooler layer的大小
  "decoder_start_token_id": 0,       # 模型根据标签自动创建decoder_start_token_id,方法是将标签向右移动一个位置,并加上前缀
  "dropout_rate": 0.1,               # 所有dropout layers的比例
  "eos_token_id": 1,                 # eos_token的id
  "feed_forward_proj": "relu",       # 所有要使用的feed_forward类型
  "initializer_factor": 1.0,         # 初始化所有权重矩阵的系数
  "is_encoder_decoder": true,        # 同时使用encoder与decoder
  "layer_norm_epsilon": 1e-06,       # layer_norm使用的epsilon
  "model_type": "t5",                # 模型类型
  "n_positions": 512,                # positions数量
  "num_decoder_layers": 24,          # decoder中的隐藏层数。如果未设置,将使用与num_layers相同的值
  "num_heads": 16,                   # 每个attention layer的attention heads
  "num_layers": 24,                  # 每个encoder中的hidden layers
  "relative_attention_max_distance": 128, # bucket separation较长序列的最大距离
  "relative_attention_num_buckets": 32,   # 每个attention layers要使用的bucket数
  "task_specific_params": {
    "summarization": {
      "early_stopping": true,
      "length_penalty": 2.0,
      "max_length": 200,
      "min_length": 30,
      "no_repeat_ngram_size": 3,
      "num_beams": 4,
      "prefix": "summarize: "
    },
    "translation_en_to_de": {
      "early_stopping": true,
      "max_length": 300,
      "num_beams": 4,
      "prefix": "translate English to German: "
    },
    "translation_en_to_fr": {
      "early_stopping": true,
      "max_length": 300,
      "num_beams": 4,
      "prefix": "translate English to French: "
    },
    "translation_en_to_ro": {
      "early_stopping": true,
      "max_length": 300,
      "num_beams": 4,
      "prefix": "translate English to Romanian: "
    }
  },
  "transformers_version": "4.19.2",  # tranformers包支持版本
  "use_cache": true,                 # 模型是否应返回最后一个key/values attentions
  "vocab_size": 32128                # T5模型的词汇表
}
T5Block(
    (layer): ModuleList(
      (0): T5LayerSelfAttention(
        (SelfAttention): T5Attention(
          (q): Linear(in_features=1024, out_features=1024, bias=False)
          (k): Linear(in_features=1024, out_features=1024, bias=False)
          (v): Linear(in_features=1024, out_features=1024, bias=False)
          (o): Linear(in_features=1024, out_features=1024, bias=False)
        )
        (layer_norm): T5LayerNorm()
        (dropout): Dropout(p=0.1, inplace=False)
      )
      (1): T5LayerCrossAttention(
        (EncDecAttention): T5Attention(
          (q): Linear(in_features=1024, out_features=1024, bias=False)
          (k): Linear(in_features=1024, out_features=1024, bias=False)
          (v): Linear(in_features=1024, out_features=1024, bias=False)
          (o): Linear(in_features=1024, out_features=1024, bias=False)
        )
        (layer_norm): T5LayerNorm()
        (dropout): Dropout(p=0.1, inplace=False)
      )
      (2): T5LayerFF(
        (DenseReluDense): T5DenseReluDense(
          (wi): Linear(in_features=1024, out_features=4096, bias=False)
          (wo): Linear(in_features=4096, out_features=1024, bias=False)
          (dropout): Dropout(p=0.1, inplace=False)
          (relu_act): ReLU()
        )
        (layer_norm): T5LayerNorm()
        (dropout): Dropout(p=0.1, inplace=False)
      )
    )
)
def summarize(text, max_length):
  '''
  text: 要生成摘要的文本
  max_length: 摘要的最大长度
  '''
  # 去掉多余的空格和换行符
  preprocess_text = text.strip().replace('\n','')
  # 准备前缀+文本
  t5_prepared_text = 'summarize: ' + preprocess_text
  print("Preprocessed and prepared text: \n", t5_prepared_text)
  # 分词
  tokenized_text = tokenizer.encode(t5_prepared_text, return_tensors="pt").to(device)
  # 进行文本摘要
  summary_ids = model.generate(tokenized_text,
                  num_beams=4,
                  no_repeat_ngram_size=2,
                  min_length=30,
                  max_length=max_length,
                  early_stopping=True)
  # 将id转换为输出 summary_ids.shape = [1, 50]
  output = tokenizer.decode(summary_ids[0], skip_special_tokens=True)
  return output
上一篇下一篇

猜你喜欢

热点阅读