skip gram模型的实现

CBOW模型的概率表示:

P(A):A发生的概率。

P(A,B):事件A和事件B同时发生的概率,称为联合概率。

P(A|B):在给定事件B的信息后,事件A发生的概率,称为后验概率。

CBOW模型:当给定某个上下文时,输出目标词的概率。

在这里插入图片描述

用数学式来表示给定上下文wt-1和wt+1时目标词为wt的概率:

在这里插入图片描述

交叉熵误差函数公式:yk是神经网络的输出, tk是正确解标签, k表示数据的维数。如果标签为one-hot表示,即tk中只有正确解标签索引为1,其他均为0 。那么式子只计算对应正确解标签的输出的自然对数。

在这里插入图片描述

CBOW 模型的损失函数(一 笔样本数据的损失函数):

在这里插入图片描述

CBOW 模型的损失函数(扩展到整个语料库):

在这里插入图片描述

CBOW 模型学习的任务:让上面损失函数尽可能地小。那时的权重参数就是想要的单词的分布式表示。(这里只考虑窗口大小为 1 的情况)

skip-gram 模型:CBOW 模型从上下文的多个单词预测中间的单词(目标词),而 skip-gram 模型则从中间的单词(目标词)预测周围的多个单词(上下文)。

在这里插入图片描述

skip-gram 模型的网络结构:输入层只有一个,输出层的数量则与上下文的单词个数相等。要分别求出各个输出层的损失(通过 Softmax with Loss 层等),然后将它们加起来作为最后的损失。

在这里插入图片描述

skip-gram 模型的数学表示:

在这里插入图片描述

在 skip-gram 模型中,假定上下文的单词之间出现的条件独立。

在这里插入图片描述

代入交叉熵误差函数,可以推导出 skip-gram 模型一笔样本数据的损失函数。skip- gram 模型的损失函数先分别求出各个上下文对应的损失,然后将它们加在一 起。

在这里插入图片描述

扩展到整个语料库, skip-gram 模型的损失函数可以表示为:

在这里插入图片描述

skip-gram在准确度上比CBOW高。CBOW 模型比 skip-gram 模型学习速度要快。

skip-gram 模型的实现:

import sys
sys.path.append('..')
import numpy as np
from common.layers import MatMul, SoftmaxWithLossclass SimpleSkipGram:def __init__(self, vocab_size, hidden_size):V, H = vocab_size, hidden_size# 初始化权重W_in = 0.01 * np.random.randn(V, H).astype('f')W_out = 0.01 * np.random.randn(H, V).astype('f')# 生成层self.in_layer = MatMul(W_in)self.out_layer = MatMul(W_out)self.loss_layer1 = SoftmaxWithLoss()self.loss_layer2 = SoftmaxWithLoss()# 将所有的权重和梯度整理到列表中layers = [self.in_layer, self.out_layer]self.params, self.grads = [], []for layer in layers:self.params += layer.paramsself.grads += layer.grads# 将单词的分布式表示设置为成员变量self.word_vecs = W_indef forward(self, contexts, target):h = self.in_layer.forward(target)s = self.out_layer.forward(h)l1 = self.loss_layer1.forward(s, contexts[:, 0])l2 = self.loss_layer2.forward(s, contexts[:, 1])loss = l1 + l2return lossdef backward(self, dout=1):dl1 = self.loss_layer1.backward(dout)dl2 = self.loss_layer2.backward(dout)ds = dl1 + dl2dh = self.out_layer.backward(ds)self.in_layer.backward(dh)return None

调用这个skip-gram模型

# coding: utf-8
import sys
sys.path.append('..')  # 为了引入父目录的文件而进行的设定
from common.trainer import Trainer
from common.optimizer import Adam
#from simple_cbow import SimpleCBOW
from simple_skip_gram import SimpleSkipGram
from common.util import preprocess, create_contexts_target, convert_one_hotwindow_size = 1
hidden_size = 5
batch_size = 3
max_epoch = 1000text = 'You say goodbye and I say hello.'
corpus, word_to_id, id_to_word = preprocess(text)vocab_size = len(word_to_id)
contexts, target = create_contexts_target(corpus, window_size)
target = convert_one_hot(target, vocab_size)
contexts = convert_one_hot(contexts, vocab_size)#model = SimpleCBOW(vocab_size, hidden_size)
model = SimpleSkipGram(vocab_size, hidden_size)
optimizer = Adam()
trainer = Trainer(model, optimizer)trainer.fit(contexts, target, max_epoch, batch_size)
trainer.plot()word_vecs = model.word_vecs
for word_id, word in id_to_word.items():print(word, word_vecs[word_id])

在这里插入图片描述

you [ 0.0070119   0.01140655 -0.00602617 -0.00951831  0.00306297]
say [ 0.90311    -0.90883684  0.92998946  0.9578707   1.1098603 ]
goodbye [-0.8135963   0.805687   -0.8332484  -0.86875284  1.1370432 ]
and [ 0.9542584  -0.9512509   0.97993344  0.98317575 -1.2883114 ]
i [-0.80985945  0.81495476 -0.85571784 -0.84448576  1.1391366 ]
hello [-0.8404988  0.8455065 -0.8266616 -0.8118625 -1.3357102]
. [-0.01073505 -0.01199387 -0.02076071 -0.01374857  0.01593136]

对比一下之前的CBOW模型的输出:发现两个方法得到的单词的密集向量的表示有很大不同。

在这里插入图片描述

you [-0.9987413   1.0136298  -1.4921554   0.97300434  1.0181936 ]
say [ 1.161595   -1.1513934  -0.25779223 -1.1773298  -1.1531342 ]
goodbye [-0.88470864  0.9155085  -0.30859873  0.9318609   0.9092796 ]
and [ 0.7929211 -0.8148116 -1.8787507 -0.7845257 -0.8028278]
i [-0.8925459   0.95505357 -0.29667985  0.90895575  0.90703803]
hello [-1.0259517   0.97562104 -1.5057516   0.96239203  1.0297285 ]
. [ 1.2134467 -1.1766206  1.6439314 -1.1993438 -1.1676227]

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

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

相关文章

stm32 SPI架构

STM32 芯片集成了专门用于 SPI 协议通讯的外设。 通讯引脚:SPI 硬件架构从 MOSI、MISO、SCK 及 NSS 线展开;STM32 芯片有多个 SPI 外设,它们的 SPI 通讯信号引出到不同的 GPIO 引脚上,使用时必须配置到这些指定的引脚。 SPI1是AP…

stm32 SPI、FLASH

main.c FLASH:掉电后数据不丢失,U 盘、SD 卡、SSD 固态硬盘、STM32 芯片内部用于存储程序的设备,都是 FLASH 类型的存储器。FLASH芯片(W25Q64)是一种使用 SPI 通讯协议的 NOR FLASH 存储器。 STM32 的 NSS 引脚是一个普通的 GPIO&#xff0c…

二分类负采样方法

多分类问题处理为二分类问题,需要能够正确地对正例和负例进行分类。 如果以所有的负例为对象,词汇量将增加许多,无法处理。作为一种近似方法,将只使用少数负例。 负采样方法:求正例作为目标词时的损失,同…

二分类改进CBOW

解决问题二:中间层的神经元和权重矩阵的乘积、Softmax 层的计算需要花费很多计算时间 第k个单词的 Softmax 的计算式如下,其中Si是第i个单词的得分。这个计算也与词汇量成正比,所以需要一个替代Softmax的计算。 使用 Negative Sampling (负采…

Embedding改进CBOW

假设词汇量为 100 万个时的 CBOW 模型如下,输入层和输出层存在 100 万个神经元。 下面两个问题导致耗时严重。 问题一、输入层的 one-hot 表示和权重矩阵的乘积。one-hot 表示占用内存过多,计算 one-hot 表示与权重矩阵 的乘积,需要花费大量…

解决win10使用GPU跑程序遇到的一系列报错

解决win10使用GPU跑程序遇到的一系列报错安装cupy包使用cupy包的时候报错 ImportError: DLL load failed: 找不到指定的模块。卸载cuda11.5、安装cuda10.2安装适配于cuda10.2的cudnn报错CUDA path could not be detected. Set CUDA_PATH environment variable if CuPy fails to…

keil5新建freertos工程

1.建几个文件夹如下图所示。 2.打开keil5,project-new project,文件位置放到之前创建好的project文件夹下。 3.选择处理器。 4.接下来选择下面两个选项。 5.创建好之后是下面这样的。 6.增加文件,点击这个manage project。 然后添加文件即可。…

freertos 双向循环链表插入删除的实现与直观理解

freertos 双向循环链表插入删除的实现与直观理解main.clist.h其他头文件FreeRTOS.hFreeRTOSConfig.hportable.hportmacro.hlist.cvListInsertEnd函数vListInsert函数uxListRemove函数main.c 用debug之后,查看观察窗口,结果如下。这个实验目的就是&#…

cortex-m3 操作模式 寄存器组 异常类型 堆栈 中断

cortex-m3操作模式寄存器组异常类型堆栈中断参考操作模式 处理器的操作模式:为了区别正在执行代码的类型。复位后,处理器进入线程模式、特权级。 处理者模式(handler mode):异常服务例程的代码 ,包括中断…

freertos里面用到的汇编语言总结

汇编语言基础知识多重存储器访问MRS 和 MSRisb 和 dsbldr 和 strmovbl 和 bxcps多重存储器访问 感叹号!表示要自增(Increment)或自减(Decrement)基址寄存器 Rd 的值,时机是在每次访问前(Before)或访问后(After)。增/减,单位:字&am…

freertos内核 任务定义与切换 原理分析

freertos内核 任务定义与切换 原理分析主程序任务控制块任务创建函数任务栈初始化就绪列表调度器总结任务切换主程序 这个程序目的就是,使用freertos让两个任务不断切换。看两个任务中变量的变化情况(波形)。 下面这个图是任务函数里面delay(100)的结果。 下面这个…

freertos临界段保护

freertos临界段保护中断的基础知识cortex-m里面开中断、关中断指令关中断和开中断进入临界段和退出临界段中断的基础知识 嵌套: 嵌套向量中断控制器 NVIC(Nested Vectored Interrupt Controller与内核是紧耦合的。提供如下的功能:可嵌套中断支持、向量…

改进版的CBOW模型

复习 首先复习一下之前的CBOW笔记。 采用推理的方法认知单词、CBOW模型这里面主要是: CBOW模型的核心思路:给出周围的单词(上下文)时,预测目标词处会出现什么单词。 要用神经网络处理单词,需要先将单词…

freertos空闲任务、阻塞延时

freertos空闲任务、阻塞延时空闲任务阻塞延时SysTick实验现象阻塞态:如果一个任务当前正在等待某个外部事件,则称它处于阻塞态。 rtos中的延时叫阻塞延时,即任务需要延时的时候,会放弃CPU的使用权,进入阻塞状态。在任务阻塞的这段…

树莓派配置

树莓派配置1.安装操作系统2.修改镜像源3.配置VNC连接1.安装操作系统 安装操作系统,首先在官网下载https://www.raspberrypi.com/software/operating-systems/ 下载出来的解压后是一个光盘映像文件,接下来就需要把这个文件写入到树莓派的tf卡里。 安装树…

远程桌面连机器人

这里需要PC和机器人处于同一局域网下。 PC使用xhell连接机器人,通过 ifconfig 查看机器人的无线 IP 地址。 然后退出xshell,打开NoMachine软件进行远程桌面连接。输入机器人无线ip地址。 输入用户名和密码 然后就远程连接上了 现在开一个终端如下所示&…

RNNLM

RNNLM 基于RNN的语言模型称为RNNLM(Language Model)。 Embedding 层:将单词ID转化为单词的分布式表示(单词向量)。 RNN层:向下一层(上方)输出隐藏状态,同时也向下一时刻的RNN层(右边)输出隐藏状态。 对于“you say …

使用c#制作赛尔号登录器

使用c#制作赛尔号登录器 需求: 打开赛尔号官网,发现我的chrome浏览器无法运行Flash。这是因为Adobe 公司放弃了对 Flash Player 的支持。 那么如果我想要玩游戏,又不想下载别的浏览器,只好自己写一个登陆器了。 创建项目 首先…

普通RNN的缺陷—梯度消失和梯度爆炸

之前的RNN,无法很好地学习到时序数据的长期依赖关系。因为BPTT会发生梯度消失和梯度爆炸的问题。 RNN梯度消失和爆炸 对于RNN来说,输入时序数据xt时,RNN 层输出ht。这个ht称为RNN 层的隐藏状态,它记录过去的信息。 语言模型的任…

LSTM的结构

RNN和LSTM 简略表示RNN层:长方形节点中包含了矩阵乘积、偏置的和、tanh函数的变换。将下面这个公式表示成一个tanh节点。 LSTM:Long Short-Term Memory(长短期记忆),长时间维持短期记忆。 LSTM与RNN的接口(输入输出)…