2017-05-01 12 views
1

저는 pymc3을 사용하여 keras (theano 백엔드) 모델에 사인 곡선을 맞추려고했습니다. 나는 이것 [http://twiecki.github.io/blog/2016/07/05/bayesian-deep-learning/]을 참조 점으로 사용하고 있습니다.Keras와 PYMC3를 사용하여 사인파를 피팅하면 예상치 못한 결과가 발생합니다.

최적화를 사용한 Keras 구현만으로는 적합하지만, pymc3의 Hamiltonian Monte Carlo 및 Variational 샘플링은 데이터에 적합하지 않습니다. 선행이 시작되는 지점에서 추적이 중단됩니다. 이전을 움직이면 후방 이동이 같은 지점으로 이동합니다. 셀 59에서 베이지안 모델의 후방 예측은 거의 사인파를 얻지 만 비 베이지안 적합 모델은 셀 63에서 완벽한 결과를 얻습니다. 여기에 노트와 코드를 표시합니다 : https://gist.github.com/tomc4yt/d2fb694247984b1f8e89cfd80aff8706. 여기

class GaussWeights(object): 
    def __init__(self): 
     self.count = 0 

    def __call__(self, shape, name='w'): 
     return pm.Normal(
      name, mu=0, sd=.1, 
      testval=np.random.normal(size=shape).astype(np.float32), 
      shape=shape) 


def build_ann(x, y, init): 
    with pm.Model() as m: 

     i = Input(tensor=x, shape=x.get_value().shape[1:]) 
     m = i 
     m = Dense(4, init=init, activation='tanh')(m) 
     m = Dense(1, init=init, activation='tanh')(m) 

     sigma = pm.Normal('sigma', 0, 1, transform=None) 
     out = pm.Normal('out', 
         m, 1, 
         observed=y, transform=None) 

    return out 



with pm.Model() as neural_network: 
    likelihood = build_ann(input_var, target_var, GaussWeights()) 

#  v_params = pm.variational.advi(
#   n=300, learning_rate=.4 
# ) 
#  trace = pm.variational.sample_vp(v_params, draws=2000) 
    start = pm.find_MAP(fmin=scipy.optimize.fmin_powell) 
    step = pm.HamiltonianMC(scaling=start) 
    trace = pm.sample(1000, step, progressbar=True) 
+0

당신이 생각하는 것보다 더 구체적으로 생각할 수 있습니까? 언뜻보기에는 두 가지 모드에서 약간의 문제가있는 것처럼 보였지만 그렇지 않은 경우에는 괜찮습니다. (또한, 당신은'시그마 '를 정의하지만 어디에서도 사용하지 않습니다 ...) – aseyboldt

+0

@aseyboldt 질문을 업데이트했습니다. 주요 문제는 이전에 시작된 위치에서 추적이 중단되어 추적 표시를 살펴 보는 것입니다. 이전을 움직이면 후방 이동이 같은 지점으로 이동합니다. 셀 59에서 베이지안 모델의 후방 예측은 사인파를 간신히 얻는 반면 비 베이지안 적합 모델은 셀 63에서 완벽하게 가깝습니다. 시그마는 사용되지 않지만 문제가되어서는 안됩니다. – tomc4yt

+0

귀하의 모델은 귀하의 측정 값이 표준 출력 (std = 1)을 가진 네트워크 출력을 기준으로 정상적인 분포를 따른다 고 말하고 있습니다. 그런 다음 예측 값에서 x 값당 100 개의 값을 샘플링하고 중간 값을 취합니다. 이러한 샘플은 각 x 값에 대해 1 + posterior_variance의 분산을가집니다. 그들의 중앙값은 자연적으로 여전히 네트워크 출력에 따라 다릅니다. 모델이 당신이하는 일을 정확히하고있는 것 같습니다. – aseyboldt

답변

1

모델은 하나의 고정 된 표준 정상 소음 포함 ... 아래 모델의 조각입니다 :

out = pm.Normal('out', m, 1, observed=y) 

을하지만, 데이터 세트하지 않습니다. 예측적인 후부가 데이터 세트와 일치하지 않는 것은 자연스러운 일이며 매우 다른 방식으로 생성되었습니다. 좀 더 현실적인 당신은 당신의 데이터 세트에 노이즈를 추가 한 다음 시그마를 추정 할 수 있도록하려면

mu = pm.Deterministic('mu', m) 
sigma = pm.HalfCauchy('sigma', beta=1) 
pm.Normal('y', mu=mu, sd=sigma, observed=y) 

당신이 지금 뭐하는 것이 네트워크의 출력을 복용하고 표준 정규 잡음을 추가하는 것과 비슷합니다.

관련이없는 의견의 몇 :

  • out는 다시 바로 데이터 세트입니다 가능성이 아닙니다.
  • NUTS 대신 HamiltonianMC을 사용하는 경우 직접 단계 크기와 통합 시간을 설정해야합니다. 기본값은 일반적으로 유용하지 않습니다.
  • keras가 2.0에서 변경된 것처럼 보입니다. pymc3와 keras를 결합하는이 방법은 더 이상 작동하지 않습니다.
+0

이것이 효과가있는 해결책은 아니지만 표준 편차가 기술적으로 사실 인 문제임을 확인 했으므로이를 받아 들일 것입니다.제 전임자들이 체중 주변에 있었기 때문에 제대로 지정되지 않았습니다.이 분야에서 Radford M Neal의 연구에 따라 적절한 하이퍼 프리어를 배치했을 때 나는 훨씬 더 나은 결과를 보았습니다. 특히, 제 전임자는 검색 공간을 제한하고 있었고 가중치의 표준 dev를 넓힐 필요가있었습니다. – tomc4yt