【Spark-ML源码解析】Word2Vec

前言

在阅读源码之前,需要了解Spark机器学习Pipline的概念。

相关阅读:SparkMLlib之Pipeline介绍及其应用

这里比较核心的两个概念是:Transformer和Estimator
Transformer包括特征转换和学习后的模型两种情况,用来将一个DataFrame转换成另一个DataFrame;
Estimator接收一个DataFrame并输出一个模型(Transformer)。

Word2Vec类是一个Estimator,实现了fit方法,返回模型Word2VecModel,即一个Transformer,该类实现了transform方法。

代码逐行注释见文章:链接
哈夫曼编码复习:哈夫曼编码
阅读中有任何疑问,请参考PDF《word2vec 中的数学原理详解》

Word2VecBase——Word2Vec和Word2VecModel的参数类

参数名介绍默认大小
vectorSize单词的Embedding维度100
windowSize窗口大小,上下文单词在[-window,window]5
numPartitions训练数据的分区数1
minCount单词出现的最低次数5
maxSentenceLength单个序列的最大长度,所有序列合并后根据该值截断1000
stepSize优化器的步长0.025
maxIter最大迭代次数1
inputCol只支持string类型的数据1
outputCol训练数据的分区数1
seed随机种子this.getClass.getName.hashCode.toLong

Word2Vec

Word2Vec训练一个模型Map(String,Vector)

ml包——流程构建

ml包中的Word2Vec仅仅是“格式化”成了新版Pipline流程,具体的模型训练代码还是调用的mllib包的Word2Vec。

基础功能:

  • 各种set方法。设置Word2VecBase里的参数,如setInputCol、setOutputCol等
  • 重写PipelineStage类的transformSchema方法。用来check输入列的类型以及生成输出列
  • 重写Estimator的copy方法。复制一个Word2Vec对象,UID相同,Embedding矩阵和参数不同

核心功能:

  • 重写Estimator的fit方法,调用mllib包的Word2Vec

其余功能:

  • 实现DefaultParamsWritable,具有模型保存的功能。

mllib包——模型训练逻辑

从注释来看,该实现完全重写的C版本的。实现了skip-gram模型,并使用分层softmax方法来训练模型。

词库实体类

首先映入眼帘的是一个VocabWord的case class,包含属性如下:

  • word——词
  • cn——单词出现次数
  • point——存的是从根节点到这个词对应的叶子节点的路径经过的节点,最大40
  • code——Huffman编码,最大40
  • codeLen——路径长度

fit方法

整体流程:

  1. 调用learnVocab方法。初始化词表vocab(VocabWord数组)和vocabHash(词->索引映射Map,根据词频排序),输出一些统计信息。

这块会拉到driver节点计算,因此driver内存设置和词表大小相关。

  1. 调用createBinaryTree方法。

    这一步按照词频构建出一个Huffman树。这里为每个词保存point和code属性,point是每个单词的路径经过的非叶子节点,每个节点为一个二分类器,对应一个参数向量θ;code则为值为{0,1}的Huffman编码,也即为路径上每个二分类器的真实Label,是logloss计算公式中的一个参数。

skip-gram下,通过中心词预测上下文词时,预测概率就是上下文词对应叶子节点的路径上二分类器预测的概率乘积;损失函数就是这条路径上一系列二分类的logloss之和。也就是说层次哈夫曼树方法将Softmax计算转成了logN复杂度的二分类计算。

  1. 广播exp计算表、词对象表和词索引表

    exp计算表是为了加速计算。x大于6和小于-6的时候,simoid函数值都无限接近1和0。将范围限制在[-6,6]之间,将该区间划分为1000份,近似计算好sigmoid(x)对应的取值,能够显著减少计算量。

  2. 执行doFit方法(分布式梯度上升法参数训练)

    这里首先需要明确是梯度上升法学习的参数有哪些?词向量矩阵V和二分类器参数θ。

    doFit流程:

    1. 构造sentences

    2. 梯度上升法训练
      梯度下降法步骤
      注:每计算一个context word就更新一次v(·),源码中neu1e为e,syn1为θ,syn0为v。

Word2VecModel

这块的代码没啥可看的。在doFit训练时通过wordIndex和wordVector两个参数创建。重写的transform函数,主要功能是将每个单词转换成一个向量,即查map。

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

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

相关文章

支持向量机 支持向量机概述

支持向量机概述 支持向量机 Support Vector MachineSVM ) 是一类按监督学习 ( supervisedlearning)方式对数据进行二元分类的广义线性分类器 (generalized linear classifier) ,其决策边界是对学习样本求解的最大边距超亚面 (maximum-margin hyperplane)与逻辑回归和…

Unity | Shader基础知识(第七集:案例<让图片和外部颜色叠加显示>)

目录 一、本节介绍 1 上集回顾 2 本节介绍 二、添加图片资源 三、 常用cg数据类型 1 float 2 bool 3 sampler 四、加入图片资源 五、使用图片资源 1 在通道里加入资源 2 使用图片和颜色叠加 2.1 2D纹理采样tex2D 2.2 组合颜色 六、全部代码 七、下集介绍 相关…

26 redis 中 replication/cluster 集群中的主从复制

前言 我们这里首先来看 redis 这边实现比较复杂的 replication集群模式 我们这里主要关注的是 redis 这边的主从同步的相关实现 这边相对比较简单, 我们直接基于 cluster集群模式 进行调试 主从命令同步复制 比如这里 master 是 redis_7002, slave 是 redis_7005 然后 这…

11.HarmonyOS鸿蒙app_page的显示跳转方法

11.HarmonyOS鸿蒙app_page的显示跳转方法&#xff0c;text文本触发点击事件 使用Intent和Operation对象 创建新项目后&#xff0c;再创建secondPageAbility ability_main.xml <?xml version"1.0" encoding"utf-8"?> <DirectionalLayoutxmlns:…

LeetCode(65)LRU 缓存【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; LRU 缓存 1.题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 k…

【ArkTS】路由传参

传参 使用router.pushUrl()&#xff0c;router.push()官方不推荐再使用了。 格式&#xff1a; router.pushUrl({url: 路由地址,params:{参数名&#xff1a;值} )跳转时需要注意路由表中是否包含路由地址。 路由表路径&#xff1a; entry > src > main > resources &g…

Python+pip下载与安装

Hi, I’m Shendi Pythonpip下载与安装 最近有识别图片中物体的需求&#xff0c;于是选用了TensorFlow&#xff0c;在一番考虑下&#xff0c;还是选择直接使用Python。 Python下载安装 直接在搜索引擎搜索Python或通过 https://www.python.org 进入官网 在 Downloads 处点击 Al…

Gin之GORM的表关联查询操作详解

前期工作&#xff1a; 先查看下要操作的两张表&#xff1a; carton carton_cate //关系如下&#xff1a; // 一个章节对应一个动漫&#xff08;一对一&#xff1b;两种方法&#xff1a;belong to&#xff1b;has one&#xff09; // 一个动漫可以对应多个章节&#xff08;一…

Eclipse_01_如何设置代码文件背景颜色为护眼沙绿色

设置方法 Window --> Preference 参考文档 参考文档 1

uni-app ucharts中饼图与圆环图区别

项目情况&#xff1a; uni-app的用于移动端H5项目&#xff0c;包使用uni_modules目录存放。 图表引用ucharts中的echarts配置的组件方式 区别1 饼图与圆环图在echarts使用的配置都是pie类型。但是配置raduis使用&#xff1a; radius: [40%, 70%] 区别2 组件type指明&#xf…

Linux 非阻塞网络IO模式

非阻塞网络IO模式介绍 当用户线程发起一个 read 操作后&#xff0c;并不需要等待&#xff0c;而是马上就得到了一个结果。如果结果是一个 error 时&#xff0c;它就知道数据还没有准备好&#xff0c;于是它可以再次发送 read 操作。一旦内核中的数据准备好了&#xff0c;并且又…

修复泰坦陨落2缺少msvcr120.dll的5种方法,亲测有效

游戏《泰坦陨落2》缺少msvcr120.dll的问题困扰着许多玩家。这个问题的主要原因可能是系统环境不完整、软件或游戏版本不匹配、DLL文件丢失或损坏以及杀毒软件误判等。msvcr120.dll是Microsoft Visual C 2013 Redistributable的一个组件&#xff0c;它包含了许多运行库文件&…

【百度PARL】强化学习笔记

文章目录 强化学习基本知识一些框架Value-based的方法Q表格举个例子 强化的概念TD更新 Sarsa算法SampleSarsa Agent类 On_policy vs off_policy函数逼近与神经网络DQN算法DQN创新点DQN代码实现model.pyalgorithm.pyagent.py总结&#xff1a;举个例子 实战 视频&#xff1a;世界…

苏宁开放平台API接口全攻略:掌握电商数据,提升业务效率

一、概述 苏宁平台提供了丰富的API接口&#xff0c;用于开发人员与平台进行交互&#xff0c;实现各种功能。本文将介绍苏宁平台API接口的基本概念、使用方法和注意事项&#xff0c;帮助开发人员更好地利用这些接口&#xff0c;提高开发效率和质量。 二、API接口介绍 商品详情…

html之CSS的高级选择器应用

文章目录 一、CSS高级选择器有哪些呢&#xff1f;二、高级选择器的应用1、层次选择器后代选择器子选择器相邻兄弟选择器通用兄弟选择器 2、结构伪类选择器&#xff08;不常用&#xff09;3、属性选择器E[attr]E[attrval]E[attr^val]E[attr$val]E[attr*val] 一、CSS高级选择器有…

excel该如何实现生成条形码/二维码?

如何在Excel中制作条形码/二维码&#xff1f; 1.首先&#xff0c;打开电脑上的Excel。进入后&#xff0c;在上方菜单栏中找到并点击“开发工具”。如果没有找到开发工具&#xff0c;就先点击“文件”&#xff0c;在弹出菜单中再点击“选项”。 2.打开Excel选项窗口后&#xff0…

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka

【Flink-cdc-Mysql-To-Kafka】使用 Flinksql 利用集成的 connector 实现 Mysql 数据写入 Kafka 1&#xff09;环境准备2&#xff09;准备相关 jar 包3&#xff09;实现场景4&#xff09;准备工作4.1.Mysql4.2.Kafka 5&#xff09;Flink-Sql6&#xff09;验证 1&#xff09;环境…

VuePress安装及使用——使用 Markdown 创建你自己的博客网站和电子书

目录 前言一、依赖环境二、vuepress 安装和使用1.初始化2.将 VuePress 安装为本地依赖3. package.json 中添加脚本4. 新建 docs 文件夹5.启动6. 效果 三、进阶使用1.新增配置文件2.安装搜索插件3.config.js 中增加配置4.效果展示5.注意 四、使用主题1.安装2. 目录结构说明&…

Hadoop3.x完全分布式模式下slaveDataNode节点未启动调整

目录 前言 一、问题重现 1、查询Hadoop版本 2、集群启动Hadoop 二、问题分析 三、Hadoop3.x的集群配置 1、停止Hadoop服务 2、配置workers 3、从节点检测 4、WebUI监控 总结 前言 在大数据的世界里&#xff0c;Hadoop绝对是一个值得学习的框架。关于Hadoop的知识&…

git修改远程commit信息

git 修改远程commit信息 如果你已经把本地commit的信息push到远程了&#xff0c;此时需要修改远程中的commit信息 第一步&#xff1a;git log 查看提交的信息,看下提交的commit日志 如下入所示 第二步&#xff1a;然后确定你需要修改的那一次commit&#xff0c;比如&#xf…