How to Install cmake-3.30
到官网查看对应的包并下载解压官网网址是https://cmake.org/files/ 在这个网址下面找到你想要安装的cmake版本,本文以 v3.30/cmake-3.30.0.tar.gz 为例
注意,这里要找的是形如cmake-X.XX.X.tar.gz 的包,而不是各种带了linux的版本
找一个你喜欢的地方,使用命令
1wget https://cmake.org/files/v3.30/cmake-3.30.0.tar.gz
下载压缩包,并使用命令
1sudo tar -zxvf cmake-3.30.0.tar.gz
进行解压
开始安装使用 ./configure 配置进入对应目录
1cd cmake-3.30.0
然后运行命令
1sudo ./configure
错误排查:如果你发现这里找不到 ./configure 说明你下载的包不对,你可能下载了带linux后缀的各种包
开始配置,如果遇到报错 Could NOT find OpenSSL 使用命令
1sudo apt install libssl-dev
安装libssl 并重新运行
1sudo ./c ...
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 分配给这个申请,并且在自己的bitmap里面进行标记。如果当前页仍有空闲,那么就会查找bitmap,找到第一 ...
如何优雅地使用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{} 命令的位置一样。你可以在文档的任何地方使用 \input{} ...
关于AI的思考
我认为人工智能技术的普及带来的最主要的影响就是生产力的更新换代。首先先回顾一下历史上的历代的工业革命。第一次工业革命由纺纱机的发明开启。机械首次进入人们的视野中。机械带来了纺织业生产力的极大提升,因此让人类社会步入了新的阶段。而第二次的科技革命和电气革命以及第三次的信息革命,同样也是由新的科技带来生产力质的飞跃,从而促成人类社会的进步。而现在,AI显然就是下一个带来生产力革命的技术。
这里我主要谈谈在经济领域AI带来的影响。
在经济领域,AI正逐渐成为增长的重要驱动力。通过自动化和优化工作流程,AI帮助企业提高效率、降低成本,并创造新的商业模式。例如,AI算法能够分析消费者行为,预测市场趋势,从而帮助企业制定更有效的市场策略。最典型的例子,就是现在抖音的推荐算法。抖音的推荐算法基于强化学习框架,能够根据用户的浏览记录,精确推送相关内容,并且能够引导用户关注它想要推荐的带货产品。现在抖音的推荐算法已经列入我国不可出口清单,可见其含金量。这种推荐算法极大地提高了抖音带货的浏览量和热度,助力现在的网红经济发展。
此外,机器学习技术也在金融服务领域大放异彩,它能进行复杂的数据分析,提供精准的信 ...
Concurrent Programming —— Thoughts about locks
关于并发中锁、条件变量和信号量的一些随想锁——原子性的开始众所周知,在并发中,锁是最简单的并发源语,也是最简单的消除数据竞争维护原子性的方法,你甚至只需要使用一对语句:
123pthread_mutex_lock(&lock);//CSpthread_mutex_unlock(&lock);
就可以维护中间的代码的原子性了。
但是如果是朴素的自旋锁的实现会带来一些问题:
如果多个进程同时尝试抢占一把锁,那么会让多个CPU进入自旋状态,浪费CPU资源
某些线程被阻塞,继续运行的条件可能需要其它很多线程共同达成,只使用自旋锁这个CPU在很长时间内都不能得到利用那么如何解决第一个问题呢?
最朴素的思路就是,先尝试获取这个锁,如果获取成功了,就直接进入临界区,如果不成功,就sleep 一段时间,这段时间甚至可以是在不超过上限的情况下指数递增的,如果超过上限就重置为1。这个自旋锁的改进版本在某种意义上可以提高CPU的运行效率,但是仍然是不够的。比如某个线程有明确的唤醒条件,那么可不可以直接让他睡到这个条件达成再唤醒呢?
答案是可以的,我们可以引入条件变量这个并发源语
条件变量 ...
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 R_{t +1 ...