NNLM

创新性提出可训练的词向量,为后续词向量发展提供基础

什么是 NNLM ?

  • 用了一个三层的神经网络来构建语言模型,同样也是 n-gram 模型。目的是利用前 n-1 个词预测第 n 个单词
  • NNLM 创新之处在于:不使用 one-hot 的方式去构建词向量,而是使用可学习的 embeding 方式。通过构建一个权重矩阵 C (nxm),这个权重矩阵在神经网络中更新

NNLM 的网络结构?

  • NNLM 包含 3 层网络:C->tanh->softmax,其中矩阵 C 是一个 n * m 的矩阵,行数 n 等于词库数量,列数 m 表示一个词的变量表示。首先输入在矩阵 C 中找到词的向量表示,然后将这些向量表示拼接在一起,并使用激活 tanh 和分类层 softmax 处理,最后输出下一个单词的概率
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    # NNLM parameters
    n_step = 2 # 根据前两个单词预测第3个单词
    n_hidden = 2 # 隐藏层神经元的个数
    m = 2 # 词向量的维度

    class NNLM(nn.Module):
    def __init__(self):
    super(NNLM, self).__init__()
    self.C = nn.Embedding(n_class, embedding_dim=m)
    self.H = nn.Parameter(torch.randn(n_step * m, n_hidden).type(dtype))
    self.W = nn.Parameter(torch.randn(n_step * m, n_class).type(dtype))
    self.d = nn.Parameter(torch.randn(n_hidden).type(dtype))
    self.U = nn.Parameter(torch.randn(n_hidden, n_class).type(dtype))
    self.b = nn.Parameter(torch.randn(n_class).type(dtype))

    def forward(self, x):
    x = self.C(x)
    x = x.view(-1, n_step * m)
    # x: [batch_size, n_step*n_class]
    tanh = torch.tanh(self.d + torch.mm(x, self.H))
    # tanh: [batch_size, n_hidden]
    output = self.b + torch.mm(x, self.W) + torch.mm(tanh, self.U)
    # output: [batch_size, n_class]
    return output

NNLM 的损失函数?

  • 类似于分类,使用交叉熵计算即可

参考: