IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> NNLM前馈神经网络模型学习笔记 -> 正文阅读

[人工智能]NNLM前馈神经网络模型学习笔记

? ? ? ? 传统的统计语言模型是一种非参数化的模型,即直接通过计数估计条件概率,但这种非参数化的模型最主要的缺点是泛化性差,不能充分利用相似上下文

????????用神经网络来训练语言模型的思想最早由百度 IDL (深度学习研究院)的徐伟提出,NNLM(Nerual Network Language Model)是这方面的一个经典模型,具体内容可参考 Bengio 2003年发表在JMLR上的论文。原文地址:http://jmlr.org/papers/volume3/bengio03a/bengio03a.pdf

与传统P(w_t|w_{t-(n-1)},\dots ,w_{t-1})的估算不同,NNLM模型直接通过一个神经网络结构对n元条件概率进行评估,基本思想可以表示为:

其中,函数f_{\theta}的两个输入变量分别为上下文和当前词,\theta表示模型的参数,如神经网络中的权

? ? ? ? ?输入的每个词w对应一个向量v_w,把n-1个向量拼接起来构成输入列向量x,表示如下:

?x = v_{w_1} \bigoplus v_{w_2}\bigoplus \dots \bigoplus v_{w_{n-1}}

? ? ? ? 列向量x\epsilon \mathbb{R}^{(n-1)d_w}d_w表示词向量维度。网络结构形式化如下:

? ? ? ? 其中,y,b\epsilon \mathbb{R}^{\nu },W\epsilon \mathbb{R}^{|\nu |\times (n-1)d_w},U\epsilon \mathbb{R}^{|\nu |\times d_h},H\epsilon \mathbb{R}^{d_h\times (n-1)d_w},b_1\epsilon \mathbb{R}^{d_h},均为可学习参数,?d_h表示为隐层维度(神经元的数目),输出y中的每一维对应此表中的每个词在神经网络的输出值,最后经过softmax归一化得到结果:

? ? ? ? ?该模型采用最大似然估计对参数进行优化,目标是使得观测数据的概率最大:

其中概率参数为训练语料集D中第k个n-gram词组,训练数据已经将文本预处理分割成n-gram词组。W是可选参数,如果输入层与输出层没有直接相连(如图中绿色虚线所示),则可令W=0H是输入层到隐含层的权重矩阵。|U|是隐含层到输出层的权重矩阵。bb_1分别是隐含层和输出层的偏置参数。

代码来自https://github.com/graykode/nlp-tutorial/blob/master/1-1.NNLM/NNLM.py

# %%
# 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.b1 = 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.b1 + 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()])

?总结优缺点

? ? ? ? 优点:?

? ? ? ? ? ? ? ??1.当n增加为n+1时神经网络语言模型较传统模型参数增加更少,只是线性增加。

? ? ? ? ????????2.实际情况下该模型的混乱都性能指标显著优于传统模型且更易扩展到高阶的n元语法。

? ? ? ? ? ? ? ? 3.该模型利用词的向量表示,不同位置的相同词可以共享参数,使得模型可以共享不同上下文之间的统计信息,具有更强的泛化性。

? ? ? ? 缺点:

? ? ? ? ? ? ? ??计算开销更大,来自归一化和矩阵乘法,后面介绍的一些方法如负采样、静态词向量模型中的一些优化能改善这个缺点。

?参考资料:

神经网路语言模型(NNLM)的理解_lilong117194的博客-CSDN博客_nnlm

?语言模型:从n元模型到NNLM - 知乎

?

?

?

?

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:51:04  更:2021-10-04 12:52:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 10:44:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码