AWD-LSTM DARI ("Regrovisasi dan Mengoptimalkan Model Bahasa LSTM") untuk TensorFlow.
Kuantisasi pelatihan-penghargaan untuk inferensi integer-aritmetika ("kuantisasi dan pelatihan jaringan saraf untuk inferensi integer-aritmatika yang efisien" juga disediakan.
Kode ini diimplementasi dan diuji dengan TensorFlow 1.11.0. dan 1.13.0.
LayerRNNCell standar. from weight_drop_lstm import WeightDropLSTMCell
lstm_cell = WeightDropLSTMCell(
num_units=CELL_NUM, weight_drop_kr=WEIGHT_DP_KR,
use_vd=True, input_size=INPUT_SIZE)
Argumen didefinisikan sebagai berikut:
num_units: Jumlah sel di lapisan LSTM. [ints]
weight_drop_kr: Jumlah langkah yang diajukan oleh bobot cepat. [int]
use_vd: Jika benar, menggunakan dropout variasional pada drop-connect berat, dropout standar sebaliknya. [bool]
input_size: jikause_vd=True, input_size (dimensi saluran terakhir) harus disediakan. [int]
Argumen kata kunci yang tersisa persis sama dengan tf.nn.LSTMCell .
Mencatat bahwa, jika bobot_drop_kr tidak disediakan atau disediakan dengan 1.0, WeightDropLSTMCell direduksi sebagai LSTMCell .
# By simply sess.run in each training step
sess.run(lstm_cell.get_vd_update_op())
# Or use control_dependencies
vd_update_ops = lstm_cell.get_vd_update_op()
with tf.control_dependencies(vd_update_ops):
tf.train.AdamOptimizer(learning_rate).minimize(loss)
Anda juga dapat menambahkan get_vd_update_op() ke GraphKeys.UPDATE_OPS saat memanggil WeightDropLSTMCell .
Mencatat bahwa, jika Anda menggunakan control_dependencies , harap berhati -hati untuk urutan eksekusi.
Kernel dropout variasional tidak boleh diperbarui sebelum langkah pengoptimal.
Gagasan utama AWD-LSTM adalah bobot penghubung drop dan input gabungan. 
Jika is_vd=True , variabel akan digunakan untuk menyimpan kernel dropout. 
Saya telah melakukan percobaan pada tugas rekursif banyak-ke-banyak implementasi ini dan melakukan hasil yang lebih baik daripada LSTMCell sederhana.
lstm_cell = WeightDropLSTMCell(
num_units=CELL_NUM, weight_drop_kr=WEIGHT_DP_KR,
is_quant=True, is_train=True)
tf.contrib.quantize.create_training_graph(sess.graph, quant_delay=0)
tf.while Sementara versi lebih tinggi dari 1.12.0 Saya juga memberikan implementasi TensorFlow dari dropout variasional, yang lebih fleksibel daripada DropoutWrapper di TensorFlow.
Penggunaannya mirip dengan menggunakan WeightDropLSTMCell :
from variational_dropout import VariationalDropout
vd = VariationalDropout(input_shape=[5], keep_prob=0.5)
# Directly sess.run() to update
sess.run(vd.get_update_mask_op())
# Or use control_dependencies
with tf.control_dependencies(vd.get_update_mask_op()):
step, results_array = tf.while_loop(
cond=lambda step, _: step < 5,
body=main_loop,
loop_vars=(step, results_array))
"""
This is just a simple example.
Usually, control_dependencies will be placed where optimizer stepping.
"""
Anda juga dapat menambahkan get_update_mask_op() ke GraphKeys.UPDATE_OPS saat memanggil VariationalDropout .
Sekali lagi, jika Anda menggunakan control_dependencies , berhati -hatilah untuk urutan eksekusi.
Jika Anda punya saran, beri tahu saya. Saya akan sangat bersyukur!
Kode Kerja oleh Jia-Yau Shiau [email protected].
Pekerjaan Kode Kuantisasi Disarankan dan Dipotong dari Peter Huang [email protected]