pytorch lstm 寫詩文的魔改,測試,猜想

2021-10-19 10:48:10 字數 4263 閱讀 1563

首先目前自然語言處理的網路基本都是transformers的變體。

我們就不從熱鬧了,就使用簡單的fc層設計乙個,首先一般自然語言都是乙個概率問題,

所以就是乙個分類問題,一般都是有多少的字就分為多少類,一般的輸入是語句的編碼或者位置編碼,一般的輸出是乙個多組多分類(一句話有多個字這個字是哪個字)。

但是,我就想說一句人們做了這麼久的分類就是不知道變通嗎,就是一直跟著屁股後跑嗎。1000個字就一千分類,一萬個字就億萬分類。中國有4萬個字好吧,請問老師權重數量的堆疊,好意思嗎。

分類是乙個二進位制,也就是onehot。這沒問題,問題就是你都會使用多組了為啥還是老樣子呢,為什麼不多乙個維度呢,

我們今天提出的思想就是多組多組多個字

一句話多個字,乙個字多個進製位數,乙個進製位10個分類。

使用6組10分類就能達到10萬分類的級別,權重減少多少。

我們先也不要說這個方法是不是權重太少無法達到效果,要試試才知道

接下來我們就使用這樣的方法隨意找乙個nlp任務改造一次驗證一下。

在gittee 上找到乙個位址如下

print(len(word2ix))
可以看到分類數是8293 接下來就是我們該如何設計成 4組10分類解決這個問題。

就是直接將 batch_size4 10

假如標籤label=[8293,8293] batch_size=2 label=[[8,2,9,3],[8,2,9,3]] =[8,2,9,3,8,2,9,3]

只要標籤對改了輸出維度改好就可以了因為在網路中的和輸入的物理意義全部取決於標籤。

但是由於label多了 所以 網路輸出也要乘以4 本來是batch_size4 但是輸入 和label是乙個對4個,所以輸出設定為40尾號

大家總是覺得輸出是多少就是多少分類,決定是多少分類的是 輸出和label輸入 loss的時候

所以輸出定義為40沒有問題,只要在輸入loss的時候進行 view(batch_size4,-1)即可

在這裡就直接可以將這句話寫在網路的最後

output=output.view(seq_len * batch_size4,-1)

即可在model中使用將

self.linear = nn.linear(self.hidden_dim,vocab_size)
改為

self.linear = nn.linear(self.hidden_dim, 40)
將這句話注釋掉

# if config.model_path:

# model.load_state_dict(t.load(config.model_path,map_location='cpu'))

接著就是將label 進行 變形了

abcd %100 =cd abcd %1000 =bcd

abcd //100=ab abcd //10 =abc

abcd %1000 =bcd //100=b

abcd //10 =abc%10=c

abcd %10 =d

abcd //1000 =a

這樣就得到了四個值直接將他們cat 即可

但是要這樣

例如

t.cat((t.tensor([[1],[2],[3]]),t.tensor([[4],[5],[6]])),1).view(-1)
這樣變化型別

t.inttensor(t.cat((t.tensor([[1],[2],[3]]),t.tensor([[4],[5],[6]])),1).view(-1).numpy())
a = target.view(-1, 1) // 1000

b = target.view(-1, 1) % 1000//100

c = target.view(-1, 1) // 10 % 10

d = target.view(-1, 1) % 10

target = t.inttensor(t.cat((a, b, c, d), 1).view(-1).numpy())

loss = criterion(output,target.view(-1).long())

效果不是很好 猜想 因為 原來的fc引數是 8000512 =4000000 引數 而 51240 =20000引數

所以使用四流網路的500萬引數**上面的fc層。

測試效果還是一樣不是很好 所以咱們猜的原因不對

咱們使用200分類這個方案

a=x//100

b=x%100

a = target.view(-1, 1) // 100

b = target.view(-1, 1) % 100

target = t.inttensor(t.cat((a, b), 1).view(-1).numpy())

loss = criterion(output,target.view(-1).long())

最後batch_size=32訓練100輪

測試結果如下

1

請輸入您想要的詩歌首句,可以是五言或七言

你生成的詩句如下:你並邙山鷾,不菏銘叿寧。娼峴別勤弼,扛萁翠文銖。膽版事塵縊,那生艇樹闍。在青仙酆影,裡管漂拂錙。絺者好高悋,鸘移僧不姿。東嫉九賞少,春濤櫜中陝。心思徐劬襫,蹜暍滴齯一和范。須知責徑睨不催,與噲人識不可睺。後撏翿浪向馬濙,偓方過舊獓輕扛。柬無鎦入化發蹉廓,不鍤無寧鐘春瘢。跡清一到處,後幌頰一醒。

上面網路的結尾使用20對映200

接下來我們使用297對映200試試

結果如下

生成的詩句如下:你數依浴去,颷藺海跱鉛。苗殳春風抵,紓楣巿暮川。家喈師潬爚,身家齢翠擅。悱甖甄山晦,道忉鹿情湊。出臠蹬壻擊,笙冺字郜王。垂砢楊蛟綘,歸雲屹生閾。裘浪箙蜀雲,生哉茲漦蘂。蓮惣臨雛踈,思擂牸宮樹。入衖姜嶸裀,尋牌出瘧凟。礬隕山篔色,天清悝栳得。太昭天地心,羃如賕膳珙。波徧粕柘酒,清淚榜歌齏。愴謗天地舟,一徑皚草壞。波濤三月楫,飡犍是別客。
而直接liner 200 這樣

生成的詩句如下:你玞人陷趺砣痰,秳鳩迦決僕微顴。今噩湲殄不餗滂,段踔不匪裾髖楹。驛梫墼屧髧風裡,夜亁一曲思人恐。繹餔千色傳腫滓,鋒鍱嗽諵何由」。夜沆筦嶺下弼蹇,門殷啻何貳逬痊。鵂楊魑魅四獰囪,復喌屹下誓無奩。重良無事身帖謏,一派玷玉橄皆寸。出入聲聲道僧迎,眺綢海虯三百珠。桔樹如榷如騧紇,蠡高無呼空處無。
可以看出上的資料後面的比前面的語句通順了,所以說我們的方法是可行的但是還是比不上8000分類

拼接法不成咱們試試乘法,也就是說class**2=class_num

直接liner 400

如下

生成的詩句如下:你今不可言,我月生蹄。誥成不出時,方得無震下。堇縋葉徒羔,奼時椇邊儀。恝不岫覓襞,圓亦磳遄拌。以君碯盱幰,寒鸀不知休。君子採鱉恝,門誥有所稻。熊人閏瀏拂,倍倚土德榴。鸀愔不在籐,能儆崿蒪旋。姆洛有寒餅,一筁無一戳。巖舷鋃夭掎,蚓月空幸徹。飢力夜無妻,傾翁唅褥惠
所以程度還是不如8000分類。

生成的詩句如下:你心不蝗戚,婗閻瑩悲吟。雲中儀若功昔無,一檣摩還編葷少。蛭年二十怔騎欵,呱饍於人踜天下。念我臺轘施綺鏟,紀風鼎倚胾空簨。膦摴翅遊十二翍,將軍公子瓜星躔。前人遠嵒埽頭釋,儱君不陜千萬浮。塘風緍第佶門殿,大道於來疇朔生。一直簠塵嚘餙郫,明時陲幃蹭冊刜。坡上多磾續,餒鉟西西茱物。仙籯月輸始黎千,嘵老陜哀忘畏碯。我來蘙觴舞亦悲,鷤哀硎肅無今漱。
且 到此明白乙個道理 無論是輸出還是怎麼訓練乙個網路的乙個模型 只對應一種對映規則

也就是 一一對映 的關係。但是整個訓練過程才是所有的對映關係。

也就是說如果只是這樣的訓練神經網路乙個得到乙個最優解那麼就無法體現智慧型,只是乙個對映函式,而訓練的過程就是智慧型的體現。故而乙個網路要如何的將所有的模型儲存起來最為關鍵。

其實不是網路壓縮,而是多個模型如何壓縮的問題。也就是如何的儲存多個訓練時候的權重。

比如說 儲存60輪的模型。如何壓縮為乙個模型的儲存量。

所謂文無第一

還有就是作為智慧型,並不是一一對映的函式。所以要有乙個隨著環境變化能調整模型的能力,也是不斷的調整的過程(訓練過程從來沒有停止才是智慧型。)實時網路才是智慧型的關鍵,但是實時不能全部實時,那樣過去的知識就會倍覆蓋掉。故而要有固化或者,特定條件才會被改變的部分。且大部分都是如此,就和進製原理類似。

1,壓縮多模型設計

2,要有條件啟用區域網路的能力

3,要有實時能力

寫詩機做的詩

網易推出個寫詩機http club.culture.163.com midfall 做了 兩首如下,特別是第2首的最後幾句,還真有點流行的韻味 了,嘿嘿 其一 月亮公升起 有雕歸巢的聲音 有魚兒躍出碧光 有紫藤聲演繹古老傳說 好多不知誰的眼睛 落於吊蘭上 眨眨地 透出智慧型和孤傲 夜裡 卻拋給月亮 ...

寫詩機做的詩

網易推出個寫詩機 做了 兩首如下,特別是第2首的最後幾句,還真有點流行的韻味 了,嘿嘿 其一 月亮公升起 有雕歸巢的聲音 有魚兒躍出碧光 有紫藤聲演繹古老傳說 好多不知誰的眼睛 落於吊蘭上 眨眨地 透出智慧型和孤傲 夜裡 卻拋給月亮 無限柔情 也是那晚 貼在窗上的那些 yy剪出的窗花 被冰凌花裹著 ...

今天是寫詩的日子

今天是寫詩的日子 代騰飛 2006年12月31日 於成都 這2006年最後的一天 這新舊年輪交替的一天 這一天,總是那麼的特別,總是那麼的神秘,總是那麼的讓人感懷 注定了是讓我感懷萬千 心緒不寧的一天 注定了今天我不得不放下工作專注寫詩 寫下這了令人難以忘懷的時刻 今天是我寫詩的日子 因為今天不僅是...