1.10-改进CBOW模型的学习

news2024/9/22 11:23:16

文章目录

  • 0引言
  • 1 cupy包的安装
  • 2解决VScode中matplotlib绘图不显示的问题
  • 3 CBOW模型学习的实现
  • 4 CBOW模型对更复杂模式的捕捉
  • 5单词向量的评价方法
  • 6总结

0引言

  1. 本节将前面实现的改进的CBOW模型在PTB数据集上跑一遍
  2. 由于希望跟书上一样调用GPU,因此需要安装cupy包,途中遇到一些问题,详见下面的安装过程。

1 cupy包的安装

  1. 原本是直接在anaconda3的base环境中使用pip install cupy-cuda11x安装的,但是安装好后执行从cupy数组中获取指定行的数据时报了如下错误:

    1. RuntimeError: CuPy failed to load libnvrtc.so.11.2: OSError: libnvrtc.so.11.2: cannot open shared object file: No such file or directory
  2. 分析发现,这个错误应该是cuda版本的问题,接下来是解决办法;

  3. 需要确认最新版cupy对cuda版本、numpy版本的要求;当然Python版本也要符合要求,因此用到以下资料:

    1. Installation — CuPy 13.2.0 documentation;
    2. Previous PyTorch Versions | PyTorch;
    3. 版本匹配指南:PyTorch版本、Python版本和pytorch_lightning版本的对应关系_pytorch-lightning版本对应-CSDN博客;
  4. 具体而言:

    1. 最新版的numpy为2.0,cupy最新版是支持的;因此可以直接通过pip install numpy

    2. nvidia-smi查看自己电脑的cuda版本,如下图所示;本机支持的最高cuda版本是11.4,因此我这里选择安装11.3版本的cudatoolkit;

      在这里插入图片描述

    3. cudatoolkit=11.3可以安装torch=1.9.0,再看一下torch与Python版本的对应关系,得python=3.9;

  5. 几个版本弄清楚之后就可以开始安装了:

    conda create -n nlp_study pip python=3.9
    conda activate nlp_study
    
    conda install cudatoolkit=11.3 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/linux-64/
    pip install numpy
    pip install cupy-cuda11x
    
  6. 安装好之后执行下面的语句应该就不报错了:

    # 这个函数一开始直接在base环境中使用pip install cupy-cuda11x安装也是不会报错的
    def to_gpu(x):
        import cupy
        
    
        if type(x) == cupy.ndarray:
            return x
        return cupy.asarray(x)
      
    idx = numpy.random.permutation(numpy.arange(data_size))
    x = to_gpu(x)
    x = x[idx] # 是这里会报错;所以进行了上述的安装过程
    
  7. 本书中提供的代码有些许问题,并且参与运算的两个数据一般需要都在gpu上或者都在CPU上;因此代码中额外加入了一些将数据移动到GPU或者CPU的代码,以保证代码能够正确运行。

2解决VScode中matplotlib绘图不显示的问题

  1. 遇到的问题是:vscode中使用juypter时绘图可以显示,但是在代码文件里面写然后运行就不行,而且不报错;
  2. 查了相关博客,以下是有用的:
    1. 参照vscode——matplotlib绘图不显示问题_visualstudio图片怎么出不来plt.plot-CSDN博客:执行了echo $DISPLAYexport DISPLAY=:0.0
    2. 然后又会报解决 UserWarning: FigureCanvasAgg is non-interactive, and thus cannot be shown plt.show()-CSDN博客中的错误,因此选择保存图片来查看绘图的结果;

3 CBOW模型学习的实现

代码目录:https://1drv.ms/f/s!AvF6gzVaw0cNjpx9BAtQYGAHFT3gZA?e=Eso96F;

  1. 上一篇笔记讲述了改进过的CBOW模型的代码实现,包括初始化、前向计算和反向传播;

  2. 这里学习用的trainer函数和之前一样;

  3. 因此代码上就不过多讲述;区别在于这里将相关数据使用本书提供的to_gputo_cpu方法搬到了GPU上,详见代码中的xxx.to_gpu(xxx)

  4. 主要的几个代码文件如下:

    1. CBOW_train.py:程序入口
    2. CBOW_GPU.py:改进之后的GPU版CBOW模型代码
    3. utils/Embedding_GPU.pyutils/negativeSamplingLayer_GPU.pyutils/trainer_GPU.py:GPU版的Embedding层、Embedding_dot层、UnigramSampler模块、NegativeSamplingLoss层;以及GPU版的训练类;
  5. 由于数据量较大,训练时间较长;这里设置max_epoch = 5看一下结果;

  6. 如下图所示是训练过程中的损失变化曲线;同时保存了训练的参数在cbow_params.pkl文件中。

    在这里插入图片描述

  7. 接着,我们用之前的most_similar计算与输入单词最相似的前5个单词;结果如下:

    1. 可见,CBOW模型确实学习到了单词的分布式表示;
    # 与you最相似的
    we  0.8603515625
    i  0.82861328125
    your  0.74169921875
    else  0.7353515625
    someone  0.71875
    # 与year最相似的
    month  0.90673828125
    spring  0.8525390625
    summer  0.8525390625
    week  0.83837890625
    decade  0.7109375
    

4 CBOW模型对更复杂模式的捕捉

主要是类推问题。例如:king − man + woman = queen

  1. 由于CBOW模型可以获得单词的分布式表示,即向量;那么想要推出king − man + woman = queen的问题,则可以转换为单词向量之间的加法和减法;

  2. vec(x)表示单词x的向量表示;则需要计算vec(‘king’) + vec(‘woman’) − vec(‘man’) =?;将计算出来的结果向量作为一个不知道的单词,然后使用most_similar计算与该单词最相似的前几个单词,看看有没有queen,以及queen排第几个;当然,这里要使用most_similar需要修改一下,因为此时传进去的query不是单词而是单词向量了(详见代码里的修改);

  3. 然后我们可以得到以下结果:

    1. take:took = go:went类推出来了;
    2. 但由于迭代次数较少,学习的不好;
    3. 因此可以说,CBOW模型不仅捕获了单词含义,还捕获了模式;
    [analogy] king:man = queen:?
     man: 0.89208984375
     balloon: 0.8408203125
     woman: 0.81884765625
     lady: 0.8056640625
     remember: 0.80322265625
    
    [analogy] take:took = go:?
     went: 0.75732421875
     came: 0.6962890625
     lived: 0.65478515625
     ran: 0.63916015625
     goes: 0.6376953125
    
    [analogy] car:cars = child:?
     adults: 0.779296875
     basketball: 0.7783203125
     pieces: 0.77490234375
     women: 0.76806640625
     college: 0.759765625
    
    [analogy] good:better = bad:?
     better: 0.79931640625
     greater: 0.701171875
     more: 0.69384765625
     less: 0.69140625
     rather: 0.65673828125
    

5单词向量的评价方法

  1. 单词的分布式表示的评价往往与实际应用分开进行。此时,经常使用的评价指标有“相似度”和“类推问题”;
    1. 因为单词的分布式表示通常与其他任务相结合做具体的场景任务,那么组合之后的任务可能非常复杂,这个时候想要从整体上去评价其中一个模块的效果,会非常麻烦。
  1. 单词相似度的评价:
    1. 人工给一些单词之间的相似度进行打分
    2. 使用分布式表示模型得到单词的分布式表示,然后计算余弦相似度;
    3. 将两个打分进行比较
  2. 类推问题
    1. 使用上面提到的类推问题,根据类推的结果来评价分布式表示的好坏;
    2. 基于类推问题可以在一定程度上衡量“是否正确理解了单词含义或语法问题”
    3. 但是,单词的分布式表示的优劣对 目标应用贡献多少(或者有无贡献),取决于待处理问题的具体情况,比如应用的类型或语料库的内容等。也就是说,不能保证类推问题的评价高,目标应用的结果就一定好。这一点请一定注意

6总结

部分内容直接来源于书本。

  1. 到此为止,我们改进了word2vec模型,也看到这个模型不仅可以捕获单词含义,还可以捕获模式;但是由于迭代次数以及数据集的规模较小,效果不好。

  2. 在解决自然语言处理任务时,一般不会使用 word2vec 从零开始学习单 词的分布式表示,而是先在大规模语料库(Wikipedia、Google News 等文 本数据)上学习,然后将学习好的分布式表示应用于某个单独的任务;【如同现在的预训练模型+微调的模式】

  3. 以上的模型获得了单词的分布式表示,那文档的表示怎么弄呢?

    1. 最简单的方法是,把文档的各个单词转化为分布式表示,然后求它们的总和。这是一种被称为 bag-of-words 的不考虑单词顺序的模型(思想);【直接相加,当然没有顺序可言】
    2. 但是,后续的循环神经网络,可以以更加优美的方式利用 word2vec 的单词的分布式表示来将文档转化为固定长度的向量【因为RNN是有顺序的,是考虑了上下文的】

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

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

相关文章

前端Canvas入门——一些注意事项

创建渐变的三种方法: createLinearGradient() - 线性渐变 createRadialGradient() - 径向渐变(放射性渐变) createConicGradient() - 锥形渐变 这三种的核心观点都是: 创建一个gradient对象,然后调用addColorStop()方法…

【软件测试】自动化测试常用函数 -- 详解

一、WebDriver API 一个简单自动化脚本的构成: 脚本解析 # coding utf-8 from selenium import webdriver import time browser webdriver.Firefox() time.sleep(3) browser.get("http://www.baidu.com") time.sleep(3) browser.find_element_by_id(…

Photoshop

彩色转灰度:ctrlshiftu 背景转黑色: 魔术棒容差10 shift连选 shiftF5(填充)钢笔选择 路径 工作路径 将路径作为选区载入 点回图层 按ctrlx删除选区 待更新

[C++]——同步异步日志系统(5)

同步异步日志系统 一、日志消息格式化设计1.1 格式化子项类的定义和实现1.2 格式化类的定义和实现 二、日志落地类设计2.1 日志落地模块功能实现与测试2.2 日志落地模块功能功能扩展 一、日志消息格式化设计 日志格式化模块的作用:对日志消息进行格式化&#xff0c…

Windows 子系统WSL2 Ubuntu使用事项

Windows 子系统WSL2 Ubuntu使用事项 要使外部设备能够访问运行在 Windows 上的 WSL2 实例,你可以端口转发的方法。由于 WSL2 是在虚拟化环境中运行,直接访问比 WSL1 更为复杂. 1 如何实现子系统可以被外部系统SSH 1.1 端口转发: 通过windows代理WSL2的…

微信视频号的视频怎么下载到本地?快速教你下载视频号视频

天来说说市面上常见的微信视频号视频下载工具,教大家快速下载视频号视频! 方法一:缓存方法 该方法来源早期视频技术,因早期无法将大量视频通过网络存储,故而会有缓存视频文件到手机,其目的为了提高用户体验…

stm32入门-----初识stm32

目录 前言 ARM stm32 1.stm32家族 2.stm32的外设资源 3.命名规则 4.系统结构 5.引脚定义 6.启动配置 7.STM32F103C8T6芯片 8.STM32F103C8T6芯片原理图与最小系统电路 前言 已经很久没跟新了,上次发文的时候是好几个月之前了,现在我是想去学习st…

C++继承和多态

目录 继承 继承的意义 访问限定符、继承方式 赋值兼容规则(切片) 子类的默认成员函数 多继承 继承is a和组合has a 多态 什么是多态 形成多态的条件 函数重载,隐藏,重写的区别 override和final 多态原理 继承 继承的…

FinalShell介绍,安装与应用

目录 一、什么是finalshell 二、finalshell功能 三、为什么要用finalshell 四、安装finalshell 五、finalshell使用 1.添加连接 获取虚拟ip地址 2.启动连接 一、什么是finalshell FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工…

在RHEL9.4上启用SFTP服务

FTP存在的不足: 明文传输 FTP传输的数据(包括用户名、密码和文件内容)都是明文的,这意味着数据可以被网络上的任何人截获并读取。没有内置的加密机制,容易受到中间人攻击。 被动模式下的端口问题 FTP的被动模式需要…

server nat表和会话表的作用及NAT地址转换详细

本章节主要讲nat技术的基础 -会话表的建立也是看5元组 -状态检测技术的回包一样也看5元组,但是状态检测技术会看的除开5元组还有更多东西 老哥,你真的应该好好注意一个东西:我们的会话表只是为了后续包的转发,会话表是记录的首…

C++:哈希表

哈希表概念 哈希表可以简单理解为:把数据转化为数组的下标,然后用数组的下标对应的值来表示这个数据。如果我们想要搜索这个数据,直接计算出这个数据的下标,然后就可以直接访问数组对应的位置,所以可以用O(1)的复杂度…

澳门建筑插画:成都亚恒丰创教育科技有限公司

澳门建筑插画:绘就东方之珠的斑斓画卷 在浩瀚的中华大地上,澳门以其独特的地理位置和丰富的历史文化,如同一颗璀璨的明珠镶嵌在南国海疆。这座城市,不仅是东西方文化交融的典范,更是建筑艺术的宝库。当画笔轻触纸面&a…

能源园区可视化管理系统

利用图扑 HT 可视化打造能源园区管理系统,实时监控和优化能源分配,提升园区运行效率,增强安全管理,推动绿色和可持续发展。

信立方大模型 | 以AI之钥,开拓智能守护新疆界

在当前网络安全形势日益复杂的背景下,技术的进步不仅带来了便利,也使得网络攻击手段更加多样化和隐蔽化。据悉,国外某研究团队已成功利用GPT技术开发出一种黑客智能体框架,该框架能够深入研读CVE(通用漏洞披露&#xf…

MATLAB激光通信和-积消息传递算法(Python图形模型算法)模拟调制

🎯要点 🎯概率论和图论数学形式和图结构 | 🎯数学形式、图结构和代码验证贝叶斯分类器算法:🖊多类型:朴素贝叶斯,求和朴素贝叶斯、高斯朴素贝叶斯、树增强贝叶斯、贝叶斯网络增强贝叶斯和半朴素…

Android12 MultiMedia框架之GenericSource extractor

前面两节学习到了各种Source的创建和extractor service的启动,本节将以本地播放为例记录下GenericSource是如何创建一个extractor的。extractor是在PrepareAsync()方法中被创建出来的,为了不过多赘述,我们直接从GenericSource的onPrepareAsyn…

LeetCode刷题笔记第3011题:判断一个数组是否可以变为有序

LeetCode刷题笔记第3011题:判断一个数组是否可以变为有序 题目: 想法: 使用冒泡排序进行排序,在判断大小条件时加入判断二进制下数位为1的数目是否相同,相同则可以进行互换。最后遍历数组,相邻两两之间是…

17集 如何用ESP-IDF编译ESP-DL深度学习工程-《MCU嵌入式AI开发笔记》

17集 如何用ESP-IDF编译ESP-DL深度学习工程-《MCU嵌入式AI开发笔记》 参考文档:ESP-DL 用户指南: https://docs.espressif.com/projects/esp-dl/zh_CN/latest/esp32/index.html 和https://docs.espressif.com/projects/esp-dl/zh_CN/latest/esp32/get-s…

Qt Mqtt客户端 + Emqx

环境 Qt 5.14.2 qtmqtt mqttx 功能 QT Mqtt客户端 qtmqtt 下载 qtmqtt (注意下载与QT版本相符的库)并使用QT 编译 编译完成后需要的文件: emqx 1.虚拟机中安装emqx,并启动 curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash sudo apt-get inst…