NLP-1:NNLM pytorch

Python实现神经网络语言模型(代码详解) 【代码】Python实现神经网络语言模型(Neural Network Language Model, NNLM) 阅读详情

1.NNLM

A Neural Probabilistic Language Model

是自然语言中比较古老重要的模型。

论文参考:NNLM

2. 代码

# %%
# code by Tae Hwan Jung @graykode
import torch
import torch.nn as nn
import torch.optim as optim

def make_batch():
    input_batch = []
    target_batch = []

    for sen in sentences:
        word = sen.split() # space tokenizer
        input = [word_dict[n] for n in word[:-1]] # create (1~n-1) as input
        target = word_dict[word[-1]] # create (n) as target, We usually call this 'casual language model'

        input_batch.append(input)
        target_batch.append(target)

    return input_batch, target_batch

# Model
class NNLM(nn.Module):
    def __init__(self):
        super(NNLM, self).__init__()
        self.C = nn.Embedding(n_class, m)
        self.H = nn.Linear(n_step * 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(n_step * 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, n_step * 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__':
    n_step = 2 # number of steps, n-1 in paper
    n_hidden = 2 # number of hidden size, h in paper
    m = 2 # embedding size, m in paper

    sentences = ["i like dog", "i love coffee", "i hate milk"]

    word_list = " ".join(sentences).split()
    word_list = list(set(word_list))
    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)  # number of Vocabulary

    model = NNLM()

    criterion = nn.CrossEntropyLoss()
    optimizer = optim.Adam(model.parameters(), lr=0.001)

    input_batch, target_batch = make_batch()
    input_batch = torch.LongTensor(input_batch)
    target_batch = torch.LongTensor(target_batch)

    # Training
    for epoch in range(5000):
        optimizer.zero_grad()
        output = model(input_batch)

        # output : [batch_size, n_class], target_batch : [batch_size]
        loss = criterion(output, target_batch)
        if (epoch + 1) % 1000 == 0:
            print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.6f}'.format(loss))

        loss.backward()
        optimizer.step()

    # Predict
    predict = model(input_batch).data.max(1, keepdim=True)[1]

    # Test
    print([sen.split()[:2] for sen in sentences], '->', [number_dict[n.item()] for n in predict.squeeze()])

其中:

sentences用了三句话,根据word_list数组['love', 'milk', 'dog', 'hate', 'i', 'coffee', 'like']处理得到字典:

word_dict {'love': 0, 'milk': 1, 'dog': 2, 'hate': 3, 'i': 4, 'coffee': 5, 'like': 6};

number_dict {0: 'love', 1: 'milk', 2: 'dog', 3: 'hate', 4: 'i', 5: 'coffee', 6: 'like'}

n_class是7

结下来处理输入数据。

input_batch是[[4, 6], [4, 0], [4, 3]]

target_batch是[2, 5, 1]

上面的数字都是索引,根据number去找对应的词。4,6就是i like

训练过程中output = model(input_batch) 通过输入传入模型得到结果。

会调用class NNLM中的forward函数。

参数就是input_bach。

处理输入用到了nn.Embedding(n_class, m)

这个又是什么?涉及到nlp的词向量都会用到。通俗讲解一下:

Embedding会把词表中的词转换成矩阵。例如将包含3个元素的词汇表W={'优', '良', '差'}中的每个元素转换为5维向量

import torch.nn as nn

# 三个词转成五纬向量

embed = nn.Embedding(num_embeddings=3, embedding_dim=5)

# 取第一个

print(embed(torch.tensor([0],dtype=torch.int64)))

# print

tensor([[ 0.2817, -0.8119, -0.8011, -0.1379, -0.5013]],
       grad_fn=<EmbeddingBackward0>)

# 取第二个

print(embed(torch.tensor([1],dtype=torch.int64)))

# print

tensor([[-1.3766,  1.1211, -1.0014,  0.9673, -0.4131]],
       grad_fn=<EmbeddingBackward0>)

# 取第三个

print(embed(torch.tensor([2],dtype=torch.int64)))

# print

tensor([[ 0.3854, -0.7950, -0.1810,  0.6227, -1.6562]],
       grad_fn=<EmbeddingBackward0>)

初始化的值是随机的,但会随着训练的迭代变化更新,例如在NLP任务中,随着网络的训练,表示'优'与'良'的两个向量相似度会逐渐减小,而表示'优'与'差'的两个向量相似度会逐渐增大。

回到nn.Embedding(n_class, m)中 类型是2,m纬度也是2,因此会创建2*2的矩阵。

print一下self.C

tensor([[[-0.3372,  0.5522],
         [-0.0847,  0.5518]],

        [[-0.3372,  0.5522],
         [-0.4868, -0.8433]],

        [[-0.3372,  0.5522],
         [ 1.0267, -0.8303]]], grad_fn=<EmbeddingBackward0>)

改变了原来的输入[[4, 6], [4, 0], [4, 3]] 但是shape最里层的[4,6]中的4改成了[-0.3372,  0.5522],以此类推。

X = X.view(-1, n_step * m)把里面的二维拉平。

tensor([[-0.3372,  0.5522, -0.0847,  0.5518],
        [-0.3372,  0.5522, -0.4868, -0.8433],
        [-0.3372,  0.5522,  1.0267, -0.8303]], grad_fn=<ViewBackward0>)

下面self.d层

nn.Parameter(torch.ones(n_hidden))其中n_hidden是2 输出是

tensor([1., 1.], requires_grad=True)

self.H层

nn.Linear(n_step * m, n_hidden, bias=False) 把维度从n_step * m 变成了 n_hidden,也就是从4变到2。

tensor([[-0.0315,  0.0569],
        [-0.5814, -0.4416],
        [-0.3996,  0.0209]], grad_fn=<MmBackward0>)

也就是把里面第一行的[-0.3372,  0.5522, -0.0847,  0.5518]一顿操作计算后变成了[-0.0315,  0.0569]

self.d + self.H(X)就是把每一个数加上1

tensor([[0.9685, 1.0569],
        [0.4186, 0.5584],
        [0.6004, 1.0209]], grad_fn=<AddBackward0>)

torch.tanh激活函数处理后得到

tensor([[0.7480, 0.7845],
        [0.3957, 0.5068],
        [0.5373, 0.7702]], grad_fn=<TanhBackward0>)

最后的output是self.b + self.W(X) + self.U(tanh)

其中self.W(X) 把n_step * m转换到n_class维度

self.U(tanh)把n_hidden转换到n_class维度

self.b也是n_class维度。三者相加。

其中三个分别是

tensor([1., 1., 1., 1., 1., 1., 1.], requires_grad=True)
tensor([[-0.2555,  0.0985, -0.1871,  0.1405,  0.3175,  0.0423, -0.0021],
        [ 0.1171, -0.0690, -0.4293, -0.1167, -0.0510, -0.3074, -0.1122],
        [-0.2951, -0.3981, -0.9634,  0.1058,  0.3930, -0.1794, -0.3963]],
       grad_fn=<MmBackward0>)

tensor([[ 0.0344,  0.6908,  0.4222, -0.2680,  0.2775, -0.1408,  0.9677],
        [ 0.0444,  0.4080,  0.2628, -0.1935,  0.1456, -0.0672,  0.5648],
        [ 0.0838,  0.5921,  0.3921, -0.3089,  0.1966, -0.0847,  0.8142]],
       grad_fn=<MmBackward0>)

相加后得到

tensor([[0.7789, 1.7894, 1.2352, 0.8725, 1.5950, 0.9016, 1.9656],
        [1.1616, 1.3390, 0.8335, 0.6898, 1.0946, 0.6254, 1.4526],
        [0.7887, 1.1939, 0.4287, 0.7968, 1.5896, 0.7358, 1.4179]],
       grad_fn=<AddBackward0>)

然后根据输出和目标值tensor([3, 2, 5])计算loss

loss = criterion(output, target_batch)

loss值是tensor(2.3135, grad_fn=<NllLossBackward0>)

根据loss值算梯度迭代更新,让loss越来越小,就是框架的事情了。

最终预测训练的数据,传入input_batch得到predict输出

tensor([[2],
        [4],
        [1]])

对应到number_dict {0: 'hate', 1: 'milk', 2: 'dog', 3: 'i', 4: 'coffee', 5: 'like', 6: 'love'}中查找。

最终输出

Epoch: 1000 cost = 0.102355
Epoch: 2000 cost = 0.015673
Epoch: 3000 cost = 0.005281
Epoch: 4000 cost = 0.002299
Epoch: 5000 cost = 0.001127
tensor([[2],
        [4],
        [1]])
[['i', 'like'], ['i', 'love'], ['i', 'hate']] -> ['dog', 'coffee', 'milk']

NNLM的Pytorch实现 import torch import torch.nn as nn import torch.optim as optimizer import torch.utils.data as Data dtype = torch.FloatTensor sentences = ['i like cat','i love coffee','i hate milk'] sentences_list = " ".join(sentences).split() # ['i', 'like', 'cat', 'i', 阅读详情

相关推荐

NNLM语言模型(原理、反向传播的推导以及python实现)

NNLM语言模型(原理、反向传播的推导以及python实现) -1、写这篇博客的目的   以你为研究生选择了自然语言处理方向(NLP)。因为之前对此没有过接触,所以在大四阶段准备对NLP方向的一些算法做一些了解。在阅读《文本数据挖掘》(宗成庆、夏睿、张家俊)这本书的时,发现上面介绍了文本数据挖掘方向的很多算法,但是并未具体的展开,进行详细的推导。   由此,我萌生了将自己学习这本书的过程中对算法的理解、看法、问题以及源代码进行分享的想法。 0、引言   如何将文本用数学的方法表达出来,是文本挖掘的基础。我们

weixin_45307421的博客 999

NNLM神经网络语言模型简单实现词语预测(含python代码详解)

NNLM神经网络语言模型简单实现词语预测(含python代码详解)

weixin_50706330的博客 2719

pytorch入门NLP教程(一)——NNLM

用pytorch带你学习NLP,让我们一起进步吧~

difend的博客 2368

NLP之神经网络语言模型(NNLM)_Torch

# code by Tae Hwan Jung @graykode import numpy as np import torch import torch.nn as nn import torch.optim as optim from torch.autograd import Variable dtype = torch.FloatTensor sentences = [ "i like dog", "i love coffee", "i hate milk"] word_list = " "

helldoger的博客 471

pytorch自然语言处理基础模型之一:NNLM

任务描述:pytorch实现简单的神经网络语言模型NNLM 1、数据 sentences = [‘i like dog’, ‘i love coffee’, ‘i hate milk’] 2、目标 当输入[‘i’, ‘like’], [‘i’, ‘love’], [‘i’, ‘hate’]时,分别预测下一个单词为[‘dog’], [‘coffee’], [‘milk’] 3、代码 导入需要...

weixin_43632501的博客 929

自然语言处理 -- NLP作业 1 :训练词向量

目录 pytorch nnlm 代码 pytorch nnlm 代码

_天涯__的博客 1494

使用Pytorch简单实现NNLM(Nerual Network Language Model)

前言 NNLM在NLP中有着举足轻重的地位,该模型将深度学习运用到了NLP中,其副产物词向量更是开创了NLP中预训练模型的先河,此文章使用Pytorch实现了NNLM的模型结构,并用简单的数据进行了模型的训练和测试。 示例代码来自于:https://wmathor.com/index.php/archives/1442/ 本文在原博客的基础上进行了一些补充,使其更加通俗易懂。 模型结构分析 NNLM的模型是一个三层的神经网络,如图所示: NNLM模型的任务是通过句子中的前n-1个词,来.

Delusional的博客 1365

NNLM (A Neural Network Language Model)

NLP: nlp-tutorial系列文章 nlp-tutorial NLP学习,文章解读,代码学习。 Basic Embedding Model - NNLMNLP: nlp-tutorial系列文章前言1. NNLM (Neural Network Language Model)2. 关键理论与方法2.1 语言的统计模型2.2 不足与改进思路2.3 Neural Model2.3.1 Mission2.3.2 Training Set2.3.3 Objective Model2.3.4 Object

weixin_38914561的博客 736

pytorch NNLM 模型的简单实现(注释版)

我是跟着b站一个up主的博客学的代码,然后自己添加了一些注释 https://wmathor.com/index.php/archives/1442/ import torch import torch.nn as nn import torch.optim import torch.utils.data as Data dtype = torch.FloatTensor sentences = ['i like cat', 'i love coffee', 'i hate milk'] #将上面

haohulala的博客 832

深度学习自然语言处理模型实现大集合

本资源整理了现有常见NLP深度学习模型,借鉴相关TensorFlow和Pytorch代码实现相关的模型代码,对绝大多数NLP模型进行精简,多数模型都是用不到100行代码实现的,(注释或空行除外)。 资源整理自网络,带链接源地址:https://github.com/graykode/nlp-tutorial 从NLP中的第一个语言模型NNLM开始,逐步包括RN...

lqfarmer的博客 1873

NNLM-pytorch

提出了神经网络语言模型。该模型使用前n-1词来预测第n个词,计算概率p(wn|w1,w2,````,wn-1)。首先先将前n-1个词用one-hot表示,然后使用投影矩阵降维,再将降维后的n-1个词的表示拼接起来,Bengio将神经网络引入语言模型的训练中,并得到了词向量这个副产物。词向量对后面深度学习在自然语言处理方面有很大的贡献,也是获取词的语义特征的有效方法。现在的任务:输入wt-n+1,````wt-1.这前n-1个单词,然后预测出下一个单词wt。

Claire的博客 200

推荐:常见NLP模型的代码实现(基于TensorFlow和PyTorch)

推荐github上的一个NLP代码教程:nlp-tutorial,教程中包含常见的NLP模型代码实现(基于TensorFlow和Pytorch),而且教程中的大多数NLP...

湾区人工智能 1417

神经网络语言模型nnlm

包含windows,linux上的两个版本,供参考和大家一起学习讨论~

终极NLP学习环境搭建指南:Python3.5+和PyTorch1.0+完美配置教程

nlp-tutorial是一个专为深度学习研究者设计的自然语言处理教程项目,提供了从基础到高级的NLP模型实现。本指南将帮助你快速搭建兼容Python3.5+和PyTorch1.0+的开发环境,让你轻松开始NLP之旅。 ## 为什么选择nlp-tutorial? nlp-tutorial项目包含了多种经典NLP模型的实现,从基础的神经网络语言模型(NNLM)到先进的Transformer和BE

gitblog_00040的博客 405

华为[ENSP]—— 实验二、三层交换和ARP的工作原理

华为[ENSP]三层交换和ARP的工作原理

weixin_62594100的博客 6410

Android SSL证书固定实战:原理、方案与避坑指南

SSL/TLS协议是保障网络通信安全的基石,其核心原理是通过非对称加密和数字证书实现身份认证与数据加密。在移动应用开发中,为了防止中间人攻击,证书固定技术应运而生,它通过将服务器证书或公钥的哈希值预置在应用内,强制校验服务器身份,从而大幅提升通信链路的安全性。这一技术对于金融、电商等高安全要求场景尤为重要。本文聚焦Android平台,深入解析SPKI固定、Network Security Configuration与OkHttp CertificatePinner等主流方案,并针对证书更新、调试兼容等常见痛

weixin_33935636的博客 402

【NLP】Github标星7.7k+:常见NLP模型的PyTorch代码实现

推荐github上的一个NLP代码教程:nlp-tutorial,教程中包含常见的NLP模型代码实现(基于Pytorch1.0+),而且教程中的大多数NLP模型都使用少于100行代码。教...

fengdu78的博客 1638

BALM2深度解析 | 港大MARS实验室如何用点簇革新激光BA?

本文深度解析了港大MARS实验室提出的BALM2方案如何通过点簇技术革新激光BA(Bundle Adjustment)处理。BALM2将点云数据聚合为点簇,显著提升计算效率,实测显示其计算耗时仅为传统方法的1/20。文章详细介绍了点簇的核心原理、二阶优化方法及与传统方法的性能对比,展示了其在激光SLAM领域的突破性应用。

weixin_29212867的博客 152

神经网络语言模型NNLM理解(有可运行代码pytorch实现)

传统语言模型有几个限制: 如果采用n元语法,无法解决长距离依赖问题。 词的稀疏性表示无法解决。 泛化性能差。 与传统的语言模型相比,神经网络语言模型可以自动的学习上下问的特征,缓解人工设计的需要,支持不同上下文泛化性能。 输入:k元语句(在代码上的实现是k个词向量的拼接) 输出:下一个词的概率分布 ...

manzubaolong的博客 1448

BUPT软件安全实验三

可以看出栈溢出对程序运行的安全性有很大的威胁,如果不对栈进行保护,只要系统中存在栈溢出漏洞,即可令攻击者通过非正当方法获取操作权限。(6)解决思考题,即:在不修改StackOverrun程序源代码的情况下,构造shellcode,通过JMP ESP的方式实现通过记事本打开shellcode.txt(可使用CreateProcessA或WinExec等API)。查看缓冲区信息,可以看到dest指向地址0x0012FAF0,其为数组的存放起始位置,也就是shellcode注入的起始位置。

7xun's space 1965

用Plecs搞定半桥LLC谐振变换器仿真:从开环模型搭建到闭环PI调参全流程

本文详细介绍了使用Plecs仿真工具进行半桥LLC谐振变换器从开环模型搭建到闭环PI调参的全流程操作。涵盖仿真环境准备、关键元件参数计算、波形异常排查、闭环控制实现及PI参数整定等核心内容,特别针对仿真中的收敛性问题提供实用解决方案,助力电力电子设计者高效完成LLC变换器仿真验证。

weixin_28455801的博客 570

【亲测免费】 自然语言处理开源项目推荐:nlp-tutorial

自然语言处理开源项目推荐:nlp-tutorial 【免费下载链接】nlp-tutorial graykode/nlp-tutorial: 是一个基于 Python 的自然语言处理教程,涵盖了各种自然语言处理技术和算法。该项目提供了一个全面的自然语言处理教程,可以帮助开发者快速入门和掌握自然语言处理技术,同时提供了大量实...

gitblog_00792的博客 1008

【信创-k8s】银河麒麟V10国防版+鲲鹏/飞腾(arm64架构)在线/离线部署k8s1.30+kubesphere

银河麒麟作为国家核高基专项的重要成果,国防版凭借其卓越的安全性和可靠性,已成为军工领域的首选操作系统。之前我们在适配麒麟V4国防版的过程中已发现诸多安全性要求,而麒麟V10国防版在安全防护等级上又达到了更高的级别。本文将主要演示离线部署,因为军工项目基本不会出现联网场景。即使在线,也可以按离线方式部署,且离线部署由于有私有仓库,不会存在镜像获取不到和丢失情况。

jiaworld的博客 730

革命性NLP教程nlp-tutorial:100行代码掌握深度学习自然语言处理

`nlp-tutorial`是一个面向深度学习研究者的自然语言处理教程,使用**Pytorch**实现。该教程的最大特点是将大多数NLP模型用**少于100行代码**实现(不包括注释和空行),让新手能够快速掌握核心概念和实现方法。 ## 为什么选择nlp-tutorial? 对于NLP初学者来说,复杂的理论和冗长的代码往往是入门的两大障碍。nlp-tutorial通过简洁的实现方式,帮助学习者

gitblog_00060的博客 448

【云原生】阿里云SLS日志自定义字段标签实现日志告警

样例:一个典型的java log初始化日志格式把日志中的INFO提取出来做为一个标签,在开源日志框架中,配置采集器实现- regex:在阿里云SLS日志服务同样可以实现,首先我们进入到一个日志库,查看数据接入,我这里使用的是Logtail工具在【处理配置】中,选择【处理插件组合】,新增提取字段插件原始字段:填写要被提取的日志,对应原始字段的内容做正则结果字段:正则表达式对应的捕获组对应结果:捕获组 匹配内容 说明1 ywgy-app-service 服务名称。

CN_Eden 742

使用 Visual Studio Code 连接 ABAP On-Premise 系统做开发的详细配置步骤

本文详细介绍了如何在Visual Studio Code中通过ABAP Development Tools扩展连接ABAP On-Premise系统。关键步骤包括:通过Ctrl+Shift+P打开命令行面板选择「ABAP: New Destination...」创建RFC连接(仅支持SSO单点登录),选择本地SAPGUI中已有的系统,输入Client ID、语言和用户名(无需密码),最后将目标系统添加到工作区即可开始开发。文章强调了企业安全考虑下仅支持SSO的设计理念,并展示了连接配置的JSON格式示例。整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 985
上一篇: k8s: admission demo(准入控制)
conglanjun
博客等级 码龄11年 92粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值