چگونه یک مدل هوش مصنوعی کوانتومی بسازیم – با نمونه کدهای پایتون
![](https://khabarkaav.ir/wp-content/uploads/2024/07/4-2.png)
یادگیری ماشینی (ML) یکی از مهمترین زیر حوزه های هوش مصنوعی است که در ساخت سیستم های هوش مصنوعی عالی استفاده می شود.
در ML، یادگیری عمیق یک منطقه باریک است که فقط بر روی شبکه های عصبی متمرکز شده است. از طریق زمینه یادگیری عمیق، سیستم هایی مانند ChatGPT و بسیاری از مدل های هوش مصنوعی دیگر می توانند ایجاد شوند. به عبارت دیگر، ChatGPT فقط یک سیستم غول پیکر است که مبتنی بر شبکه های عصبی است.
با این حال، یک مشکل بزرگ در یادگیری عمیق وجود دارد: کارایی محاسباتی. ایجاد سیستم های هوش مصنوعی بزرگ و موثر با شبکه های عصبی اغلب به انرژی زیادی نیاز دارد که گران است.
پس ، هر چه سخت افزار کارآمدتر باشد، بهتر است. راه حل های زیادی برای حل این مشکل وجود دارد که یکی از آنها محاسبات کوانتومی است.
این مقاله امیدوار است به زبان انگلیسی ساده، ارتباط بین محاسبات کوانتومی و هوش مصنوعی را نشان دهد.
در مورد این موارد صحبت خواهیم کرد:
هوش مصنوعی و ظهور یادگیری عمیق
مشکل بزرگ در یادگیری عمیق: کارایی محاسباتی
مثال کد: یک مدل هوش مصنوعی کوانتومی برای شیمی کوانتومی
نتیجه گیری: محدودیت های محاسبات کوانتومی و توسعه
هوش مصنوعی و ظهور یادگیری عمیق
یادگیری عمیق در هوش مصنوعی چیست؟
یادگیری عمیق زیر شاخه هوش مصنوعی است. از شبکه های عصبی برای پردازش الگوهای پیچیده استفاده می کند، درست مانند استراتژی هایی که یک تیم ورزشی برای برنده شدن در یک مسابقه استفاده می کند.
هرچه شبکه عصبی بزرگتر باشد، توانایی بیشتری برای انجام کارهای عالی دارد - برای مثال ChatGPT که از پردازش زبان طبیعی برای پاسخ به سؤالات و تعامل با کاربران استفاده می کند.
برای درک واقعی اصول اولیه شبکه های عصبی – وجه اشتراک هر مدل هوش مصنوعی که آن را قادر به کار می کند – باید لایه های فعال سازی را درک کنیم.
یادگیری عمیق = آموزش شبکه های عصبی
![4-2](https://www.freecodecamp.org/news/content/images/2024/01/4-2.png)
هسته اصلی یادگیری عمیق، آموزش شبکه های عصبی است. این بدان معناست که از داده ها برای بدست آوردن مقادیر مناسب برای هر نورون استفاده می کنیم تا بتوانیم آنچه را که قصد داریم پیش بینی کنیم.
شبکه های عصبی از نورون هایی تشکیل شده اند که در لایه ها سازماندهی شده اند. هر لایه ویژگی های منحصر به فردی را از داده ها استخراج می کند.
این ساختار لایه ای به مدل های یادگیری عمیق اجازه می دهد تا داده های پیچیده را تجزیه و تحلیل و تفسیر کنند.
مشکل بزرگ در یادگیری عمیق: کارایی محاسباتی
![data-brett-sayles-4597280](https://www.freecodecamp.org/news/content/images/2024/07/data-brett-sayles-4597280.jpg)
یادگیری عمیق بسیاری از تحولات هوش مصنوعی را در جامعه ایجاد می کند. با این حال، با یک مشکل بزرگ همراه است: کارایی محاسباتی.
آموزش سیستم های هوش مصنوعی یادگیری عمیق به حجم عظیمی از داده ها و قدرت محاسباتی نیاز دارد. این می تواند از چند دقیقه تا چند هفته طول بکشد و در این فرآیند، انرژی و منابع محاسباتی زیادی مصرف می کند.
راه حل های زیادی برای این مشکل وجود دارد، مانند کارایی الگوریتمی بهتر.
در مدلهای زبان بزرگ، این مورد تمرکز بسیاری از تحقیقات هوش مصنوعی بوده است. برای ساخت مدل های کوچکتر عملکردی مشابه مدل های بزرگتر دارند.
راه حل دیگر، علاوه بر کارایی الگوریتمی، راندمان محاسباتی بهتر است. محاسبات کوانتومی یکی از راه حل های مربوط به بازده محاسباتی بهتر است.
یک راه حل: محاسبات کوانتومی
![quantum-googledeepmind-25626507](https://www.freecodecamp.org/news/content/images/2024/07/quantum-googledeepmind-25626507.jpg)
محاسبات کوانتومی یک راه حل امیدوارکننده برای مشکل کارایی محاسباتی در یادگیری عمیق است.
در حالی که کامپیوترهای معمولی در بیت کار می کنند (0 یا 1)، کامپیوترهای کوانتومی با کیوبیت کار می کنند - می توانند همزمان 0 و 1 باشند.
با وجود کیوبیت هایی که همزمان 0 و 1 را نشان می دهند، به لطف خاصیتی به نام برهم نهی در فیزیک کوانتوم، می توان بسیاری از احتمالات را به طور همزمان پردازش کرد.
این امر باعث میشود که کامپیوترهای کوانتومی برای کارهای خاص بسیار کارآمدتر از کامپیوترهای معمولی باشند.
به این ترتیب، میتوان الگوریتمهای مبتنی بر کوانتومی را نیز داشت که کارآمدتر از الگوریتمهای معمولی هستند. به این ترتیب، مصرف انرژی در هنگام ایجاد مدلهای هوش مصنوعی کاهش مییابد.
چرا کامپیوترهای کوانتومی چندان مورد استفاده قرار نمی گیرند؟
مشکل محاسبات کوانتومی این است که نمایش فیزیکی خوب و ارزانی از کیوبیت ها وجود ندارد.
بیتها با گیتهای منطقی ساخته شده از ترانزیستورهای کوچک ساخته و مدیریت میشوند که به راحتی توسط میلیاردها میتوان ایجاد کرد.
کیوبیت ها توسط مدارهای ابررسانا، یون های به دام افتاده و کیوبیت های توپولوژیکی ایجاد و مدیریت می شوند که همگی بسیار گران هستند.
این بزرگترین مشکل در محاسبات کوانتومی است. با این حال، آیبیام، آمازون و بسیاری دیگر در سرویسهای ابری به مردم اجازه میدهند تا کد را روی رایانههای کوانتومی خود اجرا کنند.
مثال کد: یک مدل هوش مصنوعی کوانتومی برای شیمی کوانتومی
![Chemnistry-pixabay-248152](https://www.freecodecamp.org/news/content/images/2024/07/chemnistry-pixabay-248152.jpg)
در این مثال کد، یک مسئله شیمی کوانتومی را حل می کنیم:
کمترین سطح انرژی مولکول H2 با استفاده از محاسبات کوانتومی چقدر است؟
قبل از درک مسئله در دست، بیایید شیمی کوانتومی را مورد بحث قرار دهیم.
شیمی کوانتومی چیست؟
شیمی کوانتومی رشتهای از علم است که به چگونگی رفتار الکترونها در اتمها و مولکولها میپردازد.
این در مورد استفاده از فیزیک کوانتومی برای درک چگونگی تعامل الکترون ها، اتم ها، مولکول ها و بسیاری از ذرات ریز دیگر و تشکیل مواد شیمیایی مختلف است.
مشکلی که قصد داریم حل کنیم
ما قصد داریم "انرژی حالت پایه" مولکول H2 را پیدا کنیم.
مولکول H2 به معنای گاز هیدروژن است که در موارد زیر وجود دارد:
اب
ترکیبات آلی
ستاره ها
در واقع زندگی روی زمین بدون آن امکان پذیر نخواهد بود.
با یافتن «انرژی حالت پایه» که کمترین انرژی ممکنی است که مولکول می تواند داشته باشد، می توانیم پایدارترین شکل و خواص آن را بشناسیم.
این به دانشمندان اجازه می دهد تا واکنش های شیمیایی مربوط به H2 را بهتر درک کنند.
با رایانه های کلاسیک، این مشکل به دلیل تعداد زیادی امکانات و تعاملات پیچیده می تواند بسیار پیچیده باشد.
در رایانه های کوانتومی، کیوبیت ها نمایش خوبی از الکترون ها هستند که می توانند مستقیماً رفتار الکترون ها را در مولکول ها شبیه سازی کنند.
تقریب با VQE (Variational Quantum Eigensolver (VQE)
حل ویژه کوانتومی متغیر (VQE) یک الگوریتم ترکیبی است که از محاسبات کوانتومی و کلاسیک استفاده می کند.
در این مثال، الگوریتم VQE برای یافتن انرژی حالت پایه یک مولکول H2 ساده استفاده می شود.
این کد برای اجرا بر روی یک شبیه ساز کوانتومی (که یک کامپیوتر کلاسیک است که یک الگوریتم کوانتومی را اجرا می کند) طراحی شده است.
با این حال، می توان آن را برای اجرا بر روی سخت افزار کوانتومی واقعی از طریق یک سرویس محاسبات کوانتومی مبتنی بر ابر سازگار کرد.
این شامل استفاده از منابع کوانتومی و کلاسیک در عمل است. بیایید گام به گام کد را مرور کنیم!
import pennylane as qml import numpy as np import matplotlib.pyplot as plt # Define the molecule (H2 at bond length of 0.74 Å) symbols = ["H", "H"] coordinates = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.74]) # Generate the Hamiltonian for the molecule hamiltonian, qubits = qml.qchem.molecular_hamiltonian( symbols, coordinates ) # Define the quantum device dev = qml.device("default.qubit", wires=qubits) # Define the ansatz (variational quantum circuit) def ansatz(params, wires): qml.BasisState(np.array([0] * qubits), wires=wires) for i in range(qubits): qml.RY(params[i], wires=wires[i]) for i in range(qubits - 1): qml.CNOT(wires=[wires[i], wires[i + 1]]) # Define the cost function @qml.qnode(dev) def cost_fn(params): ansatz(params, wires=range(qubits)) return qml.expval(hamiltonian) # Set a fixed seed for reproducibility np.random.seed(42) # Set the initial parameters params = np.random.random(qubits, requires_grad=True) # Choose an optimizer optimizer = qml.GradientDescentOptimizer(stepsize=0.4) # Number of optimization steps max_iterations = 100 conv_tol = 1e-06 # Optimization loop energies = [] for n in range(max_iterations): params, prev_energy = optimizer.step_and_cost(cost_fn, params) energy = cost_fn(params) energies.append(energy) if np.abs(energy - prev_energy) < conv_tol: break print(f"Step = {n}, Energy = {energy:.8f} Ha") print(f"Final ground state energy = {energy:.8f} Ha") # Visualize the results import matplotlib.pyplot as plt iterations = range(len(energies)) plt.plot(iterations, energies) plt.xlabel('Iteration') plt.ylabel('Energy (Ha)') plt.title('Convergence of VQE for H2 Molecule') plt.show()
![1-5](https://www.freecodecamp.org/news/content/images/2024/07/1-5.png)
واردات کتابخانه ها
import pennylane as qml import numpy as np import matplotlib.pyplot as plt
![2-4](https://www.freecodecamp.org/news/content/images/2024/07/2-4.png)
pennylane : کتابخانه ای برای محاسبات کوانتومی که ابزارهایی برای ایجاد و بهینه سازی مدارهای کوانتومی و برای اجرای الگوریتم های کوانتومی مبتنی بر یادگیری ماشین ارائه می دهد.
numpy : کتابخانه ای برای عملیات عددی در پایتون که در اینجا برای مدیریت آرایه ها و محاسبات ریاضی استفاده می شود.
matplotlib : کتابخانه ای برای ایجاد تجسم ها و نمودارها در پایتون که در اینجا برای ترسیم نمودار همگرایی الگوریتم VQE استفاده می شود.
تعریف مولکول و تولید همیلتونین
# Define the molecule (H2 at bond length of 0.74 Å) symbols = ["H", "H"] coordinates = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.74]) # Generate the Hamiltonian for the molecule hamiltonian, qubits = qml.qchem.molecular_hamiltonian( symbols, coordinates )
![3-4](https://www.freecodecamp.org/news/content/images/2024/07/3-4.png)
تعریف مولکول :
ما یک مولکول هیدروژن (H2) تعریف می کنیم.
symbols = ["H", "H"]
: این به این معنی است که مولکول از دو اتم هیدروژن (H) تشکیل شده است.
coordinates = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.74])
: این موقعیت دو اتم هیدروژن را نشان می دهد. اولین اتم هیدروژن در مبدأ (0.0، 0.0، 0.0) و اتم دوم هیدروژن در (0.0، 0.0، 0.74) قرار دارد، به این معنی که 0.74 آنگستروم از اتم اول در امتداد محور z فاصله دارد.
تولید همیلتونین :
hamiltonian, qubits = qml.qchem.molecular_hamiltonian(symbols, coordinates)
: این خط همیلتونی را برای مولکول هیدروژن تولید می کند. هامیلتونی یک جسم ریاضی است که برای توصیف انرژی مولکول استفاده می شود.
hamiltonian
: نشان دهنده عملگر انرژی برای مولکول است.
qubits
: تعداد بیتهای کوانتومی (کیوبیت) مورد نیاز برای شبیهسازی مولکول در یک کامپیوتر کوانتومی را نشان میدهد.
تعریف دستگاه کوانتومی و Ansatz (مدار کوانتومی متغیر)
# Define the quantum device dev = qml.device("default.qubit", wires=qubits) # Define the ansatz (variational quantum circuit) def ansatz(params, wires): qml.BasisState(np.array([0] * qubits), wires=wires) for i in range(qubits): qml.RY(params[i], wires=wires[i]) for i in range(qubits - 1): qml.CNOT(wires=[wires[i], wires[i + 1]])
![4-3](https://www.freecodecamp.org/news/content/images/2024/07/4-3.png)
تعریف دستگاه کوانتومی :
dev = qml.device("default.qubit", wires=qubits)
: این خط یک دستگاه محاسباتی کوانتومی را برای شبیه سازی مولکول ما تنظیم می کند.
"default.qubit"
: این نوع شبیه ساز کوانتومی مورد استفاده ما را مشخص می کند (یک شبیه ساز پیش فرض مبتنی بر کیوبیت).
wires=qubits
: این به شبیهساز او میگوید که بر اساس تعداد کیوبیتهایی که قبلاً تعیین کردیم، چند کیوبیت (بیت کوانتومی) باید استفاده کند.
تعریف آنساتز (مدار کوانتومی متغیر) :
def ansatz(params, wires)
: این تابعی به نام ansatz
را تعریف می کند که مدار کوانتومی متغیر را توصیف می کند. این مدار برای یافتن انرژی حالت پایه مولکول استفاده خواهد شد.
qml.BasisState(np.array np.array([0] * qubits)
qml.BasisState(np.array([0] * qubits), wires=wires)
: این کیوبیت ها را در حالت 0 مقداردهی اولیه می کند. .
for i in range(qubits): qml.RY(params[i], wires=wires[i])
: این حلقه چرخش حول محور Y را برای هر کیوبیت اعمال می کند. params[i]
زاویه هر چرخش را ارائه می دهد.
for i in range(qubits - 1): qml.CNOT(wires=[wires[i], wires[i + 1]])
: این حلقه دروازههای Controlled-NOT (CNOT) را بین کیوبیتهای متوالی اعمال میکند و آنها را درهم میگیرد.
تعریف تابع هزینه، تنظیم پارامترهای اولیه و بهینه ساز
# Define the cost function @qml.qnode(dev) def cost_fn(params): ansatz(params, wires=range(qubits)) return qml.expval(hamiltonian) # Set a fixed seed for reproducibility np.random.seed(42) # Set the initial parameters params = np.random.random(qubits, requires_grad=True) # Choose an optimizer optimizer = qml.GradientDescentOptimizer(stepsize=0.4)
![5-3](https://www.freecodecamp.org/news/content/images/2024/07/5-3.png)
تعریف تابع هزینه :
@qml.qnode(dev)
: این خط یک دکوراتور است که تابع cost_fn
را به یک گره کوانتومی تبدیل میکند و به آن اجازه میدهد روی دستگاه کوانتومی dev
اجرا شود.
def cost_fn(params)
: این تابعی به نام cost_fn
را تعریف می کند که برخی از پارامترها ( params
) را به عنوان ورودی می گیرد.
ansatz(params, wires=range(qubits))
: در داخل این تابع تابع ansatz
که قبلا تعریف شده را فراخوانی می کنیم و پارامترها را عبور می دهیم و مشخص می کنیم که از تمام کیوبیت ها استفاده کند.
return qml.expval(hamiltonian)
: این خط مقدار مورد انتظار Hamiltonian را برمی گرداند که نشان دهنده انرژی مولکول است. تابع هزینه همان چیزی است که ما قصد داریم آن را برای یافتن انرژی حالت پایه به حداقل برسانیم.
تنظیم یک دانه ثابت برای تکرارپذیری :
np.random.seed(42)
: این خط یک دانه ثابت برای مولد اعداد تصادفی تنظیم می کند. این تضمین می کند که اعداد تصادفی تولید شده در هر بار اجرای کد یکسان خواهند بود و نتایج را تکرارپذیر می کند.
تنظیم پارامترهای اولیه :
params = np.random.random(qubits, requires_grad=True)
: این خط پارامترهای ansatz را با مقادیر تصادفی مقداردهی اولیه می کند. تعداد پارامترها برابر است با تعداد کیوبیت ها. قسمت requires_grad=True
نشان می دهد که این پارامترها را می توان در طول بهینه سازی تنظیم کرد.
انتخاب بهینه ساز :
optimizer = qml.GradientDescentOptimizer(stepsize=0.4)
: این خط یک بهینه ساز ایجاد می کند که پارامترها را برای به حداقل رساندن تابع هزینه تنظیم می کند. به طور خاص، از شیب نزول با اندازه گام 0.4 استفاده می کند.
حلقه بهینه سازی
# Number of optimization steps max_iterations = 100 conv_tol = 1e-06 # Optimization loop energies = [] for n in range(max_iterations): params, prev_energy = optimizer.step_and_cost(cost_fn, params) energy = cost_fn(params) energies.append(energy) if np.abs(energy - prev_energy) < conv_tol: break print(f"Step = {n}, Energy = {energy:.8f} Ha") print(f"Final ground state energy = {energy:.8f} Ha")
![6-2](https://www.freecodecamp.org/news/content/images/2024/07/6-2.png)
تنظیم تعداد مراحل بهینه سازی :
max_iterations = 100
: حداکثر تعداد مراحلی را که بهینه سازی انجام خواهد داد را تعیین می کند. در این حالت 100 مرحله است.
conv_tol = 1e-06
: این تلورانس همگرایی را تعریف می کند. اگر تغییر انرژی بین مراحل کمتر از این مقدار باشد، بهینه سازی متوقف می شود.
حلقه بهینه سازی :
energies = []
: این یک فهرست خالی را برای ذخیره انرژی های محاسبه شده در هر مرحله مقداردهی اولیه می کند.
حلقه زدن از طریق مراحل بهینه سازی :
for n in range(max_iterations):
: این یک حلقه را شروع می کند که تا max_iterations
بار اجرا می شود.
params, prev_energy = optimizer.step_and_cost(cost_fn, params)
: این خط یک مرحله از بهینه سازی را انجام می دهد. پارامترها را به روز می کند و پارامترهای جدید و انرژی قبلی را برمی گرداند.
energy = cost_fn(params)
: این انرژی جاری را با استفاده از پارامترهای به روز شده محاسبه می کند.
energies.append(energy)
: این انرژی فعلی را به فهرست energies
اضافه می کند.
if np.abs(energy - prev_energy) < conv_tol: break
: تحلیل می کند که آیا اختلاف مطلق بین انرژی فعلی و انرژی قبلی کمتر از تحمل همگرایی باشد. اگر اینطور باشد، حلقه زود متوقف می شود زیرا بهینه سازی همگرا شده است.
print(f"Step = {n}, Energy = {energy:.8f} Ha")
: این عدد گام فعلی و انرژی را در هارتری (Ha) تا هشت رقم اعشار چاپ میکند.
چاپ انرژی نهایی :
print(f"Final ground state energy = {energy:.8f} Ha")
: بعد از حلقه، انرژی حالت پایه نهایی را چاپ می کند.
تجسم نتایج
# Visualize the results iterations = range(len(energies)) plt.plot(iterations, energies) plt.xlabel('Iteration') plt.ylabel('Energy (Ha)') plt.title('Convergence of VQE for H2 Molecule') plt.show()
![7](https://www.freecodecamp.org/news/content/images/2024/07/7.png)
تنظیم داده ها برای تجسم :
iterations = range(len(energies))
: این یک شی محدوده ایجاد می کند که نشان دهنده تعداد تکرارها (مراحل) است که بهینه سازی طی کرده است. len(energies)
تعداد مقادیر انرژی ثبت شده را نشان می دهد.
ترسیم نتایج :
plt.plot(iterations, energies)
: این خط نموداری با اعداد تکرار در محور x و مقادیر انرژی مربوطه در محور y ایجاد می کند.
plt.xlabel('Iteration')
: این برچسب را برای محور x روی "تکرار" تنظیم می کند.
plt.ylabel('Energy (Ha)')
: این برچسب محور y را روی "انرژی (Ha)" تنظیم می کند، جایی که "Ha" مخفف Hartree، یک واحد انرژی است.
plt.title('Convergence of VQE for H2 Molecule')
: این عنوان طرح را روی "همگرایی VQE برای مولکول H2" تنظیم می کند.
plt.show()
: این نمودار را نمایش می دهد.
نمودار با عنوان "همگرایی VQE برای مولکول H2" انرژی (به Hartree، Ha) مولکول H2 را در برابر تعداد تکرارهای الگوریتم حل ویژه کوانتومی متغیر (VQE) نشان می دهد.
X-Axis (Iteration): تعداد تکرارهای VQE.
محور Y (انرژی (Ha)): انرژی مولکول H2 در هارتری.
امتیاز کلیدی:
انرژی اولیه: تقریباً 1.4 هکتار در تکرار 0.
کاهش سریع: انرژی در 20 تکرار اول به سرعت کاهش می یابد.
Plateau: انرژی پس از 20 تکرار در حدود 0.4 هکتار تثبیت می شود که نشان دهنده همگرایی به یک راه حل بهینه یا نزدیک به بهینه است.
نتیجه گیری: محدودیت های محاسبات و توسعه کوانتومی
![PC-richashharma96-4247412](https://www.freecodecamp.org/news/content/images/2024/07/PC-richasharma96-4247412.jpg)
محاسبات کوانتومی علاوه بر اینکه الگوریتمهای هوش مصنوعی را از نظر محاسباتی کارآمدتر میکند، میتواند در بسیاری از زمینهها مانند:
کشف مواد مخدر
علم مواد
رمزنگاری
مدل سازی مالی
مشکلات بهینه سازی
مدل سازی آب و هوا
فراگیری ماشین
با این حال، برای اینکه همه ما از محاسبات کوانتومی استفاده کنیم، راهی برای نمایش فیزیکی کیوبیتها به اندازه کافی کوچک برای جا دادن روی لپتاپهایمان مورد نیاز است. که سالها طول خواهد کشید.
کد کامل را می توانید در اینجا پیدا کنید:
ارسال نظر