饱和函数是一种特殊类型的函数,当输入达到某个特定的值后,函数的输出将不再随输入的增加而增加,即输出达到最大或最小值并保持不变。在神经网络中,激活函数常常采用饱和函数来避免梯度消失的问题,增强网络的表示能力和拟合性能。
饱和函数的特点:
-
右饱和 :当输入值趋近于正无穷时,函数值趋近于0。
-
左饱和 :当输入值趋近于负无穷时,函数值趋近于0。
-
硬饱和 :存在一个常数c,当输入值大于c时,函数导数为0。
-
软饱和 :存在一个常数c,当输入值大于c时,函数导数趋近于0;当输入值小于c时,函数导数不趋于0。
常见的饱和函数:
-
Sigmoid函数 :
h(x) = 1 / (1 + e^(-x))
-
双曲正切函数(Tanh) :
h(x) = tanh(x) = (e^x - e^(-x)) / (e^x + e^(-x))
-
ReLU函数 :
h(x) = max(0, x)
-
Leaky ReLU :
h(x) = max(αx, x)
,其中α
是一个小的正数。
饱和函数的应用:
-
在神经网络中作为激活函数,增加网络的非线性表达能力。
-
在控制系统中,如滑模控制,用于限制系统状态的变化范围。
饱和函数的构造示例(MATLAB):
function M = sat(x, k)
d = abs(x / k);
if d <= 1
M = x / k;
else
M = sign(x / k);
end
end
这个函数接受输入x
和比例常数k
,当x
的绝对值小于或等于k
时,输出为x / k
,否则输出为x / k
的符号。
注意事项:
-
饱和函数可能导致梯度消失,这在深度神经网络训练中是一个问题。
-
在设计神经网络时,选择合适的激活函数对网络性能至关重要。