深度学习入门之输出层的设计

深度学习入门之输出层的设计

参考书籍:深度学习入门——基于pyhthon的理论与实现


文章目录

  • 深度学习入门之输出层的设计
  • 前言
  • 一、分类与回归
  • 二、恒等函数和softmax函数
    • 1.恒等函数
    • 2.softmax函数
  • 三、softmax函数注意事项
    • 1.softmax函数溢出问题
    • 2.softmax函数的特征
  • 总结


前言

神经网络可以用在分类问题和回归问题上,不过需要根据情况改变输出层的激活函数。一般而言,回归问题使用恒等函数,分类问题使用softmax函数。


一、分类与回归

机器学习的问题大致可以分为分类问题和回归问题。分类问题是数据属于哪一个类别的问题。比如,区分图像中的物属于哪一类,对于动物来说,这个动物属于猫还是狗进行类别划分,这个就是一个较为典型的分类问题。而对于回归问题是需要根据某个输入预测一个(连续的)数值的问题,比如,根据一个人的图像的特征预测这个人的体重问题就是回归问题。

二、恒等函数和softmax函数

1.恒等函数

恒等函数会将输入按照原样输出,对于输入信息,不加任何改动地直接输出。因此,在输出层使用恒等函数时,输出信号会原封不动地被输出。数学公式表达的话,如下:
y k = x yk=x yk=x
如果使用图来表示的话,如下图:

深度学习入门之输出层的设计_第1张图片

python代码简单实现,如下:

代码如下(示例):

import numpy as np
def identity_function(a):
	return a

2.softmax函数

分类问题中使用的softmax函数的数学表达式,如下:
y k = e x p ( a k ) ∑ i = 1 n e x p ( a i ) yk=\frac{exp(ak)}{\sum_{i=1}^nexp(ai)} yk=i=1nexp(ai)exp(ak)
exp(x)表示e的x次方,指的是一个指数函数。
假设输出层共有n个神经元,计算第k个神经元的输出yk。如上数学表达式所示,softmax函数的分子是输入函数信号ak的指数函数,分母是所有输入信号的指数函数的和。
使用图来表示softmax函数的话,如下图:
深度学习入门之输出层的设计_第2张图片

softmax函数的输出通过箭头与所有的输入信号相连,每一层输出层的各个神经元都受到所有输入信号的影响。
用python代码简单实现softmax函数,如下图所示:
代码如下(示例):

import numpy as np
def softmax(a):
	exp_a=np.exp(a)
	sum_exp_a=np.sum(exp_a)
	y=exp_a / sum_exp_a
return y

三、softmax函数注意事项

1.softmax函数溢出问题

按照上面给出的程序进行运行,虽然正确符合了数学公式,但是运算过程中,会发现有部分运算数据异常,这部分异常数据实际上就是因为数据溢出导致的,因为计算机存储数据的位数有限,存在数据溢出的情况,也称溢出问题。softmax函数的实现需要进行指数运算,但是指数运算存在数值爆炸式增长的问题,如果指数运算过大,会使得计算机报错,或者出现异常数据,比如计算exp(1000),计算机会返回一个inf表示无穷大,如果将这些数据作为除数,进行除法运算,结果会出现较大误差,甚至数据不确定的情况。
计算机处理数据时,数值必须在4个字节或者8个字节的有限数据宽度内,这意味着数存在有效位数,也就是说,可以表示的数值范围时有限的。因此,会出现超大值无法表示的问题,这个问题也称溢出问题,在进行计算机运算时,需要考虑到计算机溢出问题。
为了防止softmax函数运算过程中的数据溢出问题,需要对softmax函数进行一定的改进,改进过程如下:
y k = e x p ( a k ) ∑ i = 1 n e x p ( a i ) = C . e x p ( a k ) C . ∑ i = 1 n e x p ( a i ) yk=\frac{exp(ak)}{\sum_{i=1}^nexp(ai)}=\frac{C.exp(ak)}{C.\sum_{i=1}^nexp(ai)} yk=i=1nexp(ai)exp(ak)=C.i=1nexp(ai)C.exp(ak)
= e x p ( a k + l o g C ) ∑ i = 1 n e x p ( a i + l o g C ) = e x p ( a k + c ) ∑ i = 1 n e x p ( a i + c ) =\frac{exp(ak+logC)}{\sum_{i=1}^nexp(ai+logC)}=\frac{exp(ak+c)}{\sum_{i=1}^nexp(ai+c)} =i=1nexp(ai+logC)exp(ak+logC)=i=1nexp(ai+c)exp(ak+c)
在分子和分母上搜乘以C这个任意常数,结果是不变的,因为同时乘以相同的值计算结果不变,然后把C这个常数移到指数函数中,记为logC。最后把logC替换为另一个符号c。
在进行softmax的指数函数的运算时,加上或者减去某一个常数并不会改变运算结果。这里的c可以是任何值,单数为了防止溢出,一般会使用输入信号中的最大值。修改后的程序如下:

import numpy as np
def softmax(x):
	c=np.max(x)
	exp_a=np.exp(a-c)#溢出对策
	sum_exp_a=np.sum(exp_a)
	y=exp_a / sum_exp_a
	return y

2.softmax函数的特征

softmax函数的输出为0.0到1.0之间的实数。并且softmax函数的输出值得总和是1。输出总和为1是softmax函数的一个重要性质。正因为这个性质,才可以称softmax函数的输出解释为“概率”。
例如,0的softmax输出值为0.018,1输出0.245,2的输出为0.737,如果按照概率来解释,2的输出结果最大,概率也是最大,0 的概率为1%;1的概率25%;2的概率被74%。也就是说通过softmax函数,可以使用概率的方法处理问题。
即便使用了softmax函数,各元素之间的大小关系也不会改变。这是因为指数函数y=exp(x)是单调递增函数。实际上,例子中的a的各元素的大小关系和y的各元素的大小关系并没有改变。如,a的最大值为第2个元素,y的最大值也仍是第2个元素。
一般而言,神经网络只把输出值最大的神经元所对应的类别作为识别结果。并且,即便使用softmax函数,输出层的神元的位置不会发生改变。因此,神经网络在进行分类时,输出层的softmax函数可以省略。在实际的问题中,由于指数函数的运算需要一定的计算运算量,因此输出层的softmax函数一般会被省略。

总结

求解机器学习问题放入步骤可以分为‘学习’和“推理”两个过程,首先,在学习阶段进行模型的学习,然后,在推理阶段,用学到的模型对未知数据进行推理(分类)。推理过程一般会省略输出层的softmax函数。

你可能感兴趣的:(python,深度学习,python)