机器学习查漏补缺
基础知识
为什么需要激活函数
什么是激活函数?首先了解一下神经网络的基本模型。
如上图所示,神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数。
激活函数是指如何把“激活的神经元的特征”通过函数把特征保留并映射出来,即负责将神经元的输入映射到输出端。
为什么需要激活函数?
首先明确一点,激活函数是用来加入非线性因素的,因为线性模型的表达力不够。
假设如果没有激活函数的出现,你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,也就是说没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激活函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可逼近任意函数)
举个例子:二分类问题,如果不使用激活函数,例如使用简单的逻辑回归,只能作简单的线性划分,如下图所示。
如果使用激活函数,则可以实现非线性划分,如下图所示:
可见,激活函数能帮助我们引入非线性因素,使得神经网络能够更好地解决更加复杂的问题。为什么激活函数一般都是非线性的,而不能是线性的呢?从反面来说,如果所有的激活函数都是线性的,则激活函数 g(z)=z,即 a=z。那么,以两层神经网络为例,最终的输出为:
经过推导我们发现网络输出仍是 X 的线性组合。这表明,使用神经网络与直接使用线性模型的效果并没有什么两样。即便是包含多层隐藏层的神经网络,如果使用线性函数作为激活函数,最终的输出仍然是线性模型。这样的话神经网络就没有任何作用了。因此,隐藏层的激活函数必须要是非线性的。
补充一点:因为神经网络的数学基础是处处可微的,所以选取的激活函数要能保证数据输入与输出也是可微的,运算特征是不断进行循环计算,所以在每代循环过程中,每个神经元的值也是在不断变化的。
有了大概的概念后就可进入正题~
Relu函数是什么?
首先,relu函数是常见的激活函数中的一种,表达形式如下。
Relu函数的图像和求导后的图像如下:
从表达式和图像可以明显地看出:Relu其实就是个取最大值的函数。
ReLU函数其实是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被成为单侧抑制。(也就是说:在输入是负值的情况下,它会输出0,那么神经元就不会被激活。这意味着同一时间只有部分神经元会被激活,从而使得网络很稀疏,进而对计算来说是非常有效率的。)
正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。尤其体现在深度神经网络模型(如CNN)中,当模型增加N层之后,理论上ReLU神经元的激活率将降低2的N次方倍。
那么问题来了:这种稀疏性有何作用?换句话说,我们为什么要让神经元稀疏?不妨举例子来说明。那么问题来了:这种稀疏性有何作用?换句话说,我们为什么需要让神经元稀疏?不妨举栗子来说明。当看名侦探柯南的时候,我们可以根据故事情节进行思考和推理,这时用到的是我们的大脑左半球;而当看蒙面唱将时,我们可以跟着歌手一起哼唱,这时用到的则是我们的右半球。左半球侧重理性思维,而右半球侧重感性思维。也就是说,当我们在进行运算或者欣赏时,都会有一部分神经元处于激活或是抑制状态,可以说是各司其职。再比如,生病了去医院看病,检查报告里面上百项指标,但跟病情相关的通常只有那么几个,与之类似,当训练一个深度分类模型的时候:,和目标相关的特征往往也就那么几个,因此通过ReLU实现稀疏后的模型能够更好地挖掘相关特征,拟合训练数据。
使用Relu函数有什么优势?
- 没有饱和区,不存在梯度消失问题。
- 没有复杂的指数运算,计算简单、效率提高。
- 实际收敛速度较快,比 Sigmoid/tanh 快很多。
- 比 Sigmoid 更符合生物学神经激活机制。
当然relu也存在不足:就是训练的时候很”脆弱”,很容易就”die”了. 举个例子:一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。如果这个情况发生了,那么这个神经元的梯度就永远都会是0.实际操作中,如果你的learning rate 很大,那么很有可能你网络中的40%的神经元都”dead”了。当然,如果你设置了一个合适的较小的learning rate,这个问题发生的情况其实也不会太频繁。
BCELoss()与CrossEntropyLoss()的区别?
BCELoss(Binary Cross Entropy Loss)是一种用于二元分类问题的损失函数,通常用于测量模型的输出与真实标签之间的差异。它是交叉熵损失的一个特殊情况,专门设计用于二元分类任务,其中每个样本只能属于两个类别(正类别和负类别)之一。
在二元分类任务中,BCELoss 的计算过程如下:
-
对于每个样本,模型输出一个值,通常是一个在0到1之间的概率值,表示样本属于正类别的概率。让我们将这个值表示为 p。
-
对于每个样本,还有一个真实标签(通常为0或1),表示样本的真实类别。让我们将这个值表示为 y。
-
BCELoss 的计算公式如下:
BCELoss = - [y * log(p) + (1 - y) * log(1 - p)]
这个公式有两个部分:
- 如果 y = 1(样本属于正类别),那么第一部分
- y * log(p)
负责度量模型的输出 p 与真实标签 1 之间的差异。 - 如果 y = 0(样本属于负类别),那么第二部分
- (1 - y) * log(1 - p)
负责度量模型的输出 1-p 与真实标签 0 之间的差异。
- 如果 y = 1(样本属于正类别),那么第一部分
-
最后,BCELoss 对所有样本的损失进行平均,以获得总体损失。
在训练二元分类模型时,目标是最小化 BCELoss。当模型的输出 p 接近真实标签 y 时,损失函数的值较低,表示模型的预测比较准确。当模型的输出 p 与真实标签 y 相差较远时,损失函数的值较高,表示模型的预测不准确。
BCELoss 是在二元分类任务中非常常见的损失函数,它通常与 sigmoid 激活函数结合使用,用于输出二元分类概率。这使得模型能够对样本属于正类别的概率进行建模。
BCELoss(Binary Cross Entropy Loss)和CrossEntropyLoss(交叉熵损失)都是用于测量分类模型输出与真实标签之间的差异的损失函数,但它们主要用于不同类型的分类问题,因此存在一些区别。
- 适用问题类型:
- BCELoss 主要用于二元分类问题,其中每个样本只能属于两个类别(正类别和负类别)之一。它通常与 sigmoid 激活函数结合使用,用于输出单个样本属于正类别的概率。
- CrossEntropyLoss 主要用于多类别分类问题,其中每个样本可以属于多个类别中的一个。它通常与 softmax 激活函数结合使用,用于输出多个类别的概率分布。
- 输出类型:
- BCELoss 的输出是一个数值,表示二元分类的损失。
- CrossEntropyLoss 的输出是一个向量,其中每个元素对应于一个类别的损失。
- 损失计算方式:
- BCELoss 使用了二进制分类的损失计算方式,具体来说,它对每个样本分别计算损失,然后对所有样本的损失取平均。
- CrossEntropyLoss 使用了多类别分类的损失计算方式,它会考虑多个类别之间的关系,因此在计算损失时通常会使用一个对数转换(log transformation)和 softmax 操作。
- 实现方式:
- BCELoss 可以通过单个二元分类输出和单个真实标签来计算损失,每个样本都有一个对应的损失值。
- CrossEntropyLoss 通常需要多个类别的分类输出和多个真实标签,它用于多类别分类问题。
总之,主要区别在于适用问题类型、输出类型和损失计算方式。BCELoss适用于二元分类问题,而CrossEntropyLoss适用于多类别分类问题。选择哪种损失函数取决于你的分类任务的性质。
23-10-13 周五
ROC曲线与AUC值
ROC曲线与AUC值通常用于评估二分类模型的性能,如分类器或模型的质量。以下是对ROC曲线和AUC值的详细解释:
ROC曲线(Receiver Operating Characteristic Curve):
- ROC曲线是一种用于评估分类模型性能的图形工具。他以模型的真正例率(True Positice Rate,又称灵敏度或召回率)为纵轴,以模型的加正例率(False Positive Rate)为横轴。通常情况下,ROC曲线是一个二维图,但可以扩展到多分类问题。
- 真正例率(True Positive Rate,TPR)表示分类器正确识别正例的比率,计算公式为TPR=TP/(TP+FN),其中TP代表真正例数,FN代表假负例数。
- 假正例率 (False Positive Rate,FPR) 表示分类器错误识别负例为正例的比率,计算公式为 FPR = FP / (FP + TN),其中 FP 代表假正例数,TN 代表真负例数。
- ROC 曲线上的每个点对应于分类器在不同阈值下的表现。通过调整分类器的阈值,可以在 ROC 曲线上获得不同的点。
- 在 ROC 曲线中,左上角的点表示完美分类器,右下角的点表示随机分类器。曲线越接近左上角,模型性能越好。
AUC 值 (Area Under the Curve):
- AUC 值 是 ROC 曲线下方的面积,即 ROC 曲线下的面积。AUC 值的取值范围在0到1之间。
- AUC 值通常用来量化分类模型的性能。一个完美的分类器的 AUC 值为1,而一个随机分类器的 AUC 值约为0.5。
- 通常情况下,AUC 值越接近1,表示模型性能越好,它能更好地区分正例和负例。AUC 值越接近0.5,表示模型性能较差,可能无法很好地区分正例和负例。
- AUC 值也可以用来比较不同模型的性能。在这种情况下,AUC 值更高的模型通常更好。
ROC 曲线和 AUC 值的用途:
- ROC 曲线和 AUC 值用于评估二分类问题中模型的性能,例如医学诊断、欺诈检测和自然语言处理中的情感分析。
- 这些工具可以帮助你选择合适的分类器或模型,并调整分类器的阈值,以平衡灵敏度和特异性,以满足特定任务的需求。
- 通过理解 ROC 曲线和 AUC 值,你可以更好地评估和解释模型的性能,特别是在面临不平衡数据集或重要性不同的错误时。
总之,ROC 曲线和 AUC 值是帮助你理解和评估二分类模型性能的重要工具,对于新手小白来说,它们是入门机器学习中的关键概念。理解它们将有助于你更好地使用和解释分类器的输出。