3.线性神经网络----动手学深度学习 + 交叉熵+KL

线性回归的从0开始实现

随机梯度下降

小批量随机梯度下降
在每次迭代中,我们首先随机抽样一个小批量 B \mathcal{B} B, 它是由固定数量的训练样本组成的。 然后,我们计算小批量的平均损失关于模型参数的导数(也可以称为梯度)。 最后,我们将梯度乘以一个预先确定的正数 η \eta η,并从当前参数的值中减掉。
在这里插入图片描述
批量大小和学习率的值通常是手动预先指定,而不是通过模型训练得到的。 这些可以调整但不在训练过程中更新的参数称为超参数(hyperparameter).
调参(hyperparameter tuning)是选择超参数的过程。 超参数通常是我们根据训练迭代结果来调整的, 而训练迭代结果是在独立的验证数据集(validation dataset)上评估得到的。
用未包含在训练数据中的数据来测试模型的时候叫预测or推理

高斯分布

在这里插入图片描述

import math
import time 
import numpy as np 
import torch
from d2l import torch as d2l
def normal(x, mu, sigma):
    p = 1/math.sqrt(2 * math.pi * sigma**2)
    return p * np.exp(-0.5 / sigma**2 * (x - mu)**2)
# 再次使用numpy进行可视化
x = np.arange(-7, 7, 0.01)

# 均值和标准差对
params = [(0, 1), (0, 2), (3, 1)]
d2l.plot(x, [normal(x, mu, sigma) for mu, sigma in params], xlabel='x',
         ylabel='p(x)', figsize=(4.5, 2.5),
         legend=[f'mean {mu}, std {sigma}' for mu, sigma in params])

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

以上就是为了说从概率的角度来看最小二乘,当 σ \sigma σ为一个定值时,最小化 ( y − y ˆ ) 2 (y-\^{y})^2 (yyˆ)2就是最小化 − l o g P ( y ∣ X ) -logP(\bf{y}|\bf{X}) logP(yX)

torch.Tensor.detach()

detach():从计算图中脱离出来
参考博客

分类问题中使用的softmax函数

y k = exp ⁡ ( a k ) ∑ i = 1 n exp ⁡ ( a i ) y_{k}=\frac{\exp \left(a_{k}\right)}{\sum_{i=1}^{n} \exp \left(a_{i}\right)} yk=i=1nexp(ai)exp(ak)
softmax的实现如下图所示:

def softmax(a):
	exp_a = np.exp(a
	sum_exp_a = np.sum(exp_a)
	y = exp_a / sum_exp_a
	
	return y 

上式的softmax存在“溢出问题”,softmax函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。 e 1000 e^{1000} e1000的结果会返回一个表示无穷大的inf。如果在这些超大值之间进行除法运算, 结果会出现“不确定”的情况。

softmax函数的改进

y k = exp ⁡ ( a k ) ∑ i = 1 n exp ⁡ ( a i ) = C exp ⁡ ( a k ) C ∑ i = 1 n exp ⁡ ( a i ) = exp ⁡ ( a k + log ⁡ C ) ∑ i = 1 n exp ⁡ ( a i + log ⁡ C ) = exp ⁡ ( a k + C ′ ) ∑ i = 1 n exp ⁡ ( a i + C ′ ) \begin{aligned} y_{k}=\frac{\exp \left(a_{k}\right)}{\sum_{i=1}^{n} \exp \left(a_{i}\right)} &=\frac{\mathrm{C} \exp \left(a_{k}\right)}{\mathrm{C} \sum_{i=1}^{n} \exp \left(a_{i}\right)} \\ &=\frac{\exp \left(a_{k}+\log \mathrm{C}\right)}{\sum_{i=1}^{n} \exp \left(a_{i}+\log \mathrm{C}\right)} \\ &=\frac{\exp \left(a_{k}+\mathrm{C}^{\prime}\right)}{\sum_{i=1}^{n} \exp \left(a_{i}+\mathrm{C}^{\prime}\right)} \end{aligned} yk=i=1nexp(ai)exp(ak)=Ci=1nexp(ai)Cexp(ak)=i=1nexp(ai+logC)exp(ak+logC)=i=1nexp(ai+C)exp(ak+C)
在上式中分子坟墓都乘上C这个常数,计算结果不变化,即说明了,在进行softmax的指数函数的运算时,加上或者减去某个常数并不会改变运算的结果,这里的 C ′ C^{'} C 可以使用任何值,但是为了防止溢出,一般会使用输入信号中的最大值

改进后的softmax函数如下:

def softmax(x):
	c = np.max(x)  #求出向量x中的最大的元素
	exp_a = np.exp(a-c)
	sum_exp_a = np.sum(exp_a)
	y = exp_a / sum_exp_a
	
	return y

可以得知softmax函数的输出是0~1之间的实数,而且softmax函数的输出值的总和是1. 正是因为有了这个性质,我们才可以把softmax函数的输出解释为‘概率’

交叉熵损失函数原理详解

交叉熵简介

交叉熵是信息论中的一个重要概念,主要用于度量两个概率分布间的差异性,要理解交叉熵,需要先了解下面几个概念。

信息量

信息奠基人香农(Shannon)认为“信息是用来消除随机不确定性的东西”,也就是说衡量信息量的大小就是看这个信息消除不确定性的程度。

“太阳从东边升起”,这条信息并没有减少不确定性,因为太阳肯定是从东边升起的,这是一句废话,信息量为0。

”2018年中国队成功进入世界杯“,从直觉上来看,这句话具有很大的信息量。因为中国队进入世界杯的不确定性因素很大,而这句话消除了进入世界杯的不确定性,所以按照定义,这句话的信息量很大。

根据上述可总结如下:信息量的大小与信息发生的概率成反比。概率越大,信息量越小。概率越小,信息量越大。

设某一事件发生的概率为P(x),其信息量表示为:
I ( x ) = − log ⁡ ( P ( x ) ) \mathrm{I}(\mathrm{x})=-\log (\mathrm{P}(\mathrm{x})) I(x)=log(P(x))
其中 I ( x ) \mathrm{I}(\mathrm{x}) I(x)表示信息量,这里 l o g ⁡ log ⁡ log表示以e为底的自然对数。

信息熵

信息熵也被称为熵,用来表示所有信息量的期望
期望是试验中每次可能结果的概率乘以其结果的总和。
所以信息量的熵可表示为:(这里的 X X X是一个离散型随机变量)
H ( X ) = − ∑ i = 1 n P ( x i ) log ⁡ ( P ( x i ) ) ( X = x 1 , x 2 , x 3 … , x n ) \mathrm{H}(\mathbf{X})=-\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{P}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\mathrm{P}\left(\mathrm{x}_{\mathrm{i}}\right)\right)\quad\left(\mathbf{X}=\mathrm{x}_{1}, \mathrm{x}_{2}, \mathrm{x}_{3} \ldots, \mathrm{x}_{\mathrm{n}}\right) H(X)=i=1nP(xi)log(P(xi))(X=x1,x2,x3,xn)

使用明天的天气概率来计算其信息熵:
在这里插入图片描述
H ( X ) = − ( 0.5 ∗ log ⁡ ( 0.5 ) + 0.2 ∗ log ⁡ ( 0.2 ) + 0.3 ∗ log ⁡ ( 0.3 ) ) \mathrm{H}(\mathbf{X})=-(0.5 * \log (0.5)+0.2 * \log (0.2)+0.3 * \log (0.3)) H(X)=(0.5log(0.5)+0.2log(0.2)+0.3log(0.3))

对于0-1分布的问题,由于其结果只用两种情况,是或不是,设某一件事情发生的概率为 P ( x ) \mathrm{P}(\mathrm{x}) P(x),则另一件事情发生的概率为 1 − P ( x ) 1 - \mathrm{P}(\mathrm{x}) 1P(x),所以对于0-1分布的问题,计算熵的公式可以简化如下:

H ( X ) = − ∑ n = 1 n P ( x i log ⁡ ( P ( x i ) ) ) = − [ P ( x ) log ⁡ ( P ( x ) ) + ( 1 − P ( x ) ) log ⁡ ( 1 − P ( x ) ) ] = − P ( x ) log ⁡ ( P ( x ) ) − ( 1 − P ( x ) ) log ⁡ ( 1 − P ( x ) ) \begin{array}{c} \mathrm{H}(\mathbf{X})=-\sum_{\mathrm{n}=1}^{\mathrm{n}} \mathrm{P}\left(\mathrm{x}_{\mathrm{i}} \log \left(\mathrm{P}\left(\mathrm{x}_{\mathrm{i}}\right)\right)\right) \\ =-[\mathrm{P}(\mathrm{x}) \log (\mathrm{P}(\mathrm{x}))+(1-\mathrm{P}(\mathrm{x})) \log (1-\mathrm{P}(\mathrm{x}))] \\ =-\mathrm{P}(\mathrm{x}) \log (\mathrm{P}(\mathrm{x}))-(1-\mathrm{P}(\mathrm{x})) \log (1-\mathrm{P}(\mathrm{x})) \end{array} H(X)=n=1nP(xilog(P(xi)))=[P(x)log(P(x))+(1P(x))log(1P(x))]=P(x)log(P(x))(1P(x))log(1P(x))

相对熵(KL散度)

如果对于同一个随机变量X XX有两个单独的概率分布 P ( x ) \mathrm{P}(\mathrm{x}) P(x) Q ( x ) \mathrm{Q}(\mathrm{x}) Q(x),则我们可以使用KL散度来衡量这两个概率分布之间的差异。
下面先给出公式,再举例加以说明
D K L ( p ∥ q ) = ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) q ( x i ) ) \mathrm{D}_{\mathrm{KL}}(\mathrm{p} \| \mathrm{q})=\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\frac{\mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right)}{\mathrm{q}\left(\mathrm{x}_{\mathrm{i}}\right)}\right) DKL(pq)=i=1np(xi)log(q(xi)p(xi))

使用 \mathrm{…}可以将括号内的字母由数学斜体变为正体,即罗马体

在机器学习中,常常使用 P ( x ) \mathrm{P}(\mathrm{x}) P(x)来表示样本的真实分布, Q ( x ) \mathrm{Q}(\mathrm{x}) Q(x) 来表示模型所预测的分布,比如在一个三分类任务中(例如,有猫,狗,马三类), x 1 , x 2 , x 3 \mathrm{x1, x2,x3} x1,x2,x3分别代表猫,狗,马,例如一张猫的图片真实分布为 P ( x ) = [ 1 , 0 , 0 ] \mathrm{P}(\mathrm{x})=[1, 0, 0] P(x)=[1,0,0], 而预测分布 Q ( x ) \mathrm{Q}(\mathrm{x}) Q(x) = [0.7, 0.2, 0.1], 计算KL散度:
D K L ( p ∥ q ) = ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) q ( x i ) ) = p ( x 1 ) log ⁡ ( p ( x 1 ) q ( x 1 ) ) + p ( x 2 ) log ⁡ ( p ( x 2 ) q ( x 2 ) ) + p ( x 3 ) log ⁡ ( p ( x 3 ) q ( x 3 ) ) = 1 ∗ log ⁡ ( 1 0.7 ) = 0.36 \begin{array}{l} \mathrm{D}_{\mathrm{KL}}(\mathrm{p} \| \mathrm{q})=\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\frac{\mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right)}{\mathrm{q}\left(\mathrm{x}_{\mathrm{i}}\right)}\right)\\ =\mathrm{p}\left(\mathrm{x}_{1}\right) \log \left(\frac{\mathrm{p}\left(\mathrm{x}_{1}\right)}{\mathrm{q}\left(\mathrm{x}_{1}\right)}\right)+\mathrm{p}\left(\mathrm{x}_{2}\right) \log \left(\frac{\mathrm{p}\left(\mathrm{x}_{2}\right)}{\mathrm{q}\left(\mathrm{x}_{2}\right)}\right)+\mathrm{p}\left(\mathrm{x}_{3}\right) \log \left(\frac{\mathrm{p}\left(\mathrm{x}_{3}\right)}{\mathrm{q}\left(\mathrm{x}_{3}\right)}\right)\\ =1 * \log \left(\frac{1}{0.7}\right)=0.36 \end{array} DKL(pq)=i=1np(xi)log(q(xi)p(xi))=p(x1)log(q(x1)p(x1))+p(x2)log(q(x2)p(x2))+p(x3)log(q(x3)p(x3))=1log(0.71)=0.36

KL散度越小,表示 P ( x ) \mathrm{P(x)} P(x) Q ( x ) \mathrm{Q(x)} Q(x)的分布更加接近,可以通过反复训练 Q ( x ) \mathrm{Q(x)} Q(x),来使得 Q ( x ) \mathrm{Q(x)} Q(x)的分布逼近 P ( x ) \mathrm{P(x)} P(x)

交叉熵

首先将KL散度公式拆开:
D K L ( p ∥ q ) = ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) q ( x i ) ) = ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) ) − ∑ i = 1 n p ( x i ) log ⁡ ( q ( x i ) ) = − H ( p ( x ) ) + [ − ∑ i = 1 n p ( x i ) log ⁡ ( q ( x i ) ) ] \begin{array}{l} \mathrm{D}_{\mathrm{KL}}(\mathrm{p} \| \mathrm{q})=\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\frac{\mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right)}{\mathrm{q}\left(\mathrm{x}_{\mathrm{i}}\right)}\right)\\ =\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right)\right)-\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\mathrm{q}\left(\mathrm{x}_{\mathrm{i}}\right)\right)\\ =-\mathrm{H}(\mathrm{p}(\mathrm{x}))+\left[-\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\mathrm{q}\left(\mathrm{x}_{\mathrm{i}}\right)\right)\right] \end{array} DKL(pq)=i=1np(xi)log(q(xi)p(xi))=i=1np(xi)log(p(xi))i=1np(xi)log(q(xi))=H(p(x))+[i=1np(xi)log(q(xi))]

前者 H ( p ( x ) ) \mathrm{H(p(x))} H(p(x))表示信息熵,后者即为交叉熵,即 KL散度= 交叉熵 - 信息熵
交叉熵的公式表示为:
H ( p , q ) = − ∑ i = 1 n p ( x i ) log ⁡ ( q ( x i ) ) \mathrm{H}(\mathrm{p}, \mathrm{q})=-\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\mathrm{q}\left(\mathrm{x}_{\mathrm{i}}\right)\right) H(p,q)=i=1np(xi)log(q(xi))
在机器学习训练网络时,输入数据与标签常常已经确定,那么真实概率分布 P ( x ) \mathrm{P(x)} P(x)也就确定下来了,所以信息熵在这里就是一个常量。由于KL散度的值表示真实概率分布 P ( x ) \mathrm{P(x)} P(x)与预测概率分布 Q ( x ) \mathrm{Q(x)} Q(x)之间的差异,值越小表示预测的结果越好,所以需要最小化KL散度,而交叉熵等于KL散度加上一个常量(信息熵),且公式相比KL散度更加容易计算,所以在机器学习中常常使用交叉熵损失函数来计算loss就行了。

交叉熵在分类问题中的应用

在线性回归问题中,常常使用MSE(Mean Squared Error)作为loss函数,而在分类问题中常常使用交叉熵作为loss函数。
下面通过一个例子来说明如何计算交叉熵损失值。

假设我们输入一张狗的图片,标签与预测值如下:
在这里插入图片描述
那么loss
loss ⁡ = − ( 0 ∗ log ⁡ ( 0.2 ) + 1 ∗ log ⁡ ( 0.7 ) + 0 ∗ log ⁡ ( 0.1 ) ) = 0.36 \operatorname{loss}=-(0 * \log (0.2)+1 * \log (0.7)+0 * \log (0.1))=0.36 loss=(0log(0.2)+1log(0.7)+0log(0.1))=0.36

一个batch的loss为
loss ⁡ = − 1 m ∑ i = 1 m ∑ j = 1 n p ( x i j ) log ⁡ ( q ( x i j ) ) \operatorname{loss}=-\frac{1}{m} \sum_{i=1}^{m} \sum_{j=1}^{n} p\left(x_{i j}\right) \log \left(q\left(x_{i j}\right)\right) loss=m1i=1mj=1np(xij)log(q(xij))
其中m表示样本个数,n表示类别数,这里n=3。

总结:

  • 信息量的大小和信息发生的概率成反比,即有 I ( x ) = − l o g ( P ( x ) ) \mathrm{I(x) = -log(P(x))} I(x)=log(P(x)), I \mathrm{I} I为Information,表示信息量。

  • 信息熵也被称为熵,表示所有信息量的期望。 H ( X ) = − ∑ i = 1 n P ( x i ) log ⁡ ( P ( x i ) ) ) ( X = x 1 , x 2 , x 3 … , x n ) \left.\mathrm{H}(\mathbf{X})=-\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{P}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\mathrm{P}\left(\mathrm{x}_{\mathrm{i}}\right)\right)\right) \quad\left(\mathbf{X}=\mathrm{x}_{1}, \mathrm{x}_{2}, \mathrm{x}_{3} \ldots, \mathrm{x}_{\mathrm{n}}\right) H(X)=i=1nP(xi)log(P(xi)))(X=x1,x2,x3,xn),这里的 X \mathrm{X} X是一个离散型随机变量,信息熵用来代表某个事情的平均情况下的确定程度。

  • 相对熵(KL散度) :用来衡量两个概率分布之间的差异。 D K L ( p ∥ q ) = ∑ i = 1 n p ( x i ) log ⁡ ( p ( x i ) q ( x i ) ) \mathrm{D}_{\mathrm{KL}}(\mathrm{p} \| \mathrm{q})=\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\frac{\mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right)}{\mathrm{q}\left(\mathrm{x}_{\mathrm{i}}\right)}\right) DKL(pq)=i=1np(xi)log(q(xi)p(xi)), 其中用 P ( x ) \mathrm{P(x)} P(x)表示样本的真实分布, Q ( x ) \mathrm{Q(x)} Q(x)来表示模型所预测的分布,KL散度越小,表示 P ( x ) \mathrm{P(x)} P(x) Q ( x ) \mathrm{Q(x)} Q(x)的分布更加接近,可以通过反复训练 Q ( x ) \mathrm{Q(x)} Q(x)来使得 Q ( x ) \mathrm{Q(x)} Q(x)的分布不断接近 P ( x ) \mathrm{P(x)} P(x)

  • 交叉熵: H ( p , q ) = − ∑ i = 1 n p ( x i ) log ⁡ ( q ( x i ) ) \mathrm{H}(\mathrm{p}, \mathrm{q})=-\sum_{\mathrm{i}=1}^{\mathrm{n}} \mathrm{p}\left(\mathrm{x}_{\mathrm{i}}\right) \log \left(\mathrm{q}\left(\mathrm{x}_{\mathrm{i}}\right)\right) H(p,q)=i=1np(xi)log(q(xi))
    KL散度 = 交叉熵 - 信息熵
    在机器学习中本来应该用 KL散度 来计算损失的,让KL散度尽可能地小,但是BigData已知,则信息熵则已知,此时KL损失函数 = 交叉熵损失函数 + 一个常数。所以可以用交叉熵损失函数来代替KL散度,即交叉熵也能间接够衡量同一个随机变量中的两个不同概率分布的差异程度,在机器学习中就表示为真实概率分布与预测概率分布之间的差异。交叉熵的值越小,模型预测效果就越好,更方便计算。

  • 交叉熵在分类问题中常常与softmax是标配,softmax将输出的结果进行处理,使其多个分类的预测值和为1,再通过交叉熵来计算损失。

参考博客,真的讲的非常好!
参考博客

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值