No title
最大熵逆强化学习是Ziebart B D[1]在2008年提出的逆强化学习方法。当时我在看这篇文献时,不太明白如何得到轨迹概率的最大熵形式,在查阅了一些资料后,大部分博文和视频没有太具体的描述公式推导。最后我在李航老师的《统计学习方法》(蓝宝书)[2]中找到了类似的详细的推导。参考书中的最大熵模型推导,本文整理了线性奖励函数(奖励函数为特征函数的线性组合)假设下轨迹概率最大熵形式的推导,而对非线性奖励函数暂时没推出来,还请大佬指教。第一次写文章,格式没整明白(公式如何居中?如何自动编号?),也请指教。
最大熵模型的学习等价于以下约束最优化问题:
$$\max_{P} \sum_{\tau} - P(\tau) \log P(\tau), \ \begin{array}{l} \text { s.t. }\left{\begin{array}{l} \sum_{\tau} P(\tau) \boldsymbol{f}{\tau}=\tilde{\boldsymbol{f}} \ \sum{\tau} P(\tau)=1 \end{array}\right. \end{ ...
Maximum Entropy Inverse Reinforcement Learning 论文阅读
背景知识熵信息熵的定义是其含义是含有信息的多少
符号定义轨迹这里定义轨迹是一组决策中所经过的状态、选择的动作的集合
专家示例定义专家的示例(expert demonstrarion)为
表示遵从专家策略选择的一组轨迹
对于价值函数的表示这篇论文认为,价值函数可以相对每个状态的特征进行线性表示,即对于任意一个状态 都可以找到一个 维的向量 来表征其特征,而对于所有状态,可以用一个共享的k维参数向量 表示,即:
重建的价值函数定义重建的价值函数为:表示在某条轨迹下面,所获取的所有价值函数的总和
在前一个假设下,可以写作:
最大熵方法Partition Function(分区函数)定义即对所有轨迹下的所获得的价值函数之和的指数进行求和(连续的情况下就是积分)
MaxEnt Formulation在定义的情况下,最大化
来自知乎的解释参考文献:最大熵逆强化学习(Maximum Entropy Inverse Reinforcement Learning)公式推导与疑惑 - 知乎 (zhihu.com)
最大熵学习的追求是要求以 为Reward函数参数时,轨迹概率分布的信息熵最大。那么 ...
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的运行效率,但是仍然是不够的。比如某个线程有明确的唤醒条件,那么可不可以直接让他睡到这个条件达成再唤醒呢?
答案是可以的,我们可以引入条件变量这个并发源语
条件变量 ...