损失函数是机器学习最重要的概念之一。
这篇文章写的时候还很嫩,读者指出的很多问题无法一一答复,可参考其他文章哈。
通过计算损失函数的大小,是学习过程中的主要依据也是学习后判断算法优劣的重要判据。
-
常用的损失函数有均方误差:MSE l o s s = ∑ i = 1 n ( y i − y ^ i ) 2 loss = \sum_{i=1}^n(y_i - \hat y_i)^2 loss=i=1∑n(yi−y^i)2 ∂ l o s s ∂ y = 2 ∑ i = 1 n ( y i − y ^ i ) \frac{\partial loss}{\partial y} = 2\sum_{i=1}^n(y_i - \hat y_i) ∂y∂loss=2i=1∑n(yi−y^i)
是最经典也是最简单的损失函数,几乎万能,但是不太准确。 -
binary_crossentropy交叉熵损失函数,一般用于二分类: l o s s = − ∑ i = 1 n y ^ i l o g y i + ( 1 − y ^ i ) l o g ( 1 − y ^ i ) loss = -\sum_{i=1}^n \hat y_i log y_i + (1- \hat y_i)log (1-\hat y_i) loss=−i=1∑ny^ilogyi+(1−y^i)log(1−y^i) ∂ l o s s ∂ y = − ∑ i = 1 n y ^ i y i − 1 − y ^ i 1 − y i \frac{\partial loss}{\partial y} = -\sum_{i=1}^n \frac{\hat y_i}{y_i} - \frac{1-\hat y_i}{1-y_i} ∂y∂loss=−i=1∑nyiy^i−1−yi1−y^i
这个是针对概率之间的损失函数,你会发现只有 y i y_i yi和 y ^ i \hat y_i y^i是相等时,loss才为0,否则loss就是为一个正数。而且,概率相差越大,loss就越大。这个神奇的度量概率距离的方式称为交叉熵。 -
categorical_crossentropy分类交叉熵函数: l o s s = − ∑ i = 1 n y ^ i 1 l o g y i 1 + y ^ i 2 l o g y i 2 + ⋯ + y ^ i m l o g y i m loss = -\sum_{i=1}^n \hat y_{i1} log y_{i1} + \hat y_{i2} log y_{i2} + \dots + \hat y_{im} log y_{im} loss=−i=1∑ny^i1logyi1+y^i2logyi2+⋯+y^imlogyim n是样本数,m是分类数,注意,这是一个多输出的loss的函数
,所以它的loss计算也是多个的。 ∂ l o s s ∂ y i 1 = − ∑ i = 1 n y ^ i 1 y i 1 \frac {\partial loss}{\partial y_{i1}} = -\sum_{i=1}^n \frac{\hat y_{i1}}{y_{i1}} ∂yi1∂loss=−i=1∑nyi1y^i1 ∂ l o s s ∂ y i 2 = − ∑ i = 1 n y ^ i 2 y i 2 \frac {\partial loss}{\partial y_{i2}} = -\sum_{i=1}^n \frac{\hat y_{i2}}{y_{i2}} ∂yi2∂loss=−i=1∑nyi2y^i2 … \dots … ∂ l o s s ∂ y i m = − ∑ i = 1 n y ^ i m y i m \frac {\partial loss}{\partial y_{im}} = -\sum_{i=1}^n \frac{\hat y_{im}}{y_{im}} ∂yim∂loss=−i=1∑nyimy^im
一般来说,如果最后一层接上softmax作为分类概率输出时,都会用categorical_crossentropy作为损失函数,所以框架中会进行优化,对这两条公式的梯度合起来计算,发现合起来以后,loss计算就会超简单。
所以稍微介绍一下softmax激活函数:
S i = e V i ∑ j e V j S_i = \frac{e^{V_i}}{\sum_j{e^{V_j}} } Si=∑jeVjeVisoftmax激活函数,就是将输入数据取指数,然后归一化后,谁的数值较大谁的概率就越大。这解决了输出数据中概率和必需为1。而且输出概率值与输入值之间成正相关的问题。更重要的是它的求导形式很简单:
i和j相同时: ∂ S i ∂ V i = S i ( 1 − S i ) \frac{\partial S_i}{\partial V_i} = S_i(1-S_i) ∂Vi∂Si=Si(1−Si)i和j不同时: ∂ S i ∂ V j = − S i S j \frac{\partial S_i}{\partial V_j} = -S_iS_j ∂Vj∂Si=−SiSj尽管看起来也很复杂,但是和交叉熵结合在一起,就比较简单了。具体推导有时间再看~