【CS224n】笔记45 Word Window分类与神经网络和反向传播

2023-10-24 01:40

本文主要是介绍【CS224n】笔记45 Word Window分类与神经网络和反向传播,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这节课介绍了根据上下文预测单词分类的问题,推导了对权值矩阵和词向量的梯度,初步展示了深度学习与传统机器学习方法不一样的风格。


笔记概要

1、分类的一些主要符号
2、主要思想

2.1、机器学习角度的分类
2.2、基于softmax分类器的定义
2.3、softmax分类器损失函数定义
2.4、需要更新的参数
2.5、参数过多导致的过拟合&&正则化解决方式
2.6、softmax分类器损失函数最终定义
3、训练过程中是否应该重训练(retrain)词向量
4、基于window的词分类任务
4.1、基于window的分类器定义
4.2、 一个简单的基于window的softmax分类器
4.3、 基于window softmax分类器的求梯度过程
5、基于神经网络的词分类任务
5.1、神经网络的优势
5.2、神经网络的前向传播
5.3、NER2分类问题假设
5.4、神经网络的反向传播
6、总结
7、项目建议

1、分类的一些主要符号

说到分类任务,我们一般会有一个数据集包含样本:
xi:是一个 d维向量,表示输入,比如单词(序号或者向量),上下文窗口,句子,文档等等。
yi:是一个 C维one-hot向量,表示我们尝试预测的标签,比如分类:情感、命名实体、买卖决策;其他的单词;或者是多单词的句子。
N:总数。
{ x i , y i } i = 1 N \left \{ x_{i}, y_{i}\right\}_{i=1}^{N} {xi,yi}i=1N

2、主要思想

2.1、机器学习角度的分类

如下图,从机器学习的角度来看:假设词向量x是固定的,仅仅更新的是逻辑回归的权重W意味着仅仅修改的是决策边界。
下面是一个简单的通过逻辑回归的线性决策边界,对映射到二维空间的词向量进行分类的图例:
在这里插入图片描述

2.2、基于softmax分类器的定义

我们在训练集中xi,yi已知的情况下,通过学习逻辑回归的权重W得到决策边界。其中W代表权重矩阵,C代表分类标签的个数,d代表x的维度。
所以在W已知的情况下,对于每个输入x,他被分为yi标签的概率公式为:
p ( y i = 1 ∣ x ) = e x p ( W j . x ) ∑ c = 1 C e x p ( W c . x ) p(y_{i}=1|x)=\frac{exp(W_{j}.x)}{\sum_{c=1}^{C}exp(W_{c}.x)} p(yi=1x)=c=1Cexp(Wc.x)exp(Wj.x)

W j . x W_{j}.x Wj.x代表W的第j行与x列的点乘
整个公式即:取权值矩阵的某一行乘上输入向量,归一化得到概率。最后会得到该输入x被分类为y1,y2,y3 …的概率,选取最大概率值即为它的类别。

点乘/内积 的几何意义是可以用来表征或计算两个向量之间的夹角,即相似度。注意:点乘的结果是一个标量(数量而不是向量)。
外积,又叫叉乘、叉积向量积:其运算结果是一个向量而不是一个标量。

2.3、softmax分类器损失函数定义

对于每一个样本,我们的目标是最大化xi 被正确分类成yi的概率,最大化上述公式等价于最小化该分类的负对数概率(一般都转化为最小化问题):
在这里插入图片描述

接下来的问题是如何利用针对所有样本的所有可能分类的表达式表现出只针对正确分类的对数概率,这里主要引入了交叉熵(cross
entropy)的概念,其中P(c)表示一个分布,代表真实的样本是c类的概率,是一个one-hot向量,只有在c是正确分布的时候才取1,其他时候都取0;而q(c)表示的是我们在上面计算的softmax的概率,这样我们就利用一个针对所有可能的公式表示了正确分类的对数概率:

在这里插入图片描述

交叉熵(cross entropy)可以进一步进行化简,分为两个部分:
在这里插入图片描述
这其中的H(p)实际上公式是:
在这里插入图片描述
我们可以看到,这个H(p)是信息熵,DKL(p||q)KL散度是相对熵,交叉熵=信息熵+相对熵。
由于H(p)常常是一个常数,那么由上面这个公式我们可以知道,最小化交叉熵,实际上就是最小化DKL(p||q)。因此求这个式子的最小值等价于求第二项的最小值。
DKL(p||q)并不是一个距离,而是对两个概率分布(p和q)之差的非对称度量。

在这里插入图片描述

由以上描述我们可以得到对于整个训练集{xi,yi},损失函数的形式如下,是一个平均交叉熵损失函数。
在这里插入图片描述

2.4、需要更新的参数

在一般的机器学习中,θ通常由W组成:
在这里插入图片描述
一般的ML问题中,参数由权值矩阵的列组成维度不会太大。而在词向量或其他深度学习中,需要同时学习权值矩阵和词向量。
在这里插入图片描述
上面公式里的θ就是权值矩阵所有参数(c⋅d)+词向量参数(|V|⋅d),这里相比较传统分类问题,增加了词向量所有参数,这也是和传统分类问题的最大区别 。

2.5、参数过多导致的过拟合&&正则化解决方式

参数一多(特征,也就是权重矩阵w的行数),就容易过拟合(如下图):
在这里插入图片描述
由上图我们可以看出,模型复杂度越高,模型的训练集误差会越来越小;而随着模型复杂度的增高,测试集的误差会先减小后增大;这是因为模型太复杂时,模型变得过拟合。也就是说模型参数过度拟合了训练集的样本,时模型丧失了鲁棒性。所以在过拟合后,模型在训练集上效果会越来越好,在测试集上效果越来越差。

2.6、softmax分类器损失函数最终定义

因此,需要加入正则化项的损失函数,其作用其实就是降低模型参数的复杂度,防止过拟合。
在这里插入图片描述

3、训练过程中是否应该重训练(retrain)词向量

对于一般的机器学习任务,我们只学习参数W,而不会retrain词向量(输入的词向量是什么就一直是什么)。那么如果我们在这个时候也retrain词向量会发生什么呢?

首先,下图是只学习参数W的分类器效果:
在这里插入图片描述
其中,TV、telly、televison三个单词会成功的划分到一起。

然后,下图是不仅仅学习决策边界W,还retrain词向量x的分类器效果:
在这里插入图片描述
由上图我们可以看到,当telly和TV都在训练集中时,retrain词向量后,telly和TV在空间中的位置都发生了变化;而televison没有在训练集中,所以television在空间中的位置没有变化。也这因为这个原因,television相对于telly和TV的位置发生了变化,在分类时发生了偏差。

根据以上我们可以总结出:
(1) 如果训练集的规模比较小,那我们就不要retrain词向量,否则会发生上图中效果。
(2) 如果我们有规模很大的数据集,那么retrain词向量会更遵循每个单词词向量在这个任务中的分布,从而使实验效果更理想。

4、基于window的词分类任务

4.1、基于window的分类器定义

上面都仅仅讨论了对于某个单词输入向量x,但目前仅仅分类单个单词的任务已经很少有人做了。现在更有趣的问题是根据上下文信息对单词进行语义消歧。
比如课程中提到的下面的两个例子:
在这里插入图片描述
由以上两个例子我们可知,根据单个单词分类已经不可能了;因为同样的单词,在不同的语境(上下文)中可能含有不同甚至相反的含义。此时基于窗口的词分类任务应运而生,这时候我们不仅仅用单一的单词,还用到他上下文的单词,共同决定这个中心词的类别。

4.2、 一个简单的基于window的softmax分类器

一个基于window的softmax分类器定义为:以待分类单词为中心词,取其周围某个窗口大小内的单词向量,将其进行拼接,构成分类器的输入;分类器的输出即为中心词的类别。
一个window大小为2,对Paris进行分类的例子:
在这里插入图片描述
其中, X w i n d o w X_{window} Xwindow R 5 d R^{5d} R5d (5个单词,每个单词的词向量维度为d)

在这里插入图片描述
所以一个基于窗口的softmax分类器相当于以 X w i n d o w X_{window} Xwindow为输入的softmax分类器(之前是以单个X向量作为输入)。softmax分类器前面叙述过了,其中平均交叉熵损失函数为:
在这里插入图片描述
那么到此损失函数有了,我们怎么样训练这个分类器呢?

4.3、 基于window softmax分类器的求梯度过程

通过4.2我们得到了模型损失函数,那么接下来我们就以求一下对于词向量X求偏导得到的梯度(此部分假设retrain词向量)为例,权重矩阵W的梯度类似。
在这里插入图片描述
其中: f y = W y x = ∑ i = 1 d W y i x i f_{y}=W_{y} x=\sum_{i=1}^{d}W_{yi}xi fy=Wyx=i=1dWyixi ,fy表示第y个类别。如果y为预测正确的,则减去1(为什么?有点没懂)。
此时我们求出了词向量的梯度,更新词向量X的公式为梯度的负方向 X n e w = X o l d − α ⋅ ▽ X J X_{new}=X_{old}-\alpha \cdot \bigtriangledown_{X}J Xnew=XoldαXJ
其中, α \alpha α为学习率。

5、基于神经网络的词分类任务

5.1、神经网络的优势

对于少量的数据,softmax分类器这种通过线性分类边界进行分类的模型可能表现还不错,但是如果遇到复杂且大量的数据,这种简单的模型可能就很难拟合数据(而神经网络可以拟合任意非线性函数)。

5.2、神经网络的前向传播

在这里插入图片描述
在这里插入图片描述
将上式表示成矩阵就是下面这样:
在这里插入图片描述

通过上式我们可以知道,如果我们不采用非线性的激活函数,输入经过两层神经网络后表示为W2W1X,最后还是WX,依然是线性变换因此神经网络采用非线性函数(例如sigmod),能够更加拟合复杂的数据。
在这里插入图片描述

神经网络的最后一层我们可以计算一个通过softmax计算出来的概率值,也可以仅仅计算一个非规格化的分数(score)。

5.3、NER2分类问题假设

假设我们要预测中心词Paris是否是一个地名(即进行NER命名实体识别)的2分类问题
在这里插入图片描述

输入层 X X X即为 X w i n d o w X_{window} Xwindow 5个词拼接而成的窗口向量,每个词向量的维度di=4,则拼接后input 词向量的维度d=4X5=20;
隐藏层:隐藏层总共有8个神经元,因此全连接的话,有20X8个链接权重参数,用W表示。 f(x)为线性变换后的激活函数;
输出层 u T u^{T} uT为隐藏层到输出层之间的权重矩阵,s为输出得分值。

5.4、神经网络的反向传播

根据上面的分类任务,我们可以这样定义目标策略:最大化以Paris为中心词的窗口得分,最小化不是以Paris为中心词的得分,知道他们都足够好(类似word2vec中负采样)。为了遵循这个策略,我们将目标函数设置为最大间隔损失函数:
在这里插入图片描述
其中
在这里插入图片描述
假设cost函数J>0(则Sc>S,需要继续优化),计算算S或者Sc的导数,涉及到的变量有W,U,b, x。
在这里插入图片描述

对权重矩阵W求偏导具体过程:
(就是链式求导过程)
在这里插入图片描述
在这里插入图片描述
其中:
如果激活函数是sigmod函数,则其导数如下(用原函数即可,不必再重新计算什么,极大减少了运算量):
在这里插入图片描述

上面是对单个数据进行的梯度计算,如果我们想求整个权重矩阵的梯度,则转化成矩阵形式(矩阵即简便表达,又能极大的提升运算速度):
在这里插入图片描述

那么怎么更新bias b呢?

其实就是上上式子最后一步不对W求偏导了,而是对b求,那么(WX+b)对b的倒数为1,则为δi。
在这里插入图片描述

由此可见,反向传播最精髓的地方就是记住链式求导法则。
附上一个连接:用实例进行前向和反向传播演示


课中所提重要技巧!!

我们可以重复使用在高层计算的导数来计算低层的导数!

因为很多值是被重复计算的,这是一个很有效的技巧,极大的提升了效率。
【为什么用反向传播:我们可以重复使用这些误差信号δ和元素的导数。】

6、总结

对于每一个窗口来说,都有以下目标函数:
如果J>0,则2分类中label为1,否则为0。(这里不知道理解的对不对)
在这里插入图片描述

7、项目建议

(1) 先定义好自己的问题,明确知己的目标是做什么。
(2) 根据自己的问题,确定实验所需数据集,可以用现成前人发布的数据集,也可以自己用爬虫在网络上爬取(不建议在爬取数据上花费大量的精力)。
(3) 确定自己实验结果的评价标注。比如机器翻译常用BLEU值;一般用准确率、召回率、F1值。根据数据特点和任务的不同采用不同的评价标准。
(4) 正确的将自己的数据划分成训练集、验证集和测试集。
(5) 可以先采用一些简单的、比较基础的模型完成目标,然后分析输出结果,适当调整和改变模型
(6) 将实验数据可视化,也可以将实验过程可视化,通过图表可以很明确的了解自己模型对于超参数不同大小的敏感度。
(7) 尝试改进或者混合模型,得到更好的实验效果。

这篇关于【CS224n】笔记45 Word Window分类与神经网络和反向传播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/271858

相关文章

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

Java利用poi实现word表格转excel

《Java利用poi实现word表格转excel》这篇文章主要为大家详细介绍了Java如何利用poi实现word表格转excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、每行对象类需要针对不同的表格进行对应的创建。package org.example.wordToEx

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word

Python批量调整Word文档中的字体、段落间距及格式

《Python批量调整Word文档中的字体、段落间距及格式》这篇文章主要为大家详细介绍了如何使用Python的docx库来批量处理Word文档,包括设置首行缩进、字体、字号、行间距、段落对齐方式等,需... 目录关键代码一级标题设置  正文设置完整代码运行结果最近关于批处理格式的问题我查了很多资料,但是都没

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Java使用POI-TL和JFreeChart动态生成Word报告

《Java使用POI-TL和JFreeChart动态生成Word报告》本文介绍了使用POI-TL和JFreeChart生成包含动态数据和图表的Word报告的方法,并分享了实际开发中的踩坑经验,通过代码... 目录前言一、需求背景二、方案分析三、 POI-TL + JFreeChart 实现3.1 Maven

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep