Chap 3 深度学习基础
-
LeakyRelu和ELU等的RELU的提出目的是:解决RELU的输出值为负数的神经元无法进行梯度更新。
-
sigmoid和hyperbolic tangent(双曲正切)存在饱和现象,在过小的输出值或者是过大的输出值上的梯度几乎为0,梯度训练困难。
sigmoid将值映射到(0,1),双曲正切将值映射到(-1,1) -
前馈神经网络回归任务中希望输出为连续值,因此输出层直接采用仿射变换(线性变换),损失函数使用简单的平方差函数。
-
前馈神经网络分类任务(二分类/多分类):
//对于二分类,最后输出的时候需要经过sigmoid形成概率值,损失函数为交叉熵函数;
//对于多分类,lable为one-hot,最后输出的时候需要经过softmax形成各个分量上的概率,具有最大概率的分量为预测的lable,损失函数为交叉熵函数。l ( y , y ^ ) = − ∑ i = 0 n − 1 y i l o g ( y i ^ ) . l(y,\hat{y})=-\sum_{i=0}^{n-1}y_i log(\hat{y_i}). l(y,y^)=−∑i=0n−1yilog(yi^).
5.卷积神经网络CNN
(1) 卷积神经网络基于卷积操作(卷积的内在机理是当前t时刻的元素值是具有噪声的,需要利用 t t t时刻的邻居来缓解这种噪声,但是不同邻居的重要程度不同,利用权重来刻画这种重要程度<事实上是越靠近时刻 t t t的邻居的重要程度越高>)。
(2) 卷积层具有三个核心特性:稀疏连接、权重共享、平移不变性。
稀疏连接是相对于全连接来说的,卷积核仅仅作用于当前感受野下的部分神经元,大大提升了计算效率。权重共享是指卷积核是全图共享的,进一步减少了参数的数量。平移不变形是指我们只关心某特征是否存在,在不同位置上的特征是具有相同效果的。
– 卷积核的计算:
– Pooling池化层:进一步提取总结出领域内的特征信息,包括均值池化与最大值池化…。池化前后图的大小会变化,但是通道数不变。
– 以分类任务来实例化说明卷积神经网络:包含两个部分为特征提取部分以及分类部分(分类部分就是全连接网络)。
– Pytorch写cnn建议把卷积操作、激活函数、池化打包为一个Sequential。
#代码来自莫烦pytorch
self.conv1 = nn.Sequential( # input shape (1, 28, 28)
nn.Conv2d(
in_channels=1, # input height
out_channels=16, # n_filters
kernel_size=5, # filter size
stride=1, # filter movement/step
padding=2, # if want same width and length of this image after Conv2d, padding=(kernel_size-1)/2 if stride=1
), # output shape (16, 28, 28)
nn.ReLU(), # activation
nn.MaxPool2d(kernel_size=2), # choose max value in 2x2 area, output shape (16, 14, 14)
)
6.循环神经网络RNN
由于生活中有许多需要处理的序列信息,而这些序列信息的输入和输出不具有固定长度并且其他神经网络在处理序列不同位置的时候并不共享参数,于是RNN应运而生。RNN的每个单元都有两个输入和输出。但是RNN对相距很远的信息不敏感,这些传播了很长时间的数据往往弥散或者是爆炸了,梯度弥散将损害优化过程,而梯度爆炸则将导致无法进行梯度更新,于是提出了门控RNN模型,典型的包括LSTM和GRU等。
(红圈的权重共享)
– LSTM(长短期记忆网络): 与普通RNN的主要差别是gating units的加入。这里的权重也都是共享的(复用unit)。
LSTM超参数定义说明:
EPOCH = 1 # train the training data n times, to save time, we just train 1 epoch
BATCH_SIZE = 64
#这里的时间步(time_step)理解为一共有多少个时刻,每个时间步的输入的大小为input_size。eg:共有28个时刻,每个时刻输入28个像素点。
TIME_STEP = 28 # rnn time step / image height
INPUT_SIZE = 28 # rnn input size / image width
LR = 0.01 # learning rate
LSTM单元的定义:
self.rnn = nn.LSTM( # if use nn.RNN(), it hardly learns
input_size=INPUT_SIZE,
hidden_size=64, # rnn hidden unit
num_layers=1, # number of rnn layer
batch_first=True, # input & output will has batch size as 1s dimension(把batch size作为第一个维度). e.g. (batch, time_step, input_size)
)
输出:
r_out, (h_n, h_c) = self.rnn(x, None) # None represents zero initial hidden state
– GRU(gated recurrent unit)门控循环单元
可以视为是LSTM的简化变体,使用橙色笔标注出了两个改进的部分,这样得到了一个更简单的门控RNN模型。
6.自动编码机Autoencoder
自动编码机通过大致重构出输出来完成学习(注意我们并不需要完全重构出输入,这样可能学到的是恒等变换,反而没有价值)。
其中 g g g为解码器, f f f为编码器, l l l可以设置为MSE。
Undercomplete Autoencoders:bottleneck的维度小于输入的维度的自动编码机。通过最小化重构误差,可以使得bottleneck学习到最重要的信息。
Regularized Autoencoders:如果叠加了过多层的encoder和decoder,则可能导致自动编码机学习不到东西(capacity问题)。因此在损失函数中加入了正则化项。
(1)
(2)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/15dc36f433268f8b4ee1e7fc976683d2.png)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/8c5d7435927973cd3a77910844c2cc5f.png)
ρ \rho ρ是一个很小的值,可以设置为0.05,hidden state每个元素被视为伯努利随机变量,使得 h h h的均值尽量的小,这样达到正则化的目的。这样的正则化方法也可以得到一种sparse autoencoder。这种正则化方法可以用在undercomplete autoencoder上,也可以单独使用在bottleneck维度并不少于输入维度的自动编码机上。
7.神经网络的训练
(1)传统梯度下降:
由于计算梯度的空间和时间复杂度过高,采用mini-batch 梯度下降:
其中
N
s
N_s
Ns为选中的样本。
(2)反向传播算法=前向过程(通过当前参数计算输出值)+反向过程(通过链式法则求出loss与w的梯度,以此来根据梯度下降更新参数)。
8.防止过拟合的方法
Weight Regularization(如L1、L2等),Dropout(在训练过程中随机丢弃节点,但是在预测过程中使用full network),Batch Normalization(解决internal covariate shift以及过拟合,将上一层的输出正则化后再输入下一层):
n
e
w
o
u
t
p
u
t
=
o
u
t
p
u
t
−
b
a
t
c
h
M
e
a
n
b
a
t
c
h
s
t
a
n
d
a
r
d
d
i
v
i
a
t
i
o
n
.
new output=\frac{output-batchMean}{batch standard diviation}.
newoutput=batchstandarddiviationoutput−batchMean.