skip-gram模型原理与pytorch实现代码讲解

这个博客初衷是
摘要由CSDN通过智能技术生成

这个博客初衷是学习word2vec,实现skip-gram模型。但学习过程中遇到了很多不会的,就补一补其它的知识,实践时也遇到了一些命令语句不懂是什么意思,现在对学习时遇到的问题以及参考资料做一个总结,供大家参考。

word2vec与one-hot相比,主要是可以计算词与词之间的距离,而且可以避免高维和稀疏性。word2vec有CBOW(根据上下文词计算当前词出现的概率)和skip-gram(根据当前词计算上下文词出现的概率)两种模型。网上有很多资料对word2vec进行了讲解,下面贴几个自己觉得讲的通俗易懂的资料。
漫谈Word2vec之skip-gram模型
通俗理解word2vec
word2vec 中的数学原理详解
最后一个链接,可以在已经了解的差不多了再去看更快。

CBOW模型更适合小型语料库,当样本量大时,skip-gram模型效果更好,因此,我主要学习的也是skip-gram模型,下面说一下学习的逻辑和重点。

  1. skip-gram的优化目标
    skip-gram模型理解

  2. 如何计算给定中心词条件下背景词的概率
    输入层为one-hot向量,经过隐藏层(权重矩阵的某一行就为该词的词向量,Vw),再经过输出层(背景词的词向量Uc),然后两个向量相乘,最后经过softmax,输出当前词给定情况下背景词出现的概率。
    i) 这里需要知道的是向量的点积可以衡量两个向量的相似度(根据余弦相似度公式,两个向量点积越大,表明越相似。)
    ii) softmax,可以理解为一种软max,与max相比,可以让值小的那个也有一定的概率出现,下面的资料讲的很清楚
    初探softmax
    Softmax 函数的特点和作用是什么?

  3. 为什么要负采样?如何进行的负采样?负采样之后优化目标是什么?
    根据优化目标可以看到,需要计算整个词典中不是中心词的上下文词出现的概率,这个样本量是非常大的,会产生很大的计算负荷。
    为什么Skip-gram负采样中negative words要选取频率高的词汇?
    如何做的?就是采取一些出现次数较多的词作为负样本,具体参考
    理解 Word2Vec 之 Skip-Gram 模型

  4. 实践部分,采用的pytorch框架,如果你还没有安装,可以参考我上一个博客python3.7.3+cuda9.2安装pytorch
    下面讲一讲看代码时遇到的不懂的命令。
    1)首先,需要懂一点pytorch知识。
    PyTorch基础学习总结
    其中常用的两个包torch.nn和torch.optim也涉及到了。
    2) 出现“Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. ”

    import os
    
    os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
    

    3) 一些命令,比如torch.bmm()等
    torch.bmm() 与 torch.matmul()
    Pytorch学习笔记14----torch中相关函数使用:view函数、max()函数、squeeze()函数
    torch.multinomial()理解
    yield:yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始
    python中yield的用法详解——最简单,最清晰的解释
    numpy.random.randint用法
    Python collections.Counter()函数: 词频统计
    如何运用PYTHON里的Counter
    torch.from_numpy: 将numpy中的数组转换为tensor。
    Pyorch之numpy与torch之间相互转换
    Python List extend()方法:和append作用一样吧,都是将某个元素添加到list中,没仔细研究。
    torch.squeeze():用来降维。
    pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法
    pytorch中long.tensor和普通的tensor有什么不同?
    torch.Tensor默认是torch.FloatTensor是32位浮点类型数据,torch.LongTensor是64位整型

# conding = utf-8
"""
@目的:学习并实现skip-gram模型
"""

import numpy as np
import torch
from torch import nn, optim
import random
from collections import Counter
import matplotlib.pyplot as plt
import os

os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'
#训练数据
text = "I like dog i like cat i like animal dog cat animal apple cat dog like dog fish milk like dog \
cat eyes like i like apple apple i hate apple i movie book music like cat dog hate cat dog like"

#参数设置
EMBEDDING_DIM = 2 #词向量维度
PRINT_EVERY = 10 #可视化频率
EPOCHS = 10 #训练的轮数
BATCH_SIZE = 5 #每一批训练数据大小
N_SAMPLES = 3 #负样本大小
WINDOW_SIZE = 5 #周边词窗口大小
FREQ = 0 #词汇出现频率(可以删除低频词)
DELETE_WORDS = False #是否删除部分高频词

#文本预处理
def preprocess(text, FREQ):
    text = text.lower()      #有的会大写,有的小写,用小写进行统一
    words = text.split()
    #去除低频词
    word_counts = Counter(words)
    
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值