一篇关于《动手学深度学习》的读书笔记。
电子书地址:https://zh.gluon.ai/
环境准备
《动手学深度学习》基于Apache MXNet提供关于深度学习的Demo,并且提供了配套代码。整个项目通过conda的虚拟环境分发,并提供jupyter方式的可读文档。
安装方式如下:
1 | 安装Mincode |
conda
Conda是python的软件包管理软件,它和pip的最大不同在于同时提供虚拟环境管理功能,方便用户在多个虚拟环境中切换。
Miniconda是最小的conda安装环境,其中包含了Python2和Python3的运行环境。
Anaconda 是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。
conda常用命令:
1 | envname 指代你新建的环境的名称 |
数据操作
在MXNet中,NDArray是一个类,也是存储和变换数据的主要工具,提供GPU计算和自动求梯度等多种功能。
NDArray 和 Numpy 有点类似,但是它可以表示多维张量,通过array函数和asnumpy函数可以使数据在NDArray和NumPy格式之间相互变换。
自动求梯度
MXNet使用autograd模块自动求梯度。
1 | from mxnet import autograd,nd |
深度学习基础
线性回归
机器学习的几个概念:
- 样本集、样本、标签
- 模型、模型参数、损失函数
- 优化算法:当模型没有解析解时,通过优化算法的有限次迭代求得一个使损失函数最小的数值解。
- 学习率、批量大小 ——> 超参数
- 模型预测 ~ 推断 ~ 测试
神经网络的几个概念:
- 输入个数 ~ 特征数、特征向量维度
- 神经元(计算单元)
- 全连接层、稠密层
神经网络和线性回归的联系:
- 线性回归是一个全连接单层神经网络
softmax回归
解决分类问题的思路:
- 输出是离散值的分类问题,且输出个数等于标签类别数
- 每个输出值是预测该类别的置信度,预测结果取最大输出值对应的类别
上述思路存在问题:
- 输出值的范围不确定,难以直观判断这些值的含义
SoftMax回归的解决思路:
- 将输出值变换成值为正且和为1的概率分布(归一化???实际上就是:每个输出求exp(y_i)/所有输出exp(y_i)之和)
交叉熵损失函数:
- 分类问题的label一般这样表示:[1,0,0,0](四个类别时,分类取值为1)
- 分类问题的模型输出表示为:[p1,p2,p3,p4](四个类别时,表示对应类别0~1之间的概率)
- 分类问题不适合使用平方损失函数,适合使用交叉熵衡量损失。
- 交叉熵损失函数和最大似然估计的思想一致。
分类的结果:
- 准确率 = 正确预测数量 / 总预测数量
多层感知机
不引入激活函数时,全连接多层感知机的模型本质上和单层感知机等价的,依然是线性模型。本质上全连接等价于仿射变换(一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。),多个仿射变换的叠加依然是仿射变换。
解决上述问题:隐藏变量使用按元素运算的非线性函数进行变换,这些非线性函数称谓激活函数
- ReLU(x)=max(x,0)
- sigmoid函数:sigmoid(x)=1/(1+exp(−x))
- tanh函数: tanh(x)=(1−exp(−2x))/(1+exp(−2x))
模型选择、欠拟合、过拟合
当模型在训练数据集上更准确时,它在测试数据集上却不一定更准确:
- 训练误差(training error):模型在训练数据集上表现出的误差
- 泛化误差(generalization error):模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。
K折交叉验证:把原始训练数据集分割成K个不重合的子数据集,然后我们做K次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他K−1个子数据集来训练模型。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。
防止过拟合的方法:
- 增大训练量
- 使用复杂度合适的模型
- 丢弃法:倒置丢弃法,原理是将隐藏层的输出丢弃或者拉伸。
- 权重衰减:为模型添加损失函数惩罚项,使学出的模型参数值较小。原因是复杂模型往往权重参数很多,比较复杂。
权重衰减使,如何定义损失函数:
正向传播、反向传播和计算图
知道是什么东西就好?数值稳定性和模型初始化
- 数值稳定性:典型问题是衰减和爆炸,当神经网络层数较多时,模型的数值稳定性容易变差;
- 通常需要随机初始化神经网络的模型参数,如权重参数。
kaggle赛题
房价预测,通过观摩别人的解题过程发现,大致流程如下:
- 理解问题:理解数据的规模、指标的含义、数据有哪些确实等等。
- 单因素研究:关注单一变量(如,输出)作图,并分析
- 多因素研究:分析因变量和自变量之间的关系。
- 基础清洗:清洗数据集并且对缺失数据,异常值和分类数据进行一些处理。
- 检验假设:检查数据是否和多元分析方法的假设达到一致。
- 建立模型,训练,预测
MXNet 常用API接口
1 | from mxnet.gluon import nn |
1 | from mxnet.gluon import loss as gloss |
1 | from mxnet.gluon import data as gdata |
一些数据集
[MNIST]:手写数字识别数据集