check3
Structure and DesignTimer首先在 TCPSender 里面实现一个 Timer 来实现计时的功能,代码如下: 12345678910111213141516171819202122232425262728293031323334353637383940class Timer{private: uint64_t initial_RTO; uint64_t RTO; uint64_t time_passed_; bool is_running_;public: explicit Timer( uint64_t initial_RTO_ ) : initial_RTO( initial_RTO_ ), RTO( initial_RTO_ ), time_passed_( 0 ), is_running_( false ) {}; bool is_running() const { return is_running_; }; bool is_expired() const { return is_running_ &&...
TRPO
从动作优势函数说起首先回顾一下动作优势函数,即:这里的优势表示的是在状态 下面选择动作 比选择平均动作的优势 援引一张从知乎文章知乎-TRPO中的图: TRPO起始式的推导TRPO的起点是表达式这里就给出了在策略 的基础上通过采样 来计算 累计回报的优势的计算方法下面来证明这个式子 引入折扣访问频率定义那么 式可以写成:最后一步是交换求和顺序,先对 求和,剩下的就是定义了 Skill oneTRPO的第一个技巧是,每次更新的策略是临近的,换言之 和 的距离是不远的,因此可以直接近似替代,换个写法,那么 式直接可以改写为:
RLHF
综述这个方法的基本想法就是,我们在强化学习的过程中,可以引入人来打分,避免训练出来的情况不符合预期,更符合实际情况,其大致的流程是: 符号定义这里相比于传统的强化学习是状态-动作,这里假定的环境是在时间 Agent会从环境中观察到 ,并且会选择一个动作 发送给环境 定义一条轨迹的某个片段是由一系列的观察和动作构成的,即 不同于传统强化学习里面环境直接反馈一个Reward回来,这里假设的是人类能够区分不同轨迹之间的优劣,换言之人类能够给出一个偏序,即判定: 评价一个RLHF的算法定量如果说人类给出评价的标准是基于一个可以定量的价值函数 的,即偏序关系 是由产生的那么最后我们只需要看这个Agent是否按照 RL 的标准最大化了 就可以了 定性如果不是能够清晰量化的评判标准,那么就只能靠人类根据感受进行评判了 关于人类选择的记录这里将人类的一个选择记录为 其中的 ,取值分为如下三种情况: 人类认为某个选择更优,则将对应的 置位为 人类认为两个选择等同,则 将独立采样 人类认为不可分辨则该样本不会出现在数据库中最终把所有的数据放在一个数据库 ...
KL Divergence and JS Divergence
KL散度定义假设有两个概率分布 和 ,他们对应的概率密度分别为 和 如果想要用 去近似 则这其中的 KL 散度为: hint 注意KL散度不具有对称性 在离散的情况下面,可以写成: 理解将KL散度展开成两项,有: Hint:为什么最后不是反过来的因为 H(P,Q)自带一个负号 第一项是交叉熵,代表用 去编码 需要的编码长度,所以KL散度可以理解为用Q拟合P比直接使用P需要多用多少信息 JS散度由于KL散度具有不对称性,这里提出JS散度 定义首先设 则如果全部展开,这个式子是:
check2
My name:李冠霖 My NJU ID:221502012 I collaborated with: NAN I would like to thank/reward these classmates for their help: NAN This lab took me about 8 hours to do. I did attend the lab session. Describe Wrap32 and TCPReceiver structure and design. Wrap32: 这个还是蛮简单的,就是要看懂他这里给的是什么意思,首先第一个 wrap 很简单直接加就行了,记得做类型转换就行。第二个 unwrap 最开始我想的是先用 0xffffffff00000000 去 mask 一下这个 checkpoint 把高32位取出来,然后再去凑最近的是哪一个,但是后面发现corner case太多了,不如直接去算最近的是哪一个。首先把减完的 offset 去减去 (1ULL << 32) / 2...
GAIL
最大熵逆强化学习的另一种写法这里给出IRL的另一种表述形式,即:这其中的 表示策略 的熵 Hint:中间的 部分可以理解为首先是在确定 的情况下面选择一个策略让 的熵是最大的,然后在这个情况下算出 再真实的专家策略获得的奖励做比较 在学出来这个 之后,再学习出最优策略 的过程是 关于这个式子怎么推导最佳的策略,请看文章 Maximum Entropy Inverse Reinforcement Learning GAIL如果这里的数据量比较小,就会导致过拟合,所以考虑加上一个对于奖励函数 的正则项,即 ,把这个式子变成: 那么这样重建出来的就是及满足了熵正则又不会过拟合 怎么解上面的式子考虑定义一个occupancy measure 为:可以认为这个是策略 下面出现行为-状态对 的概率密度 如果有了这个重建的策略定义为: 经过一通算可以发现,这里最后的优化目标就是找到而带入 occupancy measure...
check1
Structure and Design这里主要就是需要维护一个区间,来表示每一次插入的时候插入的data是什么以及有效的 first_index 和 last_index 所以首先有一个类 123456789101112131415161718192021class section{private: uint64_t first_index; uint64_t last_index;public: string data;public: section( uint64_t first_index_, uint64_t last_index_, string& data_ ) : first_index( first_index_ ), last_index( last_index_ ), data( std::move( data_ ) ) {}; uint64_t get_first_index() const { return first_index; }; uint64_t get_last_index() const { return...
Maximum Entropy Inverse Reinforcement Learning 论文阅读
背景知识熵信息熵的定义是其含义是含有信息的多少 符号定义轨迹这里定义轨迹是一组决策中所经过的状态、选择的动作的集合 专家示例定义专家的示例(expert demonstrarion)为 表示遵从专家策略选择的一组轨迹 对于价值函数的表示这篇论文认为,价值函数可以相对每个状态的特征进行线性表示,即对于任意一个状态 都可以找到一个 维的向量 来表征其特征,而对于所有状态,可以用一个共享的k维参数向量 表示,即: 重建的价值函数定义重建的价值函数为:表示在某条轨迹下面,所获取的所有价值函数的总和 在前一个假设下,可以写作: 最大熵方法Partition Function(分区函数)定义即对所有轨迹下的所获得的价值函数之和的指数进行求和(连续的情况下就是积分) MaxEnt Formulation在定义的情况下,最大化 来自知乎的解释参考文献:最大熵逆强化学习(Maximum Entropy Inverse Reinforcement Learning)公式推导与疑惑 - 知乎 (zhihu.com) 最大熵学习的追求是要求以 ...
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...
check0
Program Structure and Design3.4 geturl这个实验非常简单,只需要读懂他这里的API就可以做了,其中从socket里面读数据的方式和pipe是完全一致的,都用read来读,write来写。 首先使用 1Address address { host, "http" }; 来创建一个地址 然后用 1234TCPSocket socket;socket.connect( address );socket.write( "GET " + path + " HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n" );string response; 来创建socket,接下来不断读就行了: 1234567891011121314151617string response;bool is_line_one = true;while ( !socket.eof() && !socket.closed() ) { string tmp; socket.read( tmp );...