当前位置: 首页 > news >正文

记录学习《手动学习深度学习》这本书的笔记(一)

这几天在看同学推荐的这本书,看到了大概百来页,感觉受益匪浅,很多老师上课没讲到的东西在书里都有详细介绍。

平时上课做机器学习的作业实验基本都是调用模型直接套,没有去关注具体的方法,这本书都帮我巩固了很多知识点,也让我学到了不少新东西。

目前刚看完多层感知机那一章,包括前一章的线性神经网络和前前一章的预备知识都有太多我想做笔记的知识点,现在补回来,之后每看一节都会记录笔记。

第二章:预备知识

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 权重衰减

权重衰减的做法是将权重增加到损失函数中,因为要保证权重向量较小。

就是规定损失函数是原损失函数加上权重的L2正则化,这样使得权重不会过大。

4.6 暂退法

暂退法的做法是在训练时丢弃部分神经元的输出,这样可以避免模型太过依赖某一个神经元,所以在训练过程中我们随机扔掉一部分神经元输出,使模型不会过分依赖某一个神经元。

要注意这个操作只在训练数据中,预测数据不用。

4.7 前向传播、反向传播和计算图

在这一节学到了前向传播和反向传播的具体计算方法,利用前面学到的权重衰减。下面这个图就很直观。

体现了前向传播是怎么计算的。

而反向传播就像它的逆过程,从J开始反向传播到W(1)和W(2)。反向传播按相反的顺序计算和存储神经网络中的中间变量和参数的梯度。

4.8 数值稳定性和模型初始化

这里引入了梯度爆炸和梯度消失问题,在参数过大或过小时会引发这两种问题,

sigmoid激活函数现在不常用就是因为可能会引发梯度消失。

而梯度爆炸是由神经网络初始化不好导致的。

还有一个由初始化导致的问题是神经网络的对称性,如果两个权重都初始化同一个值,会使在后面的学习中俩神经元表现相同,无法学习到不同特征。小批量随机梯度下降不会打破这种特征,但暂退法正则化可以。

缓解以上问题的方法就是进行合适的参数初始化。

参数初始化时,假设输入的数方差为\gamma _{}^{2},权重方差为\alpha ^{2},均值都为0,那么隐藏层方差为输入数量乘以前面两个方差,理应使输入数量乘以\alpha ^{2}为1,反向推断应该使输出数量乘以\alpha ^{2}为1,结合可知\alpha ^{2}应该在\frac{2}{n_{in}+n_{out}}左右。

4.9 环境和分布偏移

这里介绍了三种分布偏移,协变量偏移标签偏移概念偏移

主要原因是当初训练是数据与现在或现实数据不太匹配,训练集和测试集不来自同一分布,导致模型不能通用。

如果要再对现实数据训练新的模型,又需要收集数据建立训练集,太麻烦了,为了使之前的模型还能用,这里提出了一些解决方法,主要针对协变量偏移和标签偏移(概念偏移目前没有找到好的解决方法,因为那个主要是人为因素引发的,是主观问题,不是模型问题)。

纠正协变量偏移:使用重要性加权。这种偏移可以假设P(y|x)不变。

协变量偏移主要是输入样本分布改变导致的,即源分布q(x)和目标分布p(x)有偏差。

可以使用恒等式纠正:

\int \int l(f(x),y)p(y|x)p(x) dxdy = \int \int l(f(x),y)q(y|x)q(x)\frac{p(x)}{q(x)} dxdy

即将q(y|x)q(x)(源分布)转化为p(y|x)p(x)(目标分布)。

只需计算以下源样本和目标样本的分布比例\frac{p(x)}{q(x)}对数据进行加权即可。

纠正标签偏移:和纠正协变量偏移类似。这种偏移可以假设P(x|y)不变。

标签偏移主要是输出样本分布改变导致的,即源分布q(y)和目标分布p(y)有偏差。

可以使用恒等式纠正:

\int \int l(f(x),y)p(x|y)p(y) dxdy = \int \int l(f(x),y)q(x|y)q(y)\frac{p(y)}{q(y)} dxdy

可以设一个混淆矩阵C,这是一个k×k矩阵,元素c_{ij}代表真实标签为j模型预测为i的样本数占比。

\mu (\hat{y})为模型输出。

估计测试集标签分布:

Cp(y)=\mu (\hat{y})

然后就可以解得p(y)代入式子中。

关于处理分布不断变化的知识,我们还可以考虑其他方面,比如在线学习,机器在预测的过程中通过预测的真实结果不断学习,更新模型。

4.10 实战Kaggle比赛:预测房价

这里学到了一个K折交叉验证,具体做法是将数据分为K折,每次预测选取K-1折作为训练集,剩下的1折作为测试集,重复K次。这样可以更好的利用全部数据。


http://www.mrgr.cn/news/78595.html

相关文章:

  • homework 2025.01.07 math 6
  • C++ shared_ptr进一步认知,为什么引用计数>2退出作用域都可以调用析构
  • BERT:深度双向Transformer的预训练用于语言理解
  • 字节青训入营考核十五题-Java-找单独的数
  • [创业之路-241]:《从偶然到必然-华为研发投资与管理实践》-2- IPD流程中的业务线、技术线、职能支撑线
  • 网络安全常见的问题
  • (Python)前缀和
  • OPTEE v4.4.0 FVP环境搭建(支持hafnium)
  • 【北京迅为】iTOP-4412全能版使用手册-第二十章 搭建和测试NFS服务器
  • Spring源码学习
  • Python字典的用法(定义、增加、删除、修改、查询、遍历)
  • Spring中每次访问数据库都要创建SqlSession吗?
  • LearnOpenGL 学习(入门--三角形,着色器,纹理)
  • redis中的哨兵
  • ISO26262-基于TC397的MPU内存保护
  • mysql_题库详解
  • pyspark实现基于协同过滤的电影推荐系统
  • C底层 函数栈帧
  • Vuex —— Day1
  • 信创改造 - Redis -》TongRDS 安装方式之单节点模式安装
  • 哈希表算法题
  • 开发一套ERP 第八弹 RUst 插入数据
  • 《datawhale2411组队学习 模型压缩技术7:NNI剪枝》
  • 【Canvas与雷达】简约绿色扫描雷达图标
  • 【数据集划分】训练集train/验证集val/测试集test是如何划分的?
  • HarmonyOS NEXT应用开发,关于useNormalizedOHMUrl选项的坑