En çok hangi dersten nefret ediyorsunuz? En nefret ettiğiniz kursları kurtarmak için AI kullanmayı hiç düşündünüz mü? Örneğin, sizin için bir makale mi yazıyorsunuz? Bu makaleyi okuduktan sonra, bu beceride ustalaşabilirsiniz.
RNNSinir ağlarının çözmeye çalıştığı bir sorun, sıralı veriler ve zamansal verilerdir. Geleneksel sinir ağlarının sabit giriş ve çıkış boyutlarına sahip olması gerekir.
Bir merdivenden düşen biriyle ilgili bir video izlediğiniz gibi, videoda ne olduğunu sınıflandırmak için bir sinir ağı eğitmek istiyorsunuz. Sıradan bir sinir ağı, o kişinin videonun ilk karesinde durduğunu söyleyebilir. Daha sonra videonun son karesine ulaşana kadar aralarındaki kareleri görebilir ve düşen kişiyi görebilir. Ancak bir kez oraya vardığında, insanlar bu kişinin ilk sırada olup olmadığını unutacaklar.
Tekrarlayan sinir ağı, çalışma prensibi nedeniyle bu tür sorunların çözülmesine yardımcı olur. Yüksek düzeyde, RNN'ler birbirleri arasında dönerek çalışır. Sinir ağı ileri geçişi gerçekleştirir ve daha sonra ikinci ileri geçişte, ikinci tahmin için daha fazla bağlam elde etmek için birinci yinelemeden bazı bilgiler alır.
Bilginin yinelemeler arasında aktarıldığı "katlanmamış" RNN grafiğini gösterin.Baştan itibaren bilgiler temelde ağ üzerinden iletilebilir. Artık ağımız, birinin gerçekten merdivenlere düşüp düşmediğini anlayabilir!
RNN TürleriRNN'ler harikadır çünkü sabit girdi veya çıktı gerektirmezler, girdileri kabul edebilir ve sıralı çıktılar üretebilirler.
1. Bire bir: Bu temelde normal bir sinir ağıdır. Sabit girdi kullanır ve sabit çıktı sağlar.
2. Birden çoğa: Bu tür bir RNN, bir girdi alır ve birden çok çıktı sağlar. Yapabileceğiniz şey, başka bir çıktı oluşturmak için ilk çıktıyı sinir ağına geri beslemek, sonucu sinir ağına geri beslemek, vb. Buna sinir ağından örnekleme denir ve bunu yaparak tamamen yeni diziler oluşturabilirsiniz.
3. Çoktan bire: RNN birden çok girdi alır ve tek bir çıktı sağlar. Bu, sinir ağına bir metin parçası sağlayabileceğiniz ve duyarlılığını veya hissiyatını tahmin edebileceğiniz duyarlılık analizi gibi uygulamalarda kullanılır. Çıktı dizisi bir cümledeki kelimeler olabilir ve çıktı bir sinir ağının duygu tahmini olabilir.
4. Çoktan çoğa: Bu tür RNN, birden çok girdi dizisini alır ve birden çok çıktı üretir. Aslında iki tür çoktan çoğa RNN vardır. İki sekans aynı uzunluğa sahip olmadığında, birinci tip kullanılır. Makine çevirisi gibi uygulamalar için, giriş İngilizce veya başka bir dilde cümleler olabilir ve çıktı, Fransızca veya diğer dillerdeki cümleler olabilir. Bu durumda, giriş ve çıkış kelime sayıları farklı olabilir ve bu tür çoktan çoğa ağı kullanışlı hale getirir. İkinci tür, giriş ve çıkış senkronize edildiğinde kullanılır. Videonun her karesini işaretlersek, bir kare girebilir, bir etiket çıkarabilir ve ardından videonun geri kalanına göz atmaya devam edebiliriz.
RNN sorunuŞimdiye kadar, RNN mükemmel görünüyor, değil mi? Veri dizilerini geleneksel ağlardan daha iyi bir şekilde işlemek için bu yeni ağ türünü kullanıyoruz. Ancak RNN'nin bir problemi, yok olma / patlayan gradyan problemidir.
Kaybolan gradyan görüntü sonucuModeli güncellemek ve kaybın gradyanını hesaplamak için geri yayılımı kullandığınızda (model ne kadar yanlıştır), gradyan küçülür ve küçülür ve mesafe ağda ne kadar uzaklaşır. Bu, temel olarak, ağda ne kadar çok katman olursa, eğitim verimliliğinin o kadar düşük olduğu anlamına gelir. Patlama gradyanı temelde tersidir.Eğer gradyan çok büyükse, çığ gibi geri yayılır ve RNN birçok sekans ve yinelemeden geçtiğinden, gradyanların kaybolması / patlaması sorunu vardır.
Uzun kısa süreli hafıza
Bu soruna bir çözüm, LSTM, uzun ve kısa süreli bellek hücrelerini kullanmaktır. RNN'nin kaybolan gradyan problemini çözmesine ve tahminleri daha doğru hale getirmesine yardımcı olabilecek bir dizi matematiksel formül içerir. LSTM'yi kullanırken lütfen dört parça bilgiyi göz önünde bulundurun: uzun süreli bellek, kısa süreli bellek, olaylar ve çıktı. LSTM birimi, olaylara dayalı çıktı sağlar ve tahminlerde bulunurken uzun süreli belleği ve kısa süreli belleği dikkate alır.
Şekilde, LSTM hücresindeki bilgilerin nasıl güncelleneceğine dair bir örnek gösterilmektedir.
Kavramsal olarak, LSTM dört kapı içerir: unutma kapısı, öğrenme kapısı, hafıza kapısı ve kullanım kapısı. Uzun süreli hafıza, unutmanın, gereksiz bilgilerin unutulmasının, kısa süreli hafızanın ve olaylar öğrenmenin kapısına girerek, faydalı bilgileri saklamanın kapısına geçer. LTM, STM ve olaylar bellek geçidine eklenir ve daha sonra güncellenmiş LTM'de depolanır ve üç bilgi parçası da tahminin (STM) gerçekleştirildiği kullanım geçidine aktarılır.LSTM hücresindeki kapının yapısını ve düzenlemesini gösteren bir şema
Tabii ki, bu süper basitleştirilmiştir. Ancak asıl sorun, LSTM'nin RNN kullanılırken çok yararlı olmasıdır. Kağıt yazmak için RNN kullanınArtık RNN'lerin nasıl çalıştığına dair temel bir anlayışa sahip olduğumuza göre, asıl soruya geri dönelim: Sevmediğiniz ev ödevlerinden nasıl çıkılır?
Bu hedefe birden çoğa RNN kullanarak ulaşabiliriz. Daha önce hiç görülmemiş yeni kağıtlar oluşturmak için bir dizi farklı makale ve model üzerinde örnek üzerinde bir sinir ağını eğitebilirsiniz!
Derin öğrenme modelleri geliştirmek için üst düzey bir API olan Keras'ı kullanalım. Bu, LSTM kullanarak metin oluşturmak için Keras Github deposundaki örnek kodu izler.
Önce gerekli tüm kitaplıkları ve modülleri içe aktaracağız.
keras.callbacks'den importLambdaCallback keras.models'ten importSequential keras.layers'dan Yoğun ithal keras.layers'dan LSTM'yi içe aktar keras.optimizers'dan importAdam keras.utils.data_utilsimport get_file adresinden numpy'yi np olarak içe aktar rastgele içe aktar ithalat sys io içe aktarHerhangi bir metin kullanılabilir. Örnek olması için Nietzsche'nin çalışmasını kullanacağız. Metin dosyasını içe aktarın, biraz ön işlem yapın ve değerleri vektörleştirin.
yol = get_file ( 'nietzsche.txt', origin = 'https: //s3.amazonaws.com/text-datasets/nietzsche.txt') io.open (yol, kodlama = 'utf-8') ile f: text = f.read (). lower () print ('derlem uzunluğu:', len (metin)) karakter = sıralı (liste (küme (metin))) print ('toplam karakter:', len (karakter)) char_indices = dict ((c, i) fori, numaralandırmada c (karakter)) indices_char = dikte ((i, c) fori, c numaralandırmada (karakter)) # Metni, maksimum karakterlerin yarı fazlalık dizilerinde kesin maxlen = 40 step = 3 cümleler = next_chars = aralıktaki i için (0, len (metin) -maxlen, adım): cümleler.append (metin) next_chars.append (metin ) baskı ('nb dizileri:', len (cümleler)) print ('Vektörleştirme ...') x = np.zeros ((uzunluk (cümleler), maksimum, uzunluk (karakter)), dtype = np.bool) y = np.zeros ((len (cümleler), len (karakterler)), dtype = np.bool) i için cümle inenumerate (cümleler): için t, numaralandırmada karakter (cümle): x = 1 y = 1Şimdi modeli gerçekten manipüle etme zamanı. Tek bir LSTM'den oluşur ve Adam optimize ediciyi kullanır.
model = Sıralı () model.add (LSTM (128, input_shape = (maksimum, uzunluk (karakter)))) model.add (Yoğun (len (karakter), aktivasyon = 'softmax')) optimize edici = Adam (lr = 0.01) model.compile (loss = 'categorical_crossentropy', optimizer = optimizer)Şimdi iki işlev tanımlayın, örnek: olasılık dizisinden indeksi örneklemek için yardımcı bir işlev ve her örneğin sonunda (on_epoch_end): bu, her dönemin sonunda çağrılan ve yazdırılan bir işlevdir Model tarafından oluşturulan metin.
def örnek (ön, sıcaklık = 1.0): preds = np.asarray (preds) .astype ('float64') preds = np.log (preds) / sıcaklık exp_preds = np.exp (önceden) preds = exp_preds / np.sum (exp_preds) probas = np.random.multinomial (1, preds, 1) dönüş np.argmax (probas) def on_epoch_end (epoch, _): Yazdır() print ('----- Dönemden sonra metin üretiliyor:% d'% epoch) start_index = random.randint (0, len (metin) -maxlen-1) çeşitlilik için: print ('----- çeşitlilik:', çeşitlilik) oluşturuldu = '' cümle = metin oluşturulan + = cümle print ('----- Çekirdek ile üretiliyor: "' + cümle + '"') sys.stdout.write (oluşturuldu) aralıktaki i için (400): x_pred = np.zeros ((1, maksimum, uzunluk (karakter))) için t, numaralandırmada karakter (cümle): x_pred = 1. preds = model.predict (x_pred, verbose = 0) next_index = örnek (tahminler, çeşitlilik) next_char = indices_char oluşturulan + = next_char cümle = cümle + next_char sys.stdout.write (next_char) sys.stdout.flush () Yazdır()Neredeyse bitti! Son olarak, metin çıktısını göreceğimiz ve modeli verilere sığdıracağımız bir geri çağrı işlevi yazacağız.
print_callback = LambdaCallback (on_epoch_end = on_epoch_end) model.fit (x, y, batch_size = 128, epochs = 60, geri aramalar =)Bu kadar. Tüm bunları bir bilgisayarda eğitmek yaklaşık üç saat sürdü ve modeli Google Colab'da eğitmek için GPU çalışma zamanını da kullanabilirsiniz. Teorik olarak, oluşturulan metin yaklaşık 30 dönem sonra tutarlı olmaya başlamalıdır, bu yüzden modelin çıktısına bakalım.
"Sabır ilk olarak geliştirilir - bizim anlayışımız, sürecin dünyasının hürmete aynı biçimde olduğu ve sentezin ustası ve onu duyuların aynı temposu ve tüm ehlileştirme ve zıtlıktan özgür olmanın dışında olduğu gibi. varolmasa da, yerin ahlakı ve arzusu, tempopun tüm insanı için "ruhu iyiliğe uyandırır, her zaman onun duruşuna sahiptir, süper tehlikeye sahiptir." "Nefret duygularını bile dikkate alabilir veya davranabilir ve bir örneği ruhta dinin durumuna giren kişi olabilir, temsil eder ve buna göre yukarıdaki tüm dinlerin duyguları ve halkın mücadelesi olabilir. iyi bir entiblenti varlığını hissediyor ve hepsi kendi konusunun sözlerinin davranışlarına katlanabiliyor ve dine bağımlı olanların duyguları olarak onun duygusunu yüceltti "Hmm ... girdi sonucu pek iyi görünmüyor. Ama bunların hepsi sinir ağları tarafından üretiliyor, harika değil mi? Hiç şüphe yok ki, daha iyi mimari ve daha geniş verilerle, insanların yazdıklarıyla karşılaştırılabilecek sonuçlar elde edebilirsiniz.
Anahtar sonuçDoğal dil işleme artık harika atılımlar yapıyor ve metin oluşturma aslında çok ilginç. Aşağıdaki kilit noktaları hatırlamalısınız:
1. Tekrarlayan sinir ağları ile geleneksel sinir ağları arasındaki fark, daha iyi tahminler için önceki yinelemelerden gelen verileri saklayabilmeleridir.
2. Her biri belirli görevler için uygun olan bire bir, bire çok, çoka bir ve çoktan çoğa dahil olmak üzere birçok farklı RNN türü vardır.
3. Uzun kısa süreli bellek (LSTM) kapıları, RNN'lerdeki kaybolan gradyan problemini çözmek için kullanılır ve ayrıca sinir ağlarındaki uzun vadeli bilgileri bağlamak için kullanılır.