算法工程师修仙之路:Mxnet(二)

深度学习基础

  • 作为机器学习的一类,深度学习通常基于神经网络模型逐级表示越来越抽象的概念或模式
    • 我们先从线性回归softmax 回归这两种单层神经网络入手,简要介绍机器学习中的基本概念。
    • 然后,我们由单层神经网络延伸到多层神经网络,并通过多层感知机引入深度学习模型。
    • 在观察和了解了模型的过拟合现象后,我们将介绍深度学习中应对过拟合的常用方法:权重衰减和丢弃法
    • 接着,为了进一步理解深度学习模型训练的本质,我们将详细解释正向传播和反向传播
    • 掌握这两个概念后,我们能更好地认识深度学习中的数值稳定性初始化的一些问题。

线性回归


  • 线性回归输出是⼀个连续值,因此适⽤于回归问题

    • 回归问题在实际中很常见,如预测房屋价格、气温、销售额等连续值的问题。
  • 与回归问题不同,分类问题中模型的最终输出是⼀个离散值

    • 我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。
    • sofmax 回归则适⽤于分类问题
  • 由于线性回归和 sofmax 回归都是单层神经网络,它们涉及的概念和技术同样适用于大多数的深度学习模型。

线性回归的基本要素

  • 我们以一个简单的房屋价格预测作为例子来解释线性回归的基本要素。

  • 我们假设价格只取决于房屋状况的两个因素,即面积(平方米)和房龄(年)。

模型
  • 设房屋的面积为 x 1 x_1 x1,房龄为 x 2 x_2 x2,售出价格为 y y y
    • 我们需要建立基于输入 x 1 x_1 x1 x 2 x_2 x2 来计算输出 y y y 的表达式,也就是模型(model)。
    • 线性回归假设输出与各个输入之间是线性关系: y ^ = x 1 w 1 + x 2 w 2 + b \hat{y}=x_{1} w_{1}+x_{2} w_{2}+b y^=x1w1+x2w2+b
      • 其中 w 1 w_1 w1 w 2 w_2 w2 是权重(weight), b 是偏差(bias),且均为标量。
      • 它们是线性回归模型的参数(parameter)。
      • 模型输出 y ^ \hat{y} y^ 是线性回归对真实价格 y y y 的预测或估计。
      • 我们通常允许它们之间有一定误差。
模型训练
  • 我们需要通过数据来寻找特定的模型参数值使模型在数据上的误差尽可能小,这个过程叫作模型训练(model training)

  • 训练数据

    • 我们通常收集一系列的真实数据,例如多栋房屋的真实售出价格和它们对应的面积和房龄。
    • 我们希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差最小。
    • 在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set)一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)
    • 特征用来表征样本的特点
    • 假设我们采集的样本数为 n n n,索引为 i i i 的样本的特征为 x 1 ( i ) x^{(i)}_1 x1(i) x 2 ( i ) x^{(i)}_2 x2(i),标签为 y ( i ) y^{(i)} y(i)
      • 对于索引为 i i i 的房屋,线性回归模型的房屋价格预测表达式为: y ^ ( i ) = x 1 ( i ) w 1 + x 2 ( i ) w 2 + b \hat{y}^{(i)}=x_{1}^{(i)} w_{1}+x_{2}^{(i)} w_{2}+b y^(i)=x1(i)w1+x2(i)w2+b
  • 损失函数

    • 在模型训练中,我们需要衡量价格预测值与真实值之间的误差。
    • 通常我们会选取一个非负数作为误差,且数值越小表示误差越小
    • 一个常用的选择是平方函数,它在评估索引为 i i i 的样本误差的表达式为: ℓ ( i ) ( w 1 , w 2 , b ) = 1 2 ( y ^ ( i ) − y ( i ) ) 2 \ell^{(i)}\left(w_{1}, w_{2}, b\right)=\frac{1}{2}\left(\hat{y}^{(i)}-y^{(i)}\right)^{2} (i)(w1,w2,b)=21(y^(i)y(i))2
      • 其中常数1/2使对平方项求导后的常数系数为1,这样在形式上稍微简单一些。
      • 显然,误差越小表示预测价格与真实价格越相近,且当二者相等时误差为0
      • 给定训练数据集,这个误差只与模型参数相关,因此我们将它记为以模型参数为参数的函数。
      • 在机器学习里,将衡量误差的函数称为损失函数(loss function)。
      • 这里使用的平方误差函数也称为平方损失(square loss)
    • 通常,我们用训练数据集中所有样本误差的平均来衡量模型预测的质量
      ℓ ( w 1 , w 2 , b ) = 1 n ∑ i = 1 n ℓ ( i ) ( w 1 , w 2 , b ) = 1 n ∑ i = 1 n 1 2 ( x 1 ( i ) w 1 + x 2 ( i ) w 2 + b − y ( i ) ) 2 \ell\left(w_{1}, w_{2}, b\right)=\frac{1}{n} \sum_{i=1}^{n} \ell^{(i)}\left(w_{1}, w_{2}, b\right)=\frac{1}{n} \sum_{i=1}^{n} \frac{1}{2}\left(x_{1}^{(i)} w_{1}+x_{2}^{(i)} w_{2}+b-y^{(i)}\right)^{2} (w1,w2,b)=n1i=1n(i)(w1,w2,b)=n1i=1n21(x1(i)w1+x2(i)w2+by(i))2
      • 在模型训练中,我们希望找出一组模型参数 w 1 ∗ , w 2 ∗ , b ∗ w_{1}^{*}, w_{2}^{*}, b^{*} w1,w2,b 来使训练样本平均损失最小
        w 1 ∗ , w 2 ∗ , b ∗ = argmin ⁡ w 1 , w 2 , b ℓ ( w 1 , w 2 , b ) w_{1}^{*}, w_{2}^{*}, b^{*}=\underset{w_{1}, w_{2}, b}{\operatorname{argmin}} \ell\left(w_{1}, w_{2}, b\right) w1,w2,b=w1,w2,bargmin(w1,w2,b)
  • 优化算法

    • 当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来,这类解叫作解析解(analytical solution)
    • 大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值,这类解叫作数值解(numerical solution)
    • 在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用:
      • 先选取一组模型参数的初始值,如随机选取;
      • 接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。
      • 在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch) B \mathcal{B} B,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。
    • 在训练线性回归模型的过程中,模型的每个参数将作如下迭代:
      w 1 ← w 1 − η ∣ B ∣ ∑ i ∈ B ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ w 1 = w 1 − η ∣ B ∣ ∑ i ∈ B x 1 ( i ) ( x 1 ( i ) w 1 + x 2 ( i ) w 2 + b − y ( i ) ) w_{1} \leftarrow w_{1}-\frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{\partial \ell^{(i)}\left(w_{1}, w_{2}, b\right)}{\partial w_{1}}=w_{1}-\frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} x_{1}^{(i)}\left(x_{1}^{(i)} w_{1}+x_{2}^{(i)} w_{2}+b-y^{(i)}\right) w1w1BηiBw1(i)(w1,w2,b)=w1BηiBx1(i)(x1(i)w1+x2(i)w2+by(i))
      w 2 ← w 2 − η ∣ B ∣ ∑ i ∈ B ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ w 2 = w 2 − η ∣ B ∣ ∑ i ∈ B x 2 ( i ) ( x 1 ( i ) w 1 + x 2 ( i ) w 2 + b − y ( i ) ) w_{2} \leftarrow w_{2}-\frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{\partial \ell^{(i)}\left(w_{1}, w_{2}, b\right)}{\partial w_{2}}=w_{2}-\frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} x_{2}^{(i)}\left(x_{1}^{(i)} w_{1}+x_{2}^{(i)} w_{2}+b-y^{(i)}\right) w2w2BηiBw2(i)(w1,w2,b)=w2BηiBx2(i)(x1(i)w1+x2(i)w2+by(i))
      b ← b − η ∣ B ∣ ∑ i ∈ B ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ b = b − η ∣ B ∣ ∑ i ∈ B ( x 1 ( i ) w 1 + x 2 ( i ) w 2 + b − y ( i ) ) b \leftarrow b-\frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{\partial \ell^{(i)}\left(w_{1}, w_{2}, b\right)}{\partial b}=b-\frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}}\left(x_{1}^{(i)} w_{1}+x_{2}^{(i)} w_{2}+b-y^{(i)}\right) bbBηiBb(i)(w1,w2,b)=bBηiB(x1(i)w1+x2(i)w2+by(i))
      • 在上式中, ∣ B ∣ |\mathcal{B}| B 代表每个小批量中的样本个数(批量大小,batch size);
      • η \eta η 称作学习率(learning rate)并取正数。
      • 需要强调的是,这里的批量大小和学习率的值是人为设定的,并不是通过模型训练学出的,因此叫作超参数(hyperparameter)
      • 我们通常所说的调参指的正是调节超参数,例如通过反复试错来找到超参数合适的值。
      • 在少数情况下,超参数也可以通过模型训练学出。
模型预测
  • 模型训练完成后,我们将模型参数 w 1 , w 2 , b w_{1}, w_{2}, b w1,w2,b 在优化算法停止时的值分别记作 w ^ 1 , w ^ 2 , b ^ \hat{w}_{1}, \hat{w}_{2}, \hat{b} w^1,w^2,b^
  • 注意,这里我们得到的并不一定是最小化损失函数的最优解 w 1 ∗ , w 2 ∗ , b ∗ w_{1}^{*}, w_{2}^{*}, b^{*} w1,w2,b,而是对最优解的一个近似。
  • 然后,我们就可以使用学出的线性回归模型 x 1 w ^ 1 + x 2 w ^ 2 + b ^ x_{1} \hat{w}_{1}+x_{2} \hat{w}_{2}+\hat{b} x1w^1+x2w^2+b^ 来估算训练数据集以外任意一栋面积(平方米)为 x 1 x_1 x1、房龄(年)为 x 2 x_2 x2 的房屋的价格了。
  • 这里的估算也叫作模型预测、模型推断或模型测试。

线性回归的表示方法

  • 我们已经阐述了线性回归的模型表达式、训练和预测。下面我们解释线性回归与神经网络的联系,以及线性回归的矢量计算表达式。
神经网络图
  • 在深度学习中,我们可以使用神经网络图直观地表现模型结构。

  • 为了更清晰地展示线性回归作为神经网络的结构,图3.1使用神经网络图表示线性回归模型,并且隐去了模型参数权重和偏差。
    在这里插入图片描述

    • 在图3.1所示的神经网络中,输入分别为 x 1 x_1 x1 x 2 x_2 x2,因此输入层的输入个数为2。
    • 输入个数也叫特征数或特征向量维度。
    • 图3.1中网络的输出为 o o o,输出层的输出个数为1。
    • 需要注意的是,我们直接将图3.1中神经网络的输出 o o o 作为线性回归的输出,即 y ^ = o \hat{y}=o y^=o
    • 由于输入层并不涉及计算,按照惯例,图3.1所示的神经网络的层数为1。
    • 所以,线性回归是一个单层神经网络
    • 输出层中负责计算 o o o 的单元又叫神经元
    • 在线性回归中, o o o 的计算依赖于 x 1 x_1 x1 x 2 x_2 x2
    • 也就是说,输出层中的神经元和输入层中各个输入完全连接
    • 因此,这里的输出层又叫全连接层(fully-connected layer)或稠密层(dense layer)
矢量计算表达式
  • 在模型训练或预测时,我们常常会同时处理多个数据样本并用到矢量计算。

  • 在介绍线性回归的矢量计算表达式之前,让我们先考虑对两个向量相加的两种方法。

    • 下面先定义两个1000维的向量:

      from mxnet import nd
      from time import time
      
      a = nd.ones(shape=1000)
      b = nd.ones(shape=1000)
      
    • 向量相加的一种方法是,将这两个向量按元素逐一做标量加法:

      start = time()  # 当前的时间
      # 初始时设置一个1000维的零向量
      c = nd.zeros(shape=1000)  
      # 将这两个向量按元素逐一做标量加法  
      for i in range(1000):
          c[i] = a[i] + b[i]
      ts = time() - start # 经过循环后消耗的时间
      print(ts)
      	
      Out:
      0.14237189292907715
      
    • 向量相加的另一种方法是,将这两个向量直接做矢量加法:

      start = time()
      d = a + b
      ts = time() - start
      print(ts)
      
      Out:
      0.0(表示时间太短了)
      
    • 结果很明显,后者比前者更省时。因此,我们应该尽可能采用矢量计算,以提升计算效率

  • 如果我们对训练数据集里的3个房屋样本(索引分别为1、2和3)逐一预测价格,将得到:
    y ^ ( 1 ) = x 1 ( 1 ) w 1 + x 2 ( 1 ) w 2 + b y ^ ( 2 ) = x 1 ( 2 ) w 1 + x 2 ( 2 ) w 2 + b y ^ ( 3 ) = x 1 ( 3 ) w 1 + x 2 ( 3 ) w 2 + b \begin{aligned} \hat{y}^{(1)} &=x_{1}^{(1)} w_{1}+x_{2}^{(1)} w_{2}+b \\ \hat{y}^{(2)} &=x_{1}^{(2)} w_{1}+x_{2}^{(2)} w_{2}+b \\ \hat{y}^{(3)} &=x_{1}^{(3)} w_{1}+x_{2}^{(3)} w_{2}+b \end{aligned} y^(1)y^(2)y^(3)=x1(1)w1+x2(1)w2+b=x1(2)w1+x2(2)w2+b=x1(3)w1+x2(3)w2+b

  • 现在,我们将上面3个等式转化成矢量计算:
    y ^ = [ y ^ ( 1 ) y ^ ( 2 ) y ^ ( 3 ) ] , X = [ x 1 ( 1 ) x 2 ( 1 ) x 1 ( 2 ) x 2 ( 2 ) x 1 ( 3 ) x 2 ( 3 ) ] , w = [ w 1 w 2 ] \hat{\boldsymbol{y}}=\left[ \begin{array}{c}{\hat{y}^{(1)}} \\ {\hat{y}^{(2)}} \\ {\hat{y}^{(3)}}\end{array}\right], \quad \boldsymbol{X}=\left[ \begin{array}{cc}{x_{1}^{(1)}} & {x_{2}^{(1)}} \\ {x_{1}^{(2)}} & {x_{2}^{(2)}} \\ {x_{1}^{(3)}} & {x_{2}^{(3)}}\end{array}\right], \quad \boldsymbol{w}=\left[ \begin{array}{c}{w_{1}} \\ {w_{2}}\end{array}\right] y^=y^(1)y^(2)y^(3),X=x1(1)x1(2)x1(3)x2(1)x2(2)x2(3),w=[w1w2]

  • 对3个房屋样本预测价格的矢量计算表达式为: y ^ = X w + b \hat{\boldsymbol{y}}=\boldsymbol{X} \boldsymbol{w}+b y^=Xw+b,其中的加法运算使用了广播机制。

  • 广义上讲,当数据样本数为 n n n,特征数为 d d d 时,线性回归的矢量计算表达式为:
    y ^ = X w + b \hat{\boldsymbol{y}}=\boldsymbol{X} \boldsymbol{w}+b y^=Xw+b

    • 其中模型输出: y ^ ∈ R n × 1 \hat{\boldsymbol{y}} \in \mathbb{R}^{n \times 1} y^Rn×1
    • 批量数据样本特征: X ∈ R n × d \boldsymbol{X} \in \mathbb{R}^{n \times d} XRn×d
    • 权重: w ∈ R d × 1 \boldsymbol{w} \in \mathbb{R}^{d \times 1} wRd×1
    • 偏差: b ∈ R b \in \mathbb{R} bR
    • 相应地,批量数据样本标签: y ∈ R n × 1 y \in \mathbb{R}^{n \times 1} yRn×1
  • 设模型参数 θ = [ w 1 , w 2 , b ] ⊤ \boldsymbol{\theta}=\left[w_{1}, w_{2}, b\right]^{\top} θ=[w1,w2,b],我们可以重写损失函数为:
    ℓ ( θ ) = 1 2 n ( y ^ − y ) ⊤ ( y ^ − y ) \ell(\boldsymbol{\theta})=\frac{1}{2 n}(\hat{\boldsymbol{y}}-\boldsymbol{y})^{\top}(\hat{\boldsymbol{y}}-\boldsymbol{y}) (θ)=2n1(y^y)(y^y)

  • 小批量随机梯度下降的迭代步骤将相应地改写为:
    θ ← θ − η ∣ B ∣ ∑ i ∈ B ∇ θ ℓ ( i ) ( θ ) \boldsymbol{\theta} \leftarrow \boldsymbol{\theta}-\frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \nabla_{\boldsymbol{\theta}} \ell^{(i)}(\boldsymbol{\theta}) θθBηiBθ(i)(θ)

    • 其中梯度是损失有关3个为标量的模型参数的偏导数组成的向量:
      ∇ θ ℓ ( i ) ( θ ) = [ ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ w 1 ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ w 2 ∂ ℓ ( i ) ( w 1 , w 2 , b ) ∂ b ] = [ x 1 ( i ) ( x 1 ( i ) w 1 + x 2 ( i ) w 2 + b − y ( i ) ) x 2 ( i ) ( x 1 ( i ) w 1 + x 2 ( i ) w 2 + b − y ( i ) ) x 1 ( i ) w 1 + x 2 ( i ) w 2 + b − y ( i ) ] = [ x 1 ( i ) x 2 ( i ) 1 ] ( y ^ ( i ) − y ( i ) ) \nabla_{\boldsymbol{\theta}} \ell^{(i)}(\boldsymbol{\theta})=\left[ \begin{array}{c}{\frac{\partial \ell^{(i)}\left(w_{1}, w_{2}, b\right)}{\partial w_{1}}} \\ {\frac{\partial \ell^{(i)}\left(w_{1}, w_{2}, b\right)}{\partial w_{2}}} \\ {\frac{\partial \ell^{(i)}\left(w_{1}, w_{2}, b\right)}{\partial b}}\end{array}\right]= \left[ \begin{array}{c}{x_{1}^{(i)}\left(x_{1}^{(i)} w_{1}+x_{2}^{(i)} w_{2}+b-y^{(i)}\right)} \\ {x_{2}^{(i)}\left(x_{1}^{(i)} w_{1}+x_{2}^{(i)} w_{2}+b-y^{(i)}\right)} \\ {x_{1}^{(i)} w_{1}+x_{2}^{(i)} w_{2}+b-y^{(i)}}\end{array}\right]=\left[ \begin{array}{c}{x_{1}^{(i)}} \\ {x_{2}^{(i)}} \\ {1}\end{array}\right]\left(\hat{y}^{(i)}-y^{(i)}\right) θ(i)(θ)=w1(i)(w1,w2,b)w2(i)(w1,w2,b)b(i)(w1,w2,b)=x1(i)(x1(i)w1+x2(i)w2+by(i))x2(i)(x1(i)w1+x2(i)w2+by(i))x1(i)w1+x2(i)w2+by(i)=x1(i)x2(i)1(y^(i)y(i))
小结
  • 和大多数深度学习模型一样,对于线性回归这样一种单层神经网络,它的基本要素包括模型、训练数据、损失函数和优化算法。

  • 既可以用神经网络图表示线性回归,又可以用矢量计算表示该模型。

  • 应该尽可能采用矢量计算,以提升计算效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值