TensorFlow ile NLP — Giriş 4

Furkan Gulsen
5 min readSep 6, 2021

--

Uyarı:
Eğer TensorFlow ile NLP — Giriş 3 yazısını okumadıysanız ilk önce onu okumanızı tavsiye ediyorum.

Önceden Eğitilmiş Embedleri Kullanma (NLP için transfer öğrenimi)

Oluşturduğumuz ve eğittiğimiz önceki tüm derin öğrenme modelleri için her seferinde sıfırdan kendi yerleştirmelerimizi oluşturduk ve kullandık.

Ancak yaygın bir uygulama, aktarım öğrenimi aracılığıyla önceden eğitilmiş embedlerder yararlanmaktır. Bir sonraki modelimiz için, kendi gömme katmanımızı kullanmak yerine, onu önceden eğitilmiş bir gömme katmanıyla değiştireceğiz.

Daha spesifik olarak, TensorFlow Hub adresinden Universal Sentence Encoder kullanacağız. (universal-sentence-encoder, çeşitli görevler için çok sayıda önceden eğitilmiş model kaynağı içeren harika bir model).

🔑 Not: TensorFlow Hub’da önceden eğitilmiş birçok farklı metin gömme seçeneği vardır, ancak bazıları diğerlerinden farklı seviyelerde metin ön işleme gerektirir. Birkaçını denemek ve kullanım durumunuza en uygun olanı görmek en iyisidir.

Model 6: TensorFlow Hub Önceden Eğitilmiş Cümle Kodlayıcı

Oluşturduğumuz gömme katmanı ile Evrensel Cümle Kodlayıcı arasındaki temel fark, tahmin edebileceğiniz gibi, Evrensel Cümle Kodlayıcı’nın sözcük düzeyinde bir gömme oluşturmak yerine, tam bir cümle düzeyinde gömme oluşturmasıdır.

Gömme katmanımız ayrıca her kelime için 128 boyutlu bir vektör üretirken, Evrensel Cümle Kodlayıcı her cümle için 512 boyutlu bir vektör verir.

🔑 Not: Bir encoder, metin gibi ham verileri sayısal bir gösterime (özellik vektörü) dönüştüren bir modelin adıdır, bir decoder sayısal gösterimi istenen bir çıktıya dönüştürür .

Her zamanki gibi, bu en iyi bir örnekle gösterilir. Universal (evrensel) Cümle Kodlayıcı modelini yükleyelim ve birkaç cümle üzerinde test edelim.

tf.Tensor(
[-0.01157024 0.0248591 0.0287805 -0.01271502 0.03971543 0.08827759
0.02680986 0.05589837 -0.01068731 -0.0059729 0.00639324 -0.01819523
0.00030817 0.09105891 0.05874644 -0.03180627 0.01512476 -0.05162928
0.00991369 -0.06865346 -0.04209306 0.0267898 0.03011008 0.00321069
-0.00337969 -0.04787359 0.02266718 -0.00985924 -0.04063614 -0.01292095
-0.04666384 0.056303 -0.03949255 0.00517685 0.02495828 -0.07014439
0.02871508 0.04947682 -0.00633971 -0.08960191 0.02807117 -0.00808362
-0.01360601 0.05998649 -0.10361786 -0.05195372 0.00232955 -0.02332528
-0.03758105 0.0332773 ], shape=(50,), dtype=float32)
TensorShape([512])

Cümlelerimizi Evrensel Cümle Kodlayıcıya (USE) geçirmek, onları dizelerden 512 boyutlu vektörlere kodlar; bu bizim için hiçbir anlam ifade etmez, ancak umarım makine öğrenimi modellerimiz için bir anlam ifade eder.

Modellerden bahsetmişken, gömme katmanımız olarak USE ile bir tane oluşturalım.

hub.KerasLayer sınıfını kullanarak TensorFlow Hub USE modülünü Keras katmanına dönüştürebiliriz.

🔑 Not: TensorFlow Hub’ı KULLAN modülünün boyutu nedeniyle, indirilmesi biraz zaman alabilir. Yine de indirildikten sonra önbelleğe alınacak ve kullanıma hazır olacaktır. Ve birçok TensorFlow Hub modülünde olduğu gibi, USE’nin daha az yer kaplayan ancak performanstan biraz ödün veren bir “lite” sürümü vardır. ve daha fazla ön işleme adımı gerektirir. Ancak, mevcut işlem gücünüze bağlı olarak, uygulama kullanım durumunuz için lite sürümü daha iyi olabilir.

Güzel! Şimdi Keras katmanı olarak USE’ye sahibiz, onu Keras Sıralı modelinde kullanabiliriz.

Model: "model_6_USE"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
USE (KerasLayer) (None, 512) 256797824
_________________________________________________________________
dense_5 (Dense) (None, 64) 32832
_________________________________________________________________
dense_6 (Dense) (None, 1) 65
=================================================================
Total params: 256,830,721
Trainable params: 32,897
Non-trainable params: 256,797,824
_________________________________________________________________

USE katmanındaki parametrelerin sayısına dikkat edin, bunlar çeşitli metin kaynaklarında (Wikipedia, web haberleri, web soru-cevap forumları vb.) öğrendiği önceden eğitilmiş ağırlıklardır.

Eğitilebilir parametreler yalnızca çıktı katmanlarımızdadır, başka bir deyişle, USE ağırlıklarını donmuş halde tutuyor ve onu bir özellik çıkarıcı olarak kullanıyoruz. “hub.KerasLayer" örneğini oluştururken "trainable=True" ayarını yaparak bu ağırlıklara ince ayar yapabiliriz.

Şimdi hazır bir özellik çıkarıcı modelimiz var, hadi onu eğitelim ve create_tensorboard_callback() fonksiyonumuzu kullanarak sonuçlarını TensorBoard'a izleyelim.

Saving TensorBoard log files to: model_logs/tf_hub_sentence_encoder/20210822-071154
Epoch 1/5
215/215 [==============================] - 10s 31ms/step - loss: 0.5060 - accuracy: 0.7787 - val_loss: 0.4518 - val_accuracy: 0.8005
Epoch 2/5
215/215 [==============================] - 4s 18ms/step - loss: 0.4145 - accuracy: 0.8183 - val_loss: 0.4373 - val_accuracy: 0.8110
Epoch 3/5
215/215 [==============================] - 4s 18ms/step - loss: 0.4018 - accuracy: 0.8206 - val_loss: 0.4317 - val_accuracy: 0.8150
Epoch 4/5
215/215 [==============================] - 4s 17ms/step - loss: 0.3938 - accuracy: 0.8269 - val_loss: 0.4276 - val_accuracy: 0.8176
Epoch 5/5
215/215 [==============================] - 4s 17ms/step - loss: 0.3888 - accuracy: 0.8278 - val_loss: 0.4275 - val_accuracy: 0.8202

Diğer modellerimizde yaptığımız gibi onunla da bazı tahminler yapalım ve onları değerlendirelim.

array([[0.16858765],
[0.78706455],
[0.9866457 ],
[0.18491879],
[0.74524015],
[0.7418657 ],
[0.9791367 ],
[0.97791415],
[0.94224715],
[0.0893833 ]], dtype=float32)
<tf.Tensor: shape=(10,), dtype=float32, numpy=array([0., 1., 1., 0., 1., 1., 1., 1., 1., 0.], dtype=float32)>
{'accuracy': 82.02099737532808,
'f1': 0.8187283797448478,
'precision': 0.8226273514784717,
'recall': 0.8202099737532809}
Baseline accuracy: 79.27, New accuracy: 82.02, Difference: 2.76
Baseline precision: 0.81, New precision: 0.82, Difference: 0.01
Baseline recall: 0.79, New recall: 0.82, Difference: 0.03
Baseline f1: 0.79, New f1: 0.82, Difference: 0.03

Model 7

USE içindeki önceden eğitilmiş yerleştirmeler gibi transfer öğrenme yöntemlerini kullanmanın faydalarından biri, az miktarda veri üzerinde harika sonuçlar elde etme yeteneğidir (USE makalesi özette bundan bahseder).

Bunu test etmek için, eğitim verilerinin küçük bir alt kümesini (%10) oluşturacağız, bir model eğiteceğiz ve onu değerlendireceğiz.

Total training examples: 6851
Length of 10% training examples: 686

Eğitim örneklerinin rastgele bir alt kümesini seçtiğimiz için, sınıfların kabaca dengelenmesi gerekir (tam eğitim veri kümesinde olduğu gibi).

0    415
1 271
dtype: int64

Modelimizin tam eğitim kümesinden öğrenme yeteneği ile %10 alt kümeden öğrenme yeteneği arasında uygun bir karşılaştırma yaptığımızdan emin olmak için, tf.keras.models.clone_model() kullanarak USE modelimizi ("model_6") kullanarak klonlayacağız.`

Bunu yapmak aynı mimariyi yaratacak ancak klon hedefinin öğrenilen ağırlıklarını sıfırlayacaktır (USE’den gelen önceden eğitilmiş ağırlıklar kalacak, ancak diğerleri sıfırlanacaktır).

Model: "model_6_USE"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
USE (KerasLayer) (None, 512) 256797824
_________________________________________________________________
dense_5 (Dense) (None, 64) 32832
_________________________________________________________________
dense_6 (Dense) (None, 1) 65
=================================================================
Total params: 256,830,721
Trainable params: 32,897
Non-trainable params: 256,797,824
_________________________________________________________________

model_7 düzeninin model_6 ile aynı olduğuna dikkat edin. Şimdi yeni oluşturulan modeli %10 eğitim verisi alt kümemizde eğitelim.

Saving TensorBoard log files to: model_logs/10_percent_tf_hub_sentence_encoder/20210822-071224
Epoch 1/5
22/22 [==============================] - 6s 154ms/step - loss: 0.6651 - accuracy: 0.6851 - val_loss: 0.6443 - val_accuracy: 0.6929
Epoch 2/5
22/22 [==============================] - 1s 46ms/step - loss: 0.5920 - accuracy: 0.7959 - val_loss: 0.5918 - val_accuracy: 0.7310
Epoch 3/5
22/22 [==============================] - 1s 35ms/step - loss: 0.5166 - accuracy: 0.8163 - val_loss: 0.5415 - val_accuracy: 0.7638
Epoch 4/5
22/22 [==============================] - 1s 33ms/step - loss: 0.4554 - accuracy: 0.8382 - val_loss: 0.5058 - val_accuracy: 0.7795
Epoch 5/5
22/22 [==============================] - 1s 32ms/step - loss: 0.4120 - accuracy: 0.8382 - val_loss: 0.4925 - val_accuracy: 0.7730

Daha az miktarda eğitim verisi nedeniyle eğitim, eskisinden daha hızlı bitti. Eğitim verilerinin %10'unu öğrendikten sonra modelimizin performansını değerlendirelim.

array([[0.26725993],
[0.7663658 ],
[0.8697842 ],
[0.30411467],
[0.5334834 ],
[0.82516 ],
[0.8102658 ],
[0.84461933],
[0.8153697 ],
[0.10006839]], dtype=float32)
<tf.Tensor: shape=(10,), dtype=float32, numpy=array([0., 1., 1., 0., 1., 1., 1., 1., 1., 0.], dtype=float32)>
{'accuracy': 77.29658792650919,
'f1': 0.7698502254147366,
'precision': 0.7770640736660165,
'recall': 0.7729658792650919}
Baseline accuracy: 79.27, New accuracy: 77.30, Difference: -1.97
Baseline precision: 0.81, New precision: 0.78, Difference: -0.03
Baseline recall: 0.79, New recall: 0.77, Difference: -0.02
Baseline f1: 0.79, New f1: 0.77, Difference: -0.02

… devamı TensorFlow ile NLP — Giriş 5 yazımda.

--

--

Furkan Gulsen

🧑‍💻 As a software engineer, I write about software, artificial intelligence, productivity, and everything I know