[NNLM]论文实现:A Neural Probabilistic Language Model [Yoshua Bengio, Rejean Ducharme, Pascal Vincent]

本文主要是介绍[NNLM]论文实现:A Neural Probabilistic Language Model [Yoshua Bengio, Rejean Ducharme, Pascal Vincent],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A Neural Probabilistic Language Model

    • 一、完整代码
      • 1.1 Python 完整程序
    • 二、论文解读
      • 2.1 目标
    • 三、过程实现
      • 3.1 Tensorflow模型
      • 3.2 数据准备
      • 3.3 数据训练和预测
    • 四、整体总结

论文:A Neural Probabilistic Language Model
作者:Yoshua Bengio; Rejean Ducharme and Pascal Vincent
时间:2000

一、完整代码

这篇文献似乎是第一篇词嵌入模型在神经网络上的文献,由于文献比较早,结构比较简单,这里简要介绍一下,并使用Tensorflow实现.

1.1 Python 完整程序

# tf.__version__ == 2.10.1
import tensorflow as tf
import numpy as np
import pandas as pd## 建立词表
s = '东胜神洲傲来国海边有一花果山,山顶一石,受日月精华,产下一个石猴,石猴勇探瀑布飞泉,发现水帘洞,被众猴奉为美猴王,猴王领群猴在山中自由自在数百载,偶闻仙、佛、神圣三者可躲过轮回,与天地山川齐寿,遂独自乘筏泛海,历南赡部洲,至西牛贺洲,终在灵台方寸山斜月三星洞,为菩提祖师收留,赐其法名孙悟空,悟空在三星洞悟彻菩提妙理,学到七十二般变化和筋斗云之术后返回花果山,一举灭妖魔混世魔王,花果山狼、虫、虎、豹等七十二洞妖王都来奉其为尊'vocabulary = list(set(list(s)))
n = 5
m = len(vocabulary)data_list = []
for i in range(len(s)-n):data_list.append([s[i:i+n], s[i+n]])## 准备数据
## [['东胜神洲傲', '来'], ['胜神洲傲来', '国'], ['神洲傲来国', '海']]x_train = np.array(data_list)[:,0]
y_train = np.array(data_list)[:,1]def get_one_hot(lst):one_hot_list = []for item in lst:one_hot = [0] * len(vocabulary)ix = vocabulary.index(item)one_hot[ix] = 1one_hot_list.append(one_hot)return one_hot_listx_train = [get_one_hot(item) for item in x_train]
y_train = [vocabulary.index(item) for item in y_train]## 建立模型
class Embedding(tf.keras.layers.Layer):def __init__(self, out_shape, **kwargs):super().__init__(**kwargs)self.out_shape = out_shapedef build(self, input_shape):self.H = self.add_weight(shape=[input_shape[-1], self.out_shape],initializer=tf.initializers.glorot_normal(),)def call(self, inputs):return tf.matmul(inputs, self.H)model = tf.keras.Sequential([tf.keras.layers.Input(shape=(n, m)),Embedding(200),tf.keras.layers.Flatten(),tf.keras.layers.Dense(200, activation='tanh'),tf.keras.layers.Dense(m, activation='softmax'),
])model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics='accuracy')
history = model.fit(x=x_train, y=y_train, epochs=100, verbose=0)
pd.DataFrame(history.history).plot()## 预测模型
s = '边有一花果'
vocabulary[model.predict([get_one_hot(s)])[0].argmax()] 
# '山'

二、论文解读

2.1 目标

这篇论文的目的是:已知一段文本序列,求文本序列下一个词出现的概率,这里我们很容易就想到一个概率公式 P ( x n ∣ x n − 1 , x n − 2 , … , x 1 ) P(x_n|x_{n-1},x_{n-2},\dots,x_1) P(xnxn1,xn2,,x1).虽然用这个公式从现在看来有很多的毛病,但是要考虑到这是一篇2000年的论文.

三、过程实现

3.1 Tensorflow模型

n = 预测句子长度
m = 词表维度
class Embedding(tf.keras.layers.Layer):def __init__(self, out_shape, **kwargs):super().__init__(**kwargs)self.out_shape = out_shapedef build(self, input_shape):self.H = self.add_weight(shape=[input_shape[-1], self.out_shape],initializer=tf.initializers.glorot_normal(),)def call(self, inputs):return tf.matmul(inputs, self.H)model = tf.keras.Sequential([tf.keras.layers.Input(shape=(n, m)),Embedding(200),tf.keras.layers.Flatten(),tf.keras.layers.Dense(200, activation='tanh'),tf.keras.layers.Dense(m, activation='softmax'),
])

3.2 数据准备

从西游记里面选了一段文字,准备数据 input_shape=[n,m]

s = '东胜神洲傲来国海边有一花果山,山顶一石,受日月精华,产下一个石猴,石猴勇探瀑布飞泉,发现水帘洞,被众猴奉为美猴王,猴王领群猴在山中自由自在数百载,偶闻仙、佛、神圣三者可躲过轮回,与天地山川齐寿,遂独自乘筏泛海,历南赡部洲,至西牛贺洲,终在灵台方寸山斜月三星洞,为菩提祖师收留,赐其法名孙悟空,悟空在三星洞悟彻菩提妙理,学到七十二般变化和筋斗云之术后返回花果山,一举灭妖魔混世魔王,花果山狼、虫、虎、豹等七十二洞妖王都来奉其为尊'vocabulary = list(set(list(s)))
n = 5
m = len(vocabulary)data_list = []
for i in range(len(s)-n):data_list.append([s[i:i+n], s[i+n]])x_train = np.array(data_list)[:,0]
y_train = np.array(data_list)[:,1]def get_one_hot(lst):one_hot_list = []for item in lst:one_hot = [0] * len(vocabulary)ix = vocabulary.index(item)one_hot[ix] = 1one_hot_list.append(one_hot)return one_hot_listx_train = [get_one_hot(item) for item in x_train]
y_train = [vocabulary.index(item) for item in y_train]

3.3 数据训练和预测

model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(), metrics='accuracy')
history = model.fit(x=x_train, y=y_train, epochs=100, verbose=0)
pd.DataFrame(history.history).plot()s = '边有一花果'
vocabulary[model.predict([get_one_hot(s)])[0].argmax()]
# 输出山

应该为山,预测结果与实际一致.

训练loss和accuracy如下:

数据比较小,很好训练

四、整体总结

论文太早了,实现没难度!

这篇关于[NNLM]论文实现:A Neural Probabilistic Language Model [Yoshua Bengio, Rejean Ducharme, Pascal Vincent]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/720092

相关文章

Linux下删除乱码文件和目录的实现方式

《Linux下删除乱码文件和目录的实现方式》:本文主要介绍Linux下删除乱码文件和目录的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux下删除乱码文件和目录方法1方法2总结Linux下删除乱码文件和目录方法1使用ls -i命令找到文件或目录

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核