Berdasarkan kode Andrej Karpathy https://github.com/karpathy/char-rnn dan Samy Bengio's Paper http://arxiv.org/abs/1506.03099
Buat kode dapat memproses karakter bahasa Inggris dan Cina. Ini adalah sentuhan pertama saya dari Lua, jadi proses string tampak konyol, tetapi berfungsi dengan baik.
Saya juga menambahkan opsi yang disebut 'min_freq' karena ukuran kosakata dalam bahasa Cina sangat besar, yang membuat parameter meningkat banyak. Jadi hapus beberapa karakter langka dapat membantu.
Makalah Samy Bengio dijadwalkan pengambilan sampel untuk prediksi urutan dengan jaringan saraf berulang di NIPS15 mengusulkan metode sederhana tetapi kekuatan untuk melibatkan RNN.
Dalam percobaan saya, saya merasa sangat membantu untuk menghindari overfitting dan membuat tes kehilangan tes berjalan lebih dalam. Saya hanya menggunakan pembusukan linier.
Gunakan -use_ss untuk menyalakan atau mematikan pengambilan sampel yang dijadwalkan, default aktif. -start_ss adalah awal dari data nyata, saya sarankan untuk menggunakan 1 karena model kami harus mempelajari data tanpa kebisingan di awal. -min_ss juga sangat penting karena terlalu banyak kebisingan akan melukai kinerja. Akhirnya, -decay_ss adalah laju peluruhan linier.
Saya menambahkan skrip untuk mengonversi file model yang dilatih oleh GPU ke model CPU. Anda dapat mencobanya sebagai berikut:
$ th convert.lua gpu_model cpu_modelDemo web ditambahkan untuk orang lain untuk menguji model dengan mudah, berdasarkan sub/pub Redis. Saya menggunakan Redis karena saya tidak dapat menemukan beberapa RPC atau server web yang baik bekerja dengan baik dengan obor. Anda harus memperhatikan bahwa demo itu tidak disukai oleh Ajax. Untuk mengatur demo di ubuntu: instal redis dan memulainya
$ wget http://download.redis.io/releases/redis-3.0.3.tar.gz
$ tar xzf redis-3.0.3.tar.gz
$ cd redis-3.0.3
$ make
$ sudo make install
$ redis-server &Kemudian pasang Flask dan Plugin Redis:
$ sudo pip install flask
$ sudo pip install redis
$ luarocks install redis-luaMenempatkan Anda file model di online_model, ganti namanya sebagai 'model.t7', start the backend and fontend skrip:
$ nohup th web_backend.lua &
$ nohup python web_server.py & Harap ikuti ini untuk mengatur percobaan Anda.
Kode ini mengimplementasikan jaringan saraf berulang multi-lapisan (RNN, LSTM, dan GRU) untuk pelatihan/pengambilan sampel dari model bahasa tingkat karakter. Model belajar untuk memprediksi probabilitas karakter berikutnya dalam urutan. Dengan kata lain, input adalah file teks tunggal dan model belajar untuk menghasilkan teks seperti itu.
Konteks basis kode ini dijelaskan secara rinci dalam posting blog saya. Halaman proyek yang memiliki beberapa petunjuk untuk beberapa set data.
Kode ini awalnya didasarkan pada kelas pembelajaran mesin Oxford University Practical 6, yang pada gilirannya didasarkan pada pembelajaran untuk menjalankan kode dari Wojciech Zaremba. Potongannya juga dikembangkan bekerja sama dengan teman saya Justin Johnson.
Kode ini ditulis di Lua dan membutuhkan obor. Selain itu, Anda perlu menginstal paket nngraph dan optim menggunakan luarocks yang akan dapat Anda lakukan setelah menginstal obor:
$ luarocks install nngraph
$ luarocks install optim Jika Anda ingin menggunakan komputasi GPU CUDA, pertama -tama Anda harus menginstal CUDA Toolkit, maka paket cutorch dan cunn :
$ luarocks install cutorch
$ luarocks install cunn Jika Anda ingin menggunakan komputasi OpenCL GPU, pertama -tama Anda harus menginstal paket cltorch dan clnn , dan kemudian gunakan opsi -opencl 1 selama pelatihan:
$ luarocks install cltorch
$ luarocks install clnn Semua data input disimpan di dalam data/ Direktori. Anda akan melihat bahwa ada contoh dataset yang termasuk dalam repo (dalam data/tinyshakespeare ) yang terdiri dari subset karya Shakespeare. Saya menyediakan beberapa set data lagi di halaman proyek.
Data Anda sendiri : Jika Anda ingin menggunakan data Anda sendiri, buat satu file input.txt dan masukkan ke dalam folder di data/ . Misalnya, data/some_folder/input.txt . Pertama kali Anda menjalankan skrip pelatihan itu akan menulis dua file kenyamanan lagi ke dalam data/some_folder .
Perhatikan bahwa jika data Anda terlalu kecil (1MB sudah dianggap sangat kecil) RNN tidak akan belajar dengan sangat efektif. Ingatlah bahwa ia harus mempelajari semuanya sepenuhnya dari awal.
Sebaliknya jika data Anda besar (lebih dari sekitar 2MB), merasa percaya diri untuk meningkatkan rnn_size dan melatih model yang lebih besar (lihat detail pelatihan di bawah). Ini akan bekerja secara signifikan lebih baik . Misalnya dengan 6MB Anda dapat dengan mudah naik ke rnn_size 300 atau bahkan lebih. Yang terbesar yang cocok dengan GPU saya dan saya telah berlatih dengan kode ini adalah rnn_size 700 dengan num_layers 3 (2 adalah default).
Mulailah melatih model menggunakan train.lua , misalnya:
$ th train.lua -data_dir data/some_folder -gpuid -1
Bendera -data_dir adalah yang paling penting karena menentukan dataset untuk digunakan. Perhatikan bahwa dalam contoh ini kami juga mengatur gpuid ke -1 yang memberi tahu kode untuk melatih menggunakan CPU, jika tidak ia default ke GPU 0. Ada banyak bendera lain untuk berbagai opsi. Konsultasikan $ th train.lua -help untuk pengaturan komprehensif. Inilah contoh lain:
$ th train.lua -data_dir data/some_folder -rnn_size 512 -num_layers 2 -dropout 0.5
Sementara model dilatih, ia secara berkala akan menulis file pos pemeriksaan ke folder cv . Frekuensi pos pemeriksaan ini ditulis dikendalikan dengan jumlah iterasi, seperti yang ditentukan dengan opsi eval_val_every (misalnya jika ini 1 maka pos pemeriksaan ditulis setiap iterasi). Nama file dari pos pemeriksaan ini berisi angka yang sangat penting: kerugian . Misalnya, pos pemeriksaan dengan nama file lm_lstm_epoch0.95_2.0681.t7 menunjukkan bahwa pada titik ini model berada pada zaman 0,95 (yaitu hampir melakukan satu lintasan penuh atas data pelatihan), dan kerugian pada data validasi adalah 2.0681. Jumlah ini sangat penting karena semakin rendah, semakin baik pos pemeriksaan berfungsi. Setelah Anda mulai menghasilkan data (dibahas di bawah), Anda ingin menggunakan pos pemeriksaan model yang memiliki kerugian validasi terendah. Perhatikan bahwa ini mungkin tidak harus menjadi pos pemeriksaan terakhir di akhir pelatihan (karena kemungkinan overfitting).
Jumlah penting lain yang harus diperhatikan adalah batch_size (sebut saja b), seq_length (sebut saja), dan pengaturan train_frac dan val_frac . Ukuran batch menentukan berapa banyak aliran data yang diproses secara paralel pada satu waktu. Panjang urutan menentukan panjang masing -masing potongan, yang juga merupakan batas di mana gradien terpotong. Misalnya, jika seq_length adalah 20, maka sinyal gradien tidak akan pernah mengekspropagasi lebih dari 20 langkah waktu, dan model mungkin tidak menemukan dependensi lebih lama dari panjang dalam jumlah karakter. Pada saat runtime file teks input Anda memiliki karakter N, semua ini semua terbagi menjadi potongan -potongan bxs ukuran. Potongan -potongan ini kemudian dialokasikan untuk tiga perpecahan: kereta/val/tes sesuai dengan pengaturan frac . Jika data Anda kecil, mungkin dengan pengaturan default, Anda hanya memiliki total potongan total (misalnya 100). Ini buruk: Dalam kasus ini Anda mungkin ingin mengurangi ukuran batch atau panjang urutan.
Anda juga dapat memperoleh parameter dari pos pemeriksaan yang sebelumnya disimpan menggunakan init_from .
Kita dapat menggunakan pos pemeriksaan ini untuk menghasilkan teks (dibahas selanjutnya).
Diberikan file pos pemeriksaan (seperti yang ditulis ke cv ) kami dapat menghasilkan teks baru. Misalnya:
$ th sample.lua cv/some_checkpoint.t7 -gpuid -1
Pastikan bahwa jika pos pemeriksaan Anda dilatih dengan GPU itu juga diambil sampelnya dari GPU, atau sebaliknya. Kalau tidak, kode akan (saat ini) mengeluh. Seperti halnya skrip kereta api, lihat $ th sample.lua -help untuk opsi lengkap. Salah satu yang penting adalah (misalnya) -length 10000 yang akan menghasilkan 10.000 karakter (default = 2000).
Suhu . Parameter penting yang mungkin ingin Anda mainkan dengan banyak adalah -temperature , yang mengambil angka dalam kisaran [0, 1] (pemberitahuan 0 tidak termasuk), default = 1. Suhu membagi probabilitas log yang diprediksi sebelum softmax, sehingga suhu yang lebih rendah akan menyebabkan model membuat lebih mungkin, tetapi juga prediksi yang lebih membosankan dan konservatif. Suhu yang lebih tinggi menyebabkan model mengambil lebih banyak peluang dan meningkatkan keragaman hasil, tetapi dengan biaya lebih banyak kesalahan.
Priming . Dimungkinkan juga untuk membuat model dengan beberapa teks awal menggunakan -primetext . Ini dimulai dari RNN dengan beberapa karakter hardcoded untuk menghangatkannya dengan beberapa konteks sebelum mulai menghasilkan teks.
Sampling Selamat!
Jika Anda agak baru dalam pembelajaran mesin atau jaringan saraf, dapat mengambil sedikit keahlian untuk mendapatkan model yang baik. Jumlah yang paling penting untuk dilacak adalah perbedaan antara kehilangan pelatihan Anda (dicetak selama pelatihan) dan kehilangan validasi (dicetak sesekali ketika RNN dijalankan pada data validasi (secara default setiap 1000 iterasi)). Secara khusus:
Dua parameter terpenting yang mengontrol model adalah rnn_size dan num_layers . Saya akan menyarankan agar Anda selalu menggunakan num_layers dari 2/3. rnn_size dapat disesuaikan berdasarkan berapa banyak data yang Anda miliki. Dua jumlah penting untuk dilacak di sini adalah:
Keduanya harus memiliki urutan besarnya yang sama. Agak sulit untuk diceritakan. Berikut beberapa contoh:
rnn_size lebih besar.Strategi yang menang untuk mendapatkan model yang sangat baik (jika Anda memiliki waktu komputasi) adalah untuk selalu berbuat salah membuat jaringan lebih besar (sebesar Anda bersedia menunggu untuk menghitung) dan kemudian mencoba nilai putus sekolah yang berbeda (antara 0,1). Model apa pun yang memiliki kinerja validasi terbaik (kerugian, yang ditulis dalam nama file pos pemeriksaan, rendah itu bagus) adalah yang harus Anda gunakan pada akhirnya.
Sangat umum dalam pembelajaran mendalam untuk menjalankan banyak model yang berbeda dengan banyak pengaturan hiperparameter yang berbeda, dan pada akhirnya mengambil pos pemeriksaan apa pun yang memberikan kinerja validasi terbaik.
Ngomong -ngomong, ukuran pelatihan dan pemisahan validasi Anda juga merupakan parameter. Pastikan Anda memiliki jumlah data yang layak dalam set validasi Anda atau kinerja validasi akan berisik dan tidak terlalu informatif.
Mit