This lecture introduced
这节课介绍了根据上下文预测单词分类的问题,与常见神经网络课程套路不同,以间隔最大化为目标函数,推导了对权值矩阵和词向量的梯度;初步展示了与传统机器学习方法不一样的风格。
(word Window classification就是对语义的vector做分类)
1、Classification分类这个任务以及词向量在分类上的应用
Updating both the weight parameters and the word vectors
Window classification(窗口(上下文)分类)
2、Cross-entropy loss(交叉熵误差推导)、Max-margin loss
Cross-entropy: H(p,q) = H(p)+KL(p||q)
3、Back propagation for a single layer neural network
BP: applying the chain rule and reusing derivative calculations(单层神经网络、最大间隔损失(一种新的损失)和反向传播)
上课
2 Overview Today课程概述
什么是分类
一般情况下我们会有一个训练模型用的样本数据集
x是输入数据,比如:单词(所以或者向量)、上下文窗口、句子、文档
通过“更新”词向量内容去做分类任务,更新的是一些真实的信号,这里的类别:比如类别:情感、命名实体、买/卖
词向量有个下游任务:窗口分类
交叉啥和softmax的连接
然后是nn,从这里开始开始这节课为什么叫deep learning and nlp
对习题一、二都有帮助
我们今天会涉及到很多数学知识,也是第一次涉及到nn
3 Classifica6on setup and notation 分类任务的定义
看这个基本的定义和数学符号
有 输入 和 输出label(one-hot向量)
传统上认为是去找一个边界将数据集分开,比如说一个逻辑回归分类,要训练的就是W这个参数:使用比如逻辑回归分类2维词向量,得到线性决策边界。
一般的ML方法:假设x是确定的,训练逻辑回归只修改参数W,值改变决策边界
当然目的是最后预测x
4 Classifica6on intui6on
输出就是一个标签,但是比如机器翻译就是一个词
分类是一个另类的回归
i表示整个数据集,没有i表示一个数据
5 sofrmax算法细节
因为后面要求导 所以要清楚概念 softmax定义
总而言之,整理分为两步,y是类别,W的每一行为每一类的参数,该行每个去乘以每个x得到一个向量,再归一化,使得每个类相加=1
第一步:1、算第y类,就取权值矩阵W的第y行的每个元素乘以x的每个元素 之后累加.
第二步:2.归一化得到softmax函数的概率
6 softmax和交叉熵误差
由于是分类任务,所以希望输出的是概率最大的类别(最大化正确类别的概率),即argmax,最大化正确类别y的概率。
所以我们希望模型能够最大化概率==最大化对数概率==最小化对数概率的负数,就变为最小化为负log概率:
(作用:映射到(0,1)区间内,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标)
称之为交叉熵误差
7 为什么是交叉熵误差(交叉熵定义)
其实这个损失函数等效于交叉熵:
(公式推导)
假设一个真实的概率分布为:正确为1,错误为0。所以类别是one-hot向量。
由于p是一个one-hot向量,只有当左边是一个真实标签的负log概率。
p是真实的事实,q是softmax之后计算的
所以只有真实那一项非0,并不是求和复杂
(SVM只选自己喜欢的男神,Softmax把所有备胎全部拉出来评分,最后还归一化一下)
当我们对分类的Loss进行改进的时候,我们要通过梯度下降,每次优化一个step大小的梯度,这个时候我们就要求Loss对每个权重矩阵的偏导,然后应用链式法则。那么这个过程的第一步,就是对softmax求导传回去,不用着急,我后面会举例子非常详细的说明。在这个过程中,你会发现用了softmax函数之后,梯度求导过程非常非常方便!
举个例子说明一下上面两个slide:
定义选到y_i的概率是P=(e^(f_y_i)) / 求和e^j
然后求loss对每个权重矩阵的偏导,用链式法则
直接真正结果那一维减1,把偏导回传就行
所以交叉熵目的是最小化这两个分布的kl散度
8 kl散度:最小化两个分布之间的kl散度
交叉熵可以重新写成熵和KL散度两个分布:H(p,q)=H(p)+D_KL
因为H(P)是0,如果在求梯度时没有贡献,最小化上面等式,就是最小化KL散度的p和q。
KL散度不是一个分布,具有非对称性,但是是一种测量两个概率分布p和q差异的方法。
在信息论中,D(P||Q)表示当用概率分布Q来拟合真实分布P时,产生的信息损耗,其中P表示真实分布,Q表示P的拟合分布。)
9 全数据集上的分类
J=对所有正确类别的概率负对数求和
所以最终我们是想最小化这个J
接下来有很多公式推导
10 正则化
刚刚只是讨论了目标函数的前半部分,往往后面还有一个正则化项
斯塔是参数,就是鼓励权重尽可能小,接近于0
防止参数爆炸
一般的ML问题中,参数由权值矩阵的列组成维度不会太大。而在词向量或其他深度学习中,需要同时学习权值矩阵和词向量。参数一多,就容易过拟合
为了鼓励权重尽可能小,防止过拟合
图很重要x是很多变量,y是误差,模型越强某时候会出现过拟合
其实就是变得平滑
添加正则项来防止过拟合是机器学习中很常见的方式。在此正则也无特殊之处:
(视频中,称这个图是ML学习过程中最重要的图之一。。)
红线是test error,蓝线是training error,横轴是模型复杂度或迭代次数。直线是方差偏差均衡点。
11 细节:传统ml优化方法
一般的ML问题中,参数由权值矩阵的列组成维度不会太大。而在词向量或其他深度学习中,需要同时学习权值矩阵和词向量。参数一多,就容易过拟合:
因为不止权重 还有词向量的维度
比如300维*1w个词
12 分类不同的词向量
参数量=类别*词向量维度
由于词向量也要学习,可以反向传播到词向量
将词向量作为总体目标函数的一部分来去训练
13 新练词向量使失去泛化
因为同时需要同时学习权值矩阵和词向量,所以基于词向量的分类问题参数拟合,还会造成re-training词向量失去泛化效果。
比如:对电影评论数据情感分析训练逻辑回归单词在训练数据中有“TV” and “telly”,在测试数据中有“television”,在于训练词向量中他们是相似的单词。(来自于已经训练的词向量模型)
14 当我们重新训练了词向量会发生什么?
1)在训练集中的单词会被重新安排到合适的位置
2)在已经训练的词向量模型中但是不在训练集中的单词将保留在原来的位置
对于上例, “TV”和”telly”会被重新安排,而”television”则保留在原位,尴尬的事情就发生了:
训练数据中的数据运动了,预训练的词没有出现在训练数据中。这个例子说明,如果任务的语料非常小,则不必在任务语料上重新训练词向量,否则会导致词向量过拟合。
于是在测试集上导致television被误分类。
15 Take home message:
这个例子说明: 启示:
当我们的训练数据集很小,我们不能训练词向量,会出现过拟合,失去泛化能力。
如果数据量很大,训练应该就会得到很好的词向量结果。
所以可以直接用google训练好的word2vec,如果测试集词少
但是如果词多,就要重新训练
16 词向量相关术语
1、词向量矩阵L也叫lookup table(d * V维)。
2、词向量=词嵌入=词表示
3、主要方法有word2vec、Glove。(张乾 包慧语)
Word vectors = word embeddings = word representations (mostly)
4、这样的就表示为词的特征。L=d*V d维 V个词
5、新方向(课程后):character models
17 Window classification
这是一种根据上下文给单个单词分类的任务,可以用于消歧或命名实体分类。上下文Window的向量可以通过拼接所有窗口中的词向量得到:
这是一个列向量。
1、分类一个单词很少去做。
2、关注的问题就像:上下文出现的歧义。(消歧)
18 Window classification
比如,以为一个四分类为例子:人名地面组织 非
19 Window classifica6on
这是当时第一个文本分类
针对2.3.1中提到的问题,windows classification的思路为:将对一个单词进行分类的问题扩展到对其临近词和上下文窗口进行分类,就是对窗口中的单词打上标签同时把它前后的单词向量进行拼接然后训练一个分类器
3、想法:分类一个在上下文窗口中的词。(命名实体识别)
4、在上下文中分类一个词很可能存在,比如:在窗口中平均每一个单词但是可能失去了位置信息。
5、通过给中心词设置一个标签来训练softmax分类器,并把他周围的词向量连接起来。
本节向量是列向量
x是5d维向量
20 Simplest window classifier: Softmax
5个词向量拼接放进softmax
公式跟之前一样,yhat表示正确的
step1.目的是预测P(y|x),用softmax分类器
step2.跟之前一样,使用交叉熵loss
注意:softmax中的W*x就是交叉熵里的f_y_i
怎么更新词向量呢?
21 更新词向量
我们可以多次求导
定义变量,
yhat是归一化之后的得分输出
t是onehot向量,目标分布
f是一个矩阵乘法
22 更新词向量
J对x求导,注意这里的x指的是窗口所有单词的词向量拼接向量
变量相乘, 提示1:仔细定义变量和跟踪它们的维度
链式法则, 提示2:懂得链式法则(chain rule)并且记住在哪些变量中含有其他变量
23 更新词向量
变量相乘, 提示1:仔细定义变量和跟踪它们的维度
链式法则, 提示2:懂得链式法则(chain rule)并且记住在哪些变量中含有其他变量
提示3:对于softmax中求导的部分:首先对当c=y(正确的类别)求导,然后对当(其他所有非正确类别)求导
24 更新词向量
提示4:当你尝试对f中的一个元素求导时,试试能不能在最后获得一个梯度包含的所有的偏导数
提示5:为了你之后的处理不会发疯,想象你所有的结果处理都是向量之间的操作,所以你应该定义一些新的,单索引结构的向量
谁是谁的参数,在链式法则里面,f_y即是y的也是x的函数
分两种情况,c是正确的和错误的
25 更新词向量
提示6:当你开始使用链式法则时,首先进行显示的求和(符号),然后再考虑偏导数,例如 or 的偏导数
提示7:为了避免之后更复杂的函数(形式),确保知道变量的维度,同时将其简化为矩阵符号运算形式
提示8:如果你觉得公式不清晰的话,把它写成完整的加和形式
正确的-1
错误的不动
step3。J对x求导,注意这里的x指的是窗口所有单词的词向量拼接向量。
step4.于是就可以更新词向量了:
26 更新词向量
行向量装置,求和项变成内积
求和项是一定可以重写成向量的
27 更新词向量
梯度的维度?5d
注意:如果维度不相等,那就是有bug
28 Updating concatenated word vectors
接下来只需要求导就好了(对求导,注意这里的指的是窗口所有单词的词向量拼接向量。)。
更新的计算词向量每个元素的梯度
拆分window,变成每个词向量
29 更新词向量
step5.另一方面,对W求偏导数
将W和词向量的偏导数写到一起
现在缺少的是关于权重的偏导
再加上刚刚词向量的偏导
30 实现的细节
有两个比较复杂度高的运算, 在softmax中有两个代价昂贵的运算: 矩阵运算 f = Wx 和 exp指数运算
for不好,矩阵乘法更好
在做同样的数学运算时for循环永远没有矩阵运算有效
基础知识小课堂:
在softmax中有两个代价昂贵的运算: 矩阵运算 f = Wx 和 exp指数运算
在做同样的数学运算时for循环永远没有矩阵运算有效,遍历词向量 VS 将它们拼接为一个大的矩阵 然后分别和softmax的权重矩阵相乘
31 代码
遍历词向量 VS 将它们拼接为一个大的矩阵 然后分别和softmax的权重矩阵相乘
遍历词向量,而不是拼接成一个大的 是不好的
结果证明矩阵相乘更有效
矩阵运算更优雅更棒
应该更多的去测试你的代码速度
32 代码
33 Softmax (= logistic regression) alone not very powerful(效果有限)
softmax方法仅限于较小的数据集,能够提供一个勉强的线性分类决策边界。
34 Softmax 效果有限
1、softmax只是在原始空间上得到一个线性分类边界。
2、小数据集上有一个好的效果。
3、大数据集效果有限。
35 Neural Nets for the Win!
window classification在少量的数据上(正则化)效果会不错,在大量的数据上效果会有限,softmax仅仅给出线性决策边界举例:
但是神经网络能够提供非线性的决策边界:
于是我们使用神经网络
非线性好很多
36 转折
从逻辑disi回归到nn
37 Demystifying neural networks
一些简单的介绍
有输入 偏置 激活函数 输出
如果你了解softmax的运行机制,那你就已经了解了一个基本的神经元的运行机制
例子:一个神经元就是一个基础的运算单位,拥有n(3)个输入和一个输出,参数是W, b
每个神经元是一个二分类逻辑斯谛回归单元
38 每个神经元是一个二分类逻辑斯谛回归单元:
一个神经网络等价于同时运行了很多逻辑回归单元,神经网络同时运行多个逻辑斯谛回归,但不需要提前指定它们具体预测什么
基本上你可以把它看做成一个二元逻辑回归单元
看内部结构
有权重跟输入相乘,加上偏置
激活函数,就是使之接近于1的非常高的概率
这里是sigmoid,映射到0-1之间
39 神经网络同时运行多个逻辑斯谛回归,但不需要提前指定它们具体预测什么:
把输入向量喂给这些小的逻辑回归函数和神经元,就有了输出
然后我们就有了多层神经网络
40 神经网络同时运行多个逻辑斯谛回归,但不需要提前指定它们具体预测什么:
如果我们给一批逻辑回归函数一堆输入向量,我们就得到了一批输出向量… ,这些输出又可以作为其他逻辑回归函数的输入
我们把预测结果喂给下一级逻辑斯谛回归单元,由损失函数自动决定它们预测什么:
41 神经网络同时运行多个逻辑斯谛回归,但不需要提前指定它们具体预测什么:
所以多层神经网络就是这样一些节点的连接
42 每一层的矩阵
这些连接都可以用矩阵相乘的简单形式去描述
神经网络中单层的矩阵符号表示
我们有激活函数: a1=
a2=
表示成矩阵符号形式:
中间变量(链式法则的时候需要去表示)
z=Wx+b
a=f(z)
w的行数是神经元个数,列数是输入x的维度
f(z)也是个向量
其中f应用的是element-wise规则(也就是点乘):
f([z1,z2,z3])=[f(z1),f(z2),f(z3)]
43 为什么非线性
为什么需要非线性的f?没有非线性函数,深度神经网络相对于线性变换价值不大,其他的层次会被编译压缩为单个的线性变换:,有了更多的层次,它们可以逼近更复杂的函数
因为线性系统所有层等效于一层:
而非线性模型可以捕捉很复杂的数据:
(隐层越多,越拟合)
44 neural net window classifier
回到窗口分类器, 一个更牛的窗口分类器
单个(神经网络)层是一个线性层(函数)和非线性函数的组合
输入和输出之间就多了隐藏层
定义一个单层神经网络
输入x是多个词向量的拼接
a是最终分类层的输入
默认softmax分类器
45 A Single Layer Neural Network
46 Feed-forward Computa6on
得到每个窗口,然后计算得分,使得中心词是ner位置的窗口能得到高分
以简单三层神经网络为例:
这种红点图经常在论文里看到,大致代表单元数;中间的空格分隔开一组神经元,比如隐藏层单元数为2 \times 4。U是隐藏层到class的权值矩阵:
一个简单的网络:
这种红点图经常在论文里看到,大致代表单元数;中间的空格分隔开一组神经元,比如隐藏层单元数为2×4
U是隐藏层到class的权值矩阵,其中a是激活函数:
x是所有词的拼接
维度:每个词4维,x是20维,隐藏层有8个单元,w维度是8行20列,U是列向量
47 extra layer
隐藏层作用是学习不同输入词之间的非线性相互作用
48 The max-margin loss
怎么设计目标函数呢,记s_c代表误分类样本的得分,s表示正确分类样本的得分。则朴素的思路是最大化(s−s_c) 或最小化 (s_c−s)。但有种方法只计算s_c>s⇒(s_c−s)>0时的错误,也就是说我们只要求正确分类的得分高于错误分类的得分即可,并不要求错误分类的得分多么多么小。这得到间隔最大化目标函数, 可以调整其他参数使得该间隔为1:
这实际上是将函数间隔转换为几何间隔,类似于svm
很强大损失函数,比sofatx更rubest,
本质是让正确窗口的得分更大,错误窗口得分更小,直到足够好(参数为1)
sgd
softmax只是分开了,这里是使得间隔更大
另外,这个目标函数的好处是,随着训练的进行,可以忽略越来越多的实例,而只专注于那些难分类的实例。
49 Max-margin Objec6ve func6on
错误是s_c(负样本),通常通过负采样算法得到负例。
50 Training with Backpropaga6on
J>0
随机初始化
51 Backpropagation
这些参数U b W x
s关于U的导数是a
一些定义
52 Training with Backpropaga6on
把他们放在一起,就可以得到一个更复杂的矩阵表达
w_ij只出现在隐层的第i个激活层
看图,三维输入,两个隐层单元,一个最后的得分U
如果去求W_23的导数,只有a2需要
53 Training with Backpropaga6on
意思就是,如果要求W_23,只用考虑a的第i个元素,不用考虑整个内积
U是常量,把u拿出来
第二行公式:把a_i换成f(z),设导数
z_i定义在右边
上面都是链式法则
54 Training with Backpropaga6on
现在对W_ij来做
最后就有了表达式
因为只用了下标i,所以简化记号,而x是输入
55 Training with Backpropaga6on
现在想得到整个式子的导数
用derta来乘以x的转置,作为外积
W是2*3维,derta二维,
56 Training with Backpropaga6on
求导最后一项是b_i
导数就是derta
57 Training with Backpropaga6on
这就完成了,只需要求导和链式法则
用更高层的值去算底层的导数
58 Training with Backpropaga6on
对得分求导,把词向量拼接
对多个激活单元进行求导(比如右边公式的两个)
就得到了derta乘以W_ij
是与内积相关的
反向传播是用之前计算的值的导数
因为有求和,求和是内积的第j项,点乘在第一项后面。取出一类,作为一个列向量,然后做点乘得到答案
并行计算所有参数的
只更新当前窗口的词
59 Pu[ng all gradients together:
结合一个x的参数变成整个,就是w转置乘以derta
放在一起,max是目标函数,所有有灯饰,1或者0,正确和错误x x_c
derta是第k层的误差
δ(k)=f′(z(k))∘(W(k)Tδ(k+1)
δ(k)=f′(z(k))∘(W(k)Tδ(k+1)
算梯度:
相乘就行
60 Summary
通过一个三层神经网络计算这个窗口向量的得分:s = score(museums in Paris are amazing)