SAILOR

BLOG


  • 首页

  • 标签

  • 分类

  • 归档

Neuron Network

发表于 2019-06-17 | 更新于 2019-07-22 | 分类于 dl

深度学习和神经网络(CS231n Note)

  • 深度学习和神经网络(CS231n Note)
  • 1. 神经元模型与数学模型(Neuron Network Unit)
  • 2. 常用激活函数
    • sigmoid
    • tanh
    • relu
    • Leaky Relu
    • ELU
    • Maxout
  • 3. 数据预处理
    • 归一化 Normalization
    • PCA 白化(很少在深度学习中使用)
    • CIFAR 数据PCA
  • 4. 权重初始化
    • 小随机数初始化
    • 使用$\frac{1}{\sqrt{n}} $校准方差
    • He Normal
    • 偏置初始化 biases
  • 5. 正则化
    • L1 正则
    • L2正则

1. 神经元模型与数学模型(Neuron Network Unit)

大脑的基本计算单位是神经元(neuron)。人类的神经系统中大约有860亿个神经元,它们被大约$10^{14}-10^{15}$个突触(synapses)连接起来。下面图表的左边展示了一个生物学的神经元,右边展示了一个常用的数学模型。每个神经元都从它的树突获得输入信号,然后沿着它唯一的轴突(axon)产生输出信号。轴突在末端会逐渐分枝,通过突触和其他神经元的树突相连。

img

神经元(Neuron)通过树突(Dendrites)接收输入信号,沿着轴突(axon)产生输出信号。轴突在末端分叉,通过突触和其他神经元的树突相连。

输入信号($x_0,x_1,…,x_n$)传递到其他神经元的树突,基于突触的突触强度相乘($w_0x_0,w_1x_1,…,w_nx_n$)。突触的强度(权重$w$)可以控制一个神经元对另一个神经元的影响强度,使其兴奋(正权重)或抑制(负权重)。输出信号如果高于阈值,则神经元激活(对应于激活函数$f(\sum_{i}w_ix_i+b)$)。

  1. 1 多层感知机

    输入层 -> 隐藏层 -> 输出层

    img

2. 常用激活函数

函数 值域 导数 备注
sigmoid $ \sigma(x)=\frac{1}{1+e^{-x}} $ [0,1] [0, 0.25] $\sigma’(x)=\sigma(x)(1-\sigma(x))$ 分类概率
tanh $tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}$ [-1,1] [0, 1] $tanh’(x)=1-(tan(x))^2$
relu $relu(x)=max(0, x)$ $[0,+\infty]$ $f’_x=\begin{cases}0, x<0 \\="" 1,="" x="">0 \ undefinded, x=0 \end{cases}$

sigmoid

优点:

  1. 分类概率

缺点

  1. 梯度容易饱和而丢失,激活函数在接近0,1时会饱和,如果权重过大,很容易失去梯度
  2. 函数不经过0,不以0点对称,在中间点0.5附近的的梯度较小(0.25),梯度总体较小,不利于梯度传播
  3. 激活值永远全为正(负),下一神经元的输入总是正数(负数),则反向传播过程中梯度更新呈z字型
  4. exp指数函数计算复杂

1560776135809

tanh

$tanh(x)=2\sigma(2x)-1$

优点:

  1. 范围更大 [0, 1]
  2. 以 0 为中心点
  3. 中间部分梯度更大,有利于梯度传播

缺点:

  1. 梯度饱和而丢失的情况仍然存在

relu

优点

  1. 收敛速度更快(e.g. 6x than sigmoid/tanh)
  2. 计算简单
  3. 梯度不会饱和

缺点

  1. 可能导致部分神经元“死掉”,永远不会被激活。输出值始终为负,激活值为0,梯度为0,反向传播不更新此神经元的梯度。降低学习率来降低神经元“死掉”的概率。

677187e96671a4cac9c95352743b3806_hd

img

Leaky Relu

解决Relu死亡的问题

$$f(x)=\begin{cases}x, x>0\\alpha x, x<0\end{cases}$$, $\alpha=0.01​$

ELU

$$f(x)=\begin{cases} x, x>0\ \alpha(e^x-1), x\leq0\end{cases}$$

1560776449074

Maxout

$$max(w_{1}^Tx+b_1, w_{2}^Tx+b_2)$$

3. 数据预处理

归一化 Normalization

1
2
3
4
# 数据归一化
X = X / np.std(X, axis=0)
# 维度归一化
X = X / np.std(X, axis=1)

img

PCA 白化(很少在深度学习中使用)

PCA/白化。左边是二维的原始数据。中间:经过PCA操作的数据。可以看出数据首先是零中心的,然后变换到了数据协方差矩阵的基准轴上。这样就对数据进行了解相关(协方差矩阵变成对角阵)。右边:每个维度都被特征值调整数值范围,将数据协方差矩阵变为单位矩阵。从几何上看,就是对数据在各个方向上拉伸压缩,使之变成服从高斯分布的一个数据点分布。

img

CIFAR 数据PCA

nx3072 维向量(图片32x32x3),协方差矩阵:3072x3072

img

1: 49张图片。2: 3072个特征值向量中的前144个。3: 49张PCA降维的图片(U.transpose()[:144,:])。4: 白化后的数据。144个维度的方差都压缩到相同的数值范围(U.transpose()[:144,:])。现在较低的频率(代表了大多数方差)可以忽略不计了,较高的频率(代表相对少的方差)就被夸大了。

4. 权重初始化

小随机数初始化

基于均值为0,标准差为1的高斯分布

1
W = 0.01 * np.random.randn(N, D)

使用$\frac{1}{\sqrt{n}} $校准方差

数据量增大,随机初始化的神经元输出数据分布的方差也增大

1
W = np.random.randn(N, D) / np.sqrt(N)

He Normal

网络中神经元的方差应该是$\frac{2}{n}$

当前的推荐是使用ReLU激活函数,并且使用w = np.random.randn(n) * sqrt(2.0/n)来进行权重初始化

1
W = np.random.randn(n) * sqrt(2.0/n)

偏置初始化 biases

1
b = np.zeros(n,)

5. 正则化

L1 正则

L2正则

1561037588255

References:

  1. cs231n课程笔记中文翻译
  2. cs231n Assignments 解答 - 大数据文摘

Dropout

发表于 2019-06-17 | 更新于 2019-10-09 | 分类于 dl

Recurrent Neuro Network

循环神经网络可以更好地处理序列信息(如一句话),允许记忆信息(在时序上传递输入的有效信息),可以解决长期依赖的问题(Long-term Dependencies)

RNN结构

img

img

$$O_t = g(VS_t)$$ # 在时间点 t 的输出

$$S_t = f(UX_t + WS_{t-1})$$ # 在时间点 t 的状态

W,V,U: 权重

g,f: 激活函数

1562156211715

循环

1562068950392

输出值 $O_t$ 受前面历次输入值 $x_t, x_{t-1}, x_{t-2}…$ 的影响,相当于一定程度上记忆之前任意时间段的有效信息,从而在时序上累积输入 $X_t$,解决长期依赖问题。

疑问: S作为一个固定大小的矩阵如何记忆有效信息?

BPTT

损失函数对权重 $W$ 的梯度是各个时刻梯度之和:

$$\nabla_W L = \sum_{i=1}^{t} \nabla_{W_i} L$$

LSTM

lstm

$$f_t = \sigma(W_f[h_{t-1}, x_t] + b_f) $$ # forget 遗忘门

$$i_t = \sigma(W_i[h_{t-1}, x_t] + b_i)$$ # input 输入门

$$\widetilde{C}_t = tanh(W_c[h_{t-1}, x_t] + b_c)$$ # 特征输入

<<<<<<< HEAD

=======

66f037c2f6c4b40611583b218ec6441bb47385a7

$$C_t = f_t \odot C_{t-1} + i_t \odot \widetilde{C}_t$$ # 选择性遗忘,选择性更新

$$h_t = o \odot tanh(C_t)$$ # output 输出门

1562155957295

GRU

合并遗忘门和输入门,使用$z_t$

A gated recurrent unit neural network.

References:

  1. Understanding-LSTMs colah
  2. 理解LSTM(1的翻译)
  3. 零基础入门深度学习(5) - 循环神经网络

Dropout

发表于 2019-06-17 | 更新于 2019-10-09 | 分类于 dl

Optimization

  • Optimization
  • 损失函数
    • 损失函数 Loss function / 代价函数 Cost function
    • 均方损失
    • 交叉熵损失(cross-entropy loss)
    • Softmax 函数
    • 损失函数可视化
  • 梯度下降
    • 全局梯度下降 Batch Gradient Descent
    • 随机梯度下降SGD Stochastic Gradient Descent
    • 小批量梯度下降 Mini-batch Gradient Descent
    • Challange
  • 优化算法
    • 牛顿法
    • BFGS, L-BFGS
    • 梯度衰减(模拟退火)
    • Momentum
    • NAG Neterov Accelerated Gradient
    • Adagrad
    • Adadelta
    • RMSProp
    • Adam
    • Nadam
      • 各种优化方法动态图

损失函数

损失函数 Loss function / 代价函数 Cost function

img

均方损失

$$L(x)=\sum_{i}(y_i - y_j)^2$$

交叉熵损失(cross-entropy loss)

$$L(x)=\sum_{i}p_i\log \frac{1}{q_i}$$

交叉熵作为代价函数可以避免均方代价函数带来的学习减速(nelson)

Softmax 函数

1561034699845

$$y_i=\frac{e^{z_i}}{\sum_{i}{e^{z_i}}}$$

Softmax 分类器为每一个分类都提供了“可能性(概率)”

输出值$z_i$ => 概率$y_i$

决策函数:$$\hat{y}=argmax_{i}(y=y_i|Z)$$ (y所属类别$\hat{y}$)

损失函数可视化

颜色越深,损失函数越小

img

梯度下降

损失函数 L 的 3D 图:

1561035128653

Gradient: 损失函数 L 在某一点的梯度(斜率,一阶导数)

1561035151992

preview

梯度下降法:某一点沿着斜坡在当前点梯度最大的方向($f’(x)$, 下降最快的方向)移动一个步长(learning rate),在下一次更新中就会更接近最小点。

$$w = w - \eta dw$$

img

白箭头为(负梯度方向),是损失函数下降最陡峭的方向。沿着梯度方向逐步下降更新参数,就是深度学习中的梯度下降学习方法。

1561186124221

全局梯度下降 Batch Gradient Descent

$$\theta = \theta-\eta \nabla_{\theta} J(\theta)$$

优点:保证每次更新梯度都朝着正确的方向进行,保证收敛到局部最小点

缺点:每次需计算整个训练集数据,成本比较高

随机梯度下降SGD Stochastic Gradient Descent

$$\theta = \theta-\eta \nabla_{\theta} J(\theta;x_i,y_i)$$

优点:每次只选择一个样本来学习,成本低,可以进行在线更新; 不容易陷入某个局部

缺点:优化过程中波动较大,收敛速度慢;可能在沟壑两边持续震荡,停留在一个局部最优点

小批量梯度下降 Mini-batch Gradient Descent

$$\theta = \theta-\eta \nabla_{\theta} J(\theta;x_{i:i+n},y_{i,i+n})$$

n的大小通常为50-256

优点:相对于随机梯度下降(SGD),降低收敛波动性(降低参数更新的方差),使得收敛过程更加稳定。相对于全量梯度下降,提高了每次学习的速度。

Challange

  • 学习速率的选择,过小则收敛很慢,过大则在极值点附近震荡
  • 学习速率调整(模拟退火)一般使用事先设定的策略或者每次迭代中衰减一个阈值。都需要事先固定设置,无法自适应数据集的特点
  • 所有的参数每次更新都使用相同的学习速率。如果数据特征稀疏或者取值空间分布不同,就不应该使用同样的学习速率,对于很少出现的特征应该使用一个较大的学习速率
  • 对于非凸损失函数,容易陷入局部最小点,更严重的问题在于鞍点,附近点的梯度在所有维度上都接近于0

优化算法

牛顿法

$x = x -[Hf(x)]^{-1}\nabla f(x)$

$Hf(x)$: Hessian 矩阵,描述损失函数的局部曲率

$[Hf(x)]^{-1}$让最优化过程在曲率小的时候大步前进,在曲率大的时候小步前进

而且,没有学习率这个超参数

但是,Hessian矩阵计算成本很高

BFGS, L-BFGS

梯度衰减(模拟退火)

  • 随步数减半:没5个周期减半,每20个周期减少到之前0.1

  • 指数衰减:$\alpha=\alpha_{0}e^{-kt}$

  • 1/t衰减:$\alpha=\frac{\alpha_0}{1+kt}$

Momentum

累积之前的下降方向,并略微偏向当前时刻的下降方向

1561186187105

引入动量,累积之前的动量(梯度的指数衰减),速度越来越快。

$$v_t = \gamma v_{t-1} + \eta \nabla_\theta J(\theta)$$

$$\theta = \theta - v_t$$

$$\gamma$$通常使用0.9

加上动量后,就像从山顶往下滚的球。更新过程中,与上一次梯度方向相同的参数更新加强,在这个方向下降更快;与上一次梯度方向不同的参数更新减弱,在这个方向下降减慢。因此获得更快的收敛速度并减少震荡。

1561196522519

NAG Neterov Accelerated Gradient

往标准动量方法添加一个修正因子(当前梯度衰减$\eta v_{t-1}$),阻止过快更新

$$v_t = \gamma v_{t-1} + \eta \nabla_\theta J(\theta-\gamma v_{t-1})$$

$$\theta = \theta - v_t$$

SGD fluctuation

核心思路:

当参数向量位于某个位置x时,动量部分衰减$\gamma v_{t-1}$,向前一步$\theta-\gamma v_{t-1}$得到下一步要到达的位置,向前看在下一步的位置计算梯度。img

1
2
3
4
x_ahead = x + mu * v
# 计算dx_ahead(在x_ahead处的梯度,而不是在x处的梯度)
v = mu * v - learning_rate * dx_ahead
x += v

通过上面的两种方法,可以做到每次学习过程中能够根据损失函数的斜率做到自适应更新来加速SGD的收敛。

接下来引入二阶动量,希望同时解决不同参数应该使用不同学习速率的问题。对于经常更新的参数,我们已经积累了大量关于它的知识,不希望被单个样本影响太大,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。

怎么样去度量历史更新频率呢?

那就是二阶动量——该维度上,迄今为止所有梯度值的平方和:

$$V_t=\sum_{\tau=1}^{t} g_{\tau}^2$$

Adagrad

累积平方梯度

$$g_{t} = \nabla_{\theta} J(\theta)$$

$$r=r + g \odot g$$

$$\theta_{t+1}=\theta_{t}-\frac{\eta}{\sqrt{r+\epsilon}}\odot g$$

优点:

  • 适合处理稀疏梯度。自适应不同的学习速率,对稀疏特征,得到更大的学习更新;对非稀疏特征,得到更小的学习更新  特征出现越多,累积平方梯度r越大,分母$\sqrt{r+\epsilon}$越大,更新越慢

  • 前期$g_t$较小,校正因子较大,能够放大梯度,累积势越小,更新越快

  • 后期$g_t$较大,校正因子较大,能够约束梯度,累积势越大,更新越慢

缺点:

  • 依赖学习速率
  • 学习速率$\eta$不能过大,否则导致对梯度调节过大
  • 单调的学习率被证明通常过于激进且过早停止学习。后期如果梯度的平方累积($r$)过大,导致更新很小,接近于0,使得训练提前结束

由于AdaGrad单调递减的学习率变化过于激进,我们考虑一个改变二阶动量计算方法的策略:不累积全部历史梯度,而只关注过去一段时间窗口的下降梯度。这也就是AdaDelta名称中Delta的来历。

引入指数移动平均值:

$$r_t=\gamma r_{t-1}+(1-\gamma)g_{t}^2$$

Adadelta

对Adagrad的扩展

$$g_{t} = \nabla_{\theta} J(\theta)$$

$$r=\gamma r + (1-\gamma) g \odot g$$

$$g’t=\sqrt{\frac{\Delta x{t-1} +\epsilon}{r+\epsilon}}\odot g$$ # 使用状态变量$\Delta x_{t-1}$替代学习速率$\eta$

$$\theta_{t+1}=\theta_{t}-g’_t$$

$$\Delta x_t=\gamma \Delta x_{t-1}+(1-\gamma)g’_t\odot g’t $$ # 使用$\Delta x{t-1}$记录自变量变化量$g′_t$按元素平方的指数加权移动平均

优点:

  • 不再依赖学习率,使用梯度平方的指数加权累积得到状态变量$\Delta x_{t-1}$替代学习速率$\eta$
  • 训练初中期,加速效果好
  • 训练后期,反复在局部最小值附近抖动

RMSProp

累积指数加权的平方梯度

$$E[g^2]t=\gamma E[g^2]{t-1}+(1-\gamma)g_t^2$$ # 梯度平方的滑动平均

$$\theta_{t-1}=\theta_{t} - \frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}\odot g_t$$

$\gamma=0.9, \eta=0.001$

  • RMSProp 是 Adagrad 的一种发展,和 Adadelta 的变体,效果趋于二者之间,降低了 Adagrad 中学习速率衰减过快的问题
  • 适合处理非平稳目标(RNN)

接下来,整合前面所有方法,就得到 Adam。SGD-Momentum 在 SGD 的基础上增加了一阶动量,AdaGrad 和 AdaDelta 在 SGD 的基础上增加了二阶动量。结合一阶动量和二阶动量,就是 Adam (Adaptive+Momentum). 再加上 Neterov,就是 Nadam。

Adam

Adaptive Moment Estimation(Adam)

累积指数加权的梯度和平方梯度

$$m_t=\beta_1 m_{t-1} + (1-\beta_1)g_t$$ # 一阶累积

$$r_t = \beta_2 r_{t-1} + (1-\beta_2)g_{t}^2$$  # 二阶累积

$$\hat{m_t}=\frac{m_t}{1-\beta_1^t}$$         # 校正因子,$m_t$接近与0(初始0, $\beta$ 接近1)

$$\hat{v_t}=\frac{v_t}{1-\beta_2^t}$$

$$\theta_{t+1}=\theta_t - \eta\frac{\hat{m_t}}{\sqrt{\hat{v_t} + \epsilon}}$$

$\beta_1=0.9,\beta_2=0.999,\epsilon=10^{-8}$

Nadam

$$g_t=\nabla_{\theta_t} J(\theta_t - m_t)$$

优点:

  • 结合 Adagrad 善于处理稀疏梯度和 RMSProp 善于处理非平稳目标的问题
  • 适用于大数据集和高维空间

缺点:

  • 二阶动量是固定时间窗口内的累积,随着时间窗口的变化,遇到的数据可能发生巨变,使得 [公式] 可能会时大时小,不是单调变化。这就可能在训练后期引起学习率的震荡,导致模型无法收敛。
  • 可能错过全局最优解

cs231n: The two recommended updates to use are either SGD+Nesterov Momentum or Adam

各种优化方法动态图

SGD without momentum

Adagrad、Adadelta与RMSprop在损失曲面上能够立即转移到正确的移动方向上达到快速的收敛。而Momentum 与NAG会导致偏离(off-track)。同时NAG能够在偏离之后快速修正其路线,因为其根据梯度修正来提高响应性

saddle_point_evaluation_optimizers

从上图可以看出,在鞍点(saddle points)处(即某些维度上梯度为零,某些维度上梯度不为零),SGD、Momentum与NAG一直在鞍点梯度为零的方向上振荡,很难打破鞍点位置的对称性;Adagrad、RMSprop与Adadelta能够很快地向梯度不为零的方向上转移。
   从上面两幅图可以看出,自适应学习速率方法(Adagrad、Adadelta、RMSprop与Adam)在这些场景下具有更好的收敛速度与收敛性。

References:

  1. An overview of gradient descent optimization algorithms
  2. 梯度下降优化算法综述(1的翻译)
  3. 一个框架看懂优化算法之异同 SGD/AdaGrad/Adam - Juliuszh的文章 - 知乎

无偏估计和有偏估计

发表于 2019-04-29

entropy

发表于 2019-03-25 | 更新于 2019-07-22 | 分类于 math

信息量

信息量是对事件发生概率的度量

$log\frac{1}{p}​$

一个事件发生的概率越低,则这个事件包含的信息量越大,比如说越稀奇新闻包含的信息量越大,因为这种新闻出现的概率低。

引用:一本五十万字的中文书平均有多少信息量?($\log_2m$) 《数学之美 - 吴军》
我们知道常用的汉字(一级二级国标)大约有 7000 字。假如每个字等概率,那么我们大约需要 13 个比特(即 13 位二进制数)表示一个汉字[这里把汉字作为一个随机变量,那么汉字系统的熵就是约13bit] 。但汉字的使用是不平衡的。实际上,前 10% 的汉字占文本的 95% 以上。因此,即使不考虑上下文的相关性,而只考虑每个汉字的独立的概率,那么,每个汉字的信息熵大约也只有 8-9 个比特。如果我们再考虑上下文相关性,每个汉字的信息熵[其实指的是汉字变量取特定汉字作为值时候具有的信息量] 只有5比特左右。所以,一本五十万字的中文书,信息量大约是 250 万比特[这个时候的信息量就是每个汉字的信息量和数目相乘,指的都是汉字变量取具体值的信息量] 。如果用一个好的算法压缩一下,整本书可以存成一个 320KB 的文件。如果我们直接用两字节的国标编码存储这本书,大约需要 1MB 大小,是压缩文件的三倍。这两个数量的差距,在信息论中称作“冗余度”(redundancy)。 需要指出的是我们这里讲的 250 万比特是个平均数,同样长度的书,所含的信息量可以差很多。如果一本书重复的内容很多,它的信息量就小,冗余度就大。

熵(Entropy)

信息论中,熵是接收每条消息中包含的信息量($\log\frac{1}{p}$)的平均值。

熵定义为信息的期望值(香农 shannon):

$$\begin{align} H(X) & = E[I(X)] \ & = E[log(\frac{1}{P(X)})] \ & = -\sum\limits_{i}^n P(x_i)logP(x_i)\end{align} $$

表示样本的不确定性量度。在信息世界,熵越高,则能传输越多的信息,熵越低,则意味着传输的信息越少。

单位:

熵的单位通常为比特, bit 或者sh(annon) (基于2),但也用nat(基于自然对数)、Hart(基于10)计量,取决于定义用到对数的底。

  • 离散均匀分布

$H(X)=log_2{m}$

例:抛掷三枚硬币

信息量:可以得到$2^3=8$种情况

不确定性:$log_2{8}=3\ bit$

  • 离散分布

$H(X)=\sum\limits_{i}^nP(x_i)log\frac{1}{P(x_i)}$

例:选项ABCD

信息量:$H(X)=\sum\limits_{i}^n\frac{1}{4}log_2(\frac{1}{4})=2 bit$

给定A是错的,信息量变为:$H(X)=\sum\limits_{i}^n\frac{1}{3}log_2(\frac{1}{3})=1.585 bit$

“A是错的”,提供了$2-1.585=0.415bit​$的信息

例:编码

分布p=(1/2, 1/2, 0, 0),即A和B出现的概率均为1/2,C和D出现的概率都为0。计算H(p)为1,即只需要1位编码即可识别A和B

分布q=(1/4, 1/4, 1/4, 1/4)来编码则得到H(q)=2,即需要2位编码来识别A和B,还有C和D

交叉熵

使用分布 q 来预测真实分布 p 的平均编码长度

$H(p,q)= E_p[\log \frac{1}{q(i)}] = \sum\limits_{i}^{} p(i)*log\frac{1}{q(i)} $

交叉熵可以看作每个信息片段在错误分布 q 下的期望编码位长度,而信息实际分布为 p。

现有关于样本集的2个概率分布p和q,其中p为真实分布,q预测分布。

按照真实分布p来衡量识别一个样本的所需要的编码长度的期望(即平均编码长度)为:$H(p)=\sum\limits_{i}^{} p(i)*log\frac{1}{p(i)}$

使用预测分布q来表示来自真实分布p的平均编码长度,则应该是:$H(p,q)=\sum\limits_{i}^{} p(i)*log\frac{1}{q(i)} $

因为用q来编码的样本来自实际分布p,所以期望H(p,q)中概率是p(i)。H(p,q)我们称之为“交叉熵”。

比如含有4个字母(A,B,C,D)的数据集中,真实分布p=(1/2, 1/2, 0, 0),即A和B出现的概率均为1/2,C和D出现的概率都为0,计算H(p)为1,即只需要1位编码即可识别A和B。如果使用分布Q=(1/4, 1/4, 1/4, 1/4)来编码则得到H(p,q)=2,即需要2位编码来识别A和B(C和D并不会出现)。

根据非真实分布q得到的平均编码长度H(p,q)大于根据真实分布p得到的平均编码长度H(p)。事实上,根据Gibbs’ inequality可知,H(p,q)>=H(p)恒成立,当q为真实分布p时取等号。

KL散度(相对熵)

衡量分布 p 和 q 的差异,使用分布 q 来近似分布 p  $D_{KL}(p||q) \ge 0$

1562775971102

$D_{KL}(p||q)=E_{x ~ p}[\frac{\log p(i)}{\log q(i)}]=H(p,q)-H(p) = \sum\limits_{i}^{} p(i)\log\frac{1}{q(i)} - \sum\limits_{i}^{} p(i) \log\frac{1}{p(i)} = \sum\limits_{i}^{} p(i)*\log\frac{p(i)}{q(i)}$

我们将由q得到的平均编码长度比由p得到的平均编码长度多出的bit数称为“相对熵”,又被称为KL散度(Kullback–Leibler divergence,KLD) Kullback–Leibler divergence。它表示2个函数或概率分布的差异性:差异越大则相对熵越大,差异越小则相对熵越小,二者分布相同则相对熵为0。

可以得到,交叉熵 $H(p,q)= E_p[\log \frac{1}{q(i)}] = H(p) + D_{KL}(p||q)$

其中 $H(p)$ 是 $p$ 的熵,$D_{KL}(p|q)$ 是从 $p$ 到 $q$ 的KL散度(也被称为p相对于q的相对熵)。

通常“相对熵”也可称为“交叉熵”,因为真实分布p是固定的,D(p||q)由H(p,q)决定。当然也有特殊情况,彼时2者须区别对待。

交叉熵作为损失函数

交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。

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

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

>>>
[ 0.40760595 0.40760595 0.40760595]
1.22282
0.407606

References:

  • https://www.zhihu.com/question/41252833
  • https://zh.wikipedia.org/wiki/%E4%BA%A4%E5%8F%89%E7%86%B5
  • https://www.jianshu.com/p/92220ab37ea3

Decistion Tree

发表于 2019-01-31 | 更新于 2019-06-21 | 分类于 ml

Part 4. 决策树


Decision Tree 树形结构,根据损失函数最小化原则建立决策树模型

1548939696690

if-then规则集合,每一条路径构建一条规则

  • 内部节点:特征/属性,规则的条件

  • 叶节点: 类,规则的结论

条件概率分布

将特征空间划分为互不相交的单元(cell)或区域(region)

$P(Y=+1|X=c)>0.5$, 单元cell 属于正类

1548940003249

1548940132559

1548940093157

Statistic

发表于 2019-01-06 | 更新于 2019-10-09

Beyes

$$P(H|D) = \frac{P(H) \cdot P(D|H)}{P(D)}$$

H: hyposis 假设事件,D: data 数据

  • $P(H|D)$ : 后验概率, the probability of observing event H given that D is true
  • $P(H)$ : 先验概率, the probability of observing event H
  • $P(D|H)$: 似然度 
  • $P(D)$ : the probability of data D

例:在判断垃圾邮件的算法中:
$P(H)$ : 所有邮件中,垃圾邮件的概率。
$P(D)$ : 出现某个单词的概率。
$P(D|H)$ : 垃圾邮件中,出现某个单词的概率。
$P(H|D)$ : 出现某个单词的邮件,是垃圾邮件的概率。

概率是已知模型和参数,推数据。统计是已知数据,推模型和参数。

$P(x|\theta)$

如果$\theta$是已知确定的,$x$是变量,这个函数叫做概率函数(probability function),它描述不同的样本点$x$出现概率是多少。

如果$x$是已知确定的,$\theta$是变量,这个函数叫做似然函数(likelihood function), 它描述对于不同的模型参数$\theta$,出现$x$这个样本点的概率是多少

判别模型和生成模型

  • 判别模型,判别y类型,学习条件分布$P(y|x)$
  • 生成模型,生成y分布,学习联合分布$P(x, y)$,使用贝叶斯定理得出结论$P(y|x)$

两个小朋友判断图片是的动物是狮子还是大象

  1. A小朋友画出两只动物,表示图片和狮子更像,生成模型
  2. B小朋友根据鼻子体型等特征,判断图片是狮子,判别模型

References:

  1. https://blog.csdn.net/u011508640/article/details/72815981
12

Joseph.Fan

17 日志
5 分类
5 标签
© 2019 Joseph.Fan
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Gemini v6.7.0
|