日志

CNN-卷积神经网络

CNN 的核心思想:局部感受野(local field) + 权值共享 + 亚采样 。

1
CNN 主要由四类层(layer)组成,即卷积层(Conv)、激活层(Activation)、池化层(Pooling) 以及全连接层(FC/Dense)。

卷积层(Convolution)

传统神经网络采用全连接的方式,往往容易导致需要训练的参数非常庞大,甚至难以训练,卷积神经网络通过卷积层的“局部连接”和“参数共享”的特性大大减少训练参数。

举例:输入 100 x 100, 隐藏层有10个神经元

传统全连接方式(Full Connected)
输入 100 x 100 与每一个神经元连接,需要训练 100 x 100 x 10 = 100000 个参数(不考虑bias)

局部连接(Sparse Connectivity)
假设每个神经元只与局部 10 x 10 个输入连接,那么只需要训练 10 x 10 x 10 = 1000 个参数!!

权值共享(Shared Weights)
如果每个神经元的连接使用相同的权值,那么实际训练参数进一步压缩到 10 x 10 x 1 = 100 个参数!!

卷积层如何生成

卷积核 (或称滤波器,filter/kernel)

2
上图是一个尺寸为 3×3 的卷积核, 即每个神经元由输入的 3×3 局部连接所得,卷积核的值通过训练来学习。

卷积核的 stride 值

3
stride 指卷积核的移动步长(这其实就是权值共享的表现),上图 stride=2,卷积核每次移动两个单元。

卷积核的 padding 值

4
padding 即在输入矩阵的四周添加填充,一方面可以减少原输入的边缘影响,另一方面可以用于维持输入和输出的维度一致(需要 stride 配合)。

padding 的常见术语包括:
(1) valid: 即 no padding
(2) same:通过填充使得输入和输出的维度保持一致

输出维度计算(取下界)
8

卷积输出-Feature Map(特征图)

实际上卷积核的作用就是对输入层进行特征学习,卷积核可以看成是对输入的一种特征映射,通过这种特征映射,一个卷积核对应生成一个特征图(Feature Map),即上图的 Result。

多通道卷积

5
当输入有多个通道(channel)时(例如图片可以有 RGB 三个通道),卷积核需要拥有相同的channel数,每个卷积核 channel 与输入层的对应 channel 进行卷积,将每个 channel 的卷积结果按位相加得到最终的 Feature Map。

多卷积核

6
当有多个卷积核时,可以学习到多种不同的特征,对应产生包含多个 channel 的 Feature Map, 例如上图有两个 filter,所以 output 有两个 channel。

为什么不需要全连接而只需要局部连接就会有效果?

对于图像而言,局部区域的像素关联性往往很强,而相距较远的区域关联性往往很弱。同样,对于文本而言,相近的词汇在语义表达上往往有紧密联系而相隔较远的词汇语义关联则相对较低。因此,只需要对局部信息进行特征提取,最后综合起来就能达到全局感知。

激活层(Activation)

阅读全文

日志

RNN/LSTM-递归神经网络

关于递归神经网络的理论介绍推荐阅读这篇非常经典的文章 → Understanding LSTM Networks
本文为总结笔记

一、RNN vs LSTM

RNN 逻辑结构图

1

LSTM 逻辑结构图

2

LSTM 是 RNN 的变体,它们的原理几乎一样,唯一的不同是 output 即 hidden state 的计算逻辑不同

RNN 如何计算某个时刻 t 的 output ?

h_t = tanh(W*[h_{t-1}, x_t]+b)

LSTM 如何计算某个时刻 t 的 output ?

遗忘门(Forget Gate): 控制遗忘哪些记忆(Cell state)

f_t = sigmoid(W_f*[h_{t-1}, x_t] + b_f)

新信息:候选记忆信息

{C}^{*} = tanh(W_c*[h_{t-1}, x_t]+b_c)

输入门(Input Gate):控制加入哪些新信息到记忆中

i_t = sigmoid(W_i*[h_{t-1}, x_t] + b_i)

新记忆:遗忘部分旧记忆,加入部分新记忆信息,得到最新的cell state

C_t = f_t*C_{t-1} + i_t*{C}^{*}

输出门(Output Gate):控制当前最新记忆的对应输出值

o_t = sigmoid(W_o*[h_{t-1}, x_t] + b_o)

输出值:最终的 hidden state

h_t = o_t*tanh(C_t)

当 Forget Gate=0, Input Gate=1, Output Gate=1 时 LSTM 与 RNN 等价

LSTM 为什么优于 RNN ?

RNN 通过叠乘的方式进行状态更新,当 sequence 比较长时容易出现梯度消失/爆炸的情况,主要原因是反向传播的连乘效应,而 LSTM 是通过门控制的叠加方式来更新状态(C_t的计算公式),所以可以有效防止梯度问题,当然对于超长的 sequence,LSTM 依然会有梯度消失或者爆炸的可能。

二、RNN/LSTM 中的 num_units 是啥意思 ?

3
num_units 相当于神经网络的隐层神经元的个数,例如上图表示一个 LSTM Cell,包含四个神经网络层,即黄色方框部分,num_units 就是每个神经网络结构的隐层神经元个数(全连接单元数),它实际上也是 LSTM 输出向量的维度数,所以 h_t 为 num_units 维向量。

三、如何计算 Keras 的 LSTM layer 的参数个数?

假设 LSTM(num_units = 150),输入维度 input_dims = 100,那么共需要训练的参数个数为:

(num\_units + input\_dims + 1) * num\_units * 4 = 150600

说明:
1. num_units + input_dims 是因为上层输出需要首先与输入进行一次concat,即 [h_t-1, x_t],
2. + 1 是因为 bias
3. * 4 是因为共有4个神经网络层(黄色方框)
4. 为什么不需要乘以 time_steps 即 number of cell ?
因为递归神经网络的每个 cell 实际上只是在不同时态下的状态,所以不同 cell 共用同一套权重,文章开头的结构图只是为了理解方便而将递归过程展开,实际上任何时候都只存在一个 cell !!

四、为什么 LSTM 要用 sigmoid 作为门控激活函数 ?

因为sigmoid的输出在0~1之间,可以很好地控制信息的删除和保留。

五、为什么 LSTM 的输入和输出值不用 sigmoid 而用 tanh 作为激活函数 ?

LSTM 内部维护了一个状态向量,其值应该可以增加或者减少,而 sigmoid 的输出为非负数,所以状态信息只能增加,显然不合适,相反,tanh 的输出范围包含了正负数,因此可以满足状态的增减。

六、什么是 sequence?

阅读全文

日志

Batch Normalization

Batch Normalization(简称 BN)是指对上一层的输出或者激活层的输入做标准化处理,从而使得激活层的输入值的分布更合适,进而加快收敛速度。

1

上图表示一个多层神经网络在采用 BN 层和不采用 BN 层时不同层的对应输出分布,可见不使用 BN 层的输出大部分分布在两端,而使用 BN 层的输出分布则比较均衡。

什么是 Batch Normalization

standard-normal-distribution-6
Batch Normalization 是指将线性激活函数的输入值变换为标准正态分布(均值为0,方差为1),使得其分布在激活函数的敏感区,从而加快收敛。如果不这么做,一旦激活函数的输入值分布在激活函数的极限饱和区,那么激活函数的梯度就会接近消失,从而无法更新参数或者参数更新很慢,进而影响模型的学习。
2
例如:sigmoid 函数,敏感区在[-2,2],两端的梯度逐渐消失,如果将输入变换为正态分布,那么95%的落点都在敏感区,有效避免梯度消失问题。

一味将输入值通过正态变换使得其落在敏感区也有问题,因为敏感区往往是偏线性的,这样会影响模型的表达能力,相当于失去了激活函数的意义(激活函数通过让模型损失一些输入信息从而达到非线性效果,例如 sigmoid 的两端),因此 BN 层还会通过 scale(γ斜率,即缩放,可以看成对方差的调整)和 shift(β截距,即移位, 可以看成对均值的调整)的操作使得落点分布在线性与非线性上获得平衡。

Relu 激活函数是否适合前接一个BN?
3
适合。通过 Batch Normalization 后,输入95%分布在(-2,2)大概有一半的输入得到激活,且保留非线性。

如何计算 Batch Normalization 的输出值

首先进行正态变换:
CodeCogsEqn
其中 E(x) 表示一个 batch 的均值,var(x) 表示一个 batch 的方差。(计算全局均值、方差需要非常大的计算开销,计算 batch 则非常高效,也许这就是为什么叫 Batch Normalization 的原因)

再通过 scale 和 shift 计算最终输出:
6
其中 γ 和 β 是要学习的参数。

举例:对于一个 batch_size 为 N, 宽为 P, 高为 Q 的特征图,一个 batch 的均值和方差就是基于这 N x P x Q 个特征计算所得,一个特征图学习一组 γ 和 β。

Batch Normalization 的优点

1.收敛更快,减少了训练时间(因为降低了梯度爆炸/消失的风险)。
2.减少了对正则化(dropout、L2)的需求,因为BN标准化是基于 batch 来计算均值和方差的,所以每个标准化产生的值都取决于当前的 batch,这本身就是一种正则化的体现。
3.允许设置更高的学习率(因为降低了梯度爆炸/消失的风险)。

Batch Normalization 的使用需要注意什么

1.由于均值和方差是针对 batch 计算的,所以如果 batch 太少,引入 BN 可能会有副作用。
2.对于不平衡的数据集,引入 BN 可能会导致更差的 Performance,因为对于不平衡语料,BN 不但没有做到“标准化”反而让不平衡的问题更加突出。

转载请注明出处:

© http://hejunhao.me