一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)

人工智能92

《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)

version 1.0 2022-1-20

声明:

1)《繁凡的深度学习笔记》是我自学完成深度学习相关的教材、课程、论文、项目实战等内容之后,自我总结整理创作的学习笔记。写文章就图一乐,大家能看得开心,能学到些许知识,对我而言就已经足够了 ^q^ 。

2)因个人时间、能力和水平有限,本文并非由我个人完全原创,文章部分内容整理自互联网上的各种资源,引用内容标注在每章末的参考资料之中。

3)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除,非常感谢各位为知识传播做出的贡献!

4)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢。

5)本文由我个人( CSDN 博主 「繁凡さん」(博客) , 知乎答主 「繁凡」(专栏), Github 「fanfansann」(全部源码) , 微信公众号 「繁凡的小岛来信」(文章 P D F 下载))整理创作而成,且仅发布于这四个平台,仅做交流学习使用,无任何商业用途。

6)「我希望能够创作出一本清晰易懂、可爱有趣、内容详实的深度学习笔记,而不仅仅只是知识的简单堆砌。」

9)此属 version 1.0 ,若有错误,还需继续修正与增删,还望大家多多指点。本文会随着我的深入学习不断地进行完善更新,Github 中的 P D F 版也会尽量每月进行一次更新,所以建议点赞收藏分享加关注,以便经常过来回看!

如果觉得还不错或者能对你有一点点帮助的话,请帮我给本篇文章点个赞,你的支持是我创作的最大动力!^0^

如果没人点赞的话自然就更新慢咯 >_<

话题 1 :什么是回归分析?什么又是回归问题?

话题 2 :有哪些回归分析方法?

话题 3 :如何将线性回归模型模型化?

话题 4 :什么是神经元与神经元模型?

话题 5 :什么是损失函数?为什么需要使用损失函数?

话题 6 :回归问题中常用的损失函数有哪些?

话题 7 :深度学习为什么需要使用优化算法

话题 8 :有哪些常用的优化算法?

话题 9 :什么是梯度下降算法?

话题 10 :梯度下降算法为什么可以优化目标函数?(选学)

话题 11 :训练过程中如何避免陷入局部最优解?如何逃离鞍点?

话题 12 : 趣味话题:有时候我们没办法直接计算梯度,可以尝试估计梯度大小吗?- 有限差分法与对称导数法(选学)

话题 13 :什么是最小二乘法?如何使用最小二乘法解决线性回归问题?

话题 14 :道理我都懂,怎么用代码实现并解决神经元线性模型呢?

话题 15 :线性模型已经完全学会了!如果换成非线性的模型该怎么办呢?

话题 1 :什么是回归分析?什么又是回归问题?

回归分析(Regression Analysis)是一种统计学上分析数据的方法,目的在于了解两个或多个变量间是否相关、相关方向与强度,并建立数学模型以便观察特定变量来 预测 (prediction)研究者感兴趣的变量。在自然科学和社会科学领域,回归经常用来表示 输入和输出之间的关系

在机器学习领域中的大多数任务通常都与 预测 有关。 当我们进行回归分析,想要预测一个预测值在连续的实数范围内时,我们称之为 回归问题 。常见的例子有:预测房价 / 股票、预测需求 / 销量等。但不是所有的 预测 都是回归问题。在下一章节中,我们将介绍 分类问题 。分类问题的目标是预测数据属于一组类别中的哪一种,也即预测预测值属于某一段连续的实数区间的方法。

话题 2 :有哪些回归分析方法?

统计学中的回归分析方法一般有 线性回归(简单线性回归、复回归、对数线性回归)、 非线性回归对数几率回归偏回归自回归(自回归滑动平均模型、差分自回归滑动平均模型、向量自回归模型)。本章主要探讨线性回归与非线性回归,对于其他更多的回归方法仅给出一些简单的介绍,更多详细讲解、代码实现及其应用,详见《繁凡的机器学习笔记》。

❑ ❑\,❑ 线性回归

在回归问题中,如果使用线性模型去逼近真实模型,那么我们把这一类方法叫做 线性回归(Linear Regression),线性回归是回归问题中的一种具体的实现。

线性回归基于几个简单的假设:首先,假设自变量 x \mathbf{x}x 和因变量 y y y 之间的关系是线性的,即 y y y 可以表示为 x \mathbf{x}x 中元素的加权和,这里通常允许包含观测值的一些噪声;其次,我们假设任何噪声都比较正常,如噪声遵循 正态分布 (NormalDistribution) N ( μ , σ 2 ) \mathcal{N}\left(\mu, \sigma^{2}\right)N (μ,σ2 )。

简单线性回归(simple linear regression),在统计学中指只有一个解释变量的线性回归模型。往往是以单一变量预测,用于判断两变量之间相关的方向和程度。

复回归分析(multiple regression analysis),也称多变量回归,是简单线性回归的一种延伸应用,用以了解一个因变量与两组以上自变量的函数关系。

对数线性回归(Log-linear model),是将自变量和因变量都取对数值之后再进行线性回归,所以根据自变量的数量,可以是对数简单线性回归,也可以是对数复回归。

❑ ❑\,❑ 非线性回归

非线性回归(non-linear regression),是回归函数关于未知回归系数具有非线性结构的回归。

❑ ❑\,❑ 对数几率回归

对数几率回归(Logistic Regression),又称逻辑回归,是一种 对数几率模型(英语:Logit model,又译作逻辑模型、评定模型、分类评定模型)是离散选择法模型之一,属于多重变量分析范畴,是社会学、生物统计学、临床、数量心理学、计量经济学、市场营销等统计实证分析的常用方法。关于对数几率回归的更多讲解,详见《繁凡的深度学习笔记》 第 3 章 分类问题与信息论基础 3.2 逻辑回归

❑ ❑\,❑ 自回归模型

自回归模型(Autoregressive model),简称AR模型,是统计上一种处理时间序列的方法,用同一变数例如 x {\displaystyle x}x 的之前各期,亦即 x 1 {\displaystyle x_{1}}x 1 ​ 至 x t − 1 {\displaystyle x_{t-1}}x t −1 ​ 来预测本期 x t {\displaystyle x_{t}}x t ​ 的表现,并假设它们为一线性关系。因为这是从回归分析中的线性回归发展而来,只是不用 x {\displaystyle x}x 预测 y {\displaystyle y}y ,而是 用x {\displaystyle x}x 预测x {\displaystyle x}x (自己);所以叫做 自回归

2.1 线性回归

我们在 话题 2中已经讲解过了什么是线性回归,我们继续深入探讨,考虑如何解决线性回归问题。

话题 3 :如何将线性回归模型模型化?

考虑一个实例:作为一个有志青年,我们想要预测未来的城市房价!我们希望可以根据房屋的面积和房龄来估算房屋的价格。为了开发一个能预测房价的模型,我们首先需要收集一个真实的数据集。这个数据集包括了房屋的销售价格、面积和房龄。在机器学习的术语中,通常将数据集称之为 训练数据集(training data set)或 训练集(training set)。其中数据集内的每行数据(这里就是与一次房屋交易相对应的各种数据)称为 样本(sample),或 数据点(data point)或 数据样本(data instance)。将我们想要预测的目标(这里显然是房屋的价格)称之为 标签(label)或 目标(target)。预测所依据的自变量(面积和房龄)称为 特征(feature)或 协变量(covariate)。

通常,我们使用 n n n 或者 m m m 来表示数据集中的样本数。对索引为 i i i 的样本,其输入表示为 x ( i ) = [ x 1 ( i ) , x 2 ( i ) ] T \boldsymbol {x}^{(i)} = [x_1^{(i)}, x_2^{(i)}]^{\mathrm{T}}x (i )=[x 1 (i )​,x 2 (i )​]T ,其对应的标签是 y ( i ) y^{(i)}y (i ) 。

这里线性回归的线性假设指目标(房屋价格)可以表示为特征(面积和房龄)的加权和,如下面的式子:
p r i c e = w a r e a ⋅ a r e a + w a g e ⋅ a g e + b . (2.1) \mathrm{price} =w_{\mathrm{area}} \cdot \mathrm{area} +w_{\mathrm{age}} \cdot \mathrm{age} + b.\tag{2.1}p r i c e =w a r e a ​⋅a r e a +w a g e ​⋅a g e +b .(2 .1 )

式中的 w a r e a w_{\mathrm{area}}w a r e a ​​​ 和 w a g e w_{\mathrm{age}}w a g e ​​​ 称为 权重(weight), b b b​​ 称为 偏置(bias),或称为 偏移量(offset)、 截距(intercept)。

权重决定了每个特征对我们预测值的影响。偏置是指当所有特征都取值为 0 0 0 时,预测值应该为多少。如果没有偏置项,我们模型的表达能力将受到限制。 严格来说,上式是输入特征的一个 仿射变换(affine transformation)。仿射变换的特点是通过加权和对特征进行 线性变换(linear transformation),并通过偏置项来进行 平移(translation)。

至此问题就变为了:给定一个数据集,我们的目标是寻找模型的权重 w \boldsymbol w w​ 和偏置 b b b​ ,使得根据模型做出的预测大体符合数据里的真实价格。输出的预测值由输入特征通过 线性模型的仿射变换决定,仿射变换由所选权重和偏置确定。显然我们只需要求出符合实际情况的模型参数 w , b \boldsymbol w,b w ,b​,就可以得到一个可以大致预测房屋价格的线性模型。这种模型被发现与人类的神经元模型十分吻合,我们考虑从神经元模型的角度出发解决上面的问题。

2.2 神经元模型

话题 4 :什么是神经元与神经元模型?

神经元(Neuron),即 神经元细胞(Nerve Cell),是神经系统最基本的结构和功能单位。如图 2.1 所示,典型的生物神经元结构分为细胞体和突起两大部分。成年人大脑中包含了约 1000 亿个神经元,每个神经元通过树突获取输入信号,通过轴突传递输出信号,神经元之间相互连接构成了巨大的神经网络,从而形成了人脑的感知和意识基础。

图 2.1 神经元

在神经元中,树突中接收到来自其他神经元或视网膜等环境传感器的信息 x i x_i x i ​​​ 。该信息通过 突触权重 w i w_i w i ​​​ 来加权,以确定输入的影响(即通过设置突触权重的大小,使 w i w_i w i ​​​ 与 x i x_i x i ​​ 相乘 来 激活抑制该输入信息)。 来自多个源的加权输入以加权和 y = ∑ i x i w i + b \displaystyle y = \sum_i x_i w_i + b y =i ∑​x i ​w i ​+b​​ 的形式汇聚在细胞核中,然后将这些信息发送到轴突 y y y​​ 中进一步处理,通常会通过 σ ( y ) \sigma(y)σ(y )​​ 进行一些 非线性处理。之后,它要么到达目的地(例如肌肉),要么通过树突进入另一个神经元(一层又一层地组成 神经网络)。

考虑将生物神经元 (Neuron) 的模型抽象成具体的数学模型得到 神经元模型:对于神经元的输入向量 𝒙 = [ 𝑥 1 , 𝑥 2 , 𝑥 3 , ... , 𝑥 𝑛 ] T 𝒙 = [𝑥_1, 𝑥_2, 𝑥_3, ... , 𝑥_𝑛]^\mathrm{ T }x =[x 1 ​,x 2 ​,x 3 ​,...,x n ​]T,经过函数映射:𝑓 θ : 𝒙 → 𝑦 𝑓_{\theta}: 𝒙 → 𝑦f θ​:x →y 后得到输出 𝑦 𝑦y ,其中 θ {\theta}θ 为函数 𝑓 𝑓f 自身的参数。考虑一种简化的情况,即线性变换,对于两个列向量 𝒙 , 𝒘 𝒙,𝒘x ,w,我们希望可以计算得到类似神经元模型 y = ∑ i x i w i + b \displaystyle y = \sum_i x_i w_i + b y =i ∑​x i ​w i ​+b 的值,我们可以将其中一个列向量转置之后相乘:𝑓 ( 𝒙 ) = 𝒘 T 𝒙 + 𝑏 𝑓(𝒙) = 𝒘^\mathrm{ T } 𝒙 + 𝑏f (x )=w T x +b,展开为标量形式:

f ( x ) = w 1 x 1 + w 2 x 2 + w 3 x 3 + ⋯ + w n x n + b (2.2) f(x) = w_1x_1 + w_2x_2 + w_3x_3 + \cdots + w_nx_n + b\tag{2.2}f (x )=w 1 ​x 1 ​+w 2 ​x 2 ​+w 3 ​x 3 ​+⋯+w n ​x n ​+b (2 .2 )

上式可以直观地展示为如图 2.2 所示:

图 2.2 单层神经元模型

参数 θ = 𝑤 1 , 𝑤 2 , 𝑤 3 , . . . , 𝑤 𝑛 , 𝑏 \theta= {𝑤_1, 𝑤_2, 𝑤_3, . . . , 𝑤_𝑛,𝑏}θ=w 1 ​,w 2 ​,w 3 ​,...,w n ​,b 确定了神经元的状态,通过固定 𝜃 参数即可确定此神经元的处理逻辑。当神经元输入节点数 𝑛 = 1 𝑛 = 1 n =1 也即单输入时,神经元数学模型可进一步简化为:

y = w x + b (2.3) y = wx + b\tag{2.3}y =w x +b (2 .3 )
此时我们可以绘制出神经元的输出 𝑦 𝑦y​ 和输入 𝑥 𝑥x​ 的变化趋势,如图 2.3 所示,随着输入信号 𝑥 𝑥x​ 的增加,输出电平 𝑦 𝑦y​ 也随之线性增加,其中 𝑤 𝑤w​参数可以理解为直线的斜率 (Slope),b b b​ 参数为直线的偏置 (Bias)。

图 2.3 单输入神经元线性模型

我们知道 n + 1 n+1 n +1 个点确定 n n n 次项多项式,n + 1 n+1 n +1 个点确定 n n n 元一次方程(最小二乘法), 显然对于一个单输入向量,我们只需要观测得到两个不同数据点,就可求得单输入线性神经元模型的参数。同样的,对于 n n n 输入的现象神经元模型,只需要观测采样 n + 1 n + 1 n +1 组不同数据点即可得到所有参数,似乎就此线性神经元模型可以得到完美的解决。那么上述方法是否存在着什么问题呢?

话题 5 :什么是损失函数?为什么需要使用损失函数?;

考虑对于任何采样点,都有可能存在 观测误差。我们假设观测误差变量 ϵ \epsilon ϵ 属于均值为 μ \mu μ,方差为 σ 2 \sigma^{2}σ2 的正态分布 (NormalDistribution) 或高斯分布 (Gaussian Distribution):N ( μ , σ 2 ) \mathcal{N}\left(\mu, \sigma^{2}\right)N (μ,σ2 ),那么我们观测采样得到的样本符合:
y = w x + b + ϵ , ϵ ∼ N ( μ , σ 2 ) (2.4) y=w x+b+\epsilon, \epsilon \sim \mathcal{N}\left(\mu, \sigma^{2}\right)\tag{2.4}y =w x +b +ϵ,ϵ∼N (μ,σ2 )(2 .4 )

其中正态分布概率密度函数如下:

p ( x ) = 1 2 π σ 2 exp ⁡ ( − 1 2 σ 2 ( x − μ ) 2 ) . (2.5) p(x) = \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left(-\frac{1}{2 \sigma^2} (x - \mu)^2\right).\tag{2.5}p (x )=2 πσ2 ​1 ​exp (−2 σ2 1 ​(x −μ)2 ).(2 .5 )

我们发现一旦引入观测误差以后,即使简单如线性模型,如果仅采样两个数据点,可能会带来较大 估计偏差 。如图 2.4 所示,图中的数据点均带有观测误差,如果基于蓝色矩形块的两个数据点进行估计,则计算出的蓝色虚线与真实橙色直线存在较大偏差。

图 2.4 带观测误差的估计模型

为了减少观测误差引入的估计偏差,可以通过采样多组数据样本集合 𝔻 = { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , ... , ( x ( n ) , y ( n ) ) } 𝔻 = \left{\left(x^{(1)}, y^{(1)}\right),\left(x^{(2)}, y^{(2)}\right), \ldots,\left(x^{(n)}, y^{(n)}\right)\right}D ={(x (1 ),y (1 )),(x (2 ),y (2 )),...,(x (n ),y (n ))},然后找出一条 "最好" 的直线,使得它尽可能地让所有采样点到该直线的 误差 (Error) 或 损失 (Loss) 之和最小即可。

也就是说,由于观测误差 ϵ \epsilon ϵ 的存在,当我们采集了多个数据点 𝔻 𝔻D 时,可能不存在一条直线完美的穿过所有采样点。因此我们希望能找到一条比较 "好" 的位于采样点中间的直线,这个过程就叫做 拟合(fit)。

为了判别拟合出的直线是不是 "好" 的,我们需要确定一个拟合程度的度量,因此人们提出了 损失函数 来进行衡量。

损失函数(loss function),又称 代价函数(cost function),是将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的"风险"或"损失"的函数。在应用中,损失函数通常作为学习准则与优化问题相联系,即通过最小化损失函数求解和评估模型。 损失函数 能够量化目标的 实际值预测值之间的差距。通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为 0 0 0​ 。

话题 6 :回归问题中常用的损失函数有哪些?

回归问题中常用的损失函数有 平方和误差、均方根误差、平均绝对值误差、平滑平均绝对误差等。

❑ ❑\,❑​ 均方误差 (Mean Squared Error, MSE)

首先一个很自然的想法就是,求出当前模型的所有采样点上的预测值 w x ( i ) + b w x^{(i)}+b w x (i )+b​ 与真实值 y ( i ) y^{(i)}y (i )​ 之间的差的平方和作为总误差 L \mathcal{L}L​​。当样本 i i i​ 的预测值为 y ^ ( i ) = w x ( i ) + b \hat{y}^{(i)}=w x^{(i)}+b y ^​(i )=w x (i )+b​ (通常使用 " 尖角" \hat 符号表示估计值、预测值),其相应的真实标签为 y ( i ) y^{(i)}y (i )​ 时,平方和误差可以定义为:
L ( w , b ) = 1 n ∑ i = 1 n ( y ^ ( i ) − y ( i ) ) 2 . (2.6) \mathcal{L}(\boldsymbol {w}, b) =\frac{1}{n} \sum_{i=1}^{n} \left(\hat{y}^{(i)} - y^{(i)}\right)^2.\tag{2.6}L (w ,b )=n 1 ​i =1 ∑n ​(y ^​(i )−y (i ))2 .(2 .6 )

在训练模型时,我们希望搜索到一组参数( w ∗ , b ∗ \boldsymbol {w}^ , b^w ∗,b ∗ ),这组参数能最小化在所有训练样本上的总损失 L \mathcal{L}L,其对应的直线就是我们要寻找的最优直线:

w ∗ , b ∗ = argmin ⁡ w , b 1 n ∑ i = 1 n ( w x ( i ) + b − y ( i ) ) 2 (2.7) \boldsymbol {w}^{}, b^{}=\underset{\boldsymbol {w}, b}{\operatorname{argmin}} \frac{1}{n} \sum_{i=1}^{n} \left(w x^{(i)}+b-y^{(i)}\right)^{2}\tag{2.7}w ∗,b ∗=w ,b a r g m i n ​n 1 ​i =1 ∑n ​(w x (i )+b −y (i ))2 (2 .7 )

其中 𝑛 𝑛n 表示采样点的个数。这种误差计算方法称为均方误差 (Mean Squared Error) 简称 MSE

即:
MSE = 1 n ∑ i = 1 n ( y ^ ( i ) − y ( i ) ) 2 (2.8) \text{MSE}=\dfrac 1 n \sum^{n}{i=1}(\hat y^{(i)}-y^{(i)})^2\tag{2.8}MSE =n 1 ​i =1 ∑n ​(y ^​(i )−y (i ))2 (2 .8 )
❑ ❑\,❑ 均方根误差(Root Mean Square Error, RMSE)
RMSE = 1 n ∑ i = 1 n ( y ^ ( i ) − y ( i ) ) 2 (2.9) \text{RMSE}=\sqrt{\dfrac {1} {n} \sum
{i=1}^n(\hat y^{(i)}-y^{(i)})^2}\tag{2.9}RMSE =n 1 ​i =1 ∑n ​(y ^​(i )−y (i ))2 ​(2 .9 )
均方根误差,也叫回归系统的拟合标准差,是 MSE \text{MSE}MSE 的平方根,容易受异常点(误差很大的点)影响,易朝减小异常点误差的方向行进而牺牲总体性能。

❑ ❑\,❑ 平均绝对误差(Mean Absolute Error, MAE)
MAE = 1 n ∑ i = 1 n ∣ y ^ ( i ) − y ( i ) ∣ (2.10) \text{MAE}=\frac 1 n \sum_{i=1}^n\mid\,\hat y^{(i)}-y^{(i)}\,\mid\tag{2.10}MAE =n 1 ​i =1 ∑n ​∣y ^​(i )−y (i )∣(2 .1 0 )
绝对值误差的平均值,由于导数是常数,不利于梯度下降法更新。且该函数在 0 0 0 处不可微。

❑ ❑\,❑ 平滑平均绝对误差(HuberLoss)
L δ ( y i ) = { 1 2 ( y ^ ( i ) − y ( i ) ) 2 , ∣ y ^ ( i ) − y ( i ) ∣ ≤ δ δ ∣ y ^ ( i ) − y ( i ) ∣ − 1 2 δ 2 , otherwise (2.11) L_{\delta}\left(y_{i}\right)=\left{\begin{array}{ll}\dfrac{1}{2}\left(\hat{y}^{(i)}-y^{(i)}\right)^{2}, & \left|\hat{y}^{(i)}-y^{(i)}\right| \leq \delta \\delta\left|\hat{y}^{(i)}-y^{(i)}\right|-\dfrac{1}{2} \delta^{2}, & \text { otherwise }\end{array}\right.\tag{2.11}L δ​(y i ​)=⎩⎪⎨⎪⎧​2 1 ​(y ^​(i )−y (i ))2 ,δ∣∣​y ^​(i )−y (i )∣∣​−2 1 ​δ2 ,​∣∣​y ^​(i )−y (i )∣∣​≤δotherwise ​(2 .1 1 )
Huber Loss 是一个用于回归问题的带参损失函数,结合了 MSE \text{MSE}MSE 和 MAE \text{MAE}MAE 的优点, 优点是能增强 MSE \text{MSE}MSE 对离群点的鲁棒性,对异常点不会特别敏感同时在 0 0 0 处也可微。当预测偏差小于 δ \delta δ 时,它采用平方误差,当预测偏差大于 δ \delta δ 时,采用的线性误差。也正因如此,我们需要不断地调整超参数 δ \delta δ ,也因此带来一些不便。

回到问题本身,我们这里选择均方差作为损失函数解决线性神经元模型问题。我们需要找出最优参数 (Optimal Parameter) w ∗ , b ∗ \boldsymbol {w}^{}, b^{}w ∗,b ∗ ,使得输入和输出满足线性关系 y ( i ) = w x ( i ) + b , i ∈ [ 1 , n ] y^{(i)}=w x^{(i)}+b, i \in[1, n]y (i )=w x (i )+b ,i ∈[1 ,n ]。但是由于观测误差 ϵ \epsilon ϵ 的存在,需要通过采样足够多组的数据样本组成的数据集 (Dataset):𝔻 = ( 𝑥 ( 1 ) , 𝑦 ( 1 ) ) , ( 𝑥 ( 2 ) , 𝑦 ( 2 ) ) , ... , ( 𝑥 ( 𝑛 ) , 𝑦 ( 𝑛 ) ) 𝔻 ={(𝑥(1),𝑦(1)), (𝑥(2),𝑦(2)),... , (𝑥(𝑛), 𝑦(𝑛))}D =(x (1 ),y (1 )),(x (2 ),y (2 )),...,(x (n ),y (n )),来找到一组最优的参数 𝒘 ∗ , b ∗ 𝒘^{}, b^{}w ∗,b ∗ 使得均方差 L = 1 n ∑ i = 1 n ( w x ( i ) + b − y ( i ) ) 2 \mathcal{L} =\displaystyle \frac{1}{n} \sum_{i=1}^{n} \left(w x^{(i)}+b-y^{(i)}\right)^{2}L =n 1 ​i =1 ∑n ​(w x (i )+b −y (i ))2 最小即可。

话题 7 :深度学习为什么需要使用优化算法

经过上面内容的学习,我们对深度学习进行一次简单的总结。在传统的监督机器学习中,往往会给出训练数据集 D = { ( x 1 , y 1 ) , ... , ( x N , y N ) } \mathcal D = {(x_1, y_1),...,(x_N, y_N)}D ={(x 1 ​,y 1 ​),...,(x N ​,y N ​)},如 (输入图像,输出标签) 对。我们希望训练一个预测模型 y ^ = f θ ( x ) \hat{y}=f_{\theta }\left ( x \right )y ^​=f θ​(x ) ,参数化 θ θθ ,通过求解下式得到参数的全局最优解:
θ ∗ = arg ⁡ min ⁡ θ L ( D ; θ , ω ) (2.12) \theta^{*}=\arg \min {\theta} \mathcal{L}(\mathcal{D} ; \theta, \omega)\tag{2.12}θ∗=ar g θmin ​L (D ;θ,ω)(2 .1 2 )
其中 L \mathcal L L 是上一小节介绍的用于测量真实标签与 f θ ( ⋅ ) f
{\theta}(\cdot)f θ​(⋅) 预测的标签之间的误差的损失函数。 我们通过评估具有已知标签的多个测试点来测量泛化能力。

如何求解最优化的参数是我们需要解决的问题。暴力查找最优的参数带来的时间空间复杂度显然是不能接受的,为此人们发明了无数种优化算法来予以解决。优化算法的功能是通过改善训练方式来最优化损失函数,可以加快收敛速度,使得训练的时间更短,还可以获得更优的损失函数。

话题 8 :有哪些常用的优化算法?

深度学习中的优化算法有很多,例如梯度下降算法、动量法、AdaGrad算法、RMSProp算法、Adadelta算法、Adam算法等。我们这里着重介绍最简单的一种优化方法: 梯度下降算法,以及另一种可以高效解决线性回归问题的经典算法: 最小二乘法。其余优化算法详解详见 《繁凡的深度学习笔记》第 7 章 过拟合、优化算法与参数优化 7.9 优化算法

话题 9 :什么是梯度下降算法?

梯度下降算法(Gradient Descent)是神经网络训练中最常用的优化算法,配合强大的图形处理芯片 GPU 的并行加速能力,非常适合优化海量数据的神经网络模型,自然也适合优化我们这里的神经元线性模型。这里先简单地应用梯度下降算法,以及如何使用它解决神经元模型预测的优化问题。

我们在高中都学过 导数 (Derivative) 的概念,如果要求解一个函数的极大、极小值,可以简单地令导数函数为 0 0 0​​​​​​​​​​,求出对应的自变量点 (称为驻点) ,再检验驻点类型即可。以函数 𝑓 ( 𝑥 ) = x 2 sin ⁡ ( 𝑥 ) 𝑓(𝑥) = x^2 \sin(𝑥)f (x )=x 2 sin (x )​​​​​​​​​​ 为例,我们绘制出函数及其导数在 𝑥 ∈ [ − 1 , 1 ] 𝑥\in [−1 ,1]x ∈[−1 ,1 ]​​​​​​​​​​ 的区间曲线,其中蓝色实线为 𝑓 ( 𝑥 ) 𝑓(𝑥)f (x )​​​​​​​​​​,黄色虚线为 d f ( x ) d x \dfrac{\mathrm{d} f(x)}{\mathrm{d} x}d x d f (x )​​​​​​​​​​​。可以看出,函数导数为 0 0 0​​​​​​​​​​ 的点即为 𝑓 ( 𝑥 ) 𝑓(𝑥)f (x )​​​​​​​​​​ 的 临界点(critical point)或 驻点(stationary point),函数的极大值和极小值点均出现在驻点中。

图 2.5 函数及其导数

导数 f ′ ( x ) f'(x)f ′(x ) 代表 f ( x ) f(x)f (x ) 在点 x x x 处的斜率。换句话说,它表明如何缩放输入的小变化才能在输出获得相应的变化:f ( x + ϵ ) ≈ f ( x ) + ϵ f ′ ( x ) f(x + ϵ) ≈ f(x) + ϵf'(x)f (x +ϵ)≈f (x )+ϵf ′(x )。因此导数对于最小化一个函数很有用,因为它告诉我们如何更改 x x x 来略微地改善 y y y。例如,我们知道对于足够小的 ϵ ϵϵ 来说,f ( x − ϵ s i g n ( f ′ ( x ) ) ) f(x − ϵsign(f′(x)))f (x −ϵs i g n (f ′(x ))) 是比 f ( x ) f(x)f (x ) 小的。因此我们可以将 x x x​ 往导数的反方向移动一小步来减小 f ( x ) f(x)f (x )。这种技术被称为 梯度下降(gradient descent)。

图 2.6 梯度下降。梯度下降算法如何使用函数导数的示意图,即沿着函数的下坡方向(导数反方向)直到最小。[《Deep Learning》]

函数的梯度(Gradient)定义为函数对各个自变量的 偏导数(Partial Derivative)组成的向量。考虑 3 3 3​​​​​​​​​​​​​ 维函数 𝑧 = 𝑓 ( 𝑥 , 𝑦 ) 𝑧 = 𝑓(𝑥, 𝑦)z =f (x ,y )​​​​​​​​​​​​​,函数对自变量 𝑥 𝑥x​​​​​​​​​​​​​ 的偏导数记为 ∂ z ∂ x \dfrac{\partial z}{\partial x}∂x ∂z ​​​​​​​​​​​​​​ 可以衡量点 x x x​​​​​​​​​​​​ 处只有 x x x​​​​​​​​​​​ 增加时 f ( x ) f(x)f (x )​​​​​​​​​​ 如何变化。 梯度是相对一个向量求导的导数: f f f​​​​​​​​ 的导数是包含所有偏导数的向量,记为 ∇ x f ( x ) \nabla_x f(x)∇x ​f (x )​​​​​​​。函数对自变量 y y y 的偏导数记为 ∂ z ∂ y \dfrac{\partial z}{\partial y}∂y ∂z ​​​​​​​​​​​​​​ ,则梯度 ∇ f \nabla f ∇f​​​​​​​​​​​​​ 为向量 ( ∂ z ∂ x , ∂ z ∂ y ) \left(\dfrac{\partial z}{\partial x}, \dfrac{\partial z}{\partial y}\right)(∂x ∂z ​,∂y ∂z ​)​​​​​​​​​​​​​。对于多维的情况下,梯度的第 i i i​​​​ 个元素是 f f f​​​ 关于 x i x_i x i ​​​ 的偏导数。此时的临界点是梯度中所有元素都为零的点。我们通过一个具体的函数来感受梯度的性质。

如图 2.2.7 所示,f ( x , y ) = − ( cos ⁡ 2 x + cos ⁡ 2 y ) 2 f(x, y)=-\left(\cos ^{2} x+\cos ^{2} y\right)^{2}f (x ,y )=−(cos 2 x +cos 2 y )2 ,图中 𝑥 𝑦 𝑥𝑦x y 平面的红色箭头的长度表示梯度向量的模,箭头的方向表示梯度向量的方向。可以看到,箭头的方向总是指向当前位置函数值增速最大的方向,函数曲面越陡峭,箭头的长度也就越长,梯度的模也越大。

图 2.7 函数及其梯度向量

通过上面的例子,我们能直观地感受到,函数在各处的梯度方向 ∇ 𝑓 ∇𝑓∇f​ 总是指向函数值增大的方向,那么梯度的反方向 − ∇ 𝑓 −∇𝑓−∇f​​ 应指向函数值减少的方向。

定义 ∇ x f ( x ) \nabla_{\boldsymbol{x}} f(\boldsymbol{x})∇x ​f (x ) 以 n × 1 n\times 1 n ×1 实向量 x x x 为变元的实标量函数 f ( x ) f(x)f (x ) 相对于 x x x 的梯度,是一个 n × 1 n\times 1 n ×1 的列向量,定义为:

∇ x f ( x ) = def [ ∂ f ( x ) ∂ x 1 , ∂ f ( x ) ∂ x 2 , ⋯ , ∂ f ( x ) ∂ x n ] T = ∂ f ( x ) ∂ x \nabla_{\boldsymbol{x}} f(\boldsymbol{x}) \stackrel{\text { def }}{=}\left[\frac{\partial f(\boldsymbol{x})}{\partial x_{1}}, \frac{\partial f(\boldsymbol{x})}{\partial x_{2}}, \cdots, \frac{\partial f(\boldsymbol{x})}{\partial x_{n}}\right]^{T}=\frac{\partial f(\boldsymbol{x})}{\partial \boldsymbol{x}}∇x ​f (x )=def [∂x 1 ​∂f (x )​,∂x 2 ​∂f (x )​,⋯,∂x n ​∂f (x )​]T =∂x ∂f (x )​

我们规定在 u \boldsymbol u u(单位向量)方向的 方向导数(directional derivative)是函数 f f f 在 u \boldsymbol u u 方向的斜率。也即方向导数是函数 f ( x + α u ) f(x + \alpha \boldsymbol u)f (x +αu ) 关于 α \alpha α 的导数(在 α = 0 \alpha = 0 α=0 时取得)。使用链式法则,我们可以发现当 α = 0 \alpha = 0 α=0 时,∂ ∂ α f ( x + α u ) = u ⊤ ∇ x f ( x ) \dfrac{\partial}{\partial \alpha} f(\boldsymbol{x}+\alpha \boldsymbol{u})=\boldsymbol{u}^{\top} \nabla_{x} f(\boldsymbol{x})∂α∂​f (x +αu )=u ⊤∇x ​f (x )。

为了最小化 f f f,我们希望找到使 f f f 下降得最快的方向。计算方向导数:
min ⁡ u , u ⊤ u = 1 u ⊤ ∇ x f ( x ) = min ⁡ u , u ⊤ u = 1 ∥ u ∥ 2 ∥ ∇ x f ( x ) ∥ 2 cos ⁡ θ (2.13) \begin{aligned}\min {\boldsymbol u,\boldsymbol u^{\top} u=1} \boldsymbol{u}^{\top} \nabla{x} f(\boldsymbol{x}) =\min {u, \boldsymbol{u}^{\top} \boldsymbol{u}=1}\|\boldsymbol{u}\|{2}\left\|\nabla_{\boldsymbol{x}} f(\boldsymbol{x})\right\|{2} \cos \theta\end{aligned}\tag{2.13}u ,u ⊤u =1 min ​u ⊤∇x ​f (x )=u ,u ⊤u =1 min ​∥u ∥2 ​∥∇x ​f (x )∥2 ​cos θ​(2 .1 3 )
其中 θ \theta θ​​​​​​​​​​ 是 u \boldsymbol u u​​​​​​​​​ 与梯度的夹角。将 ∥ u ∥ 2 = 1 \|\boldsymbol u\|_2 = 1 ∥u ∥2 ​=1​​​​​​​​ 代入,并忽略与 u \boldsymbol u u​​​​​​​​ 无关的项,就能简化得到 min ⁡ u cos ⁡ θ \displaystyle \min
{\boldsymbol u}\cos θu min ​cos θ​​​​​​​。这在 u \boldsymbol u u​​​​​​ 与梯度方向相反时取得最小。换句话说,梯度向量指向上坡,负梯度向量指向下坡。我们在负梯度方向上移动可以减小 f f f​​​​​ 。这被称为 最速下降法(method of steepest descent)或 梯度下降(gradient descent)。

综上所述我们按照
x ′ = x − η ⋅ ∇ x f (2.14) x^{\prime}=x-\eta \cdot \nabla_x f\tag{2.14}x ′=x −η⋅∇x ​f (2 .1 4 )

来迭代更新 x ′ x'x ′​ ,即可获得越来越小的函数值,其中 η \eta η​ 是一个确定步长大小的正标量,用来缩放梯度向量,被称为 学习率(learning rate)。

学习率决定了目标函数 能否收敛到局部最小值,以及 何时收敛到最小值。 学习率 η \eta η 可由算法设计者设置。一般设置为某较小的值,如 0.01 , 0.001 0.01,0.001 0 .0 1 ,0 .0 0 1 等。 请注意,如果我们使用的学习率太小,将导致 x x x 的更新非常缓慢,需要更多的迭代。

例如,考虑同一优化问题中 η = 0.05 \eta = 0.05 η=0 .0 5​ 的进度。 如图 2.8 所示,尽管经过了 10 10 1 0​ 次训练,我们仍然离最优解很远。

图 2.8 学习率过小导致训练缓慢

相反,如果我们使用过高的学习率,∣ η f ′ ( x ) ∣ \left|\eta f'(x)\right|∣ηf ′(x )∣​对于一阶泰勒展开式可能太大。在这种情况下,x x x​ 的迭代不能保证降低 f ( x ) f(x)f (x )​的值。 例如,当学习率为 η = 1.1 \eta=1.1 η=1 .1​ 时,x x x​ 超出了最优解 x = 0 x=0 x =0​ 并逐渐发散。

图 2.9 学习率过大导致训练不稳定

我们可以通过几种不同的方式选择 η \eta η。普遍的方式是选择一个小常数。有时我们通过计算,选择使方向导数消失的步长。还有一种方法是根据几个 η \eta η 计算 f ( x − η ∇ x f ( x ) ) f(x − \eta \nabla xf(x))f (x −η∇x f (x )),并选择其中能产生最小目标函数值的 η \eta η 。这种策略被称为 线搜索 (line search)。

对于一个一维函数而言,选择好学习率 η \eta η 之后,向量形式的 x ′ = x − η ⋅ ∇ f x^{\prime}=x-\eta \cdot \nabla f x ′=x −η⋅∇f​ 就退化成了标量形式:
x ′ = x − η ⋅ d y d x (2.15) x^{\prime}=x-\eta \cdot \frac{\mathrm{d} y}{\mathrm{d} x}\tag{2.15}x ′=x −η⋅d x d y ​(2 .1 5 )

通过上式迭代更新 x ′ x'x ′​​​ 若干次,这样得到的 𝑥 ′ 𝑥'x ′​​​ 处的函数值 y ′ y'y ′​​​,总是更有可能比在 x x x​​ ​处的函数值 y y y​​​ 小。

通过上面公式优化参数的方法称为 梯度下降算法,它通过循环计算函数的梯度 ∇ 𝑓 ∇𝑓∇f​ 并更新待优化参数 θ \theta θ​,从而得到函数 f f f​ 获得极小值时参数 θ \theta θ​ 的最优数值解。需要注意的是,在深度学习中,一般 𝒙 𝒙x​ 表示模型输入,模型的待优化参数一般用 θ , 𝑤 , 𝑏 \theta,𝑤,𝑏θ,w ,b​ 等符号表示。

现在我们将应用梯度下降算法来求解 w ∗ , b ∗ \boldsymbol w^{}, b^{}w ∗,b ∗​ 参数。这里要最小化的是均方差误差函数 L \mathcal{L}L​:
L = 1 n ∑ i = 0 n ( w x ( i ) + b − y ( i ) ) 2 (2.16) \mathcal{L}=\frac{1}{n} \sum_{i=0}^{n}\left(w x^{(i)}+b-y^{(i)}\right)^{2}\tag{2.16}L =n 1 ​i =0 ∑n ​(w x (i )+b −y (i ))2 (2 .1 6 )

需要优化的模型参数是 w \boldsymbol w w 和 b b b ,因此我们按照
w ′ = w − η ∂ L ∂ w (2.17) w^{\prime}=w-\eta \frac{\partial \mathcal{L}}{\partial w}\tag{2.17}w ′=w −η∂w ∂L ​(2 .1 7 )

b ′ = b − η ∂ L ∂ b (2.18) b^{\prime}=b-\eta \frac{\partial \mathcal{L}}{\partial b}\tag{2.18}b ′=b −η∂b ∂L ​(2 .1 8 )

的方式循环更新参数即可。

话题 10 :梯度下降算法为什么可以优化目标函数?(选学);

梯度下降算法为什么可以优化目标函数呢?下面给出简单证明:

考虑一类连续可微实值函数 f : R → R f: \R \rightarrow \mathbb{R}f :R →R, 利用泰勒展开,我们可以得到
f ( x + ϵ ) = f ( x ) + ϵ f ′ ( x ) + O ( ϵ 2 ) . (2.19) f(x + \epsilon) = f(x) + \epsilon f'(x) + \mathcal{O}(\epsilon^2).\tag{2.19}f (x +ϵ)=f (x )+ϵf ′(x )+O (ϵ2 ).(2 .1 9 )

即在一阶近似中,f ( x + ϵ ) f(x+\epsilon)f (x +ϵ) 可通过 x x x 处的函数值 f ( x ) f(x)f (x ) 和一阶导数 f ′ ( x ) f'(x)f ′(x ) 得出。 我们可以假设在负梯度方向上移动的 ϵ \epsilon ϵ 会减少 f f f 。 为了简单起见,我们选择固定步长 η > 0 \eta > 0 η>0 ,然后取 ϵ = − η f ′ ( x ) \epsilon = -\eta f'(x)ϵ=−ηf ′(x ) 。 将其代入泰勒展开式我们可以得到
f ( x − η f ′ ( x ) ) = f ( x ) − η f ′ 2 ( x ) + O ( η 2 f ′ 2 ( x ) ) . (2.20) f(x - \eta f'(x)) = f(x) - \eta f'^2(x) + \mathcal{O}(\eta^2 f'^2(x)).\tag{2.20}f (x −ηf ′(x ))=f (x )−ηf ′2 (x )+O (η2 f ′2 (x )).(2 .2 0 )

如果其导数 f ′ ( x ) ≠ 0 f'(x) \neq 0 f ′(x )​=0 没有消失,我们就能继续展开,这是因为 η f ′ 2 ( x ) > 0 \eta f'^2(x)>0 ηf ′2 (x )>0。 此外,我们总是可以令 η \eta η 小到足以使高阶项变得不相关。 因此,
f ( x − η f ′ ( x ) ) ⪅ f ( x ) . (2.21) f(x - \eta f'(x)) \lessapprox f(x).\tag{2.21}f (x −ηf ′(x ))⪅f (x ).(2 .2 1 )

这意味着,如果我们使用
x ← x − η f ′ ( x ) (2.22) x \leftarrow x - \eta f'(x)\tag{2.22}x ←x −ηf ′(x )(2 .2 2 )

来迭代 x x x​​​​,函数 f ( x ) f(x)f (x )​​​​ 的值可能会下降。 因此,在梯度下降中,我们首先选择初始值 x x x​​​​ 和常数 η > 0 \eta > 0 η>0​​​​ , 然后使用它们连续迭代 x x x​​​​​ ,直到停止条件达成,达到全局最小值(全局最优解)或局部最小值后停止。表现在图像上如图 2.10 所示:

图 2.10 梯度下降示意图

❑ ❑\,❑​​ 局部最优解

注意到我们刚刚提到了全局最优解与局部最优解的概念,那么他们分别是什么意思呢?全局最优解可以理解为我们需要解决的问题,在全值域范围内最优。那么局部最优解就是指对于一个问题的解在一定范围或区域内最优,或者说解决问题或达成目标的手段在一定范围或限制内最优。我们显然更希望得到全局最优解而不是局部最优解:

图2.11 近似最小化。当存在多个局部极小点或平坦区域时,优化算法可能无法找到全局最小点。 在深度学习的背景下,即使找到的解不是真正最小的,但只要它们对应于代价函数显著低的值,我 们通常就能接受这样的解。[《Deep Learning》]

在梯度下降的过程中,如果落入局部最优解之中,将会陷入其中无法脱出。根据上图我们可以很清晰地发现,局部最优解处正是 f ′ ( x ) = 0 f'(x) = 0 f ′(x )=0​​​ 的临界点,此时的导数无法提供往哪个方向移动的信息。一个 局部极小点(local minimum)意味着这个点的 f ( x ) f(x)f (x )​​​ 小于所有邻近点,因此不可能通过移动无穷小的步长来减小 f ( x ) f(x)f (x )​​​。一个 局部极大点(local maximum)意味着这个点的 f ( x ) f(x)f (x )​​​ 大于所有邻近点,因此不可能通过移动无穷小的步长来增大 f ( x ) f(x)f (x )​​​​。更可怕的是,有些临界点既不是最小点也不是最大点,由于这个临界点特殊的地形,同样会导致梯度下降算法被困在其中,这些点被称为 鞍点(saddle point)。各种临界点如下图所示:

图 2.12 临界点的类型。一维情况下,三种临界点的示例。临界点是斜率为零的点。这样的点可以 是 局部极小点(local minimum),其值低于相邻点; 局部极大点(local maximum),其值高于相 邻点; 或鞍点,同时存在更高和更低的相邻点。[《Deep Learning》]

话题 11 :训练过程中如何避免陷入局部最优解?如何逃离鞍点?

我们在训练的过程中,肯定想要避免陷入局部最优解,及时逃离鞍点。对于梯度下降算法而言,可以通过自适应学习率、动量等方法进行优化,进而衍生出了各种优化算法如:Adagrad、RMSprop、stochastic GD(SGD)等方法。他们逃离鞍点的效果如下图所示:

图 2.13 优化算法在遇到鞍点处的表现

我们将在 《繁凡的深度学习笔记》第 7 章 过拟合、优化算法与参数优化 7.9 优化算法 中对这些拓展的优化算法进行进一步的深入探讨。

我们将在 《繁凡的深度学习笔记》第 7 章 过拟合、优化算法与参数优化 7.9 优化算法 中更进一步地深入探讨梯度下降算法,并对Jacobian 和 Hessian 矩阵进行详细讲解。

话题 12 : 趣味话题:有时候我们没办法直接计算梯度该怎么办呢?可以尝试估计梯度大小吗?- 有限差分法与对称导数法(选学)

❑ ❑\,❑ ​有限差分法

在数学中, 有限差分法finite-difference methods,FDM),是一种微分方程数值方法,是通过有限差分来近似导数,从而寻求微分方程的近似解。有时我们不能直接获取梯度值,就可以使用有限差分法,根据导数的定义,取极限的方法来获得对梯度的估计。

❑ ❑\,❑ 有限差分法的推导

首先假设要近似函数的各级导数都有良好的性质,依照泰勒定理,可以形成以下的泰勒展开式:
f ( x 0 + h ) = f ( x 0 ) + f ′ ( x 0 ) 1 ! h + f ( 2 ) ( x 0 ) 2 ! h 2 + ⋯ + f ( n ) ( x 0 ) n ! h n + R n ( x ) , (2.23) f(x_{0}+h)=f(x_{0})+{\frac {f'(x_{0})}{1!}}h+{\frac {f^{{(2)}}(x_{0})}{2!}}h^{2}+\cdots +{\frac {f^{{(n)}}(x_{0})}{n!}}h^{n}+R_{n}(x),\tag{2.23}f (x 0 ​+h )=f (x 0 ​)+1 !f ′(x 0 ​)​h +2 !f (2 )(x 0 ​)​h 2 +⋯+n !f (n )(x 0 ​)​h n +R n ​(x ),(2 .2 3 )

其中 n ! n!n !​​​​​​ 表示是 n n n​​​ 的阶乘,R n ( x ) Rn(x)R n (x )​ 为余数,表示泰勒多项式和原函数之间的差。可以推导函数 f f f 一阶导数的近似值:
f ( x 0 + h ) = f ( x 0 ) + f ′ ( x 0 ) h + R 1 ( x ) , (2.24) f(x_{0}+h)=f(x_{0})+f'(x_{0})h+R_{1}(x),\tag{2.24}f (x 0 ​+h )=f (x 0 ​)+f ′(x 0 ​)h +R 1 ​(x ),(2 .2 4 )
设定 x 0 = a x_0=a x 0 ​=a,可得:
f ( a + h ) = f ( a ) + f ′ ( a ) h + R 1 ( x ) , (2.25) f(a+h)=f(a)+f'(a)h+R_{1}(x),\tag{2.25}f (a +h )=f (a )+f ′(a )h +R 1 ​(x ),(2 .2 5 )
除以 h h h 可得:
f ( a + h ) h = f ( a ) h + f ′ ( a ) + R 1 ( x ) h (2.26) {f(a+h) \over h}={f(a) \over h}+f'(a)+{R_{1}(x) \over h}\tag{2.26}h f (a +h )​=h f (a )​+f ′(a )+h R 1 ​(x )​(2 .2 6 )
求解f ′ ( a ) f'(a)f ′(a ):
f ′ ( a ) = f ( a + h ) − f ( a ) h − R 1 ( x ) h (2.27) f'(a)={f(a+h)-f(a) \over h}-{R_{1}(x) \over h}\tag{2.27}f ′(a )=h f (a +h )−f (a )​−h R 1 ​(x )​(2 .2 7 )
假设 R 1 ( x ) {\displaystyle R_{1}(x)}R 1 ​(x ) 相当小,因此可以将 "f" 的一阶导数近似为:
f ′ ( a ) ≈ f ( a + h ) − f ( a ) h . (2.28) f'(a)\approx {f(a+h)-f(a) \over h}.\tag{2.28}f ′(a )≈h f (a +h )−f (a )​.(2 .2 8 )
❑ ❑\,❑ 对称导数

在数学中, 对称导数symmetric derivative)是对普通导数的推广。它被定义为:
lim ⁡ h → 0 f ( x + h ) − f ( x h ) 2 h . (2.29) {\displaystyle \lim _{h\to 0}{\frac {f(x+h)-f(xh)}{2h}}.}\tag{2.29}h →0 lim ​2 h f (x +h )−f (x h )​.(2 .2 9 )
极限下的表达式有时称为 对称差商symmetric difference quotient.)。如果函数的对称导数存在于该点, 则称该函数在点 x x x​ 处 对称可微。 如果一个函数在一点上是可微的(在通常意义上),那么它也是对称可微的,但反之则不成立。

❑ ❑\,❑ ​二阶对称导数

二阶对称导数定义为
lim ⁡ h → 0 f ( x + h ) − 2 f ( x ) + f ( x h ) h 2 . (2.30) {\displaystyle \lim {h\to 0}{\frac {f(x+h)-2f(x)+f(xh)}{h^{2}}}.}\tag{2.30}h →0 lim ​h 2 f (x +h )−2 f (x )+f (x h )​.(2 .3 0 )
如果存在(通常的)二阶导数,则二阶对称导数存在并且等于它。然而,即使(普通)二阶导数不存在,二阶对称导数也可能存在。例如,考虑符号函数 sgn ⁡ ( x ) {\displaystyle \operatorname {sgn}(x)}s g n (x ),其定义为
sgn ⁡ ( x ) = { − 1 if x < 0 , 0 if x = 0 , 1 if x > 0. (2.31) {\displaystyle \operatorname {sgn}(x)={\begin{cases}-1&{\text{if }}x s g n (x )=⎩⎪⎨⎪⎧​−1 0 1 ​if x <0 ,if x =0 ,if x >0 .​(2 .3 1 )
符号函数在零处不连续,因此对于 x = 0 {\displaystyle x=0}x =0 不存在。但是二阶对称导数存在于 x = 0 {\displaystyle x=0}x =0 :
lim ⁡ h → 0 sgn ⁡ ( 0 + h ) − 2 sgn ⁡ ( 0 ) + sgn ⁡ ( 0 − h ) h 2 = lim ⁡ h → 0 sgn ⁡ ( h ) − 2 ⋅ 0 + ( − sgn ⁡ ( h ) ) h 2 = lim ⁡ h → 0 0 h 2 = 0. (2.32) {\displaystyle \lim
{h\to 0}{\frac {\operatorname {sgn}(0+h)-2\operatorname {sgn}(0)+\operatorname {sgn}(0-h)}{h ^{2}}}=\lim {h\to 0}{\frac {\operatorname {sgn}(h)-2\cdot 0+(-\operatorname {sgn}(h))}{h^{ 2}}}=\lim {h\to 0}{\frac {0}{h^{2}}}=0.}\tag{2.32}h →0 lim ​h 2 s g n (0 +h )−2 s g n (0 )+s g n (0 −h )​=h →0 lim ​h 2 s g n (h )−2 ⋅0 +(−s g n (h ))​=h →0 lim ​h 2 0 ​=0 .(2 .3 2 )

❑ ❑\,❑ 估计梯度

在论文 CCS 2017 ZOO: Zeroth Order Optimization Based Black-box Attacks to Deep Neural Networks without Training Substitute Models[14]中,对于待攻击的黑盒模型,无法获得被攻击模型的损失函数的梯度 ∇ x L ( x , y ) \nabla_xL(x,y)∇x ​L (x ,y ) ,作者提出可以使用有限差分法来估计梯度。

首先我们先对输入 x x x​​​ 进行扰动:x = x + h × e x=x+h\times e x =x +h ×e​​​,其中常量 h = 0.0001 h=0.0001 h =0 .0 0 0 1​​​。 e e e​​​ 是标准单位向量。记模型的输出为 f ( x ) f(x)f (x ) ,文中利用对称差商得到梯度的估计值:
g ^ i : = ∂ f ( x ) ∂ x i ≈ f ( x + h e i ) − f ( x − h e i ) 2 h (2.33) \hat{g}{i}:=\frac{\partial f(\mathbf{x})}{\partial \mathbf{x}{i}} \approx \frac{f\left(\mathbf{x}+h \mathbf{e}{i}\right)-f\left(\mathbf{x}-h \mathbf{e}{i}\right)}{2 h }\tag{2.33}g ^​i ​:=∂x i ​∂f (x )​≈2 h f (x +h e i ​)−f (x −h e i ​)​(2 .3 3 )
在增加一次查询之后即可获得二阶信息:
h ^ i : = ∂ 2 f ( x ) ∂ x i i 2 ≈ f ( x + h e i ) − 2 f ( x ) + f ( x − h e i ) h 2 (2.34) \hat{h}{i}:=\frac{\partial^{2} f(\mathbf{x})}{\partial \mathbf{x}{i i}^{2}} \approx \frac{f\left(\mathbf{x}+h \mathbf{e}{i}\right)-2 f(\mathbf{x})+f\left(\mathbf{x}-h \mathbf{e}{i}\right)}{h^{2}}\tag{2.34}h ^i ​:=∂x i i 2 ​∂2 f (x )​≈h 2 f (x +h e i ​)−2 f (x )+f (x −h e i ​)​(2 .3 4 )
获得了这两个梯度估计值以后,即可直接对 x x x 进行梯度下降优化。

利用牛顿法:
x = x − η g ~ h ~ (2.35) x=x-\eta \frac{\tilde{g}}{\tilde{h}}\tag{2.35}x =x −ηh ~g ~​​(2 .3 5 )
其中 η \eta η​ 是学习率(步长)。

实现的伪代码如下图所示:

图 2.14 原论文伪代码[14]

论文 ICLR 2019 Prior convictions: Black-box adversarial attacks with bandits and priors. [15] 中提出使用有限差分法估计某个函数 f f f​ 在向量 v v v​ 方向上的点 x x x​ 处的方向导数 D v f ( x ) = ⟨ ∇ x f ( x ) , v ⟩ D_{v} f(x)=\left\langle\nabla_{x} f(x), v\right\rangle D v ​f (x )=⟨∇x ​f (x ),v ⟩​ 为:
D v f ( x ) = ⟨ ∇ x f ( x ) , v ⟩ ≈ ( f ( x + δ v ) − f ( x ) ) δ (2.36) D_{v} f(x)=\left\langle\nabla_{x} f(x), v\right\rangle \approx \dfrac {(f(x+\delta v)-f(x))}{\delta}\tag{2.36}D v ​f (x )=⟨∇x ​f (x ),v ⟩≈δ(f (x +δv )−f (x ))​(2 .3 6 )
δ > 0 \delta > 0 δ>0​​​​ 为步长,控制梯度估计的质量。 由于精度和噪声等问题,步长更小会得到更准确的估计,但同时也会降低可靠性。 因此,在实践中,将 δ \delta δ​​​​ 作为一个可调参数使用。

我们使用有限差分来构建梯度的估计,可以通过使用所有标准基向量 e 1 , . . . , e d e_1,... , e_d e 1 ​,...,e d ​​​​​​ 估计梯度的内积来找到梯度的 d d d​​​​​ 个分量:
∇ ^ x L ( x , y ) = ∑ k = 1 d e k ( L ( x + δ e k , y ) − L ( x , y ) ) δ ≈ ∑ k = 1 d e k ⟨ ∇ x L ( x , y ) , e k ⟩ (2.37) \widehat{\nabla}{x} L(x, y)=\sum{k=1}^{d} e_{k}\dfrac {\left(L\left(x+\delta e_{k}, y\right)-L(x, y)\right)}{\delta} \approx \sum_{k=1}^{d} e_{k}\left\langle\nabla_{x} L(x, y), e_{k}\right\rangle\tag{2.37}∇x ​L (x ,y )=k =1 ∑d ​e k ​δ(L (x +δe k ​,y )−L (x ,y ))​≈k =1 ∑d ​e k ​⟨∇x ​L (x ,y ),e k ​⟩(2 .3 7 )

话题 13 :什么是最小二乘法?如何使用最小二乘法解决线性回归问题?

❑ ❑\,❑ 最小二乘法​

最小二乘法是由勒让德在19世纪发现的,形式如下式:

标 函 数 = ∑ ( 观 测 值 − 理 论 值 ) 2 (2.38) 标函数=\sum(观测值-理论值)^2\tag{2.38}标函数=∑(观测值−理论值)2 (2 .3 8 )

观测值就是我们的多组样本,理论值就是我们的假设拟合函数。目标函数也就是在机器学习中常说的损失函数,我们的目标是得到使目标函数最小化时候的拟合函数的模型。

举一个最简单的线性回归的简单例子,比如我们有 m m m 个只有一个特征的样本:( x i , y i ) , i ∈ [ 1 , m ] (x_i,y_i),i\in1,m,i ∈[1 ,m ]​。样本采用一般的 f θ f_{\theta}f θ​ 为次 n n n 的多项式拟合,f θ = θ 0 + θ 1 x + θ 2 x 2 + ⋯ + θ n x n f_{\theta}=\theta_0+\theta_1x+\theta_2x^2+\cdots+\theta_nx^n f θ​=θ0 ​+θ1 ​x +θ2 ​x 2 +⋯+θn ​x n,其中 θ i , i ∈ [ 1 , m ] \theta_i,i\in[1,m]θi ​,i ∈[1 ,m ]​ 为参数。最小二乘法就是要找到一组 θ i , i ∈ [ 1 , m ] \theta_i,i\in[1,m]θi ​,i ∈[1 ,m ]​ 使得 ∑ i = 1 n ( f θ ( x i ) − y i ) 2 \displaystyle \sum_{i=1}^{n}(f_{\theta}(x_i)-y_i)^2 i =1 ∑n ​(f θ​(x i ​)−y i ​)2​ 最小,即求解 min ⁡ { ∑ i = 1 n ( f θ ( x i ) − y i ) 2 } \min{\displaystyle \sum_{i=1}^{n}(f_{\theta}(x_i)-y_i)^2}min {i =1 ∑n ​(f θ​(x i ​)−y i ​)2 }​​ 。

我们发现这是一个二次函数,我们对其求导,在导数为 0 0 0 的时候取得最小值即可。

回到我们之前讨论的神经元问题,求解 w w w 和 b b b 是使损失函数最小化的过程,在统计中,称为线性回归模型的 最小二乘参数估计 (parameter estimation)。我们可以将 L ( w , b ) \mathcal{L}(w,b)L (w ,b ) 分别对 w w w 和 b b b 求偏导,得到:

∂ L ∂ w = 1 n ∑ i = 1 n 2 ( w x ( i ) + b − y ( i ) ) ⋅ ∂ ( w x ( i ) + b − y ( i ) ) ∂ w = 1 n ∑ i = 1 n 2 ( w x ( i ) + b − y ( i ) ) ⋅ x ( i ) = 2 n ∑ i = 1 n ( w x ( i ) + b − y ( i ) ) ⋅ x ( i ) (2.39) \begin{aligned}\frac{\partial \mathcal{L}}{\partial w}&=\frac{1}{n} \sum_{i=1}^{n} 2\left(w x^{(i)}+b-y^{(i)}\right) \cdot \frac{\partial\left(w x^{(i)}+b-y^{(i)}\right)}{\partial w} &\&=\frac{1}{n} \sum_{i=1}^{n} 2\left(w x^{(i)}+b-y^{(i)}\right) \cdot x^{(i)} &\&=\frac{2}{n} \sum_{i=1}^{n}\left(w x^{(i)}+b-y^{(i)}\right) \cdot x^{(i)}\end{aligned}\tag{2.39}∂w ∂L ​​=n 1 ​i =1 ∑n ​2 (w x (i )+b −y (i ))⋅∂w ∂(w x (i )+b −y (i ))​=n 1 ​i =1 ∑n ​2 (w x (i )+b −y (i ))⋅x (i )=n 2 ​i =1 ∑n ​(w x (i )+b −y (i ))⋅x (i )​​(2 .3 9 )

∂ L ∂ b = ∂ 1 n ∑ i = 1 n ( w x ( i ) + b − y ( i ) ) 2 ∂ b = 1 n ∑ i = 1 n ∂ ( w x ( i ) + b − y ( i ) ) 2 ∂ b = 1 n ∑ i = 1 n 2 ( w x ( i ) + b − y ( i ) ) ⋅ ∂ ( w x ( i ) + b − y ( i ) ) ∂ b = 1 n ∑ i = 1 n 2 ( w x ( i ) + b − y ( i ) ) ⋅ 1 = 2 n ∑ i = 1 n ( w x ( i ) + b − y ( i ) ) (2.40) \begin{aligned}\dfrac{\partial \mathcal{L}}{\partial b}&=\dfrac{\displaystyle \partial \dfrac{1}{n} \sum_{i=1}^{n}\left(w x^{(i)}+b-y^{(i)}\right)^{2}}{\partial b}\&=\frac{1}{n} \sum_{i=1}^{n} \frac{\partial\left(w x^{(i)}+b-y^{(i)}\right)^{2}}{\partial b} &\&=\frac{1}{n} \sum_{i=1}^{n} 2\left(w x^{(i)}+b-y^{(i)}\right) \cdot \frac{\partial\left(w x^{(i)}+b-y^{(i)}\right)}{\partial b} &\&=\frac{1}{n} \sum_{i=1}^{n} 2\left(w x^{(i)}+b-y^{(i)}\right) \cdot 1 &\&=\frac{2}{n} \sum_{i=1}^{n}\left(w x^{(i)}+b-y^{(i)}\right)\end{aligned}\tag{2.40}∂b ∂L ​​=∂b ∂n 1 ​i =1 ∑n ​(w x (i )+b −y (i ))2 ​=n 1 ​i =1 ∑n ​∂b ∂(w x (i )+b −y (i ))2 ​=n 1 ​i =1 ∑n ​2 (w x (i )+b −y (i ))⋅∂b ∂(w x (i )+b −y (i ))​=n 1 ​i =1 ∑n ​2 (w x (i )+b −y (i ))⋅1 =n 2 ​i =1 ∑n ​(w x (i )+b −y (i ))​​(2 .4 0 )

令上述两式为 0 0 0​,即可得到 w w w​ 和 b b b​ 最优解的闭式(closed-form)解。

❑ ❑\,❑ 最小二乘法的矩阵法解法(选学)

这里用多元线性回归例子来描述:假设函数 f θ ( x 1 , x 2 , ... , x n ) = θ 0 + θ 1 x 1 + ⋯ + θ n x n f_{\theta}(x_1,x_2,\dots,x_n)=\theta_0+\theta_1x_1+\cdots+\theta_nx_n f θ​(x 1 ​,x 2 ​,...,x n ​)=θ0 ​+θ1 ​x 1 ​+⋯+θn ​x n ​ 的矩阵表达方式为:
f θ ( X ) = X θ (2.41) f_{\theta}(\boldsymbol X)=\boldsymbol X\theta\tag{2.41}f θ​(X )=X θ(2 .4 1 )

其中, 假设函数 f θ ( X ) = X θ f_{\theta}(\boldsymbol X)=\boldsymbol X\theta f θ​(X )=X θ 为 m × 1 m\times 1 m ×1 的向量,θ \theta θ 为 n × 1 n\times 1 n ×1的向量,里面有 n n n 个代数法的模型参数。 X \boldsymbol X X 为 n × m n\times m n ×m 维的矩阵。m m m 代表样本的个数,n n n 代表样本的特征数。

损失函数定义为
g ( θ ) = 1 2 ( X θ − Y ) T ( X θ − Y ) (2.42) g({\theta}) = \dfrac 1 2(\boldsymbol X\theta-\boldsymbol Y)^\mathrm{T}(\boldsymbol X\theta-\boldsymbol Y)\tag{2.42}g (θ)=2 1 ​(X θ−Y )T (X θ−Y )(2 .4 2 )

其中 Y \boldsymbol {Y}Y 是样本的输出向量,维度为 m × 1 m\times 1 m ×1。1 2 \dfrac 1 2 2 1 ​ 在这主要是为了求导后系数为 1 1 1,方便计算。

根据最小二乘法的原理,我们要对这个损失函数对 θ \theta θ 向量求导取 0 0 0。结果如下式:
∂ g ( θ ) ∂ θ = X T ( X θ − Y = 0 (2.43) \dfrac {\partial g(\theta)}{\partial \theta}=\boldsymbol {X}^{\mathrm{T}}(\boldsymbol {X}\theta-\boldsymbol {Y}=0\tag{2.43}∂θ∂g (θ)​=X T (X θ−Y =0 (2 .4 3 )

整理可得:
θ = ( X T X ) − 1 X T Y (2.44) \theta=(\boldsymbol {X}^{\mathrm T}\boldsymbol {X})^{-1}\boldsymbol {X}^{\mathrm{T}}\boldsymbol {Y}\tag{2.44}θ=(X T X )−1 X T Y (2 .4 4 )

❑ ❑\,❑ 最小二乘法的局限性和适用场景

  • 最小二乘法需要计算 X T X \boldsymbol {X}^{\mathrm{T}}\boldsymbol {X}X T X 的逆矩阵,有可能它的逆矩阵不存在,这样就没有办法直接用最小二乘法了,此时梯度下降法仍然可以使用。当然,我们可以通过对样本数据进行整理,去掉冗余特征。让 X T X \boldsymbol {X}^{\mathrm{T}}\boldsymbol {X}X T X 的行列式不为 0 0 0 ,然后继续使用最小二乘法。
  • 当样本特征 n n n 非常的大的时候,计算 X T X {\boldsymbol X}^{\mathrm{T}}\boldsymbol {X}X T X 的逆矩阵是一个非常耗时的工作(n × n n\times n n ×n 的矩阵求逆),甚至不可行。而此时以梯度下降为代表的迭代法仍然可以使用。有时可以通过主成分分析降低特征的维度后再用最小二乘法。
  • 如果拟合函数不是线性的,这时无法使用最小二乘法,需要通过一些技巧转化为线性才能使用,此时梯度下降仍然可以用。

话题 14 :道理我都懂,怎么用代码实现并解决神经元线性模型呢?

在理解了神经元线性模型的原理以及各种优化算法以后,我们来实战训练单输入神经元线性模型。

首先我们引入需要的包。

In [ 1 ] : \text { In }[1]:In [1 ]:

import numpy as np
import math

1. 生成数据集

我们需要采样自真实模型的多组数据,对于已知真实模型的 玩具样例 (Toy Example),我们直接从指定的 w = 1.477 , b = 0.089 w = 1.477 , b = 0.089 w =1 .4 7 7 ,b =0 .0 8 9 的真实模型中直接采样:
y = 1.477 × x + 0.089 (2.45) y=1.477 \times x+0.089\tag{2.45}y =1 .4 7 7 ×x +0 .0 8 9 (2 .4 5 )

为了能够很好地模拟真实样本的观测误差,我们给模型添加误差自变量 ϵ \epsilon ϵ ,它采样自均值为 0 0 0 ,方差为 0.01 0.01 0 .0 1 的高斯分布:
y = 1.477 x + 0.089 + ϵ , ϵ ∼ N ( 0 , 0.01 ) (2.46) y=1.477 x+0.089+\epsilon, \epsilon \sim \mathcal{N}(0,0.01)\tag{2.46}y =1 .4 7 7 x +0 .0 8 9 +ϵ,ϵ∼N (0 ,0 .0 1 )(2 .4 6 )

我们通过随机采样 n = 100 n = 100 n =1 0 0 次,我们获得 n n n 个样本的训练数据集 D t r a i n \mathbb D_{\mathrm{train}}D t r a i n ​ ,然后循环进行 100 100 1 0 0 次采样,每次从均匀分布 U ( − 10 , 10 ) U ( -10,10)U (−1 0 ,1 0 ) 中随机采样一个数据 x x x 同时从均值为 0 0 0 ,方差为 0. 1 2 0.1^{2}0 .1 2 的高斯分布 N ( 0 , 0. 1 2 ) \mathcal{N}\left(0,0.1^{2}\right)N (0 ,0 .1 2 ) 中随机采样噪声 ϵ \epsilon ϵ,根据真实模型生成 y y y 的数据,并保存为 Numpy \text{Numpy}Numpy 数组。

In [ 2 ] : \text { In }[2]:In [2 ]:

def get_data():

    data = []
    for i in range(100):
        x = np.random.uniform(-10., 10.)

        eps = np.random.normal(0., 0.01)

        y = 1.477 * x + 0.089 + eps

        data.append([x, y])

    data = np.array(data)
    return data

2. 计算误差

循环计算在每个点 ( x ( i ) , y ( i ) ) \left(x^{(i)}, y^{(i)}\right)(x (i ),y (i )) 处的预测值与真实值之间差的平方并累加,从而获得训练集上的均方差损失值。

最后的误差和除以数据样本总数,从而得到每个样本上的平均误差。

In [ 3 ] : \text { In }[3]:In [3 ]:

def mse(b, w, points) :
    totalError = 0

    for i in range(0, len(points)) :

        x = points[i, 0]

        y = points[i, 1]

        totalError += (y - (w * x + b)) ** 2

    return totalError / float(len(points))

3. 计算梯度

这里我们使用更加简单好用的梯度下降算法。我们需要计算出函数在每一个点上的梯度信息: ( ∂ L ∂ w , ∂ L ∂ b ) \left(\dfrac{\partial \mathcal{L}}{\partial w}, \dfrac{\partial \mathcal{L}}{\partial b}\right)(∂w ∂L ​,∂b ∂L ​)。我们来推导一下梯度的表达式,首先考虑 ∂ L ∂ w \dfrac{\partial \mathcal{L}}{\partial w}∂w ∂L ​ ,将均方差函数展开:

∂ L ∂ w = ∂ 1 n ∑ i = 1 n ( w x ( i ) + b − y ( i ) ) 2 ∂ w = 1 n ∑ i = 1 n ∂ ( w x ( i ) + b − y ( i ) ) 2 ∂ w (2.47) \begin{aligned}\frac{\displaystyle \partial \mathcal{L}}{\partial w}&=\frac{\displaystyle \partial \frac{1}{n} \sum_{i=1}^{n}\left(w x^{(i)}+b-y^{(i)}\right)^{2}}{\partial w}&\&=\frac{1}{n} \sum_{i=1}^{n} \frac{\partial\left(w x^{(i)}+b-y^{(i)}\right)^{2}}{\partial w}\end{aligned}\tag{2.47}∂w ∂L ​​=∂w ∂n 1 ​i =1 ∑n ​(w x (i )+b −y (i ))2 ​=n 1 ​i =1 ∑n ​∂w ∂(w x (i )+b −y (i ))2 ​​​(2 .4 7 )

由于:

∂ g 2 ∂ w = 2 ⋅ g ⋅ ∂ g ∂ w (2.48) \frac{\partial g^{2}}{\partial w}=2 \cdot g \cdot \frac{\partial g}{\partial w}\tag{2.48}∂w ∂g 2 ​=2 ⋅g ⋅∂w ∂g ​(2 .4 8 )

则有:

∂ L ∂ w = 1 n ∑ i = 1 n 2 ( w x ( i ) + b − y ( i ) ) ⋅ ∂ ( w x ( i ) + b − y ( i ) ) ∂ w = 1 n ∑ i = 1 n 2 ( w x ( i ) + b − y ( i ) ) ⋅ x ( i ) = 2 n ∑ i = 1 n ( w x ( i ) + b − y ( i ) ) ⋅ x ( i ) (2.49) \begin{aligned}\frac{\partial \mathcal{L}}{\partial w}&=\frac{1}{n} \sum_{i=1}^{n} 2\left(w x^{(i)}+b-y^{(i)}\right) \cdot \frac{\partial\left(w x^{(i)}+b-y^{(i)}\right)}{\partial w} &\&=\frac{1}{n} \sum_{i=1}^{n} 2\left(w x^{(i)}+b-y^{(i)}\right) \cdot x^{(i)} &\&=\frac{2}{n} \sum_{i=1}^{n}\left(w x^{(i)}+b-y^{(i)}\right) \cdot x^{(i)}\end{aligned}\tag{2.49}∂w ∂L ​​=n 1 ​i =1 ∑n ​2 (w x (i )+b −y (i ))⋅∂w ∂(w x (i )+b −y (i ))​=n 1 ​i =1 ∑n ​2 (w x (i )+b −y (i ))⋅x (i )=n 2 ​i =1 ∑n ​(w x (i )+b −y (i ))⋅x (i )​​(2 .4 9 )

∂ L ∂ b = ∂ 1 n ∑ i = 1 n ( w x ( i ) + b − y ( i ) ) 2 ∂ b = 1 n ∑ i = 1 n ∂ ( w x ( i ) + b − y ( i ) ) 2 ∂ b = 1 n ∑ i = 1 n 2 ( w x ( i ) + b − y ( i ) ) ⋅ ∂ ( w x ( i ) + b − y ( i ) ) ∂ b = 1 n ∑ i = 1 n 2 ( w x ( i ) + b − y ( i ) ) ⋅ 1 = 2 n ∑ i = 1 n ( w x ( i ) + b − y ( i ) ) (2.50) \begin{aligned}\dfrac{\partial \mathcal{L}}{\partial b}&=\dfrac{\displaystyle \partial \dfrac{1}{n} \sum_{i=1}^{n}\left(w x^{(i)}+b-y^{(i)}\right)^{2}}{\partial b}\&=\frac{1}{n} \sum_{i=1}^{n} \frac{\partial\left(w x^{(i)}+b-y^{(i)}\right)^{2}}{\partial b} &\&=\frac{1}{n} \sum_{i=1}^{n} 2\left(w x^{(i)}+b-y^{(i)}\right) \cdot \frac{\partial\left(w x^{(i)}+b-y^{(i)}\right)}{\partial b} &\&=\frac{1}{n} \sum_{i=1}^{n} 2\left(w x^{(i)}+b-y^{(i)}\right) \cdot 1 &\&=\frac{2}{n} \sum_{i=1}^{n}\left(w x^{(i)}+b-y^{(i)}\right)\end{aligned}\tag{2.50}∂b ∂L ​​=∂b ∂n 1 ​i =1 ∑n ​(w x (i )+b −y (i ))2 ​=n 1 ​i =1 ∑n ​∂b ∂(w x (i )+b −y (i ))2 ​=n 1 ​i =1 ∑n ​2 (w x (i )+b −y (i ))⋅∂b ∂(w x (i )+b −y (i ))​=n 1 ​i =1 ∑n ​2 (w x (i )+b −y (i ))⋅1 =n 2 ​i =1 ∑n ​(w x (i )+b −y (i ))​​(2 .5 0 )

根据上面偏导数的表达式,我们只需要计算在每一个点上面的 ( w x ( i ) + b − y ( i ) ) \left(w x^{(i)}+b-y^{(i)}\right)(w x (i )+b −y (i ))​ 和 ( w x ( i ) + b − y ( i ) ) \left(w x^{(i)}+b-y^{(i)}\right)(w x (i )+b −y (i ))​值,平均后即可得到偏导数 ∂ L ∂ w \dfrac{\partial \mathcal{L}}{\partial w}∂w ∂L ​​ 和 ∂ L ∂ b \dfrac{\partial \mathcal{L}}{\partial b}∂b ∂L ​​​ 。

In [ 4 ] : \text { In }[4]:In [4 ]:


def step_gradient(b_current, w_current, points, lr) :

    b_gradient = 0
    w_gradient = 0

    M = float(len(points))
    for i in range(0, len(points)) :
        x = points[i, 0]
        y = points[i, 1]

        b_gradient += (2 / M) * ((w_current * x + b_current) - y)

        w_gradient += (2 / M) * x * ((w_current * x + b_current) - y)

    new_b = b_current - (lr * b_gradient)
    new_w = w_current - (lr * w_gradient)
    return [new_b, new_w]

plt.rcParams['font.size'] = 16
plt.rcParams['font.family'] = ['STKaiti']
plt.rcParams['axes.unicode_minus'] = False

def gradient_descent(points, starting_b, starting_w, lr, num_iterations) :
    b = starting_b
    w = starting_w
    MSE = []
    Epoch = []
    for step in range(num_iterations) :
        b, w = step_gradient(b, w, np.array(points), lr)

        loss = mse(b, w, points)
        MSE.append(loss)
        Epoch.append(step)
        if step % 50 == 0 :
            print(f"iteration:{step}, loss:{loss}, w:{w}, b:{b}")
    plt.plot(Epoch, MSE, color='C1', label='均方差')
    plt.xlabel('epoch')
    plt.ylabel('MSE')
    plt.title('MSE function')
    plt.legend(loc = 1)
    plt.show()
    return [b, w]

4. 主函数

In [ 5 ] : \text { In }[5]:In [5 ]:

def solve(data) :

    lr = 0.01
    initial_b = 0
    initial_w = 0
    num_iterations = 1000
    [b, w] = gradient_descent(data, initial_b, initial_w, lr, num_iterations)
    loss = mse(b, w, data)
    print(f'Final loss:{loss}, w{w}, b{b}')

if __name__ == "__main__":
    data = get_data()
    solve(data)

Out [ 5 ] : \text { Out }[5]:Out [5 ]:

iteration:0, loss:8.52075121569461, w:0.9683621336270813, b:0.018598967590321615
iteration:50, loss:0.0005939300597845278, w:1.477514542941938, b:0.06613823978315139
iteration:100, loss:0.00016616611251547874, w:1.4772610937560182, b:0.08026637756911292
iteration:150, loss:0.00010824080152649426, w:1.4771678278317757, b:0.08546534407456151
iteration:200, loss:0.00010039689211198855, w:1.4771335072140424, b:0.08737849449355252
iteration:250, loss:9.933471542527609e-05, w:1.4771208776838989, b:0.08808250836281861
iteration:300, loss:9.919088162325623e-05, w:1.477116230185043, b:0.08834157608859644
iteration:350, loss:9.917140448460003e-05, w:1.4771145199673728, b:0.08843690956066241
iteration:400, loss:9.916876700352793e-05, w:1.477113890630052, b:0.08847199100845321
iteration:450, loss:9.916840985114966e-05, w:1.4771136590423013, b:0.08848490051392309
iteration:500, loss:9.916836148764827e-05, w:1.4771135738210939, b:0.08848965103996947
iteration:550, loss:9.916835493854371e-05, w:1.4771135424608248, b:0.08849139917027324
iteration:600, loss:9.916835405170177e-05, w:1.4771135309206636, b:0.08849204245893828
iteration:650, loss:9.916835393161082e-05, w:1.4771135266740378, b:0.08849227918059785
iteration:700, loss:9.916835391534817e-05, w:1.4771135251113363, b:0.08849236629101521
iteration:750, loss:9.916835391314785e-05, w:1.477113524536283, b:0.08849239834648838
iteration:800, loss:9.916835391284828e-05, w:1.477113524324671, b:0.08849241014247554
iteration:850, loss:9.916835391280702e-05, w:1.4771135242468005, b:0.08849241448324166
iteration:900, loss:9.916835391280325e-05, w:1.4771135242181452, b:0.08849241608058574
iteration:950, loss:9.916835391280336e-05, w:1.4771135242076006, b:0.08849241666838711
Final loss:9.916835391280157e-05, w1.4771135242037658, b0.08849241688214672

我们可以看到,第 100 100 1 0 0 次迭代时,𝑤 𝑤w 和 𝑏 𝑏b 的值就已经比较接近真实模型了,更新 1000 1000 1 0 0 0 次后得到的 w ∗ , b ∗ w^{}, b^{}w ∗,b ∗​ 数值解与真实模型的非常接近。

2.3 再探回归

话题 15 :线性模型已经完全学会了!如果换成非线性的模型该怎么办呢?

我们来考虑一个回归预测问题:使用后台数据预测youtube账号第二天的观看量。

由于观看量有周期的变化,显然不是线性模型就可以表示的。线性模型是机器学习中间最简单的数学模型之一,参数量少,计算简单,但是只能表达 线性关系。一条直线无论你怎样调整参数,都不能很好地拟合出真实的模型:

图 2.15 仅用一条直线无法较好地拟合非线性模型

如何表示更加复杂的模型,最有弹性的模型就是连续曲线,它可以更加精准地描述复杂问题。显然只要有足够多的分段线性曲线就可以逼近连续曲线。

图 2.16 分段函数逼近曲线

那么如何获得一个分段线性曲线呢?一个显然的思路是将若干线性曲线分段后合并并加上一个常数将曲线进行平移即可得到一个分段线性曲线:

图 2.17 若干线段拼接成一条分段曲线

但是这里有一个问题,由直线组成的分段线性曲线,在转角处无法计算微分,也就不能使用梯度下降算法进行优化计算。

❑ ❑❑ 解决非线性模型

深度学习希望使用神经元得到想要的函数的大致的表达,通过使用大量的数据去反向拟合出这个函数的各个参数,最终 勾勒出函数的完整形状

为了能够拟合非线性的函数,我们可以为神经网络增加非线性因素,使其可以拟合任意的函数。也就是给原先的线性模型嵌套一个非线性函数,即可将线性模型转换为非线性模型。我们把这个非线性函数称为 激活函数(Activation function),用 σ \sigma σ 表示。线性模型就转换为了:

o = σ ( W x + b ) (2.51) \boldsymbol{o}=\sigma(\boldsymbol{W} \boldsymbol{x}+\boldsymbol{b})\tag{2.51}o =σ(W x +b )(2 .5 1 )

这里的 σ \sigma σ 代表了某个具体的非线性激活函数,比如 Sigmoid 函数:

图 2.18 使用激活函数,将直线替代为曲线

❑ ❑❑ Sigmoid(S型曲线)

通过调整 Sigmoid 函数中的三个参数 c , b , w c,b,w c ,b ,w 足以实现各种各样的 S 型曲线。改变 w w w 可以改变 S 型曲线的坡度;改变 b b b 可以使 S 型曲线左右移动;改变 c c c 可以改变 S 型曲线的上下高度。

图 2.19 调整参数得到不同的 Sigmoid 曲线

我们将分段直线在经过激活函数之后再进行组合即可得到非线性的模型。

图 2.20 分段直线经过激活函数得到分段曲线可以更好地拟合非线性模型

可以理解为将原来的折线替换为了曲线,大量的曲线拼接而成即可完美拟合一个非线性的函数。

2.4 面试题目集锦

本小节 2.4 面试题目集锦 中收集的题目和答案大多来自于网上的各大博客,具体链接详见 2.5 参考资料 [7] [8] [9]。

❑ ❑❑ 1. 简单介绍一下线性回归 (Linear Regression) 的原理。

线性关系就是两个或者多个变量之间的关系符合一次函数关系,对应到图像上就是一条直线。如果变量之间的关系不符合一次函数,图像就不是直线,也不满足线性关系。

回归是指预测,希望通过计算回归到真实值。

线性回归是用于预测问题的有监督学习,是一种利用线性回归方程的最小平方函数对一个或多个自变量和因变量之间映射关系进行建模并利用学习到的映射关系实现对未知的数据进行预测的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为简单回归,大于一个自变量情况的叫做多元回归。另外线性回归还是一个连续值。

❑ ❑❑ 2.线性回归的假设函数是什么形式?

y ^ i = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 ... + θ n x n = θ ⊤ X (2.52) \hat y_i=\theta_{0} x_{0}+\theta_{1} x_{1}+\theta_{2} x_{2} \ldots+\theta_{n} x_{n}=\boldsymbol {\theta}^\top \boldsymbol X\tag{2.52}y ^​i ​=θ0 ​x 0 ​+θ1 ​x 1 ​+θ2 ​x 2 ​...+θn ​x n ​=θ⊤X (2 .5 2 )

其中 x 0 = 1 x_0=1 x 0 ​=1 也即直接加上偏置 θ 0 \theta_0 θ0 ​ , θ , X \boldsymbol {\theta}, \boldsymbol X θ,X 都是列向量。

X \boldsymbol X X 为特征,y y y 为标签值,y ^ \hat y y ^​ 为预测值,注意线性回归实际上既可以处理回归问题也可以处理分类问题,只是在针对分类问题的0-1这类的标签,线性回归会很难收敛。

❑ ❑❑ 3.线性回归的代价(损失)函数是什么形式?

默认是最小化损失函数:

J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 (2.53) J(\theta)=\frac{1}{2 m} \sum_{i=1}^{m}\left(h_{\theta}\left(x^{(i)}\right)-y^{(i)}\right)^{2}\tag{2.53}J (θ)=2 m 1 ​i =1 ∑m ​(h θ​(x (i ))−y (i ))2 (2 .5 3 )

❑ ❑❑ 4. 为什么线性回归使用的是平方差形式的损失函数?

使用平方形式的时候,使用的是"最小二乘法"的思想,这里的"二乘"指的是用平方来度量观测点与估计点的距离(远近),"最小"指的是参数值要保证各个观测点与估计点的距离的平方和达到最小。最小二乘法以估计值与观测值的平方和作为损失函数,在误差服从正态分布的前提下(这一点容易被忽视),与极大似然估计的思想在本质上是相同。也就是说不是我们特意去选择mse作为线性回归的损失函数而是因为我们假设误差服从正态分布,使用极大似然法(最大化误差项目为εi的样本总体出现的概率最大)来求解参数,进一步经过推导之后得到的mse的公式而已,具体流程见下:

我们设观测输出与预估数据之间的误差为:

ε i = y i − y ^ i (2.54) \varepsilon_{i}=y_{i}-\hat{y}_{i}\tag{2.54}εi ​=y i ​−y ^​i ​(2 .5 4 )

我们通常认为 ε \varepsilon ε 服从正态分布,即:

f ( ε i ; u , σ 2 ) = 1 σ 2 π × exp ⁡ [ − ( ε i − u ) 2 ( 2 σ 2 + 1 ] (2.55) f\left(\varepsilon_{i} ; u, \sigma^{2}\right)=\frac{1}{\sigma \sqrt{2 \pi}} \times \exp \left[-\frac{\left(\varepsilon_{i}-u\right)^{2}}{\left(2 \sigma^{2}+1\right.}\right]\tag{2.55}f (εi ​;u ,σ2 )=σ2 π​1 ​×exp −(2 σ2 +1 (εi ​−u )2 ​

我们求的参数 ε εε 的极大似然估计 ( u , σ 2 ) (u,σ^2)(u ,σ2 ) ,即是说,在某个 ( u , σ 2 ) (u,σ^2)(u ,σ2 ) 下,使得服从正态分布的 ε εε 取得现有样本εi的概率最大。也就是说实际上我们的最原始的目标是使得这个正态分布表达式的连乘的极大似然估计最大。

那么根据极大似然估计函数的定义,令:

L ( u , σ 2 ) = ∏ i = 1 n 1 2 π σ × exp ⁡ ( − ( ε i − u ) 2 ( ρ j π 2 + 1 ) ) (2.56) L\left(u, \sigma^{2}\right)=\prod_{i=1}^{n} \frac{1}{\sqrt{2 \pi} \sigma} \times \exp \left(-\frac{\left(\varepsilon_{i}-u\right)^{2}}{\left(\rho_{j} \pi^{2}+1\right)}\right)\tag{2.56}L (u ,σ2 )=i =1 ∏n ​2 π​σ1 ​×exp (−(ρj ​π2 +1 )(εi ​−u )2 ​)(2 .5 6 )

取对数似然函数:

log ⁡ L ( u , σ 2 ) = − n 2 log ⁡ σ 2 − n 2 log ⁡ 2 π − ∑ i = 1 n ( ε i − u ) 2 2 σ 2 (2.57) \log L\left(u, \sigma^{2}\right)=-\frac{n}{2} \log \sigma^{2}-\frac{n}{2} \log 2 \pi -\cfrac { \displaystyle \sum_{i=1}^{n}\left(\varepsilon_{i}-u\right)^{2}}{2\sigma^2}\tag{2.57}lo g L (u ,σ2 )=−2 n ​lo g σ2 −2 n ​lo g 2 π−2 σ2 i =1 ∑n ​(εi ​−u )2 ​(2 .5 7 )

分别求 ( u , σ 2 ) (u,σ^2)(u ,σ2 ) 的偏导数,然后置 0 0 0 ,最后求得参数 ( u , σ 2 ) (u,σ^2)(u ,σ2 ) 的极大似然估计为:

u = 1 n ∑ i = 1 n ε i σ 2 = 1 n ∑ i = 1 n ( ε i − u ) 2 (2.58) \begin{array}{c}\displaystyle u=\frac{1}{n} \sum_{i=1}^{n} \varepsilon_{i} \\displaystyle \sigma^{2}=\frac{1}{n} \sum_{i=1}^{n}\left(\varepsilon_{i}-u\right)^{2}\end{array}\tag{2.58}u =n 1 ​i =1 ∑n ​εi ​σ2 =n 1 ​i =1 ∑n ​(εi ​−u )2 ​(2 .5 8 )

我们在线性回归中要求得最佳拟合直线:

y ^ i = θ ⊤ X (2.59) \hat y_i=\boldsymbol {\theta}^\top \boldsymbol X\tag{2.59}y ^​i ​=θ⊤X (2 .5 9 )

实质上是求预估值 y ^ i \hat y_i y ^​i ​与观测值 y i y_i y i ​ 之间的误差 ε i ε_i εi ​ 最小(最好是没有误差)的情况下 θ θθ 的值。由于 ε εε 是服从参数 ( u , σ 2 ) (u,σ^2)(u ,σ2 ) 的正态分布,因此最好是均值 u u u 和方差 σ σσ 趋近于 0 0 0 或越小越好,根据表达式可知,均值和方差越小,对数似然函数越大。即:

  • u = 1 n × ( y i − y ^ i ) u=\cfrac 1 n\times (y_i−\hat y_i)u =n 1 ​×(y i ​−y ^​i ​) 越趋近于 0 0 0 越好也即越小越好。
  • σ 2 = 1 n × ( y i − y ^ i − u ) 2 ≈ 1 n × ( y i − y ^ i ) 2 σ^2=\cfrac 1 n\times (y_i−\hat y_i−u)^2≈\cfrac 1 n\times (y_i−\hat y_i)^2 σ2 =n 1 ​×(y i ​−y ^​i ​−u )2 ≈n 1 ​×(y i ​−y ^​i ​)2 趋近于 0 0 0 越好也即越小越好。

这与最前面构建的平方形式损失函数本质上是等价的。

❑ ❑❑ 5. 线性回归为什么要求因变量符合正态分布

线性回归的假设前提是特征与预测值呈线性关系,误差项符合高斯 - 马尔科夫条件(零均值,零方差,不相关),这时候线性回归是无偏估计。噪声符合正态分布,那么因变量也符合分布。在进行线性回归之前,要求因变量近似符合正态分布,否则线性回归效果不佳(有偏估计)。

❑ ❑❑ 6. 下列关于线性回归说法错误的是(D)

A. 在现有模型上,加入新的变量,所得到的R^2的值总会增加。

B. 线性回归的前提假设之一是残差必须服从独立正态分布。

C. 残差的方差无偏估计是S S E n − p \cfrac {SSE}{n-p}n −p S S E ​ 。

D. 自变量和残差不一定保持相互独立。

A:R 2 R^2 R 2 是拟合优度, R 2 = S S R S S T = 1 − S S E S S T R2=\cfrac {SSR}{SST}=1-\cfrac {SSE}{SST}R 2 =S S T S S R ​=1 −S S T S S E ​,S S T SST S S T 是总平方和, S S R SSR S S R 是回归平方和,S S E SSE S S E 是残差平方和,公式如下:

y ‾ = 1 n ∑ i = 1 n y i S S tot = ∑ i ( y i − y ‾ ) 2 S S reg = ∑ i ( f i − y ‾ ) 2 S S res = ∑ i ( y i − f i ) 2 = ∑ i e i 2 R 2 = 1 − S S res S S tot = S S reg S S tot (2.60) \begin{aligned}&\overline{\mathrm{y}}=\frac{1}{n} \sum_{i=1}^{n} y_{i} \ &S S_{\text{tot}}=\sum_{i}\left(y_{i}-\overline{\mathrm{y}}\right)^{2} \&S S_{\text{reg}}=\sum_{i}\left(f_{i}-\overline{\mathrm{y}}\right)^{2} \&S S_{\text{res}}=\sum_{i}\left(y_{i}-f_{i}\right)^{2}=\sum_{i} e_{i}^{2} \&R^{2}=1-\frac{S S_{\text{res}}}{S S_{\text{tot}}}=\frac{S S_{\text{reg}}}{S S_\text{{tot}}}\end{aligned}\tag{2.60}​y ​=n 1 ​i =1 ∑n ​y i ​S S tot ​=i ∑​(y i ​−y ​)2 S S reg ​=i ∑​(f i ​−y ​)2 S S res ​=i ∑​(y i ​−f i ​)2 =i ∑​e i 2 ​R 2 =1 −S S tot ​S S res ​​=S S t o t ​S S reg ​​​(2 .6 0 )

从公式上比较好理解,R 2 = S S reg S S tot R^2=\cfrac {SS_{\text{reg}}} {SS_{\text{tot}}}R 2 =S S tot ​S S reg ​​ 表示的是自变量引起的变动占总变动的百分比,值越大,说明残差的影响越不明显,则权重部分的预测效果越好。从公式上可以看出,因为 S S tot SS_{\text{tot}}S S tot ​ 是不变的,加入新的变量,则对于S S reg SS_{\text{reg}}S S reg ​ ,其中 f i f_i f i ​ 就增加了新的变量进来,比如原来是 w 1 x 1 + w 2 x 2 + w 3 x 3 w_1x_1+w_2x_2+w_3x_3 w 1 ​x 1 ​+w 2 ​x 2 ​+w 3 ​x 3 ​ ,如果新进的特征 x 4 x_4 x 4 ​ 实在太差,再不济我们也可以让其权重 w 4 = 0 w_4=0 w 4 ​=0 从而训练出与加入 x 4 x_4 x 4 ​ 之前的模型一样的模型(也可以从 pac理论来进行分析),显然得到的 R 2 R^2 R 2 的值总会增加。

B:线性回归的前提假设之一是残差必须服从独立正态分布,线性回归的损失函数mse就是:在某个( u , σ 2 ) (u,σ^2)(u ,σ2 ) 下,使得服从正态分布的ε取得现有样本εi的概率最大从而推算出来的损失函数的表达式。

D:错误,残差必须满足独立正态分布才符合线性回归的定义。

❑ ❑❑ 7. 在线性回归问题中,我们使用决定系数 (R-squared)来测量拟合优度。我们在线性回归模型中添加一个特征值,并保留相同的模型。下面说法正确的是(C)

A. 如果R-Squared增大,这个变量是显著的

B . 如果R-Squared减小,这个变量是显著的

C. 单独观察R-Squared的变化趋势,无法判断这个变量是否显著

D. 以上皆非

R-squared 就是上面说的 R 2 R^2 R 2 ,判断变量是否显著,需要根据变量对应的权重系数 W W W ,而与 R 2 R^2 R 2 无直接关系。

❑ ❑❑ 8. 请写出在数据预处理过程中如何处理以下问题

8.1 为了预测摩拜每天订单数,我们建立了一个线性回归模型,其中有一个自变量为天气类型(分类变量),分为晴、阴、雾霾、沙尘暴、雨、雪等6种类型,请问如何处理这种变量

8.2 仍然是 ① 中的线性回归模型,其中有一个自变量为每天红包车的数量,但是这个变量有1/4的数据是缺失值,请写出至少两种处理缺失值的方法

8.3 依然是 ① 中的模型,其中自变量有4个,他们的相关系数矩阵如下:

[ 1 − 0.307 0.338 0.302 − 0.307 1 − 0.831 − 0.410 0.338 − 0.831 1 0.360 0.302 − 0.410 0.360 1 ] (2.61) \left[\begin{array}{cccc}1 & -0.307 & 0.338 & 0.302 \-0.307 & 1 & -0.831 & -0.410 \0.338 & -0.831 & 1 & 0.360 \0.302 & -0.410 & 0.360 & 1\end{array}\right]\tag{2.61}⎣⎢⎢⎡​1 −0 .3 0 7 0 .3 3 8 0 .3 0 2 ​−0 .3 0 7 1 −0 .8 3 1 −0 .4 1 0 ​0 .3 3 8 −0 .8 3 1 1 0 .3 6 0 ​0 .3 0 2 −0 .4 1 0 0 .3 6 0 1 ​⎦⎥⎥⎤​(2 .6 1 )

8.1:天气是离散变量,没有大小关系,并且类别只有 6 6 6 类,可以直接 one-hot 展开。

8.2:1 4 = 25 % \cfrac 1 4=25\%4 1 ​=2 5 % 的数据存在缺失值不能用简单的删除法或者是均值、中位数、众数插补的方法了因为都使用相同的数据进行这么大比例的插补太容易改变原始数据的分布情况了,所以比较好的方式有 1、通过模型插补;2、多重插补法等。

8.3:变量 2、3 存在较强的负相关性,也就是存在共线性的问题,而共线性会导致模型的效果变差,所以需要根据业务知识来进行处理,合并,或者删除等再观察处理之后的效果再决定采用哪一种处理方式(需要注意的是我们这里是针对仅仅使用线性回归的情况,如果是使用 gbdt 这类算法则不需要处理)。

❑ ❑❑ 9. 线性回归解析解的推导(三种方法)

❑ ❑❑ 10. 线性回归的基本假设?

❑ ❑❑ 11. 线性回归效果不好的原因

❑ ❑❑ 12. 为什么进行线性回归前需要对特征进行离散化处理。

❑ ❑❑ 13. 线性回归处理步骤,什么情况下可停止迭代,怎么避免过拟合情况?

处理步骤一般来说为缺失值处理、类别变量数值化,异常值处理,连续特征离散化等等。

当两次迭代所有参数的变化量小于事先给定的阈值时,或者达到事先设定的最大迭代次数,则停止迭代过程。

过拟合没法避免只能说是尽量降低过拟合的影响,通过 ℓ 1 , ℓ 2 \ell_1,\ell_2 ℓ1 ​,ℓ2 ​ 正则化、减少特征的数量、增大样本的数量等等。

❑ ❑❑ 14. 线性回归优缺点

优点:实现简单,建模快,是许多非线性模型的基础。

缺点:模型简单所以难以拟合复杂数据,对非线性的数据难以运用。

2.5 参考资料

[14] Pin-Yu Chen, Huan Zhang, Yash Sharma, Jinfeng Yi, and Cho-Jui Hsieh. Zoo: Zeroth order optimization based black-box attacks to deep neural networks without training substitute models. In Proceedings of the 10th ACM Workshop on Artificial Intelligence and Security, pages 15–26. ACM, 2017.

[15] Andrew Ilyas, Logan Engstrom, and Aleksander Madry. Prior convictions: Black-box adversarial attacks with bandits and priors. In International Conference on Learning Representations, 2019. 1, 2, 5, 7, 8, 11

[16] 梯度-维基百科
https://zh.wikipedia.org/zh-cn/%E6%A2%AF%E5%BA%A6

谢谢!

Original: https://blog.csdn.net/weixin_45697774/article/details/120786508
Author: 繁凡さん
Title: 一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)



相关阅读

Title: 如何在线文字转语音?

最近在钻研做视频,只有文字字幕的视频太单调了,但是用自己的原声又略显不专业,所以po主试用了市面上绝大多数的文字转语音网站,在此分享几个良心网站给大家,绝对是亲测好用的网站!

1、票圈视频

推荐指数:三星

  • 推荐点

1、免费工具,不收费

2、效果较自然,语音有感情

  • 缺点

不是专门的文字转语音工具,用起来比较复杂

总结

比较适合需要强烈的有感情的配音的用户使用

一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)

2、爱给网

推荐指数:五星

爱给网算是po主发现的一个宝藏网站,页面简洁,操作简单,简直是找不到理由不推荐!

  • 推荐点

1、操作特别简单,下面还有爱给网自己录制的操作视频,使用时绝对不会迷茫

2、页面很小清新,也没有广告,使用起来神清气爽

3、需要经常使用的话可以充值爱给网的vip,只要29元,性价比很高

  • 缺点

唯一的缺点可能就是主播有些少,但是我觉得完全够日常使用了

总结

强烈推荐爱给网这个文字转语音的小工具,很实用,po主已经疯狂安利给身边的人了

ps:爱给网好像出了一系列的在线小工具,大家有需要可以去看看,都还挺不错的一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)

一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)

3、闪电文字转语音软件

推荐指数:三星

  • 推荐点

1、多种语音类型可选择

2、可以添加背景音乐

  • 缺点

1、必须下载才能使用

2、付费才能下载合成的语音,性价比太低

总结

需要下载才能使用过于麻烦,但是最终效果还不错一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)

4、讯飞开放平台

推荐指数:三星

使用方法如下:进入网站后向下浏览,翻到即可使用

  • 推荐点

1、丰富的发音人资源,有各种方言、小语种的语音资源

2、有免费体验次数

  • 缺点

1、字数限制为250字,不太适合需要合成大段文字的用户

2、功能太多,操作较复杂,导致用起来晕头晕脑

总结

很适合需要大量的语音合成工作的用户,不太适合日常使用一文让你完全弄懂回归问题、激活函数、梯度下降和神经元模型实战《繁凡的深度学习笔记》第 2 章 回归问题与神经元模型(DL笔记整理系列)

以上推荐的网站,是我接触了市面上绝大多数的TTS软件后总结适合不同人群的文件转语音网站,也希望知友们能够推荐更多的小众又好用的TTS网站,欢迎大家一起讨论~

Original: https://blog.csdn.net/m0_66323106/article/details/122543086
Author: m0_66323106
Title: 如何在线文字转语音?