在深度學習中,超參數調整是提升模型性能的關鍵環節。以下是 MATLAB 中調整超參數的系統性方法,涵蓋核心參數、優化策略及實戰案例:
一、關鍵超參數及其影響
超參數 | 作用 | 典型范圍 |
---|---|---|
學習率 (Learning Rate) | 控制參數更新步長,影響收斂速度和穩定性 | 0.0001 ~ 0.1 |
批量大小 (Batch Size) | 每次迭代使用的樣本數,影響訓練速度和泛化能力 | 8, 16, 32, 64, 128 |
訓練輪數 (Epochs) | 整個數據集的訓練次數,影響模型學習程度 | 10 ~ 100+ |
優化器 (Optimizer) | 決定參數更新算法,如 SGD、Adam、RMSprop | SGD, Adam, Adagrad |
Dropout 率 | 隨機忽略神經元的比例,防止過擬合 | 0.2 ~ 0.5 |
網絡深度 | 模型層數,影響表達能力 | 依任務而定(如 CNN: 5~50 層) |
隱含層神經元數量 | 每層神經元數量,影響模型復雜度 | 16, 32, 64, 128, 256 |
二、超參數調整策略
1. 手動調參(基于經驗)
% 示例:手動調整學習率和批量大小
options = trainingOptions('sgdm', ...'InitialLearnRate', 0.001, ... % 初始學習率'LearnRateSchedule', 'piecewise', ... % 學習率調度策略'LearnRateDropFactor', 0.1, ... % 學習率衰減因子'LearnRateDropPeriod', 10, ... % 每10個epochs衰減一次'MiniBatchSize', 64, ... % 批量大小'MaxEpochs', 30, ... % 最大訓練輪數'DropoutProbability', 0.5); % Dropout率
2. 網格搜索(Grid Search)
% 定義超參數搜索空間
hyperparams = struct(...'LearnRate', optimizableVariable('log', [1e-4, 1e-2]), ... % 學習率范圍'BatchSize', optimizableVariable('discrete', [32, 64, 128]), ... % 批量大小選項'DropoutProb', optimizableVariable('continuous', [0.2, 0.5])); % Dropout率范圍% 定義訓練函數
function valAccuracy = myTrainingFcn(hyperparams)% 創建網絡layers = [imageInputLayer([224 224 3]); ...convolution2dLayer(3, 16); ...reluLayer; ...maxPooling2dLayer(2); ...fullyConnectedLayer(10); ...softmaxLayer; ...classificationLayer];% 設置訓練選項options = trainingOptions('adam', ...'InitialLearnRate', hyperparams.LearnRate, ...'MiniBatchSize', hyperparams.BatchSize, ...'DropoutProbability', hyperparams.DropoutProb, ...'MaxEpochs', 10, ...'ValidationData', valData, ...'Verbose', false);% 訓練網絡net = trainNetwork(trainData, layers, options);% 在驗證集上評估YPred = classify(net, valData);YVal = valData.Labels;valAccuracy = mean(YPred == YVal);
end% 執行網格搜索
results = hyperparameterOptimization(@myTrainingFcn, hyperparams, ...'SearchMethod', 'randomsearch', ... % 隨機搜索(比網格搜索更高效)'MaxObjectiveEvaluations', 20); % 最多嘗試20組參數% 顯示最佳參數
bestParams = results.OptimalPoint;
fprintf('最佳學習率: %.6f\n', bestParams.LearnRate);
fprintf('最佳批量大小: %d\n', bestParams.BatchSize);
fprintf('最佳Dropout率: %.2f\n', bestParams.DropoutProb);
3. 貝葉斯優化(Bayesian Optimization)
% 使用貝葉斯優化(需要Statistics and Machine Learning Toolbox)
results = hyperparameterOptimization(@myTrainingFcn, hyperparams, ...'SearchMethod', 'bayesian', ... % 貝葉斯優化'AcquisitionFunctionName', 'expected-improvement-plus', ... % 采集函數'MaxObjectiveEvaluations', 15);
4. 學習率調度(Learning Rate Scheduling)
% 指數衰減學習率
options = trainingOptions('sgdm', ...'InitialLearnRate', 0.01, ...'LearnRateSchedule', 'exponential', ...'LearnRateFactor', 0.95, ... % 每輪衰減因子'LearnRatePeriod', 1); % 每輪更新一次% 余弦退火學習率
options = trainingOptions('sgdm', ...'InitialLearnRate', 0.01, ...'LearnRateSchedule', 'cosine', ...'LearnRateDropPeriod', 20); % 余弦周期
三、實戰案例:MNIST 超參數優化
% 加載數據
digitDatasetPath = fullfile(matlabroot, 'toolbox', 'nnet', ...'nndemos', 'nndatasets', 'DigitDataset');
imds = imageDatastore(digitDatasetPath, ...'IncludeSubfolders', true, ...'LabelSource', 'foldernames');% 劃分訓練集和驗證集
[imdsTrain, imdsVal] = splitEachLabel(imds, 0.8, 'randomized');% 定義超參數搜索空間
hyperparams = struct(...'LearnRate', optimizableVariable('log', [1e-4, 1e-2]), ...'BatchSize', optimizableVariable('discrete', [32, 64, 128]), ...'Momentum', optimizableVariable('continuous', [0.8, 0.99]));% 定義訓練函數
function valAccuracy = mnistTrainingFcn(hyperparams)% 創建簡單CNNlayers = [imageInputLayer([28 28 1])convolution2dLayer(5, 20)reluLayermaxPooling2dLayer(2)convolution2dLayer(5, 50)reluLayermaxPooling2dLayer(2)fullyConnectedLayer(500)reluLayerfullyConnectedLayer(10)softmaxLayerclassificationLayer];% 設置訓練選項options = trainingOptions('sgdm', ...'InitialLearnRate', hyperparams.LearnRate, ...'Momentum', hyperparams.Momentum, ...'MiniBatchSize', hyperparams.BatchSize, ...'MaxEpochs', 10, ...'ValidationData', imdsVal, ...'ValidationFrequency', 30, ...'Verbose', false);% 訓練網絡net = trainNetwork(imdsTrain, layers, options);% 評估驗證集準確率YPred = classify(net, imdsVal);valAccuracy = mean(YPred == imdsVal.Labels);
end% 執行超參數優化
results = hyperparameterOptimization(@mnistTrainingFcn, hyperparams, ...'MaxObjectiveEvaluations', 10, ...'Verbose', true);% 可視化結果
figure
plotHyperparameterOptimizationResults(results)
title('MNIST超參數優化結果')
四、調參技巧與注意事項
-
學習率調參技巧:
- 從較大值 (如 0.1) 開始,觀察損失函數是否發散
- 若損失震蕩或不下降,降低學習率 (如 0.01, 0.001)
- 使用學習率預熱 (warmup) 和余弦退火策略
-
批量大小調參技巧:
- 小批量 (8-32):訓練更穩定,泛化能力強
- 大批量 (64-256):訓練速度快,但可能陷入局部最優
- 大批量訓練時需配合更高學習率
-
避免常見陷阱:
- 過擬合:增加訓練數據、添加正則化、減小網絡復雜度
- 欠擬合:增加網絡深度 / 寬度、延長訓練時間
- 梯度消失 / 爆炸:使用 ReLU 激活函數、Batch Normalization、梯度裁剪
-
高效調參策略:
- 先快速驗證關鍵參數 (如學習率、批量大小)
- 使用早停 (early stopping) 避免過度訓練
- 采用遷移學習時,微調階段學習率應更小