神经网络语言模型(NNLM)

2023-11-22 12:20

本文主要是介绍神经网络语言模型(NNLM),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#1. 模型原理
用神经网络来训练语言模型的思想最早由百度 IDL (深度学习研究院)的徐伟提出[1],其中这方面的一个经典模型是NNLM(Nerual Network Language Model),具体内容可参考 Bengio 2003年发表在JMLR上的论文[2]

模型的训练数据是一组词序列$ w_{1 } . . . ... ...w_{T} , , ,w_{t} \in V$。其中 V V V 是所有单词的集合(即词典), V i V_{i} Vi 表示字典中的第 i 个单词。NNLM的目标是训练如下模型:

  • f ( w t , w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) = p ( w t ∣ w 1 t − 1 ) f(w_{t},w_{t-1},...,w_{t-n+2}, w_{t-n+1})=p(w_{t} | {w_{1}}^{t-1}) f(wt,wt1,...,wtn+2,wtn+1)=p(wtw1t1)

其中 w t w_{t} wt表示词序列中第 t t t 个单词, w 1 t − 1 {w_{1}}^{t-1} w1t1表示从第1个词到第 t t t 个词组成的子序列。模型需要满足的约束条件是:

  • f ( w t , w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) > 0 f(w_{t},w_{t-1},...,w_{t-n+2}, w_{t-n+1}) > 0 f(wt,wt1,...,wtn+2,wtn+1)>0

  • ∑ i = 1 ∣ V ∣ f ( i , w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) = 1 \sum_{i=1}^{|V|}f(i,w_{t-1},...,w_{t-n+2}, w_{t-n+1}) =1 i=1Vf(i,wt1,...,wtn+2,wtn+1)=1

下图展示了模型的总体架构:

图片名称

该模型可分为特征映射计算条件概率分布两部分:

  1. 特征映射:通过映射矩阵 C ∈ R ∣ V ∣ × m C \in R^{|V|×m} CRV×m 将输入的每个词映射为一个特征向量, C ( i ) ∈ R m C(i) \in R^{m} C(i)Rm表示词典中第 i 个词对应的特征向量,其中 m m m 表示特征向量的维度。该过程将通过特征映射得到的 C ( w t − n + 1 ) , . . . , C ( w t − 1 ) C(w_{t-n+1}),...,C(w_{t-1}) C(wtn+1),...,C(wt1) 合并成一个 ( n − 1 ) m (n-1)m (n1)m 维的向量: ( C ( w t − n + 1 ) , . . . , C ( w t − 1 ) ) (C(w_{t-n+1}),...,C(w_{t-1})) (C(wtn+1),...,C(wt1))

  2. 计算条件概率分布:通过一个函数 g g g g g g 是前馈或递归神经网络)将输入的词向量序列 ( C ( w t − n + 1 ) , . . . , C ( w t − 1 ) ) (C(w_{t-n+1}),...,C(w_{t-1})) (C(wtn+1),...,C(wt1)) 转化为一个概率分布 y ∈ R ∣ V ∣ y \in R^{|V|} yRV ,$y $ 中第 i 位表示词序列中第 t 个词是 V i V_{i} Vi 的概率,即:

  • f ( i , w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) = g ( i , C ( w t − n + 1 ) , . . . , C ( w t − 1 ) ) f(i,w_{t-1},...,w_{t-n+2}, w_{t-n+1})= g(i,C(w_{t-n+1}),...,C(w_{t-1})) f(i,wt1,...,wtn+2,wtn+1)=g(i,C(wtn+1),...,C(wt1))

下面重点介绍神经网络的结构,网络输出层采用的是softmax函数,如下式所示:

  • p ( w t ∣ w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) = e y w t ∑ i e y i p(w_{t}|w_{t-1},...,w_{t-n+2}, w_{t-n+1}) = \frac{ e^{y_{w_{t}}} }{ \sum_{i}^{ }e^{y_{i}} } p(wtwt1,...,wtn+2,wtn+1)=ieyieywt

其中 y = b + W x + U t a n h ( d + H x ) y = b +Wx + Utanh(d + Hx) y=b+Wx+Utanh(d+Hx),模型的参数 θ = ( b , d , W , U , H , C ) \theta = (b,d,W,U,H,C) θ=(bdWUHC) x = ( C ( w t − n + 1 ) , . . . , C ( w t − 1 ) ) x=(C(w_{t-n+1}),...,C(w_{t-1})) x=(C(wtn+1),...,C(wt1)) 是神经网络的输入。 W ∈ R ∣ V ∣ × ( n − 1 ) m W \in R^{|V|×(n-1)m} WRV×(n1)m是可选参数,如果输入层与输出层没有直接相连(如图中绿色虚线所示),则可令 W = 0 W = 0 W=0 H ∈ R h × ( n − 1 ) m H \in R^{h×(n-1)m} HRh×(n1)m是输入层到隐含层的权重矩阵,其中 h h h表示隐含层神经元的数目。 U ∈ R ∣ V ∣ × h U \in R^{|V|×h} URV×h是隐含层到输出层的权重矩阵。 d ∈ R h d\in R^{h} dRh b ∈ R ∣ V ∣ b \in R^{|V|} bRV分别是隐含层和输出层的偏置参数。

**需要注意的是:**一般的神经网络模型不需要对输入进行训练,而该模型中的输入 x = ( C ( w t − n + 1 ) , . . . , C ( w t − 1 ) ) x=(C(w_{t-n+1}),...,C(w_{t-1})) x=(C(wtn+1),...,C(wt1)) 是词向量,也是需要训练的参数。由此可见模型的权重参数与词向量是同时进行训练,模型训练完成后同时得到网络的权重参数和词向量。

#2. 训练过程
模型的训练目标是最大化以下似然函数:

  • L = 1 T ∑ t l o g f ( w t , w t − 1 , . . . , w t − n + 2 , w t − n + 1 ; θ ) + R ( θ ) L=\frac{1}{T} \sum_{t}^{ } logf(w_{t},w_{t-1},...,w_{t-n+2}, w_{t-n+1}; \theta) + R(\theta) L=T1tlogf(wt,wt1,...,wtn+2,wtn+1;θ)+R(θ) ,其中 θ \theta θ为模型的所有参数, R ( θ ) R(\theta) R(θ)为正则化项

使用梯度下降算法更新参数的过程如下:

  • θ ← θ + ϵ ∂ l o g p ( w t ∣ w t − 1 , . . . , w t − n + 2 , w t − n + 1 ) ∂ θ \theta \leftarrow \theta +\epsilon \frac{\partial logp(w_{t}|w_{t-1},...,w_{t-n+2}, w_{t-n+1}) }{\partial \theta} θθ+ϵθlogp(wtwt1,...,wtn+2,wtn+1) ,其中 $\epsilon $为步长。
    #3. 参考资料
    [1] Can Artificial Neural Networks Learn Language Models?
    [2] A Neural Probabilistic Language Model
    http://blog.sina.com.cn/s/blog_66a6172c0102v1zb.html

这篇关于神经网络语言模型(NNLM)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结