(done 剩个什么 3/4 unigram frequency 的玩意儿没懂) word2vec 算法,计算 嵌入矩阵(CBOW, Skip-gram)随机梯度下降法 SGD 负采样方案

参考视频1:https://www.bilibili.com/video/BV1vS4y1N7mo/?vd_source=7a1a0bc74158c6993c7355c5490fc600 (讲的太浅了)

参考视频2:https://www.bilibili.com/video/BV1s64y1P7Qm?p=4&vd_source=7a1a0bc74158c6993c7355c5490fc600 (Stanford CS224n 词向量那堂课) (非常棒的理论课)

参考视频3:https://www.bilibili.com/video/BV1MS4y147js?p=4&vd_source=7a1a0bc74158c6993c7355c5490fc600 (这个讲得很含糊,看完没懂)

还有一个不知道从哪里看到的 slide

参考视频4:https://www.bilibili.com/video/BV1s64y1P7Qm?p=5&vd_source=7a1a0bc74158c6993c7355c5490fc600 (还是斯坦福教授讲得深入浅出、通俗易懂)

还有一些不知道从哪里看到的 slides


word2vec 算法基于一个重要假设:文本中离得越近得词语相似度越高
意思就是,在人类语言中,经常一起出现的单词有一定的相似性
比如这句话 “I love you”
可以认为 “I” “love” “you” 这三个单词有一定的相似性
在这里插入图片描述


理论部分 (来自 Stanford CS224n)

一个基本的思想是,一个单词的意思并不是由这个单词单独给出的,还由它周围的单词一起给出
因此,当我们构建单词 “banking” 的 representation 时,我们要使用它的上下文 context 一起构建
在这里插入图片描述

单词向量 (word vectors) 也有另一个名字 “词嵌入 (word embeddings)” ,或者叫 “神经单词表示 (neural word representation)”
如下图,我们使用一个 实数矢量 来表示 单词 “banking”,那么这个实数矢量是怎么得出的呢?
在这里插入图片描述

以下是 词嵌入算法 word2vec 的介绍
大致思想总结如下:
1.词汇表/语料库 中的每一个单词都是用一个 实数矢量 表示
2.当我们扫描 一个句子 时,用 Vc 表示 中心词,它周围的词 Vo 表示 上下文词
3.我们的要求是,词义越接近的单词,它们的矢量应该越接近,这个矢量的距离就是 “假设矢量长度被正则化,则距离是夹角”
4.同时,我们希望可以使用 中心词 的矢量去预测它的上下文单词出现的概率
注意:实际上,余弦距离就是 cos(theta),这里的 theta 就是两个矢量的夹角
在这里插入图片描述

在训练 word vectors 的过程中,我们会定义一个窗口 window
我们扫描训练集的句子时,锚点就是中心词 Vc,它的上下文是 Vo
在下图来看,Wt 就是中心词,而 Wt+j 就是上下文单词
P(Wt+j | Wt) 就是,当中心词 Wt 出现时,上下文单词 Wt+j 出现的概率
我们训练 word vectors 的指标,就是让 P(Wt+j | Wt) 尽可能符合我们的训练集情况
在这里插入图片描述

如此一来,就能写出如下图所示的似然函数
而我们要做的就是,找到能够让似然函数最大化的 “参数”,这个参数也就是 语料库/词汇表 中所有单词的 word vectors
加上 log,再加上 负号(-),我们就得到了 目标函数,也可以叫做 代价函数,或者损失函数
训练 word vectors 的过程,就是不断调整 word vectors,来减少 loss function
在这里插入图片描述

那么现在,有一个问题,怎么表示 P(Wt+j | Wt ; theta) ?
如下图,Stanford Chris Manning 所使用的公式 有点像 softmax 函数
这里有个符号需要说明
Vw:当单词 w 是中心词时的矢量
Uw:当单词 w 是上下文词时的矢量
在这里插入图片描述

如下是聪明老头使用这个公式的理由
1.Uo’ Vc 的意义是使用 “中心词矢量” 和 “上下文词矢量” 做内积。这个是有实际意义的,在 矢量长度被正则化 的前提下,两个矢量越接近,那么它们内积的值就越大
2.使用 exp() 的原因:这是一个自然数指数函数,它的作用就是把 实数域 映射到 (0, 正无穷),即 R —> (0, 正无穷)
3.最后再使用整个词汇表的单词,对 Vc 做内积,进行一个正则化
这也是 softmax 函数的名字的来由:max 表示这个公式会放大 最大的上下文单词 的概率,soft 表示这个公式依然会分配一些概率给 可能性较小的上下文单词
在这里插入图片描述

搞明白了 P(Wt+j | Wt ; theta) 的公式后,代入之前的似然函数,我们就有了 训练 Word Vectors 所使用的损失函数
那么还有一个问题,theta,即我们要训练的参数是什么?
答案就是把所有 单词矢量 连接起来的一个超长矢量
假设单词总共有 V 个,每个单词使用一个 d 维矢量来表示,每个单词分别有一个 中心词矢量Vc 和一个 上下文矢量Uc
那么 theta 的维度就是 2dV
如此一来,theta 和 损失函数都有了,假如这是一个凸函数,那我们就可以使用梯度下降法去计算最优的 theta 了
在这里插入图片描述

既然使用了梯度下降法,那么自然涉及到对损失函数的求导,让我们来求导试试
经过求导,我们可以根据求导结果来评判目前模型的好坏
在这里插入图片描述
在这里插入图片描述

理论部分到此为止


接下来让我们看看那个 slide,如下图
在这里插入图片描述

Word2vec 算法一共有两种,分别是 1. skip-gram 2. CBOW

我们在前面两个部分展示的理论是 skip-gram,即,当中心词出现时,计算上下文词出现的概率

CBOW 正好相反,计算当 上下文词出现时,中心词出现的概率


接下来看看第三个视频

如下图,简单明了地展示了 CBOW 和 Skip-gram 两个模型的异同
在这里插入图片描述

剩下的内容看不懂,就当作是老师讲得太烂了


接下来我们看看斯坦福教授的讲课(参考视频4),主要是看看什么是 “负采样方案”

训练 word vectors 的一开始,我们会随机初始化所有的 word vectors
随后,我们会逐个迭代语料库中的每个单词
尝试使用 P(o | c) 那个公式去预测每个单词(作为中心词) 的 上下文词
此时,我们需要更新单词矢量,来让它们能够更好的预测 “上下文词”
这里有个问题:为什么同样类型的单词,它们的矢量方向会更接近?原因:它们的上下文单词预测情况接近
在这里插入图片描述

恰恰是因为同类型单词作为中心词时,上下文单词的预测情况大致相同,因此当我们把 word vectors 映射到二维平面上时,可以看到语义类似的单词靠得比较近,如下图
在这里插入图片描述

这里稍微讲一下 word vectors 预测 surrounding words 的计算过程,如下图
U 是语料库中所有单词的 “作为上下文单词时的单词矢量矩阵”
V 是语料库中所有单词的 “作为中心单词时的单词矢量矩阵”
当 一个单词 V4 被作为中心单词,我们要获取语料库中每个单词作为上下文单词出现的概率时,计算 softmax(U V4’),即可计算出语料库中每个单词作为上下文单词出现的概率
在这里插入图片描述

这里是对 损失函数 J(theta) 进行优化的一个案例,我们所使用的是 “梯度下降法”。
这里实际上使用的是 “批次梯度下降法”,因为损失函数 J(theta) 使用了整个语料库中的单词。
在实践中,语料库通常非常庞大,因此不能使用这种 “全批次梯度下降法”,而是通常使用 “随机梯度下降法” 或者 “小批次梯度下降法”。
需要注意的是,在优化过程中,stepSize 的设置要非常注意,设置得太大或者太小都会影响训练效果
在这里插入图片描述

如下图是梯度下降法一个典型的更新参数矩阵的过程
这种简单的 “全批次梯度下降法” 几乎没有人使用
在这里插入图片描述

由于简单梯度下降法会使用整个语料库来进行一次参数的更新,在语料库很大时,简单梯度下降法的每一次更新参数都会变得非常昂贵
因此,更 practical 的方式是使用随机梯度下降法 SGD Stochastic Gradient Descent
这种方法其实很简单:每次只从整个语料库里选取一部分,使用这一部分样本构造损失函数 J(theta),然后计算这个 J(theta) 的梯度,再使用这个梯度来更新参数矢量
在这里插入图片描述


接下来让我们研究一下 “负采样方案” 是他妈的甚?

根据远在天国的奶奶给我寄来的 “不明来源 slides”,我们可以看到,当前使用的 word2vec-skipgram 算法存在一些问题,如下两个slides
在这里插入图片描述
在这里插入图片描述

当我们把单词 “into” 作为中心词时,计算其它单词作为 “上下文词” 出现的概率时,我们在计算分母的时候涉及到了大量计算

假设语料库有 10000 个单词,那么这里就涉及到了 10000 次内积计算

也就是说,计算每个 P(o|c),我们都需要计算 m 次内积 (m = 语料库的单词数量)。无论是在模型的 predict 功能上,还是在模型的 training 过程中,这都会导致相当大的开销。

解决方案有两个,如下图
方案1–层次化softmax:把 P(o|c) 的计算拆成多个概率的乘积 P(o < 5k | c) x P(o < 2.5k | c) x … 这样一来就可以把多个 softmax 计算拆成多个 sigmoid 计算的相乘,而 sigmoid 函数明显比 softmax 函数开销要少得多。这样一来,我们就把 一个 softmax 计算拆成了 log(|V|) 个 sigmoid 计算。
方案2–负采样:这似乎是更加 popular 的方案,详情看后面的 slides
在这里插入图片描述

负采样方案的思想是:我在训练 word vectors 的时候,选取中心词后,在选取上下文单词时,我除了选一个在训练集中确实能看到的 surrounding words 作为 上下文单词,还可以选一些确实在训练集中不是当前中心词的 surrounding words 的单词。随后给它们打上标签 0 和 1
在这里插入图片描述

接着,我们可以最大化下面的 log-似然函数
可以看到,总的 J(theta) = …
里面小的 Jt(theta) = …
这个似然函数相比之前的优点是:它把 softmax 计算转成了 sigmoid 计算,大大降低了计算开销
那么为什么这种似然函数会有用呢?我们看后面的 slides
在这里插入图片描述

那篇 2013 年的 paper 又臭又长,人生苦短,我们直观理解一下就好
蓝圈圈的部分表示:当我们在最大化 Jt(theta) 时,我们需要最大化蓝圈圈的部分,此时我们就是在最小化 Uo 和 Vc 两个向量之间的余弦距离,让它们尽可能接近
而橙色圈圈的部分表示:当我们在最大化 Jt(theta) 时,我们需要最小化橙色圈圈的部分,此时我们就是在最大化 Uwi 和 Vc 两个向量之间的余弦距离,让它们尽可能远离 (因为前面有负号 “-”)
在这里插入图片描述

下面是一个更直观的例子,告诉我们两种模型在做 predict 行为时的不同
在这里插入图片描述

TODO: here 最后还有一个甚么 3/4 的,看不大懂,就列个 TODO 在这里吧
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/276653.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序-webview分享

项目背景 最近有个讨论区项目需要补充分享功能&#xff0c;希望可以支持在微信小程序进行分享&#xff0c;讨论区是基于react的h5项目&#xff0c;在小程序中是使用we-view进行承载的 可行性 目标是在打开web-view的页面进行分享&#xff0c;那就需要涉及h5和小程序的通讯问…

苹果Find My App用处多多,产品认准伦茨科技ST17H6x芯片

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…

【Leetcode每日一题】 递归 - 反转链表(难度⭐)(35)

1. 题目解析 题目链接&#xff1a;206. 反转链表 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 一、递归函数的核心任务 递归函数的主要职责是接受一个链表的头指针&#xff0c;并返回该链表逆序后的新头结点。递归…

复习C语言基础中的基础:C语言发展、C89 C99有何区别、C语言特点

参考《C程序设计&#xff08;第五版&#xff09;》&#xff08;谭浩强&#xff09;一书&#xff1a; 1. 发展、C89 C99 2. 特点 记得时不时回顾一下背景特点&#xff0c;加深对C语言的理解。

【学习记录】调试千寻服务+DTU+导远RTK过程的记录

最近调试车载定位的时候&#xff0c;遇到了一些问题&#xff0c;千寻服务已经正确配置到RTK里面了&#xff0c;但是导远的定位设备一直显示RTK浮动解&#xff0c;通过千寻服务后台查看状态&#xff0c;长时间显示不合法的GGA值。 首先&#xff0c;通过四处查资料&#xff0c;千…

深入理解JMM

一、什么是JMM JMM&#xff08;java memory model&#xff09;Java内存模型&#xff1a;是java虚拟机规范中定义的一组规范&#xff0c;用于屏蔽掉各种硬件和操作系统的内存访问差异&#xff0c;以实现让JAVA程序在各平台都能达到一致的并发结果。其主要规定了线程和内存之间的…

【优选算法】专题1 -- 双指针 -- 移动零

前言: &#x1f4da;为了提高算法思维&#xff0c;我会时常更新这个优选算法的系列&#xff0c;这个专题是关于双指针的练习 &#x1f3af;个人主页&#xff1a;Dream_Chaser&#xff5e;-CSDN博客 一.移动零&#xff08;easy&#xff09; 描述&#xff1a; 「数组分两块」是⾮…

初识web自动化测试,快速成长指南

自动化 说明 让机器设备代替人为完成指定目标的而过程 优点 减少劳动力提高效率(批量生产)提高产品质量规格统一标准 自动化测试 概念 : 让程序代替人工去验证系统功能的过程 自动化测试能解决什么问题&#xff1f; 解决-回归测试 [重点]解决-压力测试解决-兼容性测试 …

Ubuntu 14.04:安装PaddlePaddle(Conda安装)

目录 一、PaddlePaddle 概要 二、PaddlePaddle安装要求 三、PaddlePaddle安装 3.1 安装 Anaconda3 3.2 创建Anaconda虚拟环境&#xff08;python 3.8&#xff09; 3.3 进入Anaconda虚拟环境 3.4 检测 Anaconda 虚拟环境配置是否符合PaddlePaddle安装要求 3.4.1 确认 py…

掘根宝典之C++类型别名,关键字typedef,auto,decltype

类型别名 在C中&#xff0c;我们可以使用typedef关键字或using关键字来创建类型别名。下面是两种方式的示例&#xff1a; 使用typedef关键字创建类型别名&#xff1a; typedef int myInt; typedef float myFloat;myInt a;//等价int a; myFloat b;//等价float b; 使用using关…

Python面向对象构造函数:手把手教你如何玩转对象初始化

我们都知道&#xff0c;Python是一个面向对象的语言&#xff0c;这意味着我们可以用类来定义对象的属性和方法。而构造函数&#xff0c;就是当我们创建一个新的对象时&#xff0c;会自动调用的特殊方法。那么&#xff0c;如何玩转这个构造函数呢&#xff1f; 首先&#xff0c;…

YoloV8改进策略:下采样改进|HWD改进下采样

摘要 本文使用HWD改进下采样&#xff0c;在YoloV8的测试中实现涨点。 论文解读 在卷积神经网络&#xff08;CNNs&#xff09;中&#xff0c;极大池化或跨行卷积等下采样操作被广泛用于聚合局部特征、扩大感受野和最小化计算开销。然而&#xff0c;对于语义分割任务&#xff…

golang中new和make的区别

1. 先看一个例子 package mainimport "fmt"func main() {var a *int*a 10fmt.Println(*a) }运行结果是啥呢&#xff1f; 问&#xff1a;为什么会报这个panic呢&#xff1f; 答&#xff1a;因为如果是一个引用类型&#xff0c;我们不仅要声明它&#xff0c;还要为…

MySQL 压测与结果分析

文章目录 说明1. 安装部署1.1 二进制包1.2 源码包 2. 服务器性能测试2.1 CPU2.2 内存2.3 磁盘 3. MySQL 基准测试3.1 参数解析3.2 压测命令3.3 输出解读3.4 结果分析 说明 Sysbench 是一个开源的多线程基准测试工具&#xff0c;也是目前使用最多的 MySQL 压力测试工具。本篇文…

JVM是如何运行的

JVM&#xff08;Java Virtual Machine&#xff0c;Java虚拟机&#xff09;是 Java 程序的运行环境&#xff0c;它负责将 Java 字节码翻译成机器代码并执行。也就是说 Java 代码之所以能够运行&#xff0c;主要是依靠 JVM 来实现的。 JVM 整体的大概执行流程是这样的&#xff1…

Android cmdline tools安装

打开AS 进入SDK Tools 看到了吗?那个打着勾的就是

Centos8安装Docker,使用阿里云源

一、前期准备 1.关闭防火墙&#xff0c;SELINUX systemctl stop firewalld.service systemctl disable firewalld.service setenforce 0 sed -i "s/SELINUXenforcing/SELINUXdisabled/g" /etc/selinux/config查看状态 systemctl status firewalld systemctl status…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:NavRouter)

导航组件&#xff0c;默认提供点击响应处理&#xff0c;不需要开发者自定义点击事件逻辑。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 必须包含两个子组件&#xff0c;其中第二个子组…

c++入门你需要知道的知识点(上)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;c入门 主厨&#xff1a;邪王真眼 所属专栏&#xff1a;c专栏 主厨的主页&#xff1a;Chef‘s blog 前言&#xff1a; 咱也是好久没有更…

大数据与云计算

目录 一、大数据时代二、云计算——大数据的计算三、云计算发展现状四、云计算实现机制五、云计算压倒性的成本优势 一、大数据时代 我们先来看看百度关于 “大数据”&#xff08;Big Data&#xff09;的搜索指数。 可以看出&#xff0c;“大数据” 这个词是从2012年才引起关注…