个人博客文章链接: http://www.huqj.top/article?id=164
应用梯度下降法中最为关键的一个步骤就是学习率α的选择,根据梯度下降的数学原理可知:如果学习率过大,可能导致梯度下降发无法收敛甚至发散,而学习率过小又会导致迭代次数过多,影响学习效率。所以通常我们会选择各种学习率测试,最终选择一个比较合适的值作为最终学习率。
但是在一些高级的参数调优算法中,不需要我们手动设置学习率,而是在算法中通过一个内循环自动选择学习率,这也称为“自适应算法”,使用这种方法,我们需要提供一个计算代价函数值和每次梯度下降值的函数,自适应算法根据这个函数为我们自动进行梯度下降学习率的尝试和设置。matlab中的fminunc函数就是这样一种方法。下面介绍如何使用该函数进行逻辑回归。
①编写代价函数,返回某个θ参数下对应的代价值和下一步下降的值
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function [cost, gradient] = CostFunction2(theta, X, y)
%逻辑回归的代价函数
m = size(X, 1);
gradient = zeros(size(theta));
cost = sum(-y' * log(sigmoid(theta' * X'))' - (1 - y)' * log(1 - sigmoid(theta' * X'))') / m;
for i = 1 : size(theta, 1)
gradient(i) = 0;
for j = 1 : m
gradient(i) = gradient(i) + (sigmoid(X(j, :) * theta) - y(j)) * X(j, i);
end
gradient(i) = gradient(i) / m;
end
end
|
②在主程序中将代价函数的函数句柄作为参数传给fminunc函数自动进行训练,最终返回θ值和代价函数值
|
1
2
3
4
5
6
7
8
|
m = size(data, 1);
init_theta = zeros(3, 1);
X = data(:,[1, 2]);
X = [ones(m, 1), X];
y = data(:, 3);
%% 使用 fminunc 训练
options = optimset('GradObj', 'on', 'MaxIter', 800);
[theta, cost] = fminunc(@(t)(CostFunction2(t, X, y)), init_theta, options);
|
数据集和最终学习算法计算出的决策边界如下:

关于fminunc函数的参数options:
|
1
|
options = optimset('GradObj', 'on', 'MaxIter', 800);
|
第一个参数'GradObj'设置为'on'表示使用自定义的梯度下降函数,也就是我们编写的代价函数,而'MaxIter'设置了最大迭代次数。