相关深入内容:

概述

深度学习的缩放定律(Scaling Laws)揭示了模型性能随规模增长的幂律改善。然而,核Regime(Kernel Regime)与特征学习Regime(Feature Learning Regime)遵循截然不同的缩放规律。

核Regime中,神经网络的行为近似于核方法(如NTK),特征保持”冻结”;而在特征学习Regime中,神经网络自适应地学习数据相关特征,从而获得更优的缩放性能。1

核心发现

  1. 任务难度分类:简单任务(RKHS内)两种Regime缩放相同;困难任务(RKHS外)特征学习显著优于核方法
  2. 计算最优策略修正:特征学习Regime建议更多参数、更少训练token
  3. 关键阈值:特征学习仅在有限宽度窗口内有效

1. 核Regime vs 特征学习Regime

1.1 核Regime的定义

核Regime(也称NTK Regime)是无限宽度神经网络的渐近行为:

  • 初始化:随机初始化
  • 训练:梯度下降导致函数演化可被线性核描述
  • 特征:保持固定(由初始化决定),不随训练改变

数学形式

其中 是Neural Tangent Kernel。

1.2 特征学习Regime的定义

特征学习Regime中,神经网络自适应地学习数据相关特征

  • 初始化:参数随机
  • 训练:非线性更新导致特征重构
  • 特征:随训练演化,对输入的结构进行编码

关键区别

特性核Regime特征学习Regime
特征固定(初始化决定)自适应(数据驱动)
非线性线性化近似保留非线性
表达能力受限于RKHS可超越RKHS
缩放性能固定缩放指数可能更优

1.3 Regime边界的数学刻画

宽度临界值1

其中 是参数量, 是核Regime下的缩放指数。

特征学习有效的宽度范围


2. 任务难度分类

2.1 三类任务定义

根据目标函数与RKHS的关系,任务可分为三类:

2.1.1 简单任务(Super Easy Tasks)

定义:目标函数位于初始NTK的RKHS内。

特征学习收益:无。两种Regime缩放指数相同。

2.1.2 中等难度任务(Easy Tasks)

定义:目标函数在RKHS边界附近。

特征学习收益:有限,但可观测。

2.1.3 困难任务(Hard Tasks)

定义:目标函数完全位于RKHS外。

特征学习收益:显著。缩放指数可能提高近一倍。

2.2 任务难度的数学刻画

import numpy as np
 
def classify_task_difficulty(
    ntk_kernel: np.ndarray,      # NTK矩阵 (N x N)
    y: np.ndarray,               # 标签 (N,)
    lambda_reg: float = 0.01    # 正则化参数
) -> dict:
    """
    分类任务难度
    
    通过分析目标函数在RKHS中的范数来分类
    """
    N = len(y)
    
    # 计算f*在RKHS中的范数估计
    # f*_RKHS_norm^2 = y^T K^(-1) y (近似)
    K_inv = np.linalg.inv(ntk_kernel + lambda_reg * np.eye(N))
    f_norm_sq = y @ K_inv @ y
    
    # 计算"核预测"的残差
    y_pred = ntK_kernel @ K_inv @ y
    residual = np.mean((y - y_pred) ** 2)
    
    # 分类
    if f_norm_sq < 1e3:
        difficulty = 'super_easy'
        feature_learning_gain = 'minimal'
    elif f_norm_sq < 1e6:
        difficulty = 'easy'
        feature_learning_gain = 'moderate'
    else:
        difficulty = 'hard'
        feature_learning_gain = 'significant'
    
    return {
        'difficulty': difficulty,
        'estimated_rkhs_norm': np.sqrt(f_norm_sq),
        'residual_error': residual,
        'feature_learning_gain': feature_learning_gain,
        'recommendation': 'prefer_feature_learning' if difficulty == 'hard' else 'either_regime'
    }

2.3 典型任务的难度分类

任务类型示例估计难度特征学习收益
低频函数拟合正弦波Super Easy
简单分类MNISTEasy有限
复杂函数CIFAR-10Hard显著
语言建模LLM预训练Very Hard极高

3. 核心定理:特征学习改善缩放

3.1 缩放指数的比较

定理1(Hard Tasks的缩放改善)1

对于位于RKHS外的目标函数,特征学习Regime相对于核Regime的缩放改善为:

即特征学习可将近一倍地改善缩放指数。

3.2 形式化分析

核Regime缩放(对Hard Tasks):

这是因为RKHS无法捕获RKHS外的函数。

特征学习Regime缩放

其中 由数据谱结构决定(见冗余理论)。

3.3 证明直觉

Hard Task的困难性
         │
         │  f* ∉ RKHS
         │
         │        核Regime:无法利用非线性
         │        只能通过"插值"近似
         │        → 收敛极慢 (log^-1)
         │
         └──────────────────────────── f*
              │
              │  特征学习:可学习f*特有的特征
              │  自适应地构建捕获f*的表示
              │  → 快速收敛 (N^(-α))
              │
              └──────────────────────→ N

4. 可解模型分析

4.1 单索引模型(Single Index Model)

模型设置

其中 是非线性函数, 是未知方向。

理论结果

Regime泛化误差缩放
核Regime
特征学习

改进因子:2倍

4.2 多项式目标(Polynomial Targets)

模型设置

特征学习的优势

  • 核Regime需要 样本才能恢复 次多项式
  • 特征学习仅需 样本

4.3 代码验证

import torch
import torch.nn as nn
import numpy as np
 
class PolynomialTargetExperiment:
    """
    验证特征学习对多项式目标的改善
    """
    
    def __init__(self, degree: int, input_dim: int):
        self.degree = degree
        self.input_dim = input_dim
    
    def generate_data(self, n_samples: int):
        """生成多项式目标数据"""
        X = np.random.randn(n_samples, self.input_dim)
        
        # 真实多项式目标
        w_true = np.random.randn(self.input_dim)
        y = sum((X @ w_true) ** k for k in range(1, self.degree + 1))
        y += 0.1 * np.random.randn(n_samples)  # 加噪声
        
        return torch.FloatTensor(X), torch.FloatTensor(y)
    
    def train_and_evaluate(
        self, 
        model: nn.Module,
        train_loader,
        test_loader,
        epochs: int
    ) -> dict:
        """训练并评估"""
        optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
        criterion = nn.MSELoss()
        
        losses = []
        for epoch in range(epochs):
            for X, y in train_loader:
                optimizer.zero_grad()
                pred = model(X).squeeze()
                loss = criterion(pred, y)
                loss.backward()
                optimizer.step()
            losses.append(loss.item())
        
        # 最终测试误差
        with torch.no_grad():
            X_test, y_test = test_loader.dataset.tensors
            test_pred = model(X_test).squeeze()
            test_error = criterion(test_pred, y_test).item()
        
        return {
            'final_train_loss': losses[-1],
            'final_test_error': test_error,
            'loss_trajectory': losses
        }

5. 计算最优训练的修正

5.1 经典Chinchilla建议

经典Chinchilla定律建议(基于核Regime假设):

5.2 特征学习Regime的修正

定理2(修正的最优分配)1

对于Hard Tasks,特征学习Regime建议:

关键洞察:更多参数、更少数据

5.3 修正对比

def compare_allocation_strategies(
    compute_budget: float,
    task_difficulty: str,
    base_params: dict = {
        'chin_chilla_N': 0.4,
        'chin_chilla_D': 0.6,
        'feature_learning_N': 0.5,
        'feature_learning_D': 0.5
    }
) -> dict:
    """
    比较不同任务难度下的最优分配策略
    """
    
    if task_difficulty in ['super_easy', 'easy']:
        # 简单任务:核Regime假设成立
        return {
            'strategy': 'chinchilla',
            'N_opt': compute_budget ** base_params['chin_chilla_N'],
            'D_opt': compute_budget ** base_params['chin_chilla_D'],
            'rationale': '简单任务下核Regime与特征学习效果相近'
        }
    else:
        # 困难任务:特征学习建议
        return {
            'strategy': 'feature_learning',
            'N_opt': compute_budget ** base_params['feature_learning_N'],
            'D_opt': compute_budget ** base_params['feature_learning_D'],
            'N_increase_ratio': (
                compute_budget ** base_params['feature_learning_N'] /
                compute_budget ** base_params['chin_chilla_N']
            ),
            'D_decrease_ratio': (
                compute_budget ** base_params['feature_learning_D'] /
                compute_budget ** base_params['chin_chilla_D']
            ),
            'rationale': '困难任务下增加参数、减少数据更高效'
        }

6. 有限宽度效应与特征学习窗口

6.1 特征学习的有效宽度范围

关键发现:特征学习仅在有限宽度窗口内有效:

其中 是允许有效特征学习的最大宽度。

6.2 窗口边界分析

下界

其中 是数据协方差矩阵的最小特征值。

上界

时,网络退化为近核行为。

6.3 宽度效应的可视化

泛化误差
    │
    │      核Regime: m > m_kernel
    │                特征被"冻结"
    │                 ↘
    │    ═══════════════╗
    │                   ║  特征学习窗口
    │    特征学习有效    ║  m_min < m < m_kernel
    │        ↗          ║
    │      ╱             ║
    │    ╱               ╚═══════════════
    │  ╱                              ↘
    │╱                          过宽导致退化
    └──────────────────────────────────→ 宽度 m
         m_min      m_kernel

7. 实践指南

7.1 判断是否应该使用特征学习

def should_use_feature_learning(
    task_type: str,
    data_complexity: str,
    available_compute: float
) -> dict:
    """
    判断是否应该优先使用特征学习
    """
    
    # 启发式判断
    hard_task_indicators = [
        'language_modeling',
        'complex_vision',
        'multi_modal',
        'scientific'
    ]
    
    if task_type in hard_task_indicators:
        return {
            'use_feature_learning': True,
            'confidence': 'high',
            'recommended_strategy': 'prefer_wider_models'
        }
    else:
        return {
            'use_feature_learning': None,  # 两种Regime效果相近
            'confidence': 'medium',
            'recommended_strategy': 'chinchilla_allocation'
        }

7.2 架构设计建议

任务类型推荐宽度推荐深度理由
简单分类中等较浅避免过宽导致退化
复杂视觉较宽适中充分利用特征学习
语言建模极宽较深Hard Task,需要特征学习
科学计算任务相关任务相关取决于函数复杂度

7.3 训练策略

def feature_learning_aware_training(
    model_config: dict,
    compute_budget: float,
    task_difficulty: str
) -> dict:
    """
    考虑特征学习的训练策略
    """
    
    if task_difficulty == 'hard':
        # 困难任务:增加参数,减少训练token
        return {
            'batch_size': 'large',      # 更大的batch减少epoch
            'learning_rate': 'moderate',  # 适中learning rate
            'epochs': 'fewer_than_chinchilla',
            'note': '特征学习Regime建议更多参数、更少token'
        }
    else:
        # 简单任务:Chinchilla分配
        return {
            'batch_size': 'standard',
            'learning_rate': 'standard',
            'epochs': 'follow_chinchilla',
            'note': '核Regime假设成立'
        }

8. 与其他理论的关系

8.1 与冗余理论的联系

理论核心变量解释
冗余理论谱指数 为什么存在幂律缩放
特征学习理论任务难度何时能超越核Regime
统一-两者共同决定实际缩放性能

8.2 与频率原则的联系

频率原则指出网络按频率学习。特征学习Regime的解释:

  • 核Regime:只能学习初始化决定的频率
  • 特征学习:可以学习数据特有的频率结构

这解释了为什么特征学习对Hard Tasks特别有效。

8.3 与Scale-time等价性的联系

Scale-time等价性在两种Regime中表现不同:

当宽度超出窗口时,等价性不再精确成立。


9. 实验验证框架

9.1 识别特征学习的实验

def identify_feature_learning_regime(
    model_widths: list,
    n_params_per_width: list,
    test_losses: list,
    kernel_predictions: list
) -> dict:
    """
    通过比较实际损失与核预测来识别特征学习
    
    如果实际损失显著低于核预测 → 特征学习发生
    """
    import numpy as np
    
    width_effects = []
    for w, params, loss, kp in zip(
        model_widths, n_params_per_width, test_losses, kernel_predictions
    ):
        improvement = (kp - loss) / kp
        width_effects.append({
            'width': w,
            'params': params,
            'kernel_prediction': kp,
            'actual_loss': loss,
            'improvement_over_kernel': improvement,
            'feature_learning_detected': improvement > 0.1  # 10%改善阈值
        })
    
    # 判断是否存在特征学习
    fl_detected = any(we['feature_learning_detected'] for we in width_effects)
    
    return {
        'feature_learning_present': fl_detected,
        'width_effects': width_effects,
        'recommendation': 'use_fl_strategy' if fl_detected else 'kernel_strategy'
    }

9.2 测量特征学习收益

def measure_feature_learning_gain(
    easy_tasks_results: dict,
    hard_tasks_results: dict
) -> dict:
    """
    测量特征学习对不同难度任务的收益
    """
    
    def compute_gain(results):
        """计算核Regime vs 特征学习的损失比率"""
        return {
            task: results[task]['fl_loss'] / results[task]['kernel_loss']
            for task in results
        }
    
    easy_gains = compute_gain(easy_tasks_results)
    hard_gains = compute_gain(hard_tasks_results)
    
    return {
        'easy_tasks_avg_gain': np.mean(list(easy_gains.values())),
        'hard_tasks_avg_gain': np.mean(list(hard_gains.values())),
        'gain_ratio': np.mean(list(hard_gains.values())) / np.mean(list(easy_gains.values())),
        'conclusion': '特征学习对Hard Tasks的收益显著更高' if 
                       np.mean(list(hard_gains.values())) > np.mean(list(easy_gains.values())) * 1.5 
                       else '两种任务收益相近'
    }

10. 参考

Footnotes

  1. Bordelon, B., et al. (2025). How Feature Learning Can Improve Neural Scaling Laws. ICLR 2025. https://arxiv.org/abs/2409.17858 2 3 4