Tensorflowの( "LSTM言語モデルの正規化と最適化)からのAWD-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:trueの場合、重量ドロップコネクトで変異ドロップアウトを使用して、それ以外の場合は標準ドロップアウトを使用します。 [ブール]
input_size:use_vd=True、input_size(最終チャネルのディメンション)を提供する必要があります。 [int]
残りのキーワード引数は、 tf.nn.LSTMCellとまったく同じです。
Yeate_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を呼び出すときに、 get_vd_update_op()をGraphKeys.UPDATE_OPSに追加することもできます。
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を超えるバージョンではまた、Tensorflowの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.
"""
VariationalDropoutを呼び出すときに、 get_update_mask_op() GraphKeys.UPDATE_OPSに追加することもできます。
もう一度、 control_dependenciesを使用する場合は、実行の順序に注意してください。
提案がある場合は、お知らせください。かなり感謝します!
jia-yau shiau [email protected]によるコードワーク。
量子化コード作業は、Peter Huang [email protected]からお勧めし、フォークされています