首页 > 其他分享 >【词向量表示】Word2Vec原理及实现

【词向量表示】Word2Vec原理及实现

时间:2024-12-04 15:44:57浏览次数:4  
标签:vocab Word2Vec sentence self 单词 原理 向量 size

目录

Word2Vec

单词与单词之间的向量往往不在同一个向量空间,例如,传统的编码方式:one-hot编码,不同单词[1, 0, 0][0, 1, 0]之间的余弦相似度为0。因此,Word2Vec希望能够通过训练得到一个新的词向量表达方式,从而丰富向量的语义信息。主要目标如图所示,从一个稀疏的one-hot向量通过训练得到一个丰富稠密的新向量。

image

How achieve

word2vec通过神经网络模型训练新的词向量表达
image

  • 模型中参数的定义:

    one-hot:[1, 7] 表示一共有七个单词;

Embedding:表示输入层到隐藏层的权重矩阵,是从one-hot向量到Embedding向量的关键,[7, 3]表示训练完成的每一个embedding向量维度为3;

WeightLogits:表示隐藏层到输出层的权重矩阵,是模型损失计算的关键;

Logits:表示最后每个单词输出的概率,与目标标签做损失进行模型训练;

Lookup table

语料库十分巨大,每个单词都采用one-hot输入训练会大大增加存储和计算开销,因此,在输入的过程,仅仅输入单词的索引值,例如在上述例子中,直接采用索引4进行输入,同样也可以得到相同的词向量。

image

Coding

Word2Vec有两种模型结构:CBOW和Skip-gram,本质上的模型架构的不同:输入和输出一对多(Skip-gram)和多对一(CBOW)。

CBOW:通过前t个单词预测后一个单词

Skip-gram:通过周围的单词预测中间的单词 (一般来说,效果较好

Pre-dataing

  • 构建词汇表(Lookup-table)
def build_vocab(corpus):
    word_counts = Counter(chain(*corpus))
    vocab = {word: i for i, (word, _) in enumerate(word_counts.items())}
    return vocab
  • 构建不同模型的输入、输出
# Skip-gram 数据集生成
def generate_skipgram_data(corpus, vocab, window_size):
    data = []
    for sentence in corpus:
        for i in range(len(sentence)):
            target = sentence[i]
            context = [sentence[j] for j in range(max(0, i - window_size), min(len(sentence), i + window_size + 1)) if j != i]
            for context_word in context:
                data.append((vocab[target], vocab[context_word]))
    return data

# cbow 数据集生成
def generate_cbow_data(corpus, vocab, window_size):
    data = []
    for sentence in corpus:
        for i in range(len(sentence)):
            target = sentence[i]
            context = [sentence[j] for j in range(max(0, i - window_size), min(len(sentence), i + window_size + 1)) if j != i]
            data.append(([vocab[word] for word in context], vocab[target]))
    return data

Model

可以发现两个结构的代码只有输入和输出的大小不同,其他类似

  • CBOW
class CBOW(nn.Module):
    def __init__(self, vocab_size, embedding_dim):
        super(CBOW, self).__init__()
        self.embeddings = nn.Embedding(vocab_size, embedding_dim)
        self.linear = nn.Linear(embedding_dim, vocab_size)

    def forward(self, context_words):
        embedded = self.embeddings(context_words).mean(dim=1)  # 平均上下文词向量
        logits = self.linear(embedded)
        return logits
  • Skip-gram
class SkipGram(nn.Module):
    def __init__(self, vocab_size, embedding_dim):
        super(SkipGram, self).__init__()
        self.embeddings = nn.Embedding(vocab_size, embedding_dim)
        self.linear = nn.Linear(embedding_dim, vocab_size)

    def forward(self, target_word):
        embedded = self.embeddings(target_word)  # (Batch, embedding_dim)
        logits = self.linear(embedded)
        return logits 

Negative sameple

提出动机:每次模型训练都需要计算所有词向量的损失,通过只更新负样本的权重,避免整个词汇表的计算

​ Word2Vec模型本质是一个多分类问题,最后需要通过softmax激活函数判断哪一个单词的概率最大,因此需要计算所有单词的概率大小。而负采样优化是指将原来的任务退化为二分类问题,只对正负样本进行判断,在词汇表随机选取\(N_{neg}\)个样本作为负样本集合。

标签:vocab,Word2Vec,sentence,self,单词,原理,向量,size
From: https://www.cnblogs.com/DLShark/p/18586461

相关文章

  • 面试官:来谈谈Vue3的provide和inject实现多级传递的原理
    前言没有看过provide和inject函数源码的小伙伴可能觉得他们实现数据多级传递非常神秘,其实他的源码非常简单,这篇文章来讲讲provide和inject函数是如何实现数据多级传递的。ps:本文中使用的Vue版本为3.5.13。看个demo先来看个demo,这个是父组件,代码如下:<template><ChildDemo......
  • Python扩展C/C++ 实现原理分析
    Python扩展C/C++实现原理分析https://blog.csdn.net/HaoBBNuanMM/article/details/112243129?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ab2ac79057d38453c0328d6726560514%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request......
  • 【054B】基于51单片机电子指南针(LCD12864)【Keil程序+报告+原理图】
    ☆、设计硬件组成:51单片机最小系统+HMC5883L罗盘传感器+LCD12864液晶显示+DS1302时钟芯片+按键设置+蜂鸣器。1、本设计采用STC89C52、AT89C52、AT89S52作为主控芯片,LCD12864实时显示信息,DS1302作为时钟来源;2、LCD12864实时显示方向角度,方位,时间,以及指针式罗盘等信息;3、......
  • 方法论-第一性原理
    第一性原理:将问题分解为最基本的元素,摒弃传统假设,从根本上重新审视和解决问题。通过回归本质,运用逻辑推理和创新思维,找到新的解决路径,而非依赖经验或惯性思维。以下是一些错误用法:1. 忽视现有知识与经验错误用法:完全从头开始,忽视已有的经验和知识体系。例子:一位新创业者......
  • 【机器学习】机器学习的基本分类-监督学习-支持向量机(Support Vector Machine, SVM)
    支持向量机是一种强大的监督学习算法,主要用于分类问题,但也可以用于回归和异常检测。SVM的核心思想是通过最大化分类边界的方式找到数据的最佳分离超平面。1.核心思想目标给定训练数据,其中是特征向量,是标签,SVM的目标是找到一个超平面将数据分开,同时最大化分类边界的......
  • 你有使用过pjax吗?它的原理是什么?
    是的,我了解pjax。它是一个jQuery插件,它通过AJAX和pushState来增强网页的浏览体验。虽然现在不再像以前那么流行(因为它依赖jQuery,而现在很多项目都不再使用jQuery),但它的核心思想仍然很有价值,并且被其他现代库和框架所吸收。pjax的原理如下:拦截链接点击:pjax监听页......
  • 数据库原理与应用-----视图
    1.1定义视图是从一个或多个表中导出的虚拟表1.2创建试图的目的简单:隐藏数据的复杂性安全:可以对试图进行授权数据独立:可以屏蔽表结构的变化对用户产生的影响1.3创建方法语法:createview视图名asSQL语句;示例:----基于单表的视图createviewrgzn_viewasselec......
  • 利用注解和 AOP 实现权限认证:原理、实践与代码解析
    目录利用注解和AOP实现权限认证:原理、实践与代码解析一、核心思想二、目录三、代码示例(一)项目搭建与依赖引入(基于SpringBoot)(二)自定义权限注解(三)AOP切面类实现(四)远程权限服务接口(Feign示例)(五)在业务方法中应用注解一、核心思想在现代软件开发中,权限认证是保......
  • 计算机网络原理之HTTP与HTTPS
    一、前言为了理解HTTP,我们有必要事先了解一下TCP/IP协议簇。通常我们使用的网络(包括互联网)是在TCP/IP协议簇的基础上运作的。而HTTP属于它内部的一个子集。计算机与网络设备要相互通信,双方必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用那种语言进......
  • 【055】基于51单片机16x16点阵显示/广告牌【Proteus仿真+Keil程序+报告+原理图】
    ☆、设计硬件组成:51单片机最小系统+16*16点阵显示屏+74HC595驱动电路+按键控制。1、设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片;2、采用4片74HC595驱动16*16点阵显示屏显示;3、默认显示内容“老师您辛苦了!”,如果需要修改显示内容直接将内容发送给我即可;4......