大语言模型原理与核心技术详解
·
大语言模型原理与核心技术详解
1. AI 发展两大流派
1.1 符号主义(Symbolism)
核心思想:人工智能源于逻辑和符号操作,通过精确的规则和符号来模拟人类智能。
关键特征:
- 基于规则和逻辑推理
- 知识以符号形式表示
- 需要人工定义规则和知识
经典系统:
- 专家系统(Expert Systems)
- 逻辑编程(Prolog)
- 语义网络
局限性:
- 难以处理不确定性
- 知识获取瓶颈
- 无法处理模糊概念
1.2 连接主义(Connectionism)
核心思想:人工智能源于神经网络的连接和权重调整,通过大量数据训练模型来学习模式。
关键特征:
- 基于神经网络
- 通过数据学习模式
- 自动调整参数(权重)
经典模型:
- 感知机(Perceptron)
- 多层神经网络
- 深度学习模型
优势:
- 能处理不确定性
- 自动学习特征
- 可扩展性强
1.3 两大流派对比
| 维度 | 符号主义 | 连接主义 |
|---|---|---|
| 核心思想 | 逻辑推理 | 模式学习 |
| 知识表示 | 符号和规则 | 权重和连接 |
| 学习方式 | 人工编码 | 数据训练 |
| 处理能力 | 精确推理 | 模式识别 |
| 代表系统 | 专家系统 | 深度学习 |
2. 神经网络基础
2.1 人工神经元
模型结构:
import numpy as np
class Neuron:
"""人工神经元"""
def __init__(self, weights, bias, activation):
self.weights = weights # 权重向量
self.bias = bias # 偏置
self.activation = activation # 激活函数
def forward(self, x):
"""前向传播"""
z = np.dot(self.weights, x) + self.bias # 加权求和
return self.activation(z) # 激活输出
# 激活函数示例
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def relu(z):
return np.maximum(0, z)
def tanh(z):
return np.tanh(z)
2.2 多层感知机(MLP)
结构:输入层 → 隐藏层 → 输出层
class MLP:
"""多层感知机"""
def __init__(self, layer_sizes):
self.layer_sizes = layer_sizes
self.weights = []
self.biases = []
# 初始化权重和偏置
for i in range(len(layer_sizes) - 1):
w = np.random.randn(layer_sizes[i], layer_sizes[i+1]) * 0.01
b = np.zeros(layer_sizes[i+1])
self.weights.append(w)
self.biases.append(b)
def forward(self, x):
"""前向传播"""
self.activations = [x]
for i, (w, b) in enumerate(zip(self.weights, self.biases)):
z = np.dot(self.activations[-1], w) + b
if i == len(self.weights) - 1:
# 输出层使用 softmax
activation = np.exp(z) / np.sum(np.exp(z))
else:
# 隐藏层使用 ReLU
activation = relu(z)
self.activations.append(activation)
return self.activations[-1]
2.3 损失函数与反向传播
损失函数:衡量预测值与真实值的差异
def cross_entropy_loss(y_pred, y_true):
"""交叉熵损失"""
epsilon = 1e-12
y_pred = np.clip(y_pred, epsilon, 1 - epsilon)
return -np.sum(y_true * np.log(y_pred))
def mean_squared_error(y_pred, y_true):
"""均方误差"""
return np.mean((y_pred - y_true) ** 2)
反向传播算法:
def backpropagation(mlp, x, y_true, learning_rate=0.01):
"""反向传播"""
y_pred = mlp.forward(x)
# 计算输出层误差
delta = y_pred - y_true
# 从后向前更新权重
for i in range(len(mlp.weights) - 1, -1, -1):
prev_activation = mlp.activations[i]
# 更新权重和偏置
mlp.weights[i] -= learning_rate * np.dot(prev_activation.T, delta)
mlp.biases[i] -= learning_rate * np.sum(delta, axis=0)
# 计算前一层误差
if i > 0:
delta = np.dot(delta, mlp.weights[i].T) * (prev_activation > 0) # ReLU 导数
3. Transformer 架构
3.1 核心思想
Transformer 是基于 自注意力机制(Self-Attention) 的序列建模架构,解决了 RNN 的长距离依赖问题。
关键创新:
- 自注意力机制:直接计算序列中任意两个位置的依赖关系
- 多头注意力:从多个角度计算注意力
- 位置编码:引入序列位置信息
3.2 自注意力机制
数学原理:
import torch
import torch.nn.functional as F
def scaled_dot_product_attention(Q, K, V, mask=None):
"""
缩放点积注意力
Args:
Q: 查询矩阵 (batch_size, num_heads, seq_len, d_k)
K: 键矩阵 (batch_size, num_heads, seq_len, d_k)
V: 值矩阵 (batch_size, num_heads, seq_len, d_v)
mask: 掩码矩阵
Returns:
output: 注意力输出
attention_weights: 注意力权重
"""
d_k = Q.size(-1)
# 计算相似度分数
scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(d_k, dtype=torch.float32))
# 应用掩码(可选)
if mask is not None:
scores = scores.masked_fill(mask == 0, float('-inf'))
# 计算注意力权重
attention_weights = F.softmax(scores, dim=-1)
# 加权求和
output = torch.matmul(attention_weights, V)
return output, attention_weights
3.3 多头注意力
class MultiHeadAttention(torch.nn.Module):
"""多头注意力"""
def __init__(self, d_model, num_heads):
super().__init__()
self.num_heads = num_heads
self.d_model = d_model
self.d_k = d_model // num_heads
# 线性变换层
self.W_q = torch.nn.Linear(d_model, d_model)
self.W_k = torch.nn.Linear(d_model, d_model)
self.W_v = torch.nn.Linear(d_model, d_model)
self.W_o = torch.nn.Linear(d_model, d_model)
def split_heads(self, x):
"""将输入拆分为多个头"""
batch_size = x.size(0)
return x.view(batch_size, -1, self.num_heads, self.d_k).transpose(1, 2)
def forward(self, Q, K, V, mask=None):
batch_size = Q.size(0)
# 线性变换
Q = self.W_q(Q)
K = self.W_k(K)
V = self.W_v(V)
# 拆分多头
Q = self.split_heads(Q)
K = self.split_heads(K)
V = self.split_heads(V)
# 计算注意力
output, attention_weights = scaled_dot_product_attention(Q, K, V, mask)
# 合并多头
output = output.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model)
# 输出线性变换
output = self.W_o(output)
return output, attention_weights
3.4 位置编码
class PositionalEncoding(torch.nn.Module):
"""位置编码"""
def __init__(self, d_model, max_seq_len=5000):
super().__init__()
# 计算位置编码
position = torch.arange(max_seq_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) * (-np.log(10000.0) / d_model))
pe = torch.zeros(max_seq_len, d_model)
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
self.register_buffer('pe', pe.unsqueeze(0))
def forward(self, x):
"""添加位置编码"""
return x + self.pe[:, :x.size(1)]
3.5 Transformer 编码器
class TransformerEncoderLayer(torch.nn.Module):
"""Transformer 编码器层"""
def __init__(self, d_model, num_heads, dim_feedforward=2048, dropout=0.1):
super().__init__()
# 多头注意力
self.self_attn = MultiHeadAttention(d_model, num_heads)
# 前馈网络
self.feed_forward = torch.nn.Sequential(
torch.nn.Linear(d_model, dim_feedforward),
torch.nn.ReLU(),
torch.nn.Linear(dim_feedforward, d_model)
)
# 层归一化
self.norm1 = torch.nn.LayerNorm(d_model)
self.norm2 = torch.nn.LayerNorm(d_model)
# Dropout
self.dropout1 = torch.nn.Dropout(dropout)
self.dropout2 = torch.nn.Dropout(dropout)
def forward(self, x, mask=None):
"""前向传播"""
# 自注意力
attn_output, _ = self.self_attn(x, x, x, mask)
x = self.norm1(x + self.dropout1(attn_output))
# 前馈网络
ff_output = self.feed_forward(x)
x = self.norm2(x + self.dropout2(ff_output))
return x
3.6 Transformer 解码器
class TransformerDecoderLayer(torch.nn.Module):
"""Transformer 解码器层"""
def __init__(self, d_model, num_heads, dim_feedforward=2048, dropout=0.1):
super().__init__()
# 掩码自注意力(防止前瞻)
self.self_attn = MultiHeadAttention(d_model, num_heads)
# 交叉注意力(编码器-解码器注意力)
self.cross_attn = MultiHeadAttention(d_model, num_heads)
# 前馈网络
self.feed_forward = torch.nn.Sequential(
torch.nn.Linear(d_model, dim_feedforward),
torch.nn.ReLU(),
torch.nn.Linear(dim_feedforward, d_model)
)
# 层归一化
self.norm1 = torch.nn.LayerNorm(d_model)
self.norm2 = torch.nn.LayerNorm(d_model)
self.norm3 = torch.nn.LayerNorm(d_model)
# Dropout
self.dropout1 = torch.nn.Dropout(dropout)
self.dropout2 = torch.nn.Dropout(dropout)
self.dropout3 = torch.nn.Dropout(dropout)
def forward(self, x, memory, tgt_mask=None, memory_mask=None):
"""前向传播"""
# 掩码自注意力
attn_output, _ = self.self_attn(x, x, x, tgt_mask)
x = self.norm1(x + self.dropout1(attn_output))
# 交叉注意力
cross_attn_output, _ = self.cross_attn(x, memory, memory, memory_mask)
x = self.norm2(x + self.dropout2(cross_attn_output))
# 前馈网络
ff_output = self.feed_forward(x)
x = self.norm3(x + self.dropout3(ff_output))
return x
4. GPT 模型架构
4.1 GPT 的底层原理
GPT(Generative Pre-trained Transformer)只使用了 Transformer 的解码器部分。
核心思想:给定前文,预测下一个词。
自回归生成:
def autoregressive_generation(model, prompt, max_length=100):
"""自回归生成"""
tokens = tokenize(prompt)
for _ in range(max_length):
# 预测下一个词
logits = model(tokens)
next_token = torch.argmax(logits[:, -1, :], dim=-1)
# 添加到序列
tokens = torch.cat([tokens, next_token.unsqueeze(1)], dim=1)
# 检查是否到达结束标记
if next_token == end_token:
break
return detokenize(tokens)
4.2 GPT 与 Transformer 的关系
| 组件 | Transformer | GPT |
|---|---|---|
| 编码器 | ✅ | ❌ |
| 解码器 | ✅ | ✅ |
| 交叉注意力 | ✅ | ❌ |
| 掩码自注意力 | ✅ | ✅ |
| 前馈网络 | ✅ | ✅ |
4.3 GPT 训练流程
class GPTTraining:
"""GPT 训练流程"""
def __init__(self, model, tokenizer, optimizer):
self.model = model
self.tokenizer = tokenizer
self.optimizer = optimizer
def pretrain(self, corpus):
"""预训练阶段"""
for epoch in range(num_epochs):
for batch in corpus:
# 准备数据
input_ids = batch['input_ids']
labels = batch['labels']
# 前向传播
outputs = self.model(input_ids, labels=labels)
loss = outputs.loss
# 反向传播
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()
def finetune(self, task_data, task_type):
"""微调阶段"""
# 根据任务类型调整模型
if task_type == 'classification':
self.model.add_classification_head(num_classes)
elif task_type == 'qa':
self.model.add_qa_head()
# 训练任务数据
for epoch in range(finetune_epochs):
for batch in task_data:
# 训练逻辑
pass
5. 大模型核心术语详解
5.1 基础概念
basic_concepts = {
"模型": "由连接主义构建的复杂函数,通过大量参数实现映射",
"权重": "模型中的参数,通过训练调整以最小化损失",
"大模型": "参数量特别大(通常数十亿以上)的模型",
"大语言模型": "专注于自然语言处理任务的大模型",
"预训练": "在大规模文本数据上训练基础模型",
"微调": "基于预训练模型继续训练以适应特定任务",
"推理": "根据输入计算输出的过程"
}
5.2 生成式 AI 相关
| 术语 | 定义 | 示例 |
|---|---|---|
| Token | 内容被分割成的最小单位 | “Hello” → [“Hello”] |
| 上下文 | 提供给模型的所有输入信息 | 对话历史、提示词 |
| 提示词 | 指导模型回答的指令 | “请解释什么是机器学习” |
| 温度 | 控制输出随机性的参数 | 0.0-1.0 |
| 幻觉 | 模型生成看似合理但事实上错误的内容 | 编造事实 |
| RAG | 检索增强生成,从外部知识库获取信息 | 结合文档回答问题 |
5.3 模型优化技术
optimization_techniques = {
"量化": "用更低精度表示浮点数(如 FP16、INT8)",
"蒸馏": "用大模型指导小模型学习",
"剪枝": "删除不重要的神经元或连接",
"LoRA": "低成本微调方法,冻结主权重,只训练低秩矩阵",
"Adapter": "在模型中插入小型适配层进行微调",
"模型压缩": "减小模型大小,降低推理成本"
}
5.4 训练方法
training_methods = {
"自监督学习": "利用未标注数据,通过预测任务学习",
"监督学习": "使用标注数据训练模型",
"强化学习": "通过奖励信号优化模型",
"RLHF": "基于人类反馈的强化学习,对齐人类偏好",
"SFT": "监督微调,使用高质量标注数据"
}
6. 数学基础
6.1 线性代数
# 矩阵乘法
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.dot(A, B) # 矩阵乘法
# 向量运算
v1 = np.array([1, 2, 3])
v2 = np.array([4, 5, 6])
dot_product = np.dot(v1, v2) # 点积
norm = np.linalg.norm(v1) # 范数
cos_sim = dot_product / (norm * np.linalg.norm(v2)) # 余弦相似度
6.2 微积分
# 梯度计算
def gradient_descent(f, df, x0, learning_rate=0.01, max_iter=1000):
"""梯度下降"""
x = x0
for _ in range(max_iter):
grad = df(x)
x -= learning_rate * grad
return x
# 示例:最小化 f(x) = x^2
def f(x):
return x ** 2
def df(x):
return 2 * x
min_x = gradient_descent(f, df, x0=5)
6.3 概率论
# 概率分布
from scipy.stats import norm
# 正态分布
mu = 0
sigma = 1
dist = norm(mu, sigma)
# 计算概率密度
x = 1.0
pdf = dist.pdf(x)
# 计算累积概率
cdf = dist.cdf(x)
# 采样
samples = dist.rvs(size=1000)
7. 模型类型分类
7.1 按开放程度分类
| 类型 | 定义 | 示例 |
|---|---|---|
| 闭源模型 | 不开放源代码和权重 | GPT-4, Claude 3 |
| 开源模型 | 开放模型权重 | LLaMA, Qwen |
| 开放权重模型 | 仅开放权重 | LLaMA |
| 完全开源模型 | 开放结构、权重和训练代码 | Mistral |
7.2 按架构分类
| 类型 | 特点 | 代表模型 |
|---|---|---|
| Encoder-only | 仅编码器,适合理解任务 | BERT |
| Decoder-only | 仅解码器,适合生成任务 | GPT |
| Encoder-Decoder | 编码器+解码器,适合翻译等 | T5 |
7.3 按能力分类
| 能力 | 说明 |
|---|---|
| 单模态 | 处理单一类型数据(文本) |
| 多模态 | 处理多种类型数据(文本、图像、语音) |
| 通用智能 | 具备多种能力,接近人类智能 |
8. 常见问题与解决方案
Q: 为什么大模型能理解和生成语言?
A:
大模型通过在海量文本数据上进行自监督学习,学习到了语言的统计规律和语义表示。具体来说:
- 词嵌入:将单词映射到高维向量空间
- 自注意力:学习单词之间的依赖关系
- 多层Transformer:逐层抽象和组合特征
- 自回归训练:学习预测下一个词的概率分布
Q: 什么是"涌现"现象?
A:
当模型参数量足够大时,会突然出现一些在小模型中不存在的能力,如:
- 复杂推理
- 多步数学计算
- 代码生成
- 翻译
这是因为大模型能够学习到更丰富的特征表示和更复杂的模式。
Q: 如何选择合适的模型?
A:
根据任务需求选择模型:
def select_model(task_type, requirements):
"""选择合适的模型"""
if requirements.get("privacy") == "strict":
return "开源模型(如 Qwen 2.5, LLaMA 3.2)"
elif task_type == "creative":
return "GPT-4o / Claude 3.5"
elif task_type == "chinese":
return "Qwen 2.5 / Claude 3.5"
elif task_type == "code":
return "GPT-4o / DeepSeek R1"
elif requirements.get("cost") == "low":
return "GPT-3.5 / Qwen 2.5-7B"
else:
return "GPT-4o"
Q: 大模型有什么局限性?
A:
大模型的主要局限性包括:
- 幻觉:生成看似合理但错误的内容
- 时效性:训练数据截止到某个时间点,无法获取最新信息
- 计算成本:训练和推理成本高昂
- 可解释性:决策过程不透明
- 偏见:可能存在训练数据中的偏见
9. 总结
大语言模型是基于 Transformer 架构的深度学习模型,通过自监督学习在海量文本数据上预训练,具备强大的语言理解和生成能力。
核心要点:
- Transformer 架构:自注意力机制是核心创新
- GPT 原理:基于解码器的自回归生成
- 训练流程:预训练 → 微调 → RLHF
- 关键技术:量化、蒸馏、LoRA 等优化技术
发展趋势:
- 模型规模持续增大
- 多模态能力增强
- 推理能力提升
- 效率优化(更小更快)
- 安全性和可控性改进
通过理解大模型的原理和技术,可以更好地应用和开发基于大模型的 AI 系统。
更多推荐



所有评论(0)