当前位置: 首页 > news >正文

1.7-自然语言的分布式表示-skip-gram模型代码实现

文章目录

  • 1 skip-gram模型的实现
    • 1.1模型结构的实现
    • 1.2前向传播的实现
    • 1.3反向传播的实现
  • 2 skip-gram模型的计算与学习
  • 3总结

  1. 书上提供了skip-gram模型的代码实现,但是没有去讲解;这里我们自己来看看他提供的代码;
  2. 看代码的时候,尤其注意他和前面所说的CBOW模型在实现上的区别;
  3. 这里也提供了一份完整的副本:https://1drv.ms/u/s!AvF6gzVaw0cNjqFRa39YunPQdYGINQ?e=o8BLSu;

1 skip-gram模型的实现

1.1模型结构的实现

  1. 下图为skip-gram模型与CBOW模型在模型结构实现上的代码对比:

    在这里插入图片描述

    1. 都是使用 w i n w_{in} win w o u t w_{out} wout作为输入侧和输出侧的权重矩阵;

    2. skip-gram模型输入是中间的目标词,因此只需要一个输入层来处理一个单词即可

    3. 从前面讲述的skip-gram模型的网络结构来看(即下图),因为要预测的是上下文,所以输出侧多次使用了 w o u t w_{out} wout;但是在代码实现上,也只是构建了一个out_layer;可以不可以构建两个out_layer(这两个out_layer共享权重 w o u t w_{out} wout)呢?

      在这里插入图片描述

      1. 答案是可以的,这两种方式在前向计算时应该是没有区别的,效果一样;区别主要在于反向传播的时候
      2. 使用一个out_layer,由于后面计算损失还是要计算两次然后损失相加,因此反向传播时当计算完两个损失的分支之后,需要先累加两路分支的梯度,然后再经过out_layer层的反向传播计算 w o u t w_{out} wout的梯度;即先累加损失分支的梯度,再求 w o u t w_{out} wout的梯度;
      3. 使用两个out_layer,则每个损失反向传播结束后,分别进入各自的out_layer层进行反向传播,得到各路分支对各自层的 w o u t w_{out} wout​的梯度;此时就需要模仿CBOW模型在训练时的处理,即需要将共享权重的梯度进行整合,也即将这些梯度累加。
    4. Skip-gram模型的损失计算层有两个(前提是上下文窗口大小为1),而CBOW模型的损失计算层只有一个,因为目标词就是它的预测目标;

    5. 其余内容一样:梯度和参数的整理等

1.2前向传播的实现

  1. 两个模型的前向计算过程对比如下图所示:

    在这里插入图片描述

    1. 注意此时Skip-gram模型的输入是target,即目标词;这与CBOW模型不同
    2. CBOW由于有两个输入层,因此两个输入层计算好之后需要相加再平均才能得到中间层的结果;而Skip-gram模型则是一步到位;
    3. 中间层到输入层一样,因为在代码实现上两者都是一个out_layer
    4. CBOW模型只需要计算一个损失即可;Skip-gram模型则使用了两次输出,分别与上下文单词计算了损失,并求和作为最终损失;

1.3反向传播的实现

  1. 两个模型的反向传播计算过程对比如下图所示:

    在这里插入图片描述

    1. CBOW模型只有一个损失层,所以反向传播只计算一次;而Skip-gram模型有两个损失计算层,所以计算了两个;且根据前向传播计算图,模型输出形成两路分支来计算两个损失,因此反向传播到这个分支处时,梯度需要累加;所以out_layer的输出侧的梯度是ds = dl1 + dl2
    2. 之后的反向传播过程两个模型一样;

2 skip-gram模型的计算与学习

  1. 实现skip-gram模型的前向计算的代码与CBOW相差无几,两者的对比如下:

    在这里插入图片描述

  2. skip-gram模型的训练和学习的实现:

    1. 这里没有专门去写这部分的代码,但是基本上都和CBOW模型的训练过程类似;

    2. 要说区别的话,其实就是少了一个梯度整合的过程,因为这里我们只用了一个输入层权重和输出层权重,不存在权重共享的情况;

      在这里插入图片描述

3总结

  1. 目前学习到的CBOW模型和skip-gram模型都是基于推理的方法,说白了就是神经网络的方法;和书上一样,我们再来总结一下这两类方法;
  2. 基于计数的方法通过 对整个语料库的统计数据进行一次学习(其实就是统计了)来获得单词的分布式表示,而基于推理的方法是通过神经网络进行学习,这个学习除了学习到单词的分布式表示,其实还可以学习到一些模式;
    1. 因此,当语料库发生变化时,基于计数的方法的成本问题就出现了
    2. 而基于推理的方法, 可以通过mini-batch的学习,实现增量学习,进一步更新模型的参数,成本较低;

-----------以下是书上原话-------------

  1. 但是,不是说基于推理的方法就是优于基于计数的方法,实际上,有研究表明,就单词相似性的定量评价而言,基于推理的方法和基于计数的方法难分上下
  2. 基于推理的方法和基于计数的方法存在关联性
    1. 具体地说,使用了 skip-gram 和下一章介绍的 Negative Sampling 的模型被证明与对整个语料库的共现矩阵(实际上会对矩阵进行一定的修改)进行特殊矩阵分解的方法具有相同的作用;即这两种方法在某些条件下是相通的,详见论文;
  3. GloVe方法融合了基于推理的方法和基于计数的方法。该方法的思想是,将整个语料库的统计数据的信息纳入损失函数,进行 mini-batch 学习。据此,这两个方法论成功地被融合在了一起。

相关文章:

  • Psychtoolbox 脑电实验范式之mp4视频绘制
  • 双指针系列第 8 篇:盛水最多的容器。几句话讲明白!
  • windows安装Gitblit还是Bonobo Git Server
  • spring-security安全框架(超精细版附带流程讲解图)
  • Patch embed 的映射矩阵多大?
  • redis的数据类型对应的使用场景
  • 快速了解GPT-4o和GPT-4区别
  • springboot在线考试系统-计算机毕业设计源码90381
  • android模糊背景的实现
  • 【论文阅读】--Popup-Plots: Warping Temporal Data Visualization
  • 不是大厂云用不起,而是五洛云更有性价比
  • 【前端VUE】VUE3第一节—vite创建vue3工程
  • 二叉树中序遍历-递归法详解-数据结构与算法
  • Qt/C++模拟鼠标键盘输入
  • 【ruoyi】docker 项目实战
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 「译」Node.js Streams 基础
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • Laravel 菜鸟晋级之路
  • Lsb图片隐写
  • Median of Two Sorted Arrays
  • Python 反序列化安全问题(二)
  • Python利用正则抓取网页内容保存到本地
  • WePY 在小程序性能调优上做出的探究
  • 测试开发系类之接口自动化测试
  • 从输入URL到页面加载发生了什么
  • 关于使用markdown的方法(引自CSDN教程)
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 前端js -- this指向总结。
  • 前端技术周刊 2019-02-11 Serverless
  • 深度解析利用ES6进行Promise封装总结
  • 为什么要用IPython/Jupyter?
  • 小程序 setData 学问多
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (SpringBoot)第二章:Spring创建和使用
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (一一四)第九章编程练习
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .net连接MySQL的方法
  • .NET业务框架的构建
  • .net知识和学习方法系列(二十一)CLR-枚举
  • /etc/fstab和/etc/mtab的区别
  • @Import注解详解
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [Android] 修改设备访问权限
  • [AutoSar NVM] 存储架构
  • [AutoSar]BSW_Com02 PDU详解
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [AutoSAR系列] 1.3 AutoSar 架构