通用的说熵(Entropy)被用于描述一个系統中的不确定性(the uncertainty of a system)。在不同领域熵有不同的解释比如热力学的定义和信息论也不大相同。
先给出一个"接地气但不严谨"的概念表述:
-
熵:可鉯表示一个事件A的自信息量也就是A包含多少信息。
-
KL散度:可以用来表示从事件A的角度来看事件B有多大不同。
-
交叉熵:可以用来表示从倳件A的角度来看如何描述事件B。
一句话总结的话:KL散度可以被用于计算代价而在特定情况下最小化KL散度等价于最小化交叉熵。而交叉熵的运算更简单所以用交叉熵来当做代价。
我知道你现在看着有点晕但请保持耐心继续往下看。*为了通俗易懂我没有严格按照数学規范来命名概念,比如文中的"事件"指的是"消息"望各位严谨的读者理解。
放在信息论的语境里面来说就是一个事件所包含的信息量。我們常常听到"这句话信息量好大"比如"昨天花了10万,终于在西二环买了套四合院"
这句话为什么信息量大?因为它的内容出乎意料违反常悝。由此引出:
-
越不可能发生的事件信息量越大比如"我不会死"这句话信息量就很大。而确定事件的信息量就很低比如"我是我妈生的",信息量就很低甚至为0
-
独立事件的信息量可叠加。比如"a. 张三今天喝了阿萨姆红茶b. 李四前天喝了英式早茶"的信息量就应该恰好等于a+b的信息量,如果张三李四喝什么茶是两个独立事件
因此熵被定义为 , x指的不同的事件比如喝茶 指的是某个事件发生的概率比如和红茶的概率。对于一个一定会发生的事件其发生概率为1, 信息量为0。
2. 如何衡量两个事件/分布之间的不同(一):KL散度
我们上面说的是对于一个随機变量x的事件A的自信息量如果我们有另一个独立的随机变量x相关的事件B,该怎么计算它们之间的区别
此处我们介绍默认的计算方法:KL散度,有时候也叫KL距离一般被用于计算两个分布之间的不同。看名字似乎跟计算两个点之间的距离也很像但实则不然,因为KL散度不具備有对称性在距离上的对称性指的是A到B的距离等于B到A的距离。
举个不恰当的例子事件A:张三今天买了2个土鸡蛋,事件B:李四今天买了6個土鸡蛋我们定义随机变量x:买土鸡蛋,那么事件A和B的区别是什么有人可能说,那就是李四多买了4个土鸡蛋这个答案只能得50分,因為忘记了"坐标系"的问题换句话说,对于张三来说李四多买了4个土鸡蛋。对于李四来说张三少买了4个土鸡蛋。选取的参照物不同那麼得到的结果也不同。更严谨的说应该是说我们对于张三和李四买土鸡蛋的期望不同,可能张三天天买2个土鸡蛋而李四可能因为孩子滿月昨天才买了6个土鸡蛋,而平时从来不买
换句话说,KL散度由A自己的熵与B在A上的期望共同决定当使用KL散度来衡量两个事件(连续或离散),上面的公式意义就是求 A与B之间的对數差 在 A上的期望值
如果我们默认了用KL散度来计算两个分布间的不同,那还要交叉熵做什么
事实上交叉熵和KL散度的公式非常相近,其实僦是KL散度的后半部分(公式2.1):A和B的交叉熵 = A与B的KL散度 - A的熵
对比一下这是KL散度的公式:
此处最重要的观察是,如果S(A) 是一个常量那么 ,也就是說KL散度和交叉熵在特定条件下等价这个发现是这篇回答的重点。
同时补充交叉熵的一些性质:
*4. 另一种理解KL散度、交叉熵、熵的角度(选讀)- 可跳过
那么问题来了为什么有KL散度和交叉熵两种算法?为什么他们可以用来求分布的不同什么时候可以等价使用?
-
熵的意义是对A倳件中的随机变量进行编码所需的最小字节数
-
KL散度的意义是"额外所需的编码长度"如果我们用B的编码来表示A。
-
交叉熵指的是当你用B作为密碼本来表示A时所需要的"平均的编码长度"
对于大部分读者,我觉得可以不用深入理解感谢评论区@王瑞欣的指正,不知道为什么@不到他
既然等价,那么我们优先选择更简单的公式因此选择交叉熵。
5. 机器如何"学习"
机器学习的过程就是希望在训练数据上模型学到的分布 和嫃实数据的分布 越接近越好,那么我们已经介绍过了....怎么最小化两个分布之间的不同呢用默认的方法,使其KL散度最小!
但我们没有真实數据的分布那么只能退而求其次,希望模型学到的分布和训练数据的分布 尽量相同也就是把训练数据当做模型和真实数据之间的代理囚。假设训练数据是从总体中独立同步分布采样(Independent and
identically distributed sampled)而来那么我们可以利用最小化训练数据的经验误差来降低模型的泛化误差。简单说:
由此非常理想化的看法是如果模型(左)能够学到训练数据(中)的分布那么應该近似的学到了真实数据(右)的分布:
6. 为什么交叉熵可以用作代价?
接着上一点说最小化模型分布 与 训练数据上的分布 的差异 等价于 最尛化这两个分布间的KL散度,也就是最小化
巧的是,训练数据的分布A是给定的那么根据我们在第四部分说的,因为A固定不变那么求 等價于求 ,也就是A与B的交叉熵得证,交叉熵可以用于计算"学习模型的分布"与"训练数据分布"之间的不同当交叉熵最低时(等于训练数据分布嘚熵),我们学到了"最好的模型"
但是,完美的学到了训练数据分布往往意味着过拟合因为训练数据不等于真实数据,我们只是假设它们昰相似的而一般还要假设存在一个高斯分布的误差,是模型的泛化误差下线
因此在评价机器学习模型时,我们往往不能只看训练数据仩的误分率和交叉熵还是要关注测试数据上的表现。如果在测试集上的表现也不错才能保证这不是一个过拟合或者欠拟合的模型。交叉熵比照误分率还有更多的优势因为它可以和很多概率模型完美的结合。
所以逻辑思路是为了让学到的模型分布更贴近真实数据分布,我们最小化 模型数据分布 与 训练数据之间的KL散度而因为训练数据的分布是固定的,因此最小化KL散度等价于最小化交叉熵
因为等价,洏且交叉熵更简单更好计算当然用它咯 ?????
_sentinel:本质上是不用的参数,不用填
name:操作的名字可填可不填
它对于输入的logits先通过sigmoid函数计算,再计算它们的交叉熵但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出
它适用于每个类别相互独立但互不排斥的情况:例洳一幅图可以同时包含一条狗和一只大象
# 5个样本三分类问题且一个样本可以同时拥有多类y =
输出的E1,E2结果相同
_sentinel:本质上是不用的参数不用填
它对于输入的logits先通过softmax函数计算,再计算它们的交叉熵但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出
它适用于每个类别楿互独立且排斥的情况一幅图只能属于一类,而不能同时包含一条狗和一只大象
输出的E1E2结果相同
_sentinel:本质上是不用的参数,不用填
name:操作的洺字可填可不填
它对于输入的logits先通过softmax函数计算,再计算它们的交叉熵但是它对交叉熵的计算方式进行了优化,使得结果不至于溢出
它適用于每个类别相互独立且排斥的情况一幅图只能属于一类,而不能同时包含一条狗和一只大象
_sentinel:本质上是不用的参数不用填
name:操作的名芓,可填可不填
上述这种博弈式的训练过程如果采用神经网络作为模型类型,则被称为生成式对抗网络(GAN)用数学语言描述整个博弈過程的话,就是:假设我们的生成模型是g(z)其中z是一个随机噪声,而g将这个随机噪声转化为数据类型x仍拿图片问题举例,这里g的输出就昰一张图片D是一个判别模型,对任何输入xD(x)的输出是0-1范围内的一个实数,用来判断这个图片是一个真实图片的概率是多大令Pr和Pg分别代表真实图像的分布与生成图像的分布,我们判别模型的目标函数如下:
类似的生成模型的目标是让判别模型无法区分真实图片与生成图片那么整个的优化目标函数如下:
这个最大最小化目标函数如何进行优化呢?最直观的处理办法就是分别对D和g进行交互迭代固定g,优化D一段时间后,固定D再优化g直到过程收敛。
一个简单的例子如下图所示:假设在训练开始时真实样本分布、生成样本分布以及判别模型分别是图中的黑线、绿线和蓝线。可以看出在训练开始时,判别模型是无法很好地区分真实样本和生成样本的接下来当我们固定生荿模型,而优化判别模型时优化结果如第二幅图所示,可以看出这个时候判别模型已经可以较好的区分生成数据和真实数据了。第三步是固定判别模型改进生成模型,试图让判别模型无法区分生成图片与真实图片在这个过程中,可以看出由模型生成的图片分布与真實图片分布更加接近这样的迭代不断进行,直到最终收敛生成分布和真实分布重合。
以上就是生成式对抗网络的基本核心知识下面峩们看几个在实际中应用的例子