顿搜
激活函数与损失函数深入理解——优化神经网络的学习效率
激活函数
Sigmoid 函数
$$\sigma(z) = \frac{1}{1+ e^{-z}}$$
Softmax 函数
$$a_j^L = \frac{e^{z_j^L}}{\sum_x e^{z_k^L}} $$
- Softmax 的输出都是大于等于 0, 而且总和等于 1。
- 可以认为是概率分布, 所以输出可表示为分类等于每个可能分类标签的概率
如果输出层是 sigmod 计算得出, 因为总和不为1, 所以不能描述为概率分布
tanh 函数
$$\tanh(z) = \frac{e^z -e^{-z}}{e^z + e^{-z}}$$
$$\sigma(z) = \frac{1+tanh(z/2)}{2}$$
tanh 只是一个重新调节了度量的 sigmoid 函数
其取值在 -1 到 1 之间, 不像 sigmoid 在 0, 1 之间, 所以输入要转化到-1, 1之间
rectified linear
$$\max(0,w \cdot x + b)$$
像 sigmoid, tanh 一样, 也可以模拟何函数
优势: 增加权重不会引起饱和, 但加权的输入如果是负数, gradient就为0
总结
要靠实验比较rectified linear和sigmoid, tanh的好坏
目前神经网络还有很多方面理论基础需要研究, 为什么学习能力强, 现在的一些实验表明结果比较好, 但发展底层理论基础还有很长的路要走
损失函数
如果想了解损失函数,请查看损失函数与风险评估详细介绍——统计机器学习模型评价二次损失函数
英文名:quadratic cost function
函数定义
$$C = \frac{1}{2n} \sum_{x} \parallel y(x) - a^L \parallel ^2$$
理想情况是让神经网络学习更快,但使用以上的损失函数,会出现开始学习慢, 后来逐渐变快快的问题.
学习慢原因
学习的过程采用梯度下降法,所以关键在于偏导数的大小
- $\frac{\partial C}{\partial w}$ 和 $\frac{\partial C}{\partial b}$ 比较小, 则每次更新较小,学习就慢
- 对于 sigmoid 函数,当神经元输出接近 1 时, 曲线很平缓,导数很小, 所以学习很慢。
交叉熵损失函数
英文名:cross-entropy cost function
函数定义
$$C = -\frac{1}{n} \sum_{x} \left [ y \ln a + (1-y) \ln(1-a) \right ]$$
$a = \sigma(z)$
$z = w \cdot a + b$
显然 cross-entropy cost 函数满足损失函数的两个条件,因此可以作为损失函数
导数求解
$$ \begin{aligned} \frac{\partial C}{\partial w_j} &= - \frac{1}{n} \sum_{x} \left [\frac{y}{\sigma(z)} - \frac{1-y}{1-\sigma(z)} \right ] \frac{\partial \sigma}{\partial w_j} \\\\ &= - \frac{1}{n} \sum_{x} \left [ \frac{y}{\sigma(z)} - \frac{1-y}{1-\sigma(z)} \right ] \sigma^{'}(z)x_j \\\\ &= \frac{1}{n} \sum_{x} \frac{\sigma^{'}(z)x_j}{\sigma(z)\left [ 1-\sigma(z) \right ]} \left[ \sigma(z) - y \right ] \\\\ &= \frac{1}{n} \sum_{x}x_j \left[ \sigma(z) - y \right ] \end{aligned} $$
同理对 b 求偏导可得
$$\frac{\partial C}{\partial b} = \frac{1}{n} \sum_{x} \left [ \sigma(z) - y \right ]$$
学习快原理
显然,学习的快慢取决于
$$\sigma(z) - y$$
也就是输出的 Error
- 错误大时,更新多,学得快.
- 错误小时,学习慢
这也正是我们想要的结果,在错误比较大的时候,尽量更新的快,当接近真实值时,更新变慢
对数似然估计函数
英文名:log-likelyhood cost function
函数定义
$$C = -\ln a_j^L$$
适合做损失函数:
- 函数值大于等于 0
- 激活函数为 softmax,对于对应的输出神经元, 其输出 $a_j^L$ 接近于 1,则 C 接近于 0.
学习效率
是否存在学习慢的问题取决于偏导数的大小
偏导求解
$$\frac{\partial C}{\partial b_j^L} = a_j^L - y_j$$
$$\frac{\partial C}{\partial w_{jk}^L} = a_k^{L-1}(a_J^L - y_j)$$
显然和 cross-entropy 得到的偏导公式本质上是一样的, 所以可以解决学习慢的问题
损失函数对比
- cross-entropy cost 几乎总是比二次 cost 函数好
- 如果神经元的方程是线性的, 则用二次 cost 函数不会有学习慢的问题