• BERT中文预训练模型:
      • BERT模型整体架构基于Transformer模型架构, BERT中文预训练模型的编码器具有12层, 输出层中的线性层具有768个节点, 即输出张量最后一维的维度是768. 它使用的多头注意力机制结构中, 头的数量为12, 模型总参数量为110M. 同时, 它在中文简体和繁体上进行训练, 因此适合中文简体和繁体任务.

    • BERT中文预训练模型作用:
      • 在实际的文本任务处理中, 有些训练语料很难获得, 他们的总体数量和包含的词汇总数都非常少, 不适合用于训练带有Embedding层的模型, 但这些数据中却又蕴含这一些有价值的规律可以被模型挖掘, 在这种情况下,使用预训练模型对原始文本进行编码是非常不错的选择, 因为预训练模型来自大型语料, 能够使得当前文本具有意义, 虽然这些意义可能并不针对某个特定领域, 但是这种缺陷可以使用微调模型来进行弥补.

    • 使用BERT中文预训练模型对句子编码:
      1. import torch
      2. import torch.nn as nn
      3. # 通过torch.hub(pytorch中专注于迁移学的工具)获得已经训练好的bert-base-chinese模型
      4. model = torch.hub.load('huggingface/pytorch-transformers', 'model', 'bert-base-chinese')
      5. # 获得对应的字符映射器, 它将把中文的每个字映射成一个数字
      6. tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-base-chinese')
      7. def get_bert_encode_for_single(text):
      8. """
      9. description: 使用bert-chinese编码中文文本
      10. :param text: 要进行编码的文本
      11. :return: 使用bert编码后的文本张量表示
      12. """
      13. # 首先使用字符映射器对每个汉字进行映射
      14. # 这里需要注意, bert的tokenizer映射后会为结果前后添加开始和结束标记即101和102
      15. # 这对于多段文本的编码是有意义的, 但在我们这里没有意义, 因此使用[1:-1]对头和尾进行切片
      16. indexed_tokens = tokenizer.encode(text)[1:-1]
      17. # 之后将列表结构转化为tensor
      18. tokens_tensor = torch.tensor([indexed_tokens])
      19. print(tokens_tensor)
      20. # 使模型不自动计算梯度
      21. with torch.no_grad():
      22. # 调用模型获得隐层输出
      23. encoded_layers, _ = model(tokens_tensor)
      24. # 输出的隐层是一个三维张量, 最外层一维是1, 我们使用[0]降去它.
      25. print(encoded_layers.shape)
      26. encoded_layers = encoded_layers[0]
      27. return encoded_layers

    • 代码位置: /data/doctor_offline/review_model/bert_chinese_encode.py

    • 输入参数:
      text = "你好, 周杰伦"
      

    • 调用:
      outputs = get_bert_encode_for_single(text)
      print(outputs)
      print(outputs.shape)
      

    • 输出效果:
      tensor([[ 3.2731e-01, -1.4832e-01, -9.1618e-01,  ..., -4.4088e-01,
             -4.1074e-01, -7.5570e-01],
            [-1.1287e-01, -7.6269e-01, -6.4861e-01,  ..., -8.0478e-01,
             -5.3600e-01, -3.1953e-01],
            [-9.3012e-02, -4.4381e-01, -1.1985e+00,  ..., -3.6624e-01,
             -4.7467e-01, -2.6408e-01],
            [-1.6896e-02, -4.3753e-01, -3.6060e-01,  ..., -3.2451e-01,
             -3.4204e-02, -1.7930e-01],
            [-1.3159e-01, -3.0048e-01, -2.4193e-01,  ..., -4.5756e-02,
             -2.0958e-01, -1.0649e-01],
            [-4.0006e-01, -3.4410e-01, -3.8532e-05,  ...,  1.9081e-01,
              1.7006e-01, -3.6221e-01]])
      torch.Size([6, 768])
      

    • 小节总结:
      • 学习了BERT中文预训练模型的有关知识:
        • BERT模型整体架构基于Transformer模型架构, BERT中文预训练模型的编码器具有12层, 输出层中的线性层具有768个节点, 即输出张量最后一维的维度是768. 它使用的多头注意力机制结构中, 头的数量为12, 模型总参数量为110M. 同时, 它在中文简体和繁体上进行训练, 因此适合中文简体和繁体任务.

    • 学习了BERT中文预训练模型的作用:
      • 在实际的文本任务处理中, 有些训练语料很难获得, 他们的总体数量和包含的词汇总数都非常少, 不适合用于训练带有Embedding层的模型, 但这些数据中却又蕴含这一些有价值的规律可以被模型挖掘, 在这种情况下, 使用预训练模型对原始文本进行编码是非常不错的选择, 因为预训练模型来自大型语料, 能够使得当前文本具有意义, 虽然这些意义可能并不针对某个特定领域, 但是这种缺陷可以使用微调模型来进行弥补.

    • 学习了使用BERT中文预训练模型对句子编码的函数: get_bert_encode_for_single(text)