গ্রেডিয়েন্টডেসেন্টঅপটিমাইজারের জন্য কীভাবে অভিযোজিত শিক্ষার হার নির্ধারণ করবেন?


104

আমি নিউরাল নেটওয়ার্ক প্রশিক্ষণের জন্য টেনসরফ্লো ব্যবহার করছি। এইভাবে আমি সূচনা করছি GradientDescentOptimizer:

init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

mse        = tf.reduce_mean(tf.square(out - out_))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)

এখানে জিনিসটি হ'ল আমি জানি না কীভাবে শিখার হারের জন্য একটি আপডেট বিধি বা তার জন্য ক্ষয়মূল মূল্য সেট করতে হয়।

আমি কীভাবে এখানে অভিযোজিত শিক্ষার হারটি ব্যবহার করতে পারি?


3
আপনি আপনার অপটিমাইজার নির্দিষ্ট করার পরে সমস্ত পরিবর্তনশীল সূচনা করার পক্ষে এটি ভাল অভ্যাস । অন্যথায় আপনি এর মতো দেখতে একটি ত্রুটি পেতে পারেন:FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power
JYun

আমি উপরোক্ত উল্লিখিত ত্রুটিটি পাচ্ছি, যখন আমি টেনসরফ্লোতে নতুন শিক্ষার হার নির্ধারণ করার চেষ্টা করছি tf.train.GradientDescentOptimizer(new_lr).minimize(loss)। দেখে মনে হচ্ছে, নতুন শিখনের হার নির্ধারণের জন্য ইতিমধ্যে প্রশিক্ষিত ভেরিয়েবলগুলি দিয়ে মডেলটি আরম্ভ করার প্রয়োজন। তবে কীভাবে এটি করা যায় তা অনুমান করতে পারছি না।
সিলাদিত্য

উত্তর:


193

প্রথমত, tf.train.GradientDescentOptimizerসমস্ত ধাপে সমস্ত ভেরিয়েবলের জন্য ধ্রুবক শেখার হার ব্যবহার করার জন্য ডিজাইন করা হয়েছে। টেনসরফ্লো বাক্সটি আউটপুট-অফ-অ্যাডাপটিভ অপটিমাইজারগুলি tf.train.AdagradOptimizerএবং এর সাথে সরবরাহ করে tf.train.AdamOptimizerএবং এগুলি ড্রপ-ইন প্রতিস্থাপন হিসাবে ব্যবহার করা যেতে পারে।

তবে, যদি আপনি অন্যথায়-ভ্যানিলা গ্রেডিয়েন্ট বংশোদ্ভূত সাথে শেখার হার নিয়ন্ত্রণ করতে চান তবে আপনি এই সিদ্ধান্তটি গ্রহণ করতে পারেন যে কনস্ট্রাক্টরের সাথেlearning_rate যুক্তিটি কোনও বস্তু হতে পারে । এটি আপনাকে প্রতিটি পদক্ষেপে শিক্ষার হারের জন্য পৃথক মান গণনা করতে দেয়, উদাহরণস্বরূপ:tf.train.GradientDescentOptimizerTensor

learning_rate = tf.placeholder(tf.float32, shape=[])
# ...
train_step = tf.train.GradientDescentOptimizer(
    learning_rate=learning_rate).minimize(mse)

sess = tf.Session()

# Feed different values for learning rate to each training step.
sess.run(train_step, feed_dict={learning_rate: 0.1})
sess.run(train_step, feed_dict={learning_rate: 0.1})
sess.run(train_step, feed_dict={learning_rate: 0.01})
sess.run(train_step, feed_dict={learning_rate: 0.01})

বিকল্পভাবে, আপনি একটি স্কেলার তৈরি করতে পারেন tf.Variableযা শিক্ষার হারকে ধরে রাখে এবং প্রতিটি সময় আপনি শিক্ষার হার পরিবর্তন করতে চান তা নির্ধারণ করুন।


দুর্দান্ত উত্তর। গ্রেডিয়েন্ট ক্লিপিংয়ের জন্য কি একই কৌশল ব্যবহার করা যেতে পারে? tf.clip_by_normক্লিপ আদর্শের জন্য কোনও [(tf.minimum(gv[0], ct), gv[1]) for gv in optimizer.compute_gradients(cost, vars)]ct = tf.placeholder('float32', shape=[])
সেন্সর

হ্যাঁ, এটি কাজ করা উচিত। (যদিও এ খুঁজছেন tf.clip_by_norm, শুধুমাত্র জিনিস ইনপুট হিসাবে একটি টেন্সর গ্রহণ থেকে এটি প্রতিরোধ হয় constant_op.constant(1.0 / clip_norm)যে অভিব্যক্তি প্রতিস্থাপন করা হচ্ছে। math_ops.inv(clip_norm)এটি একটি স্থানধারক (অথবা অন্য কোন টেন্সর) ইনপুট সঙ্গে কাজ করতে হবে।)
mrry

@ শ্রীশ্রী আপনি যেমন বলেছিলেন তেমনই করেছি এবং কিছু প্রশিক্ষণের গতিও কত ধীর। এটা কি প্রত্যাশিত?
tnq177

89

Tensorflow স্বয়ংক্রিয়ভাবে একটি শেখার হার টেন্সর একটি সূচকীয় ক্ষয় আবেদন করতে একটি অপ প্রদান করে: tf.train.exponential_decay। এটির ব্যবহারের উদাহরণের জন্য, এই লাইনটি MNIST সমাবর্তন মডেলের উদাহরণে দেখুন । তারপরে আপনার পছন্দের অপ্টিমাইজারটিতে এই ভেরিয়েবলটি লার্নিং_রেট প্যারামিটার হিসাবে সরবরাহ করতে উপরে @ মি্রির পরামর্শ ব্যবহার করুন।

দেখার মূল অংশটি হ'ল:

# Optimizer: set up a variable that's incremented once per batch and
# controls the learning rate decay.
batch = tf.Variable(0)

learning_rate = tf.train.exponential_decay(
  0.01,                # Base learning rate.
  batch * BATCH_SIZE,  # Current index into the dataset.
  train_size,          # Decay step.
  0.95,                # Decay rate.
  staircase=True)
# Use simple momentum for the optimization.
optimizer = tf.train.MomentumOptimizer(learning_rate,
                                     0.9).minimize(loss,
                                                   global_step=batch)

global_step=batchকমানোর জন্য প্যারামিটারটি নোট করুন । এটি প্রতিবার প্রশিক্ষণের সময় আপনার জন্য 'ব্যাচ' প্যারামিটারকে সহায়কভাবে বাড়িয়ে তুলতে অপ্টিমাইজারকে বলে।


3
সাধারণত, আপনি যে ভেরিয়েবলটি কল করেন batchতাকে বলা হয় global_stepএবং এটি তৈরির জন্য বেশ কয়েকটি সুবিধাজনক ফাংশন রয়েছে tf.train.create_global_step()(যা কেবল একটি পূর্ণসংখ্যা তৈরি tf.Variableকরে এবং এটি tf.GraphKeys.GLOBAL_STEPসংগ্রহে যোগ করে ) এবং tf.train.get_global_step()
লেনার হোয়েট

86

গ্রেডিয়েন্ট বংশদ্ভুত অ্যালগরিদম ধীরে ধীরে শেখার হার ব্যবহার করে যা আপনি প্রাথমিককরণের সময় সরবরাহ করতে পারেন । মিঃর দ্বারা দেখানো উপায়ে আপনি বিভিন্ন শিক্ষার হারগুলি পাশ করতে পারেন।

তবে এর পরিবর্তে আপনি আরও উন্নত অপ্টিমাইজার ব্যবহার করতে পারেন যা দ্রুত রূপান্তর হার এবং পরিস্থিতির সাথে খাপ খায়।

আমার বোঝার উপর ভিত্তি করে এখানে একটি সংক্ষিপ্ত ব্যাখ্যা দেওয়া হল:

  • গতি এসজিডিটিকে প্রাসঙ্গিক দিকনির্দেশগুলি সহ চলাচল করতে সহায়তা করে এবং অপ্রাসঙ্গিকভাবে দোলকে নরম করে। এটি কেবলমাত্র বর্তমান পদক্ষেপে পূর্বের পদক্ষেপের দিকের একটি ভগ্নাংশ যুক্ত করে। এটি সঠিক দিকনির্দেশের গতির প্রশস্ততা অর্জন করে এবং ভুল দিকগুলিতে দোলনকে নরম করে। এই ভগ্নাংশটি সাধারণত (0, 1) ব্যাপ্তিতে থাকে। এটি অভিযোজিত গতিবেগ ব্যবহার করতেও বোধগম্য হয়। একটি বৃহত গতি শেখার শুরুতে কেবল আপনার অগ্রগতি বাধাগ্রস্থ করবে, সুতরাং 0.01 এর মতো কিছু ব্যবহার করা বোধ করা উচিত এবং একবারে সমস্ত উচ্চ গ্রেডিয়েন্টগুলি অদৃশ্য হয়ে গেলে আপনি একটি বড় গতিবেগ ব্যবহার করতে পারেন। গতিকে নিয়ে একটি সমস্যা রয়েছে: আমরা যখন লক্ষ্যটির খুব কাছাকাছি থাকি, বেশিরভাগ ক্ষেত্রে আমাদের গতিবেগ খুব বেশি থাকে এবং এটি জানে না যে এটি ধীর হওয়া উচিত। এটি মিনিমাকে ঘিরে মিস করতে বা দোল করতে পারে
  • নেস্টেরভ ত্বরণী গ্রেডিয়েন্ট খুব তাড়াতাড়ি ধীর হওয়া শুরু করে এই সমস্যাটি কাটিয়ে উঠেছে । গতিবেগে আমরা প্রথমে গ্রেডিয়েন্টটি গণনা করি এবং তারপরে আমরা আগে যে গতিবেগ ছিল তা দ্বারা প্রশস্ত করে সেই দিকটিতে ঝাঁপ দাও। এনএজি একই জিনিসটি করে তবে অন্য ক্রমে: প্রথমে আমরা আমাদের সঞ্চিত তথ্যের উপর ভিত্তি করে একটি বড় লাফাই করি এবং তারপরে আমরা গ্রেডিয়েন্টটি গণনা করি এবং একটি ছোট সংশোধন করি। এই আপাতদৃষ্টিতে অপ্রাসঙ্গিক পরিবর্তন উল্লেখযোগ্য ব্যবহারিক গতিবেগ দেয়।
  • অ্যাডগ্র্যাড বা অভিযোজিত গ্রেডিয়েন্ট প্যারামিটারের উপর ভিত্তি করে শিখার হারকে অভিযোজিত করতে অনুমতি দেয়। এটি বিরল পরামিতিগুলির জন্য বৃহত্তর আপডেট এবং ঘন ঘন একটির জন্য ছোট আপডেটগুলি সম্পাদন করে। এ কারণে এটি স্পার ডেটা (এনএলপি বা চিত্রের স্বীকৃতি) এর জন্য ভাল suited আরেকটি সুবিধা হ'ল এটি মূলত শিক্ষার হার টিউন করার প্রয়োজনীয়তাটি আলোকিত করে। প্রতিটি প্যারামিটারের নিজস্ব শিক্ষার হার রয়েছে এবং অ্যালগরিদমের বিশেষত্বের কারণে শিক্ষার হার মনোোটোনিকভাবে হ্রাস পাচ্ছে। এটি সবচেয়ে বড় সমস্যার কারণ হয়ে দাঁড়ায়: এক পর্যায়ে শেখার হার এত কম যে সিস্টেমটি পড়া বন্ধ করে দেয়
  • AdaDelta শিক্ষার হার হ্রাসের সমস্যার সমাধান করে। অ্যাডগ্র্যাডে শিক্ষার হারটি বর্গমূলের সমষ্টি দ্বারা বিভাজন হিসাবে প্রায় গণনা করা হয়েছিল। প্রতিটি পর্যায়ে আপনি যোগফলের সাথে আরও একটি বর্গমূল যোগ করেন, যার ফলে ডিনোমিনেটর ক্রমাগত হ্রাস পায়। অ্যাডাডেল্টায় পূর্ববর্তী সমস্ত বর্গাকার মূলের সংমিশ্রণের পরিবর্তে এটি স্লাইডিং উইন্ডো ব্যবহার করে যা যোগফলকে হ্রাস করতে দেয়। আরএমএসপ্রপ অ্যাডাডেল্টার সাথে খুব মিল
  • অ্যাডাম বা অভিযোজিত গতি AdaDelta এর অনুরূপ একটি অ্যালগরিদম। তবে প্রতিটি পরামিতিগুলির জন্য শেখার হারগুলি সংরক্ষণ করার পাশাপাশি এটি পৃথকভাবে তাদের প্রত্যেকের জন্য গতিময় পরিবর্তনগুলিও সঞ্চয় করে

    একটি কয়েক দৃশ্য : এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


2
টেনসরফ্লোতে বিভিন্ন অপ্টিমাইজারের তুলনা করার জন্য নিম্নলিখিত আইপথন নোটবুকটি দেখুন: github.com/vsmolyakov/experiments_with_python/blob/master/chp03/… জন্য
ভাদিম স্মলিয়াভভ

আরও উন্নততর অপ্টিমাইজারগুলি "পরিবর্তে" নেওয়া হবে না তবে এটি ছাড়াও দেখুন stats.stackexchange.com/questions/200063/…
দিমা লিটুয়েভ

@ ডিমালিটুয়েভ আপনি একই সাথে দুটি অপ্টিমাইজার ব্যবহার করতে পারেন? যদি না হয় তবে আপনি অপটিমাইজার 2 এর পরিবর্তে অপ্টিমাইজার 1 ব্যবহার করছেন।
সালভাদোর ডালি

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

7

থেকে tensorflow সরকারী দস্তাবেজ

global_step = tf.Variable(0, trainable=False)
starter_learning_rate = 0.1
learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step,
                                       100000, 0.96, staircase=True)

# Passing global_step to minimize() will increment it at each step.
learning_step = (
tf.train.GradientDescentOptimizer(learning_rate)
.minimize(...my loss..., global_step=global_step))

0

আপনি যদি ইওকগুলির অন্তরগুলির জন্য নির্দিষ্ট শিক্ষার হার নির্ধারণ করতে চান 0 < a < b < c < ... । তারপরে আপনি আপনার শিক্ষার হারকে শর্তসাপেক্ষ টেনসর হিসাবে সংশ্লেষ করতে পারেন, বৈশ্বিক পদক্ষেপে শর্তসাপেক্ষে এবং এটি অপ্টিমাইজারকে সাধারণ হিসাবে খাওয়ান।

আপনি একসাথে নেস্টেটেড tf.condস্টেটমেন্ট দিয়ে এটি অর্জন করতে পারেন , তবে ট্যান্সার পুনরাবৃত্তভাবে তৈরি করা সহজ:

def make_learning_rate_tensor(reduction_steps, learning_rates, global_step):
    assert len(reduction_steps) + 1 == len(learning_rates)
    if len(reduction_steps) == 1:
        return tf.cond(
            global_step < reduction_steps[0],
            lambda: learning_rates[0],
            lambda: learning_rates[1]
        )
    else:
        return tf.cond(
            global_step < reduction_steps[0],
            lambda: learning_rates[0],
            lambda: make_learning_rate_tensor(
                reduction_steps[1:],
                learning_rates[1:],
                global_step,)
            )

তারপরে এটি ব্যবহার করার জন্য আপনাকে জানতে হবে যে একটি একক যুগে প্রশিক্ষণের কতগুলি পদক্ষেপ রয়েছে, যাতে আমরা বিশ্বব্যাপী পদক্ষেপটি সঠিক সময়ে স্যুইচ করতে পারি এবং অবশেষে আপনি চান সেই যুগ এবং শিক্ষার হারগুলি সংজ্ঞায়িত করতে পারেন। সুতরাং আমি যদি যথাক্রমে [0.1, 0.01, 0.001, 0.0001]যুগের ব্যবধানের সময় শিখার হারগুলি চাই [0, 19], [20, 59], [60, 99], [100, \infty], আমি তা করতাম:

global_step = tf.train.get_or_create_global_step()
learning_rates = [0.1, 0.01, 0.001, 0.0001]
steps_per_epoch = 225
epochs_to_switch_at = [20, 60, 100]
epochs_to_switch_at = [x*steps_per_epoch for x in epochs_to_switch_at ]
learning_rate = make_learning_rate_tensor(epochs_to_switch_at , learning_rates, global_step)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.