原文地址
cs224n系列博客笔记主要基于cs224n-2019,后续也会新增 CS224n-2020 里的更新部分:CS224n-2020 并未更新 Note 部分,但课程的部分课件进行了教学顺序上的调整与修改(Suggested Readings 也相应变动),需要注意的是三个 Guest Lecture 都是全新的。
本文为 Lecture 03 Word Window Classification,Neural Networks, and Matrix Calculus 与 Notes 03 Neural Networks, Backpropagation 的笔记。
Useful links
- 课程官网:Stanford CS224n || Stanford CS224n-2019
- 课程材料:LooperXX/CS224n-Resource || LooperXX/CS224n-Reading-Notes
- 课程视频:YouTube
- 国内视频资源:2019版|英文字幕(仍在更新) || 2019版|英文字幕(全)||2017版|中英字幕
Lecture 03 Word Window Classification,Neural Networks, and Matrix Calculus
Lecture Plan
- Classification review/introduction
- Neural networks introduction
- Named Entity Recognition
- Binary true vs. corrupted word window classification
- Matrix calculus introduction
提示:这对一些人而言将是困难的一周,课后需要阅读提供的资料。
Classification setup and notation
通常我们有由样本组成的训练数据集
x i x_i xi? 是输入,例如单词、句子、文档(索引或是向量),维度为d
y i y_i yi? 是我们尝试预测的标签( C个类别中的一个),例如:
- 类别:感情,命名实体,购买/售出的决定
- 其他单词
- 之后:多词序列的
Classification intuition
训练数据: { x i , y i } i = 1 N \{x_i,y_i\}_{i=1}^{N} {
xi?,yi?}i=1N?
- 固定的二维单词向量分类 (输入是单词向量(2维),输出是单词对应的类别标签)
- 使用softmax/logistic回归
- 线性决策边界
传统的机器学习/统计学方法:假设 x i x_i xi? 是固定的,训练 softmax/logistic 回归的权重 W ∈ R C × d W\in R^{C\times d} W∈RC×d来决定决策边界(超平面)
方法:对每个 x ,预测:
我们可以将预测函数分为两个步骤:
- 将权重矩阵W的第y行(类别y对应的权重)和输入(特征)向量 x做内积得到类别y对应的分数:
- 使用softmax函数获得归一化的概率(当前输入x属于类别y的概率)
Training with softmax and cross-entropy loss
对于每个训练样本 (x,y) ,我们的目标是最大化正确类 y 的概率,或者我们可以最小化该类的负对数概率。
Background: What is “cross entropy” loss/error?
- 交叉熵”的概念来源于信息论,衡量两个概率分布之间的差异
- 令真实概率分布为 p
- 令我们计算的模型/输出概率为 q
- 交叉熵为
- 假设 groud truth (or true or gold or target)的概率分布在正确的类上为1,在其他任何地方为0: p = [ 0 , . . . 0 , 1 , 0 , . . . , 0 ] p = [0,...0,1,0,...,0] p=[0,...0,1,0,...,0]
- 因为 p 是独热向量(one-hot),所以上述求和中唯一剩下的项是真实类的负对数概率
Classification over a full dataset
- 在整个数据集 x i , y i i = 1 N {x_i,y_i}_{i=1}^N xi?,yi?i=1N?上的交叉熵损失函数,是所有样本的交叉熵损失的均值
我们不使用
我们使用矩阵来表示 f:
Traditional ML optimization
- 一般机器学习的参数 θ \theta θ,通常只由W的列组成(把权重矩阵W的每一列 拼接在一起 构成一个大的列向量)
- 因此,我们只通过以下方式更新决策边界(计算每个参数的梯度,参数向量的梯度和参数是同维的)
Neural Network Classifiers
- 单独使用Softmax(≈logistic回归)并不十分强大
- Softmax只给出线性决策边界
1)这可能是相当有限的,当问题很复杂时(线性不可分)是无用的
2)改善这些局限不是很酷吗?
Neural Nets for the Win!
神经网络可以学习更复杂的函数和非线性决策边界
更高级的分类需要:
- 词向量
- 更深层次的深层神经网络
Classification difference with word vectors
一般在NLP深度学习中
- 我们学习了矩阵 W 和词向量 x
- 词向量是对独热向量的重新表示:即将词向量理解为一层神经网络,输入单词的独热向量(或单词索引)并获得单词的词向量表示(在词嵌入矩阵中查询),并且我们需要对其进行更新(也是模型参数的一部分)。其中,Vd是数量很大的参数(V是词典的大小,d是词向量的维度)
Neural computation
An artificial neuron
- 神经网络有自己的术语包
- 但如果你了解 softmax 模型是如何工作的,那么你就可以很容易地理解神经元的操作
A neuron can be a binary logistic regression unit:
b:我们可以有一个“总是打开”的特性,它给出一个先验类,或者将它作为一个偏向项(偏置)分离出来
w, b: 是神经元的参数
A neural network = running several logistic regressions at the same time
如果我们输入一个向量通过一系列逻辑回归函数,那么我们得到一个输出向量,但是我们不需要提前决定这些逻辑回归试图预测的变量是什么。
我们可以输入另一个logistic回归函数。损失函数将指导中间隐藏变量应该是什么,以便更好地预测下一层的目标。我们当然可以使用更多层的神经网络。
Matrix notation for a layer
- f(x) 在运算时是 element-wise 逐元素的
Non-linearities (aka “f ”): Why they’re needed
例如:函数近似,如回归或分类
- 没有非线性,深度神经网络只能做线性变换
- 多个线性变换可以组成一个的线性变换(多个线性变换可以用一个线性变换等价表示) W 1 W 2 x = W x W_1W_2x = Wx W1?W2?x=Wx. 因为线性变换是以某种方式旋转和拉伸空间,多次的旋转和拉伸可以融合为一次线性变换
- 对于非线性函数而言,使用更多的层,他们可以近似/拟合更复杂的函数
Named Entity Recognition (NER)
- 任务:例如,查找和分类文本中的名称 (序列标注任务的一种,对序列中每个元素打标签)
- 可能用途
1)跟踪/识别文档中提到的特定实体(如组织名、人名、地点、歌曲名、电影名等)
2)对于问答,答案通常是命名实体
3)许多需要的信息实际上是命名实体之间的关联
4)同样的技术可以扩展到其他 slot-filling 槽填充分类(序列标注任务) - 通常后面是命名实体链接/规范化到知识库/知识图谱
Named Entity Recognition on word sequences
我们通过在上下文中对每个单词打标签(基于实体标签集合进行多分类)。
Why might NER be hard?
- 很难计算出实体的边界
第一个实体是 “First National Bank” 还是 “National Bank” - 很难知道某物是否是一个实体
是一所名为“Future School” 的学校,还是这是一所未来的学校? - 很难知道未知/新奇实体的类别
“Zig Ziglar” ? 一个人 - 实体类是模糊的,依赖于上下文
这里的“Charles Schwab” 是 PER 不是 ORG
最近还有一些挑战如:细粒度命名实体识别、嵌套命名实体识别、间隔命名实体识别
Binary word window classification
为在上下文中的语言构建分类器
- 一般来说,很少对单个单词进行分类
- 有趣的问题,如上下文歧义出现
- 例子:auto-antonyms
1)“To sanction” can mean “to permit” or "to punish”
2)“To seed” can mean “to place seeds” or “to remove seeds” - 例子:解决模糊命名实体的链接
1)Paris → Paris, France vs. Paris Hilton vs. Paris, Texas
2)Hathaway → Berkshire Hathaway vs. Anne Hathaway
Window classification
- 思想:在相邻词的上下文窗口中对一个词进行分类
- 例如,上下文中一个单词的命名实体分类(人、地点、组织、非命名实体)
- 在上下文中对单词进行分类的一个简单方法可能是对窗口中的单词向量进行平均,并对平均向量进行分类。问题:这会丢失位置信息
Window classification: Softmax
- 训练softmax分类器对(窗口)中心词进行分类(打实体标签),方法是在一个窗口内将中心词周围的词向量串联起来
- 例子:在这句话的上下文中对“Paris”进行分类,窗口长度为2
- x w i n d o w = x ∈ R 5 d x_{window} = x \in R^{5d} xwindow?=x∈R5d是一个列向量
Simplest window classifier: Softmax
对于 x = x w i n d o w x=x_{window} x=xwindow?,我们可以使用与之前相同的softmax分类器:
- 如何更新向量(参数)?简而言之:就像上周那样,求导和优化
Binary classification with unnormalized scores
- 之前的例子:
- 假设我们要对中心词是否为一个地点,进行分类
- 与word2vec类似,我们将遍历语料库中的所有位置。但这一次,它将受到监督,只有一些位置能够得到高分。
- 例如,在他们的中心有一个实际的NER Location的位置是“真实的”位置会获得高分
Binary classification for NER Location
- 例子:Not all museums in Paris are amazing
- 这里:一个真正的窗口,以Paris为中心的窗口和所有其他窗口(它们的中心词不是位置实体)
museums in Paris are amazing - 其他窗口很容易找到,而且有很多:任何中心词没有在我们的语料库中明确标记为位置实体的窗口
Not all museums in Paris
Neural Network Feed-forward Computation
使用神经激活输出 a 简单地给出一个非标准化的分数:
我们用一个三层神经网络计算一个窗口的得分。
Main intuition for extra layer
中间层学习输入词向量之间的非线性交互
例如:只有当“museum”是第一个向量时,“in”放在第二个位置才重要
The max-margin loss
- 关于训练目标的想法:让真实窗口的得分更高,而其他窗口的得分更低(直到足够好为止
- 单窗口的目标函数为
- 窗口的中心词是位置实体时得分比窗口的中心词不是位置实体的得分高1分
- 要获得完整的目标函数:为每个真窗口采样几个其他(损坏)窗口。对所有窗口求和
- 类似于word2vec中的负抽样
- 使用SGD更新参数
- 如何计算参数梯度 ? θ J ( θ ) \nabla_{\theta} J(\theta) ?θ?J(θ)
1)手工计算(本课)
2)算法:反向传播(下一课)
Computing Gradients by Hand
- 回顾多元导数
- 矩阵微积分:完全矢量化的梯度
1)比非矢量梯度快得多,也更有用
2)但做一个非矢量梯度可以是一个很好的实践;以上周的讲座为例
3)notes 3更详细地涵盖了这些材料
Gradients
-
给定一个函数,有1个输出和1个输入
-
斜率是它的导数
-
给定一个函数,有1个输出和 n 个输入 (输入是一个向量)
-
x向量的梯度与x同维度,就是对向量中每个元素求偏导数
Jacobian Matrix: Generalization of the Gradient -
给定一个函数,有 m 个输出和 n 个输入
-
其雅可比矩阵是一个 m × n m\times n m×n的偏导矩阵
Chain Rule
对于单变量函数:乘以导数
对于一次处理多个变量:乘以雅可比矩阵:
Example Jacobian: Elementwise activation Function
由于使用的是 element-wise,所以 h i = f ( z i ) h_i = f(z_i) hi?=f(zi?)
函数有n个输出和n个输入 → n×n 的雅可比矩阵:
Other Jacobians
这是正确的雅可比矩阵。稍后我们将讨论“形状约定”;用它则答案是 h 。
Back to our Neural Net!
如何计算 ? s ? b \frac{\partial{s}}{\partial{b}} ?b?s??
实际上,我们关心的是损失的梯度,但是为了简单起见,我们将计算分数的梯度.
Break up equations into simple pieces
Apply the chain rule
如何计算 ? s ? W \frac{\partial{s}}{\partial{W}} ?W?s??
前两项是重复的,无须重复计算:
其中, d e l t a delta delta 是局部误差符号.
Derivative with respect to Matrix: Output shape
- W ∈ R n × m W\in R^{n\times m} W∈Rn×m, ? s ? W \frac{\partial{s}}{\partial{W}} ?W?s?的形状和W是一致的
- 1个输出, n × m n\times m n×m个输入:1 × nm 的雅可比矩阵?
不方便更新参数:
- 而是遵循惯例:导数/梯度的形状是参数的形状 (形状约定)
- ? s ? W \frac{\partial{s}}{\partial{W}} ?W?s?的形状是 n × m n\times m n×m
Derivative with respect to Matrix
Why the Transposes?
What shape should derivatives be?
反向传播:
- 算法高效地计算梯度
- 将我们刚刚手工完成的转换成算法
- 用于深度学习软件框架(TensorFlow, PyTorch, Chainer, etc.)