optimizableVariable
是 MATLAB 中用于定义可优化变量的类,它是贝叶斯优化(bayesopt
)等优化算法的核心组件之一。通过使用 optimizableVariable
,你可以创建超参数空间中的变量,并在贝叶斯优化过程中进行调优。这个类允许你定义不同类型的优化变量(如实数、整数、分类变量等),并为它们指定一个取值范围、类型和其他相关属性。
主要属性和功能
optimizableVariable
用于描述优化过程中的一个超参数。它的主要功能是让你能够灵活地定义优化变量,并确保优化过程能够正确地执行。
基本语法
variable = optimizableVariable(Name, Range)
variable = optimizableVariable(Name, Range, Name, Value)
Name
:变量的名称,字符串或字符向量。Range
:指定变量的取值范围,可以是数值向量、分类名称的字符串数组或元胞数组。Name, Value
:可选的键值对,用于设置更多的属性。
1. Name
(变量名)
- 类型:字符向量或字符串标量。
- 描述:指定变量的名称。变量名必须是唯一的,且不能与其他优化变量的名称重复。
- 例子:
variable = optimizableVariable('LearningRate', [0.001, 0.1]);
2. Range
(变量范围)
-
类型:可以是 2 元素的数值向量、字符串数组或元胞数组。
-
描述:
- 对于 实数 或 整数 变量,
Range
是一个包含 最小值和最大值 的 2 元素数值向量,用来限定该变量的取值范围。 - 对于 分类变量,
Range
是一个包含所有可能类别的字符串数组或元胞数组,表示分类变量的所有离散值。
- 对于 实数 或 整数 变量,
-
例子:
- 实数变量:
variable = optimizableVariable('LearningRate', [0.001, 0.1]);
- 整数变量:
variable = optimizableVariable('NumTrees', [10, 100], 'Type', 'integer');
- 分类变量:
variable = optimizableVariable('Optimizer', {'SGD', 'Adam', 'RMSprop'}, 'Type', 'categorical');
- 实数变量:
3. Type
(变量类型)
-
类型:字符串,取值为
'real'
、'integer'
或'categorical'
。 -
描述:
'real'
:实数变量,默认类型,表示变量是一个连续值。'integer'
:整数变量,表示变量取值为整数。'categorical'
:分类变量,表示变量取值为离散的类别。
-
例子:
variable = optimizableVariable('LearningRate', [0.001, 0.1], 'Type', 'real'); variable = optimizableVariable('NumFilters', [16, 32, 64], 'Type', 'integer'); variable = optimizableVariable('Activation', {'relu', 'tanh', 'sigmoid'}, 'Type', 'categorical');
4. Transform
(转换方式)
-
类型:字符串,取值为
'none'
或'log'
。 -
描述:
'none'
(默认值):不应用任何变换。'log'
:应用对数变换,通常用于范围跨度较大的变量,帮助优化算法在对数尺度上进行搜索。
对于
'log'
变换,变量必须是 正实数 或 非负整数。 -
例子:
variable = optimizableVariable('LearningRate', [0.001, 0.1], 'Transform', 'log'); variable = optimizableVariable('NumFilters', [16, 1024], 'Type', 'integer', 'Transform', 'log');
5. Optimize
(是否优化)
- 类型:逻辑值(
true
或false
)。 - 描述:指示该变量是否参与优化。默认值为
true
,表示参与优化。设置为false
时,表示该变量不会参与优化过程。 - 例子:
variable = optimizableVariable('LearningRate', [0.001, 0.1], 'Optimize', false); % 不优化该变量
使用 optimizableVariable
的完整示例
假设你要优化一个机器学习模型的超参数,包括学习率(LearningRate
)、层数(NumLayers
)和激活函数(Activation
)。你可以这样定义这些变量:
% 定义优化变量
LearningRate = optimizableVariable('LearningRate', [0.0001, 0.1], 'Type', 'real');
NumLayers = optimizableVariable('NumLayers', [2, 10], 'Type', 'integer');
Activation = optimizableVariable('Activation', {'relu', 'tanh', 'sigmoid'}, 'Type', 'categorical');
% 将优化变量组合成一个数组
optimVars = [LearningRate, NumLayers, Activation];
% 定义目标函数
objectiveFunction = @(optVars) myModel(optVars.LearningRate, optVars.NumLayers, optVars.Activation);
% 使用贝叶斯优化进行优化
results = bayesopt(objectiveFunction, optimVars, ...
'MaxObjectiveEvaluations', 50, ...
'AcquisitionFunction', 'expected-improvement', ...
'Verbose', 1);
修改属性
你可以在 optimizableVariable
创建后,使用 点符号(dot notation) 来修改它的属性。这让你可以灵活调整优化过程中的参数设置。
% 修改一个变量的范围
LearningRate.Range = [0.0001, 0.05];
% 修改一个变量的类型
NumLayers.Type = 'real';
% 修改一个变量的变换方式
Activation.Transform = 'log';
总结
optimizableVariable
是 MATLAB 贝叶斯优化框架中非常重要的一个类,它允许你定义超参数的名称、类型、范围和其他属性,进而用于优化任务。它支持连续变量、整数变量和分类变量,并允许你应用对数变换来改善优化效果。通过定义多个优化变量,你可以进行高效的贝叶斯优化,找到最佳的超参数组合。