精华内容
下载资源
问答
  • 【神经网络笔记】——多分类交叉熵损失函数公式及代码实现
    千次阅读
    2021-06-18 01:24:41

    背景

    mse均方误差、mae绝对值平均误差用于拟合回归,公式已经熟悉了,但交叉熵的每次都只是应用,没有了解公式,这对于自己写交叉熵损失函数以及分析损失函数不利。

    公式详解

    C是损失值;
    n是求平均用的,所以是样本数量,也就是batchsize;
    x是预测向量维度,因为需要在输出的特征向量维度上一个个计算并求和;
    y是onehot编码后的真实值 对应x维度上的标签,是1或0;
    a是onehot格式输出的预测标签,是0~1的值,a经过了softmax激活,所以a的和值为1
    公式
    对于某个维度 x i x_i xi y = 1 y=1 y=1时a越大越好,相反a越小越好,C值为两者和的负值,所以越好→C↓ 所以可以最优化C(神经网络需要最小化损失函数)

    公式计算举例

    C ( ( 0.8 , 0.1 , 0.1 ) , ( 1 , 0 , 0 ) ) = − 1 / 1 ∗ ( 1 l n ( 0.8 ) + 0 + 0 + 1 l n ( 0.9 ) + 0 + 1 l n ( 0.9 ) ) C((0.8,0.1,0.1),(1,0,0))=-1/1*(1ln(0.8)+0+0+1ln(0.9)+0+1ln(0.9)) C((0.8,0.1,0.1),(1,0,0))=1/1(1ln(0.8)+0+0+1ln(0.9)+0+1ln(0.9))

    公式编程实现

    计算举例是为了理解计算过程,最终还是要落到编程实现上:

    def cross_entropy(y_true,y_pred):
        C=0
        # one-hot encoding
        for col in range(y_true.shape[-1]):
            y_pred[col] = y_pred[col] if y_pred[col] < 1 else 0.99999
            y_pred[col] = y_pred[col] if y_pred[col] > 0 else 0.00001
            C+=y_true[col]*np.log(y_pred[col])+(1-y_true[col])*np.log(1-y_pred[col])
        return -C
    
    # 没有考虑样本个数 默认=1
    num_classes = 3
    label=1#设定是哪个类别 真实值
    
    y_true = np.zeros((num_classes))
    # y_pred = np.zeros((num_classes))
    # preset
    y_true[label]=1
    y_pred = np.array([0.0,1.0,0.0])
    C = cross_entropy(y_true,y_pred)
    print(y_true,y_pred,"loss:",C)
    y_pred = np.array([0.1,0.8,0.1])
    C = cross_entropy(y_true,y_pred)
    print(y_true,y_pred,"loss:",C)
    y_pred = np.array([0.2,0.6,0.2])
    C = cross_entropy(y_true,y_pred)
    print(y_true,y_pred,"loss:",C)
    y_pred = np.array([0.3,0.4,0.3])
    C = cross_entropy(y_true,y_pred)
    print(y_true,y_pred,"loss:",C)
    

    执行结果:

    [0. 1. 0.] [1.0000e-05 9.9999e-01 1.0000e-05] loss: 3.0000150000863473e-05
    [0. 1. 0.] [0.1 0.8 0.1] loss: 0.43386458262986227
    [0. 1. 0.] [0.2 0.6 0.2] loss: 0.9571127263944101
    [0. 1. 0.] [0.3 0.4 0.3] loss: 1.62964061975162
    
    Process finished with exit code 0
    

    结论

    1. 分类任务神经网络的输出层往往是经过了softmax激活,所以最后一层输出的预测向量各个维度的值均为0~1范围内的数。
    2. python的引用类型,如array,在函数传参后是传的引用,所以函数内的修改会影响到实际的值,通过控制台输出的第一条信息即可知。
    3. 计算过程可能出现溢出NaN的报错,所以需要进行近似处理。
    更多相关内容
  • 交叉熵:物理意义: 用模拟分布Q去编码真实分布P所需要的平均编码长度(比特个数底数为2时交叉熵损失函数:(这里的连加sigma 是把一个样本分布的所有概率下的信息量进行的连加,例如我们就求一句话分类的损失, 假设...

    0. 总结 (本文目的是讨论理解一下相对熵(KL)与交叉熵(cross-entropy)的关系,以及相应的损失函数)

    7928a6c20a826fb193fcd6bfcf80ac58.png

    熵的本质: 信息量 log(1/p)的期望 的期望。

    e5a385708854fb22601934a2edc755ca.png

    交叉熵:

    物理意义: 用模拟分布Q去编码真实分布P所需要的平均编码长度(比特个数底数为2时

    45d5fd367100f8b7844544177eb5213c.png

    交叉熵损失函数:

    58c45524e94e75e37bbf14630c64bd7a.png

    (这里的连加sigma 是把一个样本分布的所有概率下的信息量进行的连加,例如我们就求一句话分类的损失, 假设类别有3个, 那么就会连加3次,属于第一个类别的概率。。+输入第二个类别的概率+。。)

    相对熵:

    物理意义: 用模拟分布Q去编码真实分布P所需要的额外比特个数。

    125cc33fdd2c52ad659b15bf48767424.png

    熵的重要性质: (摘录)

    **单调性**,即发生概率越高的事件,其所携带的信息熵越低。极端案例就是“太阳从东方升起”,因为为确定事件,所以不携带任何信息量。从信息论的角度,认为这句话没有消除任何不确定性。**非负性**,即信息熵不能为负。这个很好理解,因为负的信息,即你得知了某个信息后,却增加了不确定性是不合逻辑的。**累加性**,即多随机事件同时发生存在的总不确定性的量度是可以表示为各事件不确定性的量度的和。

    1.重点

    1. 信息熵2. 交叉熵3. 相对熵 4. 交叉熵与相对熵关系5. 相对熵与交叉熵的损失函数

    2. 自信息与信息熵:

    信息熵:

    5c9a7f13ae0086aaee94c858746fa555.png

    (E表示期望)

    1219f1f2bafbf890720b1412541ad5d2.png
    物理意义: 编码一个变量分布的最少比特数(期望比特数)。实际意义: 事件发生的概率越高, 信息熵越小。例如 p(xi) 的概率是1,对于X的取值只能是xi ,则H(x)=0.

    为什么是log?log的底应该是多少?

    底为2, 因为计算机中是0,1编码,但是底设置为多少都可以根据需求而定

    例子:

    f696f885ef1ece7faf27fa6210113504.png
    投掷一次, 要确定是不是A需要询问1次, 确定是不是B需要问2次(先问是不是A再问是不是B) 询问C问3次,询问D也是3次 所以编码有 1*1/2+2*1/4+3/8+3/8 = 7/4 (该例子原理引用自知乎某文因为是之前看过记忆下来的没有找到reference地址抱歉)

    3.交叉熵

    0990ce6619a79df3d39b678938c2c919.png

    物理意义:

    用模拟分布Q去编码真实分布P所需要的平均编码长度比特个数

    例子:

    假设 X~(A,B,C,D) 数据集,真实分布(1/2,1/2,0,0) 那么 H(X)=1/2*log(1/0.5)+1/2*log(1/0.5)=1如果我们模型预测的分布Q满足 (1/4,1/4,1/4,1/4) ,用这个分布去模拟真实分布:
    38d67dab0ee73ba2494928fdf1fd8c3e.png
    这里是2其实我们自然希望我们的模型的分布去编码真实分布时可以最小,但是最小并不一定是0,在这个例子里我们就希望最小为1(当然也不可能比1小).那么在很多时候交叉熵损失函数为什么都要逼近0呢?那是因为在这时候我们的H(p)=0例如P满足分布(1,0,0)是一个3分类问题,这时候H(P)=(1*log(1/1)+0+0)=0。可以看到上例中根据非真实分布q得到的平均编码长度H(p,q)大于根据真实分布p得到的平均编码长度H(p)。 那么H(p,q)-H(p)的物理意义就是当用模拟分布预测的编码长度减去真实编码长度就是 相对熵。(相对熵: 用错误分布去编码真实分布所消耗的额外比特数)

    3.1 交叉熵损失函数:

    bb3650b7c1e54507a377cdeb3d14d12a.png

    假如样本用来描述积极与消极,p真实样本符合(1,0)也就是p(积极)=1,p(消极=0) 模型预测分布时(0.6,0.4) q(积极)=0.6 q(消极)=0.4则有损失函数如下

    ee902d33c118ee3ee079eaf0ef445c3f.png
    其中 M:表示类别的数量。 p:表示真实样本分布, q:表示模型预测分布。上式中 p(x1) 表示当前样本输入第一个类目的概率, (例如判断一句话是 积极,消极还是中性,那么M就是3 表示每个样本有3种分布)(注意发现有些同学误以为这里的sigma是把很多句话的损失连加起来,不是哈,这里连加是把一句话所属的不同分布的信息熵连加得到了一句话的损失,如果有很多句话,进来是一个矩阵,每一行代表一句话,出去应该是一个列向量,每一个元素代表每一句话的损失,然后再求个平均损失即可。)

    当然上面二分类问题的损失函数等同于下面多分类的损失函数,只不过是把下面的$Sigma$进行了展开。 例如判断一句话:真实分布P X~{1,0} 而我们 预测分布Q X~{1/2,1/2}

    7e18e777f3ca9a9a3304be94f7f6f415.png

    当然了我们也可以 设置真实分布时P X~{1/2,1/2} 预测分布Q 是(1,0)带入公式会得到 -log(0) 趋于无线大。

    4.相对熵: Kullback-Leibler divergence,KLD KL散度

    6efcf35f7e6a3ae197df8399cd56c283.png
    相对熵: 用错误分布(或者是模型分布)去编码真实分布所消耗的额外比特数。根据Gibbs' inequality可知,H(p,q)>=H(p)恒成立,当q为真实分布p时取等号。我们将由q得到的平均编码长度比由p得到的平均编码长度多出的bit数称为 相对熵。意义:它表示2个函数或概率分布的差异性:差异越大则相对熵越大,差异越小则相对熵越小,特别地,若2者相同则熵为0

    相对熵的性质:

    4.1. 相对熵损失函数:

    9413e594a1f479d0fdd7537c297655f7.png
    为啥不常用呢?其实主要是因为很多时候我们的真实分布都是分类问题例如:p样本符合分布(1,0,0,0) 4分类问题, 此时H(P)=0 所以相对熵损失函数在很多问题上 相对熵就是交叉熵损失函数。(大家可以想一想H(p)=0的场景)

    5. 损失函数的应用例子:

    为了方便理解机器学习中损失函数输入,输出以及计算过程,这里给出一个自己假设的案例。 场景: 我们要对句子进行情感分类, 一个句子可以分成3个不同类目:{积极,中性,消极} 一个batch有2个句子,matrix(batch,embedding)经过一系列网络(例如lstm )再经过一个softmax之后得到如下矩阵:Q=

    72d9ce7d3a92225b2815936986ae49d4.png
    bb68fd5b700d6b79cbf078a29c7b095a.png

    交叉熵损失函数:

    89657e9b7851a19e269dc73d00fb9589.png

    相对熵损失函数:

    6b61a619961eb6b4ac5ee791dd100b59.png

    结论:

    其实我们用的是相对熵损失函数,只不过在很多情况下,H(P)=0 简化成了交叉熵。 但是理论上来看,我们更关注的是 模型分布编码真实分布 与 真实分布编码真实分布 的差距,这个差距是相对熵也就是KL div

    由于匆忙尚有几个问题没有整理放出来:

    1. 为什么选用log?
    2. 如何证明 相对熵>=0 恒成立,关于jenson不等式的探讨.
    3. 交叉熵与极大似然

    欢迎讨论,指正,引用(请注明出处)。

    0cfa5dbcd97b887c2c9fc2bd7604fcdb.png
    ee86e3c3034bc81abf2de8007445f407.png
    展开全文
  • 六、损失函数交叉熵 机器学习中,实际分布为p,预测分布为q。训练的过程就是调整参数使q不断逼近p的过程。调整的依据就是q与p的差。 如何衡量这个差呢? 就可以用相对熵: 但由于实际分布的熵: 固定不变。 所以...

    一、信息是什么?

    信息很抽象,看不见摸不着,却似乎又无处不在,一封邮件、一首歌、一则新闻、一本书、一张地图、一句话......

    但信息究竟是什么?

    朗文双解词典:

    Information: Facts or details that tell you something about a situation, person, event, etc.

    知乎大神:

    1、从“你不知道”的状态变成“你知道”的状态,这个过程中传送的“东西”,就叫信息。

    2、信息是发送者和解读者的相关knowledge base之间的diff。

    3、让你搞清状况的东西。

    但所有的以上答案,都可以用信息论之父香农的定义来概括:

    信息是用来消除不确定的东西。

    比如:

    路标指示信息,可以消除岔路口方向的不确定性,帮助你选择正确的道路。

    197d89356c158ff8510081a3d5a86012.png

    一封家书,可以告知你家里的情况,消除你对一些不确定状况的顾虑,让你安心的学习、工作。

    1217a5e5daec2ef56ddca5ec9ed8192f.png

    天气预报可以帮你确定未来的天气,帮助你更好的决定下一步的安排。

    2f73494504c08a74c2d2df25f8528a5d.png

    二、信息的传递

    信息传递的方式有很多中,比较古老的像周幽王烽火戏诸侯。那个时候,技术手段比较落后,而军情又十万火急,于是就想到了用烽火来进行传递。但由于烽火只有点燃和未点燃两种状态,所以能表达的内容十分有限。

    d91454a8b8235ce295ffa9a0339d0cbd.png

    后来有了电报,情况好很多。但由于发送接受需要编译码,操作复杂,效率比较低,也只能传输少量的信息。并且价格昂贵,通常是按字数收费。

    e0a25f8f0e352228e9c5f3838a2904c1.png

    所以电报的内容通常都很精炼。比如,你要发送:

    “家里又急事儿,赶快回来一趟。”

    为了省钱,结果可能就会变为:

    “事急,速回。”

    但有些情况,通过精简文字是行不通的。比如,你要发送一段诗:

    “轻轻的我走了,

    正如我轻轻的来;

    我轻轻的招手,

    作别西天的云彩。”

    少一个字,诗的意境就会大打折扣。

    但从诗的内容上来看,确实有很多重复的字,难道除了减字儿就没有其它辙了吗?

    当然不是。

    我们知道,电报是通过电报码来发送的,就是一个个的0和1的状态。分析一下,这段诗中我们一共用到了16个汉字。如果用二进制对其进行编码,需要:

    6ef4b9bfdd5712e202d498b2aa90f318.png

    个bit位。编码如下:

    e9bd6fb962efe74917b17f5d7c6acdf0.png

    全诗一共有26个字,这样我们就需要发送:

    26×4 = 104

    个bit位。

    如果我们换一种编码方式,用少的位表示出现概率大的字,多的位表示出现概率低的字,也就是哈夫曼编码,看看结果如何。

    首先统计诗中文字出现的概率:

    02920852696b38f86c52840f8d41945a.png

    然后构造哈夫曼树如下:

    6b3cde985c9af01501574d6ae41ae0a8.png

    编码结果:

    dd780520d205b3b4f83eff58d8988c48.png

    这样,我们需要发送的bit数就变为:

    6×2+4×3+3×3+1×5×10+1×4×3 = 95

    比先前的编码少9个bit。同样达到了精简内容的目的。

    再后来有了电话、手机、互联网,这种限制越来越小。现在我们可以通过互联网很轻松的传递以T计的内容,在线观看高清电影。

    ffa3bbacad4de757ad400d5e72eb2879.png

    三、信息如何衡量?

    在电报的发送中我们已经看到,找出一种衡量信息多少的方式非常重要。就像时间有秒,质量有克,距离有米等。那信息呢?既然信息是用来消除不确定的东西,如何衡量它的大小?也就是说如何知道在消除一个不确定事件的时候需要多少信息?

    比如,要想知道明天太阳是否会照常升起,需要多少信息?

    按以往的经验,太阳照常升起的概率几乎是1,所以几乎不需要猜测就能知道结果。

    但如果是掷一枚硬币,想知道它是不是正面,需要多少信息?

    硬币的结果只有两种,非正即反,概率都是1/2。所以只需要一次猜测就能知道结果。

    假设实际结果为正面。

    如果猜正面,结果正确,结束。如果猜反面,被告知结果错误,同样可以推测出来正确结果是正面。

    所以只需猜测一次。

    再比如,一道选择题有A、B、C、D四个选项,要猜出正确结果,又需要多少信息呢?

    四个选项概率相等,都是1/4,假设正确答案为C。

    我们先将选项分成两组:

    第一组:A、B

    第二组:C、D

    第一次猜测:如果猜第一组,被告知错误,那么就知道答案在第二组。如果猜第二组,正确。

    第二次猜测:如果猜C,得出结果,猜测结束。如果猜D,被告知错误,于是得出C为正确答案。

    可以看出,需要猜测两次。

    由以上例子可以看出,事件发生的概率越小,不确定性越大,消除不确定性需要的信息量就越大。所以信息量和概率有关系,并且是反相关。

    回过头来看上面的例子,

    太阳照常升起的概率为1:

    ac6531eac337420a77149704b8136c91.png

    硬币为正面的概率为​:

    c78af5695ad369fd2b7980d3e080571e.png

    答案为C的概率为​:

    6004248e42fdb2eb28c2cc025ad01d46.png

    将上面三个等式两边以2为底取对数,并添加负号,有:

    536a8b4ab1d9a9d417b4548e8e0ddbf6.png

    0、1、2正好对应我们获取正确答案的猜测次数。也就是消除不确定性需要的信息量。

    进一步推广出去,香农把:

    f58588f25d6245d3bc616efa699efcac.png

    定义为信息量。对数的底为2只是其中的一种情况,此时信息量的单位为bit。

    有了这个式子,就可以量化信息了。

    四、什么是信息熵?

    有了信息量为什么还要信息熵呢?信息熵又是个啥?

    假设你是一个经验丰富的工程师,在维修一台电子设备,引发设备故障的原因有A、B、C、D四种。

    如果四种原因的概率相同,都是1/4,根据之前信息量的计算公式,很容易就能算出来:

    f2cbe23a00cfb1342b646ae7e88c7c9d.png

    最多两次能排查出故障原因。

    但如果引发故障原因的概率不等呢?比如,A的概率为1/2,B的概率是1/4,C、D的概率是1/8。

    直觉告诉我们应该先排查A,然后是B,最后才是C、D。需要排查的次数是四种原因信息量的期望,为:

    aa43c545403fa4c73ee4fa3d164e17f8.png

    小于2。

    等概率情况信息量的期望为:

    6dc258da890e49c84fef83a05e2845fd.png

    等于单个选项的信息量。

    所以,有些情况,仅有信息量是不够的。还需要知道信息量的期望,这就是信息熵。

    信息熵:平均信息量,信息量的期望。

    五、什么是相对熵?

    如何衡量两个随机变量概率分布的相似程度?

    我们已经有了信息熵的概念,就是信息量的期望,也叫平均信息量。那能不能简单的就用信息熵来衡量呢?

    显然不能。

    比如,两个随机变量x和y的概率分布如下:

    bbdbb9c1df78bd1b7757bf69c96c2529.png

    二者的信息熵:

    33a80ba945dba8ec8489587947f7dd42.png

    是相等的,

    185070c6b82b1d1f4614388309a574ef.png

    但概率分布明显差异很大。所以,简单的用信息熵来衡量概率分布的相似程度是行不通的。

    但是不是意味着信息熵就不能用了呢?

    不是,只不过要变一变。

    选用一个固定的概率分布来求信息熵:

    450a51986f7f81e07de2e1dc74049756.png

    或者

    0c2788d2304b807856fea3f434658ec6.png

    于是,便有:

    7a96582153abe7083008370c86f30378.png

    或者:

    471b5da001bc466be4a9c55075ac300c.png

    这样用来衡量概率分布的差异就没问题了。而:

    1a6a45e3c020fd9420b0d11120177c2f.png

    就称为p对q的相对熵。

    总结起来:

    相对熵就是:描述两个概率分布P和Q差异的一种方法。

    六、损失函数与交叉熵

    机器学习中,实际分布为p,预测分布为q。训练的过程就是调整参数使q不断逼近p的过程。调整的依据就是q与p的差。

    如何衡量这个差呢?

    就可以用相对熵:

    0a896524e2ab8fa03f9f308b968945c8.png

    但由于实际分布的熵:

    620378d4bcceb68dd491d4fdd8dafdbd.png

    固定不变。

    所以可以省略简化,只优化:

    6d0c65135889acbdf075a212a835d951.png

    部分就可以了。

    ​H(p||q)又被称为交叉熵。交叉熵主要度量两个概率分布间的差异性信息。

    (注:本文部分图片来自于网络,如有侵权请联系作者删除。)

    展开全文
  • 我在看paper的时候发现对于交叉熵的理解又有些遗忘,复习了一下之后,又有了一些新的认识。故写下本文和大家分享。熵这个概念应用非常广泛,我个人认为比较经典的一个应用是在热力学当中,反应一个系统的混乱程度。...

    cbbfa867efffd85576c3cb07baa6ecfc.png

    本文始发于个人公众号:TechFlow,原创不易,求个关注

    今天这篇文章和大家聊聊机器学习领域的

    我在看paper的时候发现对于交叉熵的理解又有些遗忘,复习了一下之后,又有了一些新的认识。故写下本文和大家分享。

    熵这个概念应用非常广泛,我个人认为比较经典的一个应用是在热力学当中,反应一个系统的混乱程度。根据热力学第二定律,一个孤立系统的熵不会减少。比如一盒乒乓球,如果把盒子掀翻了,乒乓球散出来,它的熵增加了。如果要将熵减小,那么必须要对这个系统做功,也就是说需要有外力来将散落的乒乓球放回盒子里,否则乒乓球的分布只会越来越散乱。

    开创了信息论的香农大佬灵光一闪,既然自然界微观宏观的问题都有熵,那么信息应该也有。于是他开创性地将熵这个概念引入信息论领域,和热力学的概念类似,信息论当中的熵指的是信息量的混乱程度,也可以理解成信息量的大小。

    信息量

    举个简单的例子,以下两个句子,哪一个句子的信息量更大呢?

    1. 我今天没中彩票
    2. 我今天中彩票了

    从文本上来看,这两句话的字数一致,描述的事件也基本一致,但是显然第二句话的信息量要比第一句大得多,原因也很简单,因为中彩票的概率要比不中彩票低得多。

    相信大家也都明白了,一个信息传递的事件发生的概率越低,它的信息量越大。我们用对数函数来量化一个事件的信息量:

    因为一个事件发生的概率取值范围在0到1之间,所以log(p(X))的范围是负无穷到0,我们加一个负号将它变成正值。画成函数大概是下面这个样子:

    8bccbc74df4ade84f3a06782395a75b2.png

    信息熵

    我们上面的公式定义的是信息量,但是这里有一个问题,我们定义的只是事件X的一种结果的信息量。对于一个事件来说,它可能的结果可能不止一种。我们希望定义整个事件的信息量,其实也很好办,我们算下整个事件信息量的期望即可,这个期望就是信息熵。

    期望的公式我们应该都还记得:

    我们套入信息量的公式可以得到信息熵H(x):

    相对熵(KL散度)

    在我们介绍相对熵之前,我们先试着思考一个问题,我们为什么需要相对熵这么一个概念呢?

    原因很简单,因为我们希望测量我们训练出来的模型和实际数据的差别,相对熵的目的就是为了评估和验证模型学习的效果。也就是说相对熵是用来衡量两个概率分布的差值的,我们用这个差值来衡量模型预测结果与真实数据的差距。明白了这点之后,我们来看相对熵的定义:

    如果把

    看成是一个事件的所有结果,那
    可以理解成一个事件的一个结果。那么所有的
    就可以看成是两个关于事件X的概率分布。
    样本真实的分布,我们可以求到。而
    是我们模型产出的分布。KL散度越小,表示这两个分布越接近,说明模型的效果越好。

    光看上面的KL散度公式可能会云里雾里,不明白为什么能反应P和Q两个分布的相似度。因为这个公式少了两个限制条件:

    对于单个

    来说,当然
    越大
    越小。但由于所有的
    的和是1,当前的i取的值大了,其他的i取的值就要小。

    我们先来直观地感受一下,再来证明。

    我们假设

    只有0和1两个取值,也就是一个事件只有发生或者不发生。我们再假设
    ,我们画一下
    的图像:

    b1a36f7dcd5101c3f866058821eec306.png

    和我们预料的一样,函数随着

    的递增而递减。但是这只是一个x的取值,别忘了,我们相对熵计算的是整个分布,那我们加上另一个x的取值会发生什么呢?

    550a8da700b72466bc9edd3c44cf789a.png

    从函数图像上,我们很容易看出,当Q(x)=0.5的时候,KL散度取最小值,最小值为0。我们对上面的公式做一个变形:

    这个式子左边

    其实就是
    ,对于一个确定的事件X来说,它的信息熵是确定的,也就是说
    是一个常数,
    也是常数。log函数是一个凹函数,-log是凸函数。我们把
    当成常数的话,可以看出
    是一个凸函数。

    凸函数有一个jensen不等式:

    ,也即:变量期望的函数值大于变量函数值的期望,有点绕口令,看不明白没关系,可以通过下图直观感受:

    c7fb1025787a2b48357ff99e690e190b.png

    我们利用这个不等式试着证明:

    首先,我们对原式进行变形:

    然后我们利用不等式:

    所以KL散度是一个非负值,但是为什么当P和Q相等时,能取到最小值呢?我们单独拿出右边

    ,我们令

    我们探索

    的正负性来判断P和Q的关系。

    因为log(x)是凸函数,所以我们利用jensen不等式,可以得到:

    我们带入

    所以

    , 即
    ,当且仅当 P=Q时等号成立。

    交叉熵

    通过上面一系列证明,我们可以确定,KL散度可以反映两个概率分布的距离情况。由于P是样本已知的分布,所以我们可以用KL散度反映Q这个模型产出的结果与P的距离。距离越近,往往说明模型的拟合效果越好,能力越强。

    我们把上面定义的C(P, Q)带入KL散度的定义,会发现:

    对于一个确定的样本集来说,

    是定值,所以我们可以抛开左边
    不用管它,单纯来看右边。右边我们刚刚定义的C(P, Q)其实就是交叉熵。

    说白了,交叉熵就是KL散度去除掉了一个固定的定值的结果。KL散度能够反映P和Q分布的相似程度,同样交叉熵也可以,而且交叉熵的计算相比KL散度来说要更为精简一些。

    如果我们只考虑二分类的场景,那么

    由于

    结果已知,并且:
    。我们令

    所以上式可以变形为:

    这个式子就是我们在机器学习书上最常见到的二分类问题的交叉熵的公式在信息论上的解释,我们经常使用,但是很少会有资料会将整个来龙去脉完整的推导一遍。对于我们算法学习者而言,我个人觉得只有将其中的细节深挖一遍,才能真正获得提升,才能做到知其然,并且知其所以然。理解了这些,我们在面试的时候才能真正做到游刃有余。

    当然,到这里其实还没有结束。仍然存在一个问题,可以反映模型与真实分布距离的公式很多,为什么我们训练模型的时候单单选择了交叉熵呢,其他的公式不行吗?为什么呢?

    分析

    我们来实际看个例子就明白了,假设我们对模型:

    选择MSE(均方差)作为损失函数。假设对于某个样本x=2,y=0,
    那么
    ,此时

    此时

    我们对它求关于

    的偏导:

    所以如果我们通过梯度下降来学习的话,

    这个式子看起来很正常,但是隐藏了一个问题,就是我们这样计算出来的梯度实在是太小了。通过梯度下降去训练模型需要消耗大量的时间才能收敛。

    如果我们将损失函数换成交叉熵呢?

    我们回顾一下交叉熵求梯度之后的公式:

    我们带入上面具体的值,可以算出来如果使用交叉上来训练,我们算出来的梯度为1.96,要比上面算出来的0.04大了太多了。显然这样训练模型的收敛速度会快很多,这也是为什么我们训练分类模型采用交叉熵作为损失函数的原因。

    究其原因是因为如果我们使用MSE来训练模型的话,在求梯度的过程当中免不了对sigmoid函数求导。而正是因为sigmoid的导数值非常小,才导致了我们梯度下降的速度如此缓慢。那么为什么sigmoid函数的导数这么小呢?我们来看下它的图像就知道了:

    3a88e0a6e899f0c20bbf9226c80edce7.png

    观察一下上面这个图像,可以发现当x的绝对值大于4的时候,也就是图像当中距离原点距离大于4的两侧,函数图像就变得非常平缓。而导数反应函数图像的切线的斜率,显然这些区域的斜率都非常小,而一开始参数稍微设置不合理,很容易落到这些区间里。那么通过梯度下降来迭代自然就会变得非常缓慢。

    所以无论是机器学习还是深度学习,我们一般都会少会对sigmoid函数进行梯度下降。在之前逻辑回归的文章当中,我们通过极大似然推导出了交叉熵的公式,今天我们则是利用了信息论的知识推导了交叉熵的来龙去脉。两种思路的出发点和思路不同,但是得到的结果却是同样的。关于这点数学之美当中给出了解释,因为信息论是更高维度的理论,它反映的其实是信息领域最本质的法则。就好像物理学当中公式千千万,都必须要遵守能量守恒、物质守恒一样。机器学习也好,深度学习也罢,无非是信息领域的种种应用,自然也逃不脱信息论的框架。不知道看到这里,你有没有一点豁然开朗和一点震撼的感觉呢?

    今天的文章就到这里,公式比较多,但推导过程并不难,希望大家不要被吓住,能冷静看懂。如果觉得有所收获,请顺手扫码点个关注吧,你们的支持是我最大的动力。

    43ebfcc10186f146dc37a366b9d11eb9.png
    展开全文
  • 信息熵: 表示随机变量不确定的度量,是对所有可能发生的事件产生的信息...交叉熵(cross entropy): 将KL散度公式进行变形得到: 前半部分就是p(x)的熵,后半部分就是交叉熵: 机器学习中,我们常常使用KL散度来评估pr
  • 交叉熵损失函数原理详解

    万次阅读 多人点赞 2019-08-30 10:28:42
    交叉熵损失函数原理详解 之前在代码中经常看见交叉熵损失函数(CrossEntropy Loss),只知道它是分类问题中经常使用的一种损失函数,对于其内部的原理总是模模糊糊,而且一般使用交叉熵作为损失函数时,在模型的输出层...
  • 输出标签表示为{0,1}时,损失函数表达式为: $L = -[y log \hat{y} + (1-y)log(1- \hat{y})]$ 二分类 二分类问题,假设 y∈{0,1} 正例:$P(y = 1| x) = \hat{y}$ 公式1 反例:$P(y=0|x) = 1-\hat{y}$ 公式2 联立 将...
  • 本篇文章会更细地讲一下tensorflow中交叉熵损失函数的应用,以及在优化过程中可能用到加权交叉熵损失函数的使用方式。 一、基础计算 当存在多个类别时,通常使用交叉熵损失函数来衡量模型的效果,也是对模型调参的...
  • 交叉熵损失函数

    千次阅读 2021-01-07 15:19:35
    1.1交叉熵损失函数公式: 1.2交叉熵损失函数推导过程: 1.3 交叉熵损失函数的特殊值 1交叉熵损失函数(Cross Entropy loss): 1.1交叉熵损失函数公式: y是真实的标签值(正类值为1,负类值为0),y`是预测...
  • softmax函数与交叉熵损失函数

    千次阅读 2020-12-06 05:15:56
    交叉熵损失函数 softmax
  • Softmax 与交叉熵损失函数的反向传播公式推导 一、正向传播 用一个 X 举例,假设 S 为最后一层全连接层的输出,S 是一个长度为 c 的行向量,其中元素的含义为 c 个类分别的得分,即 s1s_1s1​ 为 X 在第一个类的得分...
  • 交叉熵损失函数整理

    千次阅读 2020-07-26 18:44:02
    交叉熵函数直观理解三.交叉熵函数求导3.1Sigmoid + Cross-entropy3.2SoftMax + Cross-entropy四.交叉熵与SoftMax函数 一.交叉熵函数的由来(推导) 我们一共有m组已知样本, (x(i),y(i))(x^{(i)},y^{(i)})(x(i),y(i))...
  • 二元交叉熵损失函数

    千次阅读 2021-11-15 11:08:01
    公式 L(w) = -∑i=0N\sum_{i=0}^N∑i=0N​[yilogσ\sigmaσ(xi) + (1 - yi)log(1 - σ\sigmaσ(xi))] 其中,σ\sigmaσ(x)是sigmoid函数,即: σ\sigmaσ(x) = 11+e−z\frac{1}{1 + e^{-z}}1+e−z1​ 解释 可视化的...
  • Softmax 和交叉熵损失函数

    千次阅读 2021-08-10 09:37:35
    目录Softmax 函数交叉熵损失函数学习率衰减策略 Softmax 函数 Softmax 函数函数是机器学习和深度学习中相当常用到的函数,它的公式如下: softmax(S)=esk∑jesj softmax(S)=\frac { e ^ { s _ { k } } } { \sum _ { j...
  • 前面小编给大家简单介绍过损失函数,今天给大家继续分享交叉熵损失函数,直接来看干货吧。一、交叉熵损失函数概念交叉熵损失函数CrossEntropy Loss,是分类问题中经常使用的一种损失函数。公式为:接下来了解一下...
  • 史上最全交叉熵损失函数详解

    千次阅读 多人点赞 2022-01-02 09:57:10
    在我们自学神经网络神经网络的损失函数的时候会发现有一个思路就是交叉熵损失函数,交叉熵的概念源于信息论,一般用来求目标与预测值之间的差距。比如说我们在人脑中有一个模型,在神经网络中还有一个模型,我们需要...
  • 解决多分类问题有几种思路。有将多分类问题拆分成一...我们自然地从多类别逻辑回归公式中推导出交叉熵损失函数,理解交叉熵损失函数的由来。一、多类别逻辑回归( Multinomial logistic regression )我们之间讲解了...
  • -交叉熵损失函数:评估label和predicts之间的差距(熵越小即两者越接近) 计算公式: q——表示预测样本分布 p——表示真实样本分布 在具体分类中: y——表示样本的label,正类为1,负类为0 p——表示样本预测...
  • 交叉熵损失函数详解

    万次阅读 多人点赞 2019-06-12 15:14:45
    模型的最后通常会经过一个 Sigmoid 函数,输出一个概率值,这个概率值反映了预测为正类的可能性:概率越大,可能性越大。 Sigmoid 函数的表达式和图形如下所示: 其中 s 是模型上一层的输出...
  • 多分类问题的交叉熵损失函数推导与二分类交叉熵损失函数推导的思想是一致的。可以先参考 二分类问题的交叉熵损失函数推导可参考二分类问题的交叉熵损失函数推导。 本文参考deeplearning 一书 6.2.2.3 Softmax Units...
  • 损失函数——交叉熵损失函数(CrossEntropy Loss)

    万次阅读 多人点赞 2020-12-16 20:51:02
    损失函数——交叉熵损失函数(CrossEntropy Loss) 交叉熵函数为在处理分类问题中常用的一种损失函数,其具体公式为: 1.交叉熵损失函数由来 交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的...
  • 理解交叉熵关于样本集的两个概率分布p和q,设p为真实的分布,比如[1, 0, 0]表示当前样本属于第一类,q为拟合的分布,比如[0.7, 0.2, 0.1]。按照真实分布p来衡量识别一个样本所需的编码长度的期望,即平均编码长度...
  • 来写一个softmax求导的推导过程,不仅可以给自己理清思路,还可以造福大众,岂不美哉~softmax经常...softmax 函数softmax(柔性最大值)函数,一般在神经网络中, softmax可以作为分类任务的输出层。其实可以认为softm...
  • 交叉熵损失函数「Cross Entropy Loss」公式: 我们已经对这个交叉熵函数非常熟悉,大多数情况下都是直接拿来使用就好。但是它是怎么来的?为什么它能表征真实样本标签和预测概率之间的差值?上面的交叉熵函数是否有...
  • 平方损失函数与交叉熵损失函数

    万次阅读 2018-05-07 15:21:43
    对于机器学习中常见的损失函数有:平方损失函数与交叉熵损失函数。在本文中将讲述两者含义与响应的运用区别。 2. 平方损失函数 平方损失函数较为容易理解,它直接测量机器学习模型的输出与实际结果之间的距离。...
  • 大话交叉熵损失函数

    2020-12-08 05:33:23
    使用keras进行二分类时,常使用binary_crossentropy作为损失函数。那么它的原理是什么,跟categorical_crossentropy、sparse_categorical_crossentropy有什么区别?在进行文本分类时,如何选择损失函数,有哪些优化...
  • 来源丨AI有道编辑丨极市平台说起交叉熵损失函数「Cross Entropy Loss」,脑海中立马浮现出它的公式:我们已经对这个交叉熵函数非常熟悉,大多数情况下都是直接拿来使用就好。但是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,779
精华内容 6,711
关键字:

交叉熵损失函数公式