我正在调整TensorFlow RNN教程来训练一个NCE丢失或采样softmax的语言模型,但我仍然想报告困惑.然而,我得到的困惑是非常奇怪的:对于NCE我得到几百万(太可怕了!)而对于采样softmax,我在一个纪元后获得了700的PPL(太好了,不是真的吗?!).我不知道我做错了什么.
这是我对PTBModel的改编:
class PTBModel(object):
"""The PTB model."""
def __init__(self, is_training, config, loss_function="softmax"):
...
w = tf.get_variable("proj_w", [size, vocab_size])
w_t = tf.transpose(w)
b = tf.get_variable("proj_b", [vocab_size])
if loss_function == "softmax":
logits = tf.matmul(output, w) + b
loss = tf.nn.seq2seq.sequence_loss_by_example(
[logits],
[tf.reshape(self._targets, [-1])],
[tf.ones([batch_size * num_steps])])
self._cost = cost = tf.reduce_sum(loss) / batch_size
elif loss_function == "nce":
num_samples = 10
labels = tf.reshape(self._targets, [-1,1])
hidden = output
loss = tf.nn.nce_loss(w_t, b,
hidden,
labels,
num_samples,
vocab_size)
elif loss_function == "sampled_softmax":
num_samples = …
Run Code Online (Sandbox Code Playgroud) 我正在使用这种预训练的张量流模型,并试图获得一个句子的概率。我的主要任务是,从几句话中找出概率最大的句子。
使用此代码,我可以预测下一个单词。
bazel-bin/lm_1b/lm_1b_eval --mode sample \
--prefix "I love that I" \
--pbtxt data/graph-2016-09-10.pbtxt \
--vocab_file data/vocab-2016-09-10.txt \
--ckpt 'data/ckpt-*'
Run Code Online (Sandbox Code Playgroud)
但是,如何从许多句子列表中得出句子的概率呢?
python-2.7 language-model tensorflow recurrent-neural-network
我是Keras RNN结构中语言模型实现的新手.我有一个具有以下统计数据的离散单词数据集(不是来自单个段落),
现在,我想构建一个接受角色并预测单词中下一个角色的模型.我填写了所有单词,以便它们具有相同的长度.所以我的输入是Word_input,形状为1953 x 9,目标是1953 x 9 x 33.我也想使用嵌入层.所以我的网络架构是,
self.wordmodel=Sequential()
self.wordmodel.add(Embedding(33,embedding_size,input_length=9))
self.wordmodel.add(LSTM(128, return_sequences=True))
self.wordmodel.add(TimeDistributed(Dense(33)))
self.wordmodel.compile(loss='mse',optimizer='rmsprop',metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
作为示例,带有填充的单词"CAT"表示
输入网络 - START CAT END****(9个字符)
目标相同--- CAT END*****(9个字符)
因此,对于TimeDistributed
输出,我正在测量网络预测和目标的差异.我还将其设置batch_size
为1.因此,在读取每个样本字后,网络将重置其状态.
我的问题是我在概念上做得对吗?每当我进行训练时,准确度都会降低56%左右.
请赐教.谢谢.
我可以看到,在英语 spaCy 模型中,中型模型的性能优于小模型,而大型模型的性能优于中型模型 - 但只是略微优于。然而,在模型的描述中,写到它们都是在 OntoNotes 上训练的。md 和 lg 的向量是个例外,它们已在 CommonCrawl 上进行了训练。因此,如果所有模型都在同一数据集(OntoNotes)上进行训练,并且唯一的区别是向量,那么为什么不需要向量的任务会有性能差异呢?我很想了解有关每个模型及其训练设置等的更多信息,但似乎这些信息并不容易获得。
我刚刚使用 pytorch 训练了一个 LSTM 语言模型。这个类的主体是这样的:
class LM(nn.Module):
def __init__(self, n_vocab,
seq_size,
embedding_size,
lstm_size,
pretrained_embed):
super(LM, self).__init__()
self.seq_size = seq_size
self.lstm_size = lstm_size
self.embedding = nn.Embedding.from_pretrained(pretrained_embed, freeze = True)
self.lstm = nn.LSTM(embedding_size,
lstm_size,
batch_first=True)
self.fc = nn.Linear(lstm_size, n_vocab)
def forward(self, x, prev_state):
embed = self.embedding(x)
output, state = self.lstm(embed, prev_state)
logits = self.fc(output)
return logits, state
Run Code Online (Sandbox Code Playgroud)
现在我想写一个函数来计算一个句子的好坏,基于经过训练的语言模型(一些分数,如困惑度等)。
我有点困惑,我不知道我应该如何计算这个。
类似的样本会有很大用处。
假设我们以此为基础建立了一个模型:
$ wget https://gist.githubusercontent.com/alvations/1c1b388456dc3760ffb487ce950712ac/raw/86cdf7de279a2b9bceeb3adb481e42691d12fbba/something.txt
$ lmplz -o 5 < something.txt > something.arpa
Run Code Online (Sandbox Code Playgroud)
从困惑公式(https://web.stanford.edu/class/cs124/lec/languagemodeling.pdf)
应用逆对数公式的总和以获取内部变量,然后取第n个根,则困惑度异常小:
>>> import kenlm
>>> m = kenlm.Model('something.arpa')
# Sentence seen in data.
>>> s = 'The development of a forward-looking and comprehensive European migration policy,'
>>> list(m.full_scores(s))
[(-0.8502398729324341, 2, False), (-3.0185394287109375, 3, False), (-0.3004383146762848, 4, False), (-1.0249041318893433, 5, False), (-0.6545327305793762, 5, False), (-0.29304179549217224, 5, False), (-0.4497605562210083, 5, False), (-0.49850910902023315, 5, False), (-0.3856896460056305, 5, False), (-0.3572353720664978, 5, False), (-1.7523181438446045, 1, False)]
>>> n = len(s.split()) …
Run Code Online (Sandbox Code Playgroud) 是否有可能对像 Roberta 这样的小得多的语言模型(例如客户服务数据集)进行微调,并获得与使用部分数据集提示 GPT-4 所获得的结果一样好的结果?
经过微调的 Roberta 模型能否学会以对话方式遵循指令,至少对于这样的小领域?
有没有任何论文或文章可以根据经验探讨这个问题?
language-model roberta roberta-language-model gpt-4 large-language-model
在Windows 10上使用Python 2.7 Anaconda
我已经训练了一个GRU神经网络来使用keras构建语言模型:
print('Build model...')
model = Sequential()
model.add(GRU(512, return_sequences=True, input_shape=(maxlen, len(chars))))
model.add(Dropout(0.2))
model.add(GRU(512, return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(len(chars)))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
Run Code Online (Sandbox Code Playgroud)
如何计算这种语言模型的困惑?例如,NLTK为其模型提供了困惑度计算功能。
我正在尝试在Keras中训练单词级别的语言模型。
我的X和Y的形状均为(90582L,517L)
当我尝试拟合此模型时:
print('Build model...')
model = Sequential()
model.add(GRU(512, return_sequences=True, input_shape=(90582, 517)))
model.add(Dropout(0.2))
model.add(GRU(512, return_sequences=True))
model.add(Dropout(0.2))
model.add(TimeDistributedDense(1))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop')
model.fit(x_pad, y_pad, batch_size=128, nb_epoch=2)
Run Code Online (Sandbox Code Playgroud)
我得到错误:
Exception: Error when checking model input:
expected gru_input_7 to have 3 dimensions, but got array with shape (90582L, 517L)
Run Code Online (Sandbox Code Playgroud)
我需要一些有关输入形状应该如何的指导?我已经对各种组合进行了反复试验,但似乎我误解了一些基本知识。
在Keras文本生成示例中,X矩阵具有3个维度。我不知道第三维应该是什么。
我想使用域语料库(情感相关文本)预训练 BERT 和 RoBERTa MLM。使用50k~100k字需要多长时间。由于 RoBERTa 没有接受过预测下一个句子目标的训练,一个训练目标比 BERT 少,并且具有更大的小批量和学习率,我认为 RoBERTa 会快得多?
language-model ×10
python ×5
nlp ×4
keras ×3
lstm ×3
tensorflow ×2
embedding ×1
gpt-4 ×1
kenlm ×1
perplexity ×1
python-2.7 ×1
pytorch ×1
roberta ×1
softmax ×1
spacy ×1