Fork me on GitHub
0%

深度学习1-全连接

参数更新方法

  • 若要优化损失函数得到损失函数的极小值,可对每个参数求偏导,令偏导为0,联立方程求解最优的参数。但参数多时代价太大。故采用梯度下降法不断逼近损失函数的极小值

    方向导数,梯度概念

梯度下降数学推导(手动推导)

训练方法

  • 当一个完整的数据集通过了神经网络一次并且返回了一次,这个过程称为一个 epoch。

    • 例如:对于一个有 2000 个训练样本的数据集。将 2000 个样本分成大小为 500 的 batch,那么完成一个 epoch 需要 4 个 iteration。
  • 批量训练

    • 以所有样本为训练为一个batch,对所有样本的loss求和后反向传播更新参数
  • 随机梯度下降

    • 随机挑一个样本训练为一个batch,算出一个样本的loss后反向传播更新参数
  • mini batch(一般现在采用的训练方法)

    • 随机选十几个样本(打比方)训练为一个batch,算出这十几个样本求和后的loos反向传播更新参数

梯度消失

  • 网络反向传播时到达靠近输入层的网络时梯度更新的值非常的小

激活函数

网络输入到激活函数之前通过批量归一化(BN)层,进行数据分布的调整

  • Sigmod函数 (两头过于平坦,输出值域不对称,相当于没有梯度)
    • $Sigmod(x) = \frac{1}{1+e^{-x}}, Sigmod(x) \in (0,1)$
    • 导数最大值为0.25
  • 双曲正切(tanh)(两头过于平坦,输出值域对称,相当于没有梯度)
    • $tanh(x) = \frac{e^{x}-e^{-x}}{e^{-x}+e^{x}}, tanh(x) \in (-1,1)$
  • ReLU函数(常用,收敛速度比前两种快,计算高效)
    • $Relu(x) = \max{0,x} $
  • Leaky ReLU(解决死亡神经元问题)
    • $$f(x) = \begin{cases}
      \alpha \ast x & x < 0 \
      x &x \geq 0
      \end{cases}$$
  • Softmax($z_i$为$wx+b$)
    • $y_i = \frac{e^{z_i}}{\displaystyle\sum^{n}_{i=1}e^{z_i}}$

损失函数

  • 最小平方误差(MSE)
    • $MSE = \frac{1}{2n}\displaystyle \sum^{n}_{i=1}{(\hat y_i-y_i)^2}$
  • 交叉熵(二分类问题,也可以用于[0,1]区间的回归问题)
    • $$J(w) = -\frac{1}{N}\displaystyle \sum^{N}_{n=1}{y_nlog{\hat{y_n}}+(1-y_n)log(1-\hat y_n)}$$
      • ($y_n$为第n个样本的真值,$\hat y_n$为第n个样本的预测值)

学习率

  • 基于经验手动调
  • 固定学习率
  • 动量法动态调整
  • 随机梯度下降
  • Adam自动调整

评估方法

  • 使用测试集(尽可能与训练集互斥进行泛化误差的估计)
    • 留出法:将数据姐划分一部分做测试集一部分做训练集,测试集与训练集正负样本分布尽可能均匀。常见将$\frac{2}{3}-\frac{4}{5}$的数据集作为训练集。可多次留出,对测试集结果取平均。
    • 交叉验证法:如十折交叉验证,分10份,9训练1测试,进行10次测试,每次测试集合两两不同,对测试集的结果取平均。
    • 自助法:

过拟合

  • 直观感受,在某个批次中,训练的损失函数在减少,测试集的损失函数不减反增
  • 原因
    • 模型过于复杂(拟合函数过于复杂,即学习能力很强,把训练样本一些特性当作了一般特性,导致泛化能力降低)
  • 参数范数惩罚:惩罚性成本函数,正则化(回归,分类问题都可用)
    • $L2$正则化($W_i$为平方,一次时为L1正则化)
      • $J = \frac{1}{2n}\displaystyle \sum^{n}{i=1}{(\hat y_i-y_i)^2}+\lambda \displaystyle \sum^{m}{j=1}{W_i^2}$
        • 解释:当$\lambda$取很大时要使得$J$很小则只能使某些权重$W_i$为0,从而降低模型的复杂度,防止过拟合。
  • 数据增强
  • 提前终止
    • (对检验样本)测试时过了10个epoche(例如),损失函数不减反增则终止检验。
  • Bagging等集成方法
  • Dropout(把网络变简单)
    • 在每个训练的epoche(一个minibatch)时随机删除一部分神经元(这部分被删除的神经元保存初始参数,训练过程不修正参数)
    • 在测试网络时将删除的神经元连上
  • 动量(Momentum)
    • $$
    • 可以防止直接在梯度方向上进行权重的调整,迂回前进,防止提前或者步子太大迈出了局部最小值
    • 减少训练速度

权重初始化

超参调节

  • 隐层个数
  • 激活函数
  • 学习率
  • 隐层神经元个数
  • 正则项

归一化

  1. 为了后面数据处理的方便,归一化的确可以避免一些不必要的数值问题。
  2. 为了程序运行时收敛加快。
  3. 同一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准。这算是应用层面的需求。
  4. 避免神经元饱和。啥意思?就是当神经元的激活在接近0或者1时会饱和,在这些区域,梯度几乎为0,这样,在反向传播过程中,局部梯度就会接近0。
  5. 保证输出数据中数值小的不被吞食。

训练网络

步骤

  • 调整epoch?
  • 增加网络层数?
  • loss不下降,有时候还上升?(过拟合)
觉得有帮助的请作者喝杯咖啡吧~