# ravel 和 flatten 的区别
np.ravel 返回原数组的一个 view,而 flatten 返回一个副本
# T 转置的内存规则
对于一个 ndarray 数组 A,A.T 是一个新的对象,即 id (A) 和 id (A.T) 不相等
但是二者共享底层的数据存储
# 数组顺序
- K:内存顺序
- C:行顺序
- F:列顺序
# metaclass 元类
创建普通类的 “创世神”,普通类是元类的一个 instance
记住 super ().__new__的参数需要 cls,super ().__init__则无需显式传入 self
自定义元类 mymeta 继承 type
class mything (base,metaclass=mymeta),其中 mymeta 是我们自己定义的元类
# 切片
切片获得原数组的 view,修改反馈到原数组
0 维数组使用 [...] 来切片
... 即许多个 :
# 自定义 np.ndarray 类
先 new,new 中有 view (cls) 所以会调用 finalize,最后创建好后会 init
一般不写 init,直接在 new 中 np.asarray,view,属性赋值
当进行切片 or 创建视图时,会调用__array_finalize__方法
finalize 中,obj 是原数组,self 是新视图
# 可迭代对象、迭代器、生成器
iterable:实现了 __iter__() 方法返回一个 迭代器。
Iterator:实现了两个方法:
__iter__()返回自身;__next__()返回下一个值,没值了就抛出StopIteration。
只能往前走,不能回退;
数据不会一次性全部加载,节省内存。
Generator:一种更方便写法的 迭代器
yield 函数,或者如 (i for i in range(3)) 的表达式
# BatchNorm & LayerNorm
batchnorm 对一个 batch 中所有 channel 操作,alpha、beta 形状就是 [C]
layernorm 对每个 batch 的每个 seq(字符)进行操作
且 layernorm 的 alpha、beta 形状为 [D],因为 D 维向量的每个维度代表不同的 "语义特征"。
- 第 0 维可能编码 "主语信息"
- 第 1 维可能编码 "时态信息"
- ... 以此类推
不同特征维度的尺度可能不同,所以每个特征维度需要独立的 alpha 和 β 来调整。不同样本、不同序列位置的同一特征维度,语义含义相同,所以共享同一个 alpha 和 β
对于 BatchNorm 和 LayerNorm 它们区分训练状态和推理状态吗?
- BN 区分:BN 训练时通过指数平滑记录均值和方差,推理时直接用训练过程中最后的均值和方差结果
- LN 不区分:LN 对每一个 token 计算 feature 均值和方差,不依赖历史统计值