কব্জ হ্রাসের গ্রেডিয়েন্ট


25

আমি মৌলিক গ্রেডিয়েন্ট বংশোদ্ভূতিকে প্রয়োগ করার চেষ্টা করছি এবং আমি এটি হিন্জ লস ফাংশন অর্থাৎ । তবে, কব্জির ক্ষতির lossালু সম্পর্কে আমি বিভ্রান্ত। আমি এটা যে ছাপ অধীনlhinge=max(0,1y xw)

wlhinge={y xif y xw<10if y xw1

কিন্তু এই ম্যাট্রিক্সটি return বোল্ডসিম্বল {x as এর মতো একই আকারে ফিরে আসে না x? আমি ভেবেছিলাম আমরা দৈর্ঘ্যের একটি ভেক্টর \ বোল্ডসাইম্বল {ডাব্লু} ফিরিয়ে আনতে চাইছি w? স্পষ্টতই, আমি কোথাও কিছু বিভ্রান্ত হয়ে পড়েছি। কেউ কি এখানে সঠিক দিকে নির্দেশ করতে পারে?

আমি যদি আমার কাজের বিবরণটি পরিষ্কার না করতাম তবে আমি কিছু বেসিক কোড অন্তর্ভুক্ত করেছি

#Run standard gradient descent
gradient_descent<-function(fw, dfw, n, lr=0.01)
{
    #Date to be used
    x<-t(matrix(c(1,3,6,1,4,2,1,5,4,1,6,1), nrow=3))
    y<-c(1,1,-1,-1)
    w<-matrix(0, nrow=ncol(x))

    print(sprintf("loss: %f,x.w: %s",sum(fw(w,x,y)),paste(x%*%w, collapse=',')))
    #update the weights 'n' times
    for (i in 1:n)
    {
      w<-w-lr*dfw(w,x,y)
      print(sprintf("loss: %f,x.w: %s",sum(fw(w,x,y)),paste(x%*%w,collapse=',')))
    }
}
#Hinge loss
hinge<-function(w,x,y) max(1-y%*%x%*%w, 0)
d_hinge<-function(w,x,y){ dw<-t(-y%*%x); dw[y%*%x%*%w>=1]<-0; dw}
gradient_descent(hinge, d_hinge, 100, lr=0.01)

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

#y=1,1,-1,-1
"loss: 1.000000, x.w: 0,0,0,0"
"loss: 0.750000, x.w: 0.06,-0.1,-0.08,-0.21"
"loss: 0.500000, x.w: 0.12,-0.2,-0.16,-0.42"
"loss: 0.250000, x.w: 0.18,-0.3,-0.24,-0.63"
"loss: 0.000000, x.w: 0.24,-0.4,-0.32,-0.84"
"loss: 0.000000, x.w: 0.24,-0.4,-0.32,-0.84"
"loss: 0.000000, x.w: 0.24,-0.4,-0.32,-0.84"
...  

গ্রেডিয়েন্টটি একটি ভেক্টর যেহেতু আপনার ক্ষতির ফাংশনের আসল মান রয়েছে।
Wok

3
আপনার ফাংশন সর্বত্র পৃথক নয়।
রবিন গিরার্ড

2
রবিন নোট হিসাবে কব্জির ক্ষতি x = 1 এ পৃথক নয়। এর ঠিক অর্থ হল যে আপনাকে সাব-গ্রেডিয়েন্ট বংশদ্ভুত অ্যালগরিদম ব্যবহার করতে হবে
অ্যালেক্স ক্রিমার

উত্তর:


27

থেকে গ্রেডিয়েন্ট আমরা সম্মানের সঙ্গে হ্রাস পার্থক্য পেতে তম উপাদান ।ডাব্লুiw

পদ কবজা ক্ষতি লেখা যেমন যেখানে এবংf ( g ( w ) ) f ( z ) = সর্বোচ্চ ( 0 , 1 - y z ) g ( w ) = xwwf(g(w))f(z)=max(0,1y z)g(w)=xw

চেইন রুল ব্যবহার করে আমরা পাই

wif(g(w))=fzgwi

প্রথম ডেরাইভেটিভ শব্দটির মূল্যায়ন হয়ে গেলে when , এবং 0 যখন । দ্বিতীয় ডেরিভেটিভ শব্দটি । সুতরাং শেষ পর্যন্ত আপনি পাবেন - yg(w)=xwyxw > 1 x i f ( g ( w ) )xw<1xw>1xi

f(g(w))wi={y xiif y xw<10if y xw>1

যেহেতু এর উপাদানগুলির উপর বিস্তৃত তাই আপনি উপরেরটি ভেক্টর পরিমাণ হিসাবে দেখতে পারেন এবং হিসাবেx ix (w(w1,w2,)


ধন্যবাদ! এটি আমার জন্য বিষয়গুলি পরিষ্কার করে দেয়। এখন আমি ঠিক এটি ব্যবহারিক সেটিংসে পেতে হবে। উপরোক্ত কোডটি কেন কাজ করে না এমন কোনও ধারণা থাকতে পারে না? এটি 1 টি থেকে শুরু হওয়া এবং প্রতিবার 0.25 এর নিচে নেমে এবং 0 এ রূপান্তর করে 4 টি পুনরাবৃত্তিতে রূপান্তরিত হবে বলে মনে হয় তবে এটির ওজনগুলি বেশ ভুল বলে মনে হচ্ছে।
brcs

1
এটি আপনার প্রশিক্ষণ ডেটাতে কী ভবিষ্যদ্বাণী দেয় তা আপনি পরীক্ষা করতে পারেন। যদি ক্ষতি শূন্যে চলে যায়, সমস্ত দৃষ্টান্ত পুরোপুরি শ্রেণিবদ্ধ করা উচিত
ইয়ারোস্লাভ বুলাটোভ

এটি বাইনারি শ্রেণিবদ্ধকরণের ক্ষেত্রে। আপনি কি কব্জা ক্ষতি ব্যবহার করে বহু শ্রেণীর শ্রেণিবিন্যাসের গ্রেডিয়েন্টের জন্য অনুকরণ দিতে পারেন?
শ্যামকাদ্দকা

12

এটি 3 বছর দেরীতে হলেও এখনও কারও পক্ষে প্রাসঙ্গিক হতে পারে ...

যাক পয়েন্ট একটি নমুনা বোঝাতে এবং সংশ্লিষ্ট লেবেলের সেট । আমরা একটি hyperplane এটি অনুসন্ধান যে মোট কবজা-ক্ষতির কমান হবে: খুঁজতে মোট কবজা ক্ষতির ব্যুৎপন্ন নিতে। প্রতিটি উপাদানটির গ্রেডিয়েন্ট: x আমিআর Y আমি{ - 1 , 1 } W W * = argmin  W এল আমি এন জি এস ( W ) = argmin  W Σ আমি আমি 1 -SxiRdyi{1,1}wwl h i n g e

w=argmin wLShinge(w)=argmin wilhinge(w,xi,yi)=argmin wimax{0,1yiwx}
w
lhingew={0yiwx1yixyiwx<1

যোগফলের গ্রেডিয়েন্ট একটি গ্রেডিয়েন্টের যোগফল। পাইথনের উদাহরণ, যা খুঁজে পেতে জিডি ব্যবহার করে কবজ-ক্ষতি সর্বোত্তম বিচ্ছিন্ন হাইপারপ্লেন অনুসরণ করে (এটি সম্ভবত সবচেয়ে কার্যকর কোড নয়, তবে এটি কাজ করে)

LShingew=ilhingew
import numpy as np
import matplotlib.pyplot as plt

def hinge_loss(w,x,y):
    """ evaluates hinge loss and its gradient at w

    rows of x are data points
    y is a vector of labels
    """
    loss,grad = 0,0
    for (x_,y_) in zip(x,y):
        v = y_*np.dot(w,x_)
        loss += max(0,1-v)
        grad += 0 if v > 1 else -y_*x_
    return (loss,grad)

def grad_descent(x,y,w,step,thresh=0.001):
    grad = np.inf
    ws = np.zeros((2,0))
    ws = np.hstack((ws,w.reshape(2,1)))
    step_num = 1
    delta = np.inf
    loss0 = np.inf
    while np.abs(delta)>thresh:
        loss,grad = hinge_loss(w,x,y)
        delta = loss0-loss
        loss0 = loss
        grad_dir = grad/np.linalg.norm(grad)
        w = w-step*grad_dir/step_num
        ws = np.hstack((ws,w.reshape((2,1))))
        step_num += 1
    return np.sum(ws,1)/np.size(ws,1)

def test1():
    # sample data points
    x1 = np.array((0,1,3,4,1))
    x2 = np.array((1,2,0,1,1))
    x  = np.vstack((x1,x2)).T
    # sample labels
    y = np.array((1,1,-1,-1,-1))
    w = grad_descent(x,y,np.array((0,0)),0.1)
    loss, grad = hinge_loss(w,x,y)
    plot_test(x,y,w)

def plot_test(x,y,w):
    plt.figure()
    x1, x2 = x[:,0], x[:,1]
    x1_min, x1_max = np.min(x1)*.7, np.max(x1)*1.3
    x2_min, x2_max = np.min(x2)*.7, np.max(x2)*1.3
    gridpoints = 2000
    x1s = np.linspace(x1_min, x1_max, gridpoints)
    x2s = np.linspace(x2_min, x2_max, gridpoints)
    gridx1, gridx2 = np.meshgrid(x1s,x2s)
    grid_pts = np.c_[gridx1.ravel(), gridx2.ravel()]
    predictions = np.array([np.sign(np.dot(w,x_)) for x_ in grid_pts]).reshape((gridpoints,gridpoints))
    plt.contourf(gridx1, gridx2, predictions, cmap=plt.cm.Paired)
    plt.scatter(x[:, 0], x[:, 1], c=y, cmap=plt.cm.Paired)
    plt.title('total hinge loss: %g' % hinge_loss(w,x,y)[0])
    plt.show()

if __name__ == '__main__':
    np.set_printoptions(precision=3)
    test1()

আমি বাইনারি শ্রেণিবদ্ধকরণের ক্ষেত্রে এটি। আপনি কি কব্জা ক্ষতি ব্যবহার করে বহু শ্রেণীর শ্রেণিবিন্যাসের গ্রেডিয়েন্টের জন্য অনুকরণ দিতে পারেন?
শ্যামকাদ্দকা

1

আমি আপনার কোড স্থির করেছি। মূল সমস্যাটি আপনার কব্জা এবং ডি_হিং ফাংশনগুলির সংজ্ঞা। এগুলি একবারে একটি করে নমুনা প্রয়োগ করা উচিত। পরিবর্তে আপনার সংজ্ঞা সর্বাধিক গ্রহণের আগে সমস্ত নমুনা একত্রিত করে।

#Run standard gradient descent
gradient_descent<-function(fw, dfw, n, lr=0.01)
{
    #Date to be used
    x<-t(matrix(c(1,3,6,1,4,2,1,5,4,1,6,1), nrow=3))
    y<-t(t(c(1,1,-1,-1)))
    w<-matrix(0, nrow=ncol(x))


    print(sprintf("loss: %f,x.w: %s",sum(mapply(function(xr,yr) fw(w,xr,yr), split(x,row(x)),split(y,row(y)))),paste(x%*%w, collapse=',')))
    #update the weights 'n' times
    for (i in 1:n)
    {
      w<-w-lr*dfw(w,x,y)
      print(sprintf("loss: %f,x.w: %s",sum(mapply(function(xr,yr) fw(w,xr,yr), split(x,row(x)),split(y,row(y)))),paste(x%*%w,collapse=',')))
    }
}

#Hinge loss
hinge<-function(w,xr,yr) max(1-yr*xr%*%w, 0)
d_hinge<-function(w,x,y){ dw<- apply(mapply(function(xr,yr) -yr * xr * (yr * xr %*% w < 1),split(x,row(x)),split(y,row(y))),1,sum); dw}
gradient_descent(hinge, d_hinge, 100, lr=0.01)

রূপান্তর করতে আমার n = 10000 দরকার।

[1] "লোকসান: 0.090000, এক্সডাব্লু: 1.0899999999999995,0.90999999999955, -1.19000000000008, -1.69000000000011" [1] "ক্ষতি: 0.100000, এক্সডাব্লু: 1.33999999999995,1.1199999999999, x00000000000 0.939999999999948,0.829999999999905, -1,32000000000007, -1,77000000000011 "[1]" ক্ষতি: 0,370000, xw: 1.64999999999995,1.2899999999999, -0,630000000000075, -1,25000000000011 "[1]" ক্ষতি: 0,000000, xw: 1.24999999999995,0.999999999999905, -1,05000000000008, -1,60000000000011 " [1] "লোকসান: 0.240000, এক্সডাব্লু: 1.499999999999955112020999999999, -0.760000000000075, -1.33000000001111" [1] "ক্ষতি: 0.080000, এক্সডব্লিউ: 1.09900999999550019199999999905, "10000 1.34999999999995,1.1299999999999, -0,890000000000075, -1,41000000000011 "[1] "লোকসান: 0.210000, এক্সডাব্লু: 0.949999999999948,0.83999999999955, -1.31000000000007, -1.760000000011" [1] "ক্ষতি: 0.380000, এক্সডব্লিউ: 1.65999999999995,1.29999999999," 0,0000000000000000 " 1.2599999999999995,1.0099999999999, -1.0400000000000008, -1.59000000000011 "[1]" ক্ষতি: 0.000000, xw: 1.25999999999995,1.0099999999999, -1.04000000000008, -1.59000000001111 "


3
লোকেরা, গ্রেডিয়েন্ট বংশোদ্ভূতটি কেবলমাত্র বিশ্বের অপ্টিমাইজেশান অ্যালগরিদম সম্পর্কে রয়েছে এবং যখন কোনও পছন্দ না থাকে কেবল তখনই ব্যবহার করা উচিত। একটি বিশ্বাসের অঞ্চল বা লাইন অনুসন্ধান কোয়াশি-নিউটন অ্যালগরিদম, অবজেক্টিভ ফাংশন মান এবং গ্রেডিয়েন্ট ব্যবহার করে জল থেকে গ্রেডিয়েন্ট বংশোদ্ভূত উত্সাহিত করবে এবং আরও অনেক নির্ভরযোগ্যভাবে রূপান্তরিত হবে। আপনি কী করছেন এবং খুব কম লোক যা করেন তা না জানলে আপনার নিজের সমাধানকারী লিখবেন না।
মার্ক এল। স্টোন

2
আমি উভয় বক্তব্য একমত হবে। তবে বিভিন্ন স্বাদের সাথে গ্রেডিয়েন্ট বংশোদ্ভূত পরিবেশিত পরিবেশে প্রয়োগ করা অনেক সহজ, কমপক্ষে সেখানে উপস্থিত ওপেন সোর্স লাইব্রেরি অনুসারে।
জন জিয়াং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.