精华内容
下载资源
问答
  • 详细整理几种常见的损失函数|机器学习
    千次阅读
    2020-07-07 18:06:53

    机器学习|常见的损失函数

    公众号:数据山谷

    在学习过程中我们经常会接触到损失函数、代价函数、目标函数三个词语,本文让我们来总结一下机器学习中常见的损失函数和代价函数。

    概念

    首先让我们来了解一下三种损失函数的概念。

    损失函数(Loss Function )是定义在单个样本上的,算的是一个样本的误差。

    代价函数(Cost Function )是定义在整个训练集上的,是所有样本误差的平均,也就是损失函数的平均。

    目标函数(Object Function)定义为:最终需要优化的函数。等于经验风险+结构风险(也就是代价函数 + 正则化项)。

    关于目标函数和代价函数的区别还有一种通俗的区别:

    目标函数是最大化或者最小化,而代价函数是最小化。

    常见的损失函数

    0-1损失函数(0-1 loss function)

    函数表达式:

    L ( y , f ( x ) ) = { 1 , y ≠ f ( x ) 0 , y = f ( x ) L(y,f(x))=\left\{\begin{matrix} 1, y\neq f(x) \\ 0, y=f(x) \end{matrix}\right. L(y,f(x))={1,y=f(x)0,y=f(x)

    函数说明:

    • 关于0-1损失函数,也就是说当我们预测错误时,损失函数的值为1,预测正确时,损失函数的值为0,该函数无需考虑预测值和真实值的误差程度,只要预测错误就会输出1。

    函数特点:

    • 0-1损失函数直接对应分类判断错误的个数,但是它是一个非凸函数,不太适用。
    • 感知机通常会使用该损失函数,在使用的时候我们也可以通过设置一个阈值的方式来放宽它的条件,改变成下面的形式:

    L ( y , f ( x ) ) = { 1 , ∣ y − f ( x ) ∣ ⩾ T 0 , ∣ y − f ( x ) ∣ < T L(y,f(x))=\left\{\begin{matrix} 1, |y-f(x)|\geqslant T \\ 0, |y-f(x)| <T \end{matrix}\right. L(y,f(x))={1,yf(x)T0,yf(x)<T

    平方损失函数(quadratic loss function)

    函数表达式:

    L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y,f(x))=(y-f(x))^2 L(y,f(x))=(yf(x))2

    函数说明:

    • 平方损失函数指的是预测值与实际值差的平方。

    函数特点:

    • 平方损失函数经常应用在回归问题上。

    绝对值损失函数(absolute loss function)

    函数表达式:

    L ( y , f ( x ) ) = ∣ y − f ( x ) ∣ L(y,f(x))=|y-f(x)| L(y,f(x))=yf(x)

    函数说明:

    • 该损失函数本质上和平方损失函数没有什么差别,只不过此时取的是绝对值而不是平方,差距不会因为平方而被放大。

    函数特点:

    • 绝对值损失函数经常用在回归问题上。

    对数损失函数(logarithmic loss function)

    函数表达式:

    L ( y , p ( y ∣ x ) ) = − log ⁡ p ( y ∣ x ) L(y,p(y|x))=-\log p(y|x) L(y,p(yx))=logp(yx)

    函数说明:

    • 对数损失函数用到了极大似然估计的思想,我们对p(y|x)通俗的解释就是:在当前模型的基础上,对于样本x它的预测值为y,也就是我们预测正确的概率,但是我们在概率之间的同时满足需要使用乘法,考虑到计算方便,我们取对数将其转化为加法,同时由于是损失函数,所以预测正确的概率越高,其损失值应该是越小,因此再加个负号取反。

    函数特点:

    • log损失函数能够很好的表示概率分布,适用于很多的分类场景中,如果需要知道结果属于每个类别的置信度log损失函数非常适合。
    • log损失函数对噪声很敏感。
    • 逻辑回归的损失函数就是log损失函数。

    合页损失函数(Hinge loss function)

    函数表达式:

    L ( w , b ) = m a x { 0 , 1 − y f ( x ) } L(w,b)=max\{0,1-yf(x)\} L(w,b)=max{0,1yf(x)}

    y = ± 1 , f ( x ) = w x + b y=\pm1,f(x)=wx+b y=±1,f(x)=wx+b

    函数说明:

    • hinge损失函数一般用作分类算法的损失函数。

    函数特点:

    • SVM使用的就是hinge损失函数,hinge损失函数表示如果被分类正确,损失为0,否则损失就为1-yf(x)。
    • 一般的f(x)是预测值,在[-1,1]之间,y是目标值(-1或1)。我们并不鼓励|f(x)|>1,也就是不鼓励分类器过度的自信,让某个正确分类的样本距离分割线超过1并不会有任何奖励,从而使分类器可以更加专注于整体的误差。
    • Hinge算是函数对异常点、噪声并不敏感,但是相对于log损失函数来说它没有很好的概率解释。

    指数损失函数(exponential loss)

    函数表达式:

    L ( y ∣ f ( x ) ) = exp ⁡ ( − y f ( x ) ) L(y|f(x))=\exp(-yf(x)) L(yf(x))=exp(yf(x))

    函数说明:

    • 一种很少接触并使用的损失函数。

    函数特点:

    • AdaBoost算法使用的就是指数损失函数,该损失函数对噪声、离群点非常敏感。

    常见的代价函数

    均方误差(Mean Squared Error)

    函数表达式:

    M S E = 1 N ∑ i = 1 N ( y i − f ( x i ) ) 2 MSE=\frac{1}{N}\sum_{i=1}^N(y^i-f(x^i))^2 MSE=N1i=1N(yif(xi))2

    函数说明:

    • 均方误差是指预测值与真实值之差平方的期望值;MSE可以评价数据的变化程度,MSE的值越小,说明预测模型描述实验数据具有更好的精确度。

    函数特点:

    • 均方误差通常用来做回归问题的代价函数。

    均方根误差(Root Mean Squared Error)

    函数表达式:

    R M S E = 1 N ∑ i = 1 N ( y i − f ( x i ) ) 2 RMSE=\sqrt{\frac{1}{N}\sum_{i=1}^N(y^i-f(x^i))^2} RMSE=N1i=1N(yif(xi))2

    函数说明:

    • 均方根误差是均方误差的算术平方根,能够直观观测预测值与实际值的离散程度。

    函数特点:

    • 通常用来作为回归算法的性能指标

    平均绝对误差(Mean Absolute Error)

    函数表达式:

    M A E = 1 N ∑ i = 1 N ∣ y i − f ( x i ) ∣ MAE=\frac{1}{N}\sum_{i=1}^{N}|y^i-f(x^i)| MAE=N1i=1Nyif(xi)

    函数说明:

    • 平均绝对误差是绝对误差的平均值 ,平均绝对误差能更好地反映预测值误差的实际情况。

    函数特点:

    • 通常用来作为回归算法的性能指标。

    交叉熵代价函数(Cross Entry)

    函数表达式:

    H ( p , q ) = − ∑ i = 1 N p ( x i ) log ⁡ q ( x − i ) H(p,q)=-\sum_{i=1}^Np(x^i)\log q(x^{-i}) H(p,q)=i=1Np(xi)logq(xi)

    函数说明:

    • 交叉熵是用来评估当前训练得到的概率分布与真实分布的差异情况,减少交叉熵损失就是在提高模型的预测准确率。其中p(x)指的是真实分布的概率,q(x)是模型通过数据计算出来的概率估计。

    函数特点:

    • 通常用做分类问题的代价函数。

    举例说明:

    逻辑回归(二分类)的损失函数:

    L o s s = − 1 N ∑ i = 1 N ( y ( i ) l o g ( h ( θ ) ( x ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h ( θ ) ( x ( i ) ) ) ) Loss = -\frac{1}{N}\sum_{i=1}^{N}(y^{(i)}log (h_{(\theta) }(x^{(i)}))+(1-y^{(i)})log(1- h_{(\theta) }(x^{(i)}))) Loss=N1i=1N(y(i)log(h(θ)(x(i)))+(1y(i))log(1h(θ)(x(i))))

    这里的h(x)可以是sigmoid函数,也可以是深度学习中的其他激活函数。

    更多相关内容
  • 神经网络模型常见的损失函数 1.神经网络模型简介 神经网络模型一般包含输入层、隐含层和输出层,每一层都是由诸多神经元组成。输入层神经元的个数一般和输入模型的特征(单个样本的维数)有关,输出层神经元的个数与...

    神经网络模型常见的损失函数

    1.神经网络模型简介

    神经网络模型一般包含输入层隐含层输出层,每一层都是由诸多神经元组成。输入层神经元的个数一般和输入模型的特征(单个样本的维数)有关,输出层神经元的个数与项目任务有关,隐含层的个数一般根据经验设置即可。
    在这里插入图片描述
    对于神经网络模型而言,根据不同的输出任务而言,可以分成模式分类和模式回归两大问题。在训练神经网络时,往往采用基于梯度下降的方法不断去缩小预测值真实值之间的差值,而这个差值就叫做损失(Loss),计算该损失的函数就叫做损失函数(Loss function)。对于不同输出类型的神经网络模型,其损失函数是不同的,损失函数和输出层的激励函数是相互配套使用的。

    2.神经网络模型常见的损失函数

    (1)回归任务

    在这里插入图片描述
    输出层神经元个数:1个

    损失函数:
    MSE(均方误差)
    M S E = 1 n ∑ i = 1 n ( f i − y i ) 2 . MSE = \frac{1}{n}\sum_{i=1}^{n}(f_{i}-y_{i})^{2}. MSE=n1i=1n(fiyi)2.
    其中f是模型的预测值,y是样本的真实值。
    输出层配套的激活函数:
    linear、sigmoid、tanh等均可以

    (2)分类任务

    分类任务包含二分类和多分类问题。
    a.二分类任务:
    二分类任务根据不同的损失函数分成两种:

    • 输出神经元个数2个:

    在这里插入图片描述
    损失函数:binary_crossentropy
    二分类交叉熵损失函数:
    L o s s = − 1 n ∑ i = 1 n y i ( l n a ) + ( 1 − y i ) l n ( 1 − a ) Loss= -\frac{1}{n}\sum_{i=1}^{n} y_{i}(lna)+(1-y_{i})ln(1-a) Loss=n1i=1nyi(lna)+(1yi)ln(1a) 其 中 : a = − 1 1 + e − x 其中:a= -\frac{1}{1+e^{-x}} :a=1+ex1
    输出层配套的激活函数:softmax
    S i = − e i ∑ j e j S_{i}= -\frac{e^{i}}{\sum_{j}e^{j}} Si=jejei
    在这里插入图片描述
    此处的图是多分类的,二分类时只有两个神经元,输出的就是样本对应类别的概率,如两个神经元分别输出0.88和0.12,此时样本对应的类别就是0.88对应的类别。

    • 输出神经元个数1个:
      在这里插入图片描述

    损失函数:binary_crossentropy
    二分类交叉熵损失函数:
    L o s s = − 1 n ∑ i = 1 n y i ( l n a ) + ( 1 − y i ) l n ( 1 − a ) Loss= -\frac{1}{n}\sum_{i=1}^{n} y_{i}(lna)+(1-y_{i})ln(1-a) Loss=n1i=1nyi(lna)+(1yi)ln(1a) 其 中 : a = − 1 1 + e − x 其中:a= -\frac{1}{1+e^{-x}} :a=1+ex1
    输出层配套的激活函数:sigmoid或者tanh
    需要注意的是此时的损失函数(二分类交叉熵)要求训练样本的标签必须为独热编码(one-hot).此时的输出的编码为1或者0.
    s i m o i d 函 数 : σ ( z ) = 1 1 + e − z simoid函数:\sigma(z) = \frac{1}{1+e^{-z}} simoidσ(z)=1+ez1 t a n h 函 数 : t a n h ( z ) = e x − e − x e x + e − x tanh函数:tanh(z) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} tanhtanh(z)=ex+exexex
    b.多分类任务
    多分类任务的输出神经元个数和输出的类别有关,几种类别对应着几个输出神经元,根据损失函数的不同可以分为两类:

    • categorical_crossentropy(多分类交叉熵损失函数)
      在这里插入图片描述
      损失函数:
      categorical_crossentropy(多分类交叉熵损失函数)
      l o s s = − ∑ i = 1 n f i 1 l o g y i 1 + f i 2 l o g y i 2 + . . + f i m l o g y i m . loss = -\sum_{i=1}^{n}f_{i1}logy_{i1}+f_{i2}logy_{i2}+..+f_{im}logy_{im}. loss=i=1nfi1logyi1+fi2logyi2+..+fimlogyim.
      其中n是样本数目,m是分类数。
      输出层配套的激活函数:softmax
      输出层神经元个数:几个分类对应着几个神经元数目
      需要注意的是这个损失函数(多分类损失函数)要求训练样本的标签必须为独热编码

    • sparse_categorical_crossentropy(多分类交叉熵损失函数)
      在这里插入图片描述

    损失函数:
    sparse_categorical_crossentropy(稀疏多分类交叉熵损失函数)
    l o s s = − ∑ i = 1 n f i 1 l o g y i 1 + f i 2 l o g y i 2 + . . + f i m l o g y i m . loss = -\sum_{i=1}^{n}f_{i1}logy_{i1}+f_{i2}logy_{i2}+..+f_{im}logy_{im}. loss=i=1nfi1logyi1+fi2logyi2+..+fimlogyim.
    其中n是样本数目,m是分类数。
    输出层配套的激活函数:softmax
    输出层神经元个数:几个分类对应着几个神经元数目
    需要注意的是这个损失函数(多分类损失函数)要求训练样本的标签必须为数字编码
    【注意】两种损失函数的区别可以参考:这篇博客(博主是AI剑客).
    tensorflow 与keras里面的损失函数:categorical_crossentropy VS. sparse_categorical_crossentropy区别:

    两者都是多分类交叉熵损失函数,区别在于sparse(稀疏),在于对target编码的要求。
    1.categorical_crossentropy要求target为onehot编码。
    2.sparse_categorical_crossentropy要求target为非onehot编码,函数内部进行onehot编码实现。
    例如:
    如果你的 targets 是 one-hot 编码,用 categorical_crossentropy
      one-hot 编码:[0, 0, 1],
       [1, 0, 0],
       [0, 1, 0]
    如果你的 tagets 是 数字编码 ,用 sparse_categorical_crossentropy
      数字编码:2, 0, 1
    

    另外两者的代码可以参考链接: 这篇博客(博主是听风忆雪).
    在这里插入图片描述
    在这里插入图片描述

    // categorical_crossentropy  tf_version=1.14
    import tensorflow as tf
    input_data=tf.Variable([[0.2,0.1,0.9], [0.3,0.4,0.6]], dtype=tf.float32)
    output=tf.nn.softmax_cross_entropy_with_logits_v2(logits=input_data, labels=[[1,0,0],[0,1,0]])
    with tf.Session() as sess:
        init=tf.global_variables_initializer()
        sess.run(init)
        print(sess.run(output))
        #[1.365732  1.1398311]
    
    // sparse_categorical_crossentropy
    input_data = tf.Variable([[0.2, 0.1, 0.9], [0.3, 0.4, 0.6]], dtype=tf.float32)
    output = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=input_data, labels=[0, 1])
    with tf.Session() as sess:
        init = tf.global_variables_initializer()
        sess.run(init)
        print(sess.run(output))
        #[1.365732  1.1398311]
    

    3.全连接神经网络预测房价(回归问题)

    预测的房价为连续值,因此该问题属于回归问题
    (1)数据集来源:keras.datasets中boston_housing数据集。其中每个样本包含13个特征,1个真实值
    在这里插入图片描述
    (2)算法的具体流程及代码实现:

    • 加载数据并划分训练集、测试集、验证集
    • 将数据进行归一化
    • 搭建神经网络模型
    • 训练神经网络模型
    • 保存模型
    • 测试模型的效果
    //================导入相应库文件===============
    from keras.preprocessing import sequence
    from keras.models import Sequential
    from keras.datasets import boston_housing
    from keras.layers import Dense, Dropout
    from keras.utils import multi_gpu_model
    from keras import regularizers  # 正则化
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn.preprocessing import MinMaxScaler
    import pandas as pd
    import tensorflow as tf
    import matplotlib.pyplot as plt
    from keras.utils import plot_model
    from keras.models import load_model
    //===============加载数据(本次未手动划分数据集)======================
    #1.加载数据
    (x_train, y_train), (x_valid, y_valid) = boston_housing.load_data()  # 加载数据
    # 转成DataFrame格式方便数据处理
    x_train_pd = pd.DataFrame(x_train)
    y_train_pd = pd.DataFrame(y_train)
    x_valid_pd = pd.DataFrame(x_valid)
    y_valid_pd = pd.DataFrame(y_valid)
    print(x_train_pd.head(5))
    print('-------------------')
    print(y_train_pd.head(5))
    //===============数据归一化(预处理部分)======================
    print("数据归一化")
    #2.数据归一化
    #训练集归一化
    min_max_scaler = MinMaxScaler()
    min_max_scaler.fit(x_train_pd)
    x_train = min_max_scaler.transform(x_train_pd)
    
    min_max_scaler.fit(y_train_pd)
    y_train = min_max_scaler.transform(y_train_pd)
    
    #验证集归一化
    min_max_scaler.fit(x_valid_pd)
    x_valid = min_max_scaler.transform(x_valid_pd)
    
    min_max_scaler.fit(y_valid_pd)
    y_valid = min_max_scaler.transform(y_valid_pd)
    print("2.构建模型并训练模型:")
    #3.训练模型
    //==============搭建神经网络模型======================
    model = Sequential()
    model.add(Dense(units= 10,
                    activation='relu',
                    input_shape=(x_train_pd.shape[1],)
    ))
    model.add(Dropout(0.2))
    
    model.add(Dense(units=15,
                    kernel_regularizer=regularizers.l2(0.01),
                    activity_regularizer=regularizers.l1(0.01),
                    activation= 'relu'
    ))
    
    model.add(Dense(units=1,
                    activation='linear'))
    
    print(model.summary())#打印模型结构
    //===============训练神经网络模型======================
    print("2.训练模型:")
    model.compile(loss='mse',
                  optimizer='adam')
    
    history = model.fit(x_train, y_train,
              epochs=200,  # 迭代次数
              batch_size=200,  # 每次用来梯度下降的批处理数据大小
              verbose=2,  # verbose:日志冗长度,int:冗长度,0:不输出训练过程,1:输出训练进度,2:输出每一个epoch
              validation_data = (x_valid, y_valid)  # 验证集
            )
    if __name__ == "__main__":
        //===============结果可视化======================
        print('结果可视化:')
        plt.plot(history.history['loss'])
        plt.plot(history.history['val_loss'])
        plt.title('Model loss')
        plt.ylabel('Loss')
        plt.xlabel('Epoch')
        plt.legend(['Train', 'Test'], loc='upper left')
        plt.show()
        //===============保存模型======================
        model.save('model_MLP.h5')  # creates a HDF5 file 'my_model.h5'
        # 模型可视化 pip install pydot
        plot_model(model, to_file='model_MLP.png', show_shapes=True)
        # 加载模型
        model = load_model('model_MLP.h5')
    	//===============测试模型======================
        print('3.预测模型')
        y_new = model.predict(x_valid)
        min_max_scaler.fit(y_valid_pd)
        y_new = min_max_scaler.transform(y_new)
    
    
    
    
    

    (3)代码输出结果:

    • model.summary
      在这里插入图片描述
    • 训练过程及可视化
      在这里插入图片描述
      可视化过程
      在这里插入图片描述
    • 模型可视化
      在这个过程中可能会出现**FileNotFoundError: [WinError 2] “dot” not found in path.**的问题,是因为未安装pydot库,同时还需要注意安装相应的软件,解决方法可以参照这篇博客.
      结果如下:
      在这里插入图片描述
    展开全文
  • 回归模型常见的损失函数

    万次阅读 2019-05-21 01:17:44
    损失函数是衡量预测模型在能够预测预期结果方面的表现有多好的指标。寻找最小值的最常用方法是“梯度下降”。想想这个函数的作用,如起伏的山脉和梯度下降就像滑下山到达最低点。 没有一损失函数适用于所有类型的...

    注意:如果图片不显示,请建议科学上网或者使用VPN。
    机器学习中的所有算法都依赖于最小化或最大化函数,我们将其称为“目标函数”。最小化的函数组称为“损失函数”。损失函数是衡量预测模型在能够预测预期结果方面的表现有多好的指标。寻找最小值的最常用方法是“梯度下降”。想想这个函数的作用,如起伏的山脉和梯度下降就像滑下山到达最低点。

    没有一种损失函数适用于所有类型的数据。它取决于许多因素,包括异常值的存在,机器学习算法的选择,梯度下降的时间效率,易于找到衍生物和预测的置信度。

    损失函数可大致分为两类:分类和回归损失。在这篇文章中,专注于讨论回归损失函数。

    在这里插入图片描述

    回归损失

    1.均方误差

    均方误差(MSE)(又称二次损失,L2损失)是最常用的回归损失函数。MSE是目标变量和预测值之间的平方距离之和。
    M S E = ∑ i = 1 n ( y i − y i p ) 2 n M S E=\frac{\sum_{i=1}^{n}\left(y_{i}-y_{i}^{p}\right)^{2}}{n} MSE=ni=1n(yiyip)2
    下面是MSE函数的图,其中真实目标值为100,预测值范围在-10,000到10,000之间。MSE损失(Y轴)在预测(X轴)= 100时达到其最小值。其范围是0到∞。

    img

    ​ MSE损失(Y轴)与预测(X轴)的关系图

    2. 平均绝对误差

    平均绝对误差(MAE)(又称L1损失)是用于回归模型的另一种损失函数。MAE是我们的目标和预测变量之间的绝对差异的总和。因此,它在不考虑方向的情况下测量一组预测中的平均误差大小。(如果我们也考虑方向,那将被称为平均偏差误差(MBE),它是残差/误差的总和)。其范围也是0到∞。
    M A E = ∑ i = 1 n ∣ y i − y i p ∣ n M A E=\frac{\sum_{i=1}^{n}\left|y_{i}-y_{i}^{p}\right|}{n} MAE=ni=1nyiyip
    img

    ​ MAE损失(Y轴)与预测(X轴)的关系图

    MSE与MAE(L2损失与L1损失)

    简而言之, 使用平方误差更容易解决,但使用绝对误差对异常值更为稳健。但是让我们明白为什么!

    每当我们训练机器学习模型时,我们的目标是找到最小化损失函数的点。当然,当预测完全等于真实值时,两个函数都达到最小值。

    这里是两个python代码的快速回顾。

    import numpy as np
    
    #true:真实目标变量的数组
    #prep:预测数组
    
    def mse(true,pred): 
        return np.sum((true  -  pred)** 2def mae(true,pred):
    	return np.sum(np.abs(true  -  pred))
    

    让我们看看MAE和均方根误差的值(RMSE,它只是MSE的平方根,使其与MAE的比例相同)。在第一种情况下,预测接近真实值,并且误差在观察值之间具有小的差异。在第二个,有一个异常值观察,误差很高。

    img

    我们从中观察到了什么,它如何帮助我们选择使用哪种损失函数?

    由于MSE平方误差(y-y_predicted = e),如果e> 1,则误差(e)的值会增加很多。如果我们的数据中有异常值,则e的值将为高,e²将为>> | E |。这将使具有MSE损失的模型比具有MAE损失的模型对异常值更敏感。在上面的第二种情况中,将调整RMSE作为损失的模型,以便以牺牲其他常见示例为代价来最小化单个异常情况,这将降低其整体性能。

    如果训练数据被异常值破坏(即我们在训练环境中存在错误较大的正值或负值,而不是我们的测试环境),则MAE损失很有用

    直观地说,我们可以考虑一下这样的:如果我们只给一个预测为所有尽量减少MSE的意见,那么预测应该是所有目标值的均值。但是,如果我们试图最小化MAE,那么预测将是所有观测的中位数。我们知道,中值对异常值的影响比均值更强,因此使用MAE对异常值处理效果要比MSE更好。

    使用MAE损失(尤其是神经网络)的一个大问题是它的梯度始终是相同的,这意味着即使对于小的损耗值,梯度也会很大。这对学习不利。为了解决这个问题,我们可以使用随着我们接近最小值而降低的动态学习率。在这种情况下,MSE表现良好,即使具有固定的学习速率也会收敛。MSE损失的梯度对于较大的损失值是高的,并且随着损失接近0而降低,使其在训练结束时更精确(见下图)。

    img

    决定使用哪种损失函数如果异常值表示对业务很重要且应该检测到的异常,那么我们应该使用MSE。另一方面,如果我们认为异常值只表示损坏的数据,那么我们应该选择MAE作为损失。

    我建议阅读这篇文章,并进行一项很好的研究,比较在有异常值存在和不存在的情况下使用L1损失和L2损失的回归模型的性能。请记住,L1和L2损失只是MAE和MSE的另一个名称。

    L1损失对异常值更为稳健,但其衍生物不连续,使得找到解决方案效率低下。L2损失对异常值敏感,但提供更稳定和封闭的形式解决方案(通过将其导数设置为0)。

    **两者都有问题:**可能存在损失函数都没有给出理想预测的情况。例如,如果我们数据中90%的观察值具有150的真实目标值,则剩余的10%具有0-30之间的目标值。然后,MAE作为损失的模型可能预测所有观察值为150,忽略10%的离群值情况,因为它将试图达到中值。在相同的情况下,使用MSE的模型会给出0到30范围内的许多预测,因为它会偏向异常值。

    **在这种情况下该怎么办?**一个简单的解决方法是转换目标变量。另一种方法是尝试不同的损失功能。这是我们的第三次亏损功能背后的动机,Huber损失。

    3. Huber损失

    Huber损失(又称平滑平均绝对误差)对数据中的异常值的敏感性低于平方误差损失。它在0处也是可微分的。它基本上是绝对误差,当误差很小时变为二次曲线。该误差必须多小才能使其成为二次方取决于可以调整的超参数δ(delta)。当δ0时,**Huber损失接近**MAE,当δ∞(大数)时, Huber损耗接近MSE。
    L δ ( y , f ( x ) ) = { 1 2 ( y − f ( x ) ) 2  for  ∣ y − f ( x ) ∣ ≤ δ δ ∣ y − f ( x ) ∣ − 1 2 δ 2  otherwise  L_{\delta}(y, f(x))=\left\{\begin{array}{ll}{\frac{1}{2}(y-f(x))^{2}} &amp; {\text { for }|y-f(x)| \leq \delta} \\ {\delta|y-f(x)|-\frac{1}{2} \delta^{2}} &amp; {\text { otherwise }}\end{array}\right. Lδ(y,f(x))={21(yf(x))2δyf(x)21δ2 for yf(x)δ otherwise 
    img
    Hoss损失(Y轴)与预测(X轴)的关系图。

    δ的选择至关重要,因为它决定了你愿意考虑的异常值。大于δ的残差最小化为L1(对大异常值不敏感),而小于δ的残差最小化为“适当”L2。

    **为什么要使用Huber Loss?**使用MAE训练神经网络的一个大问题是其持续的大梯度,这可能导致在训练结束时使用梯度下降丢失最小值。对于MSE,随着损失接近其最小值,梯度减小,使其更精确。

    在这种情况下,胡贝尔损失确实很有用,因为它在最小值附近弯曲,从而降低了梯度。而且它比MSE更强大。因此,它结合了MSE和MAE的良好特性。然而,Huber损失问题是我们可能需要训练超参数δ,这是一个迭代过程。

    4. Log-Cosh损失

    Log-cosh是回归任务中使用的另一个函数,比L2更平滑。Log-cosh是预测误差的双曲余弦的对数。
    L ( y , y p ) = ∑ i = 1 n log ⁡ ( cosh ⁡ ( y i p − y i ) ) L\left(y, y^{p}\right)=\sum_{i=1}^{n} \log \left(\cosh \left(y_{i}^{p}-y_{i}\right)\right) L(y,yp)=i=1nlog(cosh(yipyi))
    img
    Log-cosh Loss(Y轴)与预测(X轴)的关系图。

    **优点:**当x值较小 时,log(cosh(x))约等于(x ** 2) / 2;当x值较大时,约等于abs(x) - log(2)。这意味着’logcosh’的作用大部分类似于均方误差,但不会受到偶然误差预测的强烈影响。它具有Huber损失的所有优点,并且它在各处都是可区分的,与Huber损失不同。

    **为什么我们需要二阶导数?**像XGBoost这样的许多ML模型实现使用牛顿方法来找到最优,这就是为什么需要二阶导数(Hessian)。对于像XGBoost这样的ML框架,两个可区分的函数更有利。

    img

    XgBoost中使用的目标函数。注意对1阶和2阶导数的依赖性

    但Log-cosh损失并不完美。对于非常大的脱靶预测是恒定的,它仍然存在梯度和粗麻布的问题,因此导致没有XGBoost的分裂。

    Huber和Log-cosh损失函数的Python代码:

    # huber loss
    def huber(true, pred, delta):
        loss = np.where(np.abs(true-pred) < delta , 0.5*((true-pred)**2), delta*np.abs(true - pred) - 0.5*(delta**2))
        return np.sum(loss)
    
    # log cosh loss
    def logcosh(true, pred):
        loss = np.log(np.cosh(pred - true))
        return np.sum(loss)
    
    5.分位数损失

    在大多数现实世界预测问题中,我们通常有兴趣了解预测中的不确定性。了解预测范围而不仅仅是点估计可以显着改善许多业务问题的决策过程。

    当我们对预测区间而不是仅预测点预测感兴趣时,分位数损失函数变得有用。来自最小二乘回归的预测区间基于以下假设:残差在独立变量的值上具有恒定的方差。我们认为违反这一假设的线性回归模型。我们也不能仅仅通过使用非线性函数或基于树的模型来更好地建模。这种情况来将不能利用线性回归模型来拟合。这是分位数损失和分位数回归将派上用场了,因为基于分位数损失的回归甚至对于具有非恒定方差或非正态分布的残差提供了合理的预测区间。

    让我们看一个工作示例,以更好地理解为什么基于分位数损失的回归在异方差数据中表现良好。

    分位数回归与普通最小二乘回归

    img

    ​ 左:具有恒定的残差方差。右:Y的方差随X2增加。

    img

    ​ 橙色线表示两种情况的OLS估计值

    img

    分位数回归。虚线表示基于回归的0.05和0.95分位数损失函数

    了解分位数损失函数

    基于分位数的回归旨在估计给定某些预测变量值的响应变量的条件“分位数”。分位数损失实际上只是MAE的延伸(当分位数为50%时,它是MAE)。

    我们的想法是根据我们是否希望为正误差或负误差提供更多价值来选择分位数值。损失函数试图基于所选分位数( γ \gamma γ)的值给予过高估计和低估的不同惩罚。例如, γ \gamma γ= 0.25的分位数损失函数给予过高估计更多的惩罚,并试图将预测值保持在中位数以下
    L γ ( y , y p ) = ∑ i = y i &lt; y i p ( γ − 1 ) . ∣ y i − y i p ∣ + ∑ i = y i ≥ y i p ( γ ) . ∣ y i − y i p ∣ L_{\gamma}\left(y, y^{p}\right)=\sum_{i=y_{i}&lt;y_{i}^{p}}(\gamma-1) .\left|y_{i}-y_{i}^{p}\right|+\sum_{i=y_{i} \geq y_{i}^{p}}(\gamma) .\left|y_{i}-y_{i}^{p}\right| Lγ(y,yp)=i=yi<yip(γ1).yiyip+i=yiyip(γ).yiyip
    γ \gamma γ是所需的分位数,其值介于0和1之间。

    img

    分位数损失(Y轴)与预测(X轴)的关系图。Y = 0的真值

    我们还可以使用此损失函数来计算神经网络或基于树的模型中的预测间隔。下面是梯度提升树回归器的Sklearn实现示例。

    img

    使用分位数损失预测区间(梯度增强回归)http://scikit-learn.org/stable/auto_examples/ensemble/plot_gradient_boosting_quantile.html*

    上图显示了使用sklearn库的GradientBoostingRegression中可用的分位数损失函数计算的90%预测区间。上限构建为 γ \gamma γ= 0.95,下限使用 γ \gamma γ= 0.05。

    比较研究:

    Gradient boosting machines,a tutorial ”中提供了一个很好的比较模拟。为了证明上述所有损失函数的性质,他们模拟了一个采用sinc(x函数采样的数据集,该函数具有两个人工模拟噪声源:高斯噪声分量ε~ N(0,σ2)和脉冲噪声分量ξ~Bern(p)。添加脉冲噪声项以说明鲁棒性效应。以下是使用不同损失函数拟合GBM回归量的结果。

    img

    连续损失函数:(A)MSE损失函数; (B)MAE损失函数; (C)Huber损失函数; (D)分位数损失函数
    演示将平滑的GBM拟合到有噪声的sinc(x)数据
    (E)原始sinc(x)函数; (F)MSE和MAE损失的光滑GBM; (Huber损失的光滑GBM,δ= {4,2,1}; (H)分位数损失的光滑GBM,α= {0.5,0.1,0.9}。

    模拟的一些观察结果:

    • 具有MAE损失函数的模型的预测受脉冲噪声的影响较小,而具有MSE损失函数的预测由于引起的偏差而略微偏差。
    • 对于具有huber损失函数的模型,预测对于选择的超参数值非常敏感。
    • 分位数损失函数可以很好地估计相应的置信水平。

    单个图中的所有损失函数。

    img

    翻译文献:

    https://heartbeat.fritz.ai/5-regression-loss-functions-all-machine-learners-should-know-4fb140e9d4b0

    展开全文
  • 常见的损失函数总结】

    千次阅读 2022-03-29 20:06:07
    损失函数的定义 损失函数,又叫目标函数,是编译一个神经网络模型必须的两个要素之一。另一个必不可少的要素是优化器。 损失函数用来评价模型的预测值和真实值不...损失函数一般分为4,平方损失函数,对数损失函数

    损失函数的定义

    损失函数,又叫目标函数,是编译一个神经网络模型必须的两个要素之一。另一个必不可少的要素是优化器。

    损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。

    损失函数分为经验风险损失函数结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项

    损失Loss必须是标量,因为向量无法比较大小(向量本身需要通过范数等标量来比较)。

    损失函数一般分为4种:

    1. HingeLoss 0-1 损失函数:感知机就是用的这种损失函数;
    2. 对数损失函数:逻辑回归的损失函数就是log对数损失函数;
    3. MSE平方损失函数:线性回归的损失函数就是MSE;
    4. Hinge 损失函数:SVM就是使用这个损失函数;
    5. 交叉熵损失函数 :逻辑回归的损失函数,用sigmoid作为激活函数,常用于二分类和多分类问题中。

    在这里插入图片描述

    我们先定义两个二维数组,然后用不同的损失函数计算其损失值。

    import torch
    from torch.autograd import Variable
    import torch.nn as nn
    import torch.nn.functional as F
    y_pred = Variable(torch.ones(2,2))
    a = torch.Tensor(2,2)
    a[0,0]=0
    a[0,1]=1
    a[1,0]=2
    a[1,1]=3
    y = Variable (a)
    

    y_pred 的值为:[[1,1],[1,1]]。
    y 的值为:[[0,1],[2,3]]。

    神经网络的学习为何要设定损失函数?

    神经网络中的“学习”是指从训练数据中自动获取最优权重参数的过程。学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。

    常见的损失函数

    1. 0-1损失函数(zero-one loss)

    0-1损失是指预测值和目标值不相等为1, 否则为0:
    在这里插入图片描述
    特点:

    (1)0-1损失函数直接对应分类判断错误的个数,但是它是一个非凸函数,不太适用。

    (2)感知机就是用的这种损失函数。但是相等这个条件太过严格,因此可以放宽条件,即满足
    [公式]
    时认为相等。

    2. 对数损失函数

    log对数损失函数的标准形式如下:
    在这里插入图片描述
    特点:

    (1) log对数损失函数能非常好的表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合。
    (2)健壮性不强,相比于hinge loss对噪声更敏感。
    (3)逻辑回归的损失函数就是log对数损失函数。

    3. 平方损失函数MSE(均值平方差)

    数理统计中演化而来,均方误差是指参数估计值和参数真实值之差平方的期望值。在此处其主要是对每个预测值与真实值作差求平方的平均值,具体公式如下所示:
    在这里插入图片描述
    MSE越小代表模型越好,类似的算法还包括RMSE和MAD。
    线性回归就是使用MSE作为损失函数。

    方式1:Pytorch

    criterion = nn.MSELoss()
    loss = criterion(y_pred, y)
    print(loss)
    

    最后结果是:1.5。

    方式2:tensorflow
    tensorflow没有单独的MSE函数,不过可由开发者自己组合即可,如下所示:

    # y为真实值,y_pred为预测值
    1. MSE = tf.reduce_mean(tf.square(y - y_pred)))
    2. RMSE = tf.sqrt(tf.reduce_mean(tf.square(y - y_pred)))
    3. MAD =  tf.reduce_mean(tf.complex_abs(y - y_pred))
     
    

    4. Hinge 损失函数

    Hinge损失函数标准形式如下:
    在这里插入图片描述
    y为目标值,f(x)为预测值。

    特点:

    (1)hinge损失函数表示如果被分类正确,损失为0,否则损失就为 1 − y f ( x ) 1-yf(x) 1yf(x)SVM就是使用这个损失函数。
    (2)一般的 f ( x ) f(x) f(x) 是预测值,在-1到1之间, y y y 是目标值(-1或1)。其含义是, f ( x ) f(x) f(x) 的值在-1和+1之间就可以了,并不鼓励 ∣ f ( x ) ∣ > 1 |f(x)| > 1 f(x)>1 ,即并不鼓励分类器过度自信,让某个正确分类的样本距离分割线超过1并不会有任何奖励,从而使分类器可以更专注于整体的误差
    (3) 健壮性相对较高,对异常点、噪声不敏感,但它没太好的概率解释。

    5. 交叉熵损失函数 (Cross-entropy loss function)

    交叉熵(cross-entropy)刻画了两个概率分布之间的距离,更适合用在分类问题上,因为交叉熵表达预测输入样本属于某一类的概率。
    交叉熵损失函数的标准形式如下:
    在这里插入图片描述
    注意公式中 x x x 表示样本, y y y 表示实际的标签, a a a 表示预测的输出, n n n 表示样本总数量。

    也就相当于:
    在这里插入图片描述
    特点:

    1. 本质上也是一种对数似然函数,可用于二分类多分类任务中。
    • 二分类问题中的loss函数(输入数据是softmax或者sigmoid函数的输出):
      在这里插入图片描述
    • 多分类问题中的loss函数(输入数据是softmax或者sigmoid函数的输出):
      在这里插入图片描述
    1. 当使用sigmoid作为激活函数的时候,常用交叉熵损失函数而不用均方误差损失函数,因为它可以完美解决平方损失函数权重更新过慢的问题,具有“误差大的时候,权重更新快;误差小的时候,权重更新慢”的良好性质。

    Pytorch实现交叉熵函数:

    def cross_entropy(Y, P):
        """Cross-Entropy loss function.
        以向量化的方式实现交叉熵函数
        Y and P are lists of labels and estimations
        returns the float corresponding to their cross-entropy.
        """
        Y = np.float_(Y)
        P = np.float_(P)
        return -np.sum(Y * np.log(P) + (1 - Y) * np.log(1 - P)) / len(Y)
    

    tensorflow具有多种常见的交叉熵函数:

    #Sigmoid交叉熵
    tf.nn.simoid_cross_entropy_with_logits(y_pred, y, name=None)
    #softmax交叉熵
    tf.nn.softmax_cross_entropy_with_logits(y_pred, y, name=None)
    #Sparse交叉熵
    tf.nn.sparse_cross_entropy_with_logits(y_pred, y, name=None)
    #加权Sigmoid交叉熵
    tf.nn.weighter_cross_entropy_with_logits(y_pred, y, pos_weight,name=None)
    
    

    三、总结
    loss函数的选取取决于输入标签数据的类型:若输入的是实数、无界的值,损失函数使用平方差;若输入标签是位矢量(分类标志),使用交叉熵更适合。此外预测值与真实值要采用同样的数据分布,以便于loss函数取得更佳的效果。

    参考链接:
    深度学习基础(三)loss函数:https://blog.csdn.net/u010554381/article/details/88351920
    常见的损失函数(loss function)总结:https://zhuanlan.zhihu.com/p/58883095

    展开全文
  • 种常见的损失函数

    千次阅读 2018-12-21 16:17:33
    转自:几种常见的损失函数(https://www.cnblogs.com/lliuye/p/9549881.html) 1. 损失函数、代价函数与目标函数   损失函数(Loss Function):是定义在单个样本上的,是指一个样本的误差。   代价函数(Cost ...
  • 人工神经元模型常见激活函数

    万次阅读 2017-06-26 21:46:45
    人工神经元模型 生物学上神经元通常由细胞体,细胞核,树突和轴突构成。 树突用来接收其他神经元传导过来的信号,一个神经元有多个树突; 细胞核是神经元中的核心模块,用来处理所有的传入信号; 轴突是输出信号的...
  • 种常见激活函数(笔记整理)

    万次阅读 2019-02-26 19:15:17
    函数是神经网络中非线性的来源,因为如果去掉这些函数,那么整个网络就只剩下线性运算,线性运算的复合还是线性运算的,最终的效果只相当于单层的线性模型. (1)Sigmoid函数 左端趋近于0,右端趋近于1,且两端...
  • 第二节 控制系统的数学模型——传递函数

    千次阅读 多人点赞 2021-05-10 19:57:28
    第二节 控制系统的数学模型——传递函数 了解数学模型的概念,自动控制原理都包含哪些数学模型,怎样将系统转换为数学模型 什么是控制系统的数学模型?控制系统的模型有哪些? 数学模型是用来描述系统因果关系的...
  • 种常见的激活函数

    万次阅读 多人点赞 2016-09-30 13:16:21
    2.3 几种常见的激活函数 Sigmoid. Sigmoid 非线性激活函数的形式是σ(x)=1/(1+e−x),其图形如上图左所示。之前我们说过,sigmoid函数输入一个实值的数,然后将其压缩到0~1的范围内。特别地,大的负数被映射成0,...
  • 常见的损失函数(loss function)总结

    千次阅读 2021-08-09 00:58:02
    点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达 导读本文总结了常见八种损失函数的优缺点,包括:0-1损失函数、绝对值损失函数、 log对数损失函...
  • 多分类的个数是6,则可以使用类似的代码指定每个分类的权重: pos_weight = torch.ones( [6] )#为每个分类指定权重为1 criterion = torch.nn.BCEwithLogitsioss( posweight = pos_weight) 2 分类模型常用的损失函数 ...
  • 深度学习中常见的损失函数

    千次阅读 2020-04-28 11:00:00
    文章来源于AI的那些事儿,作者黄鸿波2018年我出版了《TensorFlow进阶指南 基础、算法与应用》这本书,今天我把这本书中关于常见的损失函数这一节的内容公开出来,希望能对大家有所帮...
  • 阅读大概需要7分钟跟随小博主,每天进步一丢丢机器学习算法与自然语言处理出品@公众号原创专栏作者yyHaker单位 |哈工大SCIR实验室损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能...
  • 常见的激活函数总结

    千次阅读 2018-01-25 19:45:45
    平时在跑基于tensorflow的深度学习实验室时,也都是直接仿照许多经典的网络架构来设计自己的网络架构,而对于激活函数,也是直接采用tensorflow提供的接口,没有进行深究。那么在卷积神经网络中引用激活函数的意义是...
  • tensorflow中常见的损失函数

    千次阅读 2019-02-21 19:34:43
    今天在构建一个卷积网络时看到书上例程里用的tf.nn.sparse_softmax_cross_entropy_with_logits()这个函数,打开Documentation看了没太明白,特地讲三种常见的loss function归纳总结下。 1、对数概率logit 首先解释...
  • 机器学习中最常见的四分类模型

    万次阅读 多人点赞 2020-05-23 12:30:00
    你可能会在机器学习中遇到许多不同类型的分类任务,但是其实每种模型都会使用与之相对应的建模方法。 因此在本文中,你将了解到机器学习中不同类型的分类预测建模方法。 分类预测建模将类别标签分配给输入样本; 二...
  • 在机器学习和深度学习中,我们通常会需要掌握三个步骤就可以完成了,拿起数据(特征),搭上模型(目标函数,损失函数,代价函数),不断优化(优化函数-梯度下降,adam,动量-找到最优的W),就可以完成了 ...
  • 机器学习之常见的损失函数(loss function)

    万次阅读 多人点赞 2019-03-06 09:40:43
    解决一个机器学习问题主要有两部分:数据和算法。...所以仅在此以自己理解的方式总结一些常见的损失函数,作为笔记方便日后复习。 参考文章: 一、总览 在机器学习中,通常把模型关于单个样本预测值与真实值的差...
  • 机器学习中常见的损失函数 现实世界中的DS (DS IN THE REAL WORLD) In mathematical optimization and decision theory, a loss function or cost function is a function that maps an event or values of one or ...
  • 常见的损失函数总结

    千次阅读 2018-04-13 17:07:45
    损失函数(loss function)用来估量模型的预测值 f(x)f(x) 与真实值 YY 的不一致程度,损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数的重要组成部分。模型的结构风险函数...
  • 线性回归模型请看上篇文章,本篇文章介绍的是非线性回归模型 线性回归模型链接 在目前的机器学习领域中,最常见的三任务就是:回归分析、分类分析...下面介绍几种常见的非线性回归模型。 1、SVR 众所周知,支持向...
  • 常见的预测模型及算法

    万次阅读 多人点赞 2020-05-01 13:22:18
    如果得到一份数据集,任务是要预测出一系列的值,而在预测任务中,我们大多数都采用的是拟合的方法,这篇文字主要介绍三预测方法时间序列分析,灰色预测模型,神经网络。 时间序列分析 时间序列也叫动态序列,数据...
  • 概率论-常见的概率分布模型

    千次阅读 2020-03-06 19:11:37
    文章目录常见的概率分布模型离散概率分布函数连续概率分布函数联合分布函数多项分布(Multinomial Distribution)多项分布简介多项分布公式解析伯努利分布(Bernoulli Distribution)伯努利分布简介伯努利分布的期望...
  • 常用的激活函数

    千次阅读 2018-08-30 11:13:35
    1. sigmod函数 函数公式和图表如下图   在sigmod函数中我们可以看到,其输出是在[0,1]这个开区间内,我们可以联想到概率,但是严格意义上讲,不要当成概率。sigmod函数曾经是比较流行的,它可以想象成一个神经元...
  • 深度学习中常见的loss函数汇总

    千次阅读 多人点赞 2020-05-19 21:22:18
    深度学习中的损失函数被用于模型参数的估计,通常作为学习准则与优化问题相联系,即通过最小化损失函数求解和评估模型。   机器学习任务中的损失函数可以大体分为两类型:回归损失和分类损失。在此基础上,在...
  • 转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 ...公众号:搜索与推荐Wiki ... 损失函数是用来估量你模型的预测值f(x)与真实值Y的不一致程度,它是一个非负实值...
  • 损失函数 (loss function) 是用来估量在一个样本点上模型的预测值 h(x) 与真实值 y 的不一致程度。它是一个非负实值函数,通常使用 L(y, h(x)) 来表示。 损失函数可由 y 的类型来分类,而第三章提升树的梯度...
  • 常见机器学习模型总结

    千次阅读 2020-10-21 23:41:11
    混合高斯模型 KNN,K近邻 隐马尔科夫模型HMM 贝叶斯网络 马尔科夫随机场 深度信念网络DBN 隐含狄利克雷分布LDA 生成对抗网络 变分自动编码器 自回归模型AR 常见机器学习模型总结 类别 方法 适用情况 损失函数 学习...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 303,060
精华内容 121,224
关键字:

常见的八种函数模型