闭包
闭包是什么?——一个函数与其周围状态绑定在一起就是闭包。
概述
闭包通常出现在支持头等函数、垃圾回收的编程语言中,如果函数f中定义了函数g,函数g中使用了自由变量,则函数g构成闭包。
头等函数(First-class function):指函数可以作为别的函数的参数、函数的返回值,赋值给变量或存储在数据结构中。
自由变量(Free variables):自由变量是指在一个特定作用域内未被定义但被引用的变量。
约束变量(Bound variables):约束变量是指在一个特定作用域内已经被定义的变量。
以Python代码为例
123456789101112def f(): y = 0 # 自由变量 def g(): nonlocal y x = 0 # 约束变量 y += 1 x += 1 return y return gclosure = f()print(closure()) # 1
为什么提出闭包
最初闭包是为了解决函数式编程中一些问题,包括隐藏保存一些私有数据、保存上下文(例如计数 ...
RLHF
LLM 训练步骤
预训练
监督微调
RLHF
前两部和以前的语言模型无异,我们以ChatGPT的博客,看一下RLHF做了些什么
RLHF——PPO与LM的结合
PPO属于Actor-Critic架构,Actor即策略也就是LLM本身,那么我们需要一个能对Actor输出结果进行打分的Critic值函数,因此我们先介绍Critic部分,该部分我们称之为Reward Model的训练,以dschat为例
Reward Model
Backbone采用LLM-base部分(即预训练后、监督微调前),输出头表示每个Token对应的V值。模型loss为pairwise loss
1loss -= F.logsigmoid(c_divergence_reward - r_divergence_reward).mean()
并且以last token作为终止奖励,根据模型可选的增加一个新的token
PPO
以KL Penalty Coefficient加上Reward模型的end reward作为额外的奖励值(个人感觉不是很必要,同时用了clipped advantage)
计算act ...
强化学习远程环境
远程环境无法渲染
123456789101112131415161718import gymnasium as gymfrom stable_baselines3 import A2Cenv = gym.make("CartPole-v1", render_mode="rgb_array")model = A2C("MlpPolicy", env, verbose=1)model.learn(total_timesteps=10_000)vec_env = model.get_env()obs = vec_env.reset()for i in range(1000): action, _state = model.predict(obs, deterministic=True) obs, reward, done, info = vec_env.step(action) vec_env.render("human") # VecEnv resets automatically ...
C++虚函数、纯虚函数、虚函数表
虚函数virtual ReturnType Function(){}
纯虚函数virtual ReturnType Function()=0;
虚函数与纯虚函数的区别
声明虚函数,可以定义,也可以不定义,含有虚函数的类,可以被实现。
声明纯虚函数,不可以有定义,含有纯虚函数的类(等价于抽象类),不可以被实现。
虚函数表
虚函数表是C++实现动态绑定技术(多态)的背后依赖。每个包含虚函数的类都包含一个虚表,同一个类的多个对象共享同一个虚表,也就是说每个对象前8个字节用来存储一个指针,同一类的多个对象的该指针相同,都指向该类的虚表。而虚表的构造在编译阶段就已经确定下来了。
123456789101112131415161718192021222324252627282930class A{public: virtual void func1() { cout<<"A::func1() is called"<<endl; } virtual void f ...
Python关键字import
import是在一个模块中访问另一个模块的方法,那么第一个问题就是——什么是模块?
模块(Module)
什么是模块?
模块是一个包含python的声明和定义的文件,文件名为模块名加上.py后缀,每个模块拥有自己的命名空间。
包(Package)
什么是包?为什么设计包这个概念?包与模块有什么区别?
通常来说,包是一个包含多个模块的模块,例如一个包含多个.py后缀的目录。而设计这个包的概念是为了可以层级的组织模块。包是一种特殊情况下的模块,单不是所有模块都是包,最直接的区别就是包拥有__path__属性,而模块是没有的。
同时,Python定义了两种类型的包——常规包和命名空间包。
常规包(Regular Package)
通常我们印象中的包的结构都是常规包,如下所示
12345678parent/ __init__.py one/ __init__.py two/ __init__.py three/ __init__.py
目录中包含__init__.py文件,当我们引用该包或该包中的子模块时,对应的__init__ ...
混合精度训练
浮点型
什么是浮点型
小数点位置约定在固定位置的数称为定点数,小数点位置约定为可以浮动的数称为浮点数。
深度学习中常见的浮点型格式
单精度FP32
半精度FP16
半精度BF16(安培架构)
浮点型表示方法
浮点型包含三部分,依次为符号位(sign)、指数位(阶码)(exponent)、尾数位(mantissa, trailing significand field, fraction),则一个浮点型数可以表示为
(−1)s×t×2e(-1)^s \times t \times 2^e
(−1)s×t×2e
其中符号位1为负数,0为正数,指数位采用补码,尾数位采用原码。指数位存在一个指数偏置项(移码)(exponent bias),偏置项为 2(n−1)−12^{(n-1)}-12(n−1)−1 而非通常的 2(n−1)2^{(n-1)}2(n−1) ,以FP32为例,偏置项为127,通过偏置项将无符号指数范围从1~254(全1和全0用来标记特殊值)转移到 -126~127 避免指数位同样出现一个符号位与浮点型符号位增加比值问题的复杂度。因同一个数对应的尾数有多种表示,因此IE ...
大模型评估数据集
基础常识推理
BoolQ
BoolQ is a question answering dataset for yes/no questions containing 15942 examples. These questions are naturally occurring ---they are generated in unprompted and unconstrained settings. Each example is a triplet of (question, passage, answer), with the title of the page as optional additional context. The text-pair classification setup is similar to existing natural language inference tasks.
PIQA(Physical Interaction: Question Answering)
The dataset contains 16,000 examp ...
GPT Series
GPT1
Improving Language Understanding by Generative Pre-Training
前言
将之前词向量等无监督称之为Semi-supervised learning,将GPT1这种无监督称之为Unsupervised pre-training(作为Semi-supervised learning的子集)
Framework
Unsupervised pre-training
给定一个句子U=(ui)U=(u_i)U=(ui),极大似然
L1(U)=∑ilogP(ui∣ui−k,…,ui−1;Θ)L_1(\mathcal{U})=\sum_i \log P\left(u_i \mid u_{i-k}, \ldots, u_{i-1} ; \Theta\right)
L1(U)=i∑logP(ui∣ui−k,…,ui−1;Θ)
kkk为上下文窗口大小
Supervised fine-tuning
......
...
L3(C)=L2(C)+λ∗L1(C)L_3(\mathcal{C})=L_2(\mathcal{C} ...
Tokenizer中的Subword算法
说起Tokenizer,不得不先介绍一下Subword
目前常见的Subword算法包括BPE、WordPiece、Unigram、SentencePiece及相关变体
BPE
BPE —— Byte-Pair Encoding 是一种压缩算法,BPE算法按如下步骤生成词表:
将语料按字符切分,并在单词末尾加以</w>标记。
确定期望的词表大小
统计每两个subword的共现频率,选择共现频率最大的一对subword合并生成新的subword
重复上一步知道subword个数满足期望的词表大小或共线频率最大为1时停止
12345678910111213141516171819202122232425262728import re, collectionsdef get_stats(vocab): pairs = collections.defaultdict(int) for word, freq in vocab.items(): symbols = word.split() for i in range(len(symbol ...
推荐系统常用指标
推荐系统常用指标
MAP
MAP —— Mean Average Precision, 即对多个AP求平均。
AP定义如下:
AP=∑knP(k)×rel(k)∑knrel(k)\mathrm{AP}=\frac{\sum_{\mathrm{k}}^{\mathrm{n}} \mathrm{P}(\mathrm{k}) \times \operatorname{rel}(\mathrm{k})}{\sum_{\mathrm{k}}^{\mathrm{n}} \operatorname{rel}(\mathrm{k})}
AP=∑knrel(k)∑knP(k)×rel(k)
其中,rel(k)\operatorname{rel}(\mathrm{k})rel(k)表示当第k个预测值与ground truth相关(相同)时为1,否则为0;P(k)\mathrm{P}(\mathrm{k})P(k)表示前k个预测值中相关的占比。
示例:
预测序列e,b,a,d,c ; ground truth为a,b,c,d,e ,则第2个和第4个预测值与gt匹配,AP则为:
AP=12+242 ...