模型水印与防滥用
原理
攻击手段
复述:使用另一种生成模型进行改写和润色,改变token分布与相邻关系
插入/删除:少量编辑,造成链条错位,使得token的种子与绿/红名单分配发生偏移
其他安全手段
指纹技术:记录模型生成时的参数特质(留下可追溯的运行痕迹)
记录与这次生成绑定的参数特征/元数据(例如模型版本、解码设置、随机种子、调用方ID、时间戳,或对输出做哈希签名),形成一条“指纹记录”
C2PA协议:打上数字签名(一份内容凭证:数字签名+元数据清单,来源说明)
包含生成/拍摄工具、发布者标识、时间、以及关键编辑步骤的记录,形成一条“内容履历”
红队测试:发布前找专家攻击模型、挖掘漏洞
系统性设计高风险提示(越狱、提示注入、诱导泄露、仇恨/暴力/违法内容等),记录模型在不同场景下的失败模式与触发条件。
代码过程
核心原理采用经典的 Greenlist/Redlist 词表分割水印(Kirchenbauer et al., 2023 的思路):
嵌入(embed):每步解码用密钥 + 上文生成一个“绿色 token 集合”,对绿色 token 的 lo...
强化学习
知识点
风险:
幻觉
有害内容(毒性、歧视)
奖励黑客:找漏洞提升RM,编造废话和拒绝回答
阶段2奖励:
数据形式,标记
训练打分器
阶段3RL:
PPO算法
要求:
调参数,提高RM
近端,小步快跑,限制每次更新的幅度
缺点:
训练不稳定:多个环节强耦合
DPO(直接偏好优化)
要求:
采用分类损失函数
比较相对概率差
W上升,L下降
优点:
省资源
稳
快
缺点:
复杂情况,推理不佳
初级任务
Banana任务——受限生成对齐
SFT:收集成千上万条人工编写的对话数据进行微调
RL:写出规则来“评分”,模型自己学习“怎么做”
硬性代码逻辑if-else 来控制输出格式
任务目标
“受限生成”任务:
A:以Sure:开头
B:以banana结尾
C:回答简短(对冗长输出惩罚)
Policy:Qwen
Reward:Python函数,格式正确+1.0,否则不得分
必要导包
1234import torchfrom transformers import AutoToken...
指令微调
有监督的指令微调
过程
检查安装包情况,使用的
准备数据集
instruction
input(可选)
output
数据条目整理成大模型可用的输入文本
Alpaca
Phi-3
划分数据集(85%,10%,5%)
数据组织成训练批次
预分词
补齐输入和目标(50256):不同batch不同长度,同一batch相同长度
50256替换为-100
所得结果,与只用前两个样本计算得到的损失是一样的。说明忽略了-100的这个样本。cross_entropy 默认就带有 ignore_index=-100 的设置,会自动跳过标签为 -100 的位置。留一个方便知道收尾的位置,即回答结束的时候。
数据加载器
数据移到目标设备.device()
预先固定函数的部分参数
加载预训练大语言模型(这次使用中等规模的版本gpt2-medium (355M))
from gpt_download import download_and_load_gpt2
from previous_chapters import GPTModel,l...
针对分类任务的微调
微调:在预训练模型的基础上做二次训练,把模型的能力对齐到某个明确任务或者使用场景上
本节任务:使用已有的预训练模型做邮件分类
分类微调:类别和数量是预定义好的
指令微调如下图所示:
前期流程
导包
读取数据
查看种类数量
控制数量一样多:下采样(降采样)
分类编码(0/1)
划分子集
1234567891011121314151617181920def random_split(df,train_frac,validation_frac): """ sample:随机抽样 - frac=1 表示“抽取 100% 的行”,相当于全量洗牌,随机打乱 reset_index:重新生成索引 - drop=True 表示不要把原来的索引作为一列保留下来。 """ # 下标 df=df.sample(frac=1,random_state=123).reset_index(drop=True) train_end=int(len(df)*train_...
无标签预训练
关键内容
预训练大模型的训练循环
模型评估代码,检查效果与质量
解码策略
保存和加载预训练权重
现代大模型与原先区别
不使用dropout
nn.Linear不使用bias
过程记录
训练
方便文本与token ID之间来回转换
12345678910111213141516import tiktokendef text_to_token_ids(text,tokenizer): encoded=tokenizer.encode(text,allowed_special={'<|endoftext|>'}) # 把 token id 列表转成 PyTorch 张量,形状是 [seq_len] # torch.tensor(encoded) -> 1D 张量,例如 [15496, 1234, ...] # unsqueeze(0) 在最前面增加一个 batch 维度,变成 [1, seq_len] # 这么做是因为大多数模型的输入都要求带 batch 维...
从头实现GPT模型
过程
参数含义
1234567"vocab_size": 50257, # 词汇表大小(token 总数)"context_length": 1024, # 上下文长度(一次最多处理的 token 数)"emb_dim": 768, # 嵌入维度(每个 token 向量的长度)"n_heads": 12, # 注意力头数(多头注意力的 head 数量)"n_layers": 12, # Transformer 层数(block 的数量)"drop_rate": 0.1, # Dropout 概率(训练时用于防止过拟合)"qkv_bias": False # Q/K/V 线性映射是否使用 bias(是否加偏置项)
完整GPT模型
GPT完整骨架
123456789101112131415161718192021222324252627...
大模型自学记录Day2
注意力机制
注意力机制解决的问题,对比:
RNN
按顺序逐词的方式处理文本
将输入压缩为中间状态,但容易遗忘。依赖该中间状态输入token容易丢失细节,要求不断会看完整输入(遗忘)
自注意力机制
访问全部输入状态的历史信息
回看整个输入
有选择回看(权重)
点积
计算点积:torch.dot(input_query, input_1)
对dot进行展开写:
12345678# enumerate:给每个元素自动编号res=0. # 小数形式i=0for idx, ele in enumerate(inputs[i]): res+=inputs[i][idx] * input_query[idx]res
点积与余弦相似度区别
点积:相关性的“原始分数”,关键取决于夹角(很强+很像)
a⋅b=∣a∣∣b∣cosθa⋅b=∣a∣∣b∣cosθ
a⋅b=∣a∣∣b∣cosθ
方向
长度
余弦相似度:去掉长度影响后的“纯方向相似度”(很像,语义检索常用)
cosθ=a⋅b∣a∣∣b∣\cos\theta=\frac{\mathbf...
大模型自学记录Day1
终于结束了考研,现在重新拾起我的博客,记录学习。
近几个月计划
毕业前
[ ] 大模型相关内容
[ ] 雅思
[ ] 化妆
毕业后
[ ] 课题组内容
[ ] 科研技能和知识
[ ] 学车
[ ] 做饭
LLM学习
基础阶段决定先根据:张梅山老师发布的大模型基础学习路线
特此感谢!
笔记只记录一些关键代码,方便后续回顾复盘
文本数据处理
过程
分词(encode)
**标准化:**读取文本,处理标点符号
**拆分 (Split):**使用 正则表达式将文本切分为列表
**去重与排序:**提取所有唯一的单词
**构建映射表:**词 —— ID
引入特殊上下文词元
未知单词
文档分隔符
反过来(decode)
输入文本
12345with open("the-verdict.txt", "r", encoding="utf-8") as f:# 以 UTF-8 编码打开文本文件(只读) raw_text = f.read() # 读取文件全...