神经网络语言模型(NNLM)

news/2024/4/29 0:04:49/文章来源:https://blog.csdn.net/m0_46926492/article/details/130580187

神经网络语言模型【NNLM】

  • 1 为什么使用神经网络模型?
  • 2 什么是神经网络模型?
  • 3. 代码实现
    • 3.1 语料库预处理代码
    • 3.2 词向量创建
    • 3.3 NNLM模型类
    • 3.4 完整代码

1 为什么使用神经网络模型?

  • 解决独热编码无法解决词之间相似性问题
    • 使用神经网络语言模型中出现的词向量 C w i C_{wi} Cwi代替
    • C w i C_{wi} Cwi就是单词对应的 Word Embedding【词向量】
  • 解决独热编码占用内存较大的问题

2 什么是神经网络模型?

在这里插入图片描述

  • Q矩阵相关参数

    • Q矩阵:从one-hot编码生成新的词向量
    • Q矩阵是参数,需要学习训练,刚开始用随机值初始化 Q矩阵,当这个网络训练好之后,Q矩阵的内容被正确赋值,每一行代表一个单词对应的 Word embedding
      参数含义
      Q Q Q V ∗ m V*m Vm的矩阵,模型参数
      V V V词典大小,词的个数,有几个词就有几行
      m m m新词向量的大小

    在这里插入图片描述

  • 神经网络相关参数

    参数含义
    W W Wword缩写,表示单词
    t t ttarget缩写,表示目标词【标签词】
    n n n窗口大小,上下文的大小(即周围的单词有多少个)称为窗口大小
    C C C就是Q 矩阵,需要学习的参数函数

在这里插入图片描述

  • 举例:
    • 文本You say goodbye and I say hello

      单词index
      You0
      say 1
      goodbye2
      and 3
      I4
      hello5
    • 窗口大小n=2,t从2开始,下标从0开始

      contextstargetcontexts indextarget index
      [You ,say][goodbye][0,1][2]
      [say ,goodbye] [and ][1,2] [3]
      [goodbye, and][I][2,3][4]
      [and, I][say ][3,4][1]
      [I ,say][hello][4,1][5]

3. 代码实现

3.1 语料库预处理代码

def preprocess(sentences_list,lis=[]):"""语料库预处理:param text_list:句子列表:return:word_list 是单词列表word_dict:是单词到单词 ID 的字典number_dict 是单词 ID 到单词的字典n_class 单词数"""for i in sentences_list:text = i.split(' ')  # 按照空格分词,统计 sentences的分词的个数word_list = list({}.fromkeys(text).keys())  # 去重 统计词典个数lis=lis+word_listword_list=list({}.fromkeys(lis).keys())word_dict = {w: i for i, w in enumerate(word_list)}number_dict = {i: w for i, w in enumerate(word_list)}n_class = len(word_dict)  # 词典的个数,也是softmax 最终分类的个数return word_list, word_dict, number_dict,n_class

在这里插入图片描述

3.2 词向量创建

def make_batch(sentences_list, word_dict, windows_size):"""词向量编码函数:param sentences_list:句子列表:param word_dict: 字典{'You': 0,,,} key:单词,value:索引:param windows_size: 窗口大小:return:input_batch:数据集向量target_batch:标签值"""input_batch, target_batch = [], []for sen in sentences_list:word_repeat_list = sen.split(' ')  # 按照空格分词for i in range(windows_size, len(word_repeat_list)):  # 目标词索引迭代target = word_repeat_list[i]  # 获取目标词input_index = [word_dict[word_repeat_list[j]] for j in range((i - windows_size), i)]  # 获取目标词相关输入数据集target_index = word_dict[target]  # 目标词索引input_batch.append(input_index)target_batch.append(target_index)return input_batch, target_batch

在这里插入图片描述

3.3 NNLM模型类

# Model
class NNLM(nn.Module):def __init__(self):super(NNLM, self).__init__()self.C = nn.Embedding(n_class, m)  # 矩阵Q  (V x m)  V 表示word的字典大小, m 表示词向量的维度self.H = nn.Linear(windows_size * m, n_hidden, bias=False)  #self.d = nn.Parameter(torch.ones(n_hidden))self.U = nn.Linear(n_hidden, n_class, bias=False)self.W = nn.Linear(windows_size * m, n_class, bias=False)self.b = nn.Parameter(torch.ones(n_class))def forward(self, X):X = self.C(X)  # X : [batch_size, n_step, m]X = X.view(-1, windows_size * m)  # [batch_size, n_step * m]tanh = torch.tanh(self.d + self.H(X))  # [batch_size, n_hidden]output = self.b + self.W(X) + self.U(tanh)  # [batch_size, n_class]return output

3.4 完整代码

import torch
import torch.nn as nn
import torch.optim as optimdef preprocess(sentences_list,lis=[]):"""语料库预处理:param text_list:句子列表:return:word_list 是单词列表word_dict:是单词到单词 ID 的字典number_dict 是单词 ID 到单词的字典n_class 单词数"""for i in sentences_list:text = i.split(' ')  # 按照空格分词,统计 sentences的分词的个数word_list = list({}.fromkeys(text).keys())  # 去重 统计词典个数lis=lis+word_listword_list=list({}.fromkeys(lis).keys())word_dict = {w: i for i, w in enumerate(word_list)}number_dict = {i: w for i, w in enumerate(word_list)}n_class = len(word_dict)  # 词典的个数,也是softmax 最终分类的个数return word_list, word_dict, number_dict,n_classdef make_batch(sentences_list, word_dict, windows_size):"""词向量编码函数:param sentences_list:句子列表:param word_dict: 字典{'You': 0,,,} key:单词,value:索引:param windows_size: 窗口大小:return:input_batch:数据集向量target_batch:标签值"""input_batch, target_batch = [], []for sen in sentences_list:word_repeat_list = sen.split(' ')  # 按照空格分词for i in range(windows_size, len(word_repeat_list)):  # 目标词索引迭代target = word_repeat_list[i]  # 获取目标词input_index = [word_dict[word_repeat_list[j]] for j in range((i - windows_size), i)]  # 获取目标词相关输入数据集target_index = word_dict[target]  # 目标词索引input_batch.append(input_index)target_batch.append(target_index)return input_batch, target_batch# Model
class NNLM(nn.Module):def __init__(self):super(NNLM, self).__init__()self.C = nn.Embedding(n_class, m)  # 矩阵Q  (V x m)  V 表示word的字典大小, m 表示词向量的维度self.H = nn.Linear(windows_size * m, n_hidden, bias=False)  #self.d = nn.Parameter(torch.ones(n_hidden))self.U = nn.Linear(n_hidden, n_class, bias=False)self.W = nn.Linear(windows_size * m, n_class, bias=False)self.b = nn.Parameter(torch.ones(n_class))def forward(self, X):X = self.C(X)  # X : [batch_size, n_step, m]X = X.view(-1, windows_size * m)  # [batch_size, n_step * m]tanh = torch.tanh(self.d + self.H(X))  # [batch_size, n_hidden]output = self.b + self.W(X) + self.U(tanh)  # [batch_size, n_class]return output
if __name__ == '__main__':m = 2  # 词向量的维度n_hidden = 2  # 隐层个数windows_size = 2sentences_list = ['You say goodbye and I say hello']  # 训练数据word_list, word_dict, number_dict,n_class=preprocess(sentences_list)print('word_list为: ',word_list)print('word_dict为:',word_dict)print('number_dict为:',number_dict)print('n_class为:',n_class)#input_batch, target_batch = make_batch(sentences_list, word_dict, windows_size)  # 构建输入数据和 target label# # 转为 tensor 形式input_batch,target_batch = torch.LongTensor(input_batch), torch.LongTensor(target_batch)print(input_batch)print(target_batch)model = NNLM()# 损失函数定义criterion = nn.CrossEntropyLoss()  # 交叉熵损失函数# 采用 Adam 优化算法 学习率定义为   0.001optimizer = optim.Adam(model.parameters(), lr=0.001)# Training 迭代 2000次for epoch in range(2000):optimizer.zero_grad()  # 梯度归零output = model(input_batch)# output : [batch_size, n_class], target_batch : [batch_size]loss = criterion(output, target_batch)if (epoch + 1) % 250 == 0:print('Epoch:', '%d' % (epoch + 1), 'cost =', '{:.6f}'.format(loss))loss.backward()  # 反向传播计算 每个参数的梯度值optimizer.step()  # 每一个参数的梯度值更新# Predictpredict = model(input_batch).data.max(1, keepdim=True)[1]print(list(predict))# Testprint([number_dict[n.item()] for n in predict.squeeze()])

在这里插入图片描述

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

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

相关文章

Go语言字符串基础

目录 字符串基础 合并和分割字符串 分割 合并 判断是否包含 strings.Contains() 查找子串出现的位置 strings.Index() strings.LastIndex() 字符串基础 1.字符串是由一串Unicode字符组成的序列,每个Unicode字符都占用一个或多个字节的存储空间。 2.字符串…

CSS--定位

01-定位 作用:灵活的改变盒子在网页中的位置 实现: 1.定位模式:position 2.边偏移:设置盒子的位置 leftrighttopbottom 相对定位 position: relative 特点: 不脱标,占用自己原来位置显示模式特点保…

技术领先、“忠”于业务,用友走出多维数据库的价值之路

本文转自科技商业 作者 于洪涛 对于当今的企业而言,精细化管理,已经成为发展之源,甚至是生存之本。 尤其是随着数字化和智能化转型的推进,在企业经营管理过程中,数据正在日益发挥更为关键的要素作用。 相比过去&…

浅学Go下的ssti

前言 作为强类型的静态语言,golang的安全属性从编译过程就能够避免大多数安全问题,一般来说也唯有依赖库和开发者自己所编写的操作漏洞,才有可能形成漏洞利用点,在本文,主要学习探讨一下golang的一些ssti模板注入问题…

uniapp实现微信小程序横屏适配问题demo效果(整理)

使用VMIN进行布局 先了解css3的两个属性vmax和vmin vmax 相对于视口的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vmax vmin 相对于视口的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin竖屏布局的时候,750rpx就是竖屏布局屏幕的宽度…

camunda的Java委托如何使用

一、camunda的Java委托有什么用途 在Camunda中,Java委托是一种用于在流程执行期间执行自定义逻辑的Java类。使用Java委托,您可以在流程执行期间通过Java代码实现各种复杂的业务逻辑。 以下是一些使用Java委托的常见用途: 1、计算值&#x…

搞懂 API,API 常见技术使用场景分享

API(应用程序编程接口)是一种允许软件应用程序之间相互交互和通信的技术。以下是API常用的使用场景: 应用程序开发 API通常被用于网站或应用程序的开发中,以便在不同平台、语言及数据库之间获取数据或进行消息传递。例如&#xff…

搭建本地仓库源

一、如何搭建仓库源 之前讲了定制ISO的方法:使用chroot定制系统,但有时候我们想自定义的安装包不在上游的仓库源中,在我们本地应该怎么办呢?如果我们将deb包拷贝到iso目录再安装有点过于麻烦了,而且还可能需要手动处理…

113.【Vue-细刷-04】

Vue-03 (二十四)、浏览器存储(WebStorage)1.本地缓存(LocalStorage)(1). 模仿本地缓存-未用JSON转字符串(2).模拟本地缓存-使用JSON转字符串 2.会话缓存(Session Storage)(1).模拟会话缓存(2).会话缓存和本地缓存的区别(3).JSON转换与JSON解析 3.todos案列_本地缓存版(1).mount…

flink集群安装部署

1.下载 官网下载:Downloads | Apache Flink 阿里网盘下载(包含依赖包):阿里云盘分享 提取码:9bl2 2.解压 tar -zxvf flink-1.12.7-bin-scala_2.11.tgz -C ../opt/module 3.修改配置文件 cd flink-1.12.7/conf/ …

【Java】javafx | 打包成jar包

一、说明 1、javafx项目 2、maven管理 二、解决方案 1&#xff09;加入maven插件 <build><resources><resource><!-- 这里是放在 src/main/java--><directory>src/main/java</directory><includes><include>**/*.properties&…

深度学习 - 46.DIN 深度兴趣网络

目录 一.引言 二.摘要 ABSTRACT 三.介绍 INTRODUCTION 1.CTR 在广告系统的作用 2.传统 MLP 存在的问题 3.DIN 的改进 四.近期工作 RELATEDWORK 1.传统推荐算法 2.用户行为抽取 五.背景 BACKGROUD 六.深度兴趣网络 DEEP INTEREST NETWORK 1.特征表示 Feature Repres…

【操作系统】从操作系统底层出发,成为更好的程序员

冯老爷子的模型 首先&#xff0c;我们从一个问题开始(&#xffe3;∇&#xffe3;)/ 为什么需要程序员&#xff1f; 早期的计算机程序是硬件化的&#xff0c;即使用各种门电路组装出一个固定的电路板&#xff0c;这个电路板只能用于执行某个特定的程序&#xff0c;如果需要修…

Java并发编程实践学习笔记(三)——共享对象之可见性

目录 1 过期数据 2 非原子的64位操作 3 锁和可见性 4 Volatile变量&#xff08;Volatile Variables&#xff09; 在单线程环境中&#xff0c;如果向某个变量写入值&#xff0c;在没有其他写入操作的情况下读取这个变量&#xff0c;那么总能得到相同的值。然而&…

ALOHA 开源机械臂(Viper 300 Widow X 250 6DOF机械臂组成)第一部分

软件简介&#xff1a; ALOHA 即 A Low-cost Open-source Hardware System for Bimanual Teleoperation&#xff0c;是一个低成本的开源双手遥控操作硬件系统&#xff0c;即开源机械臂。其算法 Action Chunking with Transformers (ACT) 采用了神经网络模型 Transformers&#…

C#学习笔记--实现一个可以重复权重并且能够自动排序的容器--MultiplySortedSet

目录 前言SortedSetC#自带类型自定义类SortedSet权值重复 需求自定义容器 -- MultiplySortedSet核心实现思路 MultiplySortedSet 使用C#自带类型自定义类 前言 最近需要在C#中实现一个功能 有一个容器&#xff0c;该容器能自动对里面的元素进行排序&#xff0c;类似C的优先队列…

FS5175AE降压型1-4节锂电池充电芯片

FS5175AE是一款工作于5V到24V的多串锂电池同步开关降压充电管理芯片。内置MOS管集成了低导通阻抗的NMOS&#xff0c;FS5175AE采用1MHz同步开关架构&#xff0c;实现高 效率充电并简化外围器件&#xff0c;降低BOM成本。通过调节检测电阻&#xff0c;可实现**2A充电电流&#xf…

SpringCloud(22):Sentinel对Feign的支持

Sentinel 适配了 Feign组件。如果想使用&#xff0c;除了引入 spring-cloud-starter-alibaba-sentinel 的依赖外还需要 2个步骤&#xff1a; 配置文件打开 Sentinel 对 Feign 的支持&#xff1a;feign.sentinel.enabledtrue加入 spring-cloud-starter-openfeign 依赖使 Sentin…

基于Linux系统在线安装RabbitMQ

一、前言 二、Erlang下载安装 三、RabbitMQ下载安装 三、RabbitMQ Web界面管理 一、前言 本次安装使用的操作系统是Linux centOS7。 二、Erlang下载安装 在确定了RabbitMQ版本号后&#xff0c;先下载安装Erlang环境。下面演示操作过程&#xff1a; Erlang下载链接&#…

[工具]Pytorch-lightning的使用

Pytorch-lightning的使用 Pytorch-lightning介绍Pytorch-lightning与Pytorch的区别Pytorch-lightning框架的优势Pytorch-lightning框架 重要资源 Pytorch-lightning介绍 这里介绍Pytorch_lighting框架. Pytorch-lightning与Pytorch的区别 Pytorch-lightning可以简单的看作是…