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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JSP和MySQL连接

    JSP和MySQL连接

    2021年6月19日
    96
  • 基于matlab的Canny算法的边缘检测(附源代码)

    基于matlab的Canny算法的边缘检测(附源代码)边缘概述边缘可以认为是图像中一定数量点亮度发生变化的地方,边缘检测大体上就是计算这个亮度变化的导数,依据导数的大小,判断亮度变化大小,从而界定目标与背景。在经典的边缘检测算法中Roberts算子,Prewitt算子,Sobel算子属于一阶差分算子,LoG算子,Canny算子属于二阶差分算子。一阶差分算子,就是求图像灰度变化曲线的导数,从而可以突出图像中的对象边缘,而二阶差分算子,求图像灰度变化导数的导数,对图像中灰度变化强烈的地方很敏感,从而可以突出图像的纹理结构。即一阶求边缘,二阶不仅检测出边缘还可检测

    2022年5月7日
    43
  • STM32中的NVIC详解[通俗易懂]

    STM32中的NVIC详解[通俗易懂]转载自https://blog.csdn.net/wuyuzun/article/details/72783152NVIC的全称是Nestedvectoredinterruptcontroller,即嵌套向量中断控制器。对于M3和M4内核的MCU,每个中断的优先级都是用寄存器中的8位来设置的。8位的话就可以设置2^8=256级中断,实际中用不了这么多,所以芯片厂商…

    2022年5月8日
    251
  • Java函数式编程之Java8四大函数接口

    【前序】:在Java8中,内置了四个核心函数接口,它们存在是Lamda表达式出现的前提,Lamda表达式想重写函数式接口中的唯一方法。函数式接口与Lambda表达式之间的关系:lambda表达式相当于是一个行为,传入函数式接口中,进来实现各种操作。它们的接口内只有一个抽象方法,每一个函数式接口都有@FunctionalInterface注解。文章目录1.消费型接口2.供给型接口3.函数型接…

    2022年4月16日
    45
  • jquery validation engine ajax验证,jQuery Validation Engine 表单验证「建议收藏」

    jquery validation engine ajax验证,jQuery Validation Engine 表单验证「建议收藏」名称示例说明requiredvalidate[required]表示必填项groupRequired[string]validate[groupRequired[grp]]在验证组为grp的群组,中至少输入或选择一项condRequired[string]validate[condRequired[ids]]当ids的某个控件不为空时,那么该控件也为必填项。可以依赖多项,如:validat…

    2022年10月3日
    0
  • vim 配置python3环境_vim怎么运行python

    vim 配置python3环境_vim怎么运行python1.1环境OS:CentOSLinuxrelease7.6.1810(Core)python版本:Python3.9.6需求:配置vim使能支持python程序开发的类似IDE环境,实现代码不全、语法高亮等功能。1.2检查环境1.检查vim版本,如果没有“+python3”关键字,则需要升级vim#可见vim版本为7.4[root@drp-monitor-20210426165633-mojh~]#vim–versionVIM-ViIMproved7.4(201

    2022年9月29日
    0

发表回复

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

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