توابع از دست دادن و تجمع پارامتر NN در میکروگراد

سلام من Shrijith Venkatrama ، بنیانگذار Hexmos هستم. در حال حاضر ، من در حال ساختن LiveApi هستم ، ابزاری که تولید اسناد API را از کد شما به طرز مسخره ای آسان می کند.
یک مجموعه داده نمونه و مقایسه با پیش بینی ها
در مجموعه داده زیر ، 4 ورودی/خروجی به عنوان مثال داریم. و هر ورودی 3 شماره دارد.
ما از شبکه عصبی (شیء MLP) تعریف شده در آخرین پست برای انجام برخی پیش بینی ها در مورد هر ورودی استفاده می کنیم.
xs = [
[2.0, 3.0, -1.0],
[3.0, -1.0, 0.5],
[0.5, 1.0, 1.0],
[1.0, 1.0, -1.0],
]
ys = [1.0, -1.0, -1.0, 1.0] # desired targets
ypred = [n(x) for x in xs]
ypred
وقتی این کار را اجرا کردم ، پیش بینی هایی می گیرم که کمی کمتر از حد مورد نیاز یا بیشتر هستند:
یک اسکلت برای ساختن یک عملکرد از دست دادن
کد:
ما یک متغیر ضرر را تعریف می کنیم و به روش زیر تعریف می کنیم:
- تفاوت بین خروجی واقعی در مقابل خروجی پیش بینی شده را پیدا کنید
- مربع تفاوت (برای حذف مبلغ منفی)
- جمع همه این مربع های اختلاف برای مجموعه ورودی/خروجی کامل
loss = sum((yout - ygt)**2 for ygt, yout in zip(ys, ypred))
loss.grad = 1
loss.backward()
n.layers[0].neurons[0].w[0].grad
پس از اینکه گره ضرر داشتیم ، می توانیم انتشار عقب را اجرا کنیم تا شیب هر گره بدست آوریم.
وقتی این کار را می کنیم draw_dot(loss)
ما یک نمودار عظیم متشکل از 4 پاس رو به جلو متناسب با 4 نمونه فوق و از دست دادن در بالای آن دریافت می کنیم.
جمع آوری کلیه پارامترهای شبکه عصبی و کار بر روی آنها
توجه به parameters()
روش در هر یک از کلاسهای زیر – جایی که پارامترهای مختلف را در هر سطح (نورون ، لایه ، MLP) جمع آوری می کنیم:
class Neuron:
def __init__(self, nin):
self.w = [Value(random.uniform(-1,1)) for _ in range(nin)]
self.b = Value(random.uniform(-1,1))
def __call__(self, x):
# w * x + b
act = sum((wi * xi for wi, xi in zip(self.w, x)), self.b)
out = act.tanh()
return out
def parameters(self):
return self.w + [self.b]
class Layer:
def __init__(self, nin, nout):
self.neurons = [Neuron(nin) for _ in range(nout)]
def __call__(self, x):
outs = [n(x) for n in self.neurons]
return outs[0] if len(outs) == 1 else outs
def parameters(self):
params = []
for neuron in self.neurons:
params.extend(neuron.parameters())
return params
class MLP:
def __init__(self, nin, nouts):
sz = [nin] + nouts
self.layers = [Layer(sz[i], sz[i+1]) for i in range(len(nouts))]
def __call__(self, x):
for layer in self.layers:
x = layer(x)
return x
def parameters(self):
params = []
for layer in self.layers:
params.extend(layer.parameters())
return params
حالا وقتی این کار را می کنم n.parameters()
من تمام پارامترها را در شبکه عصبی دریافت می کنم:
مرجع
مقدمه املایی به شبکه های عصبی و backpropagation: ساختمان میکروگراد – YouTube