Tensorflowは、パラメータ勾配の一部更新操作を実現します。


深さ学習では,移動学はしばしば用いられ,大データセット上で事前訓練されたモデルは特定のタスクに移動し,モデルパラメータを不変に保つ必要があり,タスクに関連するモデル層を微調整することが多い。
本論文では主に,tenssorflowの部分を用いてモデルパラメータを更新する方法を紹介した。
1.Varable scopeによって削除する固定パラメータが必要な変数

def get_variable_via_scope(scope_lst):
  vars = []
  for sc in scope_lst:
    sc_variable = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES,scope=scope)
    vars.extend(sc_variable)
  return vars
 
trainable_vars = tf.trainable_variables()
no_change_scope = ['your_unchange_scope_name']
 
no_change_vars = get_variable_via_scope(no_change_scope)
 
for v in no_change_vars:
  trainable_vars.remove(v)
 
grads, _ = tf.gradients(loss, trainable_vars)
 
optimizer = tf.train.AdamOptimizer(lr)
 
train_op = optimizer.apply_gradient(zip(grads, trainable_vars), global_step=global_step)
2.tf.stop_を使うgradient関数
Grapphを確立する際にこの関数を使用して、scopeを使用してパラメータを取得することを非常に簡潔に回避します。
3.行列の一部または列パラメータの更新
行列がある場合、一部の行または列だけがパラメータを更新する必要がある場合、他のシーンは変わらないままに維持され、この場面はよく見られます。例えば、word embeddingにおいては、予め定義された領域関連語のいくつかは不変に保たれます。

import tensorflow as tf
import numpy as np
 
def entry_stop_gradients(target, mask):
  mask_h = tf.abs(mask-1)
  return tf.stop_gradient(mask_h * target) + mask * target
 
mask = np.array([1., 0, 1, 1, 0, 0, 1, 1, 0, 1])
mask_h = np.abs(mask-1)
 
emb = tf.constant(np.ones([10, 5]))
 
matrix = entry_stop_gradients(emb, tf.expand_dims(mask,1))
 
parm = np.random.randn(5, 1)
t_parm = tf.constant(parm)
 
loss = tf.reduce_sum(tf.matmul(matrix, t_parm))
grad1 = tf.gradients(loss, emb)
grad2 = tf.gradients(loss, matrix)
print matrix
with tf.Session() as sess:
  print sess.run(loss)
  print sess.run([grad1, grad2])
以上のTensorflowは一部パラメータ勾配の更新操作を実現しました。小編集は皆さんに全部の内容を共有しました。参考にしていただければと思います。よろしくお願いします。