这几天在看同学推荐的这本书,看到了大概百来页,感觉受益匪浅,很多老师上课没讲到的东西在书里都有详细介绍。
平时上课做机器学习的作业实验基本都是调用模型直接套,没有去关注具体的方法,这本书都帮我巩固了很多知识点,也让我学到了不少新东西。
目前刚看完多层感知机那一章,包括前一章的线性神经网络和前前一章的预备知识都有太多我想做笔记的知识点,现在补回来,之后每看一节都会记录笔记。
第2章:预备知识
2.5 自动微分
这里学到了一个从没见过的东西:反向传播计算梯度,原理是在计算函数的过程中跟踪计算是哪些数据通过哪些操作组合起来产生输出,然后自动微分系统就能反向传播计算梯度。
from mxnet import autograd, np, npxnpx.set_np()x = np.arange(4.0)
# x = [0., 1., 2., 3.]# 通过调用attach_grad来为一个张量的梯度分配内存
x.attach_grad()
# 在计算关于x的梯度后,将能够通过'grad'属性访问它,它的值被初始化为0
# 这里可以输出x.grad,这时为[0., 0., 0., 0.]y = 2 * np.dot(x, x) # 把y当成关于x的函数y.backward()
# 这里输出x.grad,为[ 0., 4., 8., 12.]
在后面经常会用上,可以很方便的计算函数在某个点的梯度,有助于优化模型
2.6 概率
这里重温了概率论,条件分布和联合分布计算相关内容。
第三章:线性神经网络
3.2 线性回归的从零开始实现
这里首次用到了前面的梯度函数,基本流程:
①循环轮次(epoch)
②开始随机遍历数据集,计算损失函数
③反向传播计算梯度
④更新参数
⑤计算训练集损失
⑥输出轮次和训练集损失
for epoch in range(num_epochs):for X, y in data_iter(batch_size, features, labels):l = loss(net(X, w, b), y) # X和y的小批量损失# 计算l关于[w,b]的梯度l.backward()sgd([w, b], lr, batch_size) # 使用参数的梯度更新参数train_l = loss(net(features, w, b), labels)print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')
3.3 线性回归的简洁实现
这里学习到了一个函数,nn.Sequential和nn.Linear,都是定义模型的函数,Sequential里面可以传入多个Linear(线性模型)和ReLU(激活函数),比如
model = nn.Sequential(nn.Linear(in_features=input_size, out_features=hidden_size),nn.ReLU(),nn.Linear(in_features=hidden_size, out_features=output_size)
)
这个实例中模型首先通过一个线性层,再通过一个激活函数,再通过一个线性层。
3.4 softmax回归
这里学到了使用softmax函数的分类模型,以及它的损失和损失函数的梯度怎么求,这里要注意区分计算预测正确的函数的梯度和预测错误的函数的梯度。
第四章:多层感知机
4.1 多层感知机
这里学习了三个激活函数,ReLU、sigmoid、tanh函数。在机器学习课上老师只讲sigmoid函数,结果书里说sigmoid早就落伍了,用的最多的是ReLU函数。
4.5 权重衰减
权重衰减的做法是将权重增加到损失函数中,因为要保证权重向量较小。
4.6 暂退法
暂退法的做法是在训练时丢弃部分神经元的输出,这样可以避免模型太过依赖某一个神经元,所以在训练过程中我们随机扔掉一部分神经元输出,使模型不会过分依赖某一个神经元。