🎨
Bible-DeepLearning
  • Introduction
  • 第6章 深度前馈网络
    • 6.1 例子:学习XOR
    • 6.2 基于梯度的学习
      • 6.2.1 代价函数
        • 6.2.1.1 使用最大似然学习条件分布
        • 6.2.1.2 学习条件统计量
      • 6.2.2 输出单元
        • 6.2.2.1 用于高斯输出分布的线性神单元
        • 6.2.2.2 用于Bernoulli输出分布的sigmoid单元
        • 6.2.2.3 用于Multinoulli输出分布的softmax单元
    • 6.3 隐藏单元
      • 6.3.1 ReLU及其扩展
      • 6.3.2 logistic sigmoid与双曲正切函数
      • 6.3.3 其他隐藏单元
      • 李宏毅补充 SELU
    • 6.4 架构设计
    • 6.5 反向传播和其他的微分算法
      • 6.5.1 计算图
      • 6.5.2 微积分中的链式法则
      • 6.5.3 递归地使用链式法则来实现反向传播
      • 6.5.4 全连接MLP中的反向传播计算
      • 6.5.5 符号到符号的导数
      • 6.5.6 一般化的反向传播
      • 6.5.7 实例:用于MLP 训练的反向传播
      • 6.5.8 复杂化
  • 第7章 深度学习中的正则化
    • 7.1 参数范数惩罚
      • 7.1.1 L2参数正则化
      • 7.1.2 L1参数正则化
    • 7.2 作为约束的范数惩罚
    • 7.3 正则化和欠约束问题
    • 7.4 数据集增强
    • 7.5 噪声鲁棒性
    • 7.6 半监督学习
    • 7.7 多任务学习
    • 7.8 提前终止
    • 7.9 参数绑定和参数共享
    • 7.10 稀疏表示
    • 7.11 Bagging 和其他集成方法
    • 7.12 Dropout
    • 7.13 对抗训练
    • 7.14 切面距离、正切传播和流形正切分类器
    • Ag补充 一些能用于提升比赛成绩的方法
  • 第8章 深度模型中的优化
    • 8.1 学习和纯优化有什么不同
      • 8.1.1 经验风险最小化
      • 8.1.2 代理损失函数和提前终止
      • 8.1.3 批量算法和小批量算法
    • 8.2 神经网络优化中的挑战
      • 8.2.1 病态
      • 8.2.2 局部极小值
      • 8.2.3 8.2.3 高原、鞍点和其他平坦区域
      • 8.2.4 悬崖和梯度爆炸
      • 8.2.5 长期依赖
      • 8.2.6 非精确梯度
    • 8.3 基本算法
      • 8.3.1 随机梯度下降
      • 8.3.2 动量
      • 8.3.3 Nesterov 动量
    • 8.4 参数初始化策略
    • 8.5 自适应学习率算法
      • 8.5.1 AdaGrad
      • 8.5.2 RMSProp
      • 8.5.3 Adam
      • 8.5.4 选择正确的优化算法
    • 8.6 二阶近似方法
      • 8.6.1 牛顿法
      • 8.6.2 共轭梯度
      • 8.6.3 BFGS
    • 8.7 优化策略和元算法
      • 8.7.1 批标准化
      • 8.7.2 坐标下降
      • 8.7.3 Polyak 平均
      • 8.7.4 监督预训练
      • 8.7.5 设计有助于优化的模型
  • 第9章 卷积网络
    • 9.1 卷积运算
    • 9.2 动机
    • 9.3 池化
    • 9.4 卷积与池化作为一种无限强的先验
    • 9.5 基本卷积函数的变体
    • 9.6 结构化输出
    • 9.7 数据类型
  • 第10章 序列建模:循环和递归网络
    • 10.1 展开计算图
    • 10.2 循环神经网络
      • 10.2.1 导师驱动过程和输出循环网络
      • 10.2.2 计算循环神经网络的梯度
      • 10.2.3 作为有向图模型的循环网络
      • 10.2.4 基于上下文的RNN序列建模
    • 10.3 双向RNN
    • 10.4 基于编码 - 解码的序列到序列架构
    • 10.5 深度循环网络
    • 10.6 递归神经网络
    • 10.7 长期依赖的挑战
    • 10.9 渗漏单元和其他多时间尺度的策略
    • 10.10 长短期记忆和其他门控RNN
      • 10.10.1 LSTM
      • 10.10.2 其他门控RNN
    • 10.11 优化长期依赖
      • 10.11.1 梯度截断
      • 10.11.2 引导信息流的正则化
    • 10.12 外显记忆
  • 第11章 实践方法论
    • 11.1 性能度量
    • 11.2 默认的基准模型
    • 11.3 决定是否收集更多数据
    • 11.4 选择超参数
      • 11.4.1 手动选择超参数
      • 11.4.3 网络搜索
      • 11.4.4 随机搜索
    • 11.5 调试策略
Powered by GitBook
On this page

Was this helpful?

  1. 第6章 深度前馈网络
  2. 6.5 反向传播和其他的微分算法

6.5.7 实例:用于MLP 训练的反向传播

Previous6.5.6 一般化的反向传播Next6.5.8 复杂化

Last updated 5 years ago

Was this helpful?

这一节将6.5.4的算法进一步细化。

假设这是一个三层的MLP网络。 输入层:X 隐藏层:参数为W(1),输入为X,激活函数为H=max{0, XW(1)} 输出层:参数为W(2),输入为H,用于计算类的非归一化对数的概率。

[?]类的非归一化对数概率?

$J_{MLE}$为非归一化的对数概率的交叉熵。 正则项为W(1)和W(2)的二阶范式。 最终cost为:

J=JMLE+λ(∑i,j(Wi,j(1))2+(Wi,j(2))2)J = J_{MLE} + \lambda\left(\sum_{i,j}(W^{(1)}_{i,j})^2 + (W^{(2)}_{i,j})^2\right)J=JMLE​+λ(i,j∑​(Wi,j(1)​)2+(Wi,j(2)​)2)

图为这个网络的正反传播的计算图: [?]反向传播算法可以自动生成梯度?这句话什么意思?

作为一个例子,我们利用反向传播算法来训练多层感知机。

这里,我们考虑一个具有单个隐藏层的非常简单的多层感知机。 为了训练这个模型,我们将使用小批量随机梯度下降算法。 反向传播算法用于计算单个小批量上的代价的梯度。

[sucess] $\nabla_y C = [\frac{\partial C}{\partial y_1} \frac{\partial C}{\partial y_2} \cdots \frac{\partial C}{\partial y_n}]^\top$

具体来说,我们使用训练集上的一小批量实例,将其规范化为一个设计矩阵$X$以及相关联的类标签向量$y$。 网络计算隐藏特征层$H=\max{0, XW^{(1)}}$。 为了简化表示,我们在这个模型中不使用偏置。 假设我们的图语言包含relu操作,该操作可以对$\max{0,Z}$表达式的每个元素分别进行计算。 类的非归一化对数概率的预测将随后由$HW^{(2)}$ 给出。 假设我们的图语言包含crossentropy操作,用以计算目标$y$和由这些未归一化对数概率定义的概率分布间的交叉熵。 所得到的交叉熵定义了代价函数$J\text{MLE}$。最小化这个交叉熵将执行对分类器的最大似然估计。

[success] 分类问题的交叉熵代价函数 假设真实结果为$\hat y = 0 0 0 \cdots 1 \cdots 0]$,1在第r个位置 预测结果为y。 交叉熵代价为$C = -\log y_r$,其中y来自预测结果,r来自真实结果 具体来说:

∂C∂yi=−1yri=r=0i≠r\begin{aligned} \frac{\partial C}{\partial y_i} & = & -\frac{1}{y_r} && i=r \\ & = & 0 && i \ne r \end{aligned}∂yi​∂C​​==​−yr​1​0​​i=ri=r​

然而,为了使得这个例子更加真实,我们也包含一个正则项。 总的代价函数为

J=JMLE+λ(∑i,j(Wi,j(1))2+∑i,j(Wi,j(2))2)\begin{aligned} J = J_{\text{MLE}} + \lambda \left ( \sum_{i, j} \left (W_{i, j}^{(1)} \right )^2 + \sum_{i, j} \left (W_{i, j}^{(2)} \right)^2 \right ) \end{aligned}J=JMLE​+λ(i,j∑​(Wi,j(1)​)2+i,j∑​(Wi,j(2)​)2)​

包含了交叉熵和系数为$\lambda$的权重衰减项。 它的计算图在图6.11中给出。

这个示例的梯度计算图实在太大,以致绘制或者阅读都将是乏味的。 这显示出了反向传播算法的优点之一,即它可以自动生成梯度,而这种计算对于软件工程师来说需要进行直观但冗长的手动推导。

[warning] 自动生成梯度?

我们可以通过观察图6.11中的正向传播图来粗略地描述反向传播算法的行为。 为了训练,我们希望计算$\nabla{W^{(1)}} J$和$\nabla{W^{(2)}} J$。 有两种不同的路径从$J$后退到权重:一条通过交叉熵代价,另一条通过权重衰减代价。 权重衰减代价相对简单,它总是对$W^{(i)}$上的梯度贡献$2\lambda W^{(i)}$。

另一条通过交叉熵代价的路径稍微复杂一些。 令$G$是由crossentropy操作提供的对未归一化对数概率$U^{(2)}$的梯度。 反向传播算法现在需要探索两个不同的分支。 在较短的分支上,它使用对矩阵乘法的第二个变量的反向传播规则,将$H^\top G$加到$W^{(2)}$的梯度上。 另一条更长些的路径沿着网络逐步下降。 首先,反向传播算法使用对矩阵乘法的第一个变量的反向传播规则,计算$\nabla{H} J = GW^{(2)\top}$。 接下来,relu操作使用其反向传播规则对先前梯度的部分位置清零,这些位置对应着$U^{(1)}$中所有小于0的元素。记上述结果为$G'$。 反向传播算法的最后一步是使用对matmul操作的第二个变量的反向传播规则,将$X^\top G'$加到$W^{(1)}$的梯度上。

[warning] 这一段没看懂?

在计算了这些梯度以后,梯度下降算法或者其他优化算法所要做的就是使用这些梯度来更新参数。

对于MLP,计算成本主要来源于矩阵乘法。 在前向传播阶段,我们乘以每个权重矩阵,得到了$O(w)$数量的乘-加,其中$w$是权重的数量。 在反向传播阶段,我们乘以每个权重矩阵的转置,这具有相同的计算成本。 算法主要的存储成本是我们需要将输入存储到隐藏层的非线性中去。 这些值从被计算时开始存储,直到反向过程回到了同一点。 因此存储成本是$O(mn_h)$,其中$m$是小批量中样本的数目,$n_h$是隐藏单元的数量。

[success] 网上找了不带正则化的计算图 图中的上标1、2不是幂的意思。 $\frac{\partial C}{\partial y}$在上面已经讲过 $\frac{\partial y}{\partial z^{(2)}}$是一个Jacobian矩阵。i=j时,$\frac{\partial yi}{\partial z_j^{(2)}}=$激活函数的偏导。$i \ne j$时偏导为0。(如果激活函数是softmax函数,这个矩阵就不是对角矩阵了)。 $\frac{\partial z_i^{(i)}}{\partial a_j^{(1)}} = W{ij}^2$ $\frac{\partial z^{(2)}}{\partial W^{(2)}}$是一个三维的张量。i=j时,$\frac{\partial zi^{(i)}}{\partial W{jk}^{(2)}} = a_k^{(1)}$。$i \ne j$时偏导为0。