传送门
模型解读
我们知道Transformer的复杂度是平方的, 就很丑; 而RNN的复杂度虽然是线性的, 但是因为隐状态的大小是固定受限的, 长序列处理一直是弱项. 用可训练模型作为隐状态对RNN进行魔改就有了TTT.
连连看
Quick Start
是个好东西
1 | from transformers import AutoTokenizer |
我们知道Transformer的复杂度是平方的, 就很丑; 而RNN的复杂度虽然是线性的, 但是因为隐状态的大小是固定受限的, 长序列处理一直是弱项. 用可训练模型作为隐状态对RNN进行魔改就有了TTT.
Quick Start
是个好东西
1 | from transformers import AutoTokenizer |
先用v4版本做连连看, v5和v6对应arxiv:2404.05892, 有时间再做连连看
老规矩, 找入口(RWKV-v4/run.py
):
1 | print(f'Loading {MODEL_NAME}...') |
后面调用的是 model.run(x)
, 很明显, 我们要进到
RWKV-v4/src/model_run.py
里面去
基于逻辑思维的符号AI系统面临的问题是经验事实的不足, 逻辑推理固然合理, 但是逻辑推理本身不能保证输入的一定是 "事实", 我们对理性的追求是对逻辑推理的追求还是对 "事实" 的追求呢?
形式逻辑一宗罪是 "极化思维", 即现代逻辑侧重于刻画边界分明的边界情况而不太考虑语义模糊的灰色地带, 我们在借助现代逻辑追求理性的道路上也有避免落入极化思维中
形式逻辑的经济性不高, 但从OpenAI的例子来看, 大力出奇迹也不是没有可能, 着眼于解决前四宗罪可能更有意义
亚里士多德式逻辑相较于现代命题逻辑显得古朴粗糙, 但正是因为它的古朴粗糙, 它对心理直觉的背离更少, 更容易与心理学对接.
Mamba系列日积月累(一):状态空间模型SSM的离散化过程推导
首先从用法开始入手:
1 | import torch |
IDE会告诉我们:
入口在mamba_ssm/modules/mamba_simple.py
中.
接下来就来会会它
本系列参考自 Quaternions for Computer Graphics, 四元数与三维旋转 和 视觉SLAM十四讲(第二版)
\[ \begin{align*} \boldsymbol{q_{a}}\boldsymbol{q_{b}} = L(q_{a})q_{b} &=\begin{bmatrix} s_{a} &-x_{a} &-y_{a} &-z_{a} \\ x_{a} &s_{a} &-z_{a} &y_{a} \\ y_{a} &z_{a} &s_{a} &-x_{a} \\ z_{a} &-y_{a} &x_{a} &s_{a} \end{bmatrix} \begin{bmatrix}s_{b}\\ x_{b}\\ y_{b}\\ z_{b}\end{bmatrix} \\ \boldsymbol{q_{a}}\boldsymbol{q_{b}} = R(q_{b})q_{a} &=\begin{bmatrix} s_{b} &-x_{b} &-y_{b} &-z_{b} \\ x_{b} &s_{b} &z_{b} &-y_{b} \\ y_{b} &-z_{b} &s_{b} &x_{b} \\ z_{b} &y_{b} &-x_{b} &s_{b} \end{bmatrix} \begin{bmatrix}s_{a}\\ x_{a}\\ y_{a}\\ z_{a}\end{bmatrix} \end{align*} \]
由此可得:
\[ \begin{align*} pvp^{-1} &=R(p^{-1})L(p)v \\ &=\begin{bmatrix} s &x &y &z \\ -x &s &-z &y \\ -y &z &s &-x \\ -z &-y &x &s \end{bmatrix} \begin{bmatrix} s &-x &-y &-z \\ x &s &-z &y \\ y &z &s &-x \\ z &-y &x &s \end{bmatrix} \begin{bmatrix}0\\ x_{v}\\ y_{v}\\ z_{v}\end{bmatrix}\\ &= \begin{bmatrix} 1 &0 &0 &0 \\ 0 &1-2(y^{2}+z^{2}) &2(xy-sz) &2(xz+sy) \\ 0 &2(xy+sz) &1-2(x^{2}+z^{2}) &2(yz-sx) \\ 0 &2(xz-sy) &2(yz+sx) &1-2(x^{2}+y^{2}) \end{bmatrix} \begin{bmatrix}0\\ x_{v}\\ y_{v}\\ z_{v}\end{bmatrix} \end{align*} \]
忽略第一行和第一列就得到了旋转矩阵:
\[ R=\begin{bmatrix} 1-2(y^{2}+z^{2}) &2(xy-sz) &2(xz+sy) \\ 2(xy+sz) &1-2(x^{2}+z^{2}) &2(yz-sx) \\ 2(xz-sy) &2(yz+sx) &1-2(x^{2}+y^{2}) \end{bmatrix} \]
本系列参考自 Quaternions for Computer Graphics, 四元数与三维旋转 和 视觉SLAM十四讲(第二版)
首先来研究一下复数是怎么旋转的.
首先把复数乘法写成矩阵形式:
\[ z_{1}z_{2}=\begin{bmatrix} a &-b\\ b & a \end{bmatrix}\begin{bmatrix} c\\ d \end{bmatrix} \]
如果 \(z_{1}\) 的模长为 \(k\), 我们可以把上式改写:
\[ z_{1}z_{2}=k\begin{bmatrix} \cos{\theta} &-\sin{\theta}\\ \sin{\theta} & \cos{\theta} \end{bmatrix}\begin{bmatrix} c\\ d \end{bmatrix} \]
熟悉的东西是不是出现了! 没错, 旋转矩阵! 实际上, 复数乘法不但实现了旋转操作(逆时针旋转 \(\arctan{\frac{a}{b}}\)), 还实现了缩放操作(即前面的系数 \(k\)).
本系列参考自 Quaternions for Computer Graphics 和 视觉SLAM十四讲(第二版)
复数是否存在三维等价物? 这个问题吸引力很多数学家来研究.
我们知道, 二维复数可以用 \(a+bi\) 表示, 于是 Hamilton 猜想三维复数可以用 \(a+bi+cj\) 的形式表示, 但无法解决三维复数乘法的封闭性. 十多年后, 他在散步时找到了解决方案: 三维不行就用四维.
四元数相当于加强版的复数, 它有一个 实部 和三个 虚部. 下式中的 \(\mathrm{i,j,k}\) 是四元数 \(\boldsymbol{q}\) 的三个虚部.
\[ \boldsymbol{q}=q_{0}+q_{1}\mathrm{i}+q_{2}\mathrm{j}+q_{3}\mathrm{k} \]
四元数的三个虚部满足如下关系:
\[ \begin{cases} \mathrm{i}^{2}=\mathrm{j}^{2}=\mathrm{k}^{2}=-1 \\ \mathrm{ij}=\mathrm{k}, \quad \mathrm{ji}=-\mathrm{k} \\ \mathrm{jk}=\mathrm{i}, \quad \mathrm{kj}=-\mathrm{i} \\ \mathrm{ki}=\mathrm{j}, \quad \mathrm{ik}=-\mathrm{j} \end{cases} \]
参考复平面, 把 \(\mathrm{i,j,k}\) 看作坐标轴, 可以用标量和向量表示四元数:
\[ \boldsymbol{q}=\begin{bmatrix}s, \boldsymbol{v}\end{bmatrix}^{T}, \qquad s=q_{0}\in\mathbb{R}, \qquad \boldsymbol{v}=\begin{bmatrix}q_{1}, q_{2}, q_{3}\end{bmatrix}^{T}\in\mathbb{R}^{3} \]
这部分内容在图形学和线性代数中已经接触过了, 这里就不赘述了.
这里关注一个小的思考题: 欧氏变换中两个平移向量为什么坐标上不是相反数?
简而言之就是因为旋转操作的影响, 两个方向相反的向量体现在坐标上并不是相反数关系, 简单推导如下:
首先很容易得到一对坐标变换公式(符号定义与书中一致): \[ \begin{cases} \boldsymbol{a_{1}} = \boldsymbol{R_{12}}\boldsymbol{a_{2}} + \boldsymbol{t_{12}} \\ \boldsymbol{a_{2}} = \boldsymbol{R_{21}}\boldsymbol{a_{1}} + \boldsymbol{t_{21}} \end{cases} \]
于是就有:
\[ \begin{gather*} \boldsymbol{a_{1}} = \boldsymbol{R_{12}}\boldsymbol{a_{2}} + \boldsymbol{t_{12}} \\ \Downarrow\\ \boldsymbol{R_{21}}\boldsymbol{a_{1}} = \boldsymbol{R_{21}}\boldsymbol{R_{12}}\boldsymbol{a_{2}} + \boldsymbol{R_{21}}\boldsymbol{t_{12}} \\ = \boldsymbol{I}\boldsymbol{a_{2}} + \boldsymbol{R_{21}}\boldsymbol{t_{12}} \\ \Downarrow\\ \boldsymbol{a_{2}} = \boldsymbol{R_{21}}\boldsymbol{a_{1}} - \boldsymbol{R_{21}}\boldsymbol{t_{12}} \end{gather*} \]
从而: \(\boldsymbol{t_{21}} = -\boldsymbol{R_{21}}\boldsymbol{t_{12}}\), 这个结论在公式 (3.14) 中也有体现