RLTransformer
RL Transformer
回顾使用Sequential Net处理强化学习的一些工作
回顾:Transformer
只包括Attention和全连接
回顾Attention机制
输入状态(token)(decoder状态)
编码为query向量
隐藏状态$h_1,\cdots,h_m$映射到key
通过隐藏状态(Encoder)计算Value
计算Attention系数
计算Attention下Value值
Attention for Seq2Seq
Encoder inputs
Decoder input
Encoder编码输入为key和value
Decoder输入同样进行线性变换,得到Query
计算权重,取$q_1$和所有key组成的矩阵$K=(k_i)_{i=1}^m$,得到m维向量
计算context vector $c_1$
写成
对于Seq2Seq任务,得到$c_j$后经过Softmax Classifier得到概率分布,采样得到下一个特征编码作为$x_{t+1}^\prime$,这是Transformer在推理中的行为
From Attention to Self-Attention
只包含一个输入序列$X=x_1,x_2,\cdots,x_n$,两个输入Sequence都是X
From Attention to Multi-head Attention
多head attention有3L个参数矩阵,输入都是
得到l个context sequence
将它们concat起来,得到
输入:$X\in \R^{m\times n}$,n是编码向量长度,输出$Y\in \R^{m\times n}$,使用skip connection将其连接
From Single-head Self-Attention to Encoder
输入
经过Attention layer输出
经过全连接(参数共享)变化为
Decoder网络
假设Encoder输出Y满足
m是Encoder Sequence长度,将Decoder序列通过Multi-head attention得到
再将两个Sequence
输入到一个新的Multi-head attention中,得到新的输出
再通过全连接层,得到
这样得到Decoder一个block

$512\times m$来自Encoder输入
Pytorch中Transformer的实现
Embedding
nn.Embedding构造函数参数包括
- 词汇表大小V
- 编码向量长度n
这样对于输入的词$0,1,\cdots,V$,embedding层将其转化为对应的向量,embedding层实际上存储了int到长度为n的向量的映射
Position Embedding
对于输入序列$x_i$,增加位置编码
- $i=2k,PE=\sin(\frac{pos}{10000^{2i/d_{model}}})$
- $i=2k+1,PE=\sin (\frac{pos}{10000^{2i/d_{modelvscod}}})$
pos=i

Transformer from pytorch——target Masking
,需要增加Mask去遮盖尚未出现的部分,encoder向量$X\in \R^{m\times n}$,n为输入词向量维度,m为输入sequence长度,经过encoder后编码为$\hat X\in \R^{m\times n}$大小的矩阵,对于输入decoder的target向量大小为$Y\in \R^{m_1\times n}$,$,**不能将其完全暴露给输入encoding给输入encoding**
Padding Masking
保证每个输入sequence长度相同,因此需要特殊的token
表示一个sentence开始 表示一个sentence结束 用于补齐matrix的每一行
为了告诉那些token仅仅用于补齐,我们需要为输入$X\in \R^{k\times m\times n}$,k为输入句子数量,m为padding后的总长度,对应的padding matrix是一个binary矩阵,大小为$M\in \R^{k\times m}$
Offline Reinforcement Learning as One Big Sequence Modeling Problem
Summary
将RL视为序列决策问题,Trajectory Transformer在动作-状态序列上序列,相比基于价值和策略的模型在长序列决策上更加有效
轨迹
表示为N-维状态,M维动作和标量奖励的序列
构建字典
连续状态动作需要进行离散化,假设
离散化为
原文(Reinforcement Learning and Control as Sequence Modeling)
对于N维状态空间和M维动作空间,建模为长度为T*(N+M+1)的序列,T为总的Transition数量
连续空间离散化(用于输出似然概率)
- uniform,适用于任何维度的状态-动作都能被约束到有限范围内
- 分位数,事先需要统计先验概率分布
损失函数
最大化对数似然概率

算法:Beam Search
输入:序列x,词汇表$\mathcal V$,序列长$T$,beam width $B$
Planning with Beam Search
从三个角度看Sequence生成如何实现智能体控制
- 模仿学习
- 基于目标导向的强化学习
What is Beam search
对于Seq2Seq模型,Beam Search应用于推理时(训练时知道Ground Truth),假设输入的Seq为
对于第一个输入token $s_0$,Transformer预测下一个token按照概率从大到小是
选择概率最大的两个token,比如$a_0,a_1$,生成第二个token时需要将$a_0,a_1$和词汇表中所有词结合,生成如下序列
在这些序列中选择似然最大的两个序列,进入第三轮,直到遇到结束符或者达到最大长度为止
为什么不选择greedy search(我认为是增加强化学习中的搜索)
定义序列单位似然
Input of torch.transformer
输入串
每个输入的token需要进行embedding,即构建映射
embedding结果$s_i$包含token的位置信息,训练时我们有GroundTruth作为生成的翻译序列
给它增加一个起始符
总的而言感到这篇文章不够简洁
Decision Transformer: Reinforcement Learning via Sequence Modeling
例子:选择两点之间最短路径
- 设计reward:在目标节点上reward=0,否则为-1
- 在随机游走的数据上训练
Methods——轨迹表示
轨迹表示为累积奖励-状态-动作对,注意当前状态根据未来累计奖励计算,因此对于一个长度为T的奖励序列
定义t时刻之后的未来累计奖励$\hat {R_t}$为
轨迹记作
使用累计奖励:避免局部奖励陷入局部最优
Methods——Outline of the algorithm
将3K个token(包含K个累计奖励、K个状态和K个动作)送入transformer,为序列中每种模态的数据使用线性层变换到embedding dimension
训练
state,action and reward_to_go are mapped into same size m and add position embedding into them.
从中取出对应a动作的部分从中取出对应a动作的部分从中取出对应a动作的部分取出对应a动作的部分**
推理
推理和训练的区别在于:
- 推理不知道动作
- 推理时不知道
reward-to-go
因此需要设置一个expert-reward,根据每步奖励减去当前这步奖励r
Transformer-GPT
GPT保留Transformer中Decoder部分,每个模块由
- Mask Multi-head self-attention
- feed forward
构成,Mask Multi-head self-attention输入一个序列,最终得到和它长度相同的序列。
GPT动机
基于无标注的数据进行预训练,在下游任务上进行少量finetune
PyTorch.nn.MultiheadAttention使用
初始化
1 | torch.nn.MultiheadAttention(embed_dim, num_heads, dropout=0.0, bias=True, add_bias_kv=False, add_zero_attn=False, kdim=None, vdim=None, batch_first=False, device=None, dtype=None) |
- embed_dim,输入query,key,value维度
- num_head 多头数量
输入
输入Q,K,V张量,它们的维度可能不同,需要在kdim和vdim中设置,先通过线性变换转化为维度相同的矩阵,并编码为query,key,value向量
对于每个query,计算注意力系数
在此基础上$\lambda$和V加权计算$q_i$的Attention嵌入
n个multi-head针对一个query生成多个Attention vector $a_i^1,a_i^2,\cdots,a_i^n$,将其拼接
通过全连接层得到最终的编码向量
Self Mask机制
不希望在提前暴露未来时间的词向量
Pytorch.nn.Transformer中的Mask
输入Mask的参数包括
- src 输入encoder的序列,假设为$(N,L,E)$,代表sequence数量,sequence padding长度,每个token维度
- tgt 输入decoder的序列,假设为
(N,K,E) - src/tgt_mask
- src/tgt_key_padding_mask
只能看到上文信息只能看到上文信息只能看到上文信息只能看到上文信息只能看到上文信息只能看到上文信息只能看到上文信息只能看到上文信息,这里对src和tgt mask进行额外说明,假设src,tgt mask均为下三角为1的矩阵
则对于输入sequence
的embedding(对于src是encoder出的memory,对于tgt就是最后的输出)时,对于第i个token$x_i$,实际上是在一个子序列
中计算Attention机制
_key_padding_mask用于处理多个batch的序列长度不一样的情况,具体来说src_key_padding_mask大小为(N,L),每一行是一个长度为L的binary向量,True表示对应的词向量实际上是补全句子长度所做的padding