LLM - Learning Tips

Posted by MakiNaruto on Sat, Dec 21, 2024

模型参数量的计算

数据精度

要计算参数量, 我们首先要知道, 在计算机表示中, 对于数据的表示精度范围不同, 意味着该数据表示形式可能占用的内存空间也不同.
浮点数在计算机中的存储分为三个部分:
 1. 符号位(sign):float和double符号位均为1位,0代表正数,1代表负数
 2. 指数位(exponent):存储科学计数法中的指数部分,采用移位存储
 3. 尾数位(fraction):存储科学计数法中的尾数部分

$$(-1)^{符号位} \times 2^{指数位 - 指数偏移} \times (1 + \frac{尾数位}{1024}) $$

例如fp16, 举例说明:
 Exponent(指数位):5
  表示范围 00001(1)到11110(30)
  为了能表示负数,减去偏置(15),指数部分(-14 - 15 )
Fraction 位数位:10
  共10位
  表示范围 0000000000 - 1111111111( 0~1023)
  除以1024(0 - 1023)/1024

可以表示的最大数据(符号位=1,指数位=30,尾数位=1):
$(-1)^{0} \times 2^{30 - 15} \times (1 + \frac{1023}{1024}) $
可以表示的最小数据(符号位=-1,指数位=30,尾数位=1):
$(-1)^{1} \times 2^{30 - 15} \times (1 + \frac{1023}{1024}) $

常用数据精度

简称全称符号位指数位小数位总位数字节数表示范围
fp32单精度浮点数
(Single-precision floating-point)
1823324$[-3.4 × 10^{38}, 3.4 × 10^{38}]$
fp16半精度浮点数
(Half-precision floating-point)
1510162$[-65504, 65504]$
bf16Brain 浮点数
(Brain floating-point)
187162$[-3.39 × 10^{38}, 3.39 × 10^{38}]$

Loss图像

常见激活函数的图像:

其他激活函数: non-linear-activations

embedding

大模型本身是有embedding层的, 不需要去再加载一些单独训练的embedding了, 其embedding的维度和字典的维度不相同. 但在传统的Word2vec、bert等模型中, 其embedding是与字典的长度相同的. 为什么会有这个差异?

1model.base_model.embed_tokens
2>>> Embedding(151936, 896)
3tokenizer.vocab_size
4>>> 151643
  1. 特殊token: 除了常规的词汇,模型通常还会引入一些特殊的token,比如等。这些token虽然不在原始的词表中,但也会被分配一个embedding向量,从而导致embedding层的维度略大于词表长度。
  2. 预留空间: 在模型训练过程中,为了应对新的词汇或者一些特殊的需求,模型可能会预留一些额外的embedding向量。这些预留的向量可以用来表示未出现在训练数据中的词,或者用于一些特定的任务。
  3. 模型架构设计: 某些模型架构可能会在embedding层上进行一些额外的操作,比如引入位置编码等。这些操作可能会导致embedding层的维度发生变化。

attention_mask 的作用

1# 生成随机输入和掩码
2X = torch.randn(5, 3)
3mask = torch.tensor([[1, 1, 0], [1, 0, 0], [1, 1, 1], [0, 0, 0], [1, 0, 1]])

当我们将一些信息选为不关注时, 对信息的关注也是不同的, 如下图所示: