BERT(Bidirectional Encoder Representations from Transformers)的序列分类模型,简单学习记录

一、代码

#本地离线模型使用

from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline, BertForSequenceClassification, BertTokenizer

#设置具体包含config.json的目录,只支持绝对路径
model_dir = r"models\bert-base-chinese"
#model_dir = r"C:\Users\lb\PycharmProjects\AiStudyProject\trsanformers_test\models\bert-base-chinese\models--bert-base-chinese\snapshots\c30a6ed22ab4564dc1e3b2ecbf6e766b0611a33f"

#加载模型和分词器(方法一)
model = BertForSequenceClassification.from_pretrained("bert-base-chinese",cache_dir=model_dir)
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese",cache_dir=model_dir)
#加载模型和分词器(方法二)
#model = BertForSequenceClassification.from_pretrained(model_dir)
#tokenizer = AutoTokenizer.from_pretrained(model_dir)

#创建分类pipleine
classifier = pipeline("text-classification",model=model,tokenizer=tokenizer,device="cpu")

#进行文本分类
result = classifier("你好,我是一款语言模型")
print(result)

print(model)

二、运行结果

BertForSequenceClassification(
  (bert): BertModel(
  ## 文本转向量(编码)
    (embeddings): BertEmbeddings(
      (word_embeddings): Embedding(21128, 768, padding_idx=0)
      (position_embeddings): Embedding(512, 768)
      (token_type_embeddings): Embedding(2, 768)
      (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
      (dropout): Dropout(p=0.1, inplace=False)
    )
    ### 特征提取 编码模型,将词向量的意思进行特征提取和理解
    (encoder): BertEncoder(
      (layer): ModuleList(
        (0-11): 12 x BertLayer(
          (attention): BertAttention(
            (self): BertSdpaSelfAttention(
              (query): Linear(in_features=768, out_features=768, bias=True)
              (key): Linear(in_features=768, out_features=768, bias=True)
              (value): Linear(in_features=768, out_features=768, bias=True)
              (dropout): Dropout(p=0.1, inplace=False)
            )
            (output): BertSelfOutput(
              (dense): Linear(in_features=768, out_features=768, bias=True)
              (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
              (dropout): Dropout(p=0.1, inplace=False)
            )
          )
          (intermediate): BertIntermediate(
            (dense): Linear(in_features=768, out_features=3072, bias=True)
            (intermediate_act_fn): GELUActivation()
          )
          (output): BertOutput(
            (dense): Linear(in_features=3072, out_features=768, bias=True)
            (LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
            (dropout): Dropout(p=0.1, inplace=False)
          )
        )
      )
    )
    ## 词话层 保持模型的适用性
    (pooler): BertPooler(
      (dense): Linear(in_features=768, out_features=768, bias=True)
      (activation): Tanh()
    )
  )
  ### 减少过拟合
  (dropout): Dropout(p=0.1, inplace=False)
  ### 分类层
  (classifier): Linear(in_features=768, out_features=2, bias=True)
)

三、BertModel

  • embeddings: 包含BERT的嵌入层,负责将输入的词、位置和类型信息转换为向量表示。

    • word_embeddings: 词嵌入层,将词汇表中的词(共21128个)映射到768维的向量空间。
    • position_embeddings: 位置嵌入层,为序列中的每个词提供位置信息,共512个不同的位置嵌入。
    • token_type_embeddings: 类型嵌入层,用于区分序列中不同类型的词(如问题-答案对中的问题和答案),共2种类型。
    • LayerNorm: 层归一化层,用于稳定训练过程。
    • dropout: Dropout层,用于减少过拟合。
  • encoder: BERT的编码器,由多个相同的层堆叠而成,每个层都是一个BertLayer

    • layer: 包含12个BertLayer的列表,每个层都包含自注意力机制、中间层和输出层。
      • attention: 自注意力机制,用于捕捉序列中词与词之间的关系。
        • self: 自注意力层,包括查询、键和值的线性变换。
        • output: 自注意力输出层,包括一个线性变换和层归一化。
      • intermediate: 中间层,用于增加模型的非线性。
        • dense: 一个线性层,将768维的输入扩展到3072维。
        • intermediate_act_fn: GELU激活函数,用于增加非线性。
      • output: 输出层,将3072维的输入映射回768维。
  • pooler: 池化层,用于从编码器的输出中提取一个固定大小的表示,通常用于分类任务。

    • dense: 一个线性层,将768维的输入映射到768维的输出。
    • activation: Tanh激活函数。
Dropout
  • BertModel的嵌入层和编码器层的多个位置,以及最终的分类器之前,都使用了Dropout层来减少过拟合。
classifier
  • 分类器层,一个线性层,用于将BERT模型的输出映射到分类任务的标签空间。
    • in_features=768: 输入特征的数量,与BERT模型输出的维度相匹配。
    • out_features=2: 输出特征的数量,表示分类任务的类别数(在这个例子中是二分类)。
    • bias=True: 表示线性层包含偏置项。

综上所述,BertForSequenceClassification模型利用BERT的预训练表示能力,通过嵌入层、编码器层和池化层提取输入序列的特征,最后通过一个分类器层将这些特征映射到分类任务的标签空间。Dropout层在多个位置被用于减少过拟合,提高模型的泛化能力。

四、各个参数解析

Dropout(p=0.1, inplace=False)

Dropout(p=0.1, inplace=False) 是在神经网络中常用的一种正则化技术,用于减少模型在训练集上的过拟合现象。这里的 Dropout 是指在神经网络的训练过程中,随机地“丢弃”一部分神经元的输出,即让这些神经元的输出为0。这种做法可以迫使网络学习到更加鲁棒的特征表示,因为它不能依赖于任何单个神经元(或一小部分神经元)的输出。

参数解释:

  • p=0.1:表示丢弃率,即在每次训练迭代中,每个神经元有10%的概率被随机丢弃。这意味着每个神经元的输出有90%的概率保持不变,10%的概率变为0。
  • inplace=False:这个参数指示是否在原始数据上进行修改。False 表示不会修改输入数据,而是创建一个新的变量来存储应用了Dropout之后的数据。如果设置为 True,则会在原地修改数据,但这在大多数情况下不是推荐的做法,特别是在需要保留原始数据的情况下。

Dropout技术主要在训练阶段使用,而在模型评估或预测时,通常不使用Dropout(即所有神经元都参与计算)。这是因为在训练时,Dropout通过随机丢弃神经元来减少模型对训练数据的依赖,提高模型的泛化能力;而在预测时,我们希望模型能够利用所有可用的信息来做出最准确的预测。

总之,Dropout(p=0.1, inplace=False) 是一种有效的正则化手段,通过随机丢弃一部分神经元的输出来减少过拟合,提高模型的泛化性能。

(classifier): Linear(in_features=768, out_features=2, bias=True)

(classifier): Linear(in_features=768, out_features=2, bias=True) 表示的是一个线性分类器(或线性层)的配置信息。在神经网络中,线性层(Linear layer)是最基本的组件之一,它执行的是线性变换,通常用于从网络的某一层到下一层的映射。这里的线性分类器特指一个全连接层(fully connected layer),其配置参数解释如下:

  • classifier:这是该线性层的名称或标识符,在这个上下文中,它可能表示这是一个用于分类任务的层。

  • Linear:表明这是一个线性层。

  • in_features=768:这表示输入特征的数量或输入层神经元的数量。在这个例子中,线性层接受768个输入特征。这些特征可能来自前一个隐藏层的输出。

  • out_features=2:这表示输出特征的数量或输出层神经元的数量。在这个例子中,线性层输出2个特征,这通常意味着该网络被配置为执行二分类任务(即,预测两个类别中的一个)。

  • bias=True:这表明在线性变换后,每个输出特征都会加上一个偏置项(bias term)。偏置项是一个可学习的参数,它允许线性层的输出在变换后能够有一个非零的基准值。在大多数情况下,启用偏置项是有益的,因为它增加了模型的灵活性。

你可能感兴趣的:(BERT,bert,分类,学习)