交叉熵
俗话说,千里之行,始于足下,在我踢球的时候,教练总是让我们练习基本功,其实感觉基本功才是重点,如果基本功不好,那么再怎么厉害的战术都不能够执行出来,基本功是发挥的基本和关键,对于网络来说,基本的感觉或者说基本的对于网络的数学感觉也是基本功。
那么对于一个简单的feedforward的普通的全链接的神经网络什么是基本功呢?我认为首先需要对激活函数有一个感觉,尤其是对于sigmoid,这是非线性的一个里程碑式的函数。对于这个重要问题,一定要深入理解各项基本特性。简单描述一下,这个函数再0附近的时候具有较大的导数,在+-4.6外面就基本上是一个恒定的0或者1,导数也接近0.
在网络中训练时会遇到这么一个问题,就是训练慢的情况,为什么慢是个问题呢?对于人类来说,如果错误越大,那么印象越深刻,学习就越快,但是对于我们这个神经元来说,如果错误非常大,产生的一个结果就是偏导数非常小,这会导致的结果就是我们的算法在反向传播的时候进行偏导数的计算的时候乘上一个非常小的数,学习就会逐渐变慢。这当然是我们不想要的,因为我错得那么厉害,那么纯粹,居然降低了学习得速度,这反直觉得东西肯定是可以修改的。
所以简单的使用sigmoid+quad loss可能得修改一下。
所以这么一条逻辑链条就是 学习的效果是对于wb的更新速度,wb的更新速度是根据损失函数c对于w和b求偏导数来决定的,偏导数会乘上一个sigmoid的导函数,这个函数在远离0的地方会变得非常接近0,导致反向传播的时候导函数逐渐变小。
所以我们引出这么个交叉熵,交叉熵有两个很好的性质,满足我们对于损失函数的要求,第一个就是损失是大于0的,第二个就是结果越正确,损失越小。有了这么个东西,那我们来看看能干啥吧。很神奇的东西是这个东西在反向传播的时候居然能够把万恶之源,sigmoid导函数消除掉。这是为什么呢?
实际上在我们使用的时候会有个导函数这一项,我们假设自己想要的是a-y这一项,但是多了一个sigmoid ’,于是我们打算去掉这个东西,然后就让我们的算法能够去掉这个,就能够看到代数的结果很自然的就会产生交叉熵的结果。
这个东西只能够二分类吗?因为我们最早是在二分类中推导出了这个东西,实际上不尽然,用推导出的结果来计算可以发现,如果我们想要回归的结果也是在0-1中,通过求导可以得到,当神经网络输出相同结果的时候损失最小。
通过公式推导出的这个东西在信息论中有理论的支持。
在minist数据集中的应用会发现能够显著降低错误率。
不过有这么一点需要注意的就是,交叉熵配套的是sigmoid激活函数,这样能够消除掉反向传播中产生的不想要的sigmoid ‘,对于激活函数是relu等,还是用比较纯粹的quad loss比较好。
所以对于不同的激活函数要用不同的loss来进行计算。
和这个很类似的还有一个东西,叫做softmax,为什么需要这个东西呢?对于二分类问题,我们一个小神经元的0和1就能代表,但是对于多个分类的问题呢,我们必须要用一个向量来代表分类的结果。那么对于这个分类向量,分类的结果应该可以表示成一个概率分布。所以这时候这一层的激活就不再是sigmoid,也就是对于神经元的输入进行一个确定的输出值得函数计算,而是求一个分布。通过归一化求一个分布。而对应的损失函数就是一个log-likelihood loss。
使用这个loss的目的也是为了使得反向传播的过程当中能够最后一层的loss很纯粹的变成a-y。
所以总的来说,就是不同的激活使用不同的loss能保证最后一层的错误都是a-y,这样就避免了最后一层的反向传播受到激活函数的影响。
如果y和x是线性关系,那么可以采用quad loss;如果是sigmoid,那么采用交叉熵;如果是softmax ,那么采用log-likelihood函数。为一个目的就是最后一层的delta变成a-y。这样能够保证错误在最后一层是正确的向前传播的。
那么接下来的三个问题:
1. 对于sigmoid函数,在反向传播的时候会出现saturate neural的现象,然后把原来的quad loss换成cross-entropy loss之后就能够在计算中消除掉sigmoid '求导这一项,但是只是在最后一层啊,前面怎么办?
2. 为啥softmax要用一个指数函数,而不是采用sigmoid的函数值求分布啊?
3. 对于不同的分类来说,分类的序号有没有什么要求使得网络能够尽可能的效果比较好,因为毕竟网络是数值上计算的,有三个样本,如果(1,1)(2,2)(3,3),那么训练这个网络要比(1,1)(2,3)(3,2)要容易,所以有没有什么对于这个相关的结论啊,感觉标序号会不会也有黑科技可以研究啊