-
神经网络的激活函数必须使用非线性函数。
考虑把线性函数 h(x) = cx 作为激活函数,把y(x) = h(h(h(x)))的运算对应3层神经网络A。这个运算会进行y(x) = c × c × c × x的乘法运算,但是同样的处理可以由y(x) = ax(注意,a = c × c × c)这一次乘法运算(即没有隐藏层的神经网络)来表示。这样一来,加深神经网络的层数就失去了它的意义。 -
神经网络的前向处理(forward)
前向(forward)处理表示的是从输入到输出方向的传递处理,
后向(backward)处理表示的是从输出到输入方向的传递处理
前向处理可以通过巧妙地使用NumPy多维数组来实现。通过用前一层的输出(被激活函数转换后的信号)和这一层的权重做内积然后加上这一层的偏置,得到加权和,将加权和用激活函数转换后得到本层神经元的输出,也即下一层神经元的输入。
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])#W2是第二层权重
B2 = np.array([0.1, 0.2])#B2是第二层偏置
print(Z1.shape) # (3,)#Z1 = sigmoid(A1),Z1是被激活函数sigmoid()转换后的信号,是第一层的输出
print(W2.shape) # (3, 2)
print(B2.shape) # (2,)
A2 = np.dot(Z1, W2) + B2#A代表加权信号和偏置的总和,即加权和
Z2 = sigmoid(A2)#Z2在这里用激活信号将加权和转换
-
机器学习的问题大致可以分为分类问题和回归问题。
分类问题是数据属于哪一个类别的问题。比如,区分图像中的人是男性还是女性
的问题就是分类问题。而回归问题是根据某个输入预测一个(连续的)数值的问题。比如,根据一个人的图像预测这个人的体重的问题就是回归问题(类似“57.4kg”这样的预测)。 -
输出层所用的激活函数,要根据求解问题的性质决定。一般地,回
归问题可以使用恒等函数,二元分类问题可以使用 sigmoid函数,
多元分类问题可以使用 softmax函数。 -
实现 softmax函数时的溢出对策
softmax函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。比如,e的10次方的值会超过20000,e的100次方会变成一个后面有40多个0的超大值,e的1000次方的结果会返回一个表示无穷大的inf。如果在这些超大值之间进行除法运算,结果会出现“不确定”的情况。
>>> a = np.array([1010, 1000, 990])
>>> np.exp(a) / np.sum(np.exp(a)) # softmax函数的运算
array([ nan, nan, nan]) # 没有被正确计算
对策:
>>> c = np.max(a) # 1010
>>> a - c
array([ 0, -10, -20])
>>>
>>> np.exp(a - c) / np.sum(np.exp(a - c))
array([ 9.99954600e-01, 4.53978686e-05, 2.06106005e-09])
通过减去输入信号中的最大值(c),原本为nan(not a number,不确定)的地方现在被正确计算了。
原理:
在进行softmax的指数函数的运算时,加上(或者减去)某个常数并不会改变运算的结果。
综上,可以像下面这样实现softmax函数
def softmax(a):
c = np.max(a)
exp_a = np.exp(a - c) # 溢出对策
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
- softmax函数的特征
softmax函数的输出是0.0到1.0之间的实数。并且,softmax函数的输出值的总和是1。输出总和为1是softmax函数的一个重要性质。正因为有了这个性质,我们才可以把softmax函数的输出解释为“概率”。也就是说,通过使用softmax函数,我们可以用概率的(统计的)方法处理问题。
一般而言,神经网络只把输出值最大的神经元所对应的类别作为识别结果。并且,即便使用softmax函数,输出值最大的神经元的位置也不会变。因此,神经网络在进行分类时,输出层的softmax函数可以省略。在实际的问题中,由于指数函数的运算需要一定的计算机运算量,因此输出层的softmax函数一般会被省略。
参考资料:《深度学习入门–基于python的理论与实现》,【日】斋藤康毅 著,陆宇杰 译