用LSTM生成武俠人名

2021-09-07 22:50:11 字數 3534 閱讀 1798

之前翻譯了一篇介紹rnn的文章,一直沒看到作者寫新的介紹lstm的blog,於是我又找了其他資料學習。本文先介紹一下lstm,然後用lstm在金庸、古龍的人名上做了訓練,可以生成新的武俠名字,如果有興趣的,還可以多蒐集點人名,用於給小孩兒取名呢,哈哈,justforfun,大家玩得開心…

rnn的出現是為了解決狀態記憶的問題,解決方法很簡單,每乙個時間點t的隱藏狀態h(t)不再簡單地依賴於資料,還依賴於前乙個時間節點t-1的隱藏狀態h(t-1)。可以看出這是一種遞迴定義(所以迴圈神經網路又叫遞迴神經網路recursive neural network),h(t-1)又依賴於h(t-2),h(t-2)依賴於h(t-3)…所以h(t)依賴於之前每乙個時間點的輸入,也就是說h(t)記住了之前所有的輸入。

上圖如果按時間展開,就可以看出rnn其實也就是普通神經網路在時間上的堆疊。

一切似乎很完美,但是如果h(t)依賴於h(t - 1000),依賴路徑特別長,會導致計算梯度的時候出現梯度消失的問題,訓練時間很長根本沒法實際使用。下面是乙個依賴路徑很長的例子:

1

我老家【成都】的。。。【此處省去

500字】。。。我們那裡經常吃【火鍋】。。。

long short term memory神經網路,也就是lstm,由hochreiter & schmidhuber於2023年發表。它的出現就是為了解決long-term dependencies的問題,很來出現了很多改進版本,目前應用在相當多的領域(包括機器翻譯、對話機械人、語音識別、image caption等)。

標準的rnn裡,重複的模組裡只是乙個很簡單的結構,如下圖:

lstm也是類似的鍊錶結構,不過它的內部構造要複雜得多:

上圖中的圖示含義如下:

lstm的核心思想是cell state(類似於hidden state,有lstm變種把cell state和hidden state合併了, 比如gru)和三種門:輸入門、忘記門、輸出門。

cell state每次作為輸入傳遞到下乙個時間點,經過一些線性變化後繼續傳往再下乙個時間點(我還沒看過原始**,不知道為啥有了hidden state後還要cell state,好在確實有改良版將兩者合併了,所以暫時不去深究了)。

門的概念來自於電路設計(我沒學過,就不敢賣弄了)。lstm裡,門控制通過門之後資訊能留下多少。如下圖,sigmoid層輸出[0, 1]的值,決定多少資料可以穿過門, 0表示誰都過不了,1表示全部通過。

下面我們來看看每個「門」到底在幹什麼。

首先我們要決定之前的cell state需要保留多少。 它根據h(t-1)和x(t)計算出乙個[0, 1]的數,決定cell state保留多少,0表示全部丟棄,1表示全部保留。為什麼要丟棄呢,不是保留得越多越好麼?假設lstm在生成文章,裡面有小明和小紅,小明在看電視,小紅在廚房做飯。如果當前的主語是小明, ok,那lstm應該輸出看電視相關的,比如找遙控器啊, 換台啊,如果主語已經切換到小紅了, 那麼接下來最好暫時把電視機忘掉,而輸出洗菜、醬油、電飯煲等。

第二步就是決定輸入多大程度上影響cell state。這個地方由兩部分構成, 乙個用sigmoid函式計算出有多少資料留下,乙個用tanh函式計算出乙個候選c(t)。 這個地方就好比是主語從小明切換到小紅了, 電視機就應該切換到廚房。

然後我們把留下來的(t-1時刻的)cell state和新增加的合併起來,就得到了t時刻的cell state。

最後我們把cell state經過tanh壓縮到[-1, 1],然後輸送給輸出門([0, 1]決定輸出多少東西)。

現在也出了很多lstm的變種, 有興趣的可以看這裡。另外,lstm只是為了解決rnn的long-term dependencies,也有人從另外的角度來解決的,比如clockwork rnns by koutnik, et al. (2014).

我用的andrej karpathy大神的**, 做了些小改動。這個**的好處是不依賴於任何深度學習框架,只需要有numpy就可以馬上run起來!

然後從網上找了金庸**的人名,做了些預處理,每行乙個名字,儲存到input.txt裡,執行**就可以了。古龍的沒有找到比較全的名字, 只有這份武功排行榜,只有100多人。

下面是根據兩份名單訓練的結果,已經將完全一致的名字(比如段譽)去除了,所以下面的都是lstm「新創作發明」的名字哈。來, 大家猜猜哪乙個結果是金庸的, 哪乙個是古龍的呢?

1

2

3

4

5

6

7

8

9

10

1

2

3

4

5

6

7

8

9

10

11

12

13

感興趣的還可以用古代詩人、詞人等的名字來做訓練,大家機器好或者有時間的可以多訓練下,訓練得越多越準確。

rnn由於具有記憶功能,在nlp、speech、computer vision等諸多領域都展示了強大的力量。實際上,rnn是圖靈等價的。

1

if training vanilla neural nets

is optimization over functions, training recurrent nets is optimization over programs.

lstm是一種目前相當常用和實用的rnn演算法,主要解決了rnn的long-term dependencies問題。另外rnn也一直在產生新的研究,比如attention機制。有空再介紹咯。。。

keras使用LSTM生成文字

本文主要介紹使用lstm實現字元級文字生成。下面是示例 coding utf 8 in 1 import keras import numpy as np path keras.utils.get file nietzsche.txt origin text open path read lower...

LSTM文字生成(單詞級別)

20200818 前面文章中,介紹了字元級別的文字生成 lstm生成文字 字元級別 在字元級別的生成過程中,利用滑動視窗的形式來持續生成文字。本文中介紹看到的另外一篇基於單詞的生成形式。本篇文章中,主要參考了kaggle上的一篇文章 1 在模型中,使用了embedding層,然後輸入其實是句子。但是...

Keras實現雙向LSTM 隨機生成的資料

例如如下 10 個隨機數 0.63144003 0.29414551 0.91587952 0.95189228 0.32195638 0.60742236 0.83895793 0.18023048 0.84762691 0.29165514 累加值超過設定好的閾值時可標記為 1,否則為 0,例如...