16

Chcę napisać nowy algorytm optymalizacji dla mojej sieci na Tensorflow. Mam nadzieję, że zaimplementuję Levenberg Marquardt optimization algorithm, który teraz jest wyłączony z TF API. Znalazłem słabą dokumentację dotyczącą pisania niestandardowego optymalizatora, więc pytam, czy ktoś może udzielić mi jakiejkolwiek porady. Dzięki.Jak utworzyć optymalizator w Tensorflow

+0

czynniki tłumiące mają nic wspólnego z przepływem tensor. Sieci neuronowe nie potrzebują regresji grzbietów ... Nie rozumiem tej społeczności. +1 za wystrzelenie dobrego, mocnego pytania. Udzielenie mi dobrej odpowiedzi wymagałoby trochę nauki i to jest mój ulubiony aspekt SO. – kpie

+0

Czy kiedykolwiek udało Ci się stworzyć niestandardowy optymalizator w TensorFlow? Jeśli masz link do swojego kodu przez github lub coś, co byłoby super pomocne! – Pinocchio

+1

Odpowiedź dga jest przydatna, jeśli chcesz zrobić optymalizatory, które są (prawdopodobnie) szybsze i wielokrotnego użytku między interfejsami językowymi TensorFlow, ale jeśli chcesz zaimplementować optymalizator w Pythonie do użycia w Pythonie, sprawdź "ExternalOptimizerInterface": https: // www.tensorflow.org/api_docs/python/tf/contrib/opt/ExternalOptimizerInterface – GEOFBOT

Odpowiedz

12

Najprostszym przykładem optymalizatora jest prawdopodobnie gradient descent optimizer. Pokazuje, jak tworzy się instancja podstawowego optimizer class. Dokumentacja klasy podstawowej optymalizatora wyjaśnia, co robią te metody.

Strona pythona optymalizatorów dodaje nowe węzły do ​​wykresu, który oblicza i stosuje gradienty, które są propagowane wstecz. Dostarcza parametry, które zostają przekazane do ops i wykonuje niektóre zarządzanie wysokopoziomowe optymalizatora. Następnie potrzebujesz rzeczywistego "Zastosuj" op.

Ops ma zarówno python, jak i składnik C++. Pisanie treningu operacyjnego jest takie samo (ale specjalistyczne) jak general process of adding an Op to TensorFlow.

Dla przykładowego zestawu operacji szkoleniowych, które obliczają i stosują gradienty, zobacz python/training/training_ops.py - jest to klej Python do rzeczywistych operacji treningowych. Zauważ, że tutaj kod dotyczy głównie interferencji kształtu - obliczenia będą dokonywane w C++.

Właściwa matematyka do zastosowania gradientów jest obsługiwana przez Operę (przypominającą, że ogólnie operacje są napisane w C++). W tym przypadku stosy gradientów ops są zdefiniowane w core/kernels/training_ops.cc. Można zobaczyć, na przykład, realizacja ApplyGradientDescentOp tam, który odwołuje się do ApplyGradientDescent funktora:

var.device(d) -= grad * lr(); 

Realizacja samego op następuje wdrożenie jakiegokolwiek innego op opisaną w docs dodanie-an-op .

+2

Dzięki za wyjaśnienie. Czy istnieje powód, dla którego robi się to w C++? Nie rozumiem, jak komponowanie tego prostego obliczenia (mnożenie skalarne i odejmowanie elementarne) w C++ powinno być znacznie szybsze niż w Pythonie. W przypadku optymalizatorów prototypów byłoby użyteczne robienie wszystkiego w Pythonie. Czy wiesz, czy to możliwe? – danijar

+2

@danijar Prostym powodem jest to, że Python jest tylko jednym z dostępnych interfejsów Tensorflow. Implementacja podstawowych mechanizmów w C++ pomaga w tworzeniu interfejsów dla innych języków. –

+1

Niestety kod Tensorflow jest naprawdę gęsty i mylący. Więc gdzie dokładnie w kodzie można znaleźć to, co matematycznie robią operacje 'apply_gradient'? Na przykład czytałem https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/optimizer.py i wydaje się, że nie ma żadnych wyrażeń matematycznych, ani też kodu gradientowego optymalizator https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/gradient_descent.py. Gdzie mogę zobaczyć, w jaki sposób stosowany jest gradient zastosowania? – Pinocchio

3

Przed uruchomieniem sesji Tensorflow należy zainicjować Optimizer jak widać poniżej:

# Gradient Descent 
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) 

tf.train.GradientDescentOptimizer jest obiektem klasy GradientDescentOptimizer i jak sama nazwa mówi, implementuje algorytm gradientowego zniżania.

Sposób zminimalizować() jest wywoływana z „koszt” jako parametr składa się z dwóch metod compute_gradients() a następnie apply_gradients().

W przypadku większości (niestandardowych) wdrożeń optymalizatora należy zastosować metodę apply_gradients() apply_gradients().

Metoda ta opiera się na (nowy) Optimizer (klasa), które będziemy tworzyć, wdrażać następujące metody: _create_slots(), _prepare(), _apply_dense() i() _apply_sparse.

  • _create_slots() i _prepare() tworzenia i inicjalizacji dodatkowe zmienne, takie jak pęd.

  • _apply_dense() i _apply_sparse() realizacji rzeczywistych OPS które zmiana zmienne.

Operacje są zazwyczaj napisane w C++. Bez potrzeby samodzielnego zmieniania nagłówka C++ nadal można zwrócić owinięcie pythona niektórych operacji za pomocą tych metod. Odbywa się to w następujący sposób:

def _create_slots(self, var_list): 
    # Create slots for allocation and later management of additional 
    # variables associated with the variables to train. 
    # for example: the first and second moments. 
    ''' 
    for v in var_list: 
     self._zeros_slot(v, "m", self._name) 
     self._zeros_slot(v, "v", self._name) 
    ''' 
def _apply_dense(self, grad, var): 
    #define your favourite variable update 
    # for example: 
    ''' 
    # Here we apply gradient descents by substracting the variables 
    # with the gradient times the learning_rate (defined in __init__) 
    var_update = state_ops.assign_sub(var, self.learning_rate * grad) 
    ''' 
    #The trick is now to pass the Ops in the control_flow_ops and 
    # eventually groups any particular computation of the slots your 
    # wish to keep track of: 
    # for example:  
    ''' 
    m_t = ...m... #do something with m and grad 
    v_t = ...v... # do something with v and grad 
    ''' 
    return control_flow_ops.group(*[var_update, m_t, v_t]) 

celu bardziej szczegółowego wyjaśnienia z przykładem, zobacz ten blogu https://www.bigdatarepublic.nl/custom-optimizer-in-tensorflow/

Powiązane problemy