信息量、熵和交叉熵

2023-10-15 03:58
文章标签 交叉 信息量

本文主要是介绍信息量、熵和交叉熵,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

信息量、熵和交叉熵

  • 信息量:
  • 交叉熵
  • 交叉熵和均方误差的区别
  • tf.nn.softmax_cross_entropy_with_logits实现交叉熵和损失的计算

总结

  1. 信息量利用概率倒数的对数对事件的稀缺性进行衡量
  2. 熵是一个随机系统信息量的期望
  3. 交叉熵用于衡量两个概率分布之间的差异

信息量:

信息量是对事件发生概率的度量,一个事件发生的概率越低,则这个事件包含的信息量越大,这跟我们直观上的认知也是吻合的,越稀奇新闻包含的信息量越大,因为这种新闻出现的概率低。香农提出了一个定量衡量信息量的公式:
香农信息量公式

熵是一种对不确定性的方法,对于存在不确定性的系统,熵越大表示该系统的不确定性越大,熵为0表示没有任何不确定性。熵的定义如下:

存在不确定性系统的熵的定义

从这个公式可以看出,熵其实就是随机系统各个事件的香农信息量的期望,或者叫均值。如果这个随机系统只包含两种可能,如抛硬币的结果,正面概率为p,反面结果为1-p,那么这个系统的熵就是:

抛硬币系统熵的计算

当随机系统中各个事件概率相等的时候,系统的熵最大,也就是不确定性最大,而随着某个事件的概率逐渐增大,对立事件概率越来越小,这种情况下系统的不确定性越来越小,最终趋向于0,也就是成为一个没有随机因素的系统。这个结论可以通过对熵计算极值的方法求证,对上面熵的公式进行求导,使其导数为0:
熵公式对概率p求导

可以看出,当p=1/2的时候熵取最大值,也就是系统不确定性最大。
上面给出的计算是基于抛硬币系统进行的,这个系统只有正面或反面两种事件,推广到包含多个事件的随机系统结论也是成立的。也就是说,对于包含N个事件的随机系统,在没有任何先验知识的前提下,当这N个事件等概率的时候,系统熵最大,最混乱。

在统计学习方法中,有个最大熵模型,最大熵模型认为使得一个随机系统的熵最大(最混乱)的模型是最好的模型,这是最大熵模型的大前提。主观上理解,在没有任何先验知识的情况下,假设各个事件是等概率的,这是合理的。在这个前提或者叫准则下,最大熵模型的任务就是使得随机系统在满足约束条件的前提下,达到最大的熵。
最大熵模型的计算分三种情况:

  • 不存在任何约束
    这种情况下只有一个隐形的等式约束,就是各个事件概率之和为1。直接令熵的导数=0求解即可,结论上面已经给出,当N个事件等概率的时候熵最大,可以通过拉格朗日乘子法进行证明

  • 只存在等式约束
    这时同样需要使用拉格朗日函乘子将约束条件加入到目标函数中进行求解。

    下面给出一个使用拉格朗日乘子求解带等式约束的最大化问题:
    拉格朗日乘子法求解最优解

  • 存在不等式约束
    存在不等式约束的最优化问题求解同样使用拉格朗日算子进行计算,使目标函数满足KKT条件,进行求解,此处不再推导。

交叉熵

交叉熵用来衡量预测概率分布和真实概率分布之间差异的度量,计算公式如下,其中Pi是真实分布,Qi是预测分布:
交叉熵计算公式

预测分布越接近真实的分布,交叉熵越小,当预测分布等于真实分布时,交叉熵最小,此时交叉熵的值等同于熵。所以,交叉熵提供了一种衡量两个分布之间差异大小的方式,常用来作为神经网络的损失函数。当神经网络的预测分布跟真实分布(人工标注结果)相差很大时,交叉熵就大;当神经网络随着训练的进行预测分布越来越接近真实分布时,交叉熵就逐渐减小。

交叉熵和均方误差的区别

交叉熵和均方误差都可以作为神经网络的损失函数,他们的区别在于:

  1. 交叉熵适用于分类问题,结果是离散的类别(如图片分类),而均方误差适用于回归问题,结果是一个连续的数值(如雨量预测)【实际上均方误差也可以用于分类问题】
  2. 在使用sigmod激活函数时,如果使用均方误差作为损失函数,反向传播的导数(直接影响学习速度)会包含sigmod函数的梯度,这个梯度随着变量的增大会趋向于0,导致学习速度迅速降低;而如果使用交叉熵作为损失函数,就不存在这个问题,反向传播的导数包含sigmod函数,而不包含sigmod函数的导数。
    sigmoid激活函数

tf.nn.softmax_cross_entropy_with_logits实现交叉熵和损失的计算

import tensorflow as tflogits = tf.constant([[1.0, 2.0, 3.0], [1.0, 2.0, 3.0], [1.0, 2.0, 3.0]])
y_ = tf.constant([[0.0, 0.0, 1.0], [0.0, 0.0, 1.0], [0.0, 0.0, 1.0]])# softmax_cross_entropy_with_logits计算后,矩阵的每一行数据计算出一个交叉熵,三行数据共计算出三个交叉熵
cross_entropy_lst = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_)
# 通过reduce_sum进行累加,计算出一个batch的交叉熵
cross_entropy = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_))
# 将batch里每条记录的交叉熵求均值,作为损失
cross_entropy_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_))# 手动分解上面的计算,过程如下
logits_softmax = tf.nn.softmax(logits)
cross_entropy_2 = -tf.reduce_sum(y_ * tf.log(logits_softmax))  # batch所有数据求和
cross_entropy_lst_2 = -tf.reduce_sum(y_ * tf.log(logits_softmax), 1)  # batch每行数据求和
cross_entropy_2_loss = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(logits_softmax), 1))  # batch每行数据求和后,再求均值with tf.Session() as sess:print sess.run(cross_entropy_lst)print sess.run(cross_entropy)print sess.run(cross_entropy_loss)print sess.run(cross_entropy_lst_2)print sess.run(cross_entropy_2)print sess.run(cross_entropy_2_loss)

输出:

[ 0.40760595  0.40760595  0.40760595]
1.22282
0.407606
[ 0.40760601  0.40760601  0.40760598]
1.22282
0.407606

这篇关于信息量、熵和交叉熵的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/215185

相关文章

交叉编译python

1.解决python源码,进入源码目录 2.先编译本地版本的python。直接使用命令 ./configure --prefix=/home/KAS-300/python3.8 --enable-optimizationsmake -j8make install 3.把生成的python可执行文件临时加入PATH export PATH=/home/KAS-300/python3.8/

逐行讲解Transformer的代码实现和原理讲解:计算交叉熵损失

LLM模型:Transformer代码实现和原理讲解:前馈神经网络_哔哩哔哩_bilibili 1 计算交叉熵目的 计算 loss = F.cross_entropy(input=linear_predictions_reshaped, target=targets_reshaped) 的目的是为了评估模型预测结果与实际标签之间的差距,并提供一个量化指标,用于指导模型的训练过程。具体来说,交叉

【深度学习 误差计算】10分钟了解下均方差和交叉熵损失函数

常见的误差计算函数有均方差、交叉熵、KL 散度、Hinge Loss 函数等,其中均方差函数和交叉熵函数在深度学习中比较常见,均方差主要用于回归问题,交叉熵主要用于分类问题。下面我们来深刻理解下这两个概念。 1、均方差MSE。 预测值与真实值之差的平方和,再除以样本量。 均方差广泛应用在回归问题中,在分类问题中也可以应用均方差误差。 2、交叉熵 再介绍交叉熵损失函数之前,我们首先来介绍信息

libmad音频解码库-Linux交叉编译移植

下载并解压libmad-0.15.1b.tar.gz 下载链接:https://downloads.sourceforge.net/mad/libmad-0.15.1b.tar.gz $tar -xvf libmad-0.15.1b.tar.gz$cd libmad-0.15.1b 1、先执行下面的命令:这条命令是为了适配高版本的gcc,因为高版本的gcc已经将-fforce-mem去除了:

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证

回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证 目录 回归预测 | Matlab基于贝叶斯算法优化XGBoost(BO-XGBoost/Bayes-XGBoost)的数据回归预测+交叉验证效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现基于贝叶斯算法优化X

hi 平台 opencv4.8 交叉编译

echo "参数是 'arm_hi'"         current_path=$(pwd)         nproc=32         # arm-linux-gnueabihf-gcc, Cross-Toolchain PATH         export PATH="/opt/aarch64-v01c01-linux-musl-gcc/bin:$PATH"

神经网络多分类任务的损失函数——交叉熵

神经网络多分类任务的损失函数——交叉熵 神经网络解决多分类问题最常用的方法是设置n个输出节点,其中n为类别的个数。对于每一个样例,神经网络可以得到的一个n维数组作为输出结果。数组中的每一个维度(也就是每一个输出节点)对应一个类别。在理想情况下,如果一个样本属于类别k,那么这个类别所对应的输出节点的输出值应该为1,而其他节点的输出都为0。 以识别手写数字为例,0~9共十个类别。识别数字1,神经网

本地电脑交叉编译ffmpeg 到 windows on arm64

本地电脑交叉编译ffmpeg 到 windows on arm64 我这里有编译好的win on arm 的 ffmpeg : https://github.com/wmx-github/ffmpeg-wos-arm64-build 使用 llvm-mingw 工具链 https://github.com/mstorsjo/llvm-mingw/releases 前缀 aarch64-w64-

交叉编译概念

交叉编译概念 目录 交叉编译概念1. 什么是交叉编译2. 交叉编译的作用3. 交叉编译器4. 交叉编译工具链5. 交叉编译的一般步骤6. 交叉编译实例 1. 什么是交叉编译 交叉编译是指在一个平台上编译代码,使其能够在另一个不同的平台上运行的过程。这种编译方式通常用于开发嵌入式系统、移动设备和其他受限环境中的应用程序。 交叉编译是使用一种编译器(称为交叉编译器),该编译器在

设置交叉编译工具链的环境变量

1 环境变量的意义 环境变量相当于操作系统的全局变量。每一个环境变量对操作系统来说都是唯一的,名字和所代表的意义都是唯一的。Linux系统可以有很多个环境变量。其中有一部分是Linux系统自带的,还有一些是我们自己来扩充的。这里需要使用的环境变量是PATH。PATH是系统自带的,含义是系统在查找可执行程序时会搜索的路径范围。 使用echo $PATH命令查看当前PATH环境变量,如下图: 2