关于自然语言处理:斯坦福NLP课程-第4讲-神经网络反向传播与计算图

87次阅读

共计 6923 个字符,预计需要花费 18 分钟才能阅读完成。

  • 作者:韩信子 @ShowMeAI,路遥 @ShowMeAI,奇异果 @ShowMeAI
  • 教程地址:http://www.showmeai.tech/tutorials/36
  • 本文地址:http://www.showmeai.tech/article-detail/236
  • 申明:版权所有,转载请分割平台与作者并注明出处
  • 珍藏 ShowMeAI 查看更多精彩内容

ShowMeAI 为 斯坦福 CS224n《自然语言解决与深度学习 (Natural Language Processing with Deep Learning)》课程的全副课件,做了 中文翻译和正文,并制作成了 GIF 动图!

本讲内容的 深度总结教程 能够在 这里 查看。视频和课件等材料的获取形式见 文末

引言

内容笼罩

  • ① 简略神经网络的梯度矩阵与倡议
  • ② 计算图与反向流传
  • ③ 神经网络训练实用常识技能

    • 正则化(用于环节过拟合)
    • 向量化
    • 非线性表达能力
    • 参数初始化
    • 优化算法
    • 学习率策略

1. 简略神经网络的梯度矩阵与倡议

1.1 权重矩阵的导数

  • 让咱们认真看看计算 \(\frac{\partial s}{\partial W}\)

    • 再次应用链式法则

$$
\frac{\partial s}{\partial W}=\frac{\partial s}{\partial h} \frac{\partial h}{\partial z} \frac{\partial z}{\partial W}
$$

$$
\begin{aligned}
s &= u^T h \\
h &= f(z) \\
z &= Wx+b
\end{aligned}
$$

1.2 反向流传梯度求导

  • 这个函数(从上次开始)

$$
\frac{\partial s}{\partial W}=\delta \frac{\partial z}{\partial W}=\delta \frac{\partial}{\partial W} Wx+b
$$

  • 思考单个权重 \(W_{ij}\) 的导数
  • \(W_{ij}\) 只对 \(z_i\) 有奉献

    • 例如 \(W_{23}\) 只对 \(z_2\) 有奉献,对 \(z_1\) 没有奉献

$$
\begin{aligned}
\frac{\partial z_{i}}{\partial W_{i j}} &=\frac{\partial}{\partial W_{i j}} W_{i \cdot} x+b_{i} \\
&=\frac{\partial}{\partial W_{i j}} \sum_{k=1}^{d} W_{i k} x_{k}=x_{j}
\end{aligned}
$$

  • 对于单个 \(W_{ij}\) 的导数:

$$
\frac{\partial s}{\partial W_{i j}} = \delta_i x_j
$$

  • 咱们想要整个 \(W\) 的梯度,然而每种状况都是一样的
  • 解决方案:外积

$$
\begin{aligned}
\frac{\partial s}{\partial {W}}&=\delta ^{T} x^{T}\\
[n \times m] &= [n \times 1][1 \times m]
\end{aligned}
$$

1.3 梯度求导:技巧与倡议

  • 技巧 1 :认真定义变量并关注它们的维度!
  • 技巧 2 :链式法则!如果 \(y = f(u)\) , \(u = g(x)\),即 \(y = f(g(x))\) 则

$$
\frac{\partial {y}}{\partial {x}}=\frac{\partial {y}}{\partial {u}} \frac{\partial {u}}{\partial {x}}
$$

  • 提醒 3 :模型的最下面的 softmax 局部:首先思考当 \(c = y\) (正确的类)的导数 \(f_c\),而后再思考当 \(c \neq y\) (所有不正确的类)的导数 \(f_c\)
  • 技巧 4 :如果你被矩阵微积分搞糊涂了,请计算一一元素的偏导数!
  • 技巧 5 :应用形态约定。留神:达到暗藏层的谬误音讯 \(\delta\) 具备与该暗藏层雷同的维度

1.4 为窗口模型推导梯度

  • 达到并更新单词向量的梯度能够简略地合成为每个单词向量的梯度
  • 令 \(\nabla_{x} J=W^{T} \delta=\delta_{x_{w i n d o w}}\)
  • \(X_{window}=[X_{museums} \quad X_{in} \quad X_{Paris} \quad X_{are} \quad X_{amazing}]\)
  • 则失去

$$
\begin{aligned}
\delta_{window}=\left[\begin{array}{c}{\nabla_{x_{\text {museums}}}} \\ {\nabla_{x_{i n}}} \\ {\nabla_{x_{\text {Pare}}}} \\ {\nabla_{x_{\text {are}}}} \\ {\nabla_{x_{\text {amazing}}}}\end{array}\right] \in \mathbb{R}^{5 d}
\end{aligned}
$$

  • 咱们将依据梯度一一更新对应的词向量矩阵中的词向量,所以实际上是对词向量矩阵的更新是十分稠密的

1.5 在窗口模型中更新单词梯度

  • 当咱们将梯度更新到词向量中时,这将更新单词向量,使它们 (实践上) 在确定命名实体时更有帮忙。
  • 例如,模型能够理解到,当看到 \(x_{in}\) 是中心词之前的单词时,批示中心词是一个 Location

1.6 从新训练词向量时的陷阱

背景:咱们正在训练一个单词电影评论情绪的逻辑回归分类模型。

  • 训练数据 中,咱们有“TV”和“telly”
  • 测试数据 中咱们有“television””
  • 预训练 的单词向量有三个相似之处:

  • 问题:当咱们更新向量时会产生什么
  • 答复

    • 那些在训练数据中呈现的单词会到处挪动

      • “TV”和“telly”
    • 没有蕴含在训练数据中的词汇放弃原样

      • “television”

1.7 对于再训练的倡议

  • 问题:应该应用可用的“预训练”词向量吗?
  • 答复

    • 简直总是「应该用」
    • 他们承受了大量的数据训练,所以他们会晓得训练数据中没有的单词,也会晓得更多对于训练数据中的单词
    • 领有上亿的数据语料吗?那能够随机初始化开始训练
  • 问题 :我应该更新(“fine tune”) 我本人的单词向量吗?
  • 答复

    • 如果你只有一个小的训练数据集,不要对预训练词向量做再训练
    • 如果您有一个大型数据集,那么基于工作训练更新词向量(train = update = fine-tune)成果会更好

2. 计算图与反向流传

2.1 反向流传

  • 咱们简直曾经向你们展现了反向流传

    • 求导并应用 (狭义) 链式法则
  • 另一个技巧:在计算较低层的导数时,咱们重用对较深层计算的导数,以减小计算量

2.2 计算图和反向流传

  • 咱们把神经网络方程示意成一个图

    • 源节点:输出
    • 外部节点:操作
    • 边传递操作的后果

$$
\begin{aligned}
s &= u^Th \\
h &= f(z) \\
z &= Wx+b \\
x & \quad (input)
\end{aligned}
$$

Forward Propagation:前向流传
Back Propagation:沿着边回传梯度

2.3 反向流传:单神经元视角

  • 节点接管“上游梯度”

    • 指标是传递正确的“上游梯度”
  • 每个节点都有部分梯度 local gradient

    • 它输入的梯度是与它的输出无关
  • 每个节点都有部分梯度 local gradient

    • n 它输入的梯度是与它的输出无关
  • 每个节点都有部分梯度 local gradient

    • 它输入的梯度是与它的输出无关

  • 有多个输出的节点呢?\(z=Wx\)
  • 多个输出 → 多个部分梯度

2.4 反向流传计算图示例

2.5 求和状态的梯度计算

上图中的 \(\frac{\partial f}{\partial y}\) 的梯度的计算

$$
\begin{aligned}
a &= x + y \\
b &= max(y,z)\\
f &= ab
\end{aligned}
$$

$$
\frac{\partial f}{\partial y} = \frac{\partial f}{\partial a}\frac{\partial a}{\partial y} + \frac{\partial f}{\partial b}\frac{\partial b}{\partial y}
$$

2.6 直挂了解神经元的梯度传递

  • \(+\)“散发”上游梯度
  • \(max\)“路由”上游梯度,将梯度发送到最大的方向
  • \(\ast\)“切换”上游梯度

2.7 同步计算所有梯度以提速

  • 谬误的反向流传计算形式

    • 先计算 \(b\)的偏导
    • 接着计算 \(W\)的偏导
    • 反复计算!
  • 正确的反向流传计算形式

    • 一次性计算所有偏导
    • 相似手动计算梯度时的形式

2.8 个别计算图中的反向流传

  • Fprop:按拓扑排序程序拜访节点

    • 计算给定父节点的节点的值
  • Bprop

    • 初始化输入梯度为 1
    • 以相同的程序方位节点,应用节点的后继的梯度来计算每个节点的梯度
    • \({y_1,y_2,\cdots,y_n}\) 是 \(x\) 的后继

$$
\frac{\partial z}{\partial x} = \sum_{i=1}^n \frac{\partial z}{\partial y_i}\frac{\partial y_i}{\partial x}
$$

  • 正确地说,Fprop 和 Bprop 的计算复杂度是一样的
  • 一般来说,咱们的网络有固定的层构造,所以咱们能够应用矩阵和雅可比矩阵

2.9 主动微分

  • 梯度计算能够从 Fprop 的符号表达式中主动推断
  • 每个节点类型须要晓得如何计算其输入,以及如何在给定其输入的梯度后计算其输出的梯度
  • 古代 DL 框架 (Tensorflow, Pytoch) 为您做反向流传,但次要是令作者手工计算层 / 节点的部分导数

2.10 反向流传的实现

为了计算反向流传,咱们须要在前向流传时存储一些变量的值

2.11 实现:前向 / 反向 API

为了计算反向流传,咱们须要在前向流传时存储一些变量的值

2.12 梯度查看:数值梯度

  • 对于 \(h \approx 1e^{-4}\) , \(f^{\prime}(x) \approx \frac{f(x+h)-f(x-h)}{2 h}\)
  • 易于正确实现
  • 但近似且十分迟缓

    • 必须对模型的每个参数从新计算 \(f\)
  • 用于查看您的实现

    • 在过来咱们手写所有货色的时候,在任何中央都这样做是要害。
    • 当初,当把图层放在一起时,就不须要那么多了

2.13 总结

  • 咱们曾经把握了神经网络的核心技术
  • 反向流传:沿计算图递归利用链式法则

    • [downstream gradient] = [upstream gradient] x [local gradient]
  • 前向传递:计算操作后果并保留两头值
  • 反向传递:利用链式法则计算梯度

2.14 为什么要学习梯度的所有细节?

  • 古代深度学习框架为您计算梯度
  • 然而,当编译器或零碎为您实现时,为什么要学习它们呢?

    • 理解底层原理是有帮忙的
  • 反向流传并不总是完满地工作

    • 了解为什么对调试和改良模型至关重要
    • 参见 Karpathy 文章
  • 将来课程的例子: 爆炸和隐没的梯度

3. 神经网络训练实用常识技能

3.1 模型正则化避免过拟合

  • 实际上一个残缺的损失函数蕴含了所有参数 \(\theta\)的正则化(下式中最初一项),例如 L2 正则化:

$$
J(\theta)=\frac{1}{N} \sum_{i=1}^{N}-\log (\frac{e^{f_{y_{i}}}}{\sum_{c=1}^{C} e^{f_{c}}})+\lambda \sum_{k} \theta_{k}^{2}
$$

  • 正则化 (在很大水平上) 能够避免在咱们有很多特色时过拟合(或者是一个十分弱小 / 深层的模型等等)

3.2 向量化状态

  • 例如,对单词向量进行循环,而不是将它们全副连贯到一个大矩阵中,而后将 softmax 权值与该矩阵相乘

    • 1000 loops, best of 3: 639 μs per loop
    • 10000 loops, best of 3: 53.8 μs per loop
  • (10x)更快的办法是应用 \(C \times N\) 矩阵
  • 总是尝试应用向量和矩阵,而不是循环
  • 你也应该疾速测试你的代码
  • 简略来说:矩阵向量化的形式太棒了

3.3 非线性:惯例激活函数

tanh 只是一个从新放缩和挪动的 sigmoid (两倍平缓,[-1,1])

$$
\tanh (z)=2 logistic(2 z)-1
$$

logistic 和 tanh 依然被用于特定的用处,但不再是构建深度网络的默认值。

tiplogistic 和 tanh

设计简单的数学运算,指数计算会减慢速度。所以人们提出了 hard tanh,并且成果很不错。于是才有了 ReLU

3.4 非线性:新的激活函数

  • 为了建设一个前馈深度网络,你应该做的第一件事是 ReLU——因为良好的梯度回流,训练速度快,性能好

tipReLU

  • 每个单元要么曾经死了,要么在传递信息。
  • 非零范畴内只有一个斜率,这一地位梯度非常无效的传递给了输出,所以模型十分无效的训练

3.5 参数初始化

  • 通常 必须将权重初始化为小的随机值(这样能力在激活函数的无效范畴内,即存在梯度能够使其更新)

    • 防止对称性障碍学习 / 特殊化的
  • 初始化隐含层偏差为 0,如果权重为 0,则输入 (或重构) 偏差为最优值(例如,均值指标或均值指标的反 s 形)
  • 初始化 所有其余权重为 Uniform(–r, r),抉择使数字既不会太大也不会太小的 \(r\)
  • Xavier 初始化中,方差与 fan-in \(n_{in}\) (前一层尺寸)和 fan-out \(n_{out}\)(下一层尺寸)成反比

$$
Var(W_i)=\frac{2}{n_{in}+n_{out}}
$$

3.6 优化算法

通常,简略的 SGD 就能够了

  • 然而,要失去好的后果通常须要手动调整学习速度(下一张幻灯片)
  • 对于更简单的网络和状况,或者只是为了防止放心,更有教训的简单的“自适应”优化器通常会令你做得更好,通过累积梯度缩放参数调整。
  • 这些模型给每个参数调整学习速度

    • Adagrad
    • RMSprop
    • Adam 相当好, 在许多状况下是平安的抉择
    • SparseAdam

3.7 学习率策略

  • 你能够用一个固定的学习速度。从 \(lr = 0.001\)开始?

    • 它必须是数量级的——尝试 10 的幂
    • 太大:模型可能会发散或不收敛
    • 太小:你的模型可能训练不出很好的成果
  • 如果你在训练时升高学习速度,通常能够取得更好的成果

    • 手工:每隔 \(k\) 个阶段 (epoch) 将学习速度减半

      • epoch = 遍历一次数据 (打乱或采样的)
    • 通过一个公式:\(l r=l r_{0} e^{-k t}\), {for epoch}t
    • 还有更新奇的办法,比方循环学习率(q.v.)
  • 更高级的优化器依然应用学习率,但它可能是优化器放大的初始速度——因而可能能够从较高的速度开始

4. 视频教程

能够点击 B 站 查看视频的【双语字幕】版本

5. 参考资料

  • 本讲带学的 在线阅翻页本
  • 《斯坦福 CS224n 深度学习与自然语言解决》课程学习指南
  • 《斯坦福 CS224n 深度学习与自然语言解决》课程大作业解析
  • 双语字幕视频】斯坦福 CS224n | 深度学习与自然语言解决(2019·全 20 讲)
  • Stanford 官网 | CS224n: Natural Language Processing with Deep Learning

ShowMeAI 系列教程举荐

  • 大厂技术实现 | 举荐与广告计算解决方案
  • 大厂技术实现 | 计算机视觉解决方案
  • 大厂技术实现 | 自然语言解决行业解决方案
  • 图解 Python 编程:从入门到精通系列教程
  • 图解数据分析:从入门到精通系列教程
  • 图解 AI 数学根底:从入门到精通系列教程
  • 图解大数据技术:从入门到精通系列教程
  • 图解机器学习算法:从入门到精通系列教程
  • 机器学习实战:手把手教你玩转机器学习系列
  • 深度学习教程 | 吴恩达专项课程 · 全套笔记解读
  • 自然语言解决教程 | 斯坦福 CS224n 课程 · 课程带学与全套笔记解读

NLP 系列教程文章

  • NLP 教程(1)- 词向量、SVD 合成与 Word2vec
  • NLP 教程(2)- GloVe 及词向量的训练与评估
  • NLP 教程(3)- 神经网络与反向流传
  • NLP 教程(4)- 句法分析与依存解析
  • NLP 教程(5)- 语言模型、RNN、GRU 与 LSTM
  • NLP 教程(6)- 神经机器翻译、seq2seq 与注意力机制
  • NLP 教程(7)- 问答零碎
  • NLP 教程(8)- NLP 中的卷积神经网络
  • NLP 教程(9)- 句法分析与树形递归神经网络

斯坦福 CS224n 课程带学详解

  • 斯坦福 NLP 课程 | 第 1 讲 – NLP 介绍与词向量初步
  • 斯坦福 NLP 课程 | 第 2 讲 – 词向量进阶
  • 斯坦福 NLP 课程 | 第 3 讲 – 神经网络常识回顾
  • 斯坦福 NLP 课程 | 第 4 讲 – 神经网络反向流传与计算图
  • 斯坦福 NLP 课程 | 第 5 讲 – 句法分析与依存解析
  • 斯坦福 NLP 课程 | 第 6 讲 – 循环神经网络与语言模型
  • 斯坦福 NLP 课程 | 第 7 讲 – 梯度隐没问题与 RNN 变种
  • 斯坦福 NLP 课程 | 第 8 讲 – 机器翻译、seq2seq 与注意力机制
  • 斯坦福 NLP 课程 | 第 9 讲 – cs224n 课程大我的项目实用技巧与教训
  • 斯坦福 NLP 课程 | 第 10 讲 – NLP 中的问答零碎
  • 斯坦福 NLP 课程 | 第 11 讲 – NLP 中的卷积神经网络
  • 斯坦福 NLP 课程 | 第 12 讲 – 子词模型
  • 斯坦福 NLP 课程 | 第 13 讲 – 基于上下文的表征与 NLP 预训练模型
  • 斯坦福 NLP 课程 | 第 14 讲 – Transformers 自注意力与生成模型
  • 斯坦福 NLP 课程 | 第 15 讲 – NLP 文本生成工作
  • 斯坦福 NLP 课程 | 第 16 讲 – 指代消解问题与神经网络办法
  • 斯坦福 NLP 课程 | 第 17 讲 – 多任务学习(以问答零碎为例)
  • 斯坦福 NLP 课程 | 第 18 讲 – 句法分析与树形递归神经网络
  • 斯坦福 NLP 课程 | 第 19 讲 – AI 平安偏见与偏心
  • 斯坦福 NLP 课程 | 第 20 讲 – NLP 与深度学习的将来

正文完
 0