向AI转型的程序员都关注了这个号👇👇👇
机器学习AI算法工程 公众号:datayx
斯坦福大学CS224n(全称:深度学习与自然语言处理)是自然语言处理领域很受欢迎的课程,由 Chris Manning 和 Richard Socher 主讲。
但是自 年以来,NLP 有了很多重大的变化,包括 Transformer 和预训练语言模型等。以前开放的是 17 年年初的课程,很多激动人心的前沿模型都没有介绍,而今年年初 CS224n 终于开始更新 19 年课程的视频。
这门课程为深入学习NLP应用的前沿研究提供了深入的探索。课程最后的项目将涉及训练复杂的循环神经网络并将其应用于大型NLP问题。
在模型方面,将涵盖词向量表示,基于窗口的神经网络,循环神经网络,长短期记忆模型,递归神经网络,卷积神经网络以及一些涉及 memory component 的非常新的模型。
课程视频、Pytorch实现代码获取方式:
斯坦福CS224n深度学习自然语言处理笔记(3)反向传播与计算图
目录
1. 矩阵梯度下降及一些小贴士
1.1 梯度下降
1.2注意事项
1.3 窗口模型中的梯度下降
1.4 使用词向量的陷阱
2. 计算图模型与反向传播
2.1 单个结点的反向传播
2.2 一个具体的例子
2.3 自动求导
3.其他一些注意事项
3.1 正则项
3.2 向量矩阵化
3.3 激活函数
3.4 优化器
1. 矩阵梯度下降及一些小贴士
1.1 梯度下降
还是上节课的梯度下降,我们首先回顾一下:
1.2注意事项
仔细定义你的变量并追踪他们的维度变化。
链式法则要注意,注意链式法则的每一步求导。
对于softmax函数,首先考虑微分正确类型的函数,其次再考虑微分错误类型的函数。
如果你对矩阵计算比较困惑,你可以计算出每一个元素的偏导。
使用维度控制,当你计算每一步时,应当从理论上控制每一步中每一个运算的矩阵长宽对应。
1.3 窗口模型中的梯度下降
就像我们上节课所说的那样,在命名实体识别中,使用窗口模型来预测当前窗口中心词是否是实体。在梯度下降更新时,我们对于窗口中每一个词进行更新,如果这个词出现过两次,那么它会被更新2次。
1.4 使用词向量的陷阱
如果我们重新训练我们的词向量在我们的任务中,如果在训练集和测试集中的单词不能够也很好的覆盖,那么可能会出现词汇改变不同步现象。例如在预训练语料中存在TV,telly和Television,这三个词时同义词,其向量位置也很一致。
这种情况对于分类来讲时非常不好的。
所以我们在进行训练时,该怎么做?
Q1我是否应该使用预训练的词向量模型?
答案是在多数情况下当然是这样。因为预训练模型会拥有更多的先验知识,这意味着词向量不仅知道关于你的训练数据中的含义,还知道的更多。那如果数据集中包含极大的数据例如10亿词汇(一般会出现在机器翻译中,常用语言如中文和英文的双语语料很容易找到这么多数据),这时候可能词向量并不够使用,那么更好的建议是随机初始化后再进行训练。
Q2在使用预训练的词向量模型时,我是否应该微调它?
回答时如果你拥有一个小训练集,那么应该固定词向量。如果你同样拥有一个大的数据集,那么你可以进行微调词向量在你的任务中。
2. 计算图模型与反向传播
这里我们详细讲述计算图模型与反向传播过程,这两个是所有深度学习框架的基石。
回到刚开始的例子,我们仍然以此为例:
在计算图模型中,数据是以流动的形式完成计算,按照数据流动的方向,我们分为前向传播和反向传播两个部分。
所谓的前向传播则是按照给定的输入,从左到右依次计算即可,就像我们正常的计算一样。
而反向传播,则是神经网络的独特之处,它自右向左依次求偏导后将误差传播回各个部分以更新参数(图中蓝色箭头所指)。
这些偏导我们在上节课中都已经讲过了,根据链式法则求导即可。
2.1 单个结点的反向传播
单个节点的梯度分为3个部分,上游梯度(upstream),局部梯度(local)和下游梯度(downstream),他们之间的关系是:
对于有多个输入而言,则是分别计算其偏导即可。
2.2 一个具体的例子
这里以一个具体的例子来详细描述一下如何进行反向传播。
在计算梯度时遵循一下3个法则:
如果遇到像y一样的时候,它的梯度有2个来源,甚至多个来源时,将这些梯度进行相加获得总梯度。
如果遇到像y和z这种二选一的时候,则只需传播已选中的节点梯度。
所有的相互连接的梯度都使用乘法进行传播。
还是像我们之前说的那样,运用链式法则,我们会尽可能的减少重复计算量。
2.3 自动求导
一般的,计算图模型中我们需要对于节点的运算进行求导。对于简单的表达式,都会自动的求导。而如果是比较复杂的式子,可能需要你手动指出该式的导数。下面我们使用具体的例子来说明如何求导。
一般的一个计算图模型的代码如下所示:
当然,这只是一种验证手段,在早期的时候,人们都是这样做的。但是现在人们都不会这样做了,因为人们早已经证明这个是正确的,并且编写了如Tensorflow和Pytorch这种库能够进行调用。
现在的深度学习框架都已经可以自动求梯度,如果考虑Keras,完全可以连一些基本的计算图模型都不需要掌握就可进行实验。那么我们为什么要了解这些关于梯度的细节呢?
可以更好的理解整个架构。
可以更好的调试和改进模型。
对于后来的教程如RNN的时候还会有所提及。
3.其他一些注意事项
3.1 正则项
在我们的模型汇中,有大量的参数,这时候,需要使用正则项来防止过拟合遐想的发生。所谓的过拟合现象指的是当我们的训练错误不断减少时,测试错误则是先下降后上升,如图所示。
解决这个方法通常使用正则项,一般的使用L1正则和L2正则,L1正则项取决于保留较少且更重要的参数,L2正则项取决于保留较小的参数,使得模型泛化性更好。
有很多参考说L1相较于L2更好,这里考虑的是最终解的形式,一般的,L1具有稀疏解,它可以找到更加重要的参数和特征。但是正是因为L1具有稀疏解,因此它并没有解析解,需要依靠稀疏算法进行求解,这就使得L1的算法并没有L2算法更加高效。
3.2 向量矩阵化
使用矩阵化可以使用数学方法在GPU/CPU中分布式加速运算,一般的都可以达到10倍以上的加速效果。
3.3 激活函数
在上一讲中,我们就叙述了为什么要使用激活函数。在此处,我们列举一些常见的激活函数。
还要Leakly ReLU和Parametric ReLU等,尽管sigmoid和tanh等在某些情况下仍然被使用,但是一般的我们使用ReLu函数作为常用函数。
3.4 优化器
在初始化参数时,一般使用随机初始化,但是不能够太大或者太小。
在选择优化器时,一般使用SGD即可,其他情况下可用的优化器包括(Adagrad, RMSprop, Adam,SparseAdam)等,现在常用的主要是Adam,详情可以看《优化器详解》。
/guoyaohua/p/8542554.html
优化器和学习率相关。一般的优化器如SGD不会对学习率进行改变,此时学习率是一个较小的值如lr=0.001。太大有可能会发散或根本不收敛。太小的话可能没办法尽早的收敛。
我们手动可以调节学习率,使得在刚开始时学习率大一些,因为此时我们离最终目标可能会很远,然后随着不断逼近目标,我们减小我们的学习率(这有点像打高尔夫球)。而其他的一些优化器如Adam等都会对于学习率进行动态调节。
阿里云双11大促 服务器ECS 数据库 全场1折
活动地址
1核2G1M,86一年,¥229三年
2核4G3M,¥799三年
2核8G5M,¥1399三年
......
阅读过本文的人还看了以下文章:
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加:datayx
长按图片,识别二维码,点关注
AI项目体验
https://loveai.tech