نمایش عبارات ریاضی به عنوان نمودارها در میکروگراد

سلام من Shrijith Venkatrama ، بنیانگذار Hexmos هستم. در حال حاضر ، من در حال ساختن LiveApi هستم ، ابزاری که تولید اسناد API را از کد شما به طرز مسخره ای آسان می کند.
آنچه می خواهیم نمایندگی کنیم
در آخرین پست ، ما به صورت دستی برخی از محاسبه های شیب را انجام دادیم:
h = 0.001
#inputs
a = 2.0
b = -3.0
c = 10.0
d1 = a*b + c
c += h
d2 = a*b + c
print(f"d1 = {d1}")
print(f"d2 = {d2}")
print(f"w.r.t a (d2 - d1) / h = {(d2 - d1) / h}")
هدف نشان دادن عبارت فوق است L = a*b + c
به روشی آسان ، و سپس عملیات مهم را در مورد آن انجام دهید ، مانند Find dL/da
با dL/db
با dL/dc
، و غیره این مهم است زیرا آموزش شبکه عصبی در مورد تنظیم مقادیر هر گره در نمودار بیان است ، تا زمانی که ورودی ها به صورت مطلوب نقشه برداری شوند.
ساختمان Value
کلاس (بنیاد دریافت شبکه های عصبی)
اولین قدم برای تحقق موارد فوق نشان دادن یک مقدار واحد است.
تکرار 1: یک مقدار واحد را نشان می دهد
class Value:
def __init__(self, data):
self.data = data
def __repr__(self):
return f"Value(data={self.data})"
تکرار 2: مقادیر و عملیات متعدد را بر روی آنها نشان می دهد
ما علاوه بر این و تکثیر را در Value
کلاس به طوری که بتوانیم انجام دهیم a + b
یا a * b + c
class Value:
def __init__(self, data):
self.data = data
def __repr__(self):
return f"Value(data={self.data})"
def __add__(self, other):
return Value(self.data + other.data)
def __mul__(self, other):
return Value(self.data * other.data)
a = Value(2.0)
b = Value(-3.0)
print(a*b)
c = Value(10)
print(a * b + c)
print((a.__mul__(b)).__add__(c)) # same as above
تکرار 3: کامل عبارات را ذخیره کنید
مرحله بعدی ذخیره “زنجیره کل” ارزش ها و عملیات در یک نمودار خوب است.
نحوه انجام این کار از طریق معرفی دو ویژگی شیء جدید است: _prev
وت _op
بشر برای هر گره – ما ضبط می کنیم گره های زیر/قبل از آن چیست. و همچنین – ما مشخص می کنیم که چه عملیاتی بین گره هایی انجام شده است که قبل از آن برای بدست آوردن گره فعلی انجام شده است.
class Value:
def __init__(self, data, _children=(), _op=''):
self.data = data
self._prev = set(_children)
self._op = _op
def __repr__(self):
return f"Value(data={self.data})"
def __add__(self, other):
return Value(self.data + other.data, (self, other), '+')
def __mul__(self, other):
return Value(self.data * other.data, (self, other), '-')
a = Value(2.0)
b = Value(-3.0)
c = Value(10)
e = a * b
d = e + c
print(d._prev)
print(d._op)
print("---")
print(e._prev)
print(e._op)`
تجسم نمودار بیان
Karpathy کمی از کد خوب ساخته شده در بالای Graphviz را برای نمایش عبارات به عنوان نمودار به اشتراک می گذارد. مقادیر در اسکارا ها و عملیات در بیضی ها نشان داده شده است:
from graphviz import Digraph
def trace(root):
# Builds a set of all nodes and edges in a graph
nodes, edges = set(), set()
def build(v):
if v not in nodes:
nodes.add(v)
for child in v._prev:
edges.add((child, v))
build(child)
build(root)
return nodes, edges
def draw_dot(root):
dot = Digraph(format='svg', graph_attr={'rankdir': 'LR'}) # LR = left to right
nodes, edges = trace(root)
for n in nodes:
uid = str(id(n))
# For any value in the graph, create a rectangular ('record') node for it
dot.node(name=uid, label="{ data %.4f }" % (n.data,), shape='record')
if n._op:
# If this value is a result of some operation, create an op node for it
dot.node(name=uid + n._op, label=n._op)
# And connect this node to it
dot.edge(uid + n._op, uid)
for n1, n2 in edges:
# Connect n1 to the op node of n2
dot.edge(str(id(n1)), str(id(n2)) + n2._op)
return dot
من می توانم موارد زیر را برای دریافت تصویری از نمودار انجام دهم:
draw_dot(d) # where d is the expression defined above
مرجع
مقدمه املایی به شبکه های عصبی و backpropagation: ساختمان میکروگراد)