机器学习基础__05__常见的代价函数和激活函数

目录

1. 常见的代价函数

1.1 回归问题的代价函数

1.2 分类问题的代价函数

2. 常见的激活函数

2.1 为什么需要激活函数?

2.2 sigmoid函数

2.3 tanh函数

2.4 ReLU函数

2.5 LeakyReLU


1. 常见的代价函数

一句话总结:
关于代价函数,回归问题用均方误差,分类问题用交叉熵。

损失函数(Loss Function):是定义在单个样本上的,是指一个样本的误差。
代价函数(Cost Function):是定义在整个训练集上的,是所有样本误差的平均,也就是所有损失函数值的平均。
目标函数(Object Function):是指最终需要优化的函数,一般来说是经验风险+结构风险,也就是(代价函数+正则化项)

1.1 回归问题的代价函数

回归问题一般用圴方误差MSE:
Cost=\frac{1}{M} \sum_{i=1}^{M}\left(f\left(x^{(i)}\right)-y^{(i)}\right)^{2}

为了求导时能消除2,通常写成以下这样:
Cost=\frac{1}{{\color{Red} 2}M} \sum_{i=1}^{M}\left(f\left(x^{(i)}\right)-y^{(i)}\right)^{2}

1.2 分类问题的代价函数

分类问题一般用交叉熵:
H(p, q)=-\sum_{i=1}^{n} p\left(x_{i}\right) \log \left(q\left(x_{i}\right)\right),其中n表示所有事件可能,p是真实分布,q是预测分布。

二分类的交叉熵代价函数是:
Cost = -\frac{1}{m}\left[\sum_{i=1}^{m} y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right],m是样本个数,y是真实值,h是预测值

 

2. 常见的激活函数

一句话总结:
一般隐层用ReLU/LeakyReLU,输出层二分类为sigmoid,多分类用softmax

2.1 为什么需要激活函数?

激活函数是用来加入非线性因素的,因为线性模型的表达能力不够
如果不用激励函数,那么网络结构的每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的表达能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)

2.2 sigmoid函数

\text { sigmoid }=\sigma(z)=\frac{1}{1+e^{-z}},函数图像如下:
                                         

它的导数:\sigma(z)^{\prime}=\frac{e^{-z}}{\left(1+e^{-z}\right)^{2}}=\sigma(z) *(1-\sigma(z)),导数图像如下:
                                      
注,当z在(-5, 5)之外,\sigma(z)^{\prime}值接近0.
致命缺点:当输入稍大或稍小时,导数接近0

优点
把输出值压缩在[0, 1]之间

缺点
1> 梯度消失问题
当输入值很大或很小时,也就是说当输入值向横轴的两端延伸时,导数接近于0。如果是只有几个sigmoid层的浅层神经网络,这并不会引起很大的问题。然而,当非常多的sigmoid层时,它会导致梯度太小而无法训练,这就是我们说的梯度消失。然后,当n个隐层使用像sigmoid这样的激活函数时,会有n个非常小的导数值乘到一起,这样,随着我们逐层反向传播到初始层,梯度会呈指数级的下降。显然极小的梯度值使得初始层的权值和偏置几乎无法有效的更新。而这些初始层,在识别输入数据的基础模式是至关重要的,它的不准确将导致整个神经网络的不准确。

2.3 tanh函数

函数公式:
f(x)=\frac{\sinh (x)}{\cosh (x)}=\frac{1-e^{-2 x}}{1+e^{-2 x}}=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}=\frac{e^{2 x}-1}{e^{2 x}+1}={\color{Red} 2 \operatorname{sigmoid}(2 x)-1}

它的导数:
f^{\prime}(x)=\tanh ^{\prime}(x)=\operatorname{sech}^{2}(x)=1-\tanh ^{2}(x)

                                  

优点:
以原点为中心对称,收敛速度比sigmoid快

缺点:
并没有解决sigmoid中梯度消失问题

2.4 ReLU函数

它是目前使用最广泛的激活函数

函数公式:
f(x)=\max (0, x),函数图像如下
                             

在输入是负值的情况下,它会输出0,那么神经元就不会被激活。这意味着同一时间只有部分神经元会被激活,从而使得网络很稀疏,进而对计算来说是非常有效率的。正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性

 

它的导数:
f^{'}(x)=\left\{\begin{array}{ll} {1} & {\text { if } x>0} \\ {\text { undefined }} & {\text { if } x=0} \\ {0} & {\text { if } x<0} \end{array}\right.

优点:
1> 消除梯度消失问题
2> 加快训练速度(正因为消除了梯度消失,训练才快)

缺点:
输入是负值时,则完全不激活。

当然relu也存在不足:就是训练的时候很”脆弱”,很容易就”die”了. 举个例子:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这个情况发生了,那么这个神经元的梯度就永远都会是0.实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。 当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。

建议:
1>一般情况下,ReLU表现很好了。
在使用 ReLU,就要注意设置 learning rate,不要让网络训练过程中出现很多 “dead” 神经元。如果“dead”无法解决,可以尝试 Leaky ReLU、PReLU 、RReLU等Relu变体来替代ReLU
2> 不建议使用 sigmoid,如果一定要使用,也可以用 tanh来替代。

2.5 LeakyReLU

数学公式:
f(x)=\max (0, x)+\operatorname{leak}^{\star} \min (0, x)
leak是一个很小的常数,这样保留了一些负轴的值,使得负轴的信息不会全部丢失。

函数图像如下:
                         

LeakyReLU是为了解决ReLU中负值不激活问题。

图像总结:

参考:
1. 一文搞懂交叉熵在机器学习中的使用
2. 常见代价函数
3. 这个讲得很好​​​​​​​

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章