網(wǎng)站建設(shè)開發(fā)流程dz網(wǎng)站模版
鶴壁市浩天電氣有限公司
2026/01/24 14:14:27
網(wǎng)站建設(shè)開發(fā)流程,dz網(wǎng)站模版,做網(wǎng)站和軟件有區(qū)別嗎,網(wǎng)頁(yè)二級(jí)頁(yè)面設(shè)計(jì)1. 什么是優(yōu)化器#xff1f;—— 參數(shù)的“首席調(diào)校師”在上一篇文章中#xff0c;我們通過(guò)自動(dòng)微分成功獲取了每個(gè)參數(shù)的梯度#xff08;Gradient#xff09;。梯度告訴了我們參數(shù)應(yīng)該“朝哪個(gè)方向”調(diào)整。但還有兩個(gè)問(wèn)題沒(méi)有解決#xff1a;“調(diào)整的幅度應(yīng)該是多大#…1. 什么是優(yōu)化器—— 參數(shù)的“首席調(diào)校師”在上一篇文章中我們通過(guò)自動(dòng)微分成功獲取了每個(gè)參數(shù)的梯度Gradient。梯度告訴了我們參數(shù)應(yīng)該“朝哪個(gè)方向”調(diào)整。但還有兩個(gè)問(wèn)題沒(méi)有解決“調(diào)整的幅度應(yīng)該是多大” 步子邁得太大容易“扯著”導(dǎo)致模型在最優(yōu)解附近來(lái)回震蕩難以收斂步子太小訓(xùn)練速度又會(huì)過(guò)于緩慢?!坝烧l(shuí)來(lái)負(fù)責(zé)執(zhí)行這個(gè)調(diào)整操作”優(yōu)化器 (Optimizer)就是這個(gè)問(wèn)題的終極答案。它的核心職責(zé)是根據(jù)自動(dòng)微分計(jì)算出的梯度采用一套特定的更新策略去修改網(wǎng)絡(luò)中的每一個(gè)可訓(xùn)練參數(shù)。1.1 最經(jīng)典的優(yōu)化器SGD最基礎(chǔ)、最經(jīng)典的優(yōu)化器是隨機(jī)梯度下降 (Stochastic Gradient Descent, SGD)。它的更新策略非常直觀可以用一個(gè)簡(jiǎn)單的公式來(lái)描述new_parameter old_parameter - learning_rate * gradientold_parameter: 參數(shù)當(dāng)前的值。gradient: 該參數(shù)的梯度。learning_rate(學(xué)習(xí)率): 這是一個(gè)超參數(shù)需要我們手動(dòng)設(shè)定它控制了每次參數(shù)更新的“步長(zhǎng)”。這是一個(gè)非常重要的參數(shù)它的設(shè)置直接影響模型的訓(xùn)練效果和速度。比喻: 想象你在一個(gè)漆黑的山谷里想要走到谷底損失函數(shù)的最小值點(diǎn)。你的每一步都遵循這個(gè)策略用腳探查一下四周哪個(gè)方向是下山最陡峭的計(jì)算梯度。朝著這個(gè)最陡峭的方向邁出一小步更新參數(shù)。這一步的大小就是學(xué)習(xí)率。循環(huán)往復(fù)直到你感覺(jué)自己已經(jīng)走到了谷底梯度接近于0。MindSpore在mindspore.nn庫(kù)中內(nèi)置了SGD以及許多更先進(jìn)的優(yōu)化器如Adam,RMSProp等。它們都遵循“梯度學(xué)習(xí)率更新參數(shù)”的基本邏輯但采用了更復(fù)雜的策略來(lái)動(dòng)態(tài)地調(diào)整學(xué)習(xí)率或考慮歷史梯度信息以實(shí)現(xiàn)更快、更穩(wěn)定的收斂。2. 完整的訓(xùn)練流程串聯(lián)所有知識(shí)點(diǎn)現(xiàn)在我們將前面幾章的所有知識(shí)點(diǎn)串聯(lián)起來(lái)形成一個(gè)完整的、可執(zhí)行的單步訓(xùn)練流程 (Train Step)。前向傳播: 將一批訓(xùn)練數(shù)據(jù)輸入網(wǎng)絡(luò)得到預(yù)測(cè)結(jié)果。計(jì)算損失: 將預(yù)測(cè)結(jié)果與真實(shí)標(biāo)簽進(jìn)行比較通過(guò)損失函數(shù)計(jì)算出當(dāng)前的損失值。計(jì)算梯度 (反向傳播): 以損失值為起點(diǎn)通過(guò)自動(dòng)微分計(jì)算出損失關(guān)于網(wǎng)絡(luò)中每一個(gè)可訓(xùn)練參數(shù)的梯度。更新參數(shù): 將計(jì)算出的梯度交給優(yōu)化器優(yōu)化器根據(jù)其內(nèi)部策略如SGD的公式來(lái)更新網(wǎng)絡(luò)的所有參數(shù)。這個(gè)流程會(huì)一遍又一遍地重復(fù)。我們將整個(gè)數(shù)據(jù)集完整地過(guò)一遍這個(gè)流程稱為一個(gè)Epoch。一個(gè)完整的模型訓(xùn)練通常需要迭代很多個(gè)Epoch。3. 實(shí)戰(zhàn)從零開始訓(xùn)練一個(gè)線性回歸模型理論講了這么多讓我們來(lái)點(diǎn)真格的。我們將用MindSpore完整地訓(xùn)練一個(gè)最簡(jiǎn)單的線性回歸模型來(lái)擬合函數(shù)y 2x 0.5。我們的目標(biāo)是讓模型通過(guò)學(xué)習(xí)自動(dòng)地找出權(quán)重W趨近于2偏置b趨近于0.5。import numpy as np import mindspore from mindspore import nn, ops, Tensor # --- 準(zhǔn)備工作 --- mindspore.set_context(modemindspore.PYNATIVE_MODE) # 1. 創(chuàng)建一個(gè)簡(jiǎn)單的數(shù)據(jù)集 # 真實(shí)函數(shù)為 y 2x 0.5 x_data np.linspace(-1, 1, 100, dtypenp.float32).reshape(-1, 1) y_data 2 * x_data 0.5 np.random.normal(0, 0.05, x_data.shape).astype(np.float32) # 2. 定義我們的網(wǎng)絡(luò)、損失函數(shù)和優(yōu)化器 # 我們的模型就是一個(gè)簡(jiǎn)單的線性層 y Wx b # 輸入維度是1輸出維度也是1 net nn.Dense(in_channels1, out_channels1) loss_fn nn.MSELoss() # 均方誤差損失 # 使用SGD優(yōu)化器傳入網(wǎng)絡(luò)中需要訓(xùn)練的參數(shù)并設(shè)置學(xué)習(xí)率 optimizer nn.SGD(net.trainable_params(), learning_rate0.01) # 3. 定義前向計(jì)算和梯度計(jì)算的邏輯 def forward_fn(data, label): logits net(data) loss loss_fn(logits, label) return loss, logits # 獲取梯度計(jì)算函數(shù) grad_fn ops.GradOperation(get_by_listTrue)(forward_fn, net.trainable_params()) # --- 開始訓(xùn)練 --- epochs 10 # 訓(xùn)練10輪 for epoch in range(epochs): # 在每個(gè)epoch開始時(shí)我們重新獲取一次數(shù)據(jù) # 在實(shí)際項(xiàng)目中這里會(huì)使用MindSpore的Dataset庫(kù)來(lái)高效加載數(shù)據(jù) data Tensor(x_data) label Tensor(y_data) # 1. 計(jì)算梯度 loss, grads grad_fn(data, label) # 2. 使用優(yōu)化器更新參數(shù) # optimizer接收梯度作為輸入自動(dòng)完成參數(shù)更新 optimizer(grads) if (epoch 1) % 2 0: print(fEpoch {epoch1:2d}, Loss: {loss.asnumpy():.6f}) # --- 驗(yàn)證結(jié)果 --- # 訓(xùn)練完成后我們打印出學(xué)習(xí)到的參數(shù) trained_params net.trainable_params() weight trained_params[0] bias trained_params[1] print(*20) print(f學(xué)習(xí)到的權(quán)重 (W): {weight.asnumpy()[0][0]:.4f}) print(f學(xué)習(xí)到的偏置 (b): {bias.asnumpy()[0]:.4f}) print(理論值應(yīng)分別接近 2.0 和 0.5)代碼與結(jié)果解讀:我們首先人工創(chuàng)建了一個(gè)帶有少許噪音的數(shù)據(jù)集。然后我們定義了網(wǎng)絡(luò)、損失函數(shù)和優(yōu)化器這是訓(xùn)練前的“三件套”。在訓(xùn)練循環(huán)中我們嚴(yán)格按照“計(jì)算梯度 - 優(yōu)化器更新”的流程執(zhí)行。訓(xùn)練結(jié)束后你會(huì)看到打印出的損失值Loss在不斷減小這說(shuō)明模型確實(shí)在“學(xué)習(xí)”。最終打印出的權(quán)重和偏置會(huì)非常接近我們?cè)O(shè)定的真實(shí)值2.0和0.5。這雄辯地證明了我們的模型通過(guò)“看”這些數(shù)據(jù)成功地“領(lǐng)悟”了它們背后的規(guī)律4. 更高效的方式MindSpore高階API搶先看雖然上面的手動(dòng)訓(xùn)練循環(huán)清晰地展示了每一步的原理但在實(shí)際項(xiàng)目中MindSpore提供了更簡(jiǎn)潔、更高效的高階APIModel來(lái)封裝這個(gè)過(guò)程。# 以下是偽代碼展示其簡(jiǎn)潔性 from mindspore.dataset import NumpySlicesDataset from mindspore import Model # 將數(shù)據(jù)封裝成MindSpore的Dataset對(duì)象 dataset NumpySlicesDataset({data: x_data, label: y_data}, shuffleTrue) dataset dataset.batch(32) # 使用Model API封裝網(wǎng)絡(luò)、損失函數(shù)和優(yōu)化器 model Model(net, loss_fn, optimizer) # 一行代碼完成訓(xùn)練 model.train(epoch10, train_datasetdataset)我們將在后續(xù)的文章中詳細(xì)介紹Dataset和Model的使用。了解這一點(diǎn)是為了讓你知道MindSpore既提供了讓你能“深入引擎艙”手動(dòng)操作的底層API也提供了讓你能“舒適駕駛”的高層API。5. 總結(jié)恭喜你在本文中你成功地將之前學(xué)到的所有碎片化知識(shí)組裝成了一個(gè)完整的“學(xué)習(xí)引擎”并親自見(jiàn)證了一個(gè)模型從“一無(wú)所知”到“習(xí)得規(guī)律”的全過(guò)程。優(yōu)化器是學(xué)習(xí)過(guò)程的執(zhí)行者它使用梯度和學(xué)習(xí)率來(lái)更新模型參數(shù)。一個(gè)標(biāo)準(zhǔn)的訓(xùn)練循環(huán)包含前向傳播、計(jì)算損失、計(jì)算梯度、更新參數(shù)這四個(gè)核心步驟。至此你已經(jīng)掌握了使用MindSpore進(jìn)行模型訓(xùn)練的最小且最完整的核心理論和實(shí)踐技能。