首页 > 其他分享 >CS224n笔记:word2vec(1)

CS224n笔记:word2vec(1)

时间:2023-11-14 20:23:10浏览次数:23  
标签:frac log sum 笔记 向量 exp word2vec CS224n partial

目录

离散语义 (discrete):

每个词都是离散的、正交的,每多一个词,向量都增加一个维度(dimension,dim)
类似于编码,很难描述相关性

分布语义 (distribute):

上下文决定语义,多个词决定一个词
一个词的搭配、上下文、一组词 中来理解词义
哲学意义:

  • 如果一个词不出现在它的上下文上,那么它将毫无意义
  • 不能孤立静止的看待事物
    words that occur in context as vectors
    我们在 real value vector 本身中编码相似性,where we encode similarity in real value vector themselves
    当一个词出现在文本中,他有一个上下文,即一组词

tokens、types

  • token是词本身
  • type是词指代的意义

bank crises,此时是 a token of the word bank
bank 还可以表示 a type which refer to the uses and meanings

分布的语言模型(distributional language model):

将上下文中出现的单词视为向量,并对每个词(each word)建立 密集的实值向量(dense real value vector)

\["banking" = \begin{Bmatrix}0.286\\0.793\\-0.177\\ \cdots 共300维 \\0.271\end{Bmatrix} \]

词嵌入模型

分布式词表示(distributed representation):
神经词表示(neural word representations)、 词嵌入(word embeddings)、词向量(word vectors)
每一个词 == 300 dimensional vector

  • embeddings 的含义是词被嵌入到 300 维的空间中
  • dimensional 的含义是词所在的空间有多少个行 / 正交基

常用词向量设置:每一个词都对应一个 \(300\times1\) 的词向量

想象:有一个坐标系空间,空间里面每一个 都是一个
也就是说每一个词都在这个300维的空间中有一个 坐标 / 向量

二维投影:将300维空间的点投影到2维空间,在这个2维空间中,可以看到意思相近的点聚集在一起

注意:投影 / 降维 会丢失很多信息,也会 错误 真实的空间相邻关系

这个词"banking"是“distributed”而不是“localized”,是因为他是300维向量共同表示的,而不是一个维度独有的

Word2Vec

一个形成、计算词向量的算法,或者说是学习词向量的框架
be introduced at 2013

  • 思路是什么?
    1. 语料库 text corpus
    2. 选定一些常用、难分的词,舍弃罕见词
    3. 为选定词计算出词向量

create vector for each word 找出每个词的好向量

  • From a pile of text
    by doing the distributional simlarity \task\ of being able to predict \what words\ occur in the context of other word (做\任务\,什么任务呢 - 预测\什么词\将出现在其他词的上下文中的任务)
    to 学习这些向量

  • So in particular, iterate through 循环访问 in the texts 在文本中,and so at any moment在任何时候 have a center word C and context words outside of C 有一个\中心词及其之外的上下文(周围的)词(注释:词之间的相似性、词和词围绕在一起)
    we called O (c的上下文词)
    计算上下文词 \O\ 出现的概率 -- 基于当前词向量 (注释:预测 邻近的下一个词)
    不断地调整词向量 - to 最大化概率 -- 什么概率呢 -- 分配给实际出现的词的概率

  • 公式:\(P(w_{t+j}|w_t)\),t 表示 C 的position,j 表示 O 的size

  • 如果能给O更多的概率 -- 通过调整 词向量wv

  • 如何调整词向量达到目的?

  • 做什么 -- to 训练O在C中出现的概率

  • Word2vec: objective function

  • 参数:

    1. m:固定窗口大小
    2. t:C 的位置
    3. j:对窗口 m 遍历的迭代器
    4. T:文本长度、文本次数

Objective func (目标函数)

目标函数 = 似然函数:

\[Objective = Likelihood = L(\theta) \]

\[L(\theta) = \prod_{t=1}^{T} \prod_{m\leq j\leq m, j\neq 0}P(w_{t+j}|w_t;\theta) \]

Loss func (损失函数)

损失函数:

\[J(\theta) = -\frac{1}{T}\log L(\theta)=-\frac{1}{T}\sum_{t=1}^{T} \sum_{-m\leq j\leq m, j\neq 0} \log P(w_{t+j}|w_t;\theta) \]

为什么这样设计损失函数:

  • 目标函数的最优解:最大化似然函数,即:最大化在 中心词周围 看到 它的上下文 的可能性(如果一个词不出现在它的上下文上,那么它将毫无意义
  • 优化计算 -- 对数似然度 (log likelihood),累加更利于 计算、求偏导数,同时除 T 是为了取平均值 -- 为了降低 文本长度 对损失函数的影响;
  • 最小化目标函数:加一个 “-” 号,\(J(\theta)\) 可以最大限度地提高预测的准确性 -- 取负号可以将对数似然函数转化为 \凸函数\,从而使用 \梯度下降\ 等算法进行优化

P(O|C) 和 Softmax(x)

首先,每个词要对应、学习两个词向量,而不是一词对一词向量:

  • when it is C, \(v_w\)
  • when it is O, \(u_w\)

\[P(O|C)=\frac{\exp(u_O^Tv_C)}{\sum_{w\in V}\exp(u^T_wv_C)} \]

\[softmax(x_O)=\frac{\exp(x_O)}{\sum_{w=1}^W\exp(x_w)} \]

  • 注:\(exp(x)\) 等于 \(a^{x}, a \in R\),常见的 \(a\) 的取值是 \(a=e\)
    而实际也是这样:

\[exp(x)=e^{x} \]

list -- V , size=w, 当前迭代元素位置是 O:
对于 \(softmax(x_O)\) 函数:

  • 分子:exp一下当前迭代位置
  • 分母:遍历一遍 list - V,exp 每个迭代位置并求和;

对于 \(P(O|C)\):

  • 分子:exp 一下(当前迭代位置的 \(u\) 向量 \(\times\) C 位置的 \(v\) 向量)
  • 分母:遍历一遍 list - V,
    exp 一下(每个迭代位置的 \(u\) 向量 \(\times\) C 位置的 \(v\) 向量)并求和;

可以理解为:

\[u_{\textcolor{pink}{O}}v_C=x_{\textcolor{pink}{O}},\,\,u_{\textcolor{brown}{w}}v_C=x_{\textcolor{brown}{w}} \]

P(O|C) 的概率分布

\(Softmax(x_O)\) 可以把一组独立变量(这里指词向量)的值映射成一组 \([0,1)\) 的值,并且它们的和 == 1:

  • 也就是说,对于 W 的 独立变量/各个词向量 的 集合 来说,可以通过 Softmax 计算出对 \(u_Ov_C\) 的概率分布

将损失函数展开

\[J(\theta)=上文所写=-\frac{1}{T}\sum_t\sum_j\log P(O|C) \]

\[=-\frac{1}{T}\sum_t\sum_j\log \frac{\exp(u_O^Tv_C)}{\sum_{w\in V}\exp(u^T_wv_C)}\]

\[=-\frac{1}{T}\sum_t\sum_j(\log \exp(u_O^Tv_C)-\log\sum_{w\in V}\exp(u^T_wv_C))\]

求梯度公式

对 \(J(\theta)\) 求偏导前:

  • 先对 \(\log P\) 求偏导:

\[\frac{\partial}{\partial v_C}\log P = \frac{\partial}{\partial v_C}(\log \exp(u_O^Tv_C)-\log\sum_{w\in V}\exp(u^T_wv_C))\]

\[=\frac{\partial}{\partial v_C}\log \exp(u_O^Tv_C) - \frac{\partial}{\partial v_C}\log\sum_{w\in V}\exp(u^T_wv_C)\\\]

\[ \because exp(x) = e^x\]

\[\therefore原式 = \textcolor{red}{\frac{\partial}{\partial v_C}u_O^Tv_C}- \frac{\partial}{\partial v_C}\log\sum_{w\in V}\exp(u^T_wv_C)\\\]

\[ \because\frac{\partial}{\partial v_C}v_C = 1\]

\[\therefore 原式=\textcolor{red}{u_O} - \frac{\partial}{\partial v_C}\log\sum_{w\in V}\exp(u^T_wv_C)\]

\[ \because 链式法则:log \sim f,\,\,\,\sum\exp \sim g,\,\,\,对f(g(v_C))求导\]

\[\therefore 原式=u_O - \textcolor{red}{\frac{1}{\sum_{m\in V}\exp(u_w^Tv_C)}\frac{\partial}{\partial v_C}\sum_{w\in V}\exp(u_w^Tv_C)}\]

\[=u_O-\frac{1}{\sum_{m\in V}\exp(u_w^Tv_C)}\sum_{w\in V}\frac{\partial}{\partial v_C}\exp(u_w^Tv_C)\]

\[ \because 链式法则:\sum\exp\sim f,\,\,\,\,uv\sim g\]

\[\therefore 原式=u_O - \frac{1}{\sum_{m\in V}\exp(u_w^Tv_C)} \textcolor{red}{\sum_{x\in V}((\frac{\partial}{\partial v_C}u_x^Tv_C)\exp(u_x^Tv_C))}\]

\[=u_O-\frac{\sum_{x\in V}u_x^T\exp(u_x^Tv_C)}{\sum_{m\in V}\exp(u_w^Tv_C)}\]

\[注:此时已经是计算最简形式\]

\[继续化简\]

\[原式=u_O - \sum_{x\in V}\frac{\exp(u_x^Tv_C)}{\sum_{m\in V}\exp(u_w^Tv_C)}u_x\]

\[=u_O - \sum_{x\in V}P(x|C) u_x \]

所以最终的\(\log P\):

\[\log P=u_O-\sum_{x\in V}P(x|C)u_x \]

所以梯度公式:

\[J(\theta)=-\frac{1}{T}\sum_{t=1}^{T}\sum_{-m\leq j\leq m}\log P=-\frac{1}{T}\sum_{t=1}^{T}\sum_{-m\leq j\leq m}(u_O-\sum_{x\in V}P(x|C)u_x) \]

损失函数的时间复杂度

\(O(TmW)\)

Chain Rule: 链式法则

上面求梯度公式的时候用到了链式法则:

\[\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}=\frac{df(u)}{du}\frac{dg(x)}{x} \]

  • 另一种公式形式:
    原函数:\(y=f(u)=f(g(x)),\,u=g(x)\)
    原函数导数:\(y'=f'(g(x))g'(x)\)

标签:frac,log,sum,笔记,向量,exp,word2vec,CS224n,partial
From: https://www.cnblogs.com/luoyicode/p/17832439.html

相关文章

  • 【笔记】可删除堆
    可删除堆考虑到没什么人会选择手写普通的堆,所以用优先队列实现就好。问题:我们知道,在使用堆或优先队列的时候,我们只能取出堆顶,也就是所维护的最大或最小值。那么如果我们要从所维护的一个元素里删除一个非最大或最小值呢?最暴力的做法是将元素一个一个从堆顶弹出,直到弹出我们要......
  • JUC并发编程学习笔记(十九)原子引用
    原子引用带版本号的原子操作!解决ABA问题,引入原子引用(乐观锁思想)AtomicStampedReference类解决ABA问题packageorg.example.cas;importjava.util.concurrent.TimeUnit;importjava.util.concurrent.atomic.AtomicStampedReference;//使用原子引用解决ABA问题publiccl......
  • 前端学习-JavaScript学习-JavaScript高级程序设计-第2章笔记
    在HTML中使用JavaScript元素<script>元素元素属性MDN<script>:脚本元素属性使用状态描述charset可选、少用字符集defer可选、少用表示脚本可以延迟至文档完全被解析后实行,部分浏览器不支持language废弃编写代码使用的语言src可选包含要执行代码的......
  • 【笔记】曼哈顿距离与切比雪夫距离的互化
    【笔记】曼哈顿距离与切比雪夫距离的互化图源:https://www.cnblogs.com/SGCollin/p/9636955.html曼哈顿距离:\(|x_a-x_b|+|y_a-y_b|\)切比雪夫距离:\(\max(|x_a-x_b|,|y_a-y_b|)\)在有的题目中,要求是一种距离,但使用另一种距离更加方便。比如曼哈顿距离就可以将两维拆......
  • 【笔记】二进制拆分
    二进制拆分二进制拆分是对多重背包的一种优化方式,可以极大的优化多重背包的时间。原理一个数可以被拆分为任意二进制的和。例如:$7=2^0+2^1+2^2$任意一个数都可以表示为几个\(2\)的多少次方之和的形式。我们回顾下完全背包问题。背包容积为\(C\),有\(n\)种物品......
  • 阅读笔记五
    第六章:对象和数据结构对象暴露行为,隐藏数据,便于添加新对象类型而无须修改既有行为,同时难以在既有对象中添加新行为;数据结构暴露数据。没有明显的行为,便于向既有数据结构添加新的行为,同时难以向既有函数添加新的数据结构。数据抽象:隐藏实现关乎抽象,暴露抽象接口,以便用户无须了解......
  • kafka第七天学习笔记
    在Kafka学习的第七天,你可能会进一步深入了解Kafka的特性和工作机制。以下是一些可能的学习点:Kafka的存储机制:Kafka使用一种称为“日志文件”的存储机制,将消息作为字节流存储在硬盘上。这种存储方式使得Kafka能够高效地处理大量的数据。消息的索引:Kafka为每个分区在硬盘上创建一个索......
  • 秦疆的Java课程笔记:32 基础 JavaDoc生成文档
    javadoc命令是用来生成自己API文档的参数信息:@author作者名@version版本号@since指明需要最早使用的JDK版本@param参数名@return返回值情况@throws异常抛出情况比如这就是一个JDK21的Oracle官方API:点击跳转packageacolyte.operator;/***这是加在类......
  • 动手学深度学习笔记01
    安装https://blog.csdn.net/qq_18620653/article/details/105329219配置显卡驱动、CUDA、cuDNN以及说明三者之间的关系https://blog.csdn.net/qq_18620653/article/details/105329219配置anacondahttps://blog.csdn.net/qq_18620653/article/details/105335481数据操......
  • XJTU自动化钱班辅修电气工程专业课笔记合集
    通过百度网盘分享的文件:笔记整理链接:https://pan.baidu.com/s/1BrHQ1EqvlQlbWqpD5h_6Sg?pwd=shsg 提取码:shsg复制这段内容打开「百度网盘APP即可获取」完全为个人原创笔记内容,仅包含少量板书ppt与个别页面他人笔记截图)另有基本所有课程教材pdf版本,不便直接放上来,可以私聊免......