Skip to content

动手看 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 + b
c._prev
c._op

输出如下

Terminal window
Value(data=3)
{Value(data=1), Value(data=2)}
+

然后用这段代码实现了可视化

from graphviz import Digraph
from micrograd.engine import Value
def 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

我们构建了这么一个图,这个图如果在梯度下降的计算中就有可能是损失函数的计算了。