当前位置: 首页 > news >正文

商业网站有哪些专业做网站哪家好

商业网站有哪些,专业做网站哪家好,湖南seo推广公司,如何做公证网站网页发布时间我自己的原文哦~ https://blog.51cto.com/whaosoft/12663254 #Motion Plan 代码 github.com/liangwq/robot_motion_planing 轨迹约束中的软硬约束 前面的几篇文章已经介绍了#xff0c;轨迹约束的本质就是在做带约束的轨迹拟合。输入就是waypoint点list#xff0c;约束…我自己的原文哦~  https://blog.51cto.com/whaosoft/12663254 #Motion Plan 代码  github.com/liangwq/robot_motion_planing 轨迹约束中的软硬约束 前面的几篇文章已经介绍了轨迹约束的本质就是在做带约束的轨迹拟合。输入就是waypoint点list约束条件有两种硬约束和软约束。所谓硬约束对应到数学形式就是代价函数硬约束对应的就是最优化秋季的约束条件部分。对应到物理意义就是为了获得机器人可行走的安全的轨迹有 把轨迹通过代价函数推离障碍物的方式给出障碍物之间的可行走凸包走廊通过硬约束让机器人轨迹必须在凸包走廊行走 上图展示的是软硬约束下Bezier曲线拟合的求解的数学框架以及如何把各种的约束条件转成数学求解的代价函数软约束或者是求解的约束条件软约束。image.png 上面是对常用的代价函数约束的几种表示方式的举例。image.png Bezier曲线拟合轨迹 前面已经一篇文章介绍过贝赛尔曲线拟合的各种优点 端点插值。贝塞尔曲线始终从第一个控制点开始结束于最后一个控制点并且不会经过任何其他控制点。凸包。贝塞尔曲线 ( ) 由一组控制点 完全限制在由所有这些控制点定义的凸包内。速度曲线。贝塞尔曲线 ( ) 的导数曲线 ′( ) 被称为速度曲线它也是一个由控制点定义的贝塞尔曲线其中控制点为 ∙ ( 1− )其中 是阶数。固定时间间隔。贝塞尔曲线始终在 [0,1] 上定义。 Fig1.一段轨迹用bezier曲线拟合image.png 上面的两个表达式对应的代码实现如下 def bernstein_poly(n, i, t):Bernstein polynom.:param n: (int) polynom degree:param i: (int):param t: (float):return: (float)return scipy.special.comb(n, i) * t ** i * (1 - t) ** (n - i)def bezier(t, control_points):Return one point on the bezier curve.:param t: (float) number in [0, 1]:param control_points: (numpy array):return: (numpy array) Coordinates of the pointn len(control_points) - 1return np.sum([bernstein_poly(n, i, t) * control_points[i] for i in range(n 1)], axis0) 要用Bezier曲线来表示一段曲线上面已经给出了表达式和代码实现现在缺的就是给定控制点把控制点带进来用Bezier曲线表达式来算出给定终点和结束点中需要画的点坐标。下面代码给出了4个控制点、6个控制点的Bezier曲线实现其中为了画曲线需要算170个线上点。代码如下 def calc_4points_bezier_path(sx, sy, syaw, ex, ey, eyaw, offset):Compute control points and path given start and end position.:param sx: (float) x-coordinate of the starting point:param sy: (float) y-coordinate of the starting point:param syaw: (float) yaw angle at start:param ex: (float) x-coordinate of the ending point:param ey: (float) y-coordinate of the ending point:param eyaw: (float) yaw angle at the end:param offset: (float):return: (numpy array, numpy array)dist np.hypot(sx - ex, sy - ey) / offsetcontrol_points np.array([[sx, sy],[sx dist * np.cos(syaw), sy dist * np.sin(syaw)],[ex - dist * np.cos(eyaw), ey - dist * np.sin(eyaw)],[ex, ey]])path calc_bezier_path(control_points, n_points170)return path, control_pointsdef calc_6points_bezier_path(sx, sy, syaw, ex, ey, eyaw, offset):Compute control points and path given start and end position.:param sx: (float) x-coordinate of the starting point:param sy: (float) y-coordinate of the starting point:param syaw: (float) yaw angle at start:param ex: (float) x-coordinate of the ending point:param ey: (float) y-coordinate of the ending point:param eyaw: (float) yaw angle at the end:param offset: (float):return: (numpy array, numpy array)dist np.hypot(sx - ex, sy - ey) * offsetcontrol_points np.array([[sx, sy],[sx 0.25 * dist * np.cos(syaw), sy 0.25 * dist * np.sin(syaw)],[sx 0.40 * dist * np.cos(syaw), sy 0.40 * dist * np.sin(syaw)],[ex - 0.40 * dist * np.cos(eyaw), ey - 0.40 * dist * np.sin(eyaw)],[ex - 0.25 * dist * np.cos(eyaw), ey - 0.25 * dist * np.sin(eyaw)],[ex, ey]])path calc_bezier_path(control_points, n_points170)return path, control_pointsdef calc_bezier_path(control_points, n_points100):Compute bezier path (trajectory) given control points.:param control_points: (numpy array):param n_points: (int) number of points in the trajectory:return: (numpy array)traj []for t in np.linspace(0, 1, n_points):traj.append(bezier(t, control_points))return np.array(traj) 有了一段Bezier曲线的拟合方式接下来要做的就是如何生成多段Bezier曲线合成一条轨迹并且是需要可以通过代价函数方式软约束必须经过指定点制定点衔接要连续硬约束来生成一条光滑的轨迹曲线。 Fig2.无障碍物带bondary轨迹做了smooth优化Figure_1.png 多段Bezier曲线生成代码如下其实原理很简单给定多个waypoint点每相邻两个wayponit生成一段Bezizer曲线代码如下 # Bezier path one as per the approach suggested in# https://users.soe.ucsc.edu/~elkaim/Documents/camera_WCECS2008_IEEE_ICIAR_58.pdfdef cubic_bezier_path(self, ax, ay):dyaw, _ self.calc_yaw_curvature(ax, ay)cx []cy []ayaw dyaw.copy()for n in range(1, len(ax)-1):yaw 0.5*(dyaw[n] dyaw[n-1])ayaw[n] yawlast_ax ax[0]last_ay ay[0]last_ayaw ayaw[0]# for n waypoints, there are n-1 bezier curvesfor i in range(len(ax)-1):path, ctr_points calc_4points_bezier_path(last_ax, last_ay, ayaw[i], ax[i1], ay[i1], ayaw[i1], 2.0)cx np.concatenate((cx, path.T[0][:-2]))cy np.concatenate((cy, path.T[1][:-2]))cyaw, k self.calc_yaw_curvature(cx, cy)last_ax path.T[0][-1]last_ay path.T[1][-1]return cx, cy 代价函数计算包括曲率代价 偏差代价 距离代价 连续性代价同时还有边界条件轨迹必须在tube内的不等式约束以及问题优化求解。具体代码实现如下 # Objective function of cost to be minimizeddef cubic_objective_func(self, deviation):ax self.waypoints.x.copy()ay self.waypoints.y.copy()for n in range(0, len(deviation)):ax[n1] - deviation[n]*np.sin(self.waypoints.yaw[n1])ay[n1] deviation[n]*np.cos(self.waypoints.yaw[n1])bx, by self.cubic_bezier_path(ax, ay)yaw, k self.calc_yaw_curvature(bx, by)# cost of curvature continuityt np.zeros((len(k)))dk self.calc_d(t, k)absolute_dk np.absolute(dk)continuity_cost 10.0 * np.mean(absolute_dk)# curvature costabsolute_k np.absolute(k)curvature_cost 14.0 * np.mean(absolute_k)# cost of deviation from input waypointsabsolute_dev np.absolute(deviation)deviation_cost 1.0 * np.mean(absolute_dev)distance_cost 0.5 * self.calc_path_dist(bx, by)return curvature_cost deviation_cost distance_cost continuity_cost # Minimize objective function using scipy optimize minimizedef optimize_min_cubic(self):print(Attempting optimization minima)initial_guess [0, 0, 0, 0, 0]bnds ((-self.bound, self.bound), (-self.bound, self.bound), (-self.bound, self.bound), (-self.bound, self.bound), (-self.bound, self.bound))result optimize.minimize(self.cubic_objective_func, initial_guess, boundsbnds)ax self.waypoints.x.copy()ay self.waypoints.y.copy()if result.success:print(optimized true)deviation result.xfor n in range(0, len(deviation)):ax[n1] - deviation[n]*np.sin(self.waypoints.yaw[n1])ay[n1] deviation[n]*np.cos(self.waypoints.yaw[n1])x, y self.cubic_bezier_path(ax, ay)yaw, k self.calc_yaw_curvature(x, y)self.optimized_path Path(x, y, yaw, k)else:print(optimization failure, defaulting)exit() 带障碍物的Bezier曲线轨迹生 image.png 带有障碍物的场景通过代价函数让生成的曲线远离障碍物。从而得到一条可以安全行走的轨迹下面是具体的代码实现。optimizer_k中lambda函数f就是在求解轨迹在经过障碍物附近时候的代价penalty1、penalty2就是在求曲线经过障碍物附近的具体代价值 b.arc_len(granuality10)B.arc_len(granuality10)m_k penalty1 penalty2就是轨迹的整体代价。for循环部分用scipy的optimize的minimize来求解轨迹。 def optimizer_k(cd, k, path, i, obs, curve_penalty_multiplier, curve_penalty_divider, curve_penalty_obst):Bezier curve optimizer that optimizes the curvature and path length by changing the distance of p1 and p2 frompoints p0 and p3, respectively. p_tmp copy.deepcopy(path)if i3 len(path)-1:b CubicBezier()b.p0 p_tmp[i]x, y calc_p1(p_tmp[i], p_tmp[i 1], p_tmp[i - 1], i, cd[0])b.p1 Point(x, y)x, y calc_p2(p_tmp[i-1], p_tmp[i 0], p_tmp[i 1], i, cd[1])b.p2 Point(x, y)b.p3 p_tmp[i 1]B CubicBezier()else:b CubicBezier()b.p0 p_tmp[i]x, y calc_p1(p_tmp[i],p_tmp[i1],p_tmp[i-1], i, cd[0])b.p1 Point(x, y)x, y calc_p2(p_tmp[i],p_tmp[i1],p_tmp[i2], i, cd[1])b.p2 Point(x, y)b.p3 p_tmp[i 1]B CubicBezier()B.p0 p_tmp[i]x, y calc_p1(p_tmp[i1], p_tmp[i 2], p_tmp[i], i, 10)B.p1 Point(x, y)x, y calc_p2(p_tmp[i1], p_tmp[i 2], p_tmp[i 3], i, 10)B.p2 Point(x, y)B.p3 p_tmp[i 1]m_k b.max_k()if m_kk:m_k m_k*curve_penalty_multiplierelse:m_k m_k/curve_penalty_dividerf lambda x, y: max(math.sqrt((x[0] - y[0].x) ** 2 (x[1] - y[0].y) ** 2) * curve_penalty_obst, 10) if math.sqrt((x[0] - y[0].x) ** 2 (x[1] - y[0].y) ** 2) y[1] else 0b_t b.calc_curve(granuality10)b_t zip(b_t[0],b_t[1])B_t B.calc_curve(granuality10)B_t zip(B_t[0], B_t[1])penalty1 0penalty2 0for o in obs:for t in b_t:penalty1 max(penalty1,f(t,o))for t in B_t:penalty2 max(penalty2,f(t,o))return b.arc_len(granuality10)B.arc_len(granuality10)m_k penalty1 penalty2# Optimize the initial path for n_path_opt cycles for m in range(n_path_opt):if m%2:for i in range(1,len(path)-1):x0 [0.0, 0.0]bounds Bounds([-1, -1], [1, 1])res minimize(optimizer_p, x0, args(path, i, obs, path_penalty), methodTNC, tol1e-7, boundsbounds)x, y res.xpath[i].x xpath[i].y yelse:for i in range(len(path)-1,1):x0 [0.0, 0.0]bounds Bounds([-1, -1], [1, 1])res minimize(optimizer_p, x0, args(path, i, obs, path_penalty), methodTNC, tol1e-7, boundsbounds)x, y res.xpath[i].x xpath[i].y y 带飞行走廊的Bezier轨迹生成 得益于贝赛尔曲线拟合的优势如果我们可以让机器人可行走的轨迹转成多个有重叠区域的凸多面体那么轨迹完全位于飞行走廊内。    image.png 飞行走廊由凸多边形组成。每个立方体对应于一段贝塞尔曲线。此曲线的控制点被强制限制在多边形内部。轨迹完全位于所有点的凸包内。 如何通过把障碍物地图生成可行凸包走廊 生成凸包走廊的方法目前有以下三大类的方法 平行凸簇膨胀方法 从栅格地图出发利用最小凸集生成算法完成凸多面体的生成。其算法的思想是首先获得一个凸集再沿着凸集的表面进行扩张扩张之后再进行凸集检测判断新扩张的集合是否保持为凸。一直扩张到不能再扩张为止再提取凸集的边缘点利用快速凸集生成算法生成凸多面体。该算法的好处在于可以利用这种扩张的思路将安全的多面体的体积尽可能的充满整个空间因此获得的安全通道更大。但其也具有一定的缺点就是计算量比较大计算所需要的时间比较长为了解决这个问题在该文章中又提出了采用GPU加速的方法来加速计算。 基于凸分解的安全通道生成 基于凸分解的安全通道生成方法由四个步骤完成安全通道的生成分别为找到椭球、找到多面体、边界框、收缩。 半定规划的迭代区域膨胀 为了获取多面体这个方法首先构造一个初始椭球由一个以选定点为中心的单位球组成。然后遍历障碍物为每个障碍物生成一个超平面该超平面与障碍物相切并将其与椭球分开。再次这些超平面定义了一组线性约束它们的交集是一个多面体。然后可以在那个多面体中找到一个最大的椭球使用这个椭球来定义一组新的分离超平面从而定义一个新的多面体。选择生成分离超平面的方法这样椭圆体的体积在迭代之间永远不会减少。可以重复这个过程直到椭圆体的增长率低于某个阈值此时我们返回多面体和内接椭圆体。这个方法具有迭代的思想并且具有收敛判断的标准算法的收敛快慢和初始椭球具有很大的关系。 Fig3.半定规划的迭代区域膨胀。每一行即为一次迭代操作直到椭圆体的增长率低于阈值。image.png 这篇文章介绍的是“半定规划的迭代区域膨胀”方法具体代码实现如下 # 根据输入路径对空间进行凸分解def decomp(self, line_points: list[np.array], obs_points: list[np.array], visualizeTrue):# 最终结果decomp_polygons list()# 构建输入障碍物点的kdtreeobs_kdtree KDTree(obs_points)# 进行空间分解for i in range(len(line_points) - 1):# 得到当前线段pf, pr line_points[i], line_points[i 1]print(pf)print(pr)# 构建初始多面体init_polygon self.initPolygon(pf, pr)print(init_polygon.getInterPoints())print(init_polygon.getVerticals())# 过滤障碍物点candidate_obs_point_indexes obs_kdtree.query_ball_point((pf pr) / 2, np.linalg.norm([np.linalg.norm(pr - pf) / 2 self.consider_range_, self.consider_range_]))local_obs_points list()for index in candidate_obs_point_indexes:if init_polygon.inside(obs_points[index]):local_obs_points.append(obs_points[index])# 得到初始椭圆ellipse self.findEllipse(pf, pr, local_obs_points)# 根据初始椭圆构建多面体polygon self.findPolygon(ellipse, init_polygon, local_obs_points)# 进行保存decomp_polygons.append(polygon)if visualize:# 进行可视化plt.figure()# 绘制路径段plt.plot([pf[1], pr[1]], [pf[0], pr[0]], colorred)# 绘制初始多面体verticals init_polygon.getVerticals()# 绘制多面体顶点plt.plot([v[1] for v in verticals] [verticals[0][1]], [v[0] for v in verticals] [verticals[0][0]], colorblue, linestyle--)# 绘制障碍物点plt.scatter([p[1] for p in local_obs_points], [p[0] for p in local_obs_points], markero)# 绘制椭圆ellipse_x, ellipse_y list(), list()for theta in np.linspace(-np.pi, np.pi, 1000):raw_point np.array([np.cos(theta), np.sin(theta)])ellipse_point np.dot(ellipse.C_, raw_point) ellipse.d_ellipse_x.append(ellipse_point[0])ellipse_y.append(ellipse_point[1])plt.plot(ellipse_y, ellipse_x, colororange)# 绘制最终多面体# 得到多面体顶点verticals polygon.getVerticals()# 绘制多面体顶点plt.plot([v[1] for v in verticals] [verticals[0][1]], [v[0] for v in verticals] [verticals[0][0]], colorgreen)plt.show()return decomp_polygons# 构建初始多面体def initPolygon(self, pf: np.array, pr: np.array) - Polygon:# 记录多面体的平面polygon_planes list()# 得到线段方向向量dire self.normalize(pr - pf)# 得到线段法向量dire_h np.array([dire[1], -dire[0]])# 得到平行范围p_1 pf self.consider_range_ * dire_hp_2 pf - self.consider_range_ * dire_hpolygon_planes.append(Hyperplane(dire_h, p_1))polygon_planes.append(Hyperplane(-dire_h, p_2))# 得到垂直范围p_3 pr self.consider_range_ * direp_4 pf - self.consider_range_ * direpolygon_planes.append(Hyperplane(dire, p_3))polygon_planes.append(Hyperplane(-dire, p_4))# 构建多面体polygon Polygon(polygon_planes)return polygon# 得到初始椭圆def findEllipse(self, pf: np.array, pr: np.array, obs_points: list[np.array]) - Ellipse:# 计算长轴long_axis_value np.linalg.norm(pr - pf) / 2axes np.array([long_axis_value, long_axis_value])# 计算旋转rotation self.vec2Rotation(pr - pf)# 计算初始椭圆C np.dot(rotation, np.dot(np.array([[axes[0], 0], [0, axes[1]]]), np.transpose(rotation)))d (pr pf) / 2ellipse Ellipse(C, d)# 得到椭圆内的障碍物点inside_obs_points ellipse.insidePoints(obs_points)# 对椭圆进行调整使得全部障碍物点都在椭圆外while inside_obs_points:# 得到与椭圆距离最近的点closest_obs_point ellipse.closestPoint(inside_obs_points)# 将最近点转到椭圆坐标系下closest_obs_point np.dot(np.transpose(rotation), closest_obs_point - ellipse.d_) # 根据最近点在椭圆长轴不变的情况下对短轴进行改变使得障碍物点在椭圆上if Compare.small(closest_obs_point[0], axes[0]):axes[1] np.abs(closest_obs_point[1]) / np.sqrt(1 - (closest_obs_point[0] / axes[0]) ** 2)# 更新椭圆ellipse.C_ np.dot(rotation, np.dot(np.array([[axes[0], 0], [0, axes[1]]]), np.transpose(rotation)))# 更新椭圆内部障碍物inside_obs_points ellipse.insidePoints(inside_obs_points, include_boundFalse)return ellipse# 进行多面体的构建def findPolygon(self, ellipse: Ellipse, init_polygon: Polygon, obs_points: list[np.array]) - Polygon:# 多面体由多个超平面构成polygon_planes copy.deepcopy(init_polygon.hyper_planes_)# 初始化范围超平面remain_obs_points obs_pointswhile remain_obs_points:# 得到与椭圆最近障碍物closest_point ellipse.closestPoint(remain_obs_points)# 计算该处的切平面的法向量norm_vector np.dot(np.linalg.inv(ellipse.C_), np.dot(np.linalg.inv(ellipse.C_), (closest_point - ellipse.d_)))norm_vector self.normalize(norm_vector)# 构建平面hyper_plane Hyperplane(norm_vector, closest_point)# 保存到多面体平面中polygon_planes.append(hyper_plane)# 去除切平面外部的障碍物new_remain_obs_points list()for point in remain_obs_points:if Compare.small(hyper_plane.signDist(point), 0):new_remain_obs_points.append(point)remain_obs_points new_remain_obs_pointspolygon Polygon(polygon_planes)return polygon image.png 上面图是给定16个障碍物点必经6个路径点后得到的凸包可行走廊具体代码如下 def main():# 路径点line_points [np.array([-1.5, 0.0]), np.array([0.0, 0.8]), np.array([1.5, 0.3]), np.array([5, 0.6]), np.array([6, 1.2]), np.array([7.6, 2.2])]# 障碍物点obs_points [np.array([4, 2.0]),np.array([6, 3.0]),np.array([2, 1.5]),np.array([0, 1]),np.array([1, 0]),np.array([1.8, 0]),np.array([3.8, 2]),np.array([0.5, 1.2]),np.array([4.3, 0]),np.array([8, 0.9]),np.array([2.8, -0.3]),np.array([6, -0.9]),np.array([-0.5, -0.5]),np.array([-0.75 ,-0.5]),np.array([-1, -0.5]),np.array([-1, 0.8])]convex_decomp ConvexDecomp(2)decomp_polygons convex_decomp.decomp(line_points, obs_points, False)#convex_decomp.decomp(line_points, obs_points,False)plt.figure()# 绘制障碍物点plt.scatter([p[0] for p in obs_points], [p[1] for p in obs_points], markero)# 绘制边界for polygon in decomp_polygons:verticals polygon.getVerticals()# 绘制多面体顶点plt.plot([v[0] for v in verticals] [verticals[0][0]], [v[1] for v in verticals] [verticals[0][1]], colorgreen)#plt.plot(x_samples, y_samples)plt.show() 带凸包走廊求解 带凸包走廊的光滑轨迹生成。前面已经求解得到了可行的凸包走廊这部分可以做为硬约束作为最优化求解的不等式条件。要求的光滑路径和必须经过点的点这部分可以把必须经过点作为等式约束光滑路径可以通过代价函数来实现。这样就可以把带软硬约束的轨迹生成框架各种技能点都用上了。 image.png 下面看具体代码实现 # 进行优化def optimize(self, start_state: np.array, end_state: np.array, line_points: list[np.array], polygons: list[Polygon]):assert(len(line_points) len(polygons) 1)# 得到分段数量segment_num len(polygons)assert(segment_num 1)# 计算初始时间分配time_allocations list()for i in range(segment_num):time_allocations.append(np.linalg.norm(line_points[i1] - line_points[i]) / self.vel_max_)# 进行优化迭代max_inter 10cur_iter 0while cur_iter max_inter:# 进行轨迹优化piece_wise_trajectory self.optimizeIter(start_state, end_state, polygons, time_allocations, segment_num)# 对优化轨迹进行时间调整以保证轨迹满足运动上限约束cur_iter 1# 计算每一段轨迹的最大速度最大加速度最大jerkcondition_fit Truefor n in range(segment_num):# 得到最大速度最大加速度最大jerkt_samples np.linspace(0, time_allocations[n], 100)v_max, a_max, j_max self.vel_max_, self.acc_max_, self.jerk_max_for t_sample in t_samples:v_max max(v_max, np.abs(piece_wise_trajectory.trajectory_segments_[n][0].derivative(t_sample)), np.abs(piece_wise_trajectory.trajectory_segments_[n][1].derivative(t_sample)))a_max max(a_max, np.abs(piece_wise_trajectory.trajectory_segments_[n][0].secondOrderDerivative(t_sample)), np.abs(piece_wise_trajectory.trajectory_segments_[n][1].secondOrderDerivative(t_sample)))j_max max(j_max, np.abs(piece_wise_trajectory.trajectory_segments_[n][0].thirdOrderDerivative(t_sample)), np.abs(piece_wise_trajectory.trajectory_segments_[n][1].thirdOrderDerivative(t_sample)))# 判断是否满足约束条件if Compare.large(v_max, self.vel_max_) or Compare.large(a_max, self.acc_max_) or Compare.large(j_max, self.jerk_max_):ratio max(1, v_max / self.vel_max_, (a_max / self.acc_max_)**0.5, (j_max / self.jerk_max_)**(1/3))time_allocations[n] ratio * time_allocations[n]condition_fit Falseif condition_fit:breakreturn piece_wise_trajectory# 优化迭代def optimizeIter(self, start_state: np.array, end_state: np.array, polygons: list[Polygon], time_allocations: list, segment_num):# 构建目标函数 inter (jerk)^2inte_jerk_square np.array([[720.0, -1800.0, 1200.0, 0.0, 0.0, -120.0],[-1800.0, 4800.0, -3600.0, 0.0, 600.0, 0.0],[1200.0, -3600.0, 3600.0, -1200.0, 0.0, 0.0],[0.0, 0.0, -1200.0, 3600.0, -3600.0, 1200.0],[0.0, 600.0, 0.0, -3600.0, 4800.0, -1800.0],[-120.0, 0.0, 0.0, 1200.0, -1800.0, 720.0]])# 二次项系数P np.zeros((self.dim_ * segment_num * self.freedom_, self.dim_ * segment_num * self.freedom_))for sigma in range(self.dim_):for n in range(segment_num):for i in range(self.freedom_):for j in range(self.freedom_):index_i sigma * segment_num * self.freedom_ n * self.freedom_ iindex_j sigma * segment_num * self.freedom_ n * self.freedom_ jP[index_i][index_j] inte_jerk_square[i][j] / (time_allocations[n] ** 5)P P * 2P sparse.csc_matrix(P)# 一次项系数q np.zeros((self.dim_ * segment_num * self.freedom_,))# 构建约束条件equality_constraints_num 5 * self.dim_ 3 * (segment_num - 1) * self.dim_inequality_constraints_num 0for polygon in polygons:inequality_constraints_num self.freedom_ * len(polygon.hyper_planes_)A np.zeros((equality_constraints_num inequality_constraints_num, self.dim_ * segment_num * self.freedom_))lb -float(inf) * np.ones((equality_constraints_num inequality_constraints_num,))ub float(inf) * np.ones((equality_constraints_num inequality_constraints_num,))# 构建等式约束条件起点位置、速度、加速度终点位置、速度连接处的零、一、二阶导数# 起点x位置A[0][0] 1lb[0] start_state[0]ub[0] start_state[0]# 起点y位置A[1][segment_num * self.freedom_] 1lb[1] start_state[1]ub[1] start_state[1]# 起点x速度A[2][0] -5 / time_allocations[0]A[2][1] 5 / time_allocations[0]lb[2] start_state[2]ub[2] start_state[2]# 起点y速度A[3][segment_num * self.freedom_] -5 / time_allocations[0]A[3][segment_num * self.freedom_ 1] 5 / time_allocations[0]lb[3] start_state[3]ub[3] start_state[3]# 起点x加速度A[4][0] 20 / time_allocations[0]**2A[4][1] -40 / time_allocations[0]**2A[4][2] 20 / time_allocations[0]**2lb[4] start_state[4]ub[4] start_state[4]# 起点y加速度A[5][segment_num * self.freedom_] 20 / time_allocations[0]**2A[5][segment_num * self.freedom_ 1] -40 / time_allocations[0]**2A[5][segment_num * self.freedom_ 2] 20 / time_allocations[0]**2lb[5] start_state[5]ub[5] start_state[5]# 终点x位置A[6][segment_num * self.freedom_ - 1] 1lb[6] end_state[0]ub[6] end_state[0]# 终点y位置A[7][self.dim_ * segment_num * self.freedom_ - 1] 1lb[7] end_state[1]ub[7] end_state[1]# 终点x速度A[8][segment_num * self.freedom_ - 1] 5 / time_allocations[-1]A[8][segment_num * self.freedom_ - 2] -5 / time_allocations[-1]lb[8] end_state[2]ub[8] end_state[2]# 终点y速度A[9][self.dim_ * segment_num * self.freedom_ - 1] 5 / time_allocations[-1]A[9][self.dim_ * segment_num * self.freedom_ - 2] -5 / time_allocations[-1]lb[9] end_state[3]ub[9] end_state[3]# 连接处的零阶导数相等constraints_index 10for sigma in range(self.dim_):for n in range(segment_num - 1):A[constraints_index][sigma * segment_num * self.freedom_ n * self.freedom_ self.freedom_ - 1] 1A[constraints_index][sigma * segment_num * self.freedom_ (n1) * self.freedom_] -1lb[constraints_index] 0ub[constraints_index] 0constraints_index 1# 连接处的一阶导数相等for sigma in range(self.dim_):for n in range(segment_num - 1):A[constraints_index][sigma * segment_num * self.freedom_ n * self.freedom_ self.freedom_ - 1] 5 / time_allocations[n]A[constraints_index][sigma * segment_num * self.freedom_ n * self.freedom_ self.freedom_ - 2] -5 / time_allocations[n]A[constraints_index][sigma * segment_num * self.freedom_ (n1) * self.freedom_] 5 / time_allocations[n 1]A[constraints_index][sigma * segment_num * self.freedom_ (n1) * self.freedom_ 1] -5 / time_allocations[n 1]lb[constraints_index] 0ub[constraints_index] 0constraints_index 1# 连接处的二阶导数相等for sigma in range(self.dim_):for n in range(segment_num - 1):A[constraints_index][sigma * segment_num * self.freedom_ n * self.freedom_ self.freedom_ - 1] 20 / time_allocations[n]**2A[constraints_index][sigma * segment_num * self.freedom_ n * self.freedom_ self.freedom_ - 2] -40 / time_allocations[n]**2A[constraints_index][sigma * segment_num * self.freedom_ n * self.freedom_ self.freedom_ - 3] 20 / time_allocations[n]**2A[constraints_index][sigma * segment_num * self.freedom_ (n1) * self.freedom_] -20 / time_allocations[n 1]**2A[constraints_index][sigma * segment_num * self.freedom_ (n1) * self.freedom_ 1] 40 / time_allocations[n 1]**2A[constraints_index][sigma * segment_num * self.freedom_ (n1) * self.freedom_ 2] -20 / time_allocations[n 1]**2lb[constraints_index] 0ub[constraints_index] 0constraints_index 1# 构建不等式约束条件for n in range(segment_num):for k in range(self.freedom_):for hyper_plane in polygons[n].hyper_planes_:A[constraints_index][n * self.freedom_ k] hyper_plane.n_[0]A[constraints_index][segment_num * self.freedom_ n * self.freedom_ k] hyper_plane.n_[1]ub[constraints_index] np.dot(hyper_plane.n_, hyper_plane.d_)constraints_index 1assert(constraints_index equality_constraints_num inequality_constraints_num)A sparse.csc_matrix(A)# 进行qp求解prob osqp.OSQP()prob.setup(P, q, A, lb, ub, warm_startTrue)res prob.solve()if res.info.status ! solved:raise ValueError(OSQP did not solve the problem!)# 根据参数进行轨迹解析trajectory_x_params, trajectory_y_params list(), list()for n in range(segment_num):trajectory_x_params.append(res.x[self.freedom_ * n: self.freedom_ * (n1)])trajectory_y_params.append(res.x[segment_num * self.freedom_ self.freedom_ * n: segment_num * self.freedom_ self.freedom_ * (n1)])piece_wise_trajectory PieceWiseTrajectory(trajectory_x_params, trajectory_y_params, time_allocations)return piece_wise_trajectory 小结 这篇文章介绍了带软硬约束的轨迹优化算法框架。第一部份介绍了软硬约束对应到最优求解问题数学上如何表示。第二部份介绍了贝赛尔曲线的代码实现给出了具体的代码实现和讲解并针对没有障碍物场景只给定waypoint点生成光滑的Bezier轨迹的朴素求解代码实现。第三部份给出了带障碍物情况下如何做最优化求解如何通过代价函数的方式来给轨迹施加推力让轨迹远离障碍物的代码实现。第四部分是一个综合性的例子把软硬约束最优轨迹生成的求解框架做了一个综合呈现。详细的介绍了如何利用障碍物地图生成最大可行区域的凸包走廊如何利用Bezier曲线的特性给定凸包两点生成路径一定在凸包中以及如何利用代价行数来保证轨迹的光滑性、安全性通过等式、不等式约束实现轨迹必须经过哪些点某个点的运动状态如何。 这一系列的文章已经进入结尾的阶段后面会简单介绍在碰到移动的物体时候单机器人如何处理以及在多个机器人运行环境如何协同最后会给出一个Motion Planning的综合实现例子讲解实际环境数据输入、前端规划、后端轨迹生成。至于定位和感知部分的内容后面可以根据情况而定是否在开一个新的系列来讲解介绍对于更前沿的技术点会跟进论文做些文章分享。 最后本系列文章的代码在以下git链接这部分代码相对零碎主要是配合文章理论来讲的里面很多片段直接来源于网络整合。后面这可项目会持续维护把项目代码应该是c实现更体系、整合进来根据需要在看看有没必要整合出一个库。 #Bridging the Gap 作者研究了已经建立的 U-Net 肿瘤分割框架在训练来自低资源设置的 MRI 数据以及将其推广到较低分辨率和数据质量方面的能力并探讨了在资源有限的情况下实现这些框架的可行性。作者的策略是复制一个 BraTS 挑战基准模型以研究仅包含低分辨率数据的外部数据集的分割预测受到训练数据组成的影响。UNet在新年就又开始大展身手了广泛接触局部微调让UNet无所畏惧 肿瘤分割模型的一个关键挑战是能够适应各种临床环境特别是在应用到 poor 质量的神经影像数据时。围绕这种适应性的不确定性源于缺乏代表性的数据集导致在 Sub-Saharan Africa (SSA) 地区常见于 MRI 数据中的常见伪影的顶级性能模型没有暴露。 作者复制了一个在 2022 年 BraTS 竞赛中获得第二名的框架以研究数据集组成对模型性能的影响并通过使用 BraTS-Africa 数据只训练模型train_SSAN60仅使用 BraTS-成人胶质瘤数据train_GLIN1251将两者都在一起训练train_ALLN1311以及使用 BraTS-Africa 数据进一步训练 train_GLI 模型train_ftSSA。值得注意的是仅在较小的低质量数据集上训练train_SSA得到的结果不佳而在仅在较大的高质量数据集上训练train_GLI在低质量验证集上难以区分水肿组织。最具有前景的方法train_ftSSA是先在高质量神经影像上预训练模型然后在较小的低质量数据集上进行微调。 这种方法超过了其他方法在 MICCAI BraTS Africa 全球挑战外部测试阶段排名第二。这些发现强调了改进分割性能的重要性即更大的样本量和广泛的数据接触。此外证明了通过使用更广泛的数据进行局部微调可以改善此类模型的性能。 Introduction 癌症的负担逐年上升这主要影响低收入和中等收入国家LMICs因为这些国家在影像技术以及专家方面的限制这对于早期诊断和成功治疗至关重要。准确的肿瘤分割为治疗决策提供了重要信息从而影响了患者的生存率。在颅内肿瘤中胶质瘤具有高度异质性尽管在神经肿瘤领域取得了相当大的进展但预后仍然较差。胶质瘤的形状、大小、边界、强度分布和体积波动都为使用磁共振成像MRI进行精确分割带来了挑战。MRI 是脑肿瘤的标准治疗和首选成像模式。 尽管它具有优势但在低资源环境中仍需解决各种挑战特别是在撒哈拉以南非洲SSA等地区例如缺乏高场磁共振扫描仪的可用性以及获取、分析和解释 MRI 数据的合格专家短缺这导致肿瘤诊断的延迟。此外由于 SSA 的相对较差的医疗保健系统、社会经济地位以及疾病通常在 SSA 中的晚发性这进一步恶化了预后并维持了 SSA 的高死亡率。这些因素继续推动颅内肿瘤早期诊断和及时干预的需求。因此开发能够在各种临床设置上表现良好的精确自动脑肿瘤分割模型在全球范围内具有重要意义。 近年来脑肿瘤分割领域有了很大的发展旨在克服依赖领域专业知识、主观性、对噪声和强度非均匀性的敏感性等限制。机器学习技术特别是深度学习在这个领域处于前沿在肿瘤组织、周围水肿和正常组织之间的分割精度方面取得了显著的改进。卷积神经网络CNNs和自动编码器的结合是目前最好的方法已经逐渐减少了依赖领域专业知识和复杂特征提取方法。 具体来说U-Net模型在自动化脑肿瘤分割任务中已经确立了自己作为黄金标准的地位。为了进一步提高效率、准确性和普遍性已经提出了几种对U-Net的改进。然而由于医疗领域的伦理问题和数据隐私规定用于深度学习模型泛化的神经影像数据集是有限的。 自从 BraTS 挑战赛成立以来已经从多参数mp-MRI 扫描的全球贡献中观察到了显著的脑患者数据增长其中包含约 4,500 例标注的公开可用脑肿瘤数据集。通过这种合作开发的标准化的自动脑肿瘤分割基准已经显著推动了该领域的创新架构和训练程序的发展。然而尽管表现出色但仍然不确定这些顶级表现的方法是否可以有效地应用于来自撒哈拉以南非洲SSA人群的数据因为这些人群的 MRI 图像质量仍然较差。这主要是由于缺乏代表性的数据集再加上不同设置之间的图像获取参数的巨大差异这使得泛化面临着挑战。当前的基准主要是基于高分辨率脑 MRI 在高收入国家的标准资源丰富的临床设置中获得的并包括图像预处理步骤这些步骤可能不会让模型暴露于 SSA 常见于常规临床扫描中的伪影。 当前最先进的框架之一是由 Isensee 等人开发的 nn-UNet它提供了一个强大的肿瘤分割流水线能够适应各种成像模式和结构 [28]。该框架通过将不同 U-Net 基于架构的预测进行集成强调了建模决策的重要性如预处理、数据增强流水线和超参数调优方法。Zeineldin 等人最近表明对来自撒哈拉以南非洲SSA的较小外部测试数据集的期望-最大化集成的 DeepSeg、nn-UNet 和 Deep-SCAN U-Net  Pipeline 表现良好对于整个肿瘤WT、肿瘤核心TC和增强肿瘤ET分别实现了 Dice 分数系数DSC0.9737、0.9593 和 0.9022以及 Hausdorff 距离95%(HD95) 分数低于 3.32 的所有子区域。 然而在具有与训练数据相似特性的外部数据集上的测试并未表现出色它们的集成方法与 nn-UNet 基础模型的独立运行之间的验证结果差异微小~0.005U6.0p0.7。这可能进一步强调在模型训练期间增加相关数据表示的简单框架以及更激进的数据增强和精心选择的后处理方法可能有助于在各种数据集上实现相似性能的模型开发并可立即在低资源环境中应用。其中增加模型训练期间相关数据表示尤为重要。 今年首次将 BraTS 挑战扩展到包括来自低资源设置的多模态 MRI 训练数据。在这项工作中作者研究了已经建立的 U-Net 肿瘤分割框架在训练来自低资源设置的 MRI 数据以及将其推广到较低分辨率和数据质量方面的能力并探讨了在资源有限的情况下实现这些框架的可行性。鉴于挑战的目标是创建一个多功能的基准模型作者优先考虑与顶级表现方法建立可比指标作为参考而不是引入复杂的增强。作者的策略是复制一个 BraTS 挑战基准模型以研究仅包含低分辨率数据的外部数据集的分割预测受到训练数据组成的影响。 Methods Data Description 本研究中使用的数据集来源于 BraTS 2023 挑战赛的数据。训练、验证和测试数据集包括来自 1565 名术前成人胶质瘤患者的 mp-MRI 扫描其中 1470 例来自现有的 BraTS 数据BraTS-Adult Glioma如前文所述另外 95 例来自撒哈拉以南非洲SSABraTS-Africa 。这些是作为标准护理的一部分在各种机构获得的典型临床扫描导致成像质量存在显著差异。每个病例包括 T1 加权T1、术后钆对比 T1 加权T1Gd、T2 加权T2和 T2 液体衰减反转恢复T2-FLAIR。 图 1 显示了来自每个数据集的患者的样本切片, 强调 BraTS-Adult Glioma 和 BraTS-Africa 之间的数据质量的巨大差异。BraTS-Africa 数据集是通过一个非洲成像中心网络收集的, 得到了非洲 MRI 教育和研究推进联盟CAMERA的支持和 Lacuna 基金在健康公平性方面的资金。在每个病例中, 基于图像的肿瘤子区域的真实标注通过迭代过程生成和批准。 Selecting a Framework 自 nn-UNet  Pipeline 开发以来它已经经历了几次修订主要集中在训练参数上而不是架构本身。表 1行 1-3显示了 2017 年原始 nn-UNet 模型以及 Isensee 等人随后的 BraTS 挑战中提交的修订模型其中它在 2018 年获得第二名在 2020 年获得第一名。nn-UNet 有效地解决了在设计更改和选择最佳表现集成时手动考虑相互依赖性的挑战。 然而参加 2021 年 BraTS 挑战的一些团队表明nn-UNet  Pipeline 中的基本 3D U-Net 组件可以优化以在脑肿瘤分割任务上获得良好性能而不需要运行涵盖 nn-UNet  Pipeline 的整个网络集成。这些团队的比较结果见表 1第 4-7 行显示外部验证结果主要表明当样本数量保持不变时整体模型性能存在轻微差异。与使用不同较小样本大小训练的三个 nn-UNet 提交结果的多样性能相比这可能进一步强调了用于训练分割模型的样本大小的重要性以及其对模型性能的影响。 在选择时, 作者考虑了简单性和有效性, 因为在资源有限的环境中更容易进行复制, 对长期将模型本地化到资源受限的环境更有益。除了样本大小外, Futrega 等人表明, 改变网络架构对整体肿瘤分割性能的影响很小。具体来说, 他们表明, 改变网络层 (例如, 残差连接、多头自注意力或集成不同的架构例如, 具有自编码器或基本 U-Net 的残差 U-Net 与视觉 Transformer与基本 3D U-Net 架构子区域平均 Dice 分数约为 0.002 相比仍然具有可比性。 Data Pre-Processing 所有数据都在挑战组织者的初始预处理后提供以确保在公共数据共享之前删除所有受保护的健康信息。BraTS 标准化的流水线详细描述在 [3, 25] 中使用预处理步骤包括将 DICOM 文件转换为 NifTI 格式以删除所有个人患者元数据去头骨以毁损神经影像扫描与 SRI24 解剖模板进行配准 最后重采样到统一的 1mm3 等向同性分辨率见 [11] 中的内容。然后作者按照 OptiNet 流水线的描述执行了几个额外的预处理步骤。这些步骤包括将所有模态的体积堆叠裁剪冗余背景 Voxel 以减少计算成本对非零区域进行归一化并添加一个前景的 one-hot 编码通道以区分肿瘤和非肿瘤区域。这最终得到了一个形状为 (5, 240, 240, 155) 的输入张量其中通道分别表示 4 个模态和 one-hot 编码层。 OptiNet Pipeline and Experiments OptiNet 主要调整 nn-UNet 框架涉及与数据预处理相关的建模选择实现的数据增强应用的损失函数区域性累加二进制交叉熵和 Dice 损失以及几个后处理步骤。应用的数据增强包括空间变换大小为 128x128x128 的随机裁剪和随机翻转和与强度相关的变换高斯噪声、高斯模糊、亮度变化并在训练期间实现。 Yousef 等人 [38] 提供了关于基本 U-Net 架构的详细综述简而言之它由一个标准的 CNN卷积神经网络的收缩编码器路径和一个结合了卷积层特征图和三线性插值上采样器的解码器路径组成用于降采样和上采样。在 OptiNet 版本中编码器由一个标准的 CNN 组成与一个结合了卷积层特征图和三线性插值上采样器的解码器相结合。裁剪后的体积大小为 128x128x128同时保留上下文通过跳过连接在编码器和解码器之间减少信息损失帮助解码器恢复图像分辨率和空间结构。 图 2 显示了作者在实验中使用的模型架构根据提供的公开笔记本 [4] 复制。Futrega 等人 [37] 对 nn-UNet 默认的 UNet 架构进行了轻微的修改例如通道大小上采样技术等。Futrega 和同事在 2021 年 [35] 和 2022 年 [37] 的论文中详细介绍了他们探索的所有架构和非架构调整。 值得注意的是他们发现结合其中一些变化与附加的 one-hot 编码通道约 0.0026p0.5见 [35] 中的表 3只会稍微增加平均 Dice 分数。 作者进行了四项实验使用 OptiNet 流水线并改变训练数据集的组成。作者用 1仅使用 BraTS-Africa 数据进行训练_train_SSA_N602仅使用 BraTS-成人胶质瘤数据进行训练_train_GLI_N12513同时使用两者进行训练_train_ALL_N13114进一步使用 BraTS-Africa 数据训练 train_GLI 模型_train_figSSA_。_train_figSSA_ 模型用于估计在非洲局部微调预训练基准模型的可行性。 所有训练和验证都在 Compute Canada 提供的高性能计算集群上使用 Pytorch 1.9 进行的集群上有一台 NVIDIA T4 Turing16GB GDDR6 内存或 NVIDIA V100 Volta16GB/32GB HBM2 内存显卡根据集群上的可用性而定。所有训练都使用内部验证程序使用训练数据集的划分。由于时间和计算限制作者将包含更大 BraTS-成人胶质瘤数据集的模型在每轮上分别训练 100 遍。对于仅包含较小 BraTS-Africa 数据集的模型_train_SSA_ 和 _train_figSSA_训练设置为最大 150 轮/轮采用 5 倍交叉验证和当内部验证 Dice 分数在 100 轮内没有改善时采用的早期停止策略。表 2 显示了每轮训练中获得的平均 Dice 分数。每个实验的外部验证预测使用了每个轮内部验证集上的最佳 Dice 分数。 3 Results 以下是针对每个训练变体的性能指标描述通过挑战在线评估系统计算的验证分数。系统提供的指标见表 3是病灶相关的 Dice 分数系数DSC和 Hausdorff 距离95%HD95平均值跨 15 个用于 BraTS-Africa 2023 验证阶段的患者样本。没有提供真实分割然而数据集的较小尺寸允许对所有验证主题生成的分割掩膜进行更详细的审查。本文中呈现的图像是作者模型在选定验证案例上生成的分割。所有分割都由如前述描述的用于标注的非生物标签表示其中 ED 是绿色ET 是蓝色NCR 是红色。 正如预期仅用 60 个样本训练模型(train_SSA)是不够的大多数验证分割都是在机会水平上获得的50%。为了在类似的数据上提供性能估计以及与其他训练集组成的比较提交了仅用一次折叠训练 100 个 epoch 的低分辨率 Naive train_GLI 模型进行验证该模型在包含 219 个胶质瘤患者的 Task 1BraTS-成人胶质瘤和 Task 2BraTS-非洲验证数据集上表现相对良好平均 Dice 分数分别为 79.81、82.12、78.48 和 54.04、28.80、42.90对应 WT、TC 和 ET 的 HD95。 在 Task 2 验证数据上肿瘤子区域平均性能指标也很好。由于计划将其用作使用 SSA 数据进一步训练的前训练基础并检查内部验证损失表明其正在稳定作者认为该模型足够用于后续使用 BraTS-Africa 数据进行微调。使用 BraTS-成人胶质瘤数据与 BraTS-非洲数据在 5 倍训练过程中进行微调导致子区域上的平均 Dice 分数相似。 进一步研究子区域性能显示尽管具有相同的平均 DSC但 train_GLI 和 train_fISSA 模型在不同子区域上的表现有所不同。_train_GLI_ 模型在区分肿瘤组织和非肿瘤组织方面存在困难40% 的案例实现了低于机会 DSC。相反_train_fISSA_ 模型在这个区域表现良好但在 ET 区域上存在困难26% 的受试者得分低于机会。ET 子区域通常是最难精确分割的因为其大小和与周围子区域的重叠。HD95 也提供了更清晰的指示以评估模型在小型或低质量分割和轮廓重要时的性能。 查看这些分数的差异作者看到 train_fISSA 模型平均能够比 train_GLI 模型更好地预测整个肿瘤边界HD95 约 63 个单位较低。相反_train_GLI_ 模型在平均上比 train_fISSA 模型更好地区分 ET 子区域HD95 约 40 个单位较低。图 3 显示了这些差异明显的情况。 确定了一个异常案例其中所有模型在准确分割 TC 子区域平均 DSC 范围 22.33-49.04方面存在困难这可能是因为在脑水肿组织中存在类似于 ET 和 TC 的像素强度这些像素强度存在于脑皮质的后部区域。这个案例对 train_fISSA 的影响大于其他模型去除这个异常案例后ET 和 TC 子区域的 DSC 分别增加了 4.13 和 3.43相应的 HD95 分别降低了 13.04 和 8.04。此外这个异常案例还展示了 train_SSA 和 train_ALL 模型在 ET 和 TC 子区域性能的改善尽管与 train_fISSA 相比较弱。 表 4 显示了平均 DSC 和 HD95 分数的完整差异比较。只有 train_GLI 模型在 TC 子区域受到了影响。此外一个案例始终在所有模型上实现极其糟糕的分割结果平均 DSC 跨子区域范围 35.40-37.02HD95 229.37-229.89如图 4 所示。  图 5 显示了一个在 ET 和 TC 分割上获得了极好分数平均 DSC 89HD95 2.00但 WT 区域没有很好分割的受试者。传统上ET 区域的准确分割更具挑战性因为它通常是一个较小的区域。整个肿瘤本身应该更容易识别。图 5 中从左到右每个模型在所示面板的 ET 和 TC 分割上的平均 DSCHD95分别为72.229.273、0.125285.335、41.33190.082和 89.491.414。从视觉上看大多数模型主要在区分水肿组织ED方面存在困难而水肿组织非常少。 在回顾所有模型性能时作者还考虑到了整个肿瘤包含水肿组织这在低分辨率扫描中更难区分。没有暴露于 SSA 的低质量数据_train_GLI_ 模型可能很难精确识别伴有广泛水肿的肿瘤的边界。因此作者将预训练了更大 BraTS-成人胶质瘤数据集并进一步在较小的 SSA 数据集_train_ftsSA_上训练的模型提交了外部测试数据集该数据集包括来自 SSA 的 20 名患者的扫描。在这个未见过的外部测试数据集上该模型表现良好在全球范围内排名第二。在撰写本文时测试阶段获得的最终 DSC 和 HD95 分数尚未公开。 4 Discussion 综上所述作者的实验结果强调当前最先进的模型不能直接应用于 SSA 数据因为可用的训练数据有限会导致模型过拟合。作者的最终模型在单预训练 100 个 epoch 和 5 倍交叉验证的微调上表现出色。然而Futrega 等人表明10 倍交叉验证允许实现更准确的分割性能。作者只验证了 train_SSA 和 train_ftsSA 的 5 倍交叉验证并在 train_ALL 和 train_GLI 模型上未进行交叉验证。因此更广泛的交叉验证可能产生更准确的模型比较。 然而作者的最终模型的高排名性能重申了以前在模拟案例中表明的内容通过联邦学习最先进的模型可以通过使用来自不同区域的大量数据进行改进这使得低资源设置的机构可以在不从外部来源获取数据的情况下在较小的本地数据集上重新训练。然而这些结果需要谨慎解释因为训练和验证数据集的样本量有限。 此外未来的工作应包括集成来自非洲不同区域的更广泛的数据集并在使用高质量 MRI 扫描进行训练时实施与扫描器伪影相关的更强大的数据增强。这些步骤对于开发能够跨各种临床设置看到的图像质量进行泛化的模型至关重要。 #Fus-MAE 一种基于Mask自编码器的自监督学习框架Fus-MAE它使用交叉注意力在合成孔径雷达和多光谱光学数据之间进行早期和特征 Level 的数据融合。 自监督表示学习框架最近在遥感和传感器社区中引起了兴趣因为它们有可能减轻制作大型卫星图像数据集的高昂标签成本。在多模态数据融合领域虽然经常使用的对比学习方法可以帮助弥合不同传感器类型之间的域间隙但它们依赖于需要专业知识和仔细设计的数据增强技术尤其是对于多光谱遥感和数据。一种可能的但很少研究的绕过这些限制的方法是使用基于Mask图像建模的预训练策略。 在本文中介绍了一种基于Mask自编码器的自监督学习框架Fus-MAE它使用交叉注意力在合成孔径雷达和多光谱光学数据之间进行早期和特征 Level 的数据融合这两种模态具有显著的域差异。 实证结果表明Fus-MAE可以有效地与针对SAR-光学数据融合的自定义对比学习策略相竞争并在更大的语料库上训练的其它Mask自编码器框架之上表现出色。 1 Introduction 近年来多模态学习越来越受到关注因为有许多模态如RGB-Depth或文本图像。值得注意的是最近的研究已经为深度多模态学习相对于单模态的性能优势提供了理论依据。在遥感领域的数据融合领域有两种模态被广泛研究合成孔径雷达SAR和光学影像。确实这些模态本质上是互补的SAR数据具有全天候和穿透云的能力但存在斑点噪声使得其解释具有挑战性。另一方面光学数据虽然受到天气和季节性约束但具有自然感例如RGB和较少的噪声图像有利于解释。因此它们的结合对于土地覆盖分类等任务是相关的并为云去除和SAR去斑等应用打开了大门。 自监督学习SSL在各个机器学习领域引起了广泛关注如自然语言处理NLP和计算机视觉。其中一种关键特征是它能够在不需要 Token 数据的情况下学习强大的表示这在遥感领域尤其有趣因为数据标注可能代价高昂通常需要特定领域的专业知识。 近年来大规模的公共SAR-光学数据集如SeCoBigEarthNet-MMSEN12MS和最近SSL4EO-12的出现推动了SAR-光学融合的SSL方法的研究。然而现有的大多数研究倾向于对比学习虽然有效但存在一些局限性。这些包括依赖于数据增强需要仔细设计以适应遥感图像RSI的特定性以及需要负样本这需要较大的批量大小。 近年来在Mask图像建模MIM方面取得了某些视觉表示学习任务的新状态。尽管MIM避免了对比学习的上述缺陷但据作者所知使用MIM进行遥感图像RSI数据融合的文献仍然相对较少。在本文中作者探索了这种替代的预训练方法用于自监督学习数据融合贡献可以总结如下 1.提出了FusMAE这是一种基于自监督和MAE的框架能够实现早期级和特征级的数据融合。 2.通过实证方式证明了基于交叉注意力的早期融合策略是最适合预训练SAR-光学数据进行土地覆盖分类任务的策略。 3.展示了FusMAE模型可以在某些最先进的对比学习方法上与针对RSI数据融合的最近方法相竞争。 2 Related Works 在遥感领域中的自监督学习- 根据文献自监督学习方法可以分为三类 生成方法其中预任务是在像素级重构被破坏的信号例如降采样或Mask预测方法其中目标是通过预任务例如预测图像中两个块的相对位置或灰度到RGB着色学习语义上下文特征对比学习方法该方法传统上旨在创建一个嵌入空间其中相同实例的视图被拉近正视图而不相关的视图被拉远负视图。 对于SAR-光学数据融合大部分研究努力都倾向于后者Chen和Bruzzone研究了SAR和光学图像的早期、中期和晚期融合通过联合训练两个ResUnets和一个多视对比损失。Montanaro等人使用了SimCLR框架将不同模态的嵌入拉近。Wang等人适应了基于知识蒸馏的DINO框架该框架不需要负样本从而省去了需要大型批处理的需求。尽管这些对比方法都相当成功但它们需要精心设计数据增强 Pipeline 来创建正视图其质量很难评估。为了绕过这个挑战作者选择专注于不需要数据增强的生成方法Mask图像建模。 在遥感领域中的Mask图像建模- He等人[9]最近提出了一种去噪自动编码器DAE架构的变体其中输入图像块以高 Mask 比例随机 Mask 只留下少量输入块输入到Transformer编码器中。然后浅层解码器使用获得的潜在和 Mask  Token 来重建图像。被称为 Mask 自动编码器MAE的框架在ImageNet-1K上设置了新的最先进状态同时由于处理输入 Token 数量较少和轻量级解码器训练时间大大缩短。Cong等人将该架构适应光学数据通过添加多域编码例如位置时间或位置光谱。Sun等人在2M光学图像数据集上训练了一个基于MAE的模型并声称在各种RS数据集上实现了最先进性能。Allen等人跟进了一项与SAR图像类似的工作。 然而尽管在自然领域对Mask图像建模的数据融合方面进行了许多 recent advancements但SAR-光学方面的文献较少有些尝试通过在通道轴上堆叠SAR和光学数据来训练MAE以及一些关于专业 Mask 策略的研究。在本文中提出了一些架构变化来研究早期、中期和晚期融合策略为未来研究铺平道路。 3 Methodology 作者的工作受到了MultiMAE的启发MultiMAE是一种基于Mask自动编码器的架构在自然图像上具有已被证明的记录其混合流式架构可以接受不同的模态作为输入。在本节中通过在第3.1节中提出需要多任务编码器在第3.2节中提出需要多任务解码器来描述Fus-MAE架构。考虑了两种 Mask 策略其中详细内容在3.3节中提供。整体架构如图1所示。 Multi-modal encoder Multi-task decoder Masking strategies 作者提出研究两种 Mask 策略独立 Mask 和一致 Mask 。遵循MAE的方法应用了75%的 Mask 比例并在各个模态上均匀地采样作者的块。 独立 Mask - 在RS领域中的MiM文献中跨模态的独立 Mask 被广泛采用因为它可以捕获模态之间的内相关性和跨相关性。遵循这种策略作者在各个模态上以均匀的方式随机采样作者的 Mask 块。 一致 Mask  - 作者还研究了一种一致 Mask 策略其中跨模态的 Mask 块相同。作者的假设是由于SAR和光学数据的域间隙捕获跨模态相关性比捕获模态内相关性更容易。通过确保作者向各个模态提供表示相同块的 Token 作者可以减少注意力层捕获跨模态信息时的困难。 4 Experiments and Results 为了研究两种不同的融合策略作者预训练了两个Fus-MAE实例仅执行特征级融合的Fus-MAE w/ XAD以及同时执行早期和特征级融合的Fus-MAE w/ XAED。在BigEarthNet训练分割的354,196张图像上训练Fus-MAE使用AdamW优化器批处理大小为200共100个Epoch。在前10个Epoch中学习率逐步升温到然后使用余弦计划进行衰减。  作者在2台NVIDIA RTX 3090Ti上训练Fus-MAE大约需要60小时。将ImageNet初始化作为 Baseline 并使用两个专门为SAR-光学数据融合设计的基于Transformer的预训练模型来完成作者的基准测试分别代表最近对比学习研究的DINO-MM和SATVIT以及分别代表Mask图像建模的近期研究。 多标签分类 - 为了评估预训练策略的有效性在预训练的编码器顶部附加一个线性分类头。在10个Epoch中微调模型使用PyTorch的MultiLabelSoftMargin Loss和AdamW优化器并报告测试分割上的平均平均精度mAP得分。 表1总结了这些微调实验的结果其中分类器在单模态数据S1或S2或多模态数据S1S2上进行训练。值得注意的是与其它架构相比Fus-MAE展示了优越的性能对于S2和S1S2mAP提高了大约2个百分点而Fus-MAE w/XAED略有优势。 然而值得注意的是在所有架构中使用仅SAR数据S1的mAP显著低于使用S2或S1S2时的情况这表明所有模型在S1S2场景中主要依赖光学数据进行预测。 此外为了评估在标签和资源稀缺条件下学习的表示的质量在训练标签的1%上进行线性评估。在这种情况下线性块投影和编码器权重被冻结只允许学习线性分类器的权重。在AdamW优化器的支持下训练这个分类器20个Epoch批量大小为128。结果也在表1中报告与其它SSL架构相比性能提高更大突显了Fus-MAE学习的表示的质量。 迁移学习 - 为了研究泛化能力作者在另一个下游任务上进行线性评估在SEN12MS数据集上进行单模态土地覆盖分类。由于这个数据集的不平衡性质使用加权平均方法计算精确度、召回率和F1-score。在AdamW优化器的支持下训练这个分类器10个Epoch批量大小为256使用Timm的LabelSmoothingCrossEntropy损失。与之前实验类似的实验设置下的基准测试结果报告在表2中。Fus-MAE在所有跟踪指标上均优于其他技术尽管优势较小。 5 Conclusion 在本文中提出了Fus-MAE这是一个新颖的用于SAR-光学数据融合的自监督学习框架。基于MAE架构它使用在不同阶段两个数据流之间的交叉注意力来执行早期和特征级数据融合。 Fus-MAE在各种下游任务上超过了最近对比学习和基于MIM的工作证明了使用交叉注意力描述具有较大域间隙的模态之间跨模态交互的有效性。可以进一步研究将作者的交叉注意力层扩展到超过2个模态并使Fus-MAE在各个模态上的预测依赖更加均衡。 #Weight Selection 作者提出了一种称为权重选择 (Weight Selection) 的方法这是一种从预训练好的大模型中选择权重来初始化较小模型的方法。Weight Selection 把知识从预训练好的权重迁移到更小的模型中。权重选择用大神经网络的权重初始化小神经网络 权重初始化是神经网络训练中的一个古老而又永恒的话题。对于从头训练的神经网络而言有很多权重初始化的方法。近年来大模型的出现为这一经典的科研课题带来的新的机会。 在本文中作者提出了一种称为权重选择 (Weight Selection) 的方法这是一种从预训练好的大模型中选择权重来初始化较小模型的方法。Weight Selection 把知识从预训练好的权重迁移到更小的模型中。 本文的实验结果表明Weight Selection 可以显着提高小模型的性能并减少它们的训练时间。而且值得一提的是它可以与知识蒸馏方法一起使用。Weight Selection 提供了一种在资源受限的环境中借助预训练模型强大力量的新方法本文希望它可以使大模型时代训练小模型的有用工具。 1 用大神经网络的权重初始化小神经网络 论文名称Initializing Models with Larger Ones 论文地址https//arxiv.org/pdf/2311.18823.pdf 1 Weight Selection 论文解读 1.1 重新思考神经网络初始化 神经网络权重的初始化 (Weight Initialization) 对其后续的优化过程至关重要。合适的初始化权重可以有助于模型的收敛以及防止梯度消失的问题。当前有两种比较著名的初始化技术Xavier 初始化[1]和 Kaiming 初始化[2]在神经网络的训练中发挥了重要作用。它们至今为止仍然是 PyTorch 等现代深度学习库的默认方法。 这些方法是为从随机初始化进行训练的神经网络研发的在当时是很常见的做法。然而在大模型时代由于社区的集体努力很容易获得各种预训练模型。一般而言这些预训练模型背后的数据集包含 ImageNet-21K[3]和 LAION-5B[4] 等等。因此从这些预训练模型进行微调而不是从头开始训练模型通常被认为是当今时代的首要选择如下图1所示。 然而这些预训练的大模型在资源需求上可能令人望而却步严重阻碍了它们在资源受限设备 (比如移动设备) 上的使用。对于很多预训练模型族 (model zoo)即使是最小的模型在某些情况下也可以被认为非常大。比如MAE[5]和CLIP[6]模型两者的最小预训练 Transformer 模型是 ViT-Base[7]模型包含 80M 参数量。对于边缘设备的应用来说这已经太大了最小的 LLaMa[8]模型甚至大 100 倍包含 7B 参数量。由于可以直接使用的预训练模型很少开发人员必须在目标数据集上面从头开始训练模型以适应他们的需求。这种方法错过了使用大型预训练模型的机会。这有点可惜因为大模型的知识是从大数据集里面好不容易学到的不加以合理利用就有点可惜了。 图1大模型时代预训练权重为小模型的学习带来新的生机 1.2 本文贡献 本文作者通过引入一种权重初始化 (Weight Selection) 技术来解决上面的问题该方法使用预训练大模型来训练小模型。具体而言本文提出一种 Weight Selection 技术选择来自预训练大模型的权重子集来初始化较小的模型也就是允许大模型学习到的知识通过其权重转移到小一点的模型里面。 而且由于现代神经网络的模块化设计权重选择只涉及3个简单的步骤Layer Selection, Component Mapping, 和 Element Selection。该方法可以应用于与大模型相同的模型族中的任何小模型。使用权重选择来初始化小模型很简单并且与从头开始训练相比没有任何额外的计算成本。即使对于大模型训练也很有用比如使用来自 LLAMA-30B 的训练权重初始化 LLAMA-7B。 1.3 Weight Selection 方法介绍 给定一个预训练模型Weight Selection 的目标是在同一个模型族 (model zoo) 中为小一点的模型找到更高效的初始化如下图2所示。将预训练的大模型称为 Teacher小一点的模型称为 Student。 由于现代神经网络架构通常遵循模块化方法即堆叠很多相似的 layer 来构建最终的模型 (主要目的是为了方便模型的可扩展性)。因此在选择 Teacher 中的权重来初始化 Student 模型时就可以借助这个特点节约很多力气。 在本文中作者通过3步来实现权重选择Layer Selection, Component Mapping, 和 Element Selection。 Layer Selection 就是选择 Teacher 中的哪一层来初始化 Student 模型。 对于学生模型的每一层都要选择教师模型的一层来进行初始化。学生模型分为 Isotropic 和 Hierarchical 两种架构 Isotropic 就是直筒型架构从头到尾都是相同的分辨率和特征维度。Isotropic 架构的典型代表有 ViT 和 MLP-Mixer。Hierarchical 就是金字塔式架构从开始到结束分为多个 Stage各个 Stage 之间特征分辨率逐渐降低而特征的维度逐渐升高。Isotropic 架构的典型代表有 Swin Transformer 和 ConvNeXt。 图2Weight Selection 的步骤 Component Mapping 就是选择 Teacher 中一层的哪个组件来初始化 Student 模型对应层的什么组件。 上一步获得了从教师到学生的 Layer 的映射。Component Mapping 就简化了为用一个 Teacher layer 初始化一个 Student layer。由于现代神经网络设计采用的模块化方法相同 model zoo 里面不同大小的模型的 Component 一般都是一致的只是特征的通道数不同或者说宽度不同。因此Component Mapping 就是一对一映射的关系。 Element Selection 就是选择 Teacher 中某个组件的哪部分权重来初始化 Student 中对应组件的权重。 均匀选择 (Uniform Selection) 本着简单的原则考虑默认方法是均匀选择 (Uniform Selection)即从图2中教师模型的某个权重中拿出间隔均匀的权重元素来初始化学生模型。接下来介绍下 Uniform Selection 的具体做法。 图3Uniform Selection 的伪代码 1.4 实验配置 数据集9个图像分类数据集ImageNet1K, CIFAR-10, CIFAR-100, Flowers, Pets, STL-10, Food-101, DTD, SVHN 和 EuroSAT。 模型如下图4所示。 Student 模型ViT-T/16 和 ConvNeXt-F。Teacher 模型ImageNet-21K 预训练的 ViT-S/16 和 ConvNeXt-T。 图4模型配置 训练策略如下图5, 6, 7所示本文作者遵循 ConvNeXt 的训练策略并对不同数据集的 Batch Size、学习率和 stochastic depth rate 进行调整。为了确保公平的比较作者将这套训练策略也应用于 Baseline 模型。 图5训练策略 图6ConvNeXt-F 的超参数设置 图7ViT-T 的超参数设置 1.5 实验结果 实验结果如下图8所示。在所有 9 个图像分类数据集中本文的 Weight Selection 方法都可以提高精度尤其是对于小数据集而言更是如此。值得注意的是Weight Selection 方法解决了在小数据集上训练 ViT 的难题有助于 ViT 精度的显著提高。ImageNet-1K 的训练曲线如图9所示。两种模型都受益于早期的权重选择在整个训练过程中保持这一优势。 图89个图像分类数据集实验结果 图9ViT-T 和 ConvNeXt-F 在 ImageNet-1K 上的训练曲线 1.6 与其他方法的比较 作者在 CIFAR100 数据集上面对比了其他几种初始化方法的结果如图10所示。 而且还可以发现一致性是 Weight Selection 达到最佳性能的关键。对于这两种模型架构 ViT-T 和 ConvNeXt-F均匀选择连续选择以及一致性随机选择的最终性能相似。在去除一致性时性能急剧下降。 图10与其他几种初始化方法的比较 1.7 与知识蒸馏的兼容性 权重选择 (Weight Selection) 通过参数从预训练模型转移知识。另一种流行的知识转移方法是知识蒸馏 (Knowledge Distillation)它利用了预训练模型的输出。在这里作者也探讨了这2种技术的兼容性。 实验设置作者尝试了2种知识蒸馏方案logit-based distillation 和 feature-based distillation。 图11与知识蒸馏的兼容性的实验结果 1.8 其他分析结果 权重选择可以减少训练时间。如下图12所示为作者使用权重选择方法训练不同 Epoch 数量得到的曲线与随机初始化训练 300 Epoch 的结果对比。可以看到权重选择与随机初始化训练相比CIFAR-100 的相同性能只需 1/3 个 Epoch 即可获得。 图12与随机初始化的比较 迁移学习结果对比。如下图13所示为作者希望看看先在 ImageNet-1K 上预训练多少 Epoch再在 CIFAR-100 上做 fine-tune 的结果与权重选择的结果相当。可以发现在 ImageNet-1K 上进行 60 个 epoch 的预训练之后微调可以实现与权重选择相当的性能。在这种情况下与预训练达到相同的性能相比权重选择快 6.12 倍且无需访问用于预训练的数据集。 图13预训练与微调结果比较 层的选择方案。如下图14所示为作者以 ViT-A 和 ConvNeXt-F 为学生模型ImageNet-21K 上预训练的 ViT-S 和 ConvNeXt-T 作为权重选择的教师模型。可以看到使用 \text{First-N}\text{First-N} 选择的结果最佳。用 \text{First-N}\text{First-N} 选择做初始化的层自然是连续的层而且更接近输入处理因此它们为较小的模型提供了更有效的初始化。 图14层选择方案对比 教师模型尺寸。如下图15所示为作者对比了不同尺寸教师模型的结果。可以看到教师模型大小更接近时权重选择会得到更好的结果。教师模型很大意味着将丢弃更高百分比的参数这会在权重选择过程中导致更多的信息丢失。图15的结果中有趣的是即使是使用 ViT-L 这样的模型初始化从 301M 参数中选取 5M 参数也很有效精度提升了 4.5%。  图15不同尺寸教师模型结果对比 图16与剪枝方法的对比 与模拟初始化 (Mimetic initialization[12]方案对比。如下图17所示为作者对比了权重选择方法与模拟初始化 (Mimetic initialization[12] 方法。权重选择方法大大优于模拟初始化。 图17与模拟初始化方法对比 图18注意力层可视化 #DeepDR 本项研究创新性提出了基于Weibull混合分布模型的疾病进展分析深度学习框架创造性地将糖尿病视网膜病变的进展和发生时间视为筛查区间内的随机变量通过生存分析与时序分布概率建模成功实现了对糖尿病视网膜病变进展的风险预警和时间预测。 1月4日上海交通大学电子信息与电气工程学院计算机科学与工程系/教育部人工智能重点实验室盛斌教授团队上海交通大学医学院附属第六人民医院内分泌代谢科、上海市糖尿病重点实验室贾伟平教授和李华婷教授团队清华大学副教务长、医学院主任黄天荫教授团队在国际权威刊物《Nature Medicine》《自然医学》发表题为“A deep learning system for predicting time to progression of diabetic retinopathy”用于预测糖尿病视网膜病变进展时间的深度学习系统的科研成果。该成果是医工交叉团队继2021年成功完成糖尿病视网膜病变辅助智能诊断系统“DeepDR”的研发之后进一步构建的基于时序影像序列深度学习的糖尿病视网膜并发症预警系统“DeepDR Plus。该系统可基于眼底图像精准预测糖尿病视网膜病变进展成果为推动全球糖尿病并发症的智能防控贡献了中国力量有望为全球糖尿病视网膜病变的筛防新策略的制定提供指引。 研究介绍 糖尿病视网膜病变diabetic retinopathy, DR是糖尿病最常见的微血管并发症也是全球可预防失明的主要原因。该病初期症状隐匿病情严重时可能导致永久视力损伤甚至失明。由于不同患者病情进展存在较大差异每位糖尿病病人患DR的风险和时间难以准确预测。目前以深度学习为代表的人工智能技术已被用于DR筛查然而基于眼底图像来预测DR发生风险仍是全球关注的重难点问题。在糖尿病等相关慢病诊疗和管理的临床实践流程中糖尿病患者往往只会按照相对固定的时间间隔进行筛查或随访并发症的确切发生或进展时间无法知晓这也导致传统深度学习模型无法实现疾病进展时序轨迹的精准建模进而无法预测个体的发病和进展时间点。针对这一困扰全球糖尿病管理的关键技术瓶颈与临床需求本项研究首次基于大规模医学影像纵向队列涵盖多国多种族的超20万名糖尿病患者的眼底图像和临床数据创新性提出了基于Weibull混合分布模型的疾病进展分析深度学习框架创造性地将糖尿病视网膜病变的进展和发生时间视为筛查区间内的随机变量通过生存分析与时序分布概率建模成功实现了对糖尿病视网膜病变进展的风险预警和时间预测。研究团队通过将该系统应用于中国和印度的真实临床流程证实该系统可在大幅降低筛查频率和公共卫生成本的情况下仍保持极低的漏诊率从而为将来的糖尿病并发症防控实践提供了个性化筛查和管理决策的依据。 DeepDR Plus系统概览和研究设计 早期筛查和干预对于DR的预防和管理至关重要。国内和国际组织大多建议无或轻度DR的糖尿病患者每年进行常规眼底摄片检查以便及时发现视网膜病变并进行干预。然而由于经济和医疗资源等因素的限制尤其是在中、低收入国家糖尿病患者常规眼底摄片检查的实施和普及困难重重。本研究首次实现了个体化糖尿病视网膜病变风险和时间预测DeepDR Plus系统仅根据基线眼底图像准确预测未来5年DR进展的个体化风险和时间优于传统临床参数模型。此外DeepDR Plus系统可以准确识别高、低风险人群提供了人工智能驱动的个性化的推荐随访间隔低风险患者给予相对更长时间的随访间隔建议而几乎不导致威胁视力DR的漏诊和管理策略高风险患者给予相对更严格的综合干预建议。 人工智能驱动的个性化筛查间隔纳入糖尿病视网膜病变筛查系统特别在发展中国家可以极大地提高眼底摄片筛查的效率、公平性和可及性。该研究为糖尿病视网膜病变筛查、预防和诊疗指南提供了新的证据有望对未来糖尿病视网膜病变的临床诊疗流程和医疗费用等产生重要影响在世界地图上为糖尿病智能防控贡献了中国技术和亚洲力量为一带一路及全球中低收入国家和地区的糖尿病管理模式的提质增效与改革创新开辟了新道路。 #DATM~ 作者分析了生成数据的难易以及其对压缩效果的影响发现应该根据压缩比率控制生成数据的难易。通过应用这一策略作者提出了第一个可以在低压缩率保持有效的数据集蒸馏方法并首次实现了无损数据集蒸馏。 论文题目: Towards Lossless Dataset Distillation via Difficulty-Aligned Trajectory Matching 论文地址:https://arxiv.org/abs/2310.05773 代码地址: https://gzyaftermath.github.io/DATM/ 一、背景 数据集蒸馏旨在以生成的方式将一个大的数据集压缩成一个小的数据集。得益于生成数据的高信息密度在压缩率较高时数据集蒸馏的效果远超数据集剪枝等其他数据压缩方法。 然而随着压缩率的逐渐降低现有数据集蒸馏方法的效果逐渐变差甚至弱于从原数据集中随机选取等量数据。这导致现有数据集蒸馏方法局限于高压缩率场景无法实现对原数据集的无损压缩。 在本文中作者分析了生成数据的难易以及其对压缩效果的影响发现应该根据压缩比率控制生成数据的难易。通过应用这一策略作者提出了第一个可以在低压缩率保持有效的数据集蒸馏方法并首次实现了无损数据集蒸馏。 二、动机 数据蒸馏可以看作是一个从目标数据集提取特征并将之添加到生成数据上的过程。 目前主流的数据集蒸馏方法大多通过匹配模型在目标数据集和生成数据集上的某种指标来完成特征的提取与压缩。其中基于匹配模型训练轨迹[1](Matching Training Trajectory)的方法在多个基准下达到了最优。由于该方法通过匹配模型在生成数据集和目标数据集上的训练轨迹(匹配模型参数)来进行蒸馏因此其效果受模型在目标数据集上的训练轨迹影响。 根据文献[2]可知对于分类任务而言模型倾向于在训练前期学习目标物体的简单特征而在后期学习难特征。因此我们推测匹配模型的前期轨迹就会倾向于在生成数据上添加更多的简单特征而匹配后期轨迹则会倾向于添加难特征。意识到这一点我们开始探索匹配不同阶段路径对于数据集蒸馏的影响。 图一、匹配不同阶段的轨迹的蒸馏效果 实验结果如图一所示当IPC较低(即压缩率较高)时匹配前期轨迹(即添加简单特征)是最有效的。而随着压缩率的降低匹配后期轨迹则变成了最优选择此时匹配前期路径甚至变得有害。基于这些实验现象我们提出根据压缩比率控制生成特征的难易并基于此提出了我们的方法。 三、方法 四、实验结果 3.1 效果比较 我们在CIFAR10CIFAR100和TinyImageNet数据集下和多个有代表性的数据集蒸馏方法进行了对比并进一步探索了数据集蒸馏在高IPC情境下的表现。主要的实验结果如下更多的结果请参考我们的论文。 和多个蒸馏方法在不同数据集和不同IPC(image per class)设定下的比较 在高IPC情境下数据集蒸馏和数据集剪枝的表现比较    3.2 分析 简单特征和难特征有什么特点为什么压缩率较低时添加简单特征有害我们对这些问题进行了探索。如下图所示匹配前期轨迹(添加简单特征)会更大幅度的改变图片内容将目标物体融入背景使图片有更多关于目标物体的基本信息。这使得添加简单特征在压缩率较高时有效因为此时蒸馏数据集太小以至于模型无法很好的学习到各个类别的基本特征。 匹配处于不同训练阶段的轨迹所得的蒸馏样本 此外我们可以观察到添加简单特征会让图片损失关于目标物体的细节信息而添加难特征(匹配后期轨迹)则会让目标物体具有更丰富的纹理细节。因此在压缩率较低时添加难特征的表现更好因为此时蒸馏数据集本身就含有足够多的数据让模型学会基本的类别特征添加更多的细节有利于模型识别离群样本。下图是蒸馏图片的可视化更多分析请见论文。 不同IPC设定下蒸馏所得样本 五、总结 在这项工作中作者发现应该根据压缩比率控制生成样本的难度。通过应用这一思想作者提出了第一个可以在高/低压缩率皆能保持有效的数据集蒸馏算法并首次实现了无损数据集蒸馏将CIFAR-10CIFAR-100压缩到了原数据集的1/5大小而不对训练ConvNet造成性能损失。 #MOSS-RLHF RLHF中Reward model的trick, 作者们在报告中提出了一系列方法来解决如何增加RM的泛化能力的问题从数据和算法角度分别提出了两个问题核心问题和对应的解决方法旨在提高奖励模型在处理错误偏好数据和泛化到新分布数据时的性能。  引入 在大家搞RLHF中经常遇到的一个核心的问题是RM的水平不够好没法训练得到想要的效果其背后两大类基本的原因是1.数据质量低。2.模型泛化能力差。复旦MOSS这篇技术报告从这两个问题入手提出了一系列方法优化和提升。也是Secrets of RLHF 系列的第二篇。干货十足细节丰富推荐阅读。 ​​https://arxiv.org/abs/2401.06080​​ ​​https://github.com/OpenLMLab/MOSS-RLHF​​ 核心问题 展开来讲的话关于1.数据质量低 2.模型泛化能力差这两个问题具体指的是 一、数据质量低数据集中的错误和模糊的偏好对(pairs)可能导致奖励模型RM无法准确捕捉人类的偏好。你通过数据透传给你的模型一会儿向左一会儿向右模型也要学懵。 二、泛化能力差奖励模型在特定分布上训练后很难泛化到该分布之外的例子且不适合迭代式的RLHF训练提升RLHF的重要路径之一。你的模型训练得到了一个二极管对于自己相信的东西表现的非常极端对于没见过的东西就傻眼了。 针对这两类问题作者提出了两个视角的方法分别从数据角度和算法角度出发。 一、数据角度使用多个奖励模型的输出增加数据度量的信息源用这种方法来量化数据中偏好的强度信息并通过这种方法来识别和纠正错误或模糊的偏好对。对于不同质量水平模糊度水平的数据采取了不一样的措施有翻转软标签适应性margin等具体方法后面具体展开讲解。 二、算法角度借助对比学习和元学习的方法。增加对比学习的loss对比学习通过增强模型区分能力来增强RM的对好坏的区分水平。元学习则使奖励模型能够维持区分分布外样本的细微差异这种方法可以用于迭代式的RLHF优化。 数据视角 可以看出数据的区分性比较强并且随着的上升和GPT4标注结果的一致性也在上升。 通过如上的方法就可以把数据大概分开我们划分为3类进行分析。 1.低强度的偏好数据的负面影响研究发现数据集中偏好强度最低的20%的数据对模型在验证集上的性能有负面影响。这些数据的偏好强度平均值小于0表明这些数据可能包含错误的偏好标签。 2.中等强度偏好数据的中立影响偏好强度在20%到40%之间的数据在训练后模型在验证集上的预测准确率大约为0.5。这些数据的偏好强度平均值接近0表明这些数据的偏好差异不大模型在这些数据上的学习效果一般。 3.高强度的偏好数据的积极影响剩余的数据偏好强度最高的60%显著提高了模型的性能。然而仅使用偏好强度最高的10%的数据训练模型时并没有达到最佳性能。这可能是因为这些数据过于强烈导致模型可能过度拟合这些数据。 归纳出偏好强度信息后我们可以根据偏好强度的测量结果可以对数据集进行分类并对不同类别的数据采取不同的处理策略。 对于低强度的偏好数据隐含标签错误的可能性通过翻转偏好对的标签可以有效地提高模型性能。对于中强度的比较模糊的偏好数据应用软标签和适应性边距可以避免模型过度拟合。对于高强度的偏好数据使用软标签和适应性边距的组合特别有效。 adaptive margin 一种让同类聚集异类区分度增大的经典方法来自于人脸识别的经典方法。 作者给了这几种方法的详细实验过程包含了rewardlossppl输出len等角度的度量。 整体看起来软标签适用在中上强度的偏好数据margin方法在所有强度数据都适用。 算法视角 在论文的 Preference Generalization and Iterated RLHF (偏好泛化和迭代RLHF) 部分作者们提出了两种主要的方法来提高奖励模型 (Reward Model, RM) 的泛化能力使其能够在分布变化的情况下仍然能够有效地区分不同的响应。具体做法如下: 一、对比学习 (Contrastive Learning) 二、MetaRMMeta Reward Model 提出了一种名为MetaRM的方法通过元学习来对齐原始偏好对与分布变化。MetaRM的关键思想是在训练阶段最小化原始偏好对的损失同时最大化对从新分布中采样的响应的区分能力。 训练过程: MetaRM的训练过程包括四个步骤: 计算从新分布中采样的响应的差异损失计算损失相对于RM参数的梯度并更新参数计算原始偏好对的损失以及计算损失相对于更新后的参数的梯度并优化原始参数。 具体MetaRM 的算法包括以下步骤: 通过这些方法奖励模型能够更好地捕捉数据中细微的偏好差异从而在面对新分布的数据时保持其区分能力。这使得奖励模型能够在迭代的RLHF过程中更稳定地优化语言模型即使在模型输出分布发生变化时也能保持其指导优化的能力。 主要实验结果如图所示MetaRM 在分布内和分布外任务评估中都显示出了优越的性能。在分布内任务中MetaRM 在多个回合的 PPO 训练后其性能显著优于基线模型。 另外在OOD上的表现做了单独的分析,在分布外任务中MetaRM 继续优于基线模型表明其方法能够有效地在新领域实现对齐而无需对一组query进行成本高昂的重新标注。 总结 总结来说作者们在报告中提出了一系列方法来解决开头提到的核心问题如何增加RM的泛化能力从数据和算法角度分别提出了两个问题核心问题和对应的解决方法旨在提高奖励模型在处理错误偏好数据和泛化到新分布数据时的性能。 #后向传递の计算量 从前向传递、后向传递和优化器参数更新的浮点数计算次数入手详解向传递的耗时为啥几乎是前向传递的两倍。后向传递的计算量大约是前向传递的两倍 1. 训练神经网络的一次迭代分为三步1前向传递计算损失函数2后向传递计算梯度3优化器更新模型参数。在实验中我们观察到一个现象后向传递的耗时几乎是前向传递的两倍相比之下优化器更新的耗时几乎可以忽略。要解释这个现象我们要从前向传递、后向传递和优化器参数更新的浮点数计算次数入手。 上图表示一次训练迭代中各个环节前向传递、后向传递、通信环节、优化器更新的耗时占比来自于《PyTorch Distributed: Experiences on Accelerating Data Parallel Training》。上图中纵轴表示耗时占比FWD表示一次训练迭代中前向传递的耗时占比BWD则表示一次训练迭代中后向传递的耗时占比OPT表示一次训练迭代中优化器更新模型参数的耗时占比。从上图中可以看到一次训练迭代中后向传递的耗时几乎是前向传递的两倍相比之下优化器更新的耗时占比很小几乎可以忽略。 上图表示GPipe流水线并行的调度策略来自于《Efficient large-scale language model training on gpu clusters using megatron-lm》。上图中横轴表示耗时一个蓝色小块表示一个微批次的前向传递一个绿色小块表示一个微批次的后向传递黑色竖线表示一次流水线刷新也就是优化器更新模型参数。从上图中可以看到一个绿色小块的宽度大约是蓝色小块的二倍一次训练迭代中后向传递的耗时几乎是前向传递的两倍相比之下优化器更新的耗时占比很小几乎可以忽略。 2.反向传播算法是怎么工作的 反向传播算法已经是训练神经网络模型不可缺少的一部分。训练神经网络模型时用梯度下降算法来学习和更新模型参数包含权重weights和偏置bias问题是如何计算损失函数关于模型参数的梯度呢这就要用到反向传播backpropagation算法。 2.1 前向传递计算神经网络的输出 在讨论反向传播算法之前我们先以多层前馈神经网络为例用基于矩阵的方法来计算神经网络的输出。在此过程中先定义一些数学符号。 2.2 反向传播的四个基本等式 2.2.2 误差与下一层误差的关联 带入上上式中得到: 2.2.3 偏置的梯度 2.2.4 权重的梯度 2.2.5 四个基本等式 综上梯度反向传播的四个基本等式是: 有了这四个基本等式我们就基本理解了梯度的计算过程。 3. 后向传递与前向传递的FLOPs比率 3.1 定义 FLOPS全大写floating point operations per second每秒钟浮点数计算次数理解为运算速度是衡量硬件性能的指标。例如A100的float32运算速度是9.7TFLOPSV100的float32运算速度是7.8TFLOPS。 FLOPss为小写floating point operations表示浮点数运算次数理解为计算量衡量模型或算法的复杂度。 backward-forward FLOP ratio后向传递与前向传递的FLOPs比率表示一次后向传递的浮点数计算次数与一次前向传递的浮点数计算次数的比率。衡量了一次后向传递要比一次前向传递多进行的浮点数运算。 3.2 前向传递与后向传递的浮点数操作次数的理论分析 为了理解后向传递的浮点数运算为什么要比前向传递多我们就要从反向传播算法的四个基本等式入手。 我们从一个有2层隐藏层的神经网络入手 我们假设线性层采用ReLU激活函数采用随机梯度下降优化器。下表中h1和h2分别表示第1层和第2层隐藏层的神经元个数。有2层隐藏层的神经网络一次训练迭代的计算过程如下表所示 从上表中我们可以观察到对于多层前馈神经网络模型有以下结论 1. 相比于线性层激活函数ReLU和损失函数的浮点数运算量可以忽略。 2. 对于第一层后向传递-前向传递的FLOPs比率是1:1。 3. 对于其他层后向传递-前向传递的FLOPs比率是2:1。 4. 采用随机梯度下降作为优化器权重更新的FLOPs是模型参数规模的2倍。 3.2.1 第一层与其他层的区别 对于多层前馈神经网络模型采用随机梯度下降作为优化器。 第一层的后向传递-前向传递的FLOPs比率是1:1其他层的后向传递-前向传递的FLOPs比率是2:1。模型参数更新的FLOPs是模型参数规模的2倍。 3.2.2 batch_size的影响 前向传递和后向传递的计算量FLOPs与batch_size成正比即随着batch_size增大而线性增长。 优化器更新模型参数的FLOPs与batch_size无关只与模型参数规模和优化器类型有关。 随着batch_size增大前向传递和后向传递的FLOPs线性增长而权重更新的FLOPs保持不变这使得权重更新的FLOPs变得逐渐可以忽略不计了。 3.2.3 网络深度的影响 神经网络层数对后向传递-前向传递FLOPs比率有着间接的影响。由于第一层的后向-前向FLOPs比率是1:1而其他层后向-前向FLOPs比率是2:1。层数的影响实际上是第一层与其他层的比较。 定义一个CNN神经网络中间层的数量由0到100可以看到后向-前向FLOPs比率由1.5提高到了接近2的水平。当层数逐渐变深的时候第一层对模型整体的FLOPs影响就变小了模型整体的后向-前向FLOPs比率就很接近2。 4. 总结 随着batch_size的增大前向传递和后向传递的FLOPs线性增长而权重更新的FLOPs保持不变参数更新的FLOPs变得可以忽略不计了。这体现为当batch_size足够大时在训练神经网络的一次迭代中前向传递和后向传递是主要的耗时环节而参数更新的耗时变得几乎可以忽略不计。 由于第一层的后向-前向FLOPs比率是1:1而其他层后向-前向FLOPs比率是2:1。随着网络层数的加深第一层对整体FLOPs的影响变得可以忽略不计了。这体现为当网络层数足够深时后向传递的耗时几乎是前向传递耗时的2倍。 总的来说对于用大batch_size的深层神经网络来说后向传递-前向传递的FLOPs比率接近于2:1换句话说后向传递的计算量大约是前向传递的两倍。 #InternLM2-Math 上海人工智能实验室上海AI实验室开源发布新一代数学模型书生·浦语数学InternLM2-Math。基于书生·浦语2.0InternLM2强大的基础能力InternLM2-Math仅以中轻量级参数规模即在多项数学评测中刷新开源模型数学能力上限此外InternLM2-Math不仅会“解题”更会“判题”突破了传统数学大模型应用局限将为数学基础研究和教学提供优质应用基座。 InternLM2-Math为首个同时支持形式化数学语言及解题过程评价的开源模型以强大内生计算和推理能力为技术社区提供强大数学工具和模型范式。秉持“以高质量开源赋能创新”的理念InternLM2-Math代码和模型完全开源并支持免费商用。 数学能力是大语言模型推理水平的重要体现。近日谷歌 DeepMind 运用AI数学模型AlphaGeometry解几何题其水平已接近人类奥林匹克金牌得主引发广泛关注。当前全球数学大模型领域研究取得了突出进展但与顶尖人类水平相比仍然存在差距。上海AI实验室将继续以开源开放理念与全球研究人员合作共同探索提升语言模型数学推理能力的提升路径。 InternLM2-Math对MATH评测集中Level-5难度题目的解题过程 开源链接 GitHub ​​https://github.com/InternLM/InternLM-Math​​ Huggingface ​​https://huggingface.co/internlm​​ ModelScope ​​https://modelscope.cn/organization/Shanghai_AI_Laboratory​​ 四两拨千斤轻量级选手刷新能力上限 本次开源的InternLM2-Math同时包含轻量级7B及中量级20B两个版本。 为测试InternLM2-Math的能力水平研究人员采用GSM8K、MATH、匈牙利数学竞赛等四项数学评测集作为验证“考题”。评测结果显示InternLM2-Math-7B以轻量级参数规模达到了与GPT-3.5同等的数学水平中量级的InternLM2-Math-20B 则在没有借助任何外部工具的条件下取得了目前开源模型的最佳成绩达到与GPT-4接近的数学能力刷新当前开源模型数学能力上限。 GSM8KOpenAI提出的英文小学算数习题集共1000余题 MATHUC Berkeley提出的英文初高中竞赛习题集共5000题 匈牙利数学竞赛评测集用来衡量模型在非常见分布上的数学性能的测试集共30余小问通过专家校阅进行打分。 多个同类模型在GSM8K评测集上评测成绩对比InternLM2-Math综合领先通用模型和数学专用模型接近GPT-4数学能力 从下图中可见InternLM2-Math-7B在GSM8K和MATH上的测试评分分别达到78.1和34.6超越其他7B量级的通用模型和数学专用模型与ChatGPTGPT-3.5不分伯仲。InternLM2-Math-20B 则超越了更大规模参数的数学专用模型MetaMath-Llemma-34B以及数理能力较强的 70B 级别通用开源模型Qwen-72B和DeepSeek-67B并且在各个数据集上都达到了GPT-4性能约九成的评测成绩。 为了考察InternLM2-Math通用的数学能力研究人员引入了“匈牙利数学竞赛评测集”作为指标参考。该评测集用于衡量语言模型OOD分布外泛化的数学性能共设置30余道问题通过专家人工校阅打分。评测结果显示InternLM2-Math的7B与20B版本分别获得55分和66分远超同类开源模型并整体接近GPT-4。这表明InternLM2的数学性能并非针对特定评测集“突击”优化而来而是具备了增强通用的数学能力。 为了保证InternLM2-Math在参与考试前没有被“泄题”研究人员采用了MinHash和严格的数字匹配对模型训练中可能遇到的测试集数据进行去重避免产生“数据污染”研究人员在两组对照数据集上进行了损失函数计算若不存在数据污染损失函数应接近或大于0。验证结果显示在InternLM2-Math7B/20B两个版本的损失函数值分别为0.14及0.11表明训练过程中不存在“数据污染”。InternLM2-Math的数学考试成绩来源于自身“硬实力”没有“考前泄题”。 数学课代表是怎样炼成的 上海AI实验室近期开源的InternLM2模型基座语言建模能力获得质的提升综合性能达到同量级开源模型的领先水平得益于此InternLM2获得了 “天赋”。 研究人员利用InternLM2基座版模型精选数学相关语料进行继续预训练包括中英文数学相关的代码、网页、书籍等。其中InternLM2-Math-7B/20B分别经过了120B和80B token的继续预训练。 微调阶段使用的指令数据覆盖中英文双语共计200余万条包含CoT、工具调用、奖励模型、数据推广等多种形式。 研究人员同时对数据量较少、模型性能交叉的数学知识点进行了数据增广运用奖励建模对增广数据进行了过滤删除不可靠的回复。对于数据中的复杂计算过程研究人员将其扩写为更详细的步骤使模型减少跳步推理产生的计算幻觉。 通过以上多任务学习“天赋选手”逐步获取了多种数学能力成为“优等生”。 经过多任务学习的InternLM2-Math在不借助任何工具计算器、Python、Wolfram的情况下已表现出了高性能的内生计算能力。为探索其由“优等生”进步为“尖子生”的可能性研究人员在训练时引入了数学语言Lean。 Lean是一种形式化数学语言通过机器可检查的数学证明来数字化数学定理的证明目前许多本科数学阶段以下的数学定理都已经被用Lean表述。权威数学家曾通过Lean语言将学术论文转为形式化表达表明Lean已经具有对现代数学的描述能力。 经过训练InternLM2-Math可使用Lean的代码进行解答题计算可将自然语言的证明题与Lean语言的证明状态互相翻译或者根据给定的Lean证明状态进行证明步骤的搜索。表明InternLM2-Math在内生计算能力上衍生出了强大的数学推理能力已由“天赋选手”进步为名副其实的“数学尖子生”。 下图为InternLM2-Math使用Lean 3解应用题的例子模型在注释会描述自己的计算思路。 下图为InternLM2-Math进行交互式证明模型会根据当前Lean的证明状态搜索下一个证明步骤。模型用形式化语言严格证明了给定命题。 会解题也会判题的“AI名师” InternLM2-Math创新性地具备了对解题过程与结果的评价能力不仅会“解题”更会“判题”这使得其超越了传统数学大模型拥有更广阔的应用空间为数学基础研究、教学提供优质应用基座。 研究人员在模型微调阶段同时引入Outcome Reward Model (ORM)、Process Reward Model (PRM)、Lean as Reward Model (LRM)训练数据。通过PRM能力的获取使InternLM2-Math可以认识到“自身错误”并指出错误过程。而LRM可使模型将自己产生的CoT 过程转变为Lean的形式再通过Lean的计算结果判断过程的正确性达到形式化过程监督的目的。 下图展示了模型PRM的能力模型指出了错误的过程。 作为首个同时支持形式化数学语言及解题过程评价的开源模型InternLM2-Math能够判断模型思维链过程的正确与否使得模型具备数学能力持续改进的潜力。 #美杜莎~2 去年在加速大语言模型推理层面我们迎来了一个比推测解码更高效的解决方案 —— 普林斯顿、UIUC 等机构提出的 Medusa。如今关于 Medusa 终于有了完整技术论文还提供了新的版本。 如你我所知在大型语言模型LLM的运行逻辑中随着规模大小的增加语言生成的质量会随着提高。不过这也导致了推理延迟的增加从而对实际应用构成了重大挑战。 从系统角度来看LLM 推理主要受内存限制主要延迟瓶颈源于加速器的内存带宽而非算术计算。这一瓶颈是自回归解码的顺序性所固有的其中每次前向传递都需要将完整的模型参数从高带宽内存传输到加速器缓存。该过程仅生成了单个的 token没有充分利用现代加速器的算术计算潜力导致了效率低下。 为了解决这一问题加速 LLM 推理的方法被提出既可以增加解码过程的算术强度FLOPs 与总数据移动的比率也能减少解码步骤数量。这类方法以推测解码speculative decoding为代表使用较小的草稿draft 模型在每一步生成 token 序列然后通过较大的原始模型进行细化以获得可接受的延续。不过获得合适的草稿模型仍然具有挑战性并且将草稿模型集成到分布式系统中更加困难。 在本文中来自普林斯顿大学、Together.AI、伊利诺伊大学厄巴纳 - 香槟分校等机构的研究者没有使用单独的草稿模型来顺序生成候选输出而是重新审视并完善了在主干模型之上使用多个解码头加速推理的概念。他们发现如果该技术得到有效应用可以克服推测解码的挑战从而无缝地集成到现有 LLM 系统中。 具体来讲 研究者提出了 MEDUSA一种通过集成额外解码头能够同时预测多个 tokens来增强 LLM 推理的方法。这些头以参数高效的方式进行微调并可以添加到任何现有模型中。至此不需要任何新模型MEDUSA 就可以轻松地集成地当前的 LLM 系统中包括分布式环境以确保友好用户体验。 值得关注的是该论文作者之一 Tri Dao 是近来非常火爆的 Transformer 替代架构 Mamba 的两位作者之一。他是 Together.AI 首席科学家并即将成为普林斯顿大学计算机科学助理教授。 论文地址https://arxiv.org/pdf/2401.10774.pdfGitHub 地址https://arxiv.org/pdf/2401.10774.pdf 在具体实现中研究者通过两个关键见解进一步增强了 MEDUSA。首先当前在每个解码步骤生成单个候选延续的方法导致了可接受长度受限和计算资源的低效使用。为了解决这个问题他们建议使用 MEDUSA 头来生成多个候选延续并通过对注意力掩码的简单调整来进行验证。其次可以使用类似于推测解码中的拒绝采样方案来生成与原始模型具有相同分布的响应但对于很多 LLM 应用来说通常不必要。 因此研究者考虑或许可以引入一种典型的可接受方案即从 MEDUSA 输出中选择合理的候选者。他们使用温度作为阈值来管理原始模型预测的偏差为拒绝采样提供了一种有效的替代方案。这种方法有效地解决了拒绝采样的局限性比如在较高温度下速度降低。 此外为了给 LLM 配备预测性的 MEDUSA 头研究者提出了两种针对不同场景量身定制的微调程序。对于计算资源有限或者目标是将 MEDUSA 纳入现有模型而不影响其性能的情况他们建议使用 MEDUSA-1。该方法需要的内存最少并且可以使用类似于 QLoRA 中的量化技术来进一步优化而不会因固定主干模型影响生成质量。 不过对于 MEDUSA-1主干模型的全部潜力无法得到充分利用。因此可以进一步进行微调以提高 MEDUSA 头的预测精度并直接带来更大加速。因此研究者提出了 MEDUSA - 2它适用于计算资源充足或从基础模型进行直接监督微调的场景。MEDUSA-2 的关键是一个训练协议它能够对 MEDUSA 头和主干模型进行联合训练而不会影响模型下一个 token 的预测能力和输出质量。 在实验部分研究者主要关注批大小为 1 的场景这代表了 LLM 本地托管以供个人使用的用例。他们在不同大小和训练设置下测试了 MEDUSA包括 Vicuna-7B 和 13B使用公共数据集训练、Vicuna -33B使用私有数据集训练、Zephyr-7B使用监督微调和对齐训练。  结果表明MEDUSA 在不影响生成质量的情况下可以在不同的 promt 类型中实现 2.3 至 3.6 的推理加速。如下动图为 Vicuna-7b 上有无 Medusa-1 时推理速度比较。 论文共同一作 Tianle Cai 表示自 Medusa 项目推出以来它在 TensorRT、TGI 以及众多开源项目和公司中得到采用。在新的技术论文中我们推出了用于全模型调优的 Medusa-2 方案、用于将 Medusa 集成到任何微调 LLM 的自蒸馏以及其他更多加速技术。 对于这项研究Lepton AI 创始人贾扬清表示Medusa 可能是他们见过的最优雅的加速推理解决方案之一能够与 int8/fp8、编译等互补在实践中实现 2 倍性能增益。 并且他们已将 Medusa 与很多现有优化方法、混合加速方案进行集成结果在合理的并发下加速保持正值并在 A100 和 H100 等卡中尤其有效。此外他们还已经为 Llama 模型训练了通用 Medusa 头。 方法概览 MEDUSA 遵循推测解码框架其中每个解码步骤主要由三个子步骤组成(1) 生成候选者(2) 处理候选者 (3) 接受候选者。对于 MEDUSA(1) 是通过 MEDUSA 头head实现的(2) 是通过树注意力tree attention实现的并且由于 MEDUSA 头位于原始主干模型之上因此 (2) 中计算的 logits 可以用于子步骤 (1) 的下一个解码步骤。最后一步 (3) 可以通过拒绝采样rejection sampling或典型接受typical acceptance来实现。MEDUSA 的整体流程如下图 1 所示。 关键组件 MEDUSA 的关键组件主要包括 MEDUSA 头和树注意力。 首先MEDUSA 头与原始主干模型一起进行训练。其中原始主干模型可以在训练期间保持冻结状态 (MEDUSA-1) 或一起训练 (MEDUSA-2)。这种方法甚至可以在单个 GPU 上微调大模型利用强大的基础模型学得的表征。 此外MEDUSA 头的分布确保与原始模型的分布一致从而缓解了分布偏移问题并且 MEDUSA 不会增加服务系统设计的复杂性对分布式设置很友好。 由于候选者增加会提高计算需求该研究采用树状结构的注意力机制来同时处理多个候选者。这种注意力机制不同于传统的因果注意力范式。在其框架内只有来自同一 continuation 的 token 才被视为历史数据。受图神经网络领域提出的将图结构嵌入注意力的启发研究团队还将树结构合并到注意力掩码中如下图 2 所示。 训练策略 冻结主干模型来训练 MEDUSA 头的方法很简单并且需要的计算资源很少但是将主干网络与 MEDUSA 头结合训练可以显著提高 MEDUSA 头的准确性。因此根据计算资源和用例的具体要求研究团队为 MEDUSA 头提出了两个级别的训练策略即 MEDUSA-1冻结主干网络MEDUSA-2联合训练。 最后该研究提出了 MEDUSA 的两个扩展包括自蒸馏self-distillation和典型接受typical acceptance分别用于处理 MEDUSA 没有可用训练数据的情况和提高解码过程的效率。 实验 为了证明 MEDUSA 在不同设置下的有效性该研究进行了两组实验首先在 Vicuna-7B/13B 模型上评估 MEDUSA以展示 MEDUSA-1 和 MEDUSA-2 的性能其次在 Vicuna-33B 和 Zephyr-7B 模型上评估 MEDUSA以研究自蒸馏的有效性因为 Vicuna-33B 模型的训练数据集不公开而 Zephyr-7B 模型使用 RLHF 进行训练。 用例研究 1在 Vicuna-7B/13B 模型上评估 MEDUSA 在 Vicuna-7B/13B 模型上评估 MEDUSA-1、MEDUSA-2 的结果如下图 4 所示。 用例研究 2在 Vicuna-33B 和 Zephyr-7B 使用自蒸馏训练 研究者关注了需要自蒸馏的情况使用 Vicuna-33B 和 Zephyr-7B 作为示例。他们首先使用一些种子 prompt 来生成数据集然后将 ShareGPT 和 UltraChat 作为种子数据集并为以上两个示例收集了包含大约 100k 样本的数据集。 下表 1 展示了不同 MEDUSA-2 模型在 MT-Bench 基准下的加速比、开销和质量。 下图 5 为使用 MEDUSA-2 时不同模型的加速情况。 消融实验 下图 6a 比较了随机采样密集树设置蓝点和优化稀疏树设置红星的加速率。6b 比较了密集和稀疏树设置的速度。  下图 7 展示了不同采样设置下模型性能的比较分析。 两阶段微调的有效性。研究者针对 Vicuna-7B 模型评估了两种微调策略下的性能差异。
http://www.tj-hxxt.cn/news/141506.html

相关文章:

  • 建设服装网站的亮点项目进度管理软件app
  • 网站建设 找客户保定网站搜索排名
  • 广西中小企业网站建设南博网站建设
  • 怎么做自动下单网站中国建设银行网站缴费系统
  • 北京建网站的公司哪个比较好比较权威的房产网站
  • 松原网站建设哪家专业谈谈你对seo概念的理解
  • 阿里云虚拟主机与网站吗哈尔滨cms模板建站
  • 如何做网站软件佛山网站建设专业定制
  • 环保网站建设情况报告如何去除痘痘有效果
  • 建站之星app商务网站建设评估的指标
  • App加网站什么做重庆景点排行榜前十名
  • 网站建设方案书模版网络编程技术实验报告
  • 国外做海报的网站正常网站跳出率
  • 山东建设住建厅网站哪些网站设计好
  • 网站开发的对联中国设计在线网站
  • 华为做网站吗wordpress手机页面底部导航栏
  • 百度云服务器挂网站wordpress点击图片直接相册浏览
  • 网站图片地址怎么做的石家庄市网站建设
  • 做兼职写小说网站做代收水果是什么网站
  • 中文网站开发linux WordPress上传插件需要ftp
  • 电商网站seo方案dw博客网站怎么做
  • 甘肃省建设厅执业资格注册中心网站通知浦东新区专业做网站
  • 微信公号嵌入网站开发浅谈博星卓越网站建设
  • 网站建设厘金手指排名二二成都房产网最新楼盘
  • 专业的网站建设企业h5效果展示网站
  • 域名怎么和网站绑定珊瑚绒毯移动网站建设
  • 网页美工设计网站国内网站模板
  • 素材设计做的好的网站有哪些建设工程合同无效的情形有哪些
  • 淘宝的网站建设费用惠城网站建设费用
  • 铜川市建设集团网站企业管理咨询有限公司是干嘛的