Math Guide
Math Guide
本page作为指南页,收集一些数学相关的知识或者trick
1. Approximating KL Divergenc
主要介绍使用MC方法来近似KL散度的技巧。层层递进,目标是既无偏又具有较低方差的采样估计。
2. KKT条件使用说明书:实战 · 避坑 · 反例
本文为KKT操作指南(Cookbook),Step1到Step7,从实践视角,融合优化理论最新成果,详陈使用KKT条件确定约束优化问题全局最优解的操作步骤
3. nju矩阵计算课程笔记
为南京大学25spring李易峰老师矩阵计算课程的笔记
目录:
4. 低秩近似之路(一):伪逆
问题引入:在线性方程 AB = M 中,当 A 不可逆或非方阵,逆矩阵失效,需考虑误差最小化。
优化定义:通过最小化 Frobenius 范数引出右伪逆和左伪逆的优化表达式。
基础工具:介绍 Frobenius 范数、迹与内积,为后续推导提供支持。
解析推导:利用链式法则求梯度,推导出在 ATA 可逆时的闭式伪逆解:A†=(ATA)−1ATA^† = (A^T A)^{-1} A^T
A†=(ATA)−1AT
正则化拓展: ...
Positional Encoding
Positional Encoding
参考博文
从位置编码到 RoPE:设计思考与演进过程综述
在 Transformer 模型中,自注意力机制本质上是不关心输入顺序的。这一特点虽然使得模型并行计算成为可能,但同时也带来了一个问题:如何让模型区分同一词在不同位置上的不同语义?解决这一问题便是位置编码的初衷。
为什么需要位置编码
Transformer 模型在处理输入序列时,每个 token 的嵌入初始都是独立的,没有顺序信息。为了解决这一缺陷,早期的设计者们选择了一种简单直接的方法——将位置编码与词嵌入相加。这种加法操作使得最终传入多头自注意力计算矩阵始终保持统一维度,同时把位置信息“融入”到了语义空间中,使得模型无须额外学习如何整合两种信息。[¹]
从加法到拼接:取舍的背后
虽然理论上可以考虑通过拼接来将位置信息与语义信息组合,但大部分设计者更青睐于加法操作。原因在于:
维度一致性:加法仅仅是在原始嵌入上做一个“细微的调整”,保持了每个向量的长度不变;而拼接会增加维度,导致后续各层的参数和计算设计都需要随之调整。
特征融合:通过相加,模型在处理点积运算(如自注意力中的 Q 和 K ...
Auto-encoder
Auto-encoder
其实方法论上很简单:
从PCA的视角看:
就是两边的weight是转置的,但是这个PCA限制的,没有必要说encoder和decoder的weight是对称的。
所以可以去掉这个限制,直接train一发。
deep的方法比PCA好一些:(下面是deep)
Auto-encoder还可以用来做预训练参数
比如上图中,先把500 1000 1000之间的参数按每一层去学好,作为初始值。
最后在调W4的时候,对所有参数一起fine-tune就行。
但是一般没什么用了现在,现在的optimizer都挺牛逼的。
主要是针对大量没有标签(用来pre-train),只有少量的labeled data去稍微调整weight。
加噪版auto-encoder增加抗干扰能力,更robust
让auto-encoder学会去除噪音。
对CNN也有对应的unpooling和deconvolutional
使用decoder去做generation
但是怎么选择框不太方便。
这里可以加一个L2的regularization,让其分布与0点的周围,然后直接取0周围的 ...
矩阵计算
矩阵特征值
矩阵的迹
矩阵的秩
内积and范数
一个比较重要的点:
说明范数之间是有limit的,有时一个范数很难,我们可以转换为最小化另一个容易处理的范数来solve。
正定矩阵
正交矩阵
正交矩阵重要性质:
三角矩阵
对于正定矩阵可以有cholesky分解:
这个方法可以用于采样协方差矩阵:
范德蒙矩阵
傅里叶矩阵
特征值分解
所有像ex,sin(x)e^x,sin(x)ex,sin(x)可以展开成多项式逼近的函数作用在矩阵上都可以先特征值分解做简化。
特征值的定义
对于对称矩阵:
三个对称矩阵特征值特征向量重要的结论:
非对称矩阵在这三个结论上的说法:
挺实用的几个tips。
同时这里提到了特征值的条件数
特征值的代数重数大于几何重数
相似矩阵具有相同的特征值:
实对称矩阵一定可以对角化!
对于有重根则需要进一步去算,不一定可以,也不一定不可以。
数值稳定
用二范数的时候,cond就是最大奇异值和最小奇异值的比值。
所以添加对角线eps可以起到稳定作用。
条件数一些性质和应用
QR 分解也 ...
好运设计
史铁生的散文《好运设计》是在截瘫后写的一篇关于人生的思考。史先生在这篇散文中设计了一个完美的人生,试图探讨什么是好运,什么是幸福。
《好运设计》的初衷是为了设计一个完美的人生。
第一步,史铁生设计了从出生到婚姻完美的人生阶段。英俊潇洒的健康身体,爱因斯坦的聪明智慧,爱你的父母,多姿多彩的童年,长大后的多才多艺,学识渊博,然后遇到了同样优秀的人生伴侣。
到了这里第一个问题出现了,没有过痛苦和挫折的衬照,你是体会不到幸福的滋味,也不懂得去珍惜,然后时间会冲淡这一切,开始枯燥,麻木,腻烦…. 所谓好运,显然不是一种客观的程序,而完全是心灵的感受,是一种幸福感罢了。没有痛苦和磨难就不能强烈感受到幸福,那只是舒适只是平庸,不是好运更不是幸福。
看来为了这个设计得不停的去感受一些小小的痛苦,比如追求中虽然会体会到一点痛苦,但是最终都会获得胜利,你会不停的克服困难,以此不断的获得幸福感。
到了这里,我们发现了另一个问题,这个世界上没有永远的胜利者,即使有,也逃不过人类的宿命,消亡。面对这个结果,饱尝无数胜利的你,会输的一败涂地,你的所有追求,所有胜利,在这一刻显得那么的微不足道。是的,设计到了这里, ...
JAX base
JAX
学习资料:
https://www.zhihu.com/column/c_1729967479470804992 从入门到jax神经网络手写数字识别 对应的github仓库
https://space.bilibili.com/478929155/search?keyword=jax b站上的视频讲解,挺好懂的。
12345678910111213141516171819202122232425import jaximport jax.numpy as jnpfrom jax import jit, grad, vmap# 原始函数def f(x): return jnp.sin(x) + x**2# 1. 求导f_grad = grad(f)# 2. 向量化f_grad_batch = vmap(f_grad)# 3. 编译加速f_grad_batch_jit = jit(f_grad_batch)# 创建一批数据x_batch = jnp.linspace(0, 10, 10000000) # 10000个样本# 调用y_batch = f_grad ...
Python Multiprocess
Pyhton Multiprocess
众所周知,py因为有GIL的存在,导致python的多线程并不能真正实现多线程的效果。python的多进程可以有效的解决这个问题。python的多进程是通过multiprocessing模块来实现的。
一个用cond条件变量实现生产者消费者的例子
producer consumer
下面是完全用 Process 子类,并结合双 Condition 的“满/空”优化,同时保留了:
with cond: 自动加锁/解锁
while 循环防虚假唤醒
notify_all() 精准唤醒
子类化封装,可复用、清晰
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889from multiprocessing import Process, Condition, ...
C++ Embedding Python
C++ Embedding Python
c++编译链接 背景知识
cpp流程如下
我们想做的是在python中调用cpp的函数。
我们把cpp搞成动态链接库so,然后在python里import这个so文件,来调用写好的cpp函数。
链接器作用
头文件和链接
为什么 .h 和 .cpp 要分开写
静态和动态编译
pybind11 在py中嵌入cpp函数
常见方式
我们尽量选择pybind11来做python和cpp的交互。
我们马上做两个更实用的例子:
1. 绑定一个完整的 C++类(class) 给Python用
2. 让Python的 numpy数组直接传给C++加速处理(比如矩阵运算)
(全部用pybind11,保持代码极短极优雅🌟)
🛠️ 第一个例子:绑定一个C++类到Python
Step 1. 写一个简单的C++类
新建 example.cpp
123456789101112131415161718192021#include <pybind11/pybind11.h>class Adder {public: A ...
Python tips
Python Tips
对于mypy静态检验,我们该怎么严谨的写py code
使用logging来标注info和debug信息,可以一键屏蔽debug信息
类方法 @classmethod
绑定之后,就不用传入self了 变成对这个类的元变量的函数
包的绝对导入和相对导入
py判断数据类型
callable 让类的实例可以像函数一样被调用
函数传参顺序
map返回的是惰性对象
需要list()隐式遍历来转换为list
ABC基类+@abstractmethod 强制实现虚接口
Pandas Tips
Pandas Tips
series本来就是像dict,安全的获取元素方式
series的运算最重要是自动更具index对齐
当我们想要删除nan时
当我们指定index和columns时,效果不一样,index是替换,columns是保留/选择
列的删除和添加
pandas浅拷贝和Copy on write
遇到list里面还有其他指针的可变对象时,需要deepcopy。
常见的切片,取col操作都是COW的,真正共享底层内存需要直接对df.value进行操作。
用df.assign()来添加列 配合lambda函数
挑选子集
注意直接df[]可以是col,也可以返回是row的切片组合df。
df的运算
describe()简单总结每一列的情况
sort和query
单元素快速数据访问
筛选过滤
要注意下面这种情况,不要连着用,不然解释器不知道你对第一个副本做还是对原始df做
使用df.loc明确说
pandas的缺失元素
强制统一col的元素和顺序 目的是对 ...