Code to Define a Artificial Neuron
sigmoid activation function(激活函数):
σ(x)=11+e?x\sigma(x)=\frac{1}{1+e^{-x}}σ(x)=1+e?x1?
class Neuron(object):# ... def forward(inputs):""" 假设输入和权重是1-D的numpy数组,偏差是一个数字 """cell_body_sum = np.sum(inputs * self.weights) + self.biasfiring_rate = 1.0 / (1.0 + math.exp(-cell_body_sum)) # sigmoid激活函数return firing_rate
- 换句话说,每个神经元都对它的输入 和权重进行点积,然后加上偏差,最后使用非线性函数(或称为激活函数)。本例中使用的是sigmoid函数。在本节的末尾部分将介绍不同激活函数的细节。
In Assignment 2: Writing a 2-layer net
Activation functions(常用激活函数):
- Sigmoid将(软)饱和并逐渐梯度消失
- Sigmoid输出不是以零为中心的
- Tanh(软)饱和并逐渐梯度消失
- Tanh输出以零为中心
-
ReLU收敛比sigmoid / tanh函数快得多(6倍之多)。
-
ReLU是一个关于0的阈值激活函数。
-
不幸的是,ReLU单位在训练期间可能很脆弱并且可能“死亡”(硬饱和)
举例来说,当一个很大的梯度流过ReLU的神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。如果这种情况发生,那么从此所以流过这个神经元的梯度将都变成0。也就是说,这个ReLU单元在训练中将不可逆转的死亡,因为这导致了数据多样化的丢失。
- Leaky ReLU将会有一个小的负斜率
- 负区域的斜率也可以作为每个神经元的参数
- 然而,目前尚不清楚各项任务的利益一致性
- Leaky ReLU是为解决“ReLU死亡”问题的尝试。ReLU中当x<0时,函数值为0。而Leaky ReLU则是给出一个很小的负数梯度值,比如0.01。有些研究者的论文指出这个激活函数表现很不错,但是其效果并不是很稳定。Kaiming He等人在2015年发布的论文Delving Deep into Rectifiers中介绍了一种新方法PReLU,把负区间上的斜率当做每个神经元中的一个参数。然而该激活函数在在不同任务中均有益处的一致性并没有特别清晰。
- ReLU和Leaky ReLU都是Maxout的特例
- Maxout神经元享有ReLU单元的所有好处(线性操作方式,无饱和)并且没有其缺点(死亡的ReLU单元)
- 但它使每个神经元的参数数量翻倍,这就导致整体参数的数量激增。
Summary
- We arrange neurons into fully-connected layers。
- The abstraction of a layer has the nice property that it
allows us to use efficient vectorized code (e.g. matrix
multiplies) - Neural networks are not really neural
- 图层的抽象具有很好的属性,它允许我们使用有效的矢量化代码(例如矩阵乘法)
- 在同一个网络中混合使用不同类型的神经元是非常少见的
- “那么该用那种呢?”用ReLU非线性函数。注意设置好学习率,或许可以监控你的网络中死亡的神经元占的比例。如果单元死亡问题困扰你,就试试Leaky ReLU或者Maxout,不要再用sigmoid了。也可以试试tanh,但是其效果应该不如ReLU或者Maxout。
- 介绍了神经网络,神经元通过全连接层连接,层间神经元两两相连,但是层内神经元不连接
- 理解了分层的结构能够让神经网络高效地进行矩阵乘法和激活函数运算
- 理解了神经网络是一个通用函数近似器,但是该性质与其广泛使用无太大关系。之所以使用神经网络,是因为它们对于实际问题中的函数的公式能够某种程度上做出“正确”假设。
- The regularization strength is the preferred way to control the overfitting of a neural network.(正则化强度是控制神经网络过度拟合的首选方式)
- Neural Networks with more neurons can express more complicated
functions(具有更多神经元的神经网络可以表达更复杂
功能)