论文链接:《BEVFormer: Learning Bird’s-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers》
代码链接:https://github.com/zhiqi-li/BEVFormer
阅读顺序:我之前在哔哩哔哩上跟着李沐一起读论文,按照他的方法:先看题目(比如这篇文章,它的重点就是Spatiotemporal Transformers,这是我们之前没见过的,肯定是它的特色)然后是看摘要,再看结论,接着扫一眼实验和文中的图、表数据,有了大致了解再决定是否细读。当然,李沐在看文章前还会看一下作者,这一篇我就不看了。
这一篇开头先放了一张图,是BEVFormer的简要构架图。一般也会有作者把自己觉得最好看的或是最重要的图放在最前面。
摘要:先说了3D视觉感知任务对自动驾驶系统很重要,作者提出了BEVFormer。BEVFormer使用时空Transformer学习统一的BEV表示以支持多个自主驾驶感知任务。BEVFormer通过预定义的网格形状的BEV queries与空间和时间进行交互,从而利用空间和时间信息。为聚合空间信息,作者设计了一个空间交叉注意力,即每个BEV从摄相机视图中的感兴趣区域中提取空间特征。对于时序信息,他们提出了一种时间自注意力来递归地融合历史BEV信息。最后,作者提到了他们的成果:在nuScenes测试集上,NDS达到了56.9%,比之前最好的高出了9个点,与基于雷达的baseline性能相当。同时,BEVFormer显著提高了低可见度情况下的速度估计精度和物体召回率。
作者提出了BEVFormer来从多相机输入生成鸟瞰图特征,BEVFormer可以有效地聚集空间和时间信息,并生成强大的BEV特征,同时支持3D检测和地图分割任务。
局限性:目前,基于相机的方法在效果和效率上仍与基于激光雷达的方法存在特定差距。从2D信息精确推断3D位置对基于相机的方法来说仍是一个长期的挑战。
广泛影响:BEVFormer证明了使用来自多摄相机输入的时空信息可显著提高视觉感知模型的性能。BEVFormer展示的优势对构建更好更安全的自主驾驶系统以及其他系统至关重要。作者相信BEVFormer只是接下来更强大的视觉感知方法的基线,基于视觉的感知系统仍有巨大的潜力有待探索。
(再整体看一下文章的图:文章第一页最上面的图(图1)是简要框架图,初次看我感觉是通过t-1时刻的BEV和t时刻的多视角相机图像来推断出t时刻的BEV,该过程中利用到了BEV Queries来查询、聚合时空信息;在第四页最上方(图2)是整体框架图,最左边就是多视角图像输入,经过2D backbone得到特征图。中间部分最为重要,其中包含了时间自注意力和空间交叉注意力,还有一些正则和前向,几个层堆叠在一起组成一个块,重复6次,每一层得到当前时刻的BEV后喂入下一层,最后用不同的头做检测和分割;在第八、九页上有表格数据,可以看到不管是测试集还是验证集,相对于其他基于纯相机的模型,BEVFormer对应的NDS和mAP两栏都是最高的)
3D空间中的感知对各种应用都至关重要,如自动驾驶、机器人等。尽管基于激光雷达的方法取得了显著进展,但基于相机的方法近年来也已引起广泛关注。除了部署成本较低外,与基于激光雷达的系统相比,摄相机在检测远距离物体和识别基于视觉的道路元素(如交通灯、停车线)方面具有理想的优势。
自动驾驶中对周围场景的视觉感知能够从多相机提供的2D线索中预测3D包围框和语义地图。最直接的方案是基于单目框架和跨摄相机后处理。该框架的缺点是,它分别单独处理不同的视图,无法跨摄相机捕获信息,导致性能和效率低下。
作为单目框架的替代,一个更统一的框架是从多相机图像中提取整体表示。鸟瞰图(BEV)是周围场景的常用表示,因为它清楚地显示了物体的位置和大小,适用于各种自动驾驶任务,如感知和规划。尽管之前的地图分割方法证明了BEV的有效性,但基于BEV的方法在3D物体检测中没有显示出比其他范式的显著优势。根本原因是,3D物体检测任务需要强大的BEV特征来支持精确的3D包围框预测,但从2D平面生成BEV是不适定的。基于深度信息生成BEV特征的BEV框架最为流行,但该范式对深度值或深度分布的精度很敏感。因此,基于BEV的方法的检测性能会受到复合误差的影响,而且不准确的BEV特征可能会严重影响最终性能。因此,我们设计了一种不依赖深度信息的BEV生成方法,可以自适应地学习BEV特征,而不是严格依赖3D先验。Transformer使用注意力机制动态聚合有价值的特征,在概念上满足了我们的需求。
另一个使用BEV特征来完成感知任务的动机是:BEV是一个连接时间和空间的理想桥梁。对于人类视觉感知系统,时间信息在推断物体的运动状态和识别被遮挡物体方面起到了很大作用,而且视觉领域的很多工作已经验证了使用视频数据的有效性。然而,现有的先进的多相机3D检测方法很少发掘时间信息。最大的挑战在于自动驾驶对于时序要求很严格,而且物体在场景中变化很快,所以简单地堆叠跨时间的BEV特征带来了额外的计算花销和干扰信息,这是不理想的。受recurrent neural networks(RNNs)的启发,我们利用BEV特征来递归地传递从过去到现在的时间信息,这与RNN模型的隐藏状态相同精髓。
我们提出了基于Transformer的BEV编码器,叫做BEVFormer,它可以有效地聚合来自多视点摄相机的时空特征和历史BEV特征。由BEVFormer生成的BEV特征以同时支持多个3D感知任务。如图1中所示,BEVFormer包含了3个关键设计:(1)网格形状的BEV查询,通过注意力机制灵活地融合空间特征和时间特征,(2)空间交叉注意力模块,聚集来自多相机图像的空间特征,(3)时间自注意力模块,从历史BEV特征中提取时间信息,这有利于运动物体的速度估计和被严重遮挡物体的检测,与此同时也带来了可忽略不计的计算开销。有了BEVFormer生成的统一特征,该模型可以与不同任务的专用头协作,进行端到端的3D物体检测和地图分割。
主要贡献如下:
1.提出了BEVFormer,一种时空变换编码器,可以将多相机和/或时间戳输入投影到BEV表示中。有了统一的BEV特征,我们的模型可以同时支持多个自主驾驶感知任务,包括3D检测和地图分割;
2.设计了可学习的BEV Queries、空间交叉注意力层和时间自注意力层,分别查找跨摄相机的空间特征和历史BEV的时间特征,然后将其聚合为统一的BEV特征;
3.在多个有挑战性的基准上测试了BEVFormer,包括nuScenes和Waymo。例如,在同类的参数和计算开销下,BEVFormer在nuScenes测试集上达到了56.9%的NDS,比以前的最佳检测方法DETR3D高出9个点(56.9% vs 47.9%)。对于地图分割任务,BEVFormer也达到了SOTA,在最具挑战性的车道分割上,比LSS高出5个百分点。
最近,使用Transformer来重新制定检测和分割任务成为了新趋势。DETR使用使一组对象查询直接通过交叉注意力解码器生成检测结果。然而,DETR的主要缺点是训练时间长。可变形的DETR通过提出可变形注意力解决了这一问题。与DETR中的普通全局注意力不同,可变形的注意力机制和局部感兴趣区域相互作用,它只采样了每个参考点旁的K个点并计算了注意力结果,提高了效率并大大缩短了训练时间。可变形注意机制通过以下公式计算:
其中,q、p、x分别代表查询、参考点和输入特征。i索引注意力头,Nhead代表注意力头总数。j索引采样关键词,Nkey是每个头的采样关键词数量。Wi和Wi’是可学习的权重,C是特征维度。Aij∈[0,1]是预测的注意力权重,并通过∑Aij=1归一化。△Pij是参考点p的偏移量。x(p+△pij)代表了位置p+△pij的特征,它是通过通过双线性插值提取的。在该工作中,作者将可变形的注意力机制拓展到了3D感知任务中,为了有效地聚集空间和时间信息。
先前的3D感知方法通常独立地进行3D物体检测或地图分割任务。对于3D物体检测任务,早期方法和2D检测方法类似,通常基于2D包围框预测3D包围框。Wang等人在先进的2D检测器FCOS的基础上直接预测每个物体的3D包围框。DETR3D将可学习的3D查询投影到2D图像中,然后对相应特征进行采样,进行端到端的3D包围框预测而不进行NMS后处理。另一种解决方案是将图像特征转换为BEV特征,并从自顶向下的视图预测3D包围框。方法使用来自深度估计或类别深度分布的深度信息将图像特征转换为BEV特征。OFT和ImVoxelNet将预定义体素投影到图像特征上来生成场景的体素表示。
实际上,从多相机特征生成BEV特征在地图分割任务中有着更广泛的研究。一种直接的方法是通过Inverse Perspective Mapping(IPM)将透视图转换为BEV。此外,LSS基于深度分布生成BEV特征。一些方法利用mlp来学习从透视图到BEV的转换。PYVA提出了一种将前视单目图转换为BEV的交叉视图transformer,但由于全局注意力机制的计算成本,该范式不适合融合多相机特征。除了空间信息,先前的工作还通过堆叠多个时间戳的BEV特征来考虑时间信息。叠加BEV特征限制了固定时间段内的可用时间信息并带来了额外的计算成本。在这项工作中,所提出的时空Transformer通过同时考虑空间和时间线索来生成当前时间的BEV特征,而时间信息是通过RNN方式从先前的BEV特征中获得的,这只带来了很少的计算成本。
将多相机图像特征转换为BEV特征可以为各种自动驾驶感知任务提供统一的周围环境表示。这项工作中,我们提出了一种新的基于Transformer的BEV生成框架,可以通过注意力机制有效地聚集来自多视图摄相机的时空特征和历史BEV特征。
如图2所示,BEVFormer有六个编码层,每一层都遵循Transformers的传统架构,除了三个特定设计,即BEV Queries、空间交叉注意力和时间自注意力。特别的,BEV Queries是网格状的可学习参数,被设计用来通过注意力机制从多相机视图的BEV空间中查询特征。空间交叉注意力和时间自注意力是和BEV Queries一起工作的注意力层,用于根据BEV查询查找和聚合多相机图像的空间特征以及历史BEV的时间特征。
在推理阶段,在t时刻,我们将多相机图像喂入backone(如ResNet-101),并获得不同相机视角的特征Ft(Ft是个集合,包含了每个视角的特征)。同时,我们保留了前一时间戳t-1时刻的BEV特征Bt−1。在编码器的每个层中,我们首先使用BEV queries Q通过时间自注意力来查询来自先前BEV特征Bt−1的时间信息。然后,我们使用BEV queries Q通过空间交叉注意力从多相机特征Ft查询空间信息。经过前馈网络后,编码器层输出细化的BEV特征,这是下一个编码器层的输入。在6个堆叠的编码器层之后,就生成了当前时刻t处的统一BEV特征Bt。以BEV特征Bt作为输入,3D检测头和地图分割头可以预测3D边界框和语义图等感知结果。
我们预先定义了一组网格形状的可学习参数Q作为BEVFormer的查询(每一层的输出都作为下一层的Query,学习完就变成BEV特征了)。具体来说,位于Q上的p=(x,y)处的查询Qp与BEV平面中相应的网格单元区域相关。BEV平面中的每个网格单元对应于s米的真实尺寸。BEV特征的中心默认对应于自车的位置。按常见做法,作者在将BEV查询Q输入到BEVFormer之前,将可学习的位置编码加入到了BEV查询Q中。
多摄像机3D感知的输入规模较大,因此计算成本也很高。所以,作者开发了基于可变形注意力的空间交叉注意力,这是一个资源高效的注意力层,其中每个BEV查询Qp仅与其跨相机视图的感兴趣区域交互。然而,可变形注意力最初是为2D感知设计的,需要对3D场景进行一些微调。
(之所以要用可变形的注意力,是因为全局注意力太贵了,要和所有部分进行交互,这一点在Transformer的论文中有介绍到)
如图2中(b)所示,首先将BEV平面上的每个查询提升为柱状查询,从柱子上采样Nref个3D参考点,然后将这些点投影到2D视图。对于一个BEV查询,投影的2D点只能落在某些视图上,而其他视图则没有。所以,将命中视图称为Vhit。之后,我们将这些2D点视为查询Qp的参考点并围绕这些参考点从命中视图Vhit中采样特征(这里为什么要做采样是因为直接将3D投影到2D会有误差)。最后,对采样的特征进行加权和,作为空间交叉注意的输出。空间交叉注意力(SCA)的过程可表述为:
其中,i索引相机视图,j索引参考点,Nref是每个BEV query的参考点总和。对每个Qp,使用投影方程P(p,i,j)来得到在第i个视图上的第j个参考点。
如何从投影函数P获得视图图像上的参考点:首先计算与位于Q的p=(x,y)处的查询Qp对应的真实世界坐标(x’,y’),如下式:
其中,H,W是BEV查询的空间形状,s是BEV网格的分辨率大小,(x’,y’)是以自车位置为原点的坐标。在3D空间中,位于(x’,y’)的物体将出现在z轴上的z′高度处。因此,作者预先定义了一组锚定高度Zj’来确保能够捕捉出现在不同高度的线索。这样,对每个Qp,能够得到一个3D参考点柱(x’,y’,zj’)。最后,通过摄像机的投影矩阵将3D参考点投影到不同的图像视图,其可以写成:
这里,P(p,i,j)是从第j个3D点(x’,y’,zj’)得来的的第i个视图上的2D点,Ti是第i个相机的已知投影矩阵。
时间信息对于视觉系统理解周围环境也很重要。例如,在没有时间线索的情况下,从静态图像中推断运动物体的速度或检测高遮挡物体是很有挑战性的。为解决这个问题,作者设计了时间自我注意,它可以通过结合历史BEV特征来表示当前环境。
给定当前时间戳t处的BEV查询Q和保存在时间戳t−1处的历史BEV特征Bt−1,首先根据自车运动将Bt−1和Q对准,从而使相同网格处的特征与相同的现实世界位置对应。
这里,作者将对齐的历史BEV特征Bt−1记作B’t-1。然而,从时间t-1到时间t,可运动物体以各种偏移在真实世界中移动(周围的车与自车不一定速度相同,所以在不同时刻的位置会有变化),在不同时刻的BEV特征之间构建相同对象的精确关联是有挑战的。所以,作者通过时间自我注意力(TSA)层对特征间的这种时间连接建模,其可写为:
其中,Qp表示位于Q的p=(x,y)处的BEV查询。另外,与普通可变形的注意力不同,时间自注意力中的偏移△p是由Q和B’t-1的堆叠来预测的。特别地,对于每个序列的第一个样本,时间自我注意力将退化为没有时间信息的自注意力,这里用复制的BEV查询{Q,Q}来代替BEV特征{Q,B’t-1}。
(其实该模块就是用来改善BEV Query的,让其融合一些先验知识,之后再和多相机图像进行空间融合时就能更好地判断)
由于BEV特征Bt是一个多用途的2D特征图,3D物体检测和地图分割任务头可以通过很小的改动在2D感知方法的基础上发展起来。
对于3D物体检测:作者基于2D检测器Deformable DETR设计了一个端到端的3D检测头。修改包括使用单尺度的BEV特征Bt作为解码器的输入,预测3D包围框和速度,并且仅使用L1损失来监督3D包围框回归。有了这个检测头,模型可以端到端地预测3D包围框和速度,而不需要NMS后处理。
对于地图分割:作者设计了一种基于2D分割方法Panoptic SegFormer的地图分割头。由于基于BEV的地图分割与普通语义分割基本相同,作者利用掩码解码器和类固定查询来标定每个语义类别,包括汽车、车辆、道路(可行驶区域)和车道。
训练阶段:对于时间t处的每个样本,我们从过去2秒的连续序列中随机采样另外3个样本,这种随机抽样策略可以增强自我运动的多样性。我们将这四个样本的时间戳表示为t-3,t-2,t-1和t。对于前三个时间戳的样本,它们负责循环生成BEV特征{Bt-3,Bt-2,Bt-1},该阶段不需要梯度。对于t−3时刻的第一个样本、没有以前的BEV特征,时间自我注意力退化为自注意力。在时间t,模型基于多相机输入和先前的BEV特征Bt−1生成BEV特征Bt,从而Bt中包含了跨越四个样本的时间和空间线索。最后,将BEV特征Bt喂入检测和分割头,并计算相应的损失函数。
推理阶段:按时间顺序评估视频序列的每个帧。前一个时间戳的BEV特征被保存并用于下一个。该在线推理策略在时间上是高效的,并且与实际应用一致。尽管这利用了时间信息,但推理速度仍与其他方法相当。
nuScenes数据集:包含1000个场景,每个场景持续时间为20秒,关键样本注释频率为2Hz。每个样本包含来自6个摄像机的RGB图像,具有360°水平视场。对于检测任务,有10个类别的1.4M带注释的3D包围框。作者按照LSS中的设置执行BEV分割任务。该数据集还为检测任务提供了官方评估指标。nuScenes的平均精度(mAP)是使用地平面上的中心距离而不是3DIoU来计算的,以匹配预测结果和地面实况。nuScenes度量还包含5种类型的真阳性度量(TP度量),包括分别用于测量平移、尺度、方向、速度和属性误差的ATE、ASE、AOE、VE和AAE。nuScenes还定义了Nuscene检测分数(NDS)来捕捉nuScenes检测任务的所有方面,其定义为:
Waymo Open数据集:一个具有798个训练序列和202个验证序列的大规模自动驾驶数据集。注意,Waymo提供的每一帧的五幅图像仅具有约252°的水平视场,但提供的带注释标签却是360°环绕自车。作者删除了这些在训练和验证集的任何图像上都不可见的包围框。由于Waymo数据集规模大且速率高,作者通过从训练序列中每5帧采样一次,使用训练分割的子集,并且仅检测车辆类别。他们使用3D IoU的阈值为0.5和0.7来计算Waymo数据集上的mAP。
采用两种类型的主干:从FCOS3D检查点初始化的ResNet101-DCN以及从DD3D检查点进行初始化的VoVnet-99。默认情况下,利用FPN的输出多尺度特征,大小为1/16、1/32、1/64,维度C为256。在nuScenes上的实验中,BEV查询的默认大小为200×200,感知范围为[−51.2m,51.2m](X,Y轴均是),因此BEV网格的分辨率s的大小为0.512m。作者对BEV查询采用可学习的位置编码。BEV编码器包含6个编码器层,在每一层不断细化BEV查询。每个编码器层的输入BEV特征Bt−1是相同的且不需要梯度。对于每个局部查询,在由可变形注意力机制实现的空间交叉注意力模块中,它对应于3D空间中具有不同高度的Nref=4个目标点,预定义的高度锚点从−5米到3米均匀采样。对于2D视图特征上的每个参考点,在每个头部的该参考点周围使用四个采样点。作者默认用24个epochs训练模型,学习率为2×。
对Waymo上的实验,作者更改了一些设置。由于Waymo的摄像机系统无法捕捉自车周围的整个场景,BEV查询的默认空间形状为300×220,感知范围为:X轴[−35.0m,75.0m],Y轴[−75.0m,75.0m]。每个网格的分辨率s的大小为0.5m。自车位于BEV的(70,150)处。
基线:为消除任务头的影响并公平地比较其他BEV生成方法,作者使用VPN和Lift Splat来替换BEVFormer,并保持任务头和其他设置相同。作者还通过在不使用历史BEV特征的情况下将时间自注意力调整为普通自注意力,将BEVFormer调整为称为静态模型BevFormr-S。
在表1、表2中展示了nuScenes测试和验证拆分的主要结果。在相当的训练策略和可比的模型规模下,作者的方法在验证集上优于之前的最佳方法DETR3D9.2个点(51.7%的NDS vs 42.5%的NDS)。在测试集上,他们的模型在没有用太多花哨结构的情况下达到了56.9%的NDS,比DETR3D(47.9%的NDS)高9个点。该方法甚至可以达到与一些基于激光雷达的基线相当的性能,如SSN(56.9%NDS)和PointPainting(58.1%NDS)。
以前基于相机的方法几乎无法估计速度,作者的方法表明,时间信息在多相机检测的速度估计中起着关键作用。在测试集上,BEVFormer的平均速度误差(mAVE)为0.378m/s,大大优于其他基于相机的方法,且接近基于激光雷达的方法的性能。
在Waymo上的实验如表3所示。使用0.7和0.5的IoU阈值来评估车辆类别。此外,由于基于IoU的指标对于基于相机的方法来说太具挑战性,作者还采用nuScenes指标来评估结果。但目前只有很少一些基于相机的工作报告了在Waymo上的结果,因此作者还使用DETR3D的官方代码在Waymo上进行了比较实验。可以观察到,在IoU阈值为0.5的情况下,BEVFormer在航向信息(APH)的平均精度优于DETR3D 6.0%(LEVEL_1)和2.5%(LEVEL_2)。在nuScenes度量上,BEVFormer优于DETR3D 3.2%(NDS)和5.2%(AP)。作者还对前视摄像头进行了实验,以将Bevformr与CaDNN(在Waymo数据集上有报告结果的单目3D检测方法)进行比较。在IoU阈值为0.5的情况下,BEVFormer在L1和L2级困难方面的表现优于CaDNN,APH分别高出13.3%和11.2%。
用检测头和分割头训练模型,以验证模型对多个任务的学习能力,结果如表4所示。当在相同设置下比较不同的BEV编码器时,BEVFormer在所有任务中都实现了更高的性能,但道路分割除外,结果与BEVFformer-S相当。例如,在联合训练中,BEVFormer在检测任务上的表现优于LSS 11个点(52.0%NDS vs 41.0%NDS),在车道分割上的IoU优于LSS 5.6个点(23.9% vs 18.3%)。与单独训练任务相比,多任务学习通过共享更多模块(包括主干和BEV编码器),节省了计算成本并减少了推理时间。在本文中,作者证明了他们的BEV编码器生成的BEV特征可以很好地适应不同的任务,并且使表现更好。然而,对于道路和车道分割,联合训练模型的性能不如单独训练模型,这是多任务学习中常见的负迁移现象。
空间交叉注意力的有效性:使用BEVFormer-S进行消融实验以排除时间信息的干扰,结果如表5所示。默认的空间交叉注意力基于可变形注意力。为了比较,作者构建了另外两条具有不同注意力机制的基线:(1)使用全局注意力代替可变形注意力;(2)使每个查询只与其参考点交互,而不是与周围的局部区域交互。为了进行更广泛的比较,作者还用VPN和LSS提出的BEV生成方法替换了BEVFormer。可以观察到,在可比较的模型尺度下,可变形注意力显著优于其他注意力机制。全局注意力消耗了太多的GPU内存,点交互的感受野有限。稀疏注意力实现了更好的性能,因为它与先验确定的感兴趣区域交互,平衡了感受野和GPU消耗。
时间自注意力的有效性:从表1和表4中可以观察到,在相同设置下,BEVFormer明显优于BevFormr-S,特别是在具有挑战性的检测任务上。时间信息的影响主要表现在以下几个方面:(1)时间信息的引入极大的提高了速度估计的精度;(2)利用时间信息,物体的预测位置和方向会更精确;(3)如图3所示,由于时间信息包含过去的物体线索,在严重遮挡的物体上获得了更高的召回率。为了在不同遮挡水平上评估BEVFormer的性能,作者根据nuScenes提供的官方可见性标签将nuScenes验证集分为四个子集。在每个子集中,计算匹配期间中心距离阈值为2米的所有类别的平均召回率。为了公平地比较召回率,所有方法的最大预测框数为300。在只有0-40%的物体可见的子集上,BEVFormer的平均召回率比BevFormr-S和DETR3D高了超过6.0%。
模型规模和延迟:表6中比较了不同配置的性能和延迟。作者从三个方面分析了BEVFormer的规模,包括是否使用多尺度视图、BEV查询形状和层数,来验证性能和推理延迟之间的权衡。可以观察到,在BEVFormer中使用一个编码器层的配置C达到了50.1%的NDS,并将BEVFormer的延迟从原来的130ms减少到了25ms。配置D具有单尺度视图、较小的BEV尺寸和仅1个编码器层,在推理过程中仅消耗7ms,尽管与默认配置相比,它下降了3.9个点。然而,由于多视点图像输入,限制效率的瓶颈在于主干,用于自主驾驶的高效主干值得深入研究。总体而言,作者的构架可适应各种模型规模,并灵活地权衡性能和效率。
如图4,展示了复杂场景的检测结果。BEVFormer产生了令人印象深刻的结果,但在小型和远程对象中出现了一些错误。
最近在研究BEVFusion(mit),所以想对基于BEV的模型进行一些了解,感觉这篇文章相对于BEVFusion还是好懂一些。之后如果有机会和时间去看代码,也会写一些心得发出来。
(PS:如果大家对于里面的投影细节不是很明白,可以参考这篇;如果对Transformer不太了解,可以先去看一下它的论文,我之前也看过李沐的讲解,做了一些笔记,因为没有自己完整过一遍代码还是挺容易忘记的)
感谢大家观看:)