AWD-LSTM من ("تنظيم وتحسين نماذج لغة LSTM") للتنسيق.
كما يتم توفير تقدير كمية التدريب على الاستدلال الصحيح للاستدلال فقط ("كمية وتدريب الشبكات العصبية للاستدلال الفعال على عدد صحيح فقط").
يتم تنفيذ هذا الرمز واختباره باستخدام TensorFlow 1.11.0. و 1.13.0.
LayerRNNCell قياسي. 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)
يتم تعريف الحجج على النحو التالي:
num_units: عدد الخلية في طبقة LSTM. [ints]
weight_drop_kr: عدد الخطوات التي تتقدم الأوزان السريعة. [int]
use_vd: إذا كان هذا صحيحًا ، باستخدام التسرب المتغير على توصيل انخفاض الوزن ، فإن التسرب القياسي على خلاف ذلك. [بول]
input_size: إذا تم توفيرuse_vd=True، يجب توفير input_size (بُعد القناة الأخيرة). [int]
وسيطات الكلمة الرئيسية المتبقية هي بالضبط نفس tf.nn.LSTMCell .
لاحظ أنه ، إذا لم يتم توفير أو تزويد Weight_Drop_KR بـ 1.0 ، يتم تخفيض WeightDropLSTMCell كـ 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)
WeightDropLSTMCell أيضًا إضافة GraphKeys.UPDATE_OPS get_vd_update_op()
لاحظ أنه إذا كنت تستخدم control_dependencies ، فيرجى توخي الحذر لترتيب التنفيذ.
لا ينبغي تحديث نواة التسرب المتنوعة قبل خطوة المُحسّنة.
الفكرة الرئيسية لـ AWD-LSTM هي الأوزان المتساقطة والمدخلات المتسلسلة. 
إذا كان is_vd=True ، فسيتم استخدام المتغيرات لحفظ نواة التسرب. 
لقد أجريت تجارب على مهمة عودية عديدة إلى العديد من هذا التنفيذ وتنفيذ نتائج أفضل من LSTMCell البسيطة.
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 مع الإصدار أعلى من 1.12.0 لقد قدمت أيضًا تنفيذًا للتسرب المتنوع ، وهو أكثر مرونة من DropoutWrapper في TensorFlow.
الاستخدام مشابه لاستخدام 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.
"""
يمكنك أيضًا إضافة get_update_mask_op() إلى GraphKeys.UPDATE_OPS عند استدعاء VariationalDropout .
مرة أخرى ، إذا كنت تستخدم control_dependencies ، فيرجى توخي الحذر لترتيب التنفيذ.
إذا كان لديك أي اقتراح ، فيرجى إبلاغي بذلك. سأكون ممتنا جدا!
رمز العمل من قبل jia-yau shiau [email protected].
ينصح عمل رمز الكمي وتشجعه من Peter Huang [email protected]