深度学习入门-知识概要
仅记录一些关键知识和理解供复习使用。
感知机、机器学习、深度学习
三者均为给定输入, 经过一系列变换获得输出。
感知机的权重参数为人工设置, 且输出结果单调。
机器学习的权重参数为学习而来, 不过要对问题进行特征分析, 人工生成训练需要的特征数据。
深度学习将特征分析也纳入学习范围。 做到了仅设计学习架构和提供训练数据就可以完成学习。
区分神经网络与学习过程
初步学习深度学习会把神经网络和其训练方式混淆。
神经网络仅有层构成, 层包括输入输出层, 隐藏层(变换层、激活层)。 对于输入, 进行变换后输出结果。
训练则是为了获得正确的权重参数, 来进行设计的。 损失函数来评估模型, 梯度、参数更新来优化参数。
其他技巧,如初始权重参数、权重惩罚等都是为了优化学习过程。
神经网络的架构
一般神经网络输入输出层在两端, 中间变换层与激活函数层交替。
变换层
一般的变换层多为线性变换层。 因为线性变换可以用矩阵乘法来实现, 在表达形式和速度上都有很好的效果。
还有其他类型的层来处理特定问题, 如卷积层广泛用于图像处理。
线性变换层需要输入数据是一维向量。 处理高维数据时进行一维化处理后会丢失高维的特征。
激活函数
激活函数需要非线性, 线性层的叠加没有意义。
激活层位于变换层之后, 将变换非线性化处理。
激活函数大多为正相关, 非线性变换后不影响权重参数的影响。
常见激活函数有 ReLU
, sigmoid
, tanh
, softmax
。
ReLU
$$\begin{equation}
h(x)=
\begin{cases}
x & (x>0) \
0 & (x<0)
\end{cases}
\end{equation}
$$
目前常用激活函数。
sigmoid
$$h(x)=\frac{1}{1+e^{-x}}$$
值域为$(0,1)$, 可以用来预测概率。 但是输入较大或较小时会有梯度也会变小甚至梯度消失, 已不常用。
softmax
$$y_k=\frac{e^{a_k}}{\sum^n_{i=1}e^{a_i}}$$
常用于多分类问题的输出层。
神经网络学习
学习需要对损失函数进行评估和进一步优化。
损失函数用来评估模型。
通过求解权重参数关于损失函数的梯度来获得参数优化的方向。
参数的更新方法来优化学习效率。
损失函数
均方误差(MSE)
$$E=\frac{1}{2}\sum_k(y_k-t_k)^2$$
交叉熵误差(cross entropy error)
$$E=-\sum_k{t_k\log y_k}$$
当标签为 one-hot
编码时, 值由正确解标签所对应的输出结果决定。
梯度计算
梯度计算一般用反向传播法。 其基本原理为链式法则。
参数更新
SGD
直接学习率乘梯度更新权重参数。
AdaGrad
按参数学习率衰减, 使变动大的参数学习率逐渐减小。
$$ h \leftarrow h+\frac{\partial L}{\partial W} \bigodot \frac{\partial L}{\partial W} \
W \leftarrow W-\eta\frac{1}{\sqrt{h}} \bigodot \frac{\partial L}{\partial W}
$$
RMSProp
对AdaGrad
做优化, 逐渐遗忘过去的梯度, 避免更新量消失。
Adam
结合了Mometum
和AdaGrad
方法。
更多技巧
权重初始值
不能设为相同的值(如全为0)。
sigmoid
用Xavier初始值
(标准差为$\frac{1}{\sqrt{n}}$的高斯分布)
ReLU
用He初始值
(标准差为$\sqrt{\frac{2}{n}}$的高斯分布)
Batch Normalization(数据正则化)
将数据进行均值为0, 方差为1的正则化。
处理过拟合
某些权重参数过大或模型过于复杂是导致过拟合的两个原因。
权重衰减
损失函数加入L2范数进行权重惩罚, 防止权重过大。
Dropout
随机删除神经元, 降低模型复杂度。