标签: language-model

在TensorFlow CTC中使用自定义光束记分器(语言模型)

是否可以从Python端自定义TensorFlow CTC实现中的光束记分器?我在评论CTCBeamSearchDecoder C++类构造函数时看到了这种可能性,但是想知道如何为Python用户提供这个功能?

我们遇到的具体问题是将语言模型插入基于CTC的语音解码器.语言模型可能是预先训练的TensorFlow子图,能够输出光束得分调整的概率.但我们需要一种方法将其注入射线得分手.

language-model tensorflow

6
推荐指数
1
解决办法
1305
查看次数

word2vec - 什么是最好的?添加,连接或平均单词向量?

我正在研究一种复发语言模型.要学习可用于初始化我的语言模型的单词嵌入,我使用的是gensim的word2vec模型.训练之后,word2vec模型为词汇表中的每个单词保存两个向量:单词嵌入(输入/隐藏矩阵的行)和上下文嵌入(隐藏/输出矩阵的列).

作为概括这个帖子有这两个嵌入矢量组合至少三种常用的方法:

  1. 总结每个单词的上下文和单词向量
  2. 求和和求平均值
  3. 连接上下文和单词向量

但是,我找不到关于最佳策略的适当论文或报告.所以我的问题是:

  1. 是否对向量求和,平均或连接有共同的解决方案吗?
  2. 或者最好的方法完全取决于相关任务?如果是这样,什么策略最适合单词级语言模型?
  3. 为什么要结合载体?为什么不对每个单词使用"原始"单词嵌入,即包含在输入和隐藏神经元之间的权重矩阵中的单词嵌入.

相关(但未答复)的问题:

python gensim word2vec language-model word-embedding

6
推荐指数
1
解决办法
7634
查看次数

语言建模中的 Transformer 是否需要位置编码?

我正在开发一个语言模型,例如https://pytorch.org/tutorials/beginner/transformer_tutorial.html的语言模型。

\n\n

我不清楚 - 这里是否需要位置编码?\n据我了解 - 对于语言翻译任务来说这是必要的,因为解码器应该能够在编码器的序列中定位先前输出的单词。\n但是在没有解码器的语言建模中是否有必要?

\n\n

编码器输出中的单词是否可能被打乱?

\n\n

编辑:

\n\n

原论文中没有任何解释。我没有在教程中找到解释(就像这里https://kazemnejad.com/blog/transformer_architecture_positional_encoding/)。

\n\n

我不明白这一点:

\n\n

“由于句子中的每个单词同时流经 Transformer\xe2\x80\x99s 编码器/解码器堆栈,因此模型本身\xe2\x80\x99t 对每个单词没有任何位置/顺序感。”

\n\n

从我的角度来看,Transformer 编码器具有有关顺序的信息,因为它的输入是有序序列(类似于 RNN)。

\n\n

我尝试从模型中删除位置编码。它可以工作,但性能较差。

\n\n

将这种位置编码添加到 RNN 中有用吗?它可以提高其性能吗?

\n

transformer-model language-model

6
推荐指数
1
解决办法
4667
查看次数

Starcoder 微调 - 如何选择 GPU 以及如何估计微调所需的时间

我想在我的数据集和 GCP VM 实例上微调 Starcoder ( https://huggingface.co/bigcode/starcoder )。

文档中称,为了训练模型,他们使用了 512 个 Tesla A100 GPU,花了 24 天。

我还在 HuggingFace 的文件部分中看到了模型(.bin)文件(https://huggingface.co/bigcode/starcoder/tree/main

模型总大小约为64GB

根据所有这些信息,

  1. 如何确定哪个 GPU 最适合对我的数据集进行微调?
  2. 如何估计finetune 需要的时间?(例如,基于 epoch=1 等参数的假设)
  3. 选择硬件/计算时间是否考虑其他因素?

deep-learning language-model pytorch huggingface large-language-model

6
推荐指数
0
解决办法
587
查看次数

如何使用庞大的语言模型调整机器翻译模型?

Moses是一个建立机器翻译模型的软件.并且KenLM是摩西使用的事实语言模型软件.

我有一个16GB文本的文本文件,我用它来构建一个语言模型:

bin/lmplz -o 5 <text > text.arpa
Run Code Online (Sandbox Code Playgroud)

生成的文件(text.arpa)为38GB.然后我将语言模型二进制化:

bin/build_binary text.arpa text.binary
Run Code Online (Sandbox Code Playgroud)

二进制语言模型(text.binary)增长到71GB.

moses训练翻译模型后,您应该使用MERT算法调整模型的权重.这可以通过https://github.com/moses-smt/mosesdecoder/blob/master/scripts/training/mert-moses.pl完成.

MERT适用于小型语言模型,但使用大型语言模型,需要相当长的时间才能完成.

我做了谷歌搜索,发现了KenLM的过滤器,它承诺将语言模型过滤到更小的尺寸:https://kheafield.com/code/kenlm/filter/

但我对如何使其发挥作用毫无头绪.命令帮助给出:

$ ~/moses/bin/filter
Usage: /home/alvas/moses/bin/filter mode [context] [phrase] [raw|arpa] [threads:m] [batch_size:m] (vocab|model):input_file output_file

copy mode just copies, but makes the format nicer for e.g. irstlm's broken
    parser.
single mode treats the entire input as a single sentence.
multiple mode filters to multiple sentences in parallel.  Each sentence is on …
Run Code Online (Sandbox Code Playgroud)

nlp n-gram machine-translation moses language-model

5
推荐指数
1
解决办法
938
查看次数

en_vectors_web_lg 和 Glove 向量之间的差异 (spaCy)

https://spacy.io/models/en#en_vectors_web_lg 表示该模型包含 110 万个密钥,但 https://nlp.stanford.edu/projects/glove/ 表示 Glove 向量包含 220 万个词汇

我可以知道缺少哪些词汇吗?

非常感谢。

python language-model spacy

5
推荐指数
1
解决办法
2552
查看次数

在小型自定义语料库上预训练语言模型

我很好奇是否可以在文本生成中使用迁移学习,并在特定类型的文本上重新训练/预训练。

例如,拥有一个预训练的 BERT 模型和一个小的医学(或任何“类型”)文本语料库,创建一个能够生成医学文本的语言模型。假设您没有大量的“医学文本”,这就是您必须使用迁移学习的原因。

把它作为一个管道,我会把它描述为:

  1. 使用预训练的 BERT 分词器。
  2. 从我的新文本中获取新标记并将它们添加到现有的预训练语言模型(即 vanilla BERT)中。
  3. 使用组合标记器在自定义语料库上重新训练预训练的 BERT 模型。
  4. 生成与小型自定义语料库中的文本相似的文本。

这听起来很熟悉吗?抱脸可以吗?

deep-learning language-model transfer-learning bert-language-model huggingface-transformers

5
推荐指数
1
解决办法
1672
查看次数

NLP 中良好的困惑度值是否有特定的范围?

我正在微调语言模型,并计算训练和验证损失以及训练和验证困惑度。在我的程序中,它是通过损失的指数来计算的。我知道较低的困惑度代表更好的语言模型,并且想知道一个好的模型的值范围是多少。任何帮助表示赞赏。谢谢。

nlp neural-network deep-learning language-model perplexity

5
推荐指数
0
解决办法
552
查看次数

在序列模型中使用填充时,Keras 验证准确性有效/可靠吗?

我有一组不同长度的非零序列,我使用 Keras LSTM 对这些序列进行建模。我使用 Keras Tokenizer 进行标记化(标记从 1 开始)。为了使序列具有相同的长度,我使用填充

填充的示例:

# [0,0,0,0,0,10,3]
# [0,0,0,0,10,3,4]
# [0,0,0,10,3,4,5]
# [10,3,4,5,6,9,8]
Run Code Online (Sandbox Code Playgroud)

为了评估模型是否能够泛化,我使用了 70/30 比率的验证集。在每个 epoch 结束时,Keras 都会显示训练和验证的准确性。

我最大的疑问是使用 padding 时Keras 验证准确性是否可靠。因为验证集可以简单地是 0 的序列 --> [0,0,0]。由于有很多 0 的序列(由于填充),模型可以轻松地学习并正确预测 0 的序列,从而创建假的高验证精度。换句话说,模型可能学习零序列,而不学习真实序列。

那么,填充会影响 Keras 中的验证准确性吗?

machine-learning deep-learning language-model keras tensorflow

5
推荐指数
2
解决办法
1317
查看次数

scaled_dot_product_attention 如何与因果 LM 中的缓存键/值一起使用?

我正在实现一个变压器,并且一切正常,包括使用scaled_dot_product_attentionPyTorch 2.0 中的新功能的注意力。然而,我只会进行因果关注,因此使用该is_causal=True标志来提高效率似乎是有意义的。只要 k、v 和 q 张量具有相同的大小,这也符合我的预期。

但我不确定如何在此模式下将过去的(缓存的)键/值传递给函数。如果 k、v 张量比 q 宽,我需要一个与 k/v 一样宽、与 q 一样高的矩形掩模,并屏蔽掉右上角的三角形。如果我自己构建这样一个掩码并将其传递给函数,一切都很好。我得到的行为类似于典型的因果关注,其中过去的标记被完全关注,而新的标记(有查询)被因果关注。

不过,根据文档is_causal=True这相当于使用以下构建的掩码:

attn_mask = torch.ones(L, S, dtype=torch.bool).tril(diagonal=0)
Run Code Online (Sandbox Code Playgroud)

其中 L 和 S 分别是查询长度和键/值长度。这使得除了左下三角形部分之外的所有部分都被屏蔽,该部分部分涉及过去的标记,而根本不涉及新的标记。这种因果模式是否不适合我的用例,或者我错过了什么?

假设我有以下张量:

q = torch.rand((1, n_heads, 3, head_dim))
k = torch.rand((1, n_heads, 6, head_dim))
v = torch.rand((1, n_heads, 6, head_dim))

attn_output = torch.nn.functional.scaled_dot_product_attention(q, k, v, attn_mask=None, is_causal=True)
Run Code Online (Sandbox Code Playgroud)

其中 k 和 v 更宽,因为它们连接到先前推理过程的缓存结果上。scaled_dot_product_attention应用以下掩码:

[[0, -inf, -inf, -inf, -inf, -inf]
 [0,    0, …
Run Code Online (Sandbox Code Playgroud)

language-model pytorch self-attention

5
推荐指数
0
解决办法
1125
查看次数