萱仔大模型学习记录1-了解常用大模型

由于前段时间拿到了一个某个nlp大模型offer,最近正在入职之前猛猛学习大模型的相关知识,避免入职之后露怯,学习了一下相关知识。我个人准备恶补的路线如下,

由于我本人已经掌握了pytorch和TensorFlow库,不做赘述,如果还有uu们想要学习一下pytorch,我我真的强烈推荐某粉色交友软件一个叫小甲鱼的阿婆主的视频,超级适合入门选手(真的无广,很适合学习使用)

以下则开始第一部分的总结,大模型的基础知识,相关方法,评价指标总结

-------------------------------------------------------------------------------------------------------------

大语言模型基础知识和方法

1. 大语言模型简介

大语言模型(LLM)常常具有数十亿到数千亿个参数,能够做nlp任务。常用的大语言模型包括 GPT、BERT 和 T5和 LLaMA 等。

1. OpenAI 的 GPT 系列

gpt是一种自回归语言模型,即通过预测给定上下文的下一个词来进行训练。gpt常常用于文本生成、对话系统、文本补全等。GPT是基于一种叫做Transformer的模型架构。这个架构由Vaswani等人在2017年提出,核心在于它的“注意力机制”,使得模型能够更好地理解和处理一段文字或句子。传统的模型在处理长文本时会遇到很多麻烦,但Transformer能够解决这些问题,并且计算速度更快。它首先在大量的文本数据上进行训练,不需要特定任务的标签。在这个阶段,GPT学会了理解文本中的语法、语义和上下文。这就像是让模型读了很多书,掌握了丰富的语言知识和使用模式。在预训练期间,它被训练为根据给定的上下文预测下一个词。这种自回归的训练方式使得模型能够理解并学到长期依赖关系,类似于写作时根据前面的句子继续写后面的内容。GPT模型通常由多个Transformer层堆叠而成。每一层包含多头自注意力机制和前馈神经网络。这些层次结构使得模型能够对输入进行更深层次的理解,从而更好地捕捉文本中的复杂语义和结构。为了让模型知道每个词在句子中的位置,GPT引入了位置嵌入。它帮助模型区分不同位置的词,从而正确理解句子的顺序。在预训练完成后,可以对GPT模型进行微调,以适应特定的任务,比如文本生成、问答、语言翻译等。微调时,使用有标签的数据来进一步调整模型的参数,让它在特定任务上表现更好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

import openai # 导入 OpenAI 库

# 设置 API 密钥
openai.api_key = '' # 这个密钥可以在官网获得,具体获得可以看我下面推荐的那个网址(无广

# 使用 GPT-3 生成文本
response = openai.Completion.create(
engine="text-davinci-003",
prompt="你好",
max_tokens=100 # 生成的最大词数
)

# 输出生成的文本
print(response.choices[0].text.strip())

此处插播一个推荐获得openai api的方法(不是广告不是广告不是广告):

如何获取 OpenAI API 密钥:分步指南 - 哔哩哔哩

2. Google 的 BERT

BERT
是一种双向编码器表示模型,通过掩码语言建模(Masked Language Modeling, MLM)和下一句预测(Next Sentence Prediction, NSP)进行预训练。我们常常在文本分类、问答系统、命名实体识别等任务种用到BERT(后续补充BERT论文内容在下一章)。

4. Meta 的 LLaMA

LLaMA

是 Meta 开发的大规模语言模型,常用于文本生成、对话系统、文本补全等。

2. 大语言模型的训练方法

大语言模型的训练分为两个主要阶段:预训练和微调。

1)大模型的预训练
:一些大公司使用较强的设备在大量无监督文本数据上进行训练,以捕捉语言的广泛模式和结构,使得产生的模型学习了语言的基本规律。

2)大模型微调
:在自己需要的任务的数据集上进行后期的训练训练,以提高模型在该任务上的性能。例如自己的任务:情感分析、文本分类、问答等。

3. 预训练方法

常见的预训练方法包括自回归模型 GPT和自编码模型 BERT。

1)自回归模型
:在训练过程中,模型通过预测给定上下文的下一个词来学习。

2)自编码模型
:通过掩盖输入序列中的某些部分并要求模型预测这些掩码位置的词来进行训练。

4. 微调方法

微调方法通过在预训练模型的基础上,使用较小的数据集进行进一步训练,优化模型在特定任务上的表现。

  • 任务特定微调
    :例如文本分类、命名实体识别、问答等。
  • 提示词调优(Prompt Tuning)
    :我们可以在输入数据前后添加提示,让想利用的模型更好地理解自己的任务。
  • 参数高效微调(如 LoRA)
    :通过减少参数调整的数量,提高微调效率。
  • 混合优化(Hybrid Optimization)
    :结合多种优化策略提升模型性能。
  • 对抗训练(Adversarial Training)
    :通过加入对抗样本,提高模型鲁棒性。

评价指标

评价语言模型性能的指标有多种,常见的包括精确率(Precision)、召回率(Recall)、F1 分数(F1 Score)、困惑度(Perplexity)、BLEU 分数等。

1. 精确率(Precision)

精确率是模型预测为正类的样本中,实际为正类的比例。

2. 召回率(Recall)

召回率是实际为正类的样本中,模型预测为正类的比例。

3. F1 分数(F1 Score)

F1 分数是精确率和召回率的调和平均数,用于综合评价模型性能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

import numpy as np # 导入 numpy 库
from sklearn.metrics import precision_score, recall_score, f1_score # 从 sklearn.metrics 导入评价指标

# 假设是我们已经预测完了,这个是预测完了之后的标签,和真实标签,我们使用sklearn库的函数来计算各种评价指标。
true_labels = np.array([1, 0, 1, 1, 0, 1, 0, 0, 1, 0]) # 定义实际标签
predicted_labels = np.array([1, 0, 1, 0, 0, 1, 1, 0, 1, 0]) # 定义模型预测标签

# 精确率
precision = precision_score(true_labels, predicted_labels)
print(f"Precision: {precision}")

# 召回率
recall = recall_score(true_labels, predicted_labels)
print(f"Recall: {recall}")

# F1 分数
f1 = f1_score(true_labels, predicted_labels)
print(f"F1 Score: {f1}")

4. 困惑度(Perplexity)

困惑度表示模型对给定数据集的预测能力。困惑度越低,模型性能越好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

import torch
import torch.nn.functional as F

# 假设有一个模型的输出标签和真实标签
logits = torch.tensor([[0.2, 0.4, 0.1, 0.3], [0.1, 0.5, 0.2, 0.2]])
labels = torch.tensor([1, 2])

# 交叉熵损失
loss = F.cross_entropy(logits, labels)

# 困惑度是交叉熵损失计算而来的
perplexity = torch.exp(loss).item()

print(f'Cross Entropy Loss: {loss.item()}')
print(f'Perplexity: {perplexity}')
print(f"Perplexity: {perplexity.item()}")

5. BLEU 分数(BLEU Score)

BLEU 分数用于评价生成文本与参考文本的相似度。

1
2
3
4
5
6
7
8

from nltk.translate.bleu_score import sentence_bleu

reference = [['this', 'is', 'a', 'test'], ['this', 'is' 'test']]
candidate = ['this', 'is', 'a', 'test']
score = sentence_bleu(reference, candidate)

print(f'BLEU score: {score}')