কাস্টম টেনসরফ্লো কেরাস অপ্টিমাইজার


30

মনে করুন আমি একটি কাস্টম অপ্টিমাইজার ক্লাস লিখতে চাই যা tf.kerasএপিআই (টেনসরফ্লো সংস্করণ> = 2.0 ব্যবহার করে) এর সাথে সঙ্গতিপূর্ণ। বাস্তবায়নে কী করা হয়েছে তার বিপরীতে এটি করার ডকুমেন্টেড উপায় সম্পর্কে আমি বিভ্রান্ত।

tf.keras.optimizers.Optimizer রাজ্যগুলির জন্য ডকুমেন্টেশন ,

  ### Write a customized optimizer.
  If you intend to create your own optimization algorithm, simply inherit from
  this class and override the following methods:

    - resource_apply_dense (update variable given gradient tensor is dense)
    - resource_apply_sparse (update variable given gradient tensor is sparse)
    - create_slots (if your optimizer algorithm requires additional variables)

যাইহোক, বর্তমান tf.keras.optimizers.Optimizerবাস্তবায়ন কোনও resource_apply_denseপদ্ধতির সংজ্ঞা দেয় না , তবে এটি একটি ব্যক্তিগত- দেখানো পদ্ধতি স্টাবকে সংজ্ঞায়িত করে । একইভাবে, কোনও বা পদ্ধতি নেই, তবে একটি পদ্ধতি স্টাব এবং একটি পদ্ধতি কল রয়েছে_resource_apply_denseresource_apply_sparsecreate_slots_resource_apply_sparse_create_slots

সরকারী সালে tf.keras.optimizers.Optimizerউপশ্রেণী (ব্যবহার tf.keras.optimizers.Adamএকটি উদাহরণ হিসাবে), আছে _resource_apply_dense, _resource_apply_sparseএবং _create_slotsপদ্ধতি, এবং সেখানে নেতৃস্থানীয় আন্ডারস্কোর ছাড়া এমন কোন পদ্ধতি।

সেখানে সামান্য-কম সরকারী অনুরূপ নেতৃস্থানীয়-আন্ডারস্কোর পদ্ধতি tf.keras.optimizers.Optimizerউপশ্রেণী (যেমন, tfa.optimizers.MovingAverage: TensorFlow অ্যাডঅনস থেকে _resource_apply_dense, _resource_apply_sparse, _create_slots)।

আমার জন্য আর একটি বিভ্রান্তিমূলক বিষয় হ'ল টেনসরফ্লো অ্যাডনস অপটিমাইজারগুলির মধ্যে কিছুapply_gradients পদ্ধতিতে (যেমন, tfa.optimizers.MovingAverage) ওভাররাইডও করে , তবে tf.keras.optimizersঅপ্টিমাইজারগুলি তা করে না।

তদুপরি, আমি লক্ষ করেছি যে apply_gradientsপদ্ধতিটির tf.keras.optimizers.Optimizerপদ্ধতি কল করে_create_slots তবে বেস tf.keras.optimizers.Optimizerক্লাসের কোনও _create_slotsপদ্ধতি নেই। সুতরাং, মনে হচ্ছে কোনও উপকরণটি ওভাররাইড না করলে অপ্টিমাইজার সাবক্লাসে একটি _create_slotsপদ্ধতি অবশ্যই সংজ্ঞায়িত করা উচিতapply_gradients


প্রশ্নাবলি

সাবক্লাস এ এর ​​সঠিক উপায় কী tf.keras.optimizers.Optimizer? বিশেষ করে,

  1. না tf.keras.optimizers.Optimizerশীর্ষে তালিকাভুক্ত ডকুমেন্টেশন কেবল পদ্ধতি তারা উল্লেখ নেতৃস্থানীয়-আন্ডারস্কোর সংস্করণ ওভাররাইড করতে (যেমন, মানে _resource_apply_denseপরিবর্তে resource_apply_dense)? যদি তা হয় তবে টেনসরফ্লোয়ের ভবিষ্যতের সংস্করণগুলিতে এই ব্যক্তিগত-দেখায় পদ্ধতিগুলি তাদের আচরণ পরিবর্তন করে না এমন কোনও এপিআই গ্যারান্টি আছে? এই পদ্ধতির স্বাক্ষরগুলি কী কী?
  2. পদ্ধতিগুলি apply_gradientsছাড়াও কেউ কখন ওভাররাইড করবে _apply_resource_[dense|sparse]?

সম্পাদনা করুন। গিটহাবের উপর প্রকাশিত সমস্যা: # 36449


1
এটি ডেভসগুলির কাছে ডকুমেন্টেশন ইস্যু হিসাবে রিপোর্ট করার মতো কিছু হতে পারে। এটি অবশ্যই স্পষ্টভাবে দেখে মনে হচ্ছে যে এই পদ্ধতিগুলিকে ওভাররাইড করার জন্য ডকুমেন্টেশনে প্রাথমিক আন্ডারস্কোরটি অন্তর্ভুক্ত করা উচিত, তবে যে কোনও ক্ষেত্রে যেমন আপনি বলেন, তাদের স্বাক্ষর এবং সঠিক উদ্দেশ্য সম্পর্কে কোনও তথ্য নেই। এটি এমনও হতে পারে যে আন্ডারস্কোর (এবং ডকুমেন্টেড) ছাড়াই পদ্ধতির নামগুলি যুক্ত করার পরিকল্পনা করা হয়েছে (এর মতো get_config) তবে সেগুলি এখনও পাবলিক ডকুমেন্টেশনে হাজির হওয়া উচিত নয় ।
jdehesa

স্বাক্ষরগুলির জন্য, আপনি সর্বদা _resource_apply_denseবা এর ঘোষণার দিকে নজর রাখতে পারেন _resource_apply_sparseএবং প্রয়োগকৃত অপ্টিমাইজারগুলিতে তাদের ব্যবহার দেখতে পারেন। যদিও এটি নাও হতে পারে, আমি মনে করি, স্থিতিশীলতা গ্যারান্টি সহ পাবলিক এপিআই, আমি বলব এটি ব্যবহার করা বেশ নিরাপদ। তাদের কেবল এই দিকটিতে আরও ভাল দিকনির্দেশনা দেওয়া উচিত।
jdehesa

আমি সম্মত হই যে এটি টেনসরফ্লোতে একটি ডকুমেন্টেশন ইস্যু। আপনি কি টিএফ গিথুব রেপোতে এটির জন্য একটি সমস্যা তৈরি করেছেন? যদি তা হয় তবে আপনি কি এখানে লিঙ্কটি ভাগ করে নিতে পারেন?
jpgard

উত্তর:


3

আমি ক্যারাস অ্যাডামডাব্লুটিকে সমস্ত বড় টিএফ এবং কেরাস সংস্করণে প্রয়োগ করেছি - আমি আপনাকে অপ্টিমাইজার_ভি 2.py পরীক্ষা করার জন্য আমন্ত্রণ জানিয়েছি । কয়েকটি বিষয়:

  • আপনার উত্তরাধিকারী হওয়া উচিত OptimizerV2, যা আসলে যা আপনি সংযুক্ত করেছেন; এটি tf.kerasঅপ্টিমাইজারের জন্য সর্বশেষ এবং বর্তমান বেস শ্রেণি
  • আপনি (1) এ সঠিক - এটি একটি ডকুমেন্টেশন ভুল; পদ্ধতিগুলি ব্যক্তিগত, কারণ এগুলি ব্যবহারকারীদের দ্বারা সরাসরি ব্যবহার করার উদ্দেশ্যে নয়।
  • apply_gradients(বা অন্য কোনও পদ্ধতি) কেবলমাত্র তখনই বাতিল হয় যদি ডিফল্ট কোনও প্রদত্ত অপ্টিমাইজারের জন্য প্রয়োজনীয় জিনিসটি সম্পাদন করে না; আপনার সংযুক্ত উদাহরণে, এটি আসলটিতে কেবল একটি লাইন যুক্ত on
  • "সুতরাং, মনে হয় যে কোনও _create_slotsউপকরণটি ওভাররাইড না করে যদি একটি অপ্টিমাইজার সাবক্লাসে একটি পদ্ধতি অবশ্যই সংজ্ঞায়িত করা উচিত apply_gradients" - দুটি সম্পর্কযুক্ত নয়; এটা কাকতালীয়।

  • মধ্যে পার্থক্য কি _resource_apply_denseএবং _resource_apply_sparse?

উত্তরোত্তরগুলি বিরল স্তরগুলির সাথে সম্পর্কিত - যেমন Embedding- এবং সমস্ত কিছুর সাথে পূর্ববর্তী; উদাহরণ

  • আমার কখন ব্যবহার করা উচিত _create_slots()?

প্রশিক্ষণযোগ্য tf.Variable গুলি সংজ্ঞায়িত করার সময় ; উদাহরণ: ওজনের প্রথম এবং দ্বিতীয় ক্রমের মুহুর্তগুলি (যেমন অ্যাডাম)। এটি ব্যবহার করে add_slot()

  • আমার কখন ব্যবহার করা উচিত _set_hyper()?

খুব বেশি, যখনই ব্যবহার না করা _create_slots(); এটি শ্রেণীর বৈশিষ্ট্যগুলি নির্ধারণ করার মতো, তবে ব্যবহারে নির্ভুলতা নিশ্চিত করতে অতিরিক্ত প্রাকপ্রসেসিং পদক্ষেপ সহ। তাই পাইথন int, float, tf.Tensor, tf.Variable, & অন্যদের। (কেরাস অ্যাডামডাব্লুতে আমার এটি আরও বেশি ব্যবহার করা উচিত ছিল)।


দ্রষ্টব্য : যদিও আমার লিঙ্কযুক্ত অপ্টিমাইজারগুলি সঠিকভাবে কাজ করে এবং মূলগুলির তুলনায় তত দ্রুত, কোডটি সেরা টেনসরফ্লো অনুশীলনগুলি অনুসরণ করে এবং এখনও দ্রুত হতে পারে; আমি এটিকে "আদর্শ রেফারেন্স" হিসাবে সুপারিশ করি না। উদাহরণস্বরূপ কিছু পাইথন অবজেক্ট (যেমন int) টেনসর হতে হবে; eta_tএকটি হিসাবে সংজ্ঞায়িত করা হয় tf.Variable, কিন্তু অবিলম্বে হিসেবে ওভাররাইড tf.Tensorমধ্যে _applyপদ্ধতি। অগত্যা কোনও বড় বিষয় নয়, কেবল সংস্কার করার সময় নেই।


2
  1. হ্যাঁ, এটি একটি ডকুমেন্টেশন ত্রুটি বলে মনে হচ্ছে। পূর্ববর্তী আন্ডারস্কোর নামগুলি ওভাররাইডের সঠিক পদ্ধতি। সম্পর্কিত হ'ল কেরাস অপ্টিমাইজার যা এগুলি সমস্ত সংজ্ঞায়িত করেছে তবে বেস ক্লাস https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/optimizer.py এ প্রয়োগ করা হয়নি
  def _create_slots(self, var_list):
    """Create all slots needed by the variables.
    Args:
      var_list: A list of `Variable` objects.
    """
    # No slots needed by default
    pass

  def _resource_apply_dense(self, grad, handle):
    """Add ops to apply dense gradients to the variable `handle`.
    Args:
      grad: a `Tensor` representing the gradient.
      handle: a `Tensor` of dtype `resource` which points to the variable
       to be updated.
    Returns:
      An `Operation` which updates the value of the variable.
    """
    raise NotImplementedError()

  def _resource_apply_sparse(self, grad, handle, indices):
    """Add ops to apply sparse gradients to the variable `handle`.
    Similar to `_apply_sparse`, the `indices` argument to this method has been
    de-duplicated. Optimizers which deal correctly with non-unique indices may
    instead override `_resource_apply_sparse_duplicate_indices` to avoid this
    overhead.
    Args:
      grad: a `Tensor` representing the gradient for the affected indices.
      handle: a `Tensor` of dtype `resource` which points to the variable
       to be updated.
      indices: a `Tensor` of integral type representing the indices for
       which the gradient is nonzero. Indices are unique.
    Returns:
      An `Operation` which updates the value of the variable.
    """
    raise NotImplementedError()
  1. আমি সম্পর্কে জানি না apply_dense। একটি জিনিসের জন্য, আপনি যদি এটিকে ওভাররাইড করেন তবে কোডটিতে উল্লেখ করা হয়েছে যে প্রতি-প্রতিলিপি বিতরণ স্ট্রেটজি "বিপজ্জনক" হতে পারে
    # TODO(isaprykin): When using a DistributionStrategy, and when an
    # optimizer is created in each replica, it might be dangerous to
    # rely on some Optimizer methods.  When such methods are called on a
    # per-replica optimizer, an exception needs to be thrown.  We do
    # allow creation per-replica optimizers however, because the
    # compute_gradients()->apply_gradients() sequence is safe.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.