When Speed Kills Stability: Demystifying RL Collapse from the Training-Inference Mismatch

1. Measuring the Mismatch: The vllm-kl Metric

\small{\mathbb{E}_{s\sim d_{\textcolor{red}{\pi^\text{vllm}_\theta}}}\left[\text{KL}\left(\textcolor{red}{\pi^\text{vllm}_\theta}\left(\cdot|s\right),\textcolor{blue}{\pi^\text{fsdp}_\theta}\left(\cdot|s\right)\right)\right] = \mathbb{E}_{s\sim d_{\textcolor{red}{\pi^\text{vllm}_\theta}},a\sim {\textcolor{red}{\pi^\text{vllm}_\theta}\left(\cdot|s\right)}} \left[\log\left(\frac{\textcolor{red}{\pi^\text{vllm}_\theta}(a|s)}{\textcolor{blue}{\pi^\text{fsdp}_\theta}(a|s)}\right)\right],}

但是代码用的是 kl3 散度

kl = \frac{\pi_1}{\pi_2} - log(\frac{\pi_1}{\pi_2}) - 1
rollout_log_probs = batch.batch["rollout_log_probs"] # pi_vllm
actor_old_log_probs = batch.batch["old_log_probs"] # pi_fsdp
response_mask = batch.batch["response_mask"]
log_ratio = actor_old_log_probs - rollout_log_probs
vllm_k3_kl_matrix = torch.exp(log_ratio) - log_ratio - 1
vllm_k3_kl = masked_mean(vllm_k3_kl_matrix,response_mask)

2. The Smoking Gun: The Low-Probability Token Pitfall

这个洞察意义其实不大,这个相关性不需要通过数学分析来找到这种洞察,vllm-kl很小,从数学上就能直接推导出 \frac{\pi_{fsdp}}{\pi_{vllm}} 会很发散

不过这里有一个重要的洞察是:当熵很大的时候,fsdp的log_probs要比vllm的log_probs小


An Introduction to Reinforcement Learning for llm

最近在研究大模型的强化学习,整理下相关的算法基础,了解一下当前主流强化学习算法的一些改进思路

1. 目标函数

1.1. 预训练

自回归模型的目标是预测序列中的下一个词元,也是使用交叉熵损失

其中:

  • T 是序列长度。
  • w_t 是时间步 t 的真实词元。
  • w_{<t} 是时间步 t 之前的所有词元。
  • P(w_t | w_{<t}) 是模型预测给定历史词元后,下一个词元为 w_t 的概率。

1.2. 强化学习

最大化目标函数(最大化优势) = 最小化 -目标函数

所以强化学习把 loss 定义为 = - si(θ) * adv

典型目标函数:

(1)PPO

(2)GRPO

其中:

  1. G 表示同一个 prompt 的G条样本答案
  2. y_i表示第几条样本,|y_i|表示向量的长度的,也就是 token 数,但是实际上这里面loss是求平均还是求和,有很多算法:token-mean,seq-mean-token-sum,seq-sum-token-mean

GRPO 计算的是 token 粒度的平均 loss

(3)GSPO

优势计算和 GRPO 一样

GSPO 计算的是 seq 粒度的平均 loss

(4)DAPO

xx

(5)BAPO

xx

和预训练不一样,强化学习是基于 reward 而不是交叉熵,token-level-reward

上面公式,除了clip的目的主要是为了防止模型训崩,loss计算的核心是重要性系数adv优势


How to install cuda and pytorch dev environment on thinkpad w530 & ubuntu 20.04

最近发现在笔记本上用 cpu 来训练模型效率还是太慢了,正好我笔记本上有一块 nvidia gpu,准备折腾一下把这块 gpu 用起来

由于在笔记本环境下安装 gpu 开发环境比较痛苦,虽然最终失败了,但是过程比较有意义,值得备忘一下

我的开发环境主要是 pytorch + cuda

硬件环境就是 thinkpad w530 + 32g + K1000M

由于笔记本的 gpu 通常型号比较老,并不是大部分的 pytorch 都支持

1. 安装 cuda

网上有很多资料,怎么安装 nvidia-cuda-toolkit 的,apt install nvidia-cuda-toolkit 就可以直接装

但是我发现装完了之后没法用,pytorch 没法检测到 cuda 环境。这两个东西不完全是一个东西,有挺多差异的。

python3 -c ‘import torch; print(torch.cuda.is_available())’ 必须返回 true

最后用官方的安装方法成功了

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=20.04&target_type=deb_local

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600

wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb

sudo dpkg -i cuda-repo-ubuntu2004-11-7-local_11.7.0-515.43.04-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2004-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

2. 安装 nvidia-driver

ubuntu 默认源里面会有一些基本的 nvidia-driver

ubuntu-drivers devices 可以看到

# ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00000FFCsv000017AAsd000021F5bc03sc00i00
vendor : NVIDIA Corporation
model : GK107GLM [Quadro K1000M]
manual_install: True
driver : nvidia-driver-390 - distro non-free
driver : nvidia-340 - distro non-free recommended
driver : nvidia-driver-418-server - distro non-free
driver : xserver-xorg-video-nouveau - distro free builtin

这里面会推荐你使用 nvidia-340

但是我的实际测试来看,nvidia-340是没法用的,安装完了之后显示器各种异常,最后安装到 nvidia-driver-390 解决了显示器异常的问题

但是nvidia-driver-390 版本太低,cuda 现在依赖的 nvidia-driver 版本都是470以上了,所以光有 nvidia-driver 是不行的,必须和 cuda 配套。

最终在安装 cuda 的时候会自动安装 nvidia-driver 配套驱动,其实不用自己搞

安装完,需要重启机器,重启后 nvidia-smi 检查能不能看到显卡信息


Stock Selection via Spatiotemporal Hypergraph Attention Network – A Learning to Rank Approach

论文原址:https://www.aaai.org/AAAI21Papers/AAAI-7907.SawhneyR.pdf

这几年研究把深度学习应用到量化交易和传统投资决策的论文并不少,但都有2个问题:

  1. They do not directly optimize the target of investment in terms of profit
  2. and treat each stock as independent from the others, ignoring the rich signals between related stocks’ temporal price movemen

为了解决这些问题,作者提出了一种叫 STHAN-SR 的超图神经网络。并通过对美3大交易所最近6年的数据,证明这个网络在当前所有股票预测算法里面是最优的

Introduction

美股市场,68万亿,19年

forecasting:预测

highly volatile and non-stationary nature – 股票市场具有很强的波动性

synergy 协同

当前主流的股票预测算法,最大的弊端就是不以投资收益为优化目标。因为这些算法,要么是基于回归来预测价格,要么基于分类来做交易决策,这种分类和回归的优化目标是为了提高股票价格走向的准确性或最小化预测股票收益的误差,而不一定是为了直接利润

(有什么不一样吗??一脸懵比)

0

第二个弊端就是不考虑股票之间的相关性,总是把这些股票作为独立的个体来分析,或者使用一个过于简化的股票市场模型,一个由单个股票之间的成对关系组成的图表,但在现实中,这与真正的市场是相反的


ImageNet Classification with Deep Convolutional Neural Networks

论文原址:https://proceedings.neurips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf

无论是AI、深度学习,还是卷积神经网络,都不是这几年才有的概念,但确实是最近10年才流行起来。这里最主要的原因,还是要归功于AlexNet 2012年在大规模视觉识别挑战赛上取得的成功,所以才有了这篇论文

在这篇论文里面,AlexNet 提出了很多创新性的 idea,对卷积神经网络的发展影响深远,其中很多概念仍然是今天 CNN 的核心

论文的特点:

  1. AlexNet 包含许多心的不同寻常的特性,这些特性提高了神经网络的性能并减少了训练时间
  2. 提出 Dropout 解决过拟合的问题

下面我们再详细看下

不同寻常的网络特性

1. 非饱和神经元 ReLU

使用 ReLU 的四层卷积神经网络在 CIFAR-10 数据集上达到 25% 的训练误差比使用 tanh 神经元的等价网络(虚线)快 6 倍。为了使训练尽可能快,每个网络的学习率是单独选择的。没有采用任何类型的正则化。影响的大小随着网络结构的变化而变化,这一点已得到证实,但使用 ReLU 的网络都比等价的饱和神经元快几倍。

0

论文里有一片引用论文:https://www.cs.toronto.edu/~fritz/absps/reluICML.pdf

可以参考下


Visualizing and Understanding Convolutional Networks

论文原址:https://arxiv.org/pdf/1311.2901.pdf

1. 背景

我们都知道 CNN 卷积神经网络 效果好,但是一直以来都是一个黑盒,有2个关键问题:

  1. However there is no clear understanding of why they perform so wel
  2. or how they might be improved

其实包括我自己也是很困惑的,卷积神经网络有非常多。但是你看网上的资源来来回回都是在讲这些神经网络的结构。但是很少人知道为什么要把结构设计成这个样子。比如LeNet-5第一层卷积层为啥需要6个通道?为什么整个网络只需要2个卷积层,能不能更多或者更少?

为了解决这个黑盒问题,论文作者提出了一种可视化的方法,能够观测到卷积层的feature maps到底识别到了图片的什么特征,并以此反馈来改进神经网络的结构设计。最后通过这个方法,作者在ImageNet测试集上取得了非常突出的结果

2. 方法

论文的核心思想:map these activities back to the input pixel space, showing what input pattern originally caused a given activation in the feature maps

以LeNet-5这种经典的2D网络为例,正向的卷积过程一般包括几个步骤:

  1. filter
  2. relu
  3. max pooling
  4. 【optionally】local contrast operation

0


Mlsys & 深度学习相关方向的技术栈梳理

一些系统性的学习资料:

1. 深度网络设计

神经网络

  1. 经典2D/3D网络(LeNet-5,AlexNet,VCG)
  2. 残差网络:ResNet,DesNet,ResNeXt
  3. 时序网络:RNN,LSTM,GRU
  4. 生成对抗网络:DCGAN,LAPGAN,CycleGAN
  5. 其他:AutoML

2. 模型开发库

对神经网络模型的封装,更易用的API,集成度更高

  1. paddleNLP,paddleDetection,paddleOCR
  2. 其他公司好像没

3. 深度学习框架

面向 AI 的深度学习 toolkit 集合,主要研究的我看有两块,一块是深度学习框架本身,一块是深度学习可视化相关的

  1. 计算框架:
    1. tensorflow
    2. pytorch
    3. mxnet
    4. paddlepaddle
  2. 可视化:
    1. tensorboard
    2. VisualDL
    3. visdom

 


使用 LSTM 实现长期预测

pytorch LSTM:https://pytorch.org/docs/stable/generated/torch.nn.LSTM.html

最近看 google 的论文 autopilot,讲的是怎么通过一个app的历史的资源使用数据,来预测这个app到底需要多少资源,才能满足其服务的正常运行

论文讲了2种方法,就是:

  1. 一种是传统的,对历史数据加权
  2. 一种是基于增强学习的,这个有点复杂,没太看懂

不过我有个疑问,像资源使用这种时序的数据,用 lstm 这种循环神经网络不是最简单吗?为什么要用增强学习这么复杂的东西(状态空间复杂,状态的迁移也复杂,并且需要更大的计算量)

所以我打算试试用 lstm 来实现长期的资源预测

我的数据样本:

20220510000000,38.388889
20220510003000,33.722222
20220510010000,31.538889
...
20220510053000,31.183333
20220510060000,32.983333
20220510063000,36.694444

第一列是明文的时间,第二列是app的cpu使用

1. 思路

使用 lstm 有几个关键的地方:

  1. 定义好网络的输入输出,简单来说就是你希望神经网络帮你学习什么样的特征映射。
  2. 怎么实现长期预测

由于典型的 rnn 神经网络,是输入一串历史数据,输出下一个时刻的预测值。这是经典用法,可能也有一些方法,可以直接输出多个历史预测值的,不过我没研究过,这里不讨论

我的方法也比较简单,就是用预测出来的值作为神经网络的数据,继续滚动预测下一个值,通过这种方法,实现“长期”的预测

2. 网络(输入、输出)建模

首先要定义清楚网络的输入,输出是什么

由于经典的 rnn 只有一个输出,就是我们下一步要预测的值,所以这个没什么好讨论的

但是输入是可以多个的,你可以用当前最近的2个数据来预测下一个数据,也可以用当前10个数据预测下一个数据,也可以是N个。但是据我的实测观察来看,使用2个数据预测下一个数据效果好像更好一些

2个数据预测1个

0


VGG-16 神经网络结构详解

视频:https://www.bilibili.com/video/BV1FT4y1E74V?p=120

0

这节课要讲的第三个,也是最后一个范例是VGG,也叫作VGG-16网络。

值得注意的一点是,VGG-16网络没有那么多超参数,这是一种只需要专注于构建卷积层的简单网络。首先用3×3,步幅为1的过滤器构建卷积层,padding参数为same卷积中的参数。然后用一个2×2,步幅为2的过滤器构建最大池化层。因此VGG网络的一大优点是它确实简化了神经网络结构,下面我们具体讲讲这种网络结构。

0

假设要识别这个图像,在最开始的两层用64个3×3的过滤器对输入图像进行卷积,输出结果是224×224×64,因为使用了same卷积,通道数量也一样。VGG-16其实是一个很深的网络,这里我并没有把所有卷积层都画出来。

0

假设这个小图是我们的输入图像,尺寸是224×224×3,进行第一个卷积之后得到224×224×64的特征图,接着还有一层224×224×64,得到这样2个厚度为64的卷积层,意味着我们用64个过滤器进行了两次卷积。正如我在前面提到的,这里采用的都是大小为3×3,步幅为1的过滤器,并且都是采用same卷积,所以我就不再把所有的层都画出来了,只用一串数字代表这些网络。


AlexNet 神经网络结构详解

视频:https://www.bilibili.com/video/BV1FT4y1E74V?p=120 

我要举例说明的第二种神经网络是AlexNet,是以论文的第一作者Alex Krizhevsky的名字命名的,另外两位合著者是Ilya Sutskever和Geoffery Hinton。

0

AlexNet首先用一张227×227×3的图片作为输入,实际上原文中使用的图像是224×224×3,但是如果你尝试去推导一下,你会发现227×227这个尺寸更好一些。

第一层我们使用96个11×11的过滤器,步幅为4,由于步幅是4,因此尺寸缩小到55×55,缩小了4倍左右。

(以下请有兴趣的同学一定要推导一下,算一算才有长进~)

然后用一个3×3的过滤器构建最大池化层,f=3,步幅s为2,卷积层尺寸缩小为27×27×96。接着再执行一个5×5的卷积,padding之后,输出是27×27×276。然后再次进行最大池化,尺寸缩小到13×13。

再执行一次same卷积,相同的padding,得到的结果是13×13×384,384个过滤器。

再做一次same卷积,就像这样。

再做一次同样的操作,最后再进行一次最大池化,尺寸缩小到6×6×256。

6×6×256等于9216,将其展开为9216个单元,然后是一些全连接层。

最后使用softmax函数输出识别的结果,看它究竟是1000个可能的对象中的哪一个。