机器学习算法中的7个损失函数的详细指南( 三 )
然后,输出标签y(可以取值0和1)的交叉熵损失和和预测概率p定义为:

文章插图
这也称为Log-Loss(对数损失) 。为了计算概率p,我们可以使用sigmoid函数 。这里,z是我们输入功能的函数:

文章插图
sigmoid函数的范围是[0,1],这使得它适合于计算概率 。

文章插图
推荐你引用以下代码时先尝试自己计算出梯度
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次迭代得到下图:

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

文章插图
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次迭代的更新函数之后,得到下图:

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

文章插图
4.1. 多分类交叉熵损失
多分类交叉熵损失是二元交叉熵损失的推广 。输入向量 X_i 和相应的one-hot编码目标向量 Y_i 的损失是:

文章插图
我们使用softmax函数来找到概率 P_ij:

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

文章插图
最后,我们的输出是具有给定输入的最大概率的类别 。
我们使用一个输入层和一个输出层建立一个模型,并用不同的学习速度编译它 。在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)
推荐阅读
- 官方清粉工具要来?微信新功能曝光:全面学习QQ
- Java小白学习如何打日志
- 高效的动态规划算法
- Dijkstra算法
- 「一图详解」收藏!一份关于小规模纳税人减征增值税的学习笔记
- 收藏这5个学习APP,每天偷偷给自己充电,做更优秀的自己
- 贪心算法
- 算法到底是什么?
- BloomFilter算法知识点
- 机器|什么样的员工,才会更容易被领导提拔和重用