Matematikten eğitime
Sayısal bir türev hesabı ve y=2x+1 öğrenen tam program.
01Bir örneği elle hesaplayın#
x=[1,2], W=[3,4], b=0 için tek çıkışlı Linear y=11 verir. Hedef t=10 ve L=(y−t)²/2 olsun; kayıp 0.5, dış gradyan dy=1 olur. backward’a 1 vermek bu belirli kaybın doğru türevidir.
02Gradyanın anlamı#
dW=[1,2], db=1 ve dx=[3,4]. η=0.1 ile SGD ağırlıkları [2.9,3.8], bias −0.1 yapar. Aynı girdiyle yeni y=10.4 ve yeni kayıp 0.08 olur. Türev, parametrede küçük bir değişimin kaybı hangi yönde değiştireceğini söyler.
03Batch ortalaması#
Aşağıdaki program MSE=(1/B)Σ(y−t)² kullanır; önceki yarım-kare örneğinden farklı olarak 2/B çarpanı gerekir. Batch ortalamasını yalnız bir kere uygulayın. Her adımın başında zero_grad birikimi temizler.
04Tam çalışan eğitim örneği#
Bu örnek yalnız NexusModel kullanır; MSE ve sade SGD eğitim amacıyla açık yazılmıştır. Genel optimizer özellikleri için NexusOptim entegrasyonunu kullanın. Program 200 adım sonra kayıp 1e−3 altında ise başarı koduyla çıkar.
#include <nexus_model/nexus_model.hpp>#include <iostream>using namespace nexus_model;int main() { init::manual_seed(42); Linear model(1,1); auto x=Tensor::from_values({5,1},{-2,-1,0,1,2}); auto target=Tensor::from_values({5,1},{-3,-1,1,3,5}); auto dy=Tensor::zeros({5,1}); float loss=0; for(int step=0;step<200;++step) { model.zero_grad(); auto y=model.forward(x); loss=0; for(std::size_t i=0;i<y.numel();++i) { float e=y[i]-target[i]; loss+=e*e/5.f; dy[i]=2.f*e/5.f; } model.backward(dy); // Educational SGD; use NexusOptim for production optimizers. for(auto* p:model.parameters()) for(std::size_t i=0;i<p->data.numel();++i) p->data[i]-=0.03f*p->grad[i]; } std::cout<<"MSE: "<<loss<<"\n"; return loss<1e-3f ? 0 : 1;}