- VisualStudio2022
- pprof-Hướng dẫn sử dụng nó trong bản mạng trực tiếp
- Triển khai C# các loại hộp chọn nhiều màu lựa chọn thả xuống, cây lựa chọn nhiều màu lựa chọn thả xuống và các nút tối đa
- [Ghi chú học tập] Cơ sở dữ liệu cấu trúc: cat tree
Tài liệu tham khảo:
Chương này chủ yếu là về sự hiểu biết: Cái tên "biến thể" đến từ đâu.
Một hàm điển hình - biểu thức của entropy:
Chương này thảo luận về một phương pháp suy luận gần đúng - suy luận biến phân.
Đại diện biểu tượng.
Các ví dụ điển hình của Tractable là Mô hình Markov ẩn (HMM), có các tính năng chính là:
Do đó, khi biết các tham số của mô hình, có thể sử dụng trực tiếp phương pháp suy luận chính xác dựa trên quy hoạch động:
Khó chữa nhưng trong nhiều trường hợp:
Suy luận chính xác tại thời điểm này thường khó thực hiện. Khó khăn chính nằm ở tích phân: \(P(X) = \int P(X,Z)\text{d}Z\).
Vì vậy cần phải sử dụng các phương pháp suy luận gần đúng. Những gì được giới thiệu tiếp theo là một phương pháp suy luận gần đúng - suy luận biến phân.
Hãy xem xét công thức Bayes và thêm \(\log\) vào cả hai vế của phương trình:
Giới thiệu phân bố xác suất \(q_\phi(Z)\) được tham số hóa bởi \(\phi\)
Đồng thời lấy trung bình phân phối\(q_\phi(Z)\) ở cả hai vế của phương trình, chúng ta có thể nhận được:
Vì vế trái\(\log P(X)\) không liên quan gì đến \(Z\), nên nó có thể được đưa ra trực tiếp và \(\int_Z q_\phi(Z) \text{d}Z = 1\), do đó có:
Viết số hạng đầu tiên ở vế phải của phương trình ở dạng kỳ vọng và số hạng thứ hai ở dạng phân kỳ KL:
Quan sát công thức này và chú ý các thuộc tính sau:
LƯU Ý1: Coi \(ELBO\) là một hàm số \(\mathcal L(q_\phi)\) và mục tiêu là \(\arg \max_{q_\phi} \mathcal L(q_\phi)\), Tức là tìm điểm cực trị của hàm số (nên gọi là biến phân).
LƯU Ý 2: Phương pháp biến phân vốn không phải là một phương pháp gần đúng, bởi vì nếu tất cả các hàm có thể được tính đến thì xác suất hậu nghiệm có thể được suy ra một cách chính xác. Tuy nhiên, vì chúng ta thường đưa ra các giả định về phạm vi của hàm, chẳng hạn như hàm bậc hai hoặc hàm thỏa mãn các điều kiện phân tách trường trung bình, điều này dẫn đến kết quả là luôn thu được nghiệm gần đúng cuối cùng.
LƯU Ý 3: Ngoài ra còn có giả định \(q(z)\) dựa trên lý thuyết trường trung bình. Trên cơ sở này, phương pháp đi lên tọa độ có thể được sử dụng để tìm giải pháp tối ưu. Để biết chi tiết, vui lòng tham khảo Chương 10 PRML.
Giới thiệu một phân phối \(q_{\phi^{(i)}}(Z\mid x^{(i)})\) được tham số hóa bởi \(\phi^{(i)}\), \(\ log P (x^{(i)})\) cũng có thể được viết dưới dạng \(ELBO+KL\):
LƯU Ý: Tham số \(\phi\) của \(q_\phi\) được viết \(\phi^{(i)}\) vì đối với mỗi biến quan sát đơn lẻ, \(P(Z\mid x^) phía sau {(i)})\) thì khác. Trong các chương [[#SGVI]] tiếp theo, để đơn giản, nó vẫn được lược bỏ.
Chương trước đã chuyển bài toán suy luận biến tiềm ẩn thành bài toán tối ưu hóa \(ELBO\). Chương này nói về phương pháp ước lượng độ dốc \(ELBO\).
Hình dạng chuyển màu của \(ELBO\) đến \(\phi\) là \(\nabla_\phi \mathbb E_{z\sim q_\phi(z)Nif(z)]\). cập nhật đầu tiên dạng tổng quát của gradient:
Di chuyển dấu gradient thành dấu tích phân và sau đó vì \(\nabla \log q_\phi=\frac{\nabla q_\phi}{q_\phi}\), chúng ta có thể nhận được:
Kỳ vọng ở vế phải của phương trình có thể được ước tính trực tiếp bằng cách sử dụng mẫu MC:
LƯU Ý: Chúng tôi thực sự giả định rằng \(q_\phi(z)\) có thể xử lý được, dễ lấy mẫu và tính toán.
BTW: Trong thuật toán REINFORCE trong học tăng cường, công cụ ước tính này được sử dụng để ước tính độ dốc chính sách, vì vậy chúng tôi có thể nói rằng REINFORCE là thuật toán có phương sai lớn.
Quá trình lấy mẫu \(z\sim q_\phi(z\mid x)\) thường có thể được chia thành hai bước sau:
Ví dụ: lấy mẫu từ phân phối chuẩn \(z\sim \mathcal N(\mu, \sigma)\) có thể được chia thành:
Trên đây là kỹ thuật tham số hóa lại.
Sau khi sử dụng kỹ thuật tham số hóa lại, biểu thức mong muốn có thể được viết dưới dạng sau:
Đặt \(f=ELBO\), rồi tìm gradient, bạn sẽ nhận được công cụ ước tính SGVI:
ở đâu \(\epsilon^{(l)}\sim p(\epsilon)\).
LƯU Ý: Công cụ ước tính SGVI thường có phương sai nhỏ hơn công cụ ước tính độ dốc hàm điểm.
Chương này thảo luận về cách áp dụng phương pháp VI để suy luận và học các mô hình tạo biến tiềm ẩn.
Chúng tôi thường muốn tạo các mẫu tương tự với dữ liệu trong tập dữ liệu. Ví dụ: với một tập dữ liệu khuôn mặt, chúng tôi hy vọng rằng mô hình có thể tìm hiểu cách phân phối lô dữ liệu khuôn mặt này theo một cách nào đó và sau đó tạo ra các khuôn mặt theo một cách nào đó.
Giả định về mẫu: Người ta thường giả định rằng tập dữ liệu được lấy mẫu từ một phân phối không xác định\(P_{gt}(X)\).
Hiểu biết: Nếu một bức ảnh \(X\) trông giống một khuôn mặt thì \(P_{gt}(X)\) là rất lớn; nếu một bức ảnh \(X\) có nhiều nhiễu thì \(P_{ gt }(X)\) rất nhỏ.
Mục tiêu của chúng ta: tìm ra một mô hình \(P(X)\) có thể lấy mẫu, đồng thời \(P\) có thể xấp xỉ \(P_{gt}\) càng nhiều càng tốt.
Cách tìm hiểu các tham số mô hình: Giả sử rằng mô hình được tham số hóa \(P_\theta(X)\), để tìm hiểu các tham số \(\theta\), là làm cho mô hình có xác suất cao nhất trên dữ liệu được quan sát \(X\ ) , đó là: \(\arg \max_\theta P_\theta(X)\) (Khả năng tối đa).
Hãy cân nhắc việc sử dụng các mô hình tạo biến tiềm ẩn để ước tính \(P_{gt}\ .
Trích dẫn: Lấy việc tạo số làm ví dụ, một cách suy nghĩ.
\(z\) đây là biến ẩn.
Khó khăn: Việc xác định các biến ẩn và sau đó xác định mối quan hệ giữa biến ẩn và biến quan sát thực tế có thể rất phức tạp:
Hãy cân nhắc sử dụng các phương pháp sau để khắc phục sự cố này:
Tại sao làm điều này:
Vì vậy, chúng tôi nhận được mô hình\(P(X;\theta)\) mà chúng tôi sử dụng để ước tính phân phối dữ liệu thực\(P_{gt}(X)\):
Xem xét các phương pháp gần đúng bằng cách sử dụng suy luận biến phân.
Theo thảo luận trong phần [[#Suy luận biến phân VI]], Bằng chứng \(\log\) của mô hình có thể được viết dưới dạng \(ELBO+KL\):
Sự khác biệt chính: các tham số mô hình \(\theta\).
LƯU Ý: Bây giờ để tối đa hóa \(ELBO\), bạn cần xem xét cả tham số \(\phi\) của phân bố gần đúng \(q\) và tham số mô hình \(\theta\). tối đa hóa\ (ELBO\) có hai chức năng cùng một lúc: 1. Suy luận: giảm thiểu \(KL\) sao cho \(q\) tiến đến phân phối sau thực sự; Học tập: Tối đa hóa bằng chứng tương đương với việc thực hiện MLE, làm cho mô hình \(P_\theta\) tiếp cận phân phối dữ liệu thực\(P_{gt}\).
Sau đó, theo thảo luận trong phần [[#SGVI]], hãy sử dụng công cụ ước tính SGVI để ước tính \(ELBO\):
Tại thời điểm thảo luận này, quá trình học tập của mô hình có thể thu được như sau:
Suy luận khấu hao: Hãy cân nhắc việc giới thiệu một hàm được tham số hóa \(f_\lambda: x^i \to \phi^*\), hàm này sẽ tìm hiểu cách xác định một \(\phi^ đủ tốt dựa trên \(x^i\) * \). Tức là, với mỗi \(x^i\), sẽ thu được \(q(z;f_\lambda(x^i))\).
Làm thế nào để học? Điều tương tự là tham số hóa nặng + tăng độ dốc.
Do đó, có được một quy trình học mô hình đơn giản hơn:
LƯU Ý: Phải đến cuối phần [[#Amortized Inference]], nguyên mẫu của cấu trúc Encoding-Decoding mới bắt đầu xuất hiện, tức là \(x^i\to q(z;f_\lambda(x ^i)) \to z \to P(X\mid z;\theta) \to \bar x^i\ .
Mục tiêu của việc đào tạo VAE là tối đa hóa \(ELBO\). Phần này thảo luận về ý nghĩa thực tế của \(ELBO\) từ chính dạng \(ELBO\).
Đạo hàm ở đây sử dụng phiên bản đơn giản hóa một cách tượng trưng của biểu thức \(ELBO\):
Bạn có thể thấy ý nghĩa của 2 thuật ngữ \(ELBO\):
Sau đây là sơ đồ cấu trúc sơ đồ của VAE thực hiện Bộ mã hóa và Bộ giải mã bằng cách sử dụng mạng nơ-ron tiếp liệu. Hình ảnh bên trái không có kỹ thuật tham số hóa nặng và hình ảnh bên phải không có kỹ thuật tham số hóa nặng.
Một vài điểm chính:
Sau đây là cách triển khai VAE dựa trên CNN.
Bộ mã hóa.
class Encode(nn.Module): def __init__(self, num_channels,hidden_size): super(Encoding, self).__init__() # Đầu vào là (batch_size, num_channels, 28, 28), là hình dạng của dữ liệu MNIST đặt self.conv1 = nn.Conv2d(num_channels, 32, 4, 2) # (28 - 4) / 2 + 1 = 13 self.conv2 = nn.Conv2d(32, 64, 4, 2, 1) # (13 - 4 + 1) / 2 + 1 = 6 self.conv3 = nn.Conv2d(64, 128, 4 , 2) # (6 - 4) / 2 + 1 = 2 self.fc_mu = nn.Linear(128 * 2 * 2, Hidden_size) self.fc_logstd = nn.Linear(128 * 2 * 2, Hidden_size) def Forward(self, x): x = F.relu(self.conv1(x)) x = F.relu( self.conv2(x)) x = F.relu(self.conv3(x)) x = torch.flatten(x, start_dim=1) mu = self.fc_mu(x) log_std = self.fc_logstd(x) trả về mu, log_std
Bộ giải mã.
lớp Bộ giải mã(nn.Module): def __init__(self, num_channels,hidden_size): super(Bộ giải mã, self).__init__() self.fc1 = nn.Linear(hidden_size, 512) self.deconv1 = nn.ConvTranspose2d(512, 64, 5, 2) self.deconv2 = nn.ConvTranspose2d(64, 32, 5, 2) self.deconv3 = nn.ConvTranspose2d(32, num_channels, 4, 2) def Forward(self, x): x = F.relu(self.fc1(x)) x = x.unsqueeze(-1).unsqueeze(-1) # num -> [[num]] x = F.relu(self.deconv1(x)) x = F.relu(self.deconv2(x)) tái cấu trúc = F.sigmoid(self.deconv3(x)) # đầu ra (0, 1) trả về tái cấu trúc
VAE.
lớp VAE(nn.Module): def __init__(self, num_channels,hidden_size): super(VAE, self).__init__() self.encode = Bộ mã hóa(num_channels,hidden_size) self.decode = Bộ giải mã(num_channels,hidden_size) def chuyển tiếp (self, x): mu, log_std = self.encode(x) z = self.reparameterize(mu, log_std) tái thiết = self.decode(z) trả về tái thiết, mu, log_std def reparameterize(self, mu, log_std): std = log_std.exp() eps = torch.randn_like(std) return mu + std * eps
Sự mất mát.
def vae_loss(x, xây dựng lại, mu, log_std): # Để tạo hình ảnh, hiệu quả của việc sử dụng BCE sẽ tốt hơn rec_loss = F.binary_cross_entropy(reconstruction, x,rút gọn='sum') # Đây là q và N( được đơn giản hóa) 0, biểu thức phân kỳ KL của I) kl_loss = -0,5 * torch.sum(1 + 2 * log_std - mu.pow(2) - (2*log_std).exp()) trả về rec_loss + kl_loss
Cuối cùng, bài viết này về suy luận biến phân (VI), suy luận biến phân độ dốc ngẫu nhiên (SGVI/SGVB) và bộ mã hóa tự động biến phân (VAE) có ở đây. Nếu bạn muốn biết thêm về suy luận biến phân (VI), Suy luận biến thiên ngẫu nhiên (SGVI/). SGVB), và Bộ mã hóa tự động biến đổi (VAE), vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi đang cố gắng điều chỉnh mã hướng dẫn tf DeepDream để sử dụng mô hình khác. Bây giờ khi tôi gọi tf.gradients(): t_grad = tf.gradients(t_score, t_input)[0
Xem xét một vấn đề giảm độ dốc theo lô nhỏ đơn giản trên mnist trong tensorflow (như trong hướng dẫn này), làm cách nào tôi có thể truy xuất độ dốc của từng ví dụ trong lô riêng lẻ. tf.gradients() dường như trả về tất cả
Khi tôi tính toán độ dốc của mảng bị che trong numpy import numpy as np import numpy.ma as ma x = np.array([100, 2, 3, 5, 5, 5, 10,
Có cách nào nhanh chóng để lấy đạo hàm của ma trận hiệp phương sai (kích hoạt mạng của tôi) ngoài các phép tính số không? Tôi đang cố gắng sử dụng điều này như một thuật ngữ phạt trong hàm chi phí trong mạng lưới thần kinh sâu, nhưng để truyền ngược lỗi qua các lớp của mình, tôi cần lấy đạo hàm. Trong Matlab, nếu "a
Tôi có một hàm tính toán các giá trị trường vô hướng trong không gian 3D, vì vậy tôi cung cấp cho nó một tenxơ 3D gồm các tọa độ x, y và z (thu được bởi numpy.meshgrid) và sử dụng các phép toán theo phần tử ở mọi nơi. Điều này hoạt động như mong đợi. Bây giờ tôi cần tính độ dốc của trường vô hướng.
Tôi đang sử dụng Ước tính mật độ hạt nhân (KDE) ( http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.htm
Tôi bối rối trước các ví dụ trong tài liệu độ dốc tensorflow để tính toán độ dốc. a = tf.constant(0.) b = 2 * ag = tf.gradients(
Tôi có một lớp softmax (chỉ là lớp kích hoạt, không có phần tuyến tính nhân đầu vào với trọng số) mà tôi muốn thực hiện chuyển ngược lại. Tôi đã tìm thấy rất nhiều hướng dẫn/câu trả lời về SO giải quyết vấn đề đó, nhưng dường như tất cả chúng đều sử dụng X làm (1, n_inputs)
Cho bạn biết, tôi đang cố gắng triển khai thuật toán giảm độ dốc bằng Tensorflow. Tôi có ma trận X [x1 x2 x3 x4] [x5 x6 x7 x8] Tôi nhân một số vectơ riêng Y để có Z[y
Tôi hiện có một khối lượng bao gồm vài triệu hạt phân bố không đều, mỗi hạt có một tính chất (tiềm năng cho những ai tò mò) mà tôi muốn tính lực cục bộ (gia tốc). np.gradient chỉ hoạt động với dữ liệu cách đều nhau, mình đang xem ở đây :S
Tôi đang tìm kiếm gợi ý về cách triển khai Độ dốc (dốc nhất) trong C. Tôi đang tìm giá trị tối thiểu của f(x)=||Ax-y||^2, cho A(n,n) và y(n). Đây là
Tôi đang xem mã cho tổn thất SVM và đạo hàm và tôi hiểu sự mất mát nhưng tôi không hiểu cách tính độ dốc theo cách được vector hóa def svm_loss_vectorized(W, X, y, reg): loss = 0,0 dW
Tôi đang tìm một cách hiệu quả để tính đạo hàm của mảng đa chiều ở Julia. Nói chính xác hơn, tôi muốn một cái tương đương với numpy.gradient ở Julia. Tuy nhiên, hàm Julia diff : chỉ hoạt động với mảng hai chiều dọc theo chiều vi phân
Tôi có hai điểm trong hệ thống cathesian 2D và cả hai đều cho tôi điểm bắt đầu và điểm kết thúc của vectơ. Bây giờ tôi cần góc giữa vectơ mới và trục x. Tôi biết gradient = (y2-y1)/(x2-x1) và tôi biết góc = arctan(g
Tôi có một mảng 2D gồm các mẫu hình sin và muốn vẽ đồ thị độ dốc x và y của hàm đó. Tôi có một mảng hai chiều image_data: def get_image(params): # thực hiện một số phép toán trên
Giả sử tôi có một mô hình TensorFlow đơn giản trên dữ liệu MNIST như sau import tensorflow as tf from tensorflow.examples.tutorials.m
Tôi muốn xem độ dốc của LSTM Tensorflow của mình theo thời gian, ví dụ: vẽ biểu đồ định mức độ dốc từ t=N đến t=0. Câu hỏi đặt ra là làm cách nào để có được độ dốc ở mỗi bước thời gian từ Tensorflow? Câu trả lời tốt nhất được xác định trong sơ đồ:
Tôi có một mạng lưới thần kinh đơn giản và tôi đang cố gắng vẽ đồ thị độ dốc bằng cách sử dụng tensorboard bằng cách sử dụng lệnh gọi lại như thế này: class gradientCallback(tf.keras.callbacks.Callback): console =
Trong hướng dẫn CIFAR-10, tôi nhận thấy rằng các biến được đặt trong bộ nhớ CPU, nhưng nó được nêu trong cifar10-train.py. Nó được đào tạo bằng cách sử dụng một GPU duy nhất. Tôi đang bối rối..các lớp/kích hoạt có được lưu trữ trong GPU không? Hoặc độ dốc
Tôi có một mô hình tensorflow trong đó đầu ra của một lớp là một tensor 2D, giả sử t = [[1,2], [3,4]] . Lớp tiếp theo yêu cầu đầu vào bao gồm mỗi tổ hợp hàng của tensor đó. Tức là mình cần biến nó thành t_new = [[
Tôi là một lập trình viên xuất sắc, rất xuất sắc!