Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量

这篇具有很好参考价值的文章主要介绍了Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量

任务六:学会训练FastText、Word2Vec词向量
  • 说明:在这个任务中,你将学习如何训练FastText和Word2Vec词向量模型,这些词向量模型可以捕捉文本中的语义信息。
  • 实践步骤:
    1. 准备大规模文本语料库。
    2. 使用FastText或gensim库中的Word2Vec类,设置相应的参数(如词向量维度、窗口大小、训练迭代次数等)来构建词向量模型。
    3. 使用Word2Vec类的build_vocab()方法,构建词汇表。
    4. 使用Word2Vec类的train()方法,训练词向量模型。

Word2Vec

word2vec主要包括Skip-Gram和CBOW两种模型。

Skip-Gram是利用一个词语作为输入,来预测它周围的上下文 ,CBOW是利用一个词语的上下文作为输入,来预测这个词语本身 。

word2vec模型其中有两种训练方式:skip-gram与CBOW,此外,还有两种加速训练的trick:hierarchical sofmtmax与negative sampling。
Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量,?学习打卡,word2vec,人工智能,自然语言处理

简单情形

输入:one-hot encoder

隐层:对输入的词求和取平均+线性层

输出:隐层

word2vec的本质:是一种降维操作——把词语从 one-hot encoder 形式的表示降维到 Word2vec 形式的表示,是一个|V|分类问题。

训练目标: 极小化负对数似然

Tip: CBOW的窗口内部丢掉了词序信息,但是在窗口滑动过程中是按照通顺的自然语言顺序滑动的,或者样本就是按照一定的语序取出来的,所以最终得出的词向量中会包含一定的语序信息。

Word2vec 的训练trick

Word2vec 本质上是一个语言模型,它的输出节点数是 V 个,对应了 V 个词语,本质上是一个多分类问题,但实际当中,词语的个数非常非常多,会给计算造成很大困难,所以需要用技巧来加速训练。

  • Word pairs and “phase”: 对常见的单词进行组合或者词组作为单个words来处理(比如"New York","United Stated"

  • **高频词采样:**对高频词进行抽样来减少训练样本的个数(比如the这个词在很多次的窗口中出现吗,他对其他词语义学习的帮助不大,并且,更多包含the的训练数据远远超出了学习the这个词向量所需要的样本数)

  • **负采样:**用来提高训练速度并且改善所得到词向量的质量 。

    随机选取部分词作为负样本(比如当vocab_size为10000时,训练样本 input word:"fox",output word:"quick" ,在9999个负样本的权重中选择5-20个更新,参数大大减少)。

    • 如何选择negative words?

      根据词频进行负采样,出现概率高的单词容易被选为负样本。 每个单词被赋予一个权重。

    • 层次softmax(Hierarchical Softmax)

      在进行最优化的求解过程中:从隐藏层到输出的Softmax层的计算量很大,因为要计算所有词的Softmax概率,再去找概率最大的值。

      word2vec采用了霍夫曼树来代替从隐藏层到输出softmax层的映射 。

      和之前的神经网络语言模型相比,霍夫曼树的所有内部节点就类似之前神经网络隐藏层的神经元,其中,根节点的词向量对应我们的投影后的词向量,而所有叶子节点就类似于之前神经网络softmax输出层的神经元,叶子节点的个数就是词汇表的大小。在霍夫曼树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着霍夫曼树一步步完成的,因此这种softmax取名为 Hierarchical Softmax

      在word2vec中,我们采用了二元逻辑回归的方法,即规定沿着左子树走,那么就是负类(霍夫曼树编码1),沿 着右子树走,那么就是正类(霍夫曼树编码0)。判别正类和负类的方法是使用sigmoid函数, 采用随机梯度上升求解二分类,每计算一个样本更新一次误差函数 。

      使用霍夫曼树有什么好处:

首先,由于是二叉树,之前计算量为V,现在变成了log2V

第二,由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合贪心优化思想。

fasttext

fasttext是基于浅层神经网络训练的,其训练方式与word2vec中的CBOW方式如出一辙,fasttext是对整个句子的n-gram特征相加求平均,得到句向量,在根据句向量做分类。

fasttext的输入:embedding过的单词的词向量和n-gram向量

内存考虑:哈希映射,将n-gram映射到固定K个的索引上,相同的索引共享相同的embedding。

fasttext与word2vec对比

  • fasttext用作分类是有监督的,word2vec是无监督的
  • fasttext输入部分考虑了n-gram特征,word2vec的输入只有one-hot encoder
  • fasttext可以表示oov的单词

word2vec的不足:

  1. 多义词的问题。
  2. Word2vec 是一种静态的方式,无法针对特定任务做动态优化

fasttext的不足:

fastText很难学出词序对句子语义的影响,对复杂任务还是需要用复杂网络学习任务的语义表达。

gensim中word2vec的使用

首先我们先介绍一下gensim中的word2vec API,官方API介绍如下:

class Word2Vec(utils.SaveLoad):
    def __init__(
            self, sentences=None, size=100, alpha=0.025, window=5, min_count=5,
            max_vocab_size=None, sample=1e-3, seed=1, workers=3, min_alpha=0.0001,
            sg=0, hs=0, negative=5, cbow_mean=1, hashfxn=hash, iter=5, null_word=0,
            trim_rule=None, sorted_vocab=1, batch_words=MAX_WORDS_IN_BATCH):

gensim中,word2vec相关的API都在包gensim.models.word2vec中。和算法有关的参数都在类gensim.models.word2vec.Word2Vec中。算法需要注意的参数有:

  • sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出(通过word2vec提供的LineSentence类来读文件,word2vec.LineSentence(filename))。
  • vector_size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。
  • window:即词向量上下文最大距离,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。
  • sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1,则是Skip-Gram模型,默认是0,即CBOW模型。
  • hs: 即我们的word2vec两个解法的选择了,如果是1, 则是Hierarchical Softmax,是0的话并且负采样个数negative大于0, 则是Negative Sampling。默认是0Negative Sampling
  • negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。
  • cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的xw��为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示xw��,默认值也是1,不推荐修改默认值。
  • min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。
  • iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。
  • alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,默认是0.025
  • min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。

导入相关库和模块

使用Python导入所需的库和模块。对于FastText,你可以使用FastText库;对于Word2Vec,你可以使用gensim库。

# 导入FastText库
from gensim.models.fasttext import FastText

# 导入Word2Vec库
from gensim.models import Word2Vec

训练Word2Vec

简单样例

首先我们可以设置模型参数并构建词向量模型:为模型选择适当的参数,例如词向量维度、窗口大小、训练迭代次数等。然后,使用FastText或Word2Vec类创建词向量模型。这里是一个比较小的样例,这样就可以进行训练我们的Word2Vec模型

from gensim.test.utils import common_texts
from gensim.models import Word2Vec

model = Word2Vec(sentences=common_texts,vector_size=100, window=5, min_count=1, workers=4)
model.save("word2vec.model")

在上面的示例中,size 参数表示词向量的维度,window 参数表示词语的上下文窗口大小,min_count 参数表示词语在语料库中的最低出现次数。

构建词汇表

构建词汇表:使用Word2Vec类的 build_vocab() 方法,根据语料库构建词汇表。

这里我们可以根据我们的数据的content,构建一个词汇表,为接下来的训练做准备

contents = train_data['content'].apply(lambda x:x.split(' ')).tolist() # contents字段
model = Word2Vec(min_count=1)
model.build_vocab(contents)  # prepare the model vocabulary

训练模型

训练词向量模型:使用Word2Vec类的 train() 方法,对词向量模型进行训练。

# 训练Word2Vec词向量模型
model.train(contents, total_examples=model.corpus_count, epochs=model.epochs)  # train word vectors
model.save("word2vec.model")

在上面的示例中,cpmtents 是训练数据,total_examples 表示语料库的总样本数,epochs 表示训练迭代次数。这些也可以在定义模型的到时候修改一下参数,这里我们使用的是默认参数

训练过程会根据语料库中的文本数据来更新词向量模型的权重和参数,使得模型能够学习到词语之间的语义信息。

完成以上步骤后,你将得到训练好的FastText或Word2Vec词向量模型,可以使用它们来获取词语的向量表示,进行词语相似度计算、文本分类等自然语言处理任务。

预训练模型

Gensim在Gensim-data资源库中附带了几个已经预先训练好的模型

为了能得到更好的结果,所以如果利用一些预训练的Word2Vec可能会得到更好的结果,所以这里我们也可以下载一些已有的模型

import gensim.downloader

print(list(gensim.downloader.info()['models'].keys()))      # 在gensim-data中显示所有可用的模型
['fasttext-wiki-news-subwords-300', 'conceptnet-numberbatch-17-06-300', 'word2vec-ruscorpora-300', 'word2vec-google-news-300', 'glove-wiki-gigaword-50', 'glove-wiki-gigaword-100', 'glove-wiki-gigaword-200', 'glove-wiki-gigaword-300', 'glove-twitter-25', 'glove-twitter-50', 'glove-twitter-100', 'glove-twitter-200', '__testing_word2vec-matrix-synopsis']
glove_vectors = gensim.downloader.load('glove-twitter-25')      # 下载 "glove-twitter-25 "的嵌入
print(glove_vectors.most_similar('twitter'))      # 照常使用下载的向量

在这里我们使用的还是word2vec的模型,所以选取一个比较好的word2vec的模型进行微调,不过这里也会有一个缺陷,由于比赛的数据是已经经过处理的,所以其实很难看出原有的意思表示,所以来说,不一定能得到一个比较好的结果,不过可以先进行尝试

使用训练好的模型预测

import gensim
model = gensim.models.Word2Vec.load('word2vec.model')
#查看某个字词的向量:
print(model['5212'])
#查看与该词最接近的其他词汇及相似度:
print(model.most_similar(['0']))
#查看两个词之间的相似度:
model.similarity('5212','0')
[-5.3622725e-04  2.3643016e-04  5.1033497e-03  9.0092728e-03
 -9.3029495e-03 -7.1168090e-03  6.4588715e-03  8.9729885e-03
 -5.0154282e-03 -3.7633730e-03  7.3805046e-03 -1.5334726e-03
 -4.5366143e-03  6.5540504e-03 -4.8601604e-03 -1.8160177e-03
  2.8765798e-03  9.9187379e-04 -8.2852151e-03 -9.4488189e-03
  7.3117660e-03  5.0702621e-03  6.7576934e-03  7.6286553e-04
  6.3508893e-03 -3.4053659e-03 -9.4640255e-04  5.7685734e-03
 -7.5216386e-03 -3.9361049e-03 -7.5115822e-03 -9.3004224e-04
  9.5381187e-03 -7.3191668e-03 -2.3337698e-03 -1.9377422e-03
  8.0774352e-03 -5.9308959e-03  4.5161247e-05 -4.7537349e-03
 -9.6035507e-03  5.0072931e-03 -8.7595871e-03 -4.3918253e-03
 -3.5099984e-05 -2.9618264e-04 -7.6612402e-03  9.6147414e-03
  4.9820566e-03  9.2331432e-03 -8.1579182e-03  4.4957972e-03
 -4.1370774e-03  8.2453492e-04  8.4986184e-03 -4.4621779e-03
  4.5175003e-03 -6.7869616e-03 -3.5484887e-03  9.3985079e-03
 -1.5776539e-03  3.2137157e-04 -4.1406299e-03 -7.6826881e-03
 -1.5080094e-03  2.4697948e-03 -8.8802812e-04  5.5336617e-03
 -2.7429771e-03  2.2600652e-03  5.4557943e-03  8.3459523e-03
 -1.4537406e-03 -9.2081428e-03  4.3705511e-03  5.7178497e-04
  7.4419067e-03 -8.1328390e-04 -2.6384138e-03 -8.7530091e-03
 -8.5655687e-04  2.8265619e-03  5.4014279e-03  7.0526553e-03
 -5.7031228e-03  1.8588186e-03  6.0888622e-03 -4.7980524e-03
 -3.1072616e-03  6.7976285e-03  1.6314745e-03  1.8991709e-04
  3.4736372e-03  2.1777629e-04  9.6188262e-03  5.0606038e-03
 -8.9173913e-03 -7.0415614e-03  9.0145587e-04  6.3925339e-03]
[('4952', 0.37755849957466125), ('2195', 0.3286932408809662), ('4369', 0.32638630270957947), ('5137', 0.3003348112106323), ('4682', 0.29854971170425415), ('4130', 0.27968209981918335), ('97', 0.2749629318714142), ('339', 0.27286359667778015), ('3541', 0.27277031540870667), ('4780', 0.2706093490123749)]
-0.027750365

参考文章来源地址https://www.toymoban.com/news/detail-570116.html

  • https://xiaomindog.github.io/2021/06/22/word2vec-and-fastText/
  • Word2Vec Tutorial - The Skip-Gram Model
  • 秒懂词向量Word2vec的本质
  • https://radimrehurek.com/gensim/models/word2vec.html
  • gensim word2vec库入门——官方手册embeddings和KeyedVectors

到了这里,关于Coggle 30 Days of ML(23年7月)任务六:训练FastText、Word2Vec词向量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 「ML 实践篇」模型训练

    在训练不同机器学习算法模型时,遇到的各类训练算法大多对用户都是一个黑匣子,而理解它们实际怎么工作,对用户是很有帮助的; 快速定位到合适的模型与正确的训练算法,找到一套适当的超参数等; 更高效的执行错误调试、错误分析等; 有助于理解、构建和训练神经

    2023年04月16日
    浏览(50)
  • Unity Perception合成数据生成、标注与ML模型训练

    在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D场景编辑器 任何训练过机器学习模型的人都会告诉你,模型是从数据得到的,一般来说,更多的数据和标签会带来更好的性能。 收集数据,尤其是标记数据非常耗时,因此成

    2024年02月06日
    浏览(43)
  • 【NLP】如何实现快速加载gensim word2vec的预训练的词向量模型

    通过以下代码,实现加载word2vec词向量,每次加载都是几分钟,效率特别低。 (1)方案一 第一次加载后保存为能够快速加载的文件,第二次加载就能快读读取。 (2)方案二 第一次加载后,只将使用到的词向量以表格的形式保存到本地,第二次读取就不需要加载全部word2ve

    2024年03月14日
    浏览(45)
  • Unity的ML-agent训练教程(附环境配置流程)

    1)创建虚拟环境 下载好anaconda后打开anaconda prompt,新建虚拟环境,命名为Unity,通过以下指令: 接下来提过指令 激活虚拟环境Unity 2)在虚拟环境内配置需要用的库 在GitHub上下载unity官方的ml-agent包仓库,下载到位置 在anaconda prompt通过依次输入指令导入库文件 一般会因为网速

    2024年02月20日
    浏览(35)
  • 面试题30天打卡-day23

    在 Spring 框架中,Bean 的生命周期分为以下阶段: 实例化:Spring 容器创建 Bean 实例。这可以通过构造函数实现或者使用工厂方法。 属性赋值:Spring 容器设置 Bean 的属性和依赖关系。可以使用 XML 配置文件或注解等方式进行配置。 初始化方法:如果 Bean 实现了 InitializingBean 接

    2024年02月03日
    浏览(42)
  • sqli 靶场 Level23-Level30 wp

    level-23 (注释被过滤) 抓包 略 寻找注入点 ● id=1’,id=1’\\\',成周期性变化 POC ● POC: id=1’+and+extractValue(1,concat(0x7e,user()))–+’ 结果:failed。怀疑–被过滤掉了,试试前后闭合方案 ● POC: id=1’+and+extractValue(1,concat(0x7e,user()))+and+’ 结果:ok。 level-24(二次注入) 这一关比较特殊

    2024年02月06日
    浏览(40)
  • 【分布式·大数据】大模型赛道如何实现华丽的弯道超车 —— AI/ML训练赋能解决方案

    导读 :Alluxio作为一款强大的分布式统一大数据虚拟文件系统,已经在众多领域展现出了其卓越的应用价值,并且为AI/ML训练赋能提供了一个全新的解决方案。 在人工智能(AI)和机器学习(ML)领域,数据驱动的决策和模型训练已成为现代应用和研究的核心。伴随大模型技术

    2024年02月08日
    浏览(39)
  • 【LeetCode - 每日一题】1654. 到家的最少跳跃次数(23.08.30)

    可以左跳可以右跳 不能连续左跳两次 不能跳到负数 不能跳到 forbidden[] 求可以跳到 x 的最少跳跃次数 a. overview 最初时,只有 0 位置可以进行跳跃;在跳到 a 位置后,又可以跳到 2a 位置和 a-b 位置(如果 ab );然后又多了两个位置(或者一个位置)可以跳跃…因此这是一个

    2024年02月10日
    浏览(44)
  • HUT23级训练赛

    目录 A - tmn学长的字符串1 B - 帮帮神君先生 C - z学长的猫 D - 这题用来防ak E - 这题考察FFT卷积  F - 这题考察二进制  G - 这题考察高精度 H - 这题考察签到 I - 爱派克斯,启动! J - tmn学长的字符串2 K - 秋奕来买瓜 思路:字符串模拟。 对于第一类字符串,其组成一定是合

    2024年02月11日
    浏览(27)
  • 23. 销售额完成任务指标的商品

    题目需求 商家要求每个商品每个月需要售卖出一定的销售总额 假设1号商品销售总额大于21000,2号商品销售总额大于10000,其余商品没有要求 请写出SQL从订单详情表中(order_detail)查询连续两个月销售总额大于等于任务总额的商品 期望结果如下: sku_id (商品id) 1 需要用到

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包