minGPT
author: karpathy Andrej
✅ 解决问题
生成式文本任务,比如写文章、对话、续写句子。目标是给定前文,预测下一个词。
🛠️ 具体措施
- 输入一句话,例如:
"我 爱 自然"→ 转成数字编号[23, 45, 67]。 - 构造训练样本:
- 输入
X = [X1, X2, X3, Y1, Y2] - 标签
Y = [-1, -1, Y1, Y2, Y3](-1表示忽略不计算损失)
- 输入
- 模型结构:
- 首层:词嵌入 + 位置编码
- 骨干:多层的 单向自注意力(只能看前面的词) + 前馈网络
- 尾层:分类头输出每个位置的词概率分布
- 训练时一次性并行预测多个词(只看前面上下文)
- 推理时串行生成:每生成一个词,就加到输入里继续生成下一个。
💥 损失函数
就像做 完形填空:
- 给前面几个字,猜后面是什么字。
- 猜错一个字就扣分,扣分规则是 交叉熵(预测概率分布和真实答案差多远)。
-1的位置不扣分(相当于没让你填)。
💼 工作流程
1String: ['X1', 'X2', ..., 'Xn'] =[dictionary]=> [k1, k2, ..., kn] # word2index
2
3# Train:
4X = [X1, X2, X3, Y1, Y2], Y = [-1, -1, Y1, Y2, Y3]
5Model = {(WordEmbed+PosEmbed) => (CausalSelfAttention+FFN)xN => (ClassHead)}
6# attn = A B C
7# A √ × × uni-directional
8# B √ √ ×
9# C √ √ √
10
11Z = Model(X) => [Z1, Z2, Z3, Z4, Z5]
12Y = [-1, -1, Y1, Y2, Y3]
13# Equal to Parallel Train
14(X1,X2,X3) =predict=> Y1
15(X1,X2,X3,Y1) =predict=> Y2
16(X1,X2,X3,Y1,Y2) =predict=> Y3
17
18loss = crossentropy(Z, Y, ignore=-1) # Zi => {P1,...,Pclass} multi-class task
19
20# Test: Serial generation
21give inp = [X1, X2, X3]
22Step 1:
23 Z = Model(inp) = [Z1,Z2,Z3]
24 Y = [-1,-1,Y1]
25 inp = inp + Y[-1] = [Z1,Z2,Z3,Y1]
26Step 2:
27 Z = Model(inp) = [Z1,Z2,Z3,Z4]
28 Y = [-1,-1,-1,Y2]
29 inp = inp + Y[-1] = [Z1,Z2,Z3,Y1,Y2]
30Step 3:
31 Z = Model(inp) = [Z1,Z2,Z3,Z4,Z5]
32 Y = [-1,-1,-1,-1,Y3]
33 inp = inp + Y[-1] = [Z1,Z2,Z3,Y1,Y2,Y3]
34
35out: [Z1,Z2,Z3,Y1,Y2,Y3]
minBert
✅ 解决问题
理解类任务:比如问答、文本分类、句子关系判断(如是否上下句)、填补缺失词。
🛠️ 具体措施
预训练阶段
让模型学会通用语言理解
-
输入两个句子 A 和 B,拼成:
[CLS] A [SEP] B [SEP] -
随机遮盖一些词(比如把“自然”换成
[MASK]),让模型猜原词。 -
同时判断 B 是不是真的接在 A 后面(NSP 任务)。
-
模型结构:
- 首层:词嵌入 + 位置编码 + 句子编码(区分 A/B)
- 骨干:多层 双向自注意力(能看到左右所有词)
- 尾层:两个头:一个判断句子关系(IsNext?)一个预测被遮盖的词
微调阶段
适配具体任务
- 单句分类:用
[CLS]的输出 - 句子对任务:用
[SEP]后的输出或整句信息
💥 损失函数
像 做两道语文题:
- 填空题:把句子里的词遮住,让你填回去。填错扣分。
- 判断题:给你两句话,问第二句是不是第一句的下一句。判断错也扣分。总损失 = 填空损失 + 判断损失
💼 工作流程
1# Data preparation
2data = [{"S1", "S2", ..., "Sn"}, [{k1, k2, ..., kn},
3 {"S1", "S2", ..., "Sn"}, =vocabulary=> [{k1, k2, ..., kn},
4 {"S1", "S2", ..., "Sn"}] [{k1, k2, ..., kn},
5
6# Mask-Word & Predict isNext
7while positive != batch_size / 2 or negative != batch_size / 2: # isNext,notIsNext sample number is equality
8 random-sentence-A, random-sentence-B => tokens_a, tokens_b
9 input_ids = [word_dict['CLS']] + tokens_a + [word_dict['SEP']] + tokens_b + [word_dict['SEP']]
10 seg_ids = [0] * (1 + len(tokens_a) + 1) + [1] * (len(tokens_b) + 1)
11
12 # fixed input length => padding ['Pad']
13 input_ids extend [word_dict['Pad']] * num_pad
14 seg_ids extend [0] * num_pad
15
16 => masked_pos, masked_tokens
17 => isNext
18=> [{input_ids,seg_ids,masked_pos,masked_tokens,isNext},
19 {...}...]
20
21attn_pad_mask = [0,..,0,1,..,1]
22
23Bert = {(Token_embed+Pos_embed+Seg_embed) => {MHSA[attn_pad_mask]=>FFN}xN
24 => {head1(dim_token->2)-o1:isNext, head2(dim_token->vocab_len)-o2:predict_masked_word}}
25# attn = A B P P->Padding
26# A √ √ × bi-directional
27# B √ √ ×
28# P √ √ ×
29
30loss1 = CrossEntropyLoss(o1,isNext)
31loss2 = CrossEntropyLoss(o2,masked_tokens)
fine-tuning
- input: [CLS] + Token-A + [SEP], get [CLS] # 单独
- input: [CLS] + Token-A + [SEP] + Token-B + [SEP], get => [SEP] + Token-B + [SEP] # 关联关系
minUnet
✅ 解决问题
像素级分类:比如医学图像中分割肿瘤区域,或自动驾驶中识别道路、行人轮廓。
🛠️ 具体措施
- 模型形状像字母 U:
- 左边是 编码器(下采样):提取特征(越来越抽象)
- 右边是 解码器(上采样):恢复细节并定位中间有
- 跳跃连接:把浅层细节传给深层,避免丢失边缘信息
- 输入一张图,输出一张同样大小的 掩码图(每个像素是 0 或 1,表示是否属于目标)
💥 损失函数
像 玩涂色游戏:
- 给一张黑白线稿(输入图),让你涂出哪部分是“目标”(比如肿瘤)。
- 涂错地方就扣分。
- 用的是 二元交叉熵损失(BCE):预测概率和真实标签差距越大,罚得越重。
💼 工作流程
1# Model U-shape feature-flow
2input => [Enc1] => [Dec6] => output # Pixel-Level semantic token => binary classification
3 [Enc2] => [Dec5]
4 [Enc3] => [Dec4]
1# Training:
2for data in dataloader:
3 inp, mask = data
4 oup = model(inp)
5
6 loss = BCELoss(oup, mask)
7 ...
minYolo
✅ 解决问题
在一张图中找出所有物体:比如检测图片中有几个人、几辆车,标出位置和类别。
🛠️ 具体措施
- 把图像分成 K×K 个格子(比如 3×3)
- 每个格子预测 B 个 锚框(候选框),每个框包含:中心坐标
(x, y)、宽高(w, h)是否有物体的置信度(confidence)各类别的概率(如人、车、狗…共 C 类) - 输出维度:
(K, K, B×5 + C) - 推理步骤:先过滤掉置信度低的框(可能是背景)把
(x, y, w, h)转成左上右下坐标对每个类别做 NMS(非极大值抑制):去掉重复框,只留最好的一个
💥 损失函数
像 考试改卷分三部分扣分:
- 框位置不准:预测的框中心和大小跟真实差太多 → 扣分(x, y, w, h 损失)
- 有没有物体判断错:有物体但说没有 → 狠扣分(noobj 损失大)没物体却说有 → 轻微扣分(obj 损失小)
- 类别猜错:比如把“狗”认成“猫” → 扣分(分类损失)
💼 工作流程
1X:(1,3,H,W) => Model => Y:(K,K,B*5+C)
2
3[k1,k2,k3]
4[k4,k5,k6] => [X,Y,W,H,Confidence,C1,...,Cn]
5[k7,k8,k9]
6
7# Inference (x, y) (w, h) confidence prob-class[0,...,79]{80-category}
8# Step 1
9conf_mask = (prediction[:, :, 4] > confidence).float().unsqueeze(2) # 根据confidence判断该锚框是否存在对象
10prediction = prediction * conf_mask
11# Step 2
12# 处理x,y,w,h => (x1,y1,x2,y2)
13
14# 若B>1: => 重塑为 (KK+N,5+C)
15
16# 整理成 [X1,Y1,X2,Y2,idx_class,class_score] <= 存在对象
17
18# 进行NMS非极大值抑制
19for img : per_img:
20 # 根据 class_score 排序
21 # 计算当前预测框与后续预测框的IoU
22 # 根据 iou ? nms_conf 进行去除冗余的框
23
24锚框数据:[X1,Y1,X2,Y2,idx_class,class_score]
25
26
27# Inference
28label: [[idx_class,x,y,w,h],[...]] => [[X,Y,W,H,Confidence,C1,...,Cn],[...]]
29# Yolo-v1: 将锚框均匀的等分为7×7的Cell
30
31X:(1,3,H,W) => Model => P:(K,K,5+C) Y:(K,K,5+C)
32
33# Loss
34分三步:
351. 锚框Loss : x,y and w,h
362. Confidence-Loss: obj and noobj
373. class-loss: Ci
38
39# 具体做法就是
401. 按照Confidence>0.5 => 是否存在对象
412. 收集所需要的Cell => 分别计算Loss