机器学习算法中的7个损失函数的详细指南( 三 )

然后,输出标签y(可以取值0和1)的交叉熵损失和和预测概率p定义为:

机器学习算法中的7个损失函数的详细指南

文章插图
 
这也称为Log-Loss(对数损失) 。为了计算概率p,我们可以使用sigmoid函数 。这里,z是我们输入功能的函数:
机器学习算法中的7个损失函数的详细指南

文章插图
 
sigmoid函数的范围是[0,1],这使得它适合于计算概率 。
机器学习算法中的7个损失函数的详细指南

文章插图
 
推荐你引用以下代码时先尝试自己计算出梯度
def update_weights_BCE(m1, m2, b, X1, X2, Y, learning_rate): m1_deriv = 0 m2_deriv = 0 b_deriv = 0 N = len(X1) for i in range(N): s = 1 / (1 / (1 + math.exp(-m1*X1[i] - m2*X2[i] - b))) # 计算偏导数 m1_deriv += -X1[i] * (s - Y[i]) m2_deriv += -X2[i] * (s - Y[i]) b_deriv += -(s - Y[i]) # 我们减去它,因为导数指向最陡的上升方向 m1 -= (m1_deriv / float(N)) * learning_rate m2 -= (m2_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_rate return m1, m2, b在不同alpha值里使用权重更新规则进行1000次迭代得到下图:
机器学习算法中的7个损失函数的详细指南

文章插图
 
3.2. Hinge损失
Hinge损失主要用于带有类标签-1和1的支持向量机(SVM) 。因此,请确保将数据集中"恶性"类的标签从0更改为-1 。
Hinge损失不仅会惩罚错误的预测,还会惩罚不自信的正确预测 。
数据对(x,y)的Hinge损失如图:
机器学习算法中的7个损失函数的详细指南

文章插图
 
def update_weights_Hinge(m1, m2, b, X1, X2, Y, learning_rate): m1_deriv = 0 m2_deriv = 0 b_deriv = 0 N = len(X1) for i in range(N): # 计算偏导数 if Y[i]*(m1*X1[i] + m2*X2[i] + b) <= 1: m1_deriv += -X1[i] * Y[i] m2_deriv += -X2[i] * Y[i] b_deriv += -Y[i] # 否则偏导数为0 # 我们减去它,因为导数指向最陡的上升方向 m1 -= (m1_deriv / float(N)) * learning_rate m2 -= (m2_deriv / float(N)) * learning_rate b -= (b_deriv / float(N)) * learning_ratereturn m1, m2, b在使用三个不同的alpha值运行2000次迭代的更新函数之后,得到下图:
机器学习算法中的7个损失函数的详细指南

文章插图
 
Hinge损失简化了SVM的数学运算,同时最大化了损失(与对数损失(Log-Loss)相比) 。当我们想要做实时决策而不是高度关注准确性时,就可以使用它 。
4. 多分类损失函数
电子邮件不仅被归类为垃圾邮件或垃圾邮件(这不再是90年代了!) 。它们分为各种其他类别-工作,家庭,社交,促销等 。
我们将使用Iris数据集^3来理解剩余的两个损失函数 。我们将使用2个特征 X_1 萼片长度(Sepal length)和特征 X_2 花瓣宽度(Petal width)来预测鸢尾花的类别(Y) -Setosa,Versicolor或Virginica
我们的任务是使用神经网络模型和Keras内置的Adam优化器来实现分类器 。这是因为随着参数数量的增加,数学以及代码将变得难以理解 。
这是我们数据的散点图:
机器学习算法中的7个损失函数的详细指南

文章插图
 
4.1. 多分类交叉熵损失
多分类交叉熵损失是二元交叉熵损失的推广 。输入向量 X_i 和相应的one-hot编码目标向量 Y_i 的损失是:
机器学习算法中的7个损失函数的详细指南

文章插图
 
我们使用softmax函数来找到概率 P_ij:
机器学习算法中的7个损失函数的详细指南

文章插图
 
"Softmax层是接在神经网络的输出层前 。Softmax层必须与输出层具有相同数量的节点 。"google Developer's Blog

机器学习算法中的7个损失函数的详细指南

文章插图
 
最后,我们的输出是具有给定输入的最大概率的类别 。
我们使用一个输入层和一个输出层建立一个模型,并用不同的学习速度编译它 。在model.compile()语句中将损失函数指定为' categorical_crossentropy ':
# 导入包from keras.layers import Densefrom keras.models import Sequentialfrom keras.optimizers import adam#alpha设置为0.001,如adam优化器中的lr参数所示# 创建模型model_alpha1 = Sequential()model_alpha1.add(Dense(50, input_dim=2, activation='relu'))model_alpha1.add(Dense(3, activation='softmax'))# 编译模型opt_alpha1 = adam(lr=0.001)model_alpha1.compile(loss='categorical_crossentropy', optimizer=opt_alpha1, metrics=['accuracy'])# 拟合模型# dummy_Y是one-hot形式编码的# history_alpha1用于为绘图的验证和准确性评分history_alpha1 = model_alpha1.fit(dataX, dummy_Y, validation_data=https://www.isolves.com/it/ai/2019-08-29/(dataX, dummy_Y), epochs=200, verbose=0)


推荐阅读