前言
世界读书日的时候买了很多书,其中只有一本专业书,就是这本Dive into deep learning.和之前买的Deep Learning那本书不同,这本书注重实践,通过写某一个算法的Scratch版本来学习算法.从零开始手撸算法有助于理解.从简单的开始,第一个就是线性回归.这部分的内容打算按照自己的理解来写,毕竟照搬没有意义而且这本书的相关资源非常丰富,书的PDF版本包括所有代码(jupyter版本)以及视频.
1.从零开始的深度学习—线性回归
对于线性回归,相信所有的人都不陌生,这是非常常见且简单的算法,但是以我个人来说,听人讲和自己推导是完全不同的,会有很多细节都没有注意到.之后的内容将按照自己的理解写第一部分,对照着教程进行总结,以此希望能到达良好的效果,毕竟不管是Deep Learning或者Machine Learning都已经开始学了很多次了,这次希望能坚持下去吧.
线性的意思以我理解来源于直线,也就是恒定斜率的概念.对于一条直线来说,它的数学公式大概是下面这样:
这应该是线性关系最简单的形式,对于实际问题来说,影响结果的因素不只有一种,于是,这样的关系可以表示为(以两个变量为例):
在这里假设上面的公式是我们要求的规律,参数值也是我们最终需要得到的结果.当然对于大多数问题来说,我们并不知道内在的规律,如果知道了就不需要机器学习了,而且很多实际问题符合的都不是精确规律,因此对于已有数据集来说,我们假设他符合线性规律,假设这里有三组数据,这里的
我们可以把这一组公式转化为矩阵的形式:
在这里估计值和实际值的误差就是
一般来说,我们用训练数据的所有误差的平均值来衡量模型预测的质量,这个值被定义为:
在模型训练中,我们希望找出一组模型参数,记为
以上就是线性回归的基本思想.
2.优化算法
优化是非常重要的部分,也就是在一定次数的迭代后对参数进行优化.先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)
在上式中,
广义上讲,当数据样本数为
其中模型输出
小批量随机梯度下降的迭代步骤将相应地改写为
其中梯度是损失有关3个为标量的模型参数的偏导数组成的向量:
3.从零开始的线性回归
重头戏来了,这部分就是从零开始的线性回归,有助于理解问题,深入了解算法.那么现在就开始.
3.1 生成数据集
第一步是生成一个数据集,在这里的训练数据是我们自己生成的,而在现实中当然不是这样,在这里是为了比较学习的参数和真实的参数.
第一步当然是导入模块
%matplotlib inline
from IPython import display
from matplotlib import pyplot as plt
from mxnet import autograd,nd
import random
在这里设置训练机样本数为1000,每个样本有两个特征.给定随机生成的批量样本特征
其中噪声项
num_inputs = 2
num_examples = 1000
true_w = [2, -3.4]
true_b = 4.2
features = nd.random.normal(scale=1, shape=(num_examples, num_inputs))
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += nd.random.normal(scale=0.01, shape=labels.shape)
def use_svg_display():
# 用矢量图显示
display.set_matplotlib_formats('svg')
def set_figsize(figsize=(3.5, 2.5)):
use_svg_display()
# 设置图的尺寸
plt.rcParams['figure.figsize'] = figsize
set_figsize()
plt.scatter(features[:, 1].asnumpy(), labels.asnumpy(), 1); # 加分号只显示图
通过对图片的观察,我们可以看出所有的数据是在二维平面上分布.