动手看 Neural Networks Zero to Hero
一直以来没有很正经地入门过机器学习,又天天刷到 Karpathy 的动手实践部分,考虑到他作为 Tesla 的 AI 总监,于是还是绝知此事要躬行,开始看他写的 Neural Networks Zero to Hero。
第一节课讲的是自动微分,先简单地用 python 演示了对应的定义,之后就开始定义类型。
class Value:
def __init__(self, data): self.data = data
def __repr__(self): return f"Value(data={self.data})"
def __add__(self, other): out = Value(self.data + other.data) return out
def __mul__(self, other): out = Value(self.data * other.data) return out
a = Value(1)b = Value(2)a + b随后我们需要知道是什么操作和前置的操作数,这里是这么设计的
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): out = Value(self.data + other.data, (self, other), '+') return out
def __mul__(self, other): out = Value(self.data * other.data, (self, other), '*') return out
a = Value(1)b = Value(2)c = a + bc._prevc._op输出如下
Value(data=3){Value(data=1), Value(data=2)}+然后用这段代码实现了可视化
from graphviz import Digraphfrom micrograd.engine import Valuedef trace(root): 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, format='svg', rankdir='LR'): """ format: png | svg | ... rankdir: TB (top to bottom graph) | LR (left to right) """ assert rankdir in ['LR', 'TB'] nodes, edges = trace(root) dot = Digraph(format=format, graph_attr={'rankdir': rankdir}) #, node_attr={'rankdir': 'TB'})
for n in nodes: dot.node(name=str(id(n)), label = "{ data %.4f | grad %.4f }" % (n.data, n.grad), shape='record') if n._op: dot.node(name=str(id(n)) + n._op, label=n._op) dot.edge(str(id(n)) + n._op, str(id(n)))
for n1, n2 in edges: dot.edge(str(id(n1)), str(id(n2)) + n2._op)
return dot我们构建了这么一个图,这个图如果在梯度下降的计算中就有可能是损失函数的计算了。