বোল্টজম্যান মেশিনে ওজন শিখছি


14

আমি কীভাবে বোল্টজম্যান মেশিনগুলি কাজ করে তা বোঝার চেষ্টা করছি, তবে আমি কীভাবে ওজন শিখি তা পুরোপুরি নিশ্চিত নই, এবং এর একটি পরিষ্কার বিবরণ পাইনি been নিম্নলিখিতটি কি সঠিক? (এছাড়াও, যে কোনও ভাল বল্টজমান মেশিনের ব্যাখ্যার দিকে নির্দেশকগুলিও দুর্দান্ত।

আমাদের কাছে দৃশ্যমান ইউনিটগুলির একটি সেট রয়েছে (উদাহরণস্বরূপ, কোনও ছবিতে কালো / সাদা পিক্সেলের সাথে সম্পর্কিত) এবং লুকানো ইউনিটের একটি সেট। ওজনগুলি কোনওভাবে শুরু করা হয় (উদাহরণস্বরূপ, [-0.5, 0.5] থেকে অভিন্নভাবে), এবং তারপরে কিছু থামার নিয়ম না পৌঁছানো পর্যন্ত আমরা নিম্নলিখিত দুটি পর্যায়ের মধ্যে পর্যায়ক্রমে:

  1. ক্ল্যাম্পড ফেজ - এই পর্যায়ে দৃশ্যমান ইউনিটগুলির সমস্ত মানগুলি স্থির থাকে, সুতরাং আমরা কেবল লুকানো ইউনিটগুলির রাজ্য আপডেট করি (বোল্টজম্যান স্টোকাস্টিক অ্যাক্টিভেশন নিয়ম অনুসারে)। নেটওয়ার্কটি ভারসাম্যহীন না হওয়া পর্যন্ত আমরা আপডেট করি। একবার আমরা সুস্থিতি পৌঁছানোর, আমরা আপডেট অবিরত আরো কয়েকবার (কিছু পূর্বনির্ধারিত জন্য এন ), গড় সম্পর্কে অবগত থাকার এক্স আমি এক্স (যেখানে এক্স আমি , এক্স নোড রাজ্য আমি এবং )। এই এন ভারসাম্য আপডেটের পরে , আমরা w i j = w i j + আপডেট করি iএনএনএক্সআমিএক্সএক্সআমি,এক্সআমিএন, যেখানেসিকিছু শেখার হার। (বা, শেষে ব্যাচ আপডেট করার পরিবর্তে, আমরা সাম্যাবসিত পদক্ষেপের পরে আপডেট করব?)Wআমি=Wআমি+ +1সিএকজনবনামRএকটি(এক্সআমিএক্স)সি

  2. ফ্রি ফেজ - এই পর্যায়ে, সমস্ত ইউনিটের রাজ্য আপডেট করা হয়। একবার আমরা ভারসাম্য অর্জন করার পরে, একইভাবে আমরা আরও বেশি বার এন'কে আপডেট করা চালিয়ে যাই, তবে শেষে পারস্পরিক সম্পর্ক যুক্ত করার পরিবর্তে, আমরা বিয়োগ করি: Wআমি=Wআমি-1সিএকজনবনামRএকটি(এক্সআমিএক্স)

সুতরাং আমার প্রধান প্রশ্নগুলি হ'ল:

  1. যখনই আমরা ক্ল্যাম্পড পর্যায়ে আছি, আমরা কী শিখতে চাই সেই ধরণের এককগুলিতে আমরা দৃশ্যমান ইউনিটগুলিকে পুনরায় সেট করব (কিছুটা ফ্রিকোয়েন্সি যা সেই প্যাটার্নটির গুরুত্ব উপস্থাপন করে), বা আমরা যে অবস্থায় ছিল দৃশ্যমান ইউনিটগুলি সেগুলিতে ছেড়ে দেই? মুক্ত পর্ব শেষে?

  2. আমরা কি প্রতিটি পর্বের শেষে ওজনের একটি ব্যাচ আপডেট করি, বা পর্যায়ের প্রতিটি ভারসাম্য পদক্ষেপে ওজন আপডেট করি? (বা, হয় এক জরিমানা?)

উত্তর:


6

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

এরপরে আপনি মডেলটিকে নিখরচায় এবং কল্পনা করতে দিন। এটি শাট-ইন হয়ে উঠবে এবং আক্ষরিক অর্থে এমন কিছু জিনিস দেখা দেবে যা তার মন উত্পন্ন করে এবং এই চিত্রগুলির উপর ভিত্তি করে মনের নতুন রাজ্য তৈরি করে।

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

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

http://deeplearning.net/tutorial/rbm.html#energy-based-models-ebm

এটি মজার বিষয় যে স্বজ্ঞাত স্বচ্ছ আপডেটের নিয়মগুলি মডেলটির দ্বারা ডেটা উত্পন্ন করার লগ-সম্ভাবনার ফর্ম উদ্ভূত হয়।

এই অন্তর্দৃষ্টিগুলি মাথায় রেখে আপনার প্রশ্নের উত্তর দেওয়া এখন সহজ:

  1. আমাদের দৃশ্যমান ইউনিটগুলিকে কিছু ডেটাতে পুনরায় সেট করতে হবে আমরা মডেলটিকে বিশ্বাস করতে চাই।

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

আপনি যদি ইবিএম, বিএম এবং আরবিএম সম্পর্কে আপনার অনুজ্ঞার উন্নতি করতে চান তবে আমি এই বিষয়ে জেফ্রি হিন্টনের কিছু বক্তৃতা দেখার পরামর্শ দিচ্ছি, তার কিছু ভাল উপমা রয়েছে।


2
  1. হ্যাঁ, "আমরা যে প্যাটার্নগুলি শিখতে চাই তার মধ্যে আমরা দৃশ্যমান ইউনিটগুলিকে পুনরায় সেট (ক্ল্যাম্প) করব (কিছুটা ফ্রিকোয়েন্সি যা সেই ধরণের গুরুত্বকে উপস্থাপন করে)"।

  2. হ্যাঁ, "আমরা প্রতিটি পর্বের শেষে ওজনের একটি ব্যাচ আপডেট করি" " আমি মনে করি না যে "ধাপের প্রতিটি ভারসাম্য পদক্ষেপের ওজনগুলি" আপডেট করা দ্রুত অভিসারণের দিকে পরিচালিত করবে কারণ তাত্ক্ষণিক ত্রুটির দ্বারা নেটওয়ার্ক "বিভ্রান্ত হয়ে পড়ে" - আমি বল্টজম্যান মেশিনগুলি সেভাবে প্রয়োগ করেছি, এবং আমি মনে করি এটি খুব ভালভাবে কাজ করে না। যতক্ষণ না আমি এটিকে ব্যাচের আপডেটে পরিবর্তন করি।


0

পল ইভানভের কোডের ভিত্তিতে বোল্টজমান মেশিনগুলির জন্য পাইথন কোডের নমুনা এখানে

http://redwood.berkeley.edu/wiki/VS265:_Homework_assignments

import numpy as np

def extract_patches(im,SZ,n):
    imsize,imsize=im.shape;
    X=np.zeros((n,SZ**2),dtype=np.int8);
    startsx= np.random.randint(imsize-SZ,size=n)
    startsy=np.random.randint(imsize-SZ,size=n)
    for i,stx,sty in zip(xrange(n), startsx,startsy):
        P=im[sty:sty+SZ, stx:stx+SZ];
        X[i]=2*P.flat[:]-1;
    return X.T

def sample(T,b,n,num_init_samples):
    """
    sample.m - sample states from model distribution

    function S = sample(T,b,n, num_init_samples)

    T:                weight matrix
    b:                bias
    n:                number of samples
    num_init_samples: number of initial Gibbs sweeps
    """
    N=T.shape[0]

    # initialize state vector for sampling
    s=2*(np.random.rand(N)<sigmoid(b))-1

    for k in xrange(num_init_samples):
        s=draw(s,T,b)

    # sample states
    S=np.zeros((N,n))
    S[:,0]=s
    for i in xrange(1,n):
        S[:,i]=draw(S[:,i-1],T,b)

    return S

def sigmoid(u):
    """
    sigmoid.m - sigmoid function

    function s = sigmoid(u)
    """
    return 1./(1.+np.exp(-u));

def draw(Sin,T,b):
    """
    draw.m - perform single Gibbs sweep to draw a sample from distribution

    function S = draw(Sin,T,b)

    Sin:      initial state
    T:        weight matrix
    b:        bias
    """
    N=Sin.shape[0]
    S=Sin.copy()
    rand = np.random.rand(N,1)
    for i in xrange(N):
        h=np.dot(T[i,:],S)+b[i];
        S[i]=2*(rand[i]<sigmoid(h))-1;

    return S

def run(im, T=None, b=None, display=True,N=4,num_trials=100,batch_size=100,num_init_samples=10,eta=0.1):
    SZ=np.sqrt(N);
    if T is None: T=np.zeros((N,N)); # weight matrix
    if b is None: b=np.zeros(N); # bias

    for t in xrange(num_trials):
        print t, num_trials
        # data statistics (clamped)
        X=extract_patches(im,SZ,batch_size).astype(np.float);
        R_data=np.dot(X,X.T)/batch_size;
        mu_data=X.mean(1);

        # prior statistics (unclamped)
        S=sample(T,b,batch_size,num_init_samples);
        R_prior=np.dot(S,S.T)/batch_size;
        mu_prior=S.mean(1);

        # update params
        deltaT=eta*(R_data - R_prior);
        T=T+deltaT;

        deltab=eta*(mu_data - mu_prior);
        b=b+deltab;


    return T, b

if __name__ == "__main__": 
    A = np.array([\
    [0.,1.,1.,0],
    [1.,1.,0, 0],
    [1.,1.,1.,0],
    [0, 1.,1.,1.],
    [0, 0, 1.,0]
    ])
    T,b = run(A,display=False)
    print T
    print b

এটি ডেটা প্যাচ তৈরি করে কাজ করে তবে এটিকে সংশোধন করা যায় তাই কোডটি সমস্ত ডেটাতে সর্বদা কাজ করে।

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