CS224n NLP-Lecture 2: Word Vectors/第二讲-词向量表示: word2vec

课件: lecture02(链接地址:https://download.csdn.net/download/qq_34243930/10991266
观看视频2(链接地址: https://www.bilibili.com/video/av41393758/?p=2
在这里插入图片描述
在这里插入图片描述

本节课程计划

1、词义
2、word2vec介绍
3、研究热点展示
4、word2vec目标函数的梯度
5、优化

在这里插入图片描述

如何表示一个词语的意思

先来看看如何定义“意思”的意思,英文中meaning代表人或文字想要表达的idea。这是个递归的定义,估计查询idea词典会用meaning去解释它。
1、用单词、短语等表示的想法
2、人们想要通过单词、符号等表达的想法
3、用写作,绘画的作品表达出来的想法

语言学上最常理解的meaning的含义:
在标准的语言学中,单词就像一种语言学符号,它指代了世界上的某些具体事物。
比如“眼镜”,那么它就有了具体的指代,包括这一副(指着自己的眼镜),还有大家带着的那么多副。所有这些它所指代的东西,就是眼镜一词的指代物。

中文中“意思”的意思更加有意思:
他说:“她这个人真有意思(funny)。”她说:“他这个人怪有意思的(funny)。”于是人们以为他们有了意思(wish),并让他向她意思意思(express)。他火了:“我根本没有那个意思(thought)!”她也生气了:“你们这么说是什么意思(intention)?”事后有人说:“真有意思(funny)。”也有人说:“真没意思(nonsense)”。(原文见《生活报》1994.11.13.第六版)[吴尉天,1999]——《统计自然语言处理》
语言学中“meaning”近似于“指代、所指、符号”。

但是,目前,这种对meaning的解释并未运用在计算机系统处理语言。

在这里插入图片描述

计算机如何处理词语的意思

过去,常用的方法是用分类词库来处理词义。如果是英语,最著名的分类词库就是WordNet。它提供很多词汇相关的分类信息。
这里有一小段python代码,它展示的是使用nltk包抓取Wordnet的操作。nltk是用于自然语言处理的主要python包。
比如NLTK中可以通过WordNet查询panda这个词的hypernyms (is-a,上位词),得到“食肉动物”“动物”“哺乳动物”之类的上位词。也可以查询“good”的同义词——“honorable高贵的”、“respectable受人尊敬的”、“just正义”、“ripe熟了”。

在这里插入图片描述

discrete representation的问题

1、这种discrete representation虽然是种语言学资源,但丢失了韵味。(虽然存在大量的同义词资源,但是,很难从这些资源中尽可能多地获取价值。)比如这些同义词的意思实际上还是有大量微妙的差别:例如good有一组同义词是adept行家, expert专家, good好的, practiced熟练地, proficient精通的, skillful擅长的,但是这些看起来其实是完全不同的东西,比如我说:我是深度学习方面的专家。(I’m an expert at deep learning.)跟说:我擅长深度学习。(I’m good at deep learning.)就有细微的差别。
2、缺少新词,如果我说,我是深度学习的忍者(ninja)或者类似的表达,这就在wordnet里根本找不到了。
3、主观化,人们往这些同义词集里加入什么词是一个非常主观的选择。你区分哪些词是一样的,哪些词是不一样的,是非常模糊的判断。
4、需要耗费大量人力去整理
5、无法计算准确的词语相似度

在这里插入图片描述
离散化表示普遍存在的一个问题,几乎所有的NLP研究,除了现代深度学习,以及80年代做的一点NLP神经网络以外,其他所有的NLP都使用了原子符号来表示单词,比如酒店、会议、散步。

无论是规则学派,还是统计学派,绝大多数NLP学家都将词语作为最小单位。(符号编码的问题不仅存在于NLP中传统的基于规则的理性主义方法,耶存在于所有基于概率统计的传统的机器学习方法中。尽管这些拉丁模型运用了真是的数字,它们计算了某些词在其他词存在背景下的可能性,但是,因为它们是基于符号表示开发的,所以你就不能得出词汇和模型之间的关联,所有词汇都是独立存在的。)

原子符号就像是一个只有一个位置是1,其他全是0的大向量。那么我们就有了大量与原子符号相对应的词汇。我们在这个向量的某个位置有个1,这就代表一个特定的符号,比如酒店。

事实上,词语只是词表长度的one-hot向量,这是一种localist representation(大概是借用localist“局部”的意项)。

而这样的向量会非常非常长在不同的语料中,词表大小不同。Google发布了一个包含1TB语料库的网络爬虫,也是在NLP中广泛使用的资源,它的词汇量是1300万,这个向量的确太长了。

在这里插入图片描述

从symbolic representations到distributed representations

为什么存在问题呢(之前幻灯片所说的问题)?因为没有给出任何词汇之间的内在关系概念词语在符号表示上体现不出意义的相似性,比如在网络中搜索Dell notebook battery size(戴尔笔记本的电池大小),我们希望匹配的是关于Dell laptop battery capacity(戴尔便携式电脑电池容量)的文档,所以我们就要知道笔记本(notebook)和便携式电脑(laptop)的含义相似,大小(size)和容量(capacity)含义相似,因此可以等同起来。
我们也要知道酒店(hotel)和汽车旅馆(motel)有相似的含义。
而one-hot向量是正交的(点积为0),无法通过任何运算得到相似度

需要找到一种用向量直接编码含义的方法。(我们可以探索一种直接的方法,一个单词编码表示的含义,是你可以直接阅读的,在这些表示中,你可以看出相似性,我们要做的就是构造这些向量,然后做一种类似求解点积的操作,这样就可以让我们了解词汇之间有多少相似性。)

在这里插入图片描述

Distributional similarity based representations

Distributional similarity-分布相似性,分布相似性是指,你可以得到大量表示某个词汇含义的值,只需通过观察其出现的上下文,并对这些上下文做一些处理来得到。

语言学家J. R. Firth提出,通过一个单词的上下文可以得到它的意思。J. R. Firth甚至建议,如果你能把单词放到正确的上下文中去,才说明你掌握了它的意义。

如果我想知道banking这个单词的意思,我需要做的就是找到数千个包含banking的例句,然后观察每一次它出现的场合,我会看到(和它一起出现的词):debt problem(债务问题)、government(政府)、regulation(法规)、Europe(欧洲)、unified(统一的),然后我开始统计所有出现过的内容,通过某种方式用这些上下文的词来表示banking的含义。
在这里插入图片描述

如果你深入了解分布相似性,你会看到一句随处可见的名言:
“You shall know a word by the company it keeps”
你应该通过一个单词的同班知道它的意思。

(J. R. Firth 1957: 11)
这是现代统计自然语言处理最成功的思想之一。

在这里插入图片描述

通过向量定义词语的含义

我们接下来要做的就是给每一个单词构造一个向量。我们会选择一个密集型向量(dense vector),让它可以预测目标单词所在文本的其他词汇。
那么我们怎么做呢?
通过调整、修改一个单词及其上下文单词的向量,使得根据两个向量可以推测两个词语的相似度(比如两个向量觉的点积);或根据向量可以预测词语的上下文。这种手法也是递归的,根据向量来调整向量,与词典中意项的定义相似。

强调两个关键词。
distributional similarity,分布相似性的概念是一种关于词汇语义的理论,你可以通过理解单词出现的上下文来描述词汇的意思
distributed representations,即用密集型向量表示词汇的含义
distributed representations几乎总是通过distributional similarity来构建的。

另外,distributed representations与symbolic representations(localist representation、one-hot representation)相对;discrete representation则与后者及denotation的意思相似。切不可搞混distributed和discrete这两个单词。

在这里插入图片描述

学习神经网络word embeddings的基本思路

定义一个以预测某个单词(中心词)的上下文的模型:
p ( c o n t e x t ∣ w − t ) = . . . p(context|w_{-t})=... p(contextwt)=...

我们或许有一些概率方法,根据给定单词预测上下文单词出现的概率。接下来,就可以用损失函数来判断预测的准确性。

损失函数定义如下:
J = 1 − p ( w − t ∣ w t ) J=1-p(w_{-t}|w_{t}) J=1p(wtwt)

理想状态下,我们可以准确预测中心词汇周围的词。这里的 w − t w_{-t} wt表示 w t w_{t} wt的上下文(负号表示除了t之外所有其他的词汇)。如果我们可以根据t精准预测这些词,那么概率就为1,即没有损失(J=1-1=0)。但通常情况下,做不到这一点。

然后将在一个大型语料库中的不同位置得到训练实例,调整词向量,最小化损失函数。
在这里插入图片描述

直接学习低维词向量

这其实并不是多么新潮的主意,很早就有一些研究了:

• Learning representations by back-propagating errors (Rumelhart et al., 1986)

A neural probabilistic language model (Bengio et al., 2003)
只不过以前一直没有引起重视,直到Bengio展示了它的用处之大。后来研究才开始火热起来,并逐渐出现了更快更工业化的模型。

• NLP (almost) from Scratch (Collobert & Weston, 2008)
Collobert & Weston,开启了一个新的方向,他们觉得,如果只想要的到好的单词表示,我们甚至不需要购将一个可以预测的概率语言模型,我们只需要找到一种学习单词表示的方法,将是接下来要说的模型-word2vec 。

• A recent, even simpler and faster model: word2vec (Mikolov et al. 2013)
word2vec 模型的核心是构建一个很简单的、可扩展的、快速的训练模型,让我们可以处理数十亿单词的文本,并生成非常棒的单词表示。

在这里插入图片描述

word2vec的主要思路

word2vec尝试去做的最基本的事情就是利用语言的意义理论,来预测每个单词和它上下文的词汇,即,通过单词和上下文彼此预测

在word2vec内部包含很多东西:
两个用于生成词汇向量的算法,两套稍微高效的训练方法。
两个算法:
Skip-grams (SG):预测上下文
Continuous Bag of Words (CBOW):预测目标单词

两种稍微高效一些的训练方法:
Hierarchical softmax
Negative sampling

但在这门课里,只会讲Naïve softmax。
其他参考:两种算法和两种训练方法的四种组合:http://www.hankcs.com/nlp/word2vec.html

在这里插入图片描述

skip-gram模型的概念是,在每一个估算步骤都取一个词作为中心词汇

这里,选的词汇是banking,接下来要做的是尝试去预测它一定范围内的上下文的词汇。所以,这个模型将定义一个概率分布,即给定一个中心词汇,某个单词在它上下文中出现的概率。我们会选取词汇的向量表示,以让概率分布值最大化。
重要的是,我们要意识到,这个模型只有一个概率分布,并不是说对于这个单词的左边的词汇和右边的词汇分别有一个概率分布。对一个词汇,有且只有一个概率分布。这个概率分布就是输出,也就是出现在中心词汇周围的上下文的一个输出。

注意这里虽然有四条线,但模型中只有一个条件分布(因为这只是个词袋模型而已,与位置无关)。学习就是要最大化这些概率。

在这里插入图片描述

word2vec细节

定义一个半径m,然后从中心词汇开始,到距离为m的位置来预测周围的词汇。
我们会在多个位置进行多次重复操作。
我们要选择词汇向量,以便于让预测的概率达到最大,因此损失函数或者说目标函数,就是这里的J’。J’表示的是,我们拿到一段很长的文本,比如整篇维基百科或者类似的文本,有了足够长的词汇序列,足够的词汇和正文,然后遍历文本中所有位置。对于文本中每个位置,我们都会定义一个围绕中心词汇的,大小为2m的窗口(中心词前后各m个单词),这样就得到一个概率分布,可以根据中心词给出其上下文词汇出现的概率。
然后我们就要设置模型的参数,让上下文中所有的词汇出现的概率都尽可能的高。
这里的θ就是模型的参数。
θ是什么?代表什么?它就是词汇的向量表示,也是每个词汇向量表示的唯一参数。
从概念上说,这就是目标函数,我们要最大化这个预测的概率。
目标函数定义为所有位置的预测结果的乘积:
在这里插入图片描述
处理概率问题是一件比较麻烦的事情。我们要做最大化操作,实际上就是解决对数分布问题。这样所有的求积就会转化成求和,从数学上来说简单多了。这样就不用计算整个语料库的概率,而是取每个位置上的平均值,得到 1 T \frac{1}{T} T1,这样相当于对每个词汇进行归一化处理,并不影响最大值。
在机器学习中,我们乐于把事情最小化,而不是最大化。你可以在最小化和最大化之间随意切换,在正负操作是,只需要在方程前面加一个负号就行了,这样我们得到一个负的对数似然,也就是模型的负对数分布,这就是我们要正式最小化的目标函数。

要最大化目标函数。对其取个负对数,得到损失函数——对数似然的相反数:
在这里插入图片描述

在这里插入图片描述

目标函数细节

1、损失函数,代价函数,目标函数,这些术语都是一样的:Loss function = cost function = objective function
2、对于softmax来讲,常用的损失函数为交叉熵。
3、我们只有一个one-hot目标,只预测一个当前的单词,在这个准则下,交叉熵损失函数里剩下的只有一项,就是这个负概率。

在这里插入图片描述

Word2Vec细节

我们怎么利用这些单词向量来最小化负的对数似然函数呢?
我们采用的方法是,根据由单词向量构造而成的中心词汇来得出其上下文单词的概率分布 p ( w t + j ∣ w t ) p(w_{t+j}|w_{t}) p(wt+jwt)
在这里插入图片描述
这里的t和t+j是单词在文本中的位置。

c和o代表单词在词汇表空间中的索引,以及它的类型。
o是输出的上下文词语中的确切某一个,c是中心单词。

每种单词类型都有一个对应的向量;
u是对应的上下文词向量,v是词向量。
u o u_{o} uo是索引为o的单词所对应的向量, v c v_{c} vc是中心词对应的向量。

我们怎么才能确定相应的概率分布呢?
我们要使用一种名为softmax的模型,选取两个向量的点积,将他们转换成softmax形式。
在这里插入图片描述

点积

先了解
点积
两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为:
a·b=a1b1+a2b2+……+anbn。
使用矩阵乘法并把(纵列)向量当作n×1 矩阵,点积还可以写为:
a ⋅ b = b ⋅ a T a\cdot b=b\cdot a^{T} ab=baT,这里的 a T a^{T} aT指矩阵a的转置。

矩阵乘法
只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。

首先,我们有两个单词向量,求它们的点积(取出相应的项相乘,然后将所得乘积求和)。
通过点积可以粗糙衡量相似性:两个向量的相似性越大,点积就越大。
一旦得到两个单词向量的点积,我们就把它们转化成softmax形式。

在这里插入图片描述

Softmax function:从实数空间到概率分布的标准映射方法

指数函数可以把实数映射成正数,然后归一化得到概率。

这种softmax形式是一种将数值转化成概率的标准映射方法。

当计算点积是,它们仅仅是数值、实数,它们可能是-17,也可能是32,我们不能直接把它们转化成概率分布,最简单的做法就是把它们转化成指数!因为求一个数的指数,其结果一定是正数。这就为求解概率分布提供了一个很好的基础。

接下来,就是要对这个概率进行所谓的归一化处理。(如果你有大量数据都为正,而你想将它们等比例转换成概率分布,你只需要对它们求和,然后用各项依次除以总和,则得到每一项的概率分布了。)

当你完成这一系列操作,就得到了如下形式:
在这里插入图片描述

也就是softmax形式,也就得到了相应的概率估计,他完全基于单词的向量表示。

QA1:你可能认为,一个单词应该只有一个向量表示,但如果,你让每个单词都用两个向量表示,从数学上来说,会比一个向量表示简单很多。对于上下文其他单词来说,它就有另外一种向量表示,这就是我们得到的一种正式的结果。u是对应的上下文词向量,v是中心词向量。可以看出,这不仅仅让数学变得更简单,因为这两个表示是相互独立的,当你在做优化的时候,它们不会相互耦合,这在实际中也更好操作。
所以,每个单词都有两个向量

QA2:问题是,指数化,是一种可以让所有结果为正的方法,但是同时大幅扭曲了原来的数据规模?
这是对的,softmax之所叫softmax,是因为指数函数会导致较大的数变得更大,并且绝对主导,小数变得微不足道;这种选择作用类似于max函数,但也不完全是,它仍然是一个软性操作。操作背后隐藏着一些数学标准方法,包括很常见的逻辑回归,之后你会看到其他的处理方法,暂时不讲。

QA3:问题是,当我处理上下文词汇的时候,我需要关注的是它们所处的位置,还是仅仅它们的ID?
它们在哪跟这个模型并没有什么关系,有关系的仅仅是这个单词的ID(在ID就是单词在窗口中的位置)(注意,单词在窗口中的位置不等同于在文中的位置),所以上下文词汇都只有一个概率分布和一个表示。
也有一些其他的模型,关注单词的位置和与中心词汇的距离。从某些方面来考虑,特别是一些句法上而非语义上,这确实很有帮助,但如果你仅仅只关心单词的意思,那你就不需要关注单词的位置,这也会对你处理问题有帮助。

QA4:问题是,这个方法有唯一解吗?会不会存在多个结果,而且都一样好呢?
答案是肯定的,有可能存在多个解,暂时不讲,关于神经网络的优化,我们可以讲的东西非常多,还有很多其他的新东西,好的东西。

在这里插入图片描述

Skip gram

别看这张图有点乱,但其实条理很清晰,基本地说明了问题。

从左到右是one-hot向量,乘以center word的W于是找到词向量,乘以另一个context word的矩阵W’得到对每个词语的“相似度”,对相似度取softmax得到概率,与答案对比计算损失。真清晰。

具体解析:
我们有一个中心词汇,它是一个one-hot向量;
然后有一个所有中心词汇的表示组成的矩阵W;
将这个矩阵和one-hot向量相乘,得到的就是中心词汇的词向量 v c v_{c} vc
接下来,构造第二个矩阵W’,用于存储上下文词汇的表示,对于上下文的每个位置,这里只列举了三个,我们把这个矩阵和词向量 v c v_{c} vc相乘;
得到中心词和上下文表示的点积;
然后用softmax方法,将他们转化成概率分布。

给定一个中心词,作为一个生成模型,它可以预测在上下文中出现的词汇的概率。如果我们用它来进行生成,那么这应该选择这个单词(倒数第二列表示的单词),但实际上下文单词是这个(最后一列表示的单词)。那么我们可以说实际情况中出现的词是这个,而你给出的这个词出现的概率是0.1,这说明你的预测做得不够好,产生了误差。

在这里插入图片描述

训练模型:计算参数向量的梯度

接下来,我们想做的是学习参数、这些单词向量,来让我们的预测尽可能的准确。

把所有参数写进向量θ,对d维的词向量和大小V的词表来讲,有:
在这里插入图片描述
我们会将模型中所有的参数都放进一个大的向量θ里,然后进行优化,通过改变这些参数,让模型的目标方程最大化;
所以我们要的参数就是,对每个单词(不论是中心词还是上下文词汇),我们都有一个d维小向量,这样就得到一个一定大小的单词表;
这个向量中有一个代表上下文单词aardvark的向量,一个代表上下文单词a的向量…一个以aardvark为中心词汇的向量,一个以a为中心词汇的向量…等等;(u是对应的上下文词向量,v是中心词向量)
这个向量的总长度是2dV,这是一个非常长的向量,包含了之前矩阵中见过的所有东西,这也是要优化的对象。

由于上述每个单词都有两个向量,所以θ的维度中有个2。

现在我们要真正完成我们的模型,我们之前得到的:目标函数(想要最小化它的负对数似然),概率分布(其中包含中心词和上下文词汇向量),思路是要调整参数,以便让负对数似然最小化,从而使预测的概率最大化。
我们如何来调整参数?
梯度!
在这里插入图片描述

梯度的推导

在这里插入图片描述
在这里插入图片描述

链式法则-复合函数求导

在这里插入图片描述
目标函数:
在这里插入图片描述
以下面计算概率的公式:
在这里插入图片描述

具体白板推导过程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
observed–这就是实际输出的上下文词汇
expected–是期望的形式,我们要做的就是这个,我们通过计算上下文中可能出现的每一个单词的概率,来得到期望。基于这个概率,我们得到 u x u_{x} ux u x u_{x} ux就是期望向量,它是所有可能的上下文向量的平均。以它们出现的似然概率值 p ( x ∣ c ) p(x|c) p(xc)来加权。

接下来我们要做的就是,调整我们模型中的参数,为了减号前后项相等,然后我们就可以得到需要最小化的最大值和最小值。

这里只对中心向量 v c v_{c} vc进行了操作,但是我们要对模型中的每个参数采取一样的操作!
在这里插入图片描述

在这里插入图片描述

损失/目标函数

梯度有了,参数减去梯度就能朝着最小值走了。

思路就是:
当我们的梯度在点x处,接下来我们要做的就是从梯度中减去一小部分,然后就会向下移动,趋近最小值;然后我们继续计算这里的梯度,再减去一小块……就能逐渐走向最小值。

在这里插入图片描述

梯度下降

为了对整个训练数据最小化J(θ),需要计算出所有窗口的梯度;
更新每个参数θ;
步长为α;
对于所有参数θ的矩阵表示:
在这里插入图片描述
如果我们有一个目标函数,还得到这个目标函数针对所有参数的导数,那么根据梯度下降算法,你就得到了当前参数值,减去已经计算出来的这个位置的梯度,就得到新的参数值,可以让目标函数的值变小一点,……所以就是朝着最小值移动。

在这里插入图片描述

批梯度下降代码(Vanilla Gradient Descent Code)

写成Python的代码就非常简单了,你只需要使用一下while true循环,和终止循环的条件。

在这里插入图片描述

直观的表示

对于一个简单二元凸函数,下面轮廓线显示了目标函数变化:
在这里插入图片描述
这幅图中的红线是等高线,代表的是目标函数的值;当你计算梯度的时候,它给出的是最陡的下降方法,这样每次沿着最陡的方向前进一点点,最后顺利到达最小值。
但是,它可能不可行,原因是,如果你走了第一步,你会沿着这个方向,从这里到那里(图中蓝色线),有可能你就错过了最小值。
所以非常重要的一点是, α α α(alpha步长)必须足够小,让你可以平缓的朝着最小值方向前进,那么这个方法才有效。

梯度下降是函数最小化的最最基础的方法。

在这里插入图片描述

SGD-随机梯度下降

上面方法(批梯度下降)有以下弊端:

语料库非常大,具有400亿(40B)的字符和窗口
每次参数更新需要等待很长时间
对于神经网络的效果很差

(如果你针对这400亿个词汇来对目标函数一一求梯度,你可能永远也完成不了;所以你需要在求解第一个梯度之前等待一小时,在现实中这样去训练你的模型是不太可能的;所以基本上,所有采用naive batch gradient descent hopeless algorithm的神经网络效果都很差)

naive batch gradient descent hopeless algorithm
朴素的批量梯度下降无望算法

所以我们采用随机梯度下降的方法:
在这里插入图片描述
我们只选取文本中的一个位置,这样我们就有了一个中心词汇,以及它周围的词汇;我们移动一个位置,对所有的参数求解梯度,然后使用这个位置的梯度估计值,这样就前进了一小步。

可以想象,用它来处理单词向量学习之类的事情,这种梯度估计是极其粗糙的。因为我们只在一个位置这么做,这个位置周围只有几个单词,那么我们就看不到模型中绝大部分的参数,即使前进了一小步也不能保证你是朝着最小化方向前进的,因为这个估计很粗糙。
但是,在实际使用中,确是很宝贵的,它很有效,是一种双赢的方法,用这种方法会比批处理梯度下降算法快上很多数量级,因为你可以在观察了每个中心词汇的位置后再更新参数。结果证明,神经网络算法喜欢噪音(就是说对于神经网络算法很有效),
虽然梯度下降算法很粗糙,但是SGD是一种很好的优化算法,也有助于神经网络的学习。也是在实际中一直使用的方法。

批梯度下降和随机梯度下降的对比

在这里插入图片描述

对比:批梯度下降、随机梯度下降、小批量梯度下降

批梯度下降Batch gradient descent (BGD)

批梯度下降,在梯度下降中,对于θθ的更新,所有的样本都有贡献,也就是参与调整 θ θ θ.其计算得到的是一个标准梯度。因而理论上来说一次更新的幅度是比较大的。如果样本不多的情况下,当然是这样收敛的速度会更快

Vanilla gradient descent 又称为 Batch gradient descent (BGD),其需要计算整个训练集的梯度,即:
θ n e w = θ o l d − α ∇ θ J ( θ ) θ^{new}=θ^{old}-α\nabla_{θ}J(θ) θnew=θoldαθJ(θ),其中 α α α为学习率(步长),用来控制更新的“力度”。
优点:
对于凸目标函数,可以保证全局最优; 对于非凸目标函数,可以保证一个局部最优。
缺点:
速度慢; 数据量大时不可行; 无法在线优化(即无法处理动态产生的新样本)。

随机梯度下降Stochastic gradient descent (SGD)

随机梯度下降:可以看到多了随机两个字,随机也就是说我用样本中的一个例子来近似我所有的样本,来调整 θ θ θ,因而随机梯度下降是会带来一定的问题,因为计算得到的并不是准确的一个梯度,容易陷入到局部最优解中。

Stochastic gradient descent (SGD),仅计算某个样本的梯度,即针对某一个训练样本 x i x_{i} xi及其label y i y_{i} yi更新参数:
θ n e w = θ o l d − α ∇ θ J ( θ ; x i , k y i ) θ^{new}=θ^{old}-α\nabla_{θ}J(θ;x^{i},ky^{i}) θnew=θoldαθJ(θ;xi,kyi)
逐步减小学习率,SGD表现得同BGD很相似,最后都可以有不错的收敛。
优点:
更新频次快,优化速度更快; 可以在线优化(可以无法处理动态产生的新样本);一定的随机性导致有几率跳出局部最优(随机性来自于用一个样本的梯度去代替整体样本的梯度)
缺点:
随机性可能导致收敛复杂化,即使到达最优点仍然会进行过度优化,因此SGD得优化过程相比BGD充满动荡;

小批量梯度下降Mini-batch gradient descent (MBGD)

小批量梯度下降:其实小批量的梯度下降就是一种折中的方法,他用了一些小样本来近似全部的,其本质就是我1个指不定不太准,那我用个30个50个样本那比随机的要准不少了吧,而且批量的话还是非常可以反映样本的一个分布情况的。

Mini-batch gradient descent (MBGD)计算包含 n n n个样本的mini-batch的梯度:
θ n e w = θ o l d − α ∇ θ J ( θ ; x ( i : i + n ) , k y ( i : i + n ) ) θ^{new}=θ^{old}-α\nabla_{θ}J(θ;x^{(i:i+n)},ky^{(i:i+n)}) θnew=θoldαθJ(θ;x(i:i+n),ky(i:i+n))
MBGD是训练神经网络最常用的优化方法。
优点:
参数更新时的动荡变小,收敛过程更稳定,降低收敛难度;可以利用现有的线性代数库高效的计算多个样本的梯度。

更多请参考:
梯度下降优化算法总结
https://blog.csdn.net/shuzfan/article/details/75675568#2-1-batch-gradient-descent-bgd

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏普通

谢谢打赏~普通在此谢过

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值