embedding实现_embedded option

embedding实现_embedded option假设词汇量为100万个时的CBOW模型如下,输入层和输出层存在100万个神经元。下面两个问题导致耗时严重。问题一、输入层的one-hot表示和权重矩阵的乘积。one-hot表示占用内存过多,计算one-hot表示与权重矩阵的乘积,需要花费大量时间。问题二、中间层和权重矩阵的乘积以及Softmax层的计算。需要大量的计算,花费大量时间。解决问题一:计算one-hot表示矩阵和权重矩阵的乘积,其实就是将权重矩阵的某个特定的行取出来。如下图所示。Embedding层

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

假设词汇量为 100 万个时的 CBOW 模型如下,输入层和输出层存在 100 万个神经元。

下面两个问题导致耗时严重。

问题一、输入层的 one-hot 表示和权重矩阵的乘积。one-hot 表示占用内存过多,计算 one-hot 表示与权重矩阵 的乘积,需要花费大量时间。

问题二、中间层和权重矩阵的乘积以及 Softmax 层的计算。需要大量的计算,花费大量时间。

在这里插入图片描述

解决问题一:

计算one-hot 表示矩阵和权重矩阵的乘积,其实就是将权重矩阵的某个特定的行取出来。如下图所示。

在这里插入图片描述

Embedding 层:一个从权重矩阵中抽取单词ID对应行(向量)的层。

使用 params 和 grads 作为成员变量,params中保存要学习的参数,grads中保存梯度。并在成员变量 idx 中以数组的形式保存需要提取的行的索引(单词ID)。

正向传播:从权重矩阵W中提取特定的行,并将特定行的神经元原样传给下一层。

反向传播:上一层(输出侧的层)传过来的梯度将原样传给下一层(输入侧的层)。上一层传来的梯度会被应用到权重梯度dW的特定行(idx)。

反向传播里面,将梯度累加到对应索引上,用于处理idx 中出现了重复的索引的情况。dW[…] = 0的目的是保持dW的形状不变,将它的元素设为0。

将原来CBOW模型中输入侧的 MatMul 层换成 Embedding 层,减少内存使用量,避免不必要的矩阵计算。

class Embedding:
    def __init__(self, W):
        self.params = [W]
        self.grads = [np.zeros_like(W)]
        self.idx = None

    def forward(self, idx):
        W, = self.params
        self.idx = idx
        out = W[idx]
        return out

    def backward(self, dout):
        dW, = self.grads
        dW[...] = 0
        if GPU:
            np.scatter_add(dW, self.idx, dout)
        else:
            np.add.at(dW, self.idx, dout)
        return None

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196477.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决pycharm中使用pip安装numpy失败的问题「建议收藏」

    解决pycharm中使用pip安装numpy失败的问题「建议收藏」今天使用pycharm编译python程序时,由于要调用numpy包,但又未曾安装numpy,于是就根据pycharm的提示进行安装,最后竟然提示出错!!!如下图:这不是要让我回归命令行的生活吗?!解决方案如下:1、下载numpy-1.19.5-cp39-cp39-win_amd64.whl,网址是https://pypi.org/project/numpy/#files2、将下载好的numpy文件放在python安装路径下的/scripts中3、在命令行状态下切换到script

    2022年8月29日
    8
  • 数据库课程设计:教务管理系统Swing+MySql

    数据库课程设计:教务管理系统Swing+MySql文章目录实验报告主要内容3.2需求分析3.2.1简要叙述系统需求调查的方法1.需求分析的调查方法和流程2,需求调查结果的整理各种图1.业务流程图2.数据流图3.数据字典(截取部分)4.功能模块图5.用例图6.概念设计的基本思想和原理方法7.物理模型界面下载链接实验报告主要内容3.2需求分析3.2.1简要叙述系统需求调查的方法1.需求分析的调查方法和流程①调查学校教务系统的组织结构,列出各…

    2022年5月19日
    35
  • static使用方法小结

    static使用方法小结

    2021年11月28日
    48
  • Java_万年历(简单)

    Java_万年历(简单)1、方法,需要一个年份,一个月份。然后在控制台输出日历2、MainTest测试类3、运行结果:有帮助,就点个推荐吧,让更多人看到

    2022年7月2日
    22
  • FDD和TDD区别

    FDD和TDD区别转载链接:https://www.jianshu.com/p/496291b4aa2e

    2022年5月17日
    43
  • 自动编码器(Autoencoder)

    自动编码器(Autoencoder)autoencoder是一种无监督的学习算法。在深度学习中,autoencoder用于在训练阶段开始前,确定权重矩阵WW的初始值。神经网络中的权重矩阵WW可看作是对输入的数据进行特征转换,即先将数据编码为另一种形式,然后在此基础上进行一系列学习。然而,在对权重初始化时,我们并不知道初始的权重值在训练时会起到怎样的作用,也不知道在训练过程中权重会怎样的变化。因此一种较好的思

    2022年6月10日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号