numpy实现RNN和LSTM循环神经网络产生古诗

实现的github,每一层输出都单独和pytorch对齐了

ZouJiu1/numpy_lstm_RNN: RNN、LSTM which using numpy,can train and generate Chinese poetry,embedding, full connect, etc. train normally, save model, restore model (github.com)
github.com/ZouJiu1/numpy_lstm_RNN/tree/master

训练codes,由于是CPU训练所以速度较慢
写了些个好几个模型,主要是sequence的长度,以及字符训练,或者hanlp分词训练的,或者动态训练
*_dynamic的档案,是动态rnn或者lstm,输入长度和输出长度都是变化的
*_V2_Embedding.py的档案,输入长度和输出长度固定且相等,而且输出后移一个字符或者一个词
2layer_Embedding的档案,输入长度固定,输出是后一个字符或者一个词,也就是输出只有一个的
可以正常训练的,还支持保存模型和加载模型重训

总共实现了这几个层:

numpy实现RNN层的前向传播和反向传播 - 知乎 (zhihu.com)

numpy实现embedding层的前向传播和反向传播 - 知乎 (zhihu.com)

numpy实现LSTM层的前向传播和反向传播 - 知乎 (zhihu.com)

损失函数的前向传播和反向传播 - 知乎 (zhihu.com)

全连接层的前向传播和反向传播 - 知乎 (zhihu.com)

字符

在这使用写好的RNN\LSTM进行了实践,输出的效果还可以的,使用了26个英文字母做字符的predict训练,使用了26个英文字母的,然后train的时候,是给定sequence=10,每次拿10个字符,然后label往后移动一个字符
输入是:inputs_character = "abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz "
train以后使用保存的模型predict,输入“c”,就能得到相应的输出“defghijklmnopqrst”
见:
RNN、LSTM which using numpy,can train and generate Chinese poetry,embedding, full connect, etc. train normally, save model, restore model
github.com/ZouJiu1/numpy_lstm_RNN

然后还使用字符训练了诗词,数据是来自:Werneror/Poetry: 非常全的古诗词数据,收录了从先秦到现代的共计85万余首古诗词。 (github.com)

最开始用的字符级别产生,one-hot字向量,发现不能收敛,loss一直不下降的呢,而且train速度很慢的呢,然后使用了embedding层,numpy实现embedding层的前向传播和反向传播
使用embedding以后训练速度好了很多的,但不管是rnn或者是使用lstm,都不能收敛的,考虑到没有对词频进行statistic,导致了long tail分布,对词频进行statistic排序然后拿前多少个词频,也就是拿到排在前面的词频,后面的词频较小的词,包括小词频的句子所在行都被删除了,所以训练集只包括词频在前的句子,若是直接训练,会发现训练很难收敛,主要是词频太小的句子,训练次数太少,不能收敛的,而且词频小的词还挺多的,导致了不能收敛
statistic词频以后然后删掉低频词所在的句子,训练以后就可以正常收敛了。但是输出的句子没有句意,虽说可以输出了。
输入和输出的:残星落檐外

残月江花来,
山明水开不。
色月山无知,
花明中限处。

诗句

Werneror/Poetry: 非常全的古诗词数据,收录了从先秦到现代的共计85万余首古诗词。 (github.com)
字符的train发现输出不太好,字和字之间没有relation,输出完全没有句子意思,使用hanlp分词以后效果才变好的,hanlp分词使用的是这个模型-FINE_ELECTRA_SMALL_ZH,细腻度分词的。拿到了每句对应的分词,以及id2char,char2id的dictionary

train的时候发现输出的很多都是EOS符号,EOS也就是结束符号的,主要是填充的时候使用了很多的EOS符号,所以train梯度不太对了,这边对梯度进行了缩放,EOS的梯度*0.001,EOS的梯度缩小了1000倍。就可以正常训练了的,loss也正常下降的,使用了RNN和LSTM训练,RNN训练算正常的。
这边给出几个Example:

输入:暮云千山雪
暮云千山雪,
春行复深上。
风无流鸟树,
清客鸟归还。

输入:朝送山僧去
朝送山僧去,
莫君在梦何。
不知山不知,
山中我欲幸。

输入:携杖溪边听
携杖溪边听,
抱我树月知。
故山中常更,
鸟中应上鬓。

输入:楼高秋易寒
楼高秋易寒,
凭谁暮云云,
添我下来衣,
知一别来云,

输入:残星落檐外
残星落檐外,
馀月罢窗来,
水白先成秋,
霞暗未成不,

输入:月在画楼西
月在画楼西,
烛故是愁来。
何转知此山,
花常更花中。

参考:

https://blog.csdn.net/SHU15121856/article/details/104387209

https://hanlp.hankcs.com/docs/api/hanlp/pretrained/tok.html

https://github.com/hankcs/HanLP

https://github.com/Werneror/Poetry

https://discuss.pytorch.org/t/how-nn-embedding-trained/32533/11

https://zhuanlan.zhihu.com/p/247970862

https://zhuanlan.zhihu.com/p/147685918

https://zhuanlan.zhihu.com/p/28054589

https://zhuanlan.zhihu.com/p/371849556

https://zhuanlan.zhihu.com/p/54868269

https://zhuanlan.zhihu.com/p/488710218

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

https://blog.csdn.net/zhaojc1995/article/details/80572098

https://github.com/wzyonggege/RNN_poetry_generator

https://github.com/stardut/Text-Generate-RNN

https://github.com/youyuge34/Poems_generator_Keras

https://github.com/justdark/pytorch-poetry-gen

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐