
准备完模型和训练数据后,我们可以开始计算损失函数,并开始训练。先使用Softmax 归一化,将模型输出的 logits 转换为概率分布(自动处理):
softmax_output = torch.softmax(input, dim=1)然后交叉熵计算,计算预测概率与真实标签的差异
loss = -torch.sum(target * torch.log(softmax_output))简单介绍下交叉熵:I(x)=-log(p(x)),其中p(x)表示事件X发生的概率。因为一个事件发生的概率取值范围在0到1之间,所以log(p(X))的范围是负无穷到0。加上负号之后,p(x)越小,I(x)越大。即事件发生的概率越小,它带有的信息量也就越大。
我们上面的公式定义的是信息量,但是这里有一个问题,我们定义的只是事件X的一种结果的信息量。对于一个事件来说,它可能的结果可能不止一种。我们希望定义整个事件的信息量,其实也很好办,我们算下整个事件信息量的期望即可,这个期望就是信息熵。信息熵的定义:
H(X)=∑p(x)I(x) =-∑p(x)log(p(x))其中,p(x)表示事件X发生的概率。如果我们把一个事件看成是一个样本的话,那么表示的就是一组样本的信息熵。我们分别代入样本真实的标签和模型的预测结果,就能得到两个信息熵。既然有两个信息熵,那么很容易想到我们可以把这两个信息熵作差来表示它们之间的距离,距离越小,说明模型学习的结果越好和真实结果越接近。
真实样本的信息熵为:H(Y)=∑p(y)log(p(y))
模型预测样本的信息熵为:H(Y^)=∑p(y^)log(p(y^))
那么,两个信息熵的差距就是:H(Y^,Y)=H(Y^)-H(Y),我们可以把这个差距看成是模型预测的结果与真实结果之间的差距。数学家们给这个式子起了一个专有的名字叫做KL散度,专门用来衡量两个概率分布之间的近似程度。通过化简推导,可以得到:
J=-log(P(y|x))=-(ylogy^+(1-y)log(1-y^))这个式子再除以一个样本的数量,就是损失函数了。这个损失函数被称作是交叉熵,也就是我们的损失函数。有了理论基础后,我们开始技术实现。
本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!