|
谚语说:一瓶子不满,半瓶子逛荡!
别人晃动一个瓶子,你听声音,当出现声音时你可以判断里面有液体并且不满,这个晃动的动作帮助了你的判断。
有研究证实,人睡觉的时候环境噪声还是必须的,绝对安静的房间里面你自己反而睡不着,最适宜的噪声是高斯白噪声,当然这个噪声不能强度太大。
利用噪声帮助动物觅食,帮助人体平衡,健康恢复,手术钳的稳定等等,越来越多的证据表明适宜的扰动是非常有利生物体的功能体现的。
信息处理中许多低精度传感器,这些传感器在噪声的有益扰动下,得到精度高的估计和检测是我们的研究目标。
最近机器学习中噪声的作用也非常热,统计学习方法中如何利用这种扰动,有很多学者开始了慢慢尝试也得到了很多结果,值得我们继续深入!
噪声在寻优过程中是非常有用处的,模拟退火实际就是一开始加以扰动,温度代表了扰动强度,噪声强度慢慢降低,等系统稳定了,那么一个可以接受的局部最优解出现了。下面这个例子就说明了系统学习过程中噪声是有利的,和随机共振的思想有非常相似之处。
模拟退火优化算法:噪声的作用
当我们有多个局部最优点的时候,模拟退火随机优化非常有意义,基本思想 就是给初始点进行迭代,数据点的更新用噪声进行扰动,然后判断其对应的函数值是否比前面一步低,如果低则更新,否则继续扰动。注意的是,当接近最优点时候,扰动则需要控制好方差,慢慢收敛。这种方法适用于多个局部最优点,找到的解可以接受但是不一定全局最优。
f = @(x) real(besselj(2,x)); ezplot(f,[-50,50])
这是一个Bessel函数,有多个局部最优值,两个全局最优值,如果用导数为零确定解有无穷多,还是不能判定那个点是最小值。用模拟退火,我们定义温度随着迭代次数成指数衰减率
k = 1e-2;
sched1 = @(iter) exp(-k*iter);
X = 0;%给定初始点
MaxIter = 20000;%最大迭代次数
X_T = zeros(MaxIter,2);
fold = f(X);%初始函数值
X_T(1,:) = [X,fold];
std0 = 3;%初始噪声均方根,方差为9
for iter = 2:MaxIter
% current temperature (using the exponential form)
T = sched1(iter);%当前噪声方差的系数值
Xpert = std0*randn(1)*sqrt(T);%当前值的扰动值
Xnew = X + Xpert;%更新当前坐标值
fnew = f(Xnew);%更新函数值
if fnew < fold
X = Xnew;%如果函数减小,则接受更新
fold = fnew;
X_T(iter,:) = [X,fnew];
elseif rand(1) <= (T^2)
X = Xnew;% 为了防止陷入局部最优值,一定的概率更新
fold = fnew;
acceptflag = false;
X_T(iter,:) = [X,fnew];
else
X_T(iter,:) = [X,fold];
end
end
[fmin,minind] = min(X_T(:,2));%最后找到循环次数内的最小值
x1 = min(-50,min(X(:,1)));
x2 = max(50,max(X(:,1)));
ezplot(f,[x1,x2])
hold on
plot(X_T(:,1),X_T(:,2),'r-')
plot(X_T(minind,1),fmin,'go')
hold off
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-27 07:38
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社