Để làm cho các giới hạn đó có thể so sánh được với giá trị trung bình đã cắt được quan sát [7. 225], chúng tôi đã nhân chúng với sai số chuẩn của nó [độ lệch chuẩn của phương tiện cắt giảm bootstrap ở giai đoạn đầu] đưa ra giới hạn là 4. 019533 và 13. 505900
- Lưu ý rằng các khoảng này rộng hơn các khoảng phần trăm đơn giản mà chúng tôi thu được,
Chúng tôi đã áp dụng trình tự đã cho ở trên
- Để đơn giản, chúng tôi đã sử dụng làm mịn Gaussian đơn giản và khoảng phân vị đơn giản. Dưới đây là phân phối dữ liệu ban đầu và được làm mịn của chúng tôi
- Do đó, vì những dữ liệu này là số đếm, dữ liệu bootstrap bị xáo trộn được làm tròn thành số nguyên dương gần nhất
Các giới hạn bootstrap được làm mịn phần trăm đơn giản mà chúng tôi thu được là 6. 875 và 7. 925
- Các giới hạn này, mặc dù rộng hơn các giới hạn phần trăm đơn giản [không được làm mịn] của chúng tôi, nhưng
Chúng tôi đã áp dụng trình tự đã cho ở trên
- Lưu ý rằng vì những dữ liệu này không thể phát sinh nếu quần thể không có ấu trùng cryptolignacae, số lượng âm là không thể và những số lượng này khá sai lệch, chúng tôi đã xây dựng quần thể mô hình của mình bằng cách dịch chuyển từng phần của quần thể tỷ lệ thuận với sự khác biệt của nó từ 0
Ngoài ra, để tránh phải lặp lại, chúng tôi đã thu được kết quả của mình dưới dạng biểu đồ giá trị P và sử dụng các giá trị giới hạn độ tin cậy ước tính bằng phép nội suy
Hơn nữa, vì những dữ liệu này được tính, thay vì lấy mẫu một mô hình tham số [được trang bị] tùy ý, chúng tôi đã sử dụng một bootstrap được làm mịn. Tuy nhiên, vì việc thay đổi dân số mô hình của chúng tôi sẽ thay đổi phương sai của nó, nên chúng tôi đã tính toán băng thông sau mỗi lần thay đổi
Cuối cùng, vì chúng tôi đang thay đổi mẫu nhưng lấy mẫu lại mẫu đã làm mịn, giả sử tham số mà chúng tôi đang ước tính là giá trị trung bình đã cắt bớt 10% của tổng thể, chúng tôi đã giả định thêm rằng một mẫu gồm 50 × 5000 quan sát sẽ cho chúng tôi một kết quả hợp lý không thiên vị.
Các giới hạn đảo ngược thử nghiệm mà chúng tôi thu được, sau 100 thử nghiệm bootstrap phần trăm được làm mịn bằng Gaussian, là 6. 673416 và 7. 668602
Chúng tôi đã xuất bản một bài báo về giải quyết một cách có hệ thống sự không chắc chắn trong học máy nguyên tử, trong đó chúng tôi tập trung vào một phương pháp tổng hợp bootstrap cơ bản
Peterson, Christensen và Khorshidi, “Giải quyết sự không chắc chắn trong học máy nguyên tử”, PCCP 19. 10978-10985, 2017. DOI. 10. 1039/C7CP00375G
Một mô-đun trợ giúp để tạo các máy tính bootstrap, có khả năng đưa ra không chỉ dự đoán mô hình trung bình mà cả các khoảng không chắc chắn, được mô tả tại đây. Lưu ý rằng bạn nên thận trọng khi sử dụng các khoảng không chắc chắn và, như chúng tôi mô tả trong bài báo trên, cách giải thích “đúng” về việc nhìn thấy các giới hạn không chắc chắn lớn đối với một cấu hình nguyên tử cụ thể là cần phải có một phép tính cấu trúc điện tử mới [ở cấu hình đó],
Tập huấn¶
Đoạn script dưới đây cho thấy một ví dụ đơn giản về việc tạo một nhóm bootstrap gồm 10 máy tính cho một tập huấn luyện mẫu nhỏ. [Nhưng bạn có thể muốn có kích thước tập hợp lớn hơn 10 để có số liệu thống kê hợp lý. ]
from amp.utilities import Logger from amp.stats.bootstrap import BootStrap def generate_data[count, filename='training.traj']: """Generates test or training data with a simple MD simulation.""" import os from ase import Atoms, Atom, units import ase.io from ase.calculators.emt import EMT from ase.build import fcc110 from ase.md.velocitydistribution import MaxwellBoltzmannDistribution from ase.md import VelocityVerlet from ase.constraints import FixAtoms if os.path.exists[filename]: return traj = ase.io.Trajectory[filename, 'w'] atoms = fcc110['Pt', [2, 2, 2], vacuum=7.] atoms.extend[Atoms[[Atom['Cu', atoms[7].position + [0., 0., 2.5]], Atom['Cu', atoms[7].position + [0., 0., 5.]]]]] atoms.set_constraint[FixAtoms[indices=[0, 2]]] atoms.calc = EMT[] atoms.get_potential_energy[] traj.write[atoms] MaxwellBoltzmannDistribution[atoms, 300. * units.kB] dyn = VelocityVerlet[atoms, dt=1. * units.fs] for step in range[count - 1]: dyn.run[50] traj.write[atoms] generate_data[5, 'training.traj'] calc_text = """ from amp import Amp from amp.descriptor.gaussian import Gaussian from amp.model.neuralnetwork import NeuralNetwork from amp.model import LossFunction calc = Amp[descriptor=Gaussian[], model=NeuralNetwork[], dblabel='../amp-db', envcommand='loadamp'] calc.model.lossfunction = LossFunction[force_coefficient=0., convergence={'force_rmse': None}] """ start_command = 'python run.py' calc = BootStrap[log=Logger['bootstrap.log']] calc.train[images='training.traj', n=10, calc_text=calc_text, start_command=start_command, label='bootstrap']
Chạy đoạn script trên một lần và đợi nó hoàn thành [có thể là 10 lõi hoặc bạn không quan tâm đến việc tất cả các quy trình đào tạo đều cạnh tranh để giành tài nguyên, thì bạn có thể cho tất cả chúng chạy song song bằng cách đặt dấu và [trong hệ thống *nix] ở cuối dòng này, nghĩa là “ . tôi &”
Rất có thể, bạn muốn chạy ứng dụng này trên cụm máy tính hiệu suất cao sử dụng hệ thống xếp hàng. Trong trường hợp này, start_command là lệnh xếp hàng của bạn, đối với hệ thống SLURM của chúng tôi, đây chỉ là
start_command = 'sbatch run.py'
Nếu bạn cần cung cấp các tiêu đề cho hệ thống xếp hàng của mình, bạn có thể thực hiện chúng với nội dung như bên dưới
headerlines = """#SBATCH --time=00:30:00 #SBATCH --nodes=1 #SBATCH --ntasks-per-node=8 #SBATCH --partition=batch """ ... calc.train[images='training.traj', n=10, train_line=train_line, calc_text=calc_text, headerlines=headerlines, start_command=start_command, label='bootstrap']
Theo cách tương tự, bạn cũng có thể cung cấp một train_line tùy chỉnh nếu cần;
Đang tải và sử dụng¶
Nhóm bootstrap có thể được tải thông qua từ khóa tải của máy tính. Tập lệnh bên dưới hiển thị một ví dụ về tải máy tính và sử dụng nó để dự đoán năng lượng và sự lan truyền của quần thể cho các hình ảnh đào tạo
import ase.io from amp.stats.bootstrap import BootStrap calc = BootStrap[load='bootstrap.ensemble'] traj = ase.io.Trajectory['training.traj'] for image in traj: energies = calc.get_potential_energy[image, output=[0.05, 0.5, 0.95]] print[energies] energy = image.get_potential_energy[] print[energy]
Lưu ý rằng cuộc gọi đến calc. get_potential_energy trả về ba dự đoán năng lượng, ở phân vị thứ 5, 50 [trung vị] và 95, như được chỉ định với bộ [0. 05, 0. 5, 0. 95]. Khi bạn chạy chương trình này, bạn sẽ thấy rằng dự đoán trung bình phù hợp với năng lượng thực [từ hình ảnh. get_potential_energy] khá tốt, trong khi sự lan truyền trong dữ liệu là do sự thưa thớt của dữ liệu;
Đào tạo rảnh tay¶
Trong sử dụng điển hình, việc gọi phương thức train[]
của lớp BootStrap
sẽ tạo ra nhiều công việc đào tạo độc lập. Các cuộc gọi tiếp theo để đào tạo sẽ giúp bạn quản lý những công việc đó. kiểm tra cái nào đã hội tụ, kiểm tra cái nào không hội tụ [và gửi lại chúng], kiểm tra cái nào đã hết thời gian [và gửi lại chúng] và, nếu tất cả đã hội tụ, tạo một máy tính đi kèm. Có thể hiệu quả nhất khi gửi một công việc [lõi đơn] liên tục gọi lệnh này cho bạn và đóng vai trò là người quản lý công việc cho đến khi tất cả các công việc đào tạo hoàn tất. Điều này có thể đạt được bằng cách tận dụng từ điển kết quả do tàu trả về, như trong tập lệnh ví dụ bên dưới sử dụng các lệnh môi trường SLURM