Transformer
概述Transformer是一种基于attention的 seq2seq 模型,即根据输入的开头,生成预测的后续输出。 参考文章/视频链接直观解释注意力机制,Transformer的核心 | 深度学习第6章[1706.03762] Attention Is All You Need (arxiv.org) 模型总体结构Transformer的模型总体采用的是一个 encoder-decoder 的结构,其结构图如下:
正则表达式(regular expression)
正则表达式概述正则表达式是用于匹配字符串的一种表达式,他可以精确描述某种字符串的特征用一匹配和提取 字符单个字符可以用单个的字符表示正则表达式必须匹配一个字符,例如,使用 abc 作为正则表达式,那么会提取所有的含有 abc 的部分,包括某个单次中含有 abc 这个片段,例如 abcdef 中的 abc 也会被匹配。 字符集合字符的集合用 [] 中括号包裹,表示这个位置上面可能有[] 中的某个字符,例如 ab[cde] 就可以匹配 abc\abd\abe 但不会匹配 abf 在这个里面,可以使用例如 [0-9] 表示匹配 0 到 9 中的任意一个字符。 如果要表示取反,可以在括号里面加上一个 ^ 例如 [^A-Z] 表示这里匹配一个除了大写字母之外的字符 其他元字符通配符这里的单个的通配符是 . 在没有其他符号包裹的情况下,. 可以匹配任意一个字符。 数字集合数字可以简写为 \d 是digit的缩写 边界字符 \b 表示单词的边界,例如 \babc\b 就只会匹配 abc 这个独立的单词,而 abcd 或 aabc 则不会被匹配 \B 表示非单词的边界,与上面相反 \w...
Binary Index Tree(树状数组)
概述树状数组是支持 复杂度的维护和 的查询的数据结构,其本质是二叉树去掉了包含重复信息的节点而成的,即只保留了以下标为根的子树的所有信息,即 tree[n]保留以节点n为根的子树的和,形状如图: 前置知识——lowbit的计算对于一个数的二进制,例如 那么想要获得其最后的0的个数,可以利用补码的机制进行计算,即 1234int lowbit(int x){ return x & (-x);} 这是由于,在计算机中,对于一个整形取相反数,就是各位取反然后末尾加1,那么末尾所有的0在取反的时候都会变成1,再+1之后,只有最后一个不是0的位会变成1,其余位都是0,而从最低有效位开始的第一个1之前的所有位都只会进行取反,而第二步+1的进位都影响不到,所以在按位与运算的时候都会变成0,只有第一个1的位置上面保留了1 关于树状数组结构的观察观察上面那棵树的结构可以发现,每个节点下标的末尾有几个0就代表这个节点在第几层,例如1和3的末尾没有0所以在第0层,而8的二进制是1000末尾有三个0所以在第三层,那么可以知道,对于节点下标为的节点,包含了到这个区间的数的和 。而对于节点...
PMM实验报告
PMM部分总体思路PMM部分我选择的是一个 allocator 和一个类 slab 组成的。在分配一个大小为 的内存的时候,首先去查找管理大小 的 slab 中有无空闲的对象,如果有,则直接利用这个对象进行分配,如果没有,这个 slab 就会向 allocator 申请一个或多个页,然后利用这些页来生成对应的对象,分配给 kalloc 接口。 在归还的时候,同样是首先查询整个分配表,查询到分配记录,然后根据分配记录,把这个指针交给对应大小的 slab , slab 会把这个指针还给分配它的页。如果这一页的所有分配都被归还了,那么就把这一整页还给 allocator ,并交由 allocator 归还到堆区。 分配逻辑小内存分配的逻辑小内存分配的时候,首先会向对应的 slab 申请分配,下面以 2B 大小的空间申请为例进行介绍。首先,2B-slab 会检查自己名下有没有空闲的页,如果所有的页都被分配出去了,那么就会向 allocator 申请一个新的页,并且把第一个 Byte...
如何优雅地使用LaTeX(LaTeX分段编译技巧)
前言众所周知,在使用Overleaf编写LaTeX的时候,免费版的编译速度和时间限制非常让人不爽,如果想用Beamer做PPT做不了两页就会出现超时,那么有没有办法能够优雅地编写超长文本呢? 答案是有的,本文提供一种通过分段的方式实现分块编译,并且每次可以只编译你正在写的部分,节约免费编译时间提高编译速度的方法。 LaTeX分段编译API简介最简单的LaTeX分段编译API就是 \include{xxx.tex} 和 \input{xxx.tex} 这两个命令,他们的区别引用一段GPT4 的回答: 在 LaTeX 中,\include{}、\input{} 和 \includeonly{} 是用来管理和组织大型文档的三个非常有用的命令。它们各自有不同的特点和用途: \input{filename} 用途: \input{} 命令用于将指定文件的内容在当前位置直接插入。它适合用于引入格式设置、自定义命令、较短的文本片段等。 特点: \input{} 不会启动新的一页,它就像是把被引入文件的内容直接复制到 \input{} 命令的位置一样。你可以在文档的任何地方使用...
关于AI的思考
...
Concurrent Programming —— Thoughts about locks
关于并发中锁、条件变量和信号量的一些随想锁——原子性的开始众所周知,在并发中,锁是最简单的并发源语,也是最简单的消除数据竞争维护原子性的方法,你甚至只需要使用一对语句: 123pthread_mutex_lock(&lock);//CSpthread_mutex_unlock(&lock); 就可以维护中间的代码的原子性了。 但是如果是朴素的自旋锁的实现会带来一些问题: 如果多个进程同时尝试抢占一把锁,那么会让多个CPU进入自旋状态,浪费CPU资源 某些线程被阻塞,继续运行的条件可能需要其它很多线程共同达成,只使用自旋锁这个CPU在很长时间内都不能得到利用那么如何解决第一个问题呢? 最朴素的思路就是,先尝试获取这个锁,如果获取成功了,就直接进入临界区,如果不成功,就sleep...
DDPG
Basic Terminology评估策略的方法在使用折扣因子的基础上,记为策略 的性能指标 关于 的不严谨的估计首先,对于某一个状态 被转移到这个状态的概率是那么对于 就可以做出一个不严谨的估量,即: 策略梯度定理策略梯度定理阐释了如何计算策略的梯度,即:注意这里求梯度的时候是没有考虑 这个部分贡献的梯度的,具体的原因在我的另一篇文章Policy Gradient Methods中有提到,因为这里只关心梯度的方向,并不关心梯度的大小。 Actor-Critic 模式在上面的评估函数中,可以发现,想要统计出 并不是一件很简单的事情,如果使用蒙特卡罗方法采样来获取的话,会需要大量的时间来采集数据,这是不希望看到的。所以我们选择再造一个网络,来拟合 函数,以对这个策略作出评估。Actor 和Critic的分工如下: Actor:负责根据策略梯度定理调整参数 的值来更新策略 Critic:学习一个Q的函数来拟合当前的价值函数,即拟合 此时更新的公式变成了: Off-policy Actor-critic模式如果此时的行动策略 不等于当前的评估策略,即 ...
DQN改进
Article Reading本次阅读三篇论文,分别是 1509.06461 1511.05952 1511.06581,分别是优先经验回放、Double DQN 和 Dual DQN Double DQNDouble DQN主要解决的问题是在贪心策略做最大化的时候出现的最大化偏差问题,什么是最大化偏差呢? 最大化偏差(过估计)正常情况下理想的最优策略下的状态价值函数和动作价值函数应该满足:即使这里的估计是无偏的,即满足也不代表它的二阶矩就是0(证明是把上面那个式子里面的正的部分和负的部分分开再求平方),假设在这种情况下,会有:(平均值原理)这个下界是紧下界。 最大化偏差问题会导致很多模型的训练出现训练不稳定或者就训练不起来的情况。 Double DQN如何解决最大化偏差问题Double DQN选择使用两个不同的网络来进行学习。首先是有一个 Target 网络用于对当前的动作进行评估,再用一个 Q-Network 来学习当前的价值。每过一段时间就用 Q网络来更新target网络。 这个时候的更新表达式如下: $$T_t^{\mathrm{DoubleQ}} \equiv...
Tmux 使用简介
tmux简介tmux是链接服务器跑服务的神器,可以在取消链接之后继续运行想要运行的程序 使用流程安装tmux使用 1sudo apt install tmux 即可 新建窗口1tmux new -s NAME 即可创建一个名为name的session,然后在里面运行你的指令即可 然后就可以直接关掉这个链接了 退出窗口如果想要退出当前的tmux session 可以先按下 ctrl + B 然后松开(这个时候没有变化是正常的)然后按下 D 就可以在不终止当前任务的情况下退出了。如果想直接终止这个任务,可以按下 ctrl + B + D 即不松手就行了。 关闭session使用命令 1tmux ls 查看当前在运行的session,使用 1tmux kill-sesion -t NAME 关掉session就可以了 恢复session使用命令 1tmux a -t NAME 可以恢复一个session