Trình tối ưu hóa tùy chỉnh TensorFlow Keras


30

Giả sử tôi muốn viết một lớp tối ưu hóa tùy chỉnh phù hợp với tf.kerasAPI (sử dụng phiên bản TensorFlow> = 2.0). Tôi bối rối về cách làm tài liệu để làm điều này so với những gì được thực hiện trong việc triển khai.

Các tài liệu cho tf.keras.optimizers.Optimizer các tiểu bang ,

  ### 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)

Tuy nhiên, hiện nay tf.keras.optimizers.Optimizerthực hiện không xác định được resource_apply_densephương pháp, nhưng nó không định nghĩa một tư nhân tìm kiếm _resource_apply_densephương pháp còn sơ khai . Tương tự, không có resource_apply_sparsehoặc create_slotsphương thức, nhưng có một _resource_apply_sparsesơ khai phương thức và một _create_slotslệnh gọi phương thức .

Trong chính thức tf.keras.optimizers.Optimizerlớp con (sử dụng tf.keras.optimizers.Adamnhư một ví dụ), có _resource_apply_dense, _resource_apply_sparse_create_slotsphương pháp, và không có phương pháp như vậy mà không có dấu gạch dưới hàng đầu.

Có nhiều phương pháp tương tự hàng đầu gạch dưới trong hơi ít chính thức tf.keras.optimizers.Optimizerlớp con (ví dụ, tfa.optimizers.MovingAveragetừ TensorFlow Addons: _resource_apply_dense, _resource_apply_sparse, _create_slots).

Một điểm khó hiểu khác đối với tôi là một số trình tối ưu hóa TensorFlow Addons cũng ghi đè apply_gradientsphương thức (ví dụ tfa.optimizers.MovingAverage:), trong khi các trình tf.keras.optimizerstối ưu hóa thì không.

Hơn nữa, tôi nhận thấy rằng apply_gradientsphương tf.keras.optimizers.Optimizerthức gọi_create_slots phương thức , nhưng tf.keras.optimizers.Optimizerlớp cơ sở không có _create_slotsphương thức. Vì vậy, có vẻ như một _create_slotsphương thức phải được xác định trong một lớp con tối ưu hóa nếu lớp con đó không ghi đè apply_gradients.


Câu hỏi

Cách chính xác để phân lớp a là tf.keras.optimizers.Optimizergì? Đặc biệt,

  1. Có phải tf.keras.optimizers.Optimizertài liệu được liệt kê ở trên chỉ đơn giản là có nghĩa là ghi đè lên các phiên bản gạch dưới hàng đầu của các phương thức mà chúng đề cập (ví dụ: _resource_apply_densethay vì resource_apply_dense)? Nếu vậy, có bất kỳ API nào đảm bảo về các phương thức có vẻ riêng tư này không thay đổi hành vi của chúng trong các phiên bản tương lai của TensorFlow không? Chữ ký của các phương pháp này là gì?
  2. Khi nào thì ghi đè apply_gradientsngoài các _apply_resource_[dense|sparse]phương thức?

Biên tập. Sự cố đã mở trên GitHub: # 36449


1
Đây có thể là một cái gì đó để báo cáo như là một vấn đề tài liệu cho các nhà phát triển. Nó chắc chắn trông giống như các phương thức ghi đè nên bao gồm dấu gạch dưới ban đầu trong tài liệu, nhưng trong mọi trường hợp, như bạn nói, không có thông tin về chữ ký và mục đích chính xác của chúng. Cũng có thể là các tên phương thức không có dấu gạch dưới (và được ghi lại) được lên kế hoạch để thêm (như với get_config), nhưng sau đó chúng không nên xuất hiện trong tài liệu công khai .
jdehesa

Đối với chữ ký, bạn luôn có thể xem khai báo _resource_apply_densehoặc _resource_apply_sparse, và xem cách sử dụng chúng trong các trình tối ưu hóa được triển khai. Mặc dù có thể không, tôi nghĩ, API công cộng có đảm bảo độ ổn định, tôi nói rằng nó khá an toàn khi sử dụng chúng. Họ chỉ nên cung cấp hướng dẫn tốt hơn trong khía cạnh này.
jdehesa

Tôi đồng ý rằng đây là vấn đề về tài liệu với TensorFlow. Bạn đã tạo ra một vấn đề cho điều này trong repo tith Github? Nếu vậy, bạn có thể chia sẻ liên kết ở đây?
jpgard

Câu trả lời:


3

Tôi đã triển khai Keras AdamW trong tất cả các phiên bản TF & Keras chính - Tôi mời bạn kiểm tra trình tối ưu hóa . Một số điểm:

  • Bạn nên kế thừa OptimizerV2, đó thực sự là những gì bạn liên kết; đó là lớp cơ sở mới nhất và hiện tại để tf.kerastối ưu hóa
  • Bạn đúng trong (1) - đây là lỗi tài liệu; các phương thức là riêng tư, vì chúng không được người dùng sử dụng trực tiếp.
  • apply_gradients(hoặc bất kỳ phương pháp nào khác) chỉ được ghi đè nếu mặc định không hoàn thành những gì cần thiết cho trình tối ưu hóa nhất định; trong ví dụ được liên kết của bạn, nó chỉ là một addon một lớp so với bản gốc
  • "Vì vậy, có vẻ như một _create_slotsphương thức phải được xác định trong một lớp con tối ưu hóa nếu lớp con đó không ghi đè apply_gradients" - hai phương thức này không liên quan; thật trùng hợp.

  • Sự khác biệt giữa _resource_apply_densevà là _resource_apply_sparsegì?

Latter giao dịch với các lớp thưa thớt - ví dụ Embedding- và trước đây với mọi thứ khác; Ví dụ .

  • Khi nào tôi nên sử dụng _create_slots()?

Khi xác định s có thể đào tạo tf.Variable ; ví dụ: khoảnh khắc thứ tự đầu tiên và thứ hai của trọng số (ví dụ Adam). Nó sử dụng add_slot().

Khá nhiều, bất cứ khi nào không sử dụng _create_slots(); nó giống như thiết lập các thuộc tính lớp, nhưng với các bước tiền xử lý bổ sung để đảm bảo tính chính xác trong sử dụng. Vì vậy, Python int, float, tf.Tensor, tf.Variable, và những người khác. (Tôi nên sử dụng nó nhiều hơn trong Keras AdamW).


Lưu ý : trong khi các trình tối ưu hóa được liên kết của tôi hoạt động chính xác và nhanh như bản gốc, mã tuân theo các thực tiễn tốt nhất của TensorFlow và vẫn có thể nhanh hơn; Tôi không đề nghị nó là "tài liệu tham khảo lý tưởng." Ví dụ, một số đối tượng Python (ví dụ int) phải là tenxơ; eta_tđược định nghĩa là a tf.Variable, nhưng ngay lập tức ghi đè lên như tf.Tensortrong _applyphương thức. Không nhất thiết phải là một vấn đề lớn, chỉ cần không có thời gian để cải tạo.


2
  1. Vâng, đây có vẻ là một lỗi tài liệu. Các tên gạch dưới trước là phương thức chính xác để ghi đè. Liên quan là Trình tối ưu hóa không phải là Máy ảnh có tất cả các định nghĩa này, nhưng không được triển khai trong lớp cơ sở 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. Tôi không biết về apply_dense. Đối với một điều, nếu bạn ghi đè lên nó, mã đề cập rằng một Phân phối trên mỗi bản sao có thể là "nguy hiểm"
    # 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.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.