使用余弦激活函数似乎表现非常糟糕

数据挖掘 机器学习 神经网络 matlab
2021-09-20 03:24:29

我创建了一个神经网络来对 MNIST 手写数字数据集进行分类。它使用softmax作为输出层的激活函数和隐藏层的各种其他函数。

在这个问题的帮助下,我的实现似乎通过了所有激活函数的梯度检查,但是当涉及到我的训练数据的实际运行时,如果我使用sigmoid ,我得到的准确度约为 87%或tanh作为隐藏层的激活函数,但如果我使用余弦,它会返回 9% 的准确度。用更多的迭代(100、200、500)训练网络也没有任何效果,事实上,无论经过多少个时期,我的最小化函数都无法移动到成本函数的 2.18xxx 以下。

在使用余弦之前是否需要执行一些预处理步骤,如果不是,为什么这个激活函数工作得如此糟糕?

1个回答

余弦不是常用的激活函数。

查看描述常见激活函数的维基百科页面,它没有列出。

该页面上描述的激活函数理想属性之一是:

在原点附近近似同一性:当激活函数具有此属性时,当使用小的随机值初始化其权重时,神经网络将有效地学习。当激活函数在原点附近不近似恒等时,初始化权重时必须特别小心。

cos(0)=1,一个基本的余弦函数没有这个性质。结合其周期性特性,这使得获得正确的起始条件和其他超参数以使网络在使用时进行学习似乎特别棘手。

此外,余弦不是单调的,这意味着误差面可能比 sigmoid 更复杂。

我建议尝试使用低学习率,并将所有偏差值初始化为π2. 也许也可以稍微减少初始权重的方差,只是从接近零的东西开始。本质上这是从sin(). 警告:并不是我自己尝试过这个,只是一个有根据的猜测,所以我很想知道这是否有助于稳定性。