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. 填空题:把句子里的词遮住,让你填回去。填错扣分。
  2. 判断题:给你两句话,问第二句是不是第一句的下一句。判断错也扣分。总损失 = 填空损失 + 判断损失

💼 工作流程

 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(非极大值抑制):去掉重复框,只留最好的一个

💥 损失函数

考试改卷分三部分扣分

  1. 框位置不准:预测的框中心和大小跟真实差太多 → 扣分(x, y, w, h 损失)
  2. 有没有物体判断错:有物体但说没有 → 狠扣分(noobj 损失大)没物体却说有 → 轻微扣分(obj 损失小)
  3. 类别猜错:比如把“狗”认成“猫” → 扣分(分类损失)

💼 工作流程

 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

image-20241102213134197