RLHF PPO的时候为了节约成本,训练时一个batch的数据会多次利用,即多次更新actor model和critic model。 和Reference KL distance用于限制PPO模型和原始SFT模型之间的距离(防止PPO训歪,这一项是加在Reward model产生的R中,如deepspeed chat)一样,多次更新actor model也需要有原始actor model作为约束,因此actor loss计算中会有一项$logits/old\_logits$(和原始KL相比,去除了log,近端策略优化裁剪) actor loss代码如下(from deepspeed chat) def actor_loss_fn(self, logprobs, old_logprobs, advantages, mask): ## policy gradient loss log_ratio = (logprobs - old_logprobs) * mask ratio = torch.exp(log_ratio)
今日力扣是关于单调栈的,刚开始我使用stack实现,最后题目要求返回vector,因为c++把stack视为容器而不是迭代器,所以使用pointer来计算stack的起始终止位置,如以下代码。 class Solution { public: vector<int> mostCompetitive(vector<int>& nums, int k) { stack<int> stk; int n = nums.size(); for(int i=0;i<n;i++){ while(!stk.empty() && nums[i] < stk.top() && stk.size() + n - i - 1>= k) stk.pop(); stk.push(nums[i]); } int *begin = &stk.top()
RoPEv1: chatglm/baichuan中使用 RoPEv2: Llama中使用 两者区别 v1代码较为繁琐,但是和原始算法对应 v2使用torch.complex实现,更加明了,不过没有严格遵循原算法,qk转到复数域时,并没有使用相邻的神经元作为复数的实部和虚部,而是直接在特征维度上切分,一半实部,一半虚部 Su的解释:神经元是无序的(dot attention做内积,不依赖于维度顺序) import torch import torch.nn as nn import torch.nn.functional as F import math ### RoPEv1 def sinusoidal_position_embedding(batch_size, nums_head, max_len, output_dim, device = 'cpu'): # (max_len, 1) position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(-1) # (output_dim//
Pytorch中的kaiming_uniform中标准差stdv乘了一个因子$\sqrt{3}$ def kaiming_uniform_( tensor: Tensor, a: float = 0, mode: str = 'fan_in', nonlinearity: str = 'leaky_relu' ): #...... std = gain / math.sqrt(fan) bound = math.sqrt(3.0) * std # Calculate uniform bounds from standard deviation with torch.no_grad(): return tensor.uniform_(-bound, bound) 为什么会出现这个因子,原因其实和物理实验里B类误差需要除去$\sqrt{3}$一样。 均匀分布的方差是$Var = \frac {(b-a)^2}{12}$,而我们真正想要的bound是$(b-a)/2$,所以有$Var = \frac{1}{3} {bound}^2$,
BPE -> Transformer -> Benchmark 非常好教程 https://github.com/karpathy/minGPT (semi-archived) https://github.com/karpathy/nanoGPT
JJJYmmm
Updating as per fate.