RECYCLING PRETRAINED CHECKPOINTS: ORTHOGONAL GROWTH OF MIXTURE-OF-EXPERTS FOR EFFICIENT LARGE LANGUA

该文章提出了一种通过“回收”预训练模型 checkpoint 来高效扩展混合专家(MoE)大语言模型的框架,核心是深度和宽度两个正交增长策略,能大幅降低训练成本并提升性能。

一、文章主要内容

  1. 研究背景:大语言模型(LLM)预训练计算成本呈指数增长,大量已训练完成的 checkpoint 因模型容量限制未被充分利用,形成“沉没成本”,亟需高效复用方法。
  2. 核心框架:针对收敛后的 MoE 模型,提出两种正交增长策略,实现从较小模型向较大模型的扩展并延续训练。
    • 深度增长(Depth Growth):采用“插入式层复制”(interpositional layer copying),将每个原始层原位复制多次,而非传统的“堆叠式”(stacking)复制,以保留模型层权重范数的固有趋势。
    • 宽度增长(Width Growth):通过“带噪声注入的专家复制”(expert duplication with injected noise),在复制专家权重时加入小幅度高斯噪声,同时翻倍激活专家数量,促进新专家的功能特化。
  3. 关键发现
    • 模型最终性能与“沉没成本”(预训练计算量)呈强正相关,初始训练投入越多,扩展后性能越好。
    • 深度增长在下游任务性能提升上更直接,宽度增长在扩展后模型稳定性上更具优势,尤其适配 Pre-LN 架构。
<think>我们有一个需求:在WPF中,使用树状图(TreeView)显示特定格式的JSON数据,并在树状图的最后一层节点的右边用表格(DataGrid)显示这些数据。 分析需求: 1. 树状图展示:我们需要解析JSON数据,并将其绑定到TreeView上。TreeView的节点可能有多层,最后一层节点是具体的“文件”或“叶子节点”。 2. 在最后一层节点的右边显示表格:这意味着当我们选中一个叶子节点时,在TreeView的同一行右侧(可能是同一个界面布局中)显示一个表格,表格中显示该叶子节点的详细数据。 实现思路: 步骤1:定义数据模型(Model) - 根据JSON结构定义对应的类,以便反序列化。 - 我们需要一个基类(例如FileSystemItem)来表示树中的每个节点,它应该包含子节点集合(用于树形结构)和节点类型(区分文件夹和文件)。 - 对于叶子节点(文件),我们还需要有具体的属性(如大小、修改日期等),这些属性将在表格中显示。 步骤2:设计视图(View) - 使用TreeView控件展示树形结构。 - 使用DataGrid来显示表格,表格将绑定到选中叶子节点的数据集合(可能是叶子节点的详细信息,或者是叶子节点包含的一组数据行,具体取决于JSON结构)。 - 布局:可以使用Grid将界面分成两部分,左侧是TreeView,右侧是DataGrid。当选中非叶子节点时,右侧可以隐藏或显示提示信息。 步骤3:视图模型(ViewModel)和绑定 - 使用MVVM模式,创建ViewModel来持有整个树的数据集合(ObservableCollection<FileSystemItem>)。 - TreeView的ItemsSource绑定到这个集合。 - 在ViewModel中,我们需要一个属性(例如SelectedItem)来绑定TreeView的SelectedItem,以便知道当前选中的节点。 - 还需要一个属性(例如DetailItems)来绑定到DataGrid,表示要在表格中显示的数据。这个属性应该在选中节点变化时更新,并且只有当选中节点是叶子节点时,才设置为具体的数据;否则设置为空(或非叶子节点时显示其他信息)。 步骤4:处理JSON数据 - 使用Newtonsoft.Json(Json.NET)或System.Text.Json来解析JSON数据,并转换成我们定义的数据模型对象。 步骤5:事件处理 - 当TreeView的选中节点改变时,判断选中的节点是否是叶子节点。如果是,则提取需要显示在表格中的数据,并更新绑定到DataGrid的集合。 具体实现细节: 1. 数据模型定义示例: 假设我们的JSON结构如下(示例): { "Name": "Root", "Type": "Folder", "Children": [ { "Name": "Folder1", "Type": "Folder", "Children": [ { "Name": "File1.txt", "Type": "File", "Size": 1024, "LastModified": "2021-01-01" }, ... // 其他文件或文件夹 ] }, ... // 其他子节点 ] } 我们可以定义如下模型: ```csharp public enum ItemType { Folder, File } public class FileSystemItem : INotifyPropertyChanged { public string Name { get; set; } public ItemType Type { get; set; } // 如果是文件夹,则有子项 public ObservableCollection<FileSystemItem> Children { get; set; } // 如果是文件,则有以下属性(根据实际JSON结构调整) public long? Size { get; set; } public DateTime? LastModified { get; set; } // 实现INotifyPropertyChanged接口,以便在属性更改时通知UI(如果需要) public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } ``` 2. ViewModel示例: ```csharp public class MainViewModel : INotifyPropertyChanged { private FileSystemItem _selectedItem; public ObservableCollection<FileSystemItem> TreeItems { get; set; } // 绑定到TreeView的ItemsSource public FileSystemItem SelectedItem { get => _selectedItem; set { _selectedItem = value; OnPropertyChanged(); // 当选中项改变时,更新表格绑定的数据 OnSelectedItemChanged(); } } // 用于绑定到DataGrid的详细信息集合 private ObservableCollection<FileSystemItem> _detailItems; public ObservableCollection<FileSystemItem> DetailItems { get => _detailItems; set { _detailItems = value; OnPropertyChanged(); } } private void OnSelectedItemChanged() { // 如果选中的是文件(叶子节点),则显示该文件的详细信息(这里我们假设表格中显示的是单个文件的信息,但实际可能是多个文件) // 根据需求:我们希望在最后一层(即文件层)的右边显示表格。这里我们假设最后一层节点是文件,且表格显示该文件的信息(或者如果是文件夹,则显示文件夹下的所有文件?) // 需求描述是在最后一层数据的右边用表格显示这些数据,所以这里我们有两种理解: // a) 选中的是叶子节点(文件)时,表格显示这个文件的信息(一行数据) // b) 选中的是非叶子节点时,表格显示该节点下所有叶子节点的信息(多行数据) // 根据问题描述:“树状图最后一层数据的右边用表格显示这些数据”,这里“这些数据”指的是最后一层的数据,即选中的叶子节点本身,或者选中的非叶子节点下的所有叶子节点? // 问题要求:在最后一层数据的右边显示表格。注意,最后一层节点是叶子节点,所以当用户选中一个叶子节点,我们显示这个叶子节点的详细信息(一行)?或者当用户选中一个节点(无论是否叶子),都显示该节点下的所有叶子节点? // 原话:在树状图最后一层数据的右边用表格显示这些数据。这里“最后一层数据”指的是叶子节点本身,所以应该是当选中叶子节点时,在表格中显示该节点数据。 // 因此,我们这样实现: // - 如果选中的节点是文件(叶子节点),则表格中只显示这一个节点(一行) // - 如果选中的节点是文件夹(非叶子节点),则表格为空(或者不显示,或者显示该文件夹下的所有文件?这里需求没有明确) // 但需求说“最后一层数据”,所以只有叶子节点才显示表格。因此非叶子节点我们不显示表格(或者清空表格)。 if (SelectedItem != null && SelectedItem.Type == ItemType.File) { // 创建一个包含该文件的集合 DetailItems = new ObservableCollection<FileSystemItem> { SelectedItem }; } else { // 如果不是文件,则清空表格 DetailItems = null; // 或者,如果需求是显示当前节点下的所有文件(包括子文件夹中的?),则递归收集所有文件。但需求没有明确,这里按只显示选中叶子节点处理。 } } // ... 其他代码,如加载JSON数据的方法 } ``` 3. 视图(XAML)设计: ```xml <Window x:Class="WpfTreeView.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfTreeView" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Window.DataContext> <local:MainViewModel/> </Window.DataContext> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <!-- 左侧树状图 --> <TreeView ItemsSource="{Binding TreeItems}" SelectedItemChanged="TreeView_SelectedItemChanged"> <!-- 这里我们通过绑定SelectedItemChanged事件来处理选中项改变(注意:TreeView的SelectedItem不是依赖属性,不能直接绑定,我们可以使用事件来更新ViewModel的SelectedItem) --> <!-- 或者,我们可以使用一些技巧来绑定SelectedItem,但这里为了简单,使用事件 --> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <TextBlock Text="{Binding Name}"/> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> <!-- 右侧表格 --> <DataGrid Grid.Column="1" ItemsSource="{Binding DetailItems}" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Header="Name" Binding="{Binding Name}"/> <DataGridTextColumn Header="Size" Binding="{Binding Size}"/> <DataGridTextColumn Header="LastModified" Binding="{Binding LastModified}"/> </DataGrid.Columns> </DataGrid> </Grid> </Window> ``` 注意:在TreeView中,SelectedItem不是依赖属性,因此不能直接绑定到ViewModel的SelectedItem属性。我们可以通过事件处理: 在代码后置中: ```csharp private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { if (DataContext is MainViewModel vm) { vm.SelectedItem = e.NewValue as FileSystemItem; } } ``` 4. 加载JSON数据: 在ViewModel中,我们可以添加一个方法从文件或字符串加载JSON数据: ```csharp public void LoadData(string json) { var root = JsonConvert.DeserializeObject<FileSystemItem>(json); TreeItems = new ObservableCollection<FileSystemItem> { root }; OnPropertyChanged(nameof(TreeItems)); } ``` 注意:上述模型定义中,Children集合在反序列化时需要初始化。我们可以使用构造器或者在属性上设置默认值。 扩展:如果需求是当选中一个非叶子节点(文件夹)时,表格中显示该文件夹下所有文件(递归所有子文件)?那么我们可以修改OnSelectedItemChanged方法: ```csharp private void OnSelectedItemChanged() { if (SelectedItem == null) { DetailItems = null; return; } // 收集所有文件节点(如果是文件节点,则只包含自己;如果是文件夹,则递归收集所有子文件) var files = new ObservableCollection<FileSystemItem>(); CollectFiles(SelectedItem, files); DetailItems = files; } private void CollectFiles(FileSystemItem item, ObservableCollection<FileSystemItem> files) { if (item.Type == ItemType.File) { files.Add(item); } else // 文件夹 { if (item.Children != null) { foreach (var child in item.Children) { CollectFiles(child, files); } } } } ``` 但是根据问题描述,我们只需要在最后一层(叶子节点)的右边显示表格,所以最初的设计(只显示选中的叶子节点)更符合要求。具体实现可以根据实际需求调整。 最后,根据问题描述,需要显示的是“特定格式的JSON数据”,所以我们需要根据实际的JSON结构调整模型和表格的列。 以上是一个基本的实现方案。 相关问题: 1. 如何在WPF中绑定TreeView的选中项? 2. 如何使用MVVM模式在WPF中实现TreeView和DataGrid的联动? 3. 在WPF中如何解析JSON数据并绑定到TreeView? 4. 如何动态生成DataGrid的列以适应不同的数据模型? </think>### 在WPF中实现树状图+表格数据展示方案 #### 核心实现步骤 1. **数据模型设计** 基于`FileSystemItem`构建树形结构模型: ```csharp public class FileSystemItem : INotifyPropertyChanged { public string Name { get; set; } public bool IsFolder { get; set; } public ObservableCollection<FileSystemItem> Children { get; set; } = new(); // 文件特有属性(表格中显示) public long? FileSize { get; set; } public DateTime? ModifiedTime { get; set; } public string FileType { get; set; } } ``` 2. **JSON数据解析** 使用Newtonsoft.Json反序列化: ```csharp var rootItems = JsonConvert.DeserializeObject<ObservableCollection<FileSystemItem>>(json); ``` 3. **主界面布局(XAML)** ```xml <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="300"/> <ColumnDefinition Width="*"/> </Grid.ColumnDefinitions> <!-- 树状图 --> <TreeView x:Name="FileTree" ItemsSource="{Binding Items}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <TextBlock Text="{Binding Name}"/> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> <!-- 表格区域 --> <DataGrid Grid.Column="1" ItemsSource="{Binding SelectedItem.Children, ElementName=FileTree}" AutoGenerateColumns="False" IsReadOnly="True"> <DataGrid.Columns> <DataGridTextColumn Header="名称" Binding="{Binding Name}"/> <DataGridTextColumn Header="类型" Binding="{Binding FileType}"/> <DataGridTextColumn Header="大小" Binding="{Binding FileSize}"/> <DataGridTextColumn Header="修改时间" Binding="{Binding ModifiedTime}"/> </DataGrid.Columns> </DataGrid> </Grid> ``` 4. **动态绑定逻辑** ```csharp // 在ViewModel中 public ObservableCollection<FileSystemItem> Items { get; set; } // 当树节点展开时动态加载子项 private void OnTreeViewExpanded(object sender, RoutedEventArgs e) { if (e.OriginalSource is TreeViewItem item && item.DataContext is FileSystemItem fsItem) { if (fsItem.Children.Count == 0 && fsItem.IsFolder) { // 从JSON加载子节点数据 LoadChildrenFromJson(fsItem); } } } ``` #### 关键实现细节 1. **最后一层检测** 通过`TreeView.SelectedItem`判断是否为叶子节点: ```csharp private void OnTreeSelectionChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { if (e.NewValue is FileSystemItem selected && !selected.IsFolder) { // 显示表格数据(自动通过DataGrid绑定) DetailsPanel.Visibility = Visibility.Visible; } } ``` 2. **性能优化建议** - 使用`VirtualizingStackPanel`提升大数据量性能 ```xml <TreeView VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Recycling"> ``` - 异步加载树节点数据 - 应用数据懒加载模式 3. **UI美化建议** - 为树节点添加文件夹/文件图标 - 添加路径面包屑导航 - 在表格上方显示当前选中路径: ```xml <TextBlock Text="{Binding SelectedItem.Path, ElementName=FileTree}"/> ``` #### 示例JSON数据结构 ```json [ { "Name": "文档", "IsFolder": true, "Children": [ { "Name": "报告.docx", "IsFolder": false, "FileSize": 25486, "ModifiedTime": "2023-06-15T10:30:00", "FileType": "Word文档" } ] } ] ``` #### 最终效果 ![界面示意图](https://example.com/wpf-treegrid-demo.png) *图:WPF树状图+表格数据展示效果[^1]* --- ### 相关问题 1. 如何在WPF中实现异步加载树节点数据? 2. 如何优化大型树状结构的渲染性能? 3. 如何实现树节点和表格数据的双向同步? 4. 如何在WPF中自定义树节点的图标和样式? 5. 如何处理JSON数据中的循环引用问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UnknownBody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值