LSTM'yi Jin Yong ve eski ejderhaların isimleriyle eğitin, hangi harika isimler üretilecek?

Lei Feng Net Not: Bu makale, yazarın yetkilendirdiği Magicly blogundan yeniden üretilmiştir. Orijinal metni okumak için lütfen şu adrese bakın:

Sihirle: Daha önce RNN hakkında bir makale çevirmiştim, ancak yazarın LSTM'yi tanıtan yeni bir blog yazdığını görmedim, bu yüzden öğrenmek için başka materyaller aradım. Bu makale önce LSTM'yi tanıtıyor ve ardından yeni dövüş sanatları isimleri oluşturmak için Jin Yong ve Gu Long adlarını eğitmek için LSTM'yi kullanıyor. İlgileniyorsanız, çocuklar için daha fazla isim de toplayabilirsiniz, haha, justforfun, herkes iyi eğlenceler ...

RNN incelemesi

RNN'nin ortaya çıkışı, durum belleği problemini çözmektir Çözüm çok basittir.Her zaman noktasındaki h (t) artık sadece verilere bağlı değildir, aynı zamanda önceki zaman düğümünün t-1 gizli durumuna da bağlıdır. (t-1). Bunun yinelemeli bir tanım olduğu görülebilir (bu nedenle yinelemeli sinir ağına Özyinelemeli Sinir Ağı da denir), h (t-1) h (t-2) 'ye bağlıdır, h (t-2) h ( t-3) ... Yani h (t) önceki her zaman noktasındaki girdiye bağlıdır, yani h (t) önceki tüm girdileri hatırlar.

Yukarıdaki rakam zamanla genişletilirse, RNN'nin aslında zaman içinde sıradan bir sinir ağları yığını olduğu görülebilir.

RNN sorunu: Uzun Vadeli Bağımlılıklar

Her şey mükemmel görünüyor, ancak h (t) h (t-1000) 'e bağlıysa, bağımlılık yolu özellikle uzundur, bu da gradyan hesaplanırken gradyanın kaybolmasına neden olur ve eğitim süresi pratik olamayacak kadar uzun olur. İşte çok uzun bir bağımlılık yolu örneği:

1 Memleketimden [Chengdu]. . . [500 kelime burada atlanmıştır]. . . Genellikle orada güveç yeriz. . .

LSTM

Uzun Kısa Süreli Bellek sinir ağı veya LSTM, 1997'de Hochreiter ve Schmidhuber tarafından yayınlandı. Görünüşü, Uzun Vadeli Bağımlılıklar sorununu çözmektir ve birçok geliştirilmiş sürüm ortaya çıkmıştır ve şu anda birçok alanda kullanılmaktadır (makine çevirisi, diyalog robotları, konuşma tanıma, Resim Başlığı, vb. Dahil).

Standart RNN'de tekrarlanan modül, aşağıdaki şekilde gösterildiği gibi çok basit bir yapıdır:

LSTM de benzer bir bağlantılı liste yapısıdır, ancak iç yapısı çok daha karmaşıktır:

Yukarıdaki şekildeki simgelerin anlamları aşağıdaki gibidir:

LSTM'nin temel fikri hücre durumu (gizli duruma benzer, GRU gibi hücre durumu ile gizli durumu birleştiren LSTM varyantları vardır) ve üç tür kapıdır: giriş kapısı, unutma kapısı ve çıkış kapısı.

Hücre durumu her seferinde bir sonraki zaman noktasına girdi olarak geçirilir ve bazı doğrusal değişikliklerden sonra, bir sonraki zaman noktasına geçmeye devam eder (orijinal makaleyi henüz okumadım, gizli durumdan sonra hücre durumuna neden ihtiyaç duyulduğunu bilmiyorum. Gerçekten ikisini birleştiren geliştirilmiş bir sürüm var, bu yüzden şimdilik buna girmeyeceğim).

Kapı kavramı devre tasarımından gelir (henüz öğrenmedim, bu yüzden gösteriş yapmaya cesaret edemiyorum). LSTM'de kapı, kapıdan geçtikten sonra ne kadar bilgi kalabileceğini kontrol eder. Aşağıdaki şekilde gösterildiği gibi, sigmoid katmanının çıkış değeri, kapıdan ne kadar veri geçebileceğini belirler, 0, hiç kimsenin geçemeyeceği ve 1, tümünün geçeceği anlamına gelir.

Her "kapının" ne yaptığına bir göz atalım.

Her şeyden önce, önceki hücre durumunun ne kadar muhafaza edilmesi gerektiğine karar vermeliyiz. H (t-1) ve x (t) 'ye dayalı bir sayı hesaplar ve ne kadar hücre durumunun korunduğunu belirler. 0, tümünü atmak anlamına gelir ve 1, tümünü koru anlamına gelir. Neden onu atmak istiyorsun, ne kadar çok tutarsan o kadar iyi değil mi? LSTM'nin içinde Xiao Ming ve Xiao Hong ile bir makale oluşturduğunu, Xiao Ming'in televizyon izlediğini ve Xiao Hong'un mutfakta yemek pişirdiğini varsayalım. Mevcut konu Xiaoming ise, tamam, o zaman LSTM, uzaktan kumandayı aramak, kanalı değiştirmek, konu Xiaohong'a geçtiyse, TV izleme ile ilgili çıktı almalıdır, o zaman TV'yi ve çıkışı geçici olarak unutmak en iyisidir Sebzeleri, soya sosunu, pilav pişiriciyi vb. Yıkayın.

İkinci adım, girdinin hücre durumunu ne kadar etkileyeceğine karar vermektir. Bu yer iki bölümden oluşur; biri sigmoid işlevini ne kadar veri kaldığını hesaplamak için kullanır ve diğeri aday C (t) hesaplamak için tanh işlevini kullanır. Burası, konuyu Xiaoming'den Xiaohong'a değiştirmek gibi ve TV mutfağa geçmeli.

Sonra, t zamanında hücre durumunu elde etmek için kalan hücre durumunu (t-1 zamanında) yeni eklenen hücre durumuyla birleştiririz.

Son olarak, hücre durumunu tanh aracılığıyla sıkıştırırız ve sonra onu çıkış kapısına göndeririz (ne kadar çıkacağını belirlemek için).

LSTM'nin de birçok çeşidi vardır, ilgilenenler burada görebilir. Ek olarak, LSTM yalnızca RNN'nin uzun vadeli bağımlılıklarını çözmek içindir ve bazı insanlar bunu başka bir açıdan çözmüştür, örneğin Koutnik ve diğerlerinin (2014) Clockwork RNN'leri gibi.

bana kodu göster!

Andrej Karpathy'nin kodunu bazı küçük değişikliklerle kullandım. Bu kodun avantajı, herhangi bir derin öğrenme çerçevesine bağlı olmaması ve numpy ile hemen çalıştırılabilmesidir!

  • "" "

  • Minimal karakter düzeyinde Vanilya RNN modeli. Yazan: Andrej Karpathy (@karpathy)

  • BSD Lisansı

  • "" "

  • numpy'yi np olarak içe aktar

  • # veri G / Ç

  • data = open ('input.txt', 'r'). okuma # basit düz metin dosyası olmalıdır

  • all_names = set (data.split ("\ n"))

  • karakter = liste (set (veri))

  • data_size, vocab_size = len (veri), len (karakter)

  • print ('veride% d karakter var,% d benzersiz.'% (veri_boyutu, sözcük_boyutu))

  • char_to_ix = {ch: i için i, numaralandırmada ch (karakter)}

  • ix_to_char = {i: i için ch, numaralandırmada ch (karakter)}

  • # print (char_to_ix, ix_to_char)

  • # hiperparametreler

  • hidden_size = 100 # boyutta gizli nöron tabakası

  • seq_length = 25 # için RNN kaydını silmeye yönelik adım sayısı

  • learning_rate = 1e-1

  • # model parametreleri

  • Wxh = np.random.randn (gizli_boyutu, sözcük_boyutu) * 0.01 # giriş gizli

  • Whh = np.random.randn (hidden_size, hidden_size) * 0.01 # gizli için gizli

  • Neden = np.random.randn (vocab_size, hidden_size) * 0.01 # çıktı için gizli

  • bh = np.zeros ((gizli_boyutu, 1)) # gizli sapma

  • by = np.zeros ((kelime_boyutu, 1)) # çıktı sapması

  • def lossFun (girdiler, hedefler, hprev):

  • "" "

  • girdiler, hedeflerin her ikisi de tam sayıların listesidir.

  • hprev, ilk gizli durumun Hx1 dizisidir

  • kaybı, model parametrelerindeki gradyanları ve son gizli durumu döndürür

  • "" "

  • xs, hs, ys, ps = {}, {}, {}, {}

  • hs = np.copy (hprev)

  • kayıp = 0

  • # doğrudan geçiş

  • aralıktaki t için (len (girişler)):

  • xs = np.zeros ((kelime_boyutu, 1)) # 1-of-k gösteriminde kodlayın

  • xs = 1

  • hs = np.tanh (np.dot (Wxh, xs) + np.dot (Whh,

  • hs) + bh) # gizli durum

  • # sonraki karakterler için normalize edilmemiş günlük olasılıkları

  • ys = np.dot (Neden, hs) + tarafından

  • # sonraki karakter için olasılık

  • ps = np.exp (ys) / np.sum (np.exp (ys))

  • kayıp + = -np.log (ps) # softmax (çapraz entropi kaybı)

  • # geriye doğru geçiş: degradeleri geriye doğru hesaplayın

  • dWxh, dWhh, dWhy = np.zeros_like (

  • Wxh), np.zeros_like (Whh), np.zeros_like (Neden)

  • dbh, dby = np.zeros_like (bh), np.zeros_like (by)

  • dhnext = np.zeros_like (hs)

  • ters çevrilmiş t için (aralık (uzunluk (girişler))):

  • dy = np.copy (ps)

  • # y'ye geri dönüş. bkz.

  • # kafanız karışırsa

  • # buraya

  • dy - = 1

  • dNeden + = np.dot (dy, hs.T)

  • dby + = dy

  • dh = np.dot (Neden.T, dy) + dhnext # h'ye geri dön

  • dhraw = (1-hs * hs) * dh # doğrusal olmayan tanh aracılığıyla geri dönüş

  • dbh + = dhraw

  • dWxh + = np.dot (dhraw, xs.T)

  • dWhh + = np.dot (dhraw, hs.T)

  • dhnext = np.dot (Whh.T, dhraw)

  • dparam için:

  • # patlayan degradeleri azaltmak için klip

  • np.clip (dparam, -5, 5, çıkış = dparam)

  • dönüş kaybı, dWxh, dWhh, dWhy, dbh, dby, hs

  • def örnek (h, seed_ix, n):

  • "" "

  • modelden bir tamsayı dizisi örnekleyin

  • h bellek durumu, seed_ix ilk adım için başlangıç harfidir

  • "" "

  • x = np.zeros ((kelime_boyutu, 1))

  • x = 1

  • ixes =

  • aralıktaki t için (n):

  • h = np.tanh (np.dot (Wxh, x) + np.dot (Whh, h) + bh)

  • y = np.dot (Neden, h) + tarafından

  • p = np.exp (y) / np.sum (np.exp (y))

  • ix = np.random.choice (aralık (kelime_boyutu), p = p.ravel)

  • x = np.zeros ((kelime_boyutu, 1))

  • x = 1

  • ixes.append (ix)

  • ix'leri iade et

  • n, p = 0, 0

  • mWxh, mWhh, mWhy = np.zeros_like (Wxh), np.zeros_like (Whh), np.zeros_like (Neden)

  • mbh, mby = np.zeros_like (bh), np.zeros_like (by) # Adagrad için bellek değişkenleri

  • smooth_loss = -np.log (1.0 / vocab_size) * seq_length # yinelemede kayıp 0

  • True iken:

  • # girdileri hazırla (seq_length adımlarında soldan sağa süpürüyoruz

  • # uzun)

  • p + seq_length + 1 ise > = len (veri) veya n == 0:

  • hprev = np.zeros ((gizli_boyutu, 1)) # RNN belleğini sıfırla

  • p = 0 # verinin başından git

  • inputs =

  • hedefler =

  • # modelden ara sıra örnek

  • n% 100 == 0 ise:

  • sample_ix = örnek (hprev, inputs, 200)

  • txt = ''. birleştir (sample_ix'te ix için ix_to_char)

  • baskı ('---- \ n% s \ n ----'% (txt,))

  • # seq_length karakterleri ağ üzerinden ilerlet ve gradyan getir

  • kayıp, dWxh, dWhh, dWhy, dbh, dby, hprev = lossFun (girişler, hedefler, hprev)

  • pürüzsüz_kaybı = pürüzsüz_kaybı * 0,999 + kayıp * 0,001

  • n% 100 == 0 ise:

  • print ('iter% d, kayıp:% f'% (n, pürüzsüz_kaybı)) # yazdırma ilerlemesi

  • # Adagrad ile parametre güncellemesi gerçekleştirin

  • param, dparam, mem in zip (,

  • ,

  • ):

  • mem + = dparam * dparam

  • param + = -learning_rate * dparam / \

  • np.sqrt (mem + 1e-8) # adagrad güncelleme

  • p + = seq_length # veri işaretçisini taşı

  • n + = 1 # yineleme sayacı

  • eğer ((pürüzsüz_kaybı = 20000)):

  • sample_ix = örnek (hprev, inputs, 2000)

  • txt = ''. birleştir (sample_ix'te ix için ix_to_char)

  • tahmin_isimler = set (txt.split ("\ n"))

  • yeni_adlar = tahmin edilen_adlar-tüm_adlar

  • baskı (yeni_adlar)

  • print ('tahmin edilen adlar len:% d, yeni_adlar len:% d. \ n'% (len (öngörülen adlar), len (yeni_adlar)))

  • kırmak

  • rawmin-char-rnn.pyhosted'i byGitHub ile görüntüleyin

    Sonra internetten Jin Yong'un romanlarındaki insanların isimlerini buldum, bazı ön işlemler yaptım, input.txt'deki her satır için bir isim kaydettim ve sadece kodu çalıştırdım. Gu Long's kapsamlı bir isim bulamadı, sadece bu dövüş sanatları sıralama listesi, sadece 100'den fazla kişi var.

    Aşağıdakiler, iki listeye dayalı eğitimin sonucudur: Aynı isimler (Duan Yu gibi) kaldırılmıştır, bu nedenle aşağıdakilerin tümü LSTM "yeni icat ve icat" isimleridir. Gelin millet, tahmin edin hangisi Jin Yong'un ve hangisi Gulong'un?

    {"Jiang Zengtie", "Yuan Nanlan", "Shi Wanfeng", "Guo Wan'an", "Cai Ailesi", "Cheng Bozhi", "Wang Tiezhi", "Chen Yi", "Xue Tie", "Hachi Caishi" , 'Yin Feihong', 'Zhong Xiaoyan', 'Feng Yidao', 'Baolan', 'Qi Feihong', 'Wu Ruo Zhi', 'Wang Laoying', 'Zhong', 'Zhong Baisheng', 'Usta', 'Li Yuanzhen ',' Cao Lan ',' Zhao Yidao ',' Zhong Lingsi ',' Zongjiamei ',' Cui Shusheng ',' Sang Feixi ',' Shangguan Gongxi Hung ',' Liu Zhiyuren Tong Huaidao ',' Zhou Yunhe ', 'Tian', 'Feng', 'Xiling Su', 'Büyük Bilgelik Kaplan Ustası', 'Ruan Tuzhong', 'Wang Zhaoneng', 'Yuan Zhengyi Shang Baohe', 'Chang Bofeng', 'Miao Halk Üniversitesi', 'Ni Bufeng', 'Cai Tie', 'Wu Bozhi', 'Feng Yibi', 'Cao Que', 'Huang Bin', 'Zeng Tiewen', 'Ji Hufeng', 'Li Hebao', 'Shangguan Tie', 'Tong Lingtong', 'Gu Ruozhi', 'Muguan Jingyue', 'Cui Baizhen', 'Chen Guan', 'Chen Zhong', 'Ni Tiaofeng', 'Mei Yuandao', 'Xu Shuangying', ' Ren Tongdu ',' Shangguan Tie Chu Rong ',' Dajiantai ',' Hu Yang ',' Sheng ',' Nanren Zheng ',' Güney Diao ',' Shi Shuangzhen ',' Haitieshan ',' Yin Hezhen ',' Siyu Valisi ',' De Xiao ',' Ruo Si ',' Wu Tongtao ',' Tian Qingnong ',' Chang Chenying ',' Chang Buzhi ',' Ni Butao ',' Ouyang ',' Da Amiral ',' Hu Yutang ',' Chen Baohe ',' Nanrentong Sijiang Hehou '}

    {"Üçü Davet Et", "Panda Açık", "Kartal Yıldızı", "Lu Kai", "Çiçek", "Xue Yu Luoping", "Nangong Ustası", "Nangong Jiu", "Bayan Sun", "Jing Dong Mie ',' Tie BuChou ',' Pei Du ',' Wei Jian ',' İnsan ',' Lu Xiaolong King Mor Diş Yok ',' Lian Qianli ',' Bay Zhong ',' Yu Bai ',' Fang Da ' , 'Ye Lei Yi Hun', 'Dugu Shanghong', 'Ye Lianhua', 'Lei Dagui', 'Shu Fei', 'White Double Hair', 'Yu Yilang', 'East Building', 'Tie Zhong Eleven Dianhong ',' Fengxingzhen ',' Wuwei Liu Laofengsan ',' Xiao Maoer ',' Dongguo Xianfeng ',' Sun Sun ',' Bay Di ',' Meng Zhaixing ',' Jiang Xiao 'Xiaofeng', 'Hua Shuanglou', 'Li Pei', 'Qiu Jue', 'Beyaz Badsha', 'Yan'ın Üzüntüsü', 'Ji Beiyan', 'Dongguo Da', 'Xie Xiaolufeng', 'Biyu Bo', 'Si Shisan', 'Lu Lang', 'Zhao Buyan', 'Jing Gulan', 'Lian Yan Nantian', 'Xiao Lianjing', 'Long Buyan', 'Dong Guo Yu', 'Si Dong Guo Jin Tian ',' Xue Xiaotian ',' Xiong Baoyu ',' Wu Mojing ',' Liu Luoli ',' Dongguan Xiaoyu ',' Yavaş yavaş Uçan ',' Kara Balıkları ',' Bir Chuan Kralı ',' Yüksek Gururlu ' , 'Xiao Shisan', 'Dragon Boy', 'Yuluo Zhao', 'Xie Lang Tang Ao', 'Tie Ye Di', 'Jiang Xiaofeng', 'Sun Yuyu Ye', 'Chou Zhongren', 'Xiao Di Sun', 'Tie Motang', 'Chai Xingfu', 'Bayan Zhan', 'Biyu', 'Lao Wuyu', 'Demir Demir Çiçek', 'Du', 'Xueyue Gongjiu', 'Lao Guo Keşiş', 'Dong Guo Dalu 'Arazide Uzun Guanfei', 'Si Zang', 'Li Qian', 'Sun Baiji', 'Nan Shuangping', 'Wang Wei', 'Ji Yuanqing', 'Dongguo Road Sun Yu', 'Bai Yuluosheng', ' Gao'er ',' Dong Juetian ',' Xiao Wangshang ',' Nine ',' Feng Sanjing ',' Hekong Picking the Stars ',' Guan Chuuxue ',' Shangguanguan Xiaofeng ',' Qiu Shangguan Jinfei ',' Uzun Xiaotian on the land ',' Sikong Star Soul ',' Invite the Clothes Man ',' Lord ',' Li Xun Huantian ',' East Love ',' Jade Fu Sui ',' Zhao Xiaofeng ',' Dong Guo Mie ',' Invite ',' Sikong Yıldızı '}

    İlgilenenler de eğitim için kadim şairlerin, şairlerin vb. İsimlerini kullanabilirler.İyi bir makineniz varsa veya vaktiniz varsa daha çok antrenman yapabilirsiniz.Ne kadar çok antrenman yaparsanız o kadar doğru olur.

    sonuç olarak

    Bellek işlevi nedeniyle, RNN, NLP, Konuşma ve Bilgisayarla Görme gibi birçok alanda büyük güç göstermiştir. Aslında, RNN, Turing'e eşdeğerdir.

    1 Vanilya sinir ağlarını eğitmek işlevler üzerinde optimizasyon ise, tekrarlayan ağları eğitmek, programlar yerine optimizasyondur.

    LSTM, esas olarak RNN'nin uzun vadeli bağımlılıklarını çözen çok yaygın olarak kullanılan ve pratik bir RNN algoritmasıdır. Ek olarak, RNN, Dikkat mekanizması gibi yeni araştırmalar üretmektedir. Daha sonra tanıtacağım. . .

    Atıfta

    https://www.zhihu.com/question/29411132

    https://gist.github.com/karpathy/d4dee566867f8291f086

    https://deeplearning4j.org/lstm.html Lei Feng Ağı Lei Feng Ağı

    Çivilenmiş mi? "Call of Duty: Black Ops 4" haberi yine sızdırıldı
    önceki
    Gece Okuma | Trendeki yolcuları yıkamak mı? Kondüktör yanıyor! DG'nin sosyal medya hesapları, Çin kültürünü destekleyen küresel netizenler tarafından "işgal ediliyor"
    Sonraki
    Huang Bo'nun bu Japonca versiyonunu biliyor musunuz?
    iyi haberler! Giriş-çıkış belgesi "Ulusal Genel İdare" burada
    Üç küçük eseri yakalayan en güçlü sözleşme karşıtı silah FlexiSpy, bilgisayar korsanları tarafından öfkelendirildi. Ne oldu?
    Milyonlarca yapı taşı bir mucize yaratarak Bugatti Chiron'un 20 km / s hıza ulaşmasını sağlıyor
    Neden bu kadar çok insan "köpek erkekleri ve kadınları" hakkında romantik bir film izlemeyi seviyor?
    "Far Cry 5", oyuncuların özgürce içerik oluşturabilecekleri yeni bir "arcade modu" nu duyurdu
    Çin likörünün ilk kampına geri dönen Jiuguijiu Chuntang, 2019 için yeni şirket stratejisi yayınladı
    Aracıların işbirliği yapmasına izin verin ve Google ekibi bir doğal dil oluşturma yöntemi önerdi | ICLR 2017
    Jack Gyllenhaal: Çoktan seçmeli sorular sorabilen ve sabır ile hırsı birleştiren bir adam
    Bluetooth 4.2'ye dayalı sensör genel arayüzünün incelenmesi ve araştırılması
    Kırmızı Bebek Sınıfı
    Bir yükseliş başlatan Wasserstein GAN, son zamanlarda herhangi bir araştırma ilerleme kaydetti mi?
    To Top