볼츠만 머신에서 학습 가중치


14

Boltzmann 기계가 어떻게 작동하는지 이해하려고 노력하고 있지만 무게가 어떻게 학습되는지 확실하지 않으며 명확한 설명을 찾을 수 없었습니다. 다음이 맞습니까? (또한 좋은 Boltzmann 기계 설명에 대한 포인터도 좋습니다.)

우리는 가시적 인 단위 (예를 들어, 이미지의 흑백 픽셀에 해당)와 숨겨진 단위의 세트를 가지고 있습니다. 가중치는 어떻게 든 초기화되고 (예 : [-0.5, 0.5]에서 균일하게), 일부 중지 규칙에 도달 할 때까지 다음 두 단계 사이를 번갈아 표시합니다.

  1. 고정 단계-이 단계에서는 보이는 단위의 모든 값이 고정되어 있으므로 볼츠만 확률 적 활성화 규칙에 따라 숨겨진 단위의 상태 만 업데이트합니다. 네트워크가 평형 상태에 도달 할 때까지 업데이트합니다. 우리가 평형에 도달하면, 우리는 계속 업데이트 (일부 미리 정의에 대한 더 많은 시간을 의 평균 추적 유지) 엑스나는엑스제이 (여기서 엑스나는,엑스제이 노드의 상태되는 나는제이 ). 평형 업데이트 후 , 우리는 . 여기서나는제이=나는제이+1V이자형아르 자형이자형(엑스나는엑스제이)학습률입니다. 또는 마지막에 일괄 업데이트를 수행하는 대신 평형 단계 후에 업데이트합니까?

  2. 자유 단계-이 단계에서는 모든 장치의 상태가 업데이트됩니다. 평형에 도달하면 마찬가지로 N '을 더 많이 업데이트하지만 끝에 상관을 추가하는 대신 을 뺍니다 .나는제이=나는제이1V이자형아르 자형이자형(엑스나는엑스제이)

내 주요 질문은 다음과 같습니다.

  1. 고정 단계에있을 때마다 가시적 단위를 우리가 배우고 자하는 패턴 중 하나로 재설정합니까 (일부 주파수는 해당 패턴의 중요성을 나타냄) 또는 가시적 단위를 원래 상태로 유지합니까 자유 단계의 끝에서?

  2. 각 단계의 끝에서 가중치를 일괄 업데이트하거나 단계의 각 평형 단계에서 가중치를 업데이트합니까? (또는 둘 다 괜찮습니까?)

답변:


6

직관적으로, 보이는 단위는 "모델이 보는 것"으로, 숨겨진 단위는 "모델의 마음의 상태"로 생각할 수 있습니다. 보이는 모든 단위를 일부 값으로 설정하면 "데이터를 모델에 표시"됩니다. 그런 다음 숨겨진 단위를 활성화하면 모델이 마음 상태를 보이는대로 조정합니다.

다음으로 모델을 자유롭게하고 환상에 빠지게하십시오. 그것은 폐쇄되고 말 그대로 마음이 생성하는 것들을보고, 그 이미지들에 기초하여 새로운 마음 상태를 생성합니다.

가중치 (및 치우침)를 조정하여 수행하는 작업은 모델이 데이터를 더 많이 믿고 자신의 환상을 덜 믿게 만드는 것입니다. 이런 식으로 훈련을 한 후에는 (아주 희망적으로) 아주 좋은 데이터 모델을 믿게 될 것입니다. 예를 들어 "이 쌍 (X, Y)을 믿습니까? 어떻게 찾을 수 있습니까? 볼츠만 기계? "

마지막으로 에너지 기반 모델에 대한 간단한 설명이 있습니다. 여기에서 클램핑 및 프리 페이즈의 출처와 실행 방법에 대한 직관적 인 정보가 제공됩니다.

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

직관적으로 명확한 업데이트 규칙이 모델별로 데이터를 생성 할 수있는 로그 가능성의 파생 형태로 나온다는 것은 매우 재미있는 일입니다.

이러한 직관을 염두에두고 이제 질문에보다 쉽게 ​​대답 할 수 있습니다.

  1. 보이는 단위를 모델이 믿고 싶은 일부 데이터로 재설정해야합니다. 자유 단계의 끝에서 값을 사용하는 경우 계속 환상을 가지게됩니다.

  2. 단계가 끝나면 업데이트를 수행하는 것이 좋습니다. 특히 클램핑 단계 인 경우 데이터에 "초점을 맞출"시간을주는 것이 좋습니다. 이전 업데이트는 모델이 아직 마음의 상태를 현실로 조정하지 않은 경우 연결을 강제 적용하므로 수렴 속도가 느려집니다. 환상을 느끼면서 각 평형 단계 후에 무게를 업데이트하는 것은 경험이 없지만 덜 해 롭습니다.

EBM, BM 및 RBM에 대한 직관을 향상시키고 싶다면 Geoffrey Hinton의 주제에 대한 강의를 시청하는 것이 좋습니다.


2
  1. 그렇습니다. "가시적 단위를 우리가 배우고 자하는 패턴 중 하나로 재설정 (클램프)합니다 (일부 패턴은 그 패턴의 중요성을 나타냅니다).

  2. 예, "우리는 각 단계가 끝날 때 가중치를 일괄 업데이트합니다." "단계의 각 평형 단계에서 가중치"를 업데이트하면 네트워크가 순간적인 오류로 인해 산만 해지기 때문에 빠른 수렴으로 이어질 것이라고 생각하지 않습니다.-Boltzmann 기계를 그런 식으로 구현했으며 제대로 작동하지 않는 것을 기억합니다. 배치 업데이트로 변경할 때까지


0

다음은 Paul Ivanov의 코드를 기반으로 한 Boltzmann Machines의 샘플 Python 코드입니다.

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.