আমাদের পাইটর্চে শূন্য_গ্রাড () কেন কল করতে হবে?


112

zero_grad()প্রশিক্ষণের সময় পদ্ধতিটি কল করা প্রয়োজন। তবে ডকুমেন্টেশন খুব বেশি সহায়ক নয়

|  zero_grad(self)
|      Sets gradients of all model parameters to zero.

আমাদের কেন এই পদ্ধতিটি কল করার দরকার আছে?

উত্তর:


144

ইন PyTorch, ব্যাকপ্রপ্রেগেশন শুরু করার আগে আমাদের গ্রেডিয়েন্টগুলি শূন্যে সেট করতে হবে কারণ পাইটর্চ পরবর্তী পশ্চাদপদ পাসগুলিতে গ্রেডিয়েন্টগুলি জমা করে । আরএনএন প্রশিক্ষণ নেওয়ার সময় এটি সুবিধাজনক। সুতরাং, ডিফল্ট ক্রিয়াটি হ'ল প্রতিটি কলে গ্রেডিয়েন্টগুলি জমা করা (অর্থাত্ যোগফল)loss.backward() ।

এ কারণে, আপনি যখন আপনার প্রশিক্ষণ লুপটি শুরু করেন, আদর্শভাবে আপনার উচিত zero out the gradientsযাতে আপনি সঠিকভাবে প্যারামিটার আপডেটটি করেন। অন্য গ্রেডিয়েন্টটি ন্যূনতম (বা সর্বাধিক , উদ্দেশ্য সর্বাধিকের ক্ষেত্রে) এর দিকে লক্ষ্যযুক্ত দিক ব্যতীত অন্য কোনও দিকে নির্দেশ করবে ।

এখানে একটি সহজ উদাহরণ:

import torch
from torch.autograd import Variable
import torch.optim as optim

def linear_model(x, W, b):
    return torch.matmul(x, W) + b

data, targets = ...

W = Variable(torch.randn(4, 3), requires_grad=True)
b = Variable(torch.randn(3), requires_grad=True)

optimizer = optim.Adam([W, b])

for sample, target in zip(data, targets):
    # clear out the gradients of all Variables 
    # in this optimizer (i.e. W, b)
    optimizer.zero_grad()
    output = linear_model(sample, W, b)
    loss = (output - target) ** 2
    loss.backward()
    optimizer.step()

বিকল্পভাবে, আপনি যদি ভ্যানিলা গ্রেডিয়েন্ট বংশোদ্ভূত করছেন , তবে:

W = Variable(torch.randn(4, 3), requires_grad=True)
b = Variable(torch.randn(3), requires_grad=True)

for sample, target in zip(data, targets):
    # clear out the gradients of Variables 
    # (i.e. W, b)
    W.grad.data.zero_()
    b.grad.data.zero_()

    output = linear_model(sample, W, b)
    loss = (output - target) ** 2
    loss.backward()

    W -= learning_rate * W.grad.data
    b -= learning_rate * b.grad.data

দ্রষ্টব্য : গ্রেডিয়েন্টগুলির সঞ্চিতি (অর্থাত্ যোগফল ) যখন টেনসারে .backward()ডাকা হয়loss ।


4
আপনাকে অনেক ধন্যবাদ, এটি সত্যিই সহায়ক! টেনসরফের আচরণ আছে কিনা তা আপনি কি জানবেন?
— লেজারটি

শুধু নিশ্চিত হতে .. আপনি যদি এটি না করেন, তবে আপনি একটি বিস্ফোরিত গ্রেডিয়েন্ট সমস্যার মধ্যে চলে যাবেন, তাই না?
— zwep

4
@Zwep যদি আমরা গ্রেডিয়েন্টগুলি সংগ্রহ করি তবে এর অর্থ এই নয় যে তাদের দৈর্ঘ্য বৃদ্ধি পায়: গ্রেডিয়েন্টের সাইনটি উল্টতে থাকে তবে একটি উদাহরণ হবে। সুতরাং এটি গ্যারান্টি দেয় না যে আপনি বিস্ফোরিত গ্রেডিয়েন্ট সমস্যার মধ্যে চলে যাবেন। এছাড়াও, আপনি সঠিকভাবে শূন্য না করলেও বিস্ফোরক গ্রেডিয়েন্টগুলি বিদ্যমান।
— টম রথ

আপনি যখন ভ্যানিলা গ্রেডিয়েন্ট বংশোদ্ভূত হন তখন আপনি ওজন আপডেট করার চেষ্টা করার সময় কোনও "লিফ ভেরিয়েবলের প্রয়োজন যা কোনও স্থানের অভ্যন্তরে গ্রেড ব্যবহার করা হয়" ত্রুটিটি পান না?
— মিউআস

1

আপনি যদি ত্রুটি (বা ক্ষয়) হ্রাসের জন্য গ্রেডিয়েন্ট পদ্ধতি ব্যবহার করেন তবে শূন্য_গ্রাড () শেষ ধাপের ক্ষতি ছাড়াই লুপিং পুনরায় চালু করবে you

আপনি যদি শূন্য_গ্রাড () ব্যবহার না করেন তবে ক্ষতির পরিমাণ হ্রাস হবে প্রয়োজনীয় হিসাবে বৃদ্ধি পাবে না

উদাহরণস্বরূপ আপনি যদি শূন্য_গ্রাড () ব্যবহার করেন তবে আপনি নিম্নলিখিত আউটপুটটি দেখতে পাবেন:

model training loss is 1.5
model training loss is 1.4
model training loss is 1.3
model training loss is 1.2

আপনি যদি শূন্য_গ্রাড () ব্যবহার না করেন তবে নীচের আউটপুটটি পাবেন:

model training loss is 1.4
model training loss is 1.9
model training loss is 2
model training loss is 2.8
model training loss is 3.5
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.