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'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.
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. . .
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.
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.
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. . .
https://www.zhihu.com/question/29411132
https://gist.github.com/karpathy/d4dee566867f8291f086
https://deeplearning4j.org/lstm.html Lei Feng Ağı Lei Feng Ağı