2019年CS224N课程笔记-Lecture 4: Backpropagation and Computation Graphs

资源链接:https://www.bilibili.com/video/BV1r4411

正课内容

神经网络的梯度

让我们再看他一下s对w的求导

反向传播中梯度的计算

(上图的大概意思就是,考虑单个权重Wij的导数,Wij只对zi有贡献,例如W23只对z2有贡献,而对z1没有贡献)

对於单个Wij的导数来说,为:

我们想要整个 W 的梯度,但是每种情况都是一样的:

梯度求导需要注意的

  1. 小心的定义变量而且要始终关注它们的维度
  2. 使用链式法则进行计算
  3. 要清楚哪些变量用于哪些计算
  4. 对于模型最上面的softmax部分,首先考虑c=y时的梯度(正确的类别),然后考虑错误的类别(c!=y)
  5. 如果你被矩阵微积分搞糊涂了,算出元素偏导数!
  6. 使用形状法则。注意:到达隐藏层的错误消息delta具有与该隐藏层相同的维度

窗口模型推导梯度

重新训练词向量时的一个陷阱

假设:使用单一的单词为电影评论情绪建立一个逻辑回归模型
在训练数据中,有单词TV和telly;在测试数据中,有单词television;在预训练中词向量有三个相似的地方

当更新词向量时会发生什么呢?训练时TV和telly的向量会一起移动,但是television是在测试数据中,没有别训练到,所以位置是保持不变的,如下图:

这样的分类结果是有错的。所以我们应该采取一定的方法来解决这个问题--使用预训练向量。

预训练向量:接受了大量的数据训练,所以他们会知道训练数据中没有的单词,也会知道更多关于训练数据中的单词。

应该对我自己的词向量进行微调吗?

  • 如果数据集很小,不要训练词向量。
  • 如果数据集很大,可能会运行得更好train=update=fine-tune(微调)

反向传播的一个小技巧:在计算较低层的导数时,我们重用对较高层计算的导数,以使计算最小化。

计算图和反向传播

我们将上述的神经网络用等价的计算图来表示

在其上进行前向传播和反向传播

每个节点都有局部的梯度:

  • 节点接收“上游梯度”
  • 目标是传递正确的“下游梯度”
  • 每个节点都有局部梯度
  • 它输出的梯度是与它的输入有关,也就是反向传播是依赖正向传播的

当有多个输入时:

一个梯度计算的例子:

Back-Prop in General Computation Graph

这一部分,其实这一部分现在主流的框架都帮忙我们完成了,如果有兴趣的小伙伴可以自行查阅,我没太听懂这部分也...

当模型有很多参数时,需要正则化

在实践中,一个损失函数包含正则化项,正则化项包含所有参数。以下是添加的惩罚项为L2正则化惩罚项

正则化在很大程度上可以防止过拟合

矢量化计算

矢量化计算往往比单独计算更加快速或者说把数据放到向量里进行计算可以提高计算速度(之前也提到过)

例如,对单词向量进行循环,而不是将它们全部连接到一个大矩阵中,然后将softmax权值与该矩阵相乘(矢量化计算其实就是把单独的向量连接成一个矩阵进行计算)

结果:

  • 1000 loops, best of 3: 639 μs per loop
  • 10000 loops, best of 3: 53.8 μs per loop

(10x)更快的方法是使用拼接的矢量化计算

总是尝试使用向量和矩阵,而不是循环的对单个数据进行操作

自己测试测试就能发现~总的来说:矩阵太棒了

非线性化/激活函数

(常见的就是relu、tanh、sigmoid函数,不过本课程中介绍了一些其他形态)

参数初始化

  • 通常 必须将权重初始化为小的随机值 (这样才能在激活函数的有效范围内, 即存在梯度可以使其更新) 
  • 避免对称性妨碍学习/特殊化的 
  • 初始化隐含层偏差为0,如果权重为0,则输出(或重构)偏差为最优值(例如,均值目标或均值目标的反s形)
  • 初始化 所有其他权重 为Uniform(–r, r),选择使数字既不会太大也不会太小的 r
  • Xavier初始化中,方差与 fan-in(前一层尺寸)和 fan-out (下一层尺寸)成反比:

优化器

简单的SGD就可以了 ,然而,要得到好的结果通常需要手动调整学习速度
对于更复杂的网络和情况,或者只是为了避免担心,更有经验的复杂的 “自适应”优化器通常会令你做得更好,通过累积梯度缩放参数调整,如下优化器:

(想要详细了解这些优化器,可以参考本链接内容https://trickygo.github.io/Dive-into-DL-TensorFlow2.0/#/chapter07_optimization/7.1_optimization-intro

学习率

第一个思考:你可以用一个固定的学习速度。从lr = 0.001开始? 

  1. 它必须是数量级的——尝试10的幂
  2. 太大:模型可能会发散或不收敛
  3. 太小:你的模型可能训练不出很好的效果

第二个思考:如果你在训练时降低学习速度,通常可以获得更好的效果 

  1. 手工:每隔K个阶段(epoch)将学习速度减半 
  2. epoch = 遍历一次数据 (打乱或采样的)
  3. 通过一个公式: 
  4. 还有更新奇的方法,比如循环学习率(q.v.)

第三个思考:更高级的优化器仍然使用学习率,但它可能是优化器缩小的初始速度——因此可能可以从较高的速度开始

  1. 如上述优化算法有每个参数都拥有自己的可变的学习率的方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章