shawnspace / HRAN

The inplementation of Hierarchical Recurrent Attention Network
38 stars 9 forks source link

unk being index 0 and sos being index 1 and eos being index 2 #4

Open zysNLP opened 5 years ago

zysNLP commented 5 years ago

我不太明白您在readme里说的rg_vocab.txt文件,这个文件是所有分词的集合是么?如果是中文,您有没有尝试过(中文可以分字也可以分词)?我不太理解的是unk being index 0 and sos being index 1 and eos being index 2这句。意思是rg_vocab.txt的第1,2,3行分别是unk,sos,eos么?unk我知道可以替代文档中不在字典里的词,sos和eos代表什么呢?

shawnspace commented 5 years ago

您好。

rg_vocab.txt是所有分词的集合,也就是字典。一般中文可以用分词来构建字典,不太建议分字,不过我没有在中文上尝试过seq2seq模型。

sos代表start of sentence,eos代表end of sentence。是用来在training阶段padding目标回复的前面和后面的。在feed给decoder的回复里,padding sos在前面,在计算decoder的output与目标回复的cross entropy时,padding eos在目标回复后面。举个例子:

目标回复:i like apple feed给decoder的目标回复(response_in 这个tensor):sos i like apple decoder用来计算cross entropy的目标回复(response_out这个tensor):i like apple eos

建议你查看创建tfrecords文件的代码来看对话的预处理,可以看到这个padding。

zysNLP commented 5 years ago

谢谢您及时的回答。我现在构建dialog_train.txt和dialog_valid.txt文件,里面的语句类似下面这样: hello lucy! hi lily! nice to meet you! nice to meet you too! hello lucy! hi lily! nice to meet you! nice to meet you too! hello lucy! hi lily! nice to meet you! nice to meet you too! hello lucy! hi lily! nice to meet you! nice to meet you too! ... 这样每行代表一个dialog,其中/t就是用tab隔开的,前几个代表context,最后一个代表response。 那么我在rg_vocab.txt文件应该是这个样子: hello lucy hi lily nice to meet you ! too 就是不知道把您那三个unk,sos,eos放哪里,这样放吗: unk sos eos hello lucy hi lily nice to meet you ! too 如果是这样,那sos和eos在train和valid的txt文件里没有体现。还是说需要把train,valid这样做: sos hello lucy! eos sos hi lily!eos sos nice to meet you! eos sos nice to meet you too! eos 我感觉还是没理解这三个单词,脑阔疼,求指点。

shawnspace commented 5 years ago

你的sos和eos放置方式没错。在train.txt和valid.txt里不用padding,是在构造tfrecords文件时才进行padding,并存放到tfrecords文件里。

建议你查看创建tfrecords文件的代码。

zysNLP commented 5 years ago

好的,多谢!

zysNLP commented 5 years ago

请问下hparam.py中第六行tf.flags.DEFINE_string('word_embed_path','./data/glove.txt','path to word embedding')。这里的glove.txt应该是词向量文件么? 我在看helper.py中读取这个文件,是每行代表一个词和它的词向量吗?helper.load_glove_vectors函数中我猜测token应该是一个词+向量;是word+entries? 想问下entries是怎样的形式?我猜测是: Hi 0.5 how 0.6 但您那里entries又不止一个0.5,从vectors.extend(float(x) for x in entries)看,似乎entires像一个列向量。 另外,glove.txt文件应该不是从prepare_context_RG_data.py或者train.py出来的,我想应该是通过一种embediing单独做出来的,只是不清楚这个文件的格式。 感谢!

shawnspace commented 5 years ago

词向量文件我用的是https://nlp.stanford.edu/projects/glove/。你可以下载下来看看它预先训练和保存的格式

zysNLP commented 5 years ago

好的,感谢!

zysNLP commented 5 years ago

老哥,我词向量文件是用BERT训练出来的,一个词由768维向量组成。。。train.py的时候没有报错,但是过了很久也没读出第一个epoch,我看glove的词向量好像不超过50维,是不是我维度搞得太高了。。。

zysNLP commented 5 years ago

tf.flags.DEFINE_string('word_embed_path','./data/glove_tieba1.txt','path to word embedding') #每个embedding10维 tf.flags.DEFINE_string('vocab_path','./data/word_segment1.txt','vocab path') tf.flags.DEFINE_integer('vocab_size',7942,'vocab size') tf.flags.DEFINE_integer("word_dim", 10, "Dimensionality of the embeddings") tf.flags.DEFINE_integer('word_rnn_num_units', 128, 'Num of rnn cells') tf.flags.DEFINE_integer('context_rnn_num_units', 256, 'Num of rnn cells') tf.flags.DEFINE_integer('decoder_rnn_num_units', 256, 'Num of rnn cells') tf.flags.DEFINE_integer('context_attn_units',128,'num context attn units') tf.flags.DEFINE_integer('utte_attn_units',128 ,'num utterance level attn units')

你好,我修改了这些参数,词嵌入已经降为10维,为什么跑起来非常慢呢?我想问,在您github里默认的超参数情况下,您用了怎样的配置,跑了多久把train跑完呢?

zh215021 commented 5 years ago

词向量10维的效果肯定会差很多吧,我跑了一下这个模型,用的豆瓣多轮的中文语料,词向量用的中文300维的,Telsa K80,100个step大概要10分钟吧,确实很慢,。

zysNLP commented 5 years ago

词向量10维的效果肯定会差很多吧,我跑了一下这个模型,用的豆瓣多轮的中文语料,词向量用的中文300维的,Telsa K80,100个step大概要10分钟吧,确实很慢,。

同学能提供一些豆瓣多轮预料的样例吗

zh215021 commented 5 years ago

词向量10维的效果肯定会差很多吧,我跑了一下这个模型,用的豆瓣多轮的中文语料,词向量用的中文300维的,Telsa K80,100个step大概要10分钟吧,确实很慢,。

同学能提供一些豆瓣多轮预料的样例吗

我是用的这份数据,里边包含很多中文的语料。根据readme里边的q1\ta1\tq2\ta2\n 格式处理了一下。 https://pan.baidu.com/s/1szmNZQrwh9y994uO8DFL_A 提取码:f2ex

zysNLP commented 5 years ago

词向量10维的效果肯定会差很多吧,我跑了一下这个模型,用的豆瓣多轮的中文语料,词向量用的中文300维的,Telsa K80,100个step大概要10分钟吧,确实很慢,。

同学能提供一些豆瓣多轮预料的样例吗

我是用的这份数据,里边包含很多中文的语料。根据readme里边的q1\ta1\tq2\ta2\n 格式处理了一下。 https://pan.baidu.com/s/1szmNZQrwh9y994uO8DFL_A 提取码:f2ex

请问,你的词向量用的是https://github.com/Embedding/Chinese-Word-Vectors这个网站里的其中一个三百维的文件么?

zysNLP commented 5 years ago

词向量10维的效果肯定会差很多吧,我跑了一下这个模型,用的豆瓣多轮的中文语料,词向量用的中文300维的,Telsa K80,100个step大概要10分钟吧,确实很慢,。

同学能提供一些豆瓣多轮预料的样例吗

我是用的这份数据,里边包含很多中文的语料。根据readme里边的q1\ta1\tq2\ta2\n 格式处理了一下。 https://pan.baidu.com/s/1szmNZQrwh9y994uO8DFL_A 提取码:f2ex

另外,你在处理豆瓣这个文件的时候,是不是把标签为0的数据整行都删除了?因为我知道这个数据集构造就是标签为0的都是随机选的不准确的回答。

zh215021 commented 5 years ago

豆瓣那个语料就把标签是0的删掉就好,词向量我是原来自己用微博语料训练的,和这个链接里的也没什么区别,valid不要弄太大,否则每次evaluate时间太长了。这个模型我训练的效果不是太理想,你可以试一下~

zysNLP commented 5 years ago

豆瓣那个语料就把标签是0的删掉就好,词向量我是原来自己用微博语料训练的,和这个链接里的也没什么区别,valid不要弄太大,否则每次evaluate时间太长了。这个模型我训练的效果不是太理想,你可以试一下~

针对您的语料,我在使用别的词向量时,特意将不在语料中的词所对应的语料删除了。例如如果我使用微博词向量,那么如果豆瓣语料里某条对话里的某个词在微博词向量中没出现,那么就删除这条对话。这样,凡是微博(或者其他)词向量里的词,就能包括所有处理后语料中的词了。避免了在对某个词调用词向量时查找不到的局面。

zysNLP commented 5 years ago

豆瓣那个语料就把标签是0的删掉就好,词向量我是原来自己用微博语料训练的,和这个链接里的也没什么区别,valid不要弄太大,否则每次evaluate时间太长了。这个模型我训练的效果不是太理想,你可以试一下~

清理以后,每100个step需要3分钟。。这是数据集在30w左右的情况下。

ABAPPLO commented 5 years ago

豆瓣那个语料就把标签是0的删掉就好,词向量我是原来自己用微博语料训练的,和这个链接里的也没什么区别,valid不要弄太大,否则每次evaluate时间太长了。这个模型我训练的效果不是太理想,你可以试一下~

清理以后,每100个step需要3分钟。。这是数据集在30w左右的情况下。

请教下,你们中文模型训练出来的结果怎么样呢?为何我的不管输入是什么,回答的总是同一个答案组合

ttzhang511 commented 4 years ago

词向量10维的效果肯定会差很多吧,我跑了一下这个模型,用的豆瓣多轮的中文语料,词向量用的中文300维的,Telsa K80,100个step大概要10分钟吧,确实很慢,。

我的中文数据集大小差不多70w,batch_size是32,模型跑1epoch需要1天,1个epoch结果预测都是相同的答案,请问你的运行时间是怎样的?模型结果如何呢?

hpw-hub commented 4 years ago

豆瓣那个语料就把标签是0的删掉就好,词向量我是原来自己用微博语料训练的,和这个链接里的也没什么区别,valid不要弄太大,否则每次evaluate时间太长了。这个模型我训练的效果不是太理想,你可以试一下~ 老哥能不能看一下你的glove.txt文件里面的样式

hpw-hub commented 4 years ago

豆瓣那个语料就把标签是0的删掉就好,词向量我是原来自己用微博语料训练的,和这个链接里的也没什么区别,valid不要弄太大,否则每次evaluate时间太长了。这个模型我训练的效果不是太理想,你可以试一下~

清理以后,每100个step需要3分钟。。这是数据集在30w左右的情况下。

老哥能不能发一下glove,txt文件

Choitsugun commented 3 years ago

我不太明白您在readme里说的rg_vocab.txt文件,这个文件是所有分词的集合是么?如果是中文,您有没有尝试过(中文可以分字也可以分词)?我不太理解的是unk being index 0 and sos being index 1 and eos being index 2这句。意思是rg_vocab.txt的第1,2,3行分别是unk,sos,eos么?unk我知道可以替代文档中不在字典里的词,sos和eos代表什么呢?

老哥,我词向量文件是用BERT训练出来的,一个词由768维向量组成。。。train.py的时候没有报错,但是过了很久也没读出第一个epoch,我看glove的词向量好像不超过50维,是不是我维度搞得太高了。。。

请问您的生成效果如何 我这边的生成总是一个答案组合。。。 是我哪里参数设置的不对吗?