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


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.