Phương pháp lấy mẫu Gibbs có tầm quan trọng của người Viking có hiệu quả không?


8

Tôi nghi ngờ đây là một câu hỏi khá bất thường và thăm dò, vì vậy xin vui lòng chịu đựng với tôi.

Tôi tự hỏi nếu người ta có thể áp dụng ý tưởng lấy mẫu quan trọng để lấy mẫu Gibbs. Ý tôi là: trong lấy mẫu Gibbs, chúng tôi thay đổi giá trị của một biến (hoặc khối biến) tại một thời điểm, lấy mẫu từ xác suất có điều kiện cho các biến còn lại.

Tuy nhiên, có thể không thể hoặc dễ dàng lấy mẫu từ xác suất có điều kiện chính xác. Vì vậy, thay vào đó, chúng tôi lấy mẫu từ một phân phối đề xuất và sử dụng, ví dụ, Metropolis-Hastings (MH).q

Càng xa càng tốt. Nhưng đây là một con đường khác nhau: điều gì xảy ra nếu chúng ta, thay vì sử dụng MH, sử dụng cùng một ý tưởng được sử dụng trong lấy mẫu quan trọng, cụ thể là chúng ta lấy mẫu từ và giữ trọng số p / q của mẫu hiện tại?qp/q

Chi tiết hơn: giả sử chúng ta có các biến x1,Giáo dục,xn và phân phối bao thanh toán φ1,Giáo dục,φm sao cho pαΠTôi= =1mφTôi . Chúng tôi giữ xác suất đề xuất qTôi được sử dụng để lấy mẫu giá trị hiện tại của từng biến xTôi . Ở mỗi bước, chúng tôi thay đổi một tập hợp con của các biến và cập nhật p(x)/q(x) (chỉ các yếu tố của pq bị ảnh hưởng). Chúng tôi lấy các mẫu và trọng lượng quan trọng của chúng để tính toán bất kỳ số liệu thống kê nào chúng tôi quan tâm.

Thuật toán này có đúng không? Nếu không, lý do rõ ràng tại sao không? Theo trực giác, nó có ý nghĩa với tôi vì nó dường như đang thực hiện cùng một việc lấy mẫu quan trọng, nhưng với các mẫu phụ thuộc thay thế.

Tôi đã thực hiện điều này cho một mô hình đi bộ ngẫu nhiên Gaussian và quan sát thấy các trọng số ngày càng nhỏ hơn (nhưng không đơn điệu), vì vậy các mẫu ban đầu cuối cùng có quá nhiều tầm quan trọng và chi phối thống kê. Tôi khá chắc chắn rằng việc thực hiện không có lỗi, bởi vì ở mỗi bước tôi so sánh trọng lượng được cập nhật với một tính toán vũ lực rõ ràng của nó. Lưu ý rằng các trọng số không giảm xuống vô hạn, bởi vì chúng là trong đó cả và đều là sản phẩm có số lượng mật độ hữu hạn và mỗi mẫu được lấy từ phân phối chuẩn mà hiếm khi bằng 0.p/qpq

Vì vậy, tôi đang cố gắng để hiểu tại sao các trọng số đi xuống như vậy, và liệu đây có phải là hậu quả của phương pháp này thực sự không chính xác.


Đây là một định nghĩa chính xác hơn về thuật toán, được áp dụng cho bước đi ngẫu nhiên Gaussian trên các biến . Các mã sau đây.X1,Giáo dục,Xn

Mô hình chỉ đơn giản là , với sửa thành .XTôi~N(XTôi-1,σ2),Tôi= =1,Giáo dục,nX00

Trọng số của mẫu hiện tại là , trong đó là mật độ Gaussian và là các phân phối mà từ đó các giá trị hiện tại đã được lấy mẫu. Ban đầu, chúng tôi chỉ cần lấy mẫu các giá trị theo cách chuyển tiếp, vì vậy và trọng số ban đầu là .ΠTôip(xTôi)ΠTôiq(xTôi)pqq= =p1

Sau đó, ở mỗi bước tôi chọn để thay đổi. Tôi lấy mẫu một giá trị mới cho từ , vì vậy mật độ này trở thành phân phối đề xuất mới được sử dụng cho .j{1,Giáo dục,n}xj'XjN(Xj-1,σ2)Xj

Để cập nhật trọng số, tôi chia nó cho mật độ và của giá trị cũ theo và và nhân với mật độ và của giá trị mới theo và . Điều này cập nhật tử số của trọng lượng.p(xj|xj-1)p(xj+1|xj)xjxj-1xj+1p(xj'|xj-1)p(xj+1|xj')xj'xj-1 x j+ 1xj+1p

Để cập nhật mẫu số , tôi nhân trọng số với đề xuất cũ (do đó loại bỏ nó khỏi mẫu số) và chia nó cho .qq(xj)q(xj')

(Vì tôi lấy mẫu từ trung tâm bình thường trên , luôn bằng nên họ hủy bỏ và việc triển khai thực hiện không thực sự sử dụng chúng).xj'xj-1q(xj')p(xj'|xj-1)

Giống như tôi đã đề cập trước đây, trong mã tôi so sánh tính toán trọng số gia tăng này với tính toán rõ ràng thực tế chỉ để đảm bảo.


Đây là mã để tham khảo.

println("Original sample: " + currentSample);
int flippedVariablesIndex = 1 + getRandom().nextInt(getVariables().size() - 1);
println("Flipping: " + flippedVariablesIndex);
double oldValue = getValue(currentSample, flippedVariablesIndex);
NormalDistribution normalFromBack = getNormalDistribution(getValue(currentSample, flippedVariablesIndex - 1));
double previousP = normalFromBack.density(oldValue);
double newValue = normalFromBack.sample();
currentSample.set(getVariable(flippedVariablesIndex), newValue);
double previousQ = fromVariableToQ.get(getVariable(flippedVariablesIndex));
fromVariableToQ.put(getVariable(flippedVariablesIndex), normalFromBack.density(newValue));
if (flippedVariablesIndex < length - 1) {
    NormalDistribution normal = getNormalDistribution(getValue(currentSample, flippedVariablesIndex + 1));
    double oldForwardPotential = normal.density(oldValue);
    double newForwardPotential = normal.density(newValue);
    // println("Removing old forward potential " + oldForwardPotential);
    currentSample.removePotential(new DoublePotential(oldForwardPotential));
    // println("Multiplying new forward potential " + newForwardPotential);
    currentSample.updatePotential(new DoublePotential(newForwardPotential));
}

// println("Removing old backward potential " + previousP);
currentSample.removePotential(new DoublePotential(previousP));
// println("Multiplying (removing from divisor) old q " + previousQ);
currentSample.updatePotential(new DoublePotential(previousQ));

println("Final sample: " + currentSample);
println();

// check by comparison to brute force calculation of weight:
double productOfPs = 1.0;
for (int i = 1; i != length; i++) {
    productOfPs *= getNormalDistribution(getValue(currentSample, i - 1)).density(getValue(currentSample, i));
}
double productOfQs = Util.fold(fromVariableToQ.values(), (p1, p2) -> p1*p2, 1.0);
double weight = productOfPs/productOfQs;
if (Math.abs(weight - currentSample.getPotential().doubleValue()) > 0.0000001) {
    println("Error in weight calculation");
    System.exit(0);
}

Lấy mẫu quan trọng không cung cấp các mẫu từ phân phối mục tiêu (trong trường hợp này, các điều kiện đầy đủ của ). Vì vậy, động lực học hạt nhân Markov mang lại sự hội tụ MCMC, không giữ. Không cần nhìn vào mã của bạn, tôi không thể hiểu tại sao các trọng số sẽ về 0.φTôi
Greenparker

Cảm ơn. Tôi đoán tôi sẽ phải đi sâu vào các định lý về sự hội tụ MCMC. Tôi đã bao gồm mã chỉ trong trường hợp, nó khá đơn giản. Cảm ơn.
dùng118967

1
Thay vì bao gồm mã thô (hoặc ngoài ra), bạn có thể giải thích cách bạn triển khai thuật toán không? Phân phối mục tiêu là gì, các điều kiện đầy đủ là gì, phân phối đề xuất là gì, bạn kết hợp các trọng số như thế nào, v.v.
Greenparker

Cảm ơn bạn. Tôi đã làm như vậy, xin vui lòng cho tôi biết nếu điều này là khó hiểu ở đâu đó.
dùng118967

@ Xi'an: ở đây, lấy mẫu quan trọng đang được áp dụng cho việc lật một biến duy nhất. Thay vì chấp nhận đề xuất hay không như trong Metropolis Hastings, chúng tôi luôn chấp nhận nó nhưng giữ một mức độ quan trọng của lần lật đó bằng cách chia xác suất p cho đề xuất q cho biến được lật.
dùng118967 17/03/19

Câu trả lời:


4

Đây là một ý tưởng thú vị, nhưng tôi thấy một số khó khăn với nó:

  1. trái với lấy mẫu quan trọng tiêu chuẩn, hoặc thậm chí lấy mẫu tầm quan trọng được đề xuất, đề xuất không hoạt động trong cùng một không gian với phân phối mục tiêu, nhưng trong không gian có kích thước nhỏ hơn nên việc xác thực không rõ ràng [và có thể áp đặt để giữ trọng số trong các lần lặp lại, do đó phải đối mặt với sự thoái hóa]
  2. các hằng số chuẩn hóa bị thiếu trong các điều kiện đầy đủ thay đổi ở mỗi lần lặp nhưng không được tính cho [xem bên dưới]
  3. các trọng số không bị giới hạn, trong đó lặp đi lặp lại, cuối cùng sẽ có các mô phỏng với trọng lượng rất lớn, trừ khi người ta theo dõi sự xuất hiện cuối cùng của một bản cập nhật cho cùng một chỉ số , có thể xung đột với xác nhận Markovian của bộ lấy mẫu Gibbs . Chạy một thử nghiệm khiêm tốn với và lần lặp cho thấy một phạm vi trọng số từ đến .jn= =2T= =1037.656397e-073.699364e+04

Để biết thêm chi tiết, hãy xem xét mục tiêu hai chiều , bao gồm hằng số chuẩn hóa phù hợp và triển khai bộ lấy mẫu Gibbs quan trọng với các đề xuất và . Các trọng số chính xác [theo nghĩa tạo ra kỳ vọng chính xác, nghĩa là một công cụ ước lượng không thiên vị, cho một hàm tùy ý của ] cho các mô phỏng kế tiếp là trong đó và là các lề của . Hoặc tương đương p(,)qX(|y)qY(|x)(X,Y)

p(xt,yt-1)qX(xt|yt-1)mY(yt-1)hoặc làp(xt-1,yt)qY(yt|xt-1)mX(xt-1)
mX()mY()p(,)
pX(xt|yt-1)qX(xt|yt-1)hoặc làpY(yt|xt-1)qY(yt|xt-1)
Trong cả hai trường hợp, điều này đòi hỏi mật độ biên [không thể ] của và theo mục tiêu .XYp(,)

Thật đáng để so sánh những gì xảy ra ở đây với thuật toán Metropolis có tầm quan trọng song song . (Xem ví dụ Schuster und Klebanov, 2018. ) Nếu mục tiêu lại là và đề xuất là , trọng số quan trọng là chính xác [hướng tới việc tạo ước lượng không thiên vị] và không cập nhật trọng số trước đó mà bắt đầu từ đầu ở mỗi lần lặp.p(,)q(,|x,y)

p(x',y')q(x',y'|x,y)

(C.) Một điều chỉnh đối với đề xuất quan trọng ban đầu của Gibbs là đề xuất một giá trị mới cho toàn bộ vectơ, ví dụ: , từ đề xuất Gibbs , vì khi đó trọng số quan trọng là chính xác [thiếu một khả năng chuẩn hóa có thể hằng số mà bây giờ thực sự là hằng số và không mang từ các lần lặp Gibbs trước đó] .(x,y)qX(xt|yt-1)qY(yt|xt)

p(xt,yt)qX(xt|yt-1)qY(yt|xt)

Lưu ý cuối cùng: đối với mục tiêu đi bộ ngẫu nhiên được xem xét trong mã, mô phỏng trực tiếp là khả thi bằng cách xếp tầng: mô phỏng , sau đó đưa ra , & tc.X1X2X1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.