深度学习500问--DeepLearning-500-questions
Github链接: https://github.com/runningreader/DeepLearning-500-questions
1、数学基础
链接: https://blog.csdn.net/m0_37882192/article/details/109693650.
2、机器学习基础
日常使用机器学习的任务中,我们经常会遇见各种算法
2.11 损失函数
2.11.1 什么是损失函数
损失函数(Loss Function)又叫做误差函数,用来衡量算法的运行情况,估量模型的预测值与真实值的不一致程度,是一个非负实值函数,通常使用
L
(
Y
,
f
(
x
)
)
L(Y, f(x))
L(Y,f(x))来表示。损失函数越小,模型的鲁棒性就越好。损失函数是经验风险函数的核心部分,也是结构风险函数重要组成部分。
2.11.2 常见的损失函数
机器学习通过对算法中的目标函数进行不断求解优化。分类和回归问题中,通常使用损失函数或代价函数作为目标函数。 损失函数用来评价预测值和真实值不一样的程度。通常损失函数越好,模型的性能也越好。 损失函数可分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是在经验风险损失函数上加上正则项。 下面介绍常用的损失函数:
(1)0-1损失函数 如果预测值和目标值相等,值为0,如果不相等,值为1。 L ( Y , f ( x ) ) = { 1 , Y ≠ f ( x ) 0 , Y = f ( x ) L(Y, f(x)) = \begin{cases} 1,& Y\ne f(x)\ 0,& Y = f(x) \end{cases} L(Y,f(x))={1,Y=f(x) 0,Y=f(x)
一般的在实际使用中,相等的条件过于严格,可适当放宽条件:
L ( Y , f ( x ) ) = { 1 , ∣ Y − f ( x ) ∣ ⩾ T 0 , ∣ Y − f ( x ) ∣ < T L(Y, f(x)) = \begin{cases} 1,& |Y-f(x)|\geqslant T\ 0,& |Y-f(x)|< T \end{cases} L(Y,f(x))={1,∣Y−f(x)∣⩾T 0,∣Y−f(x)∣<T
(2)绝对值损失函数 和0-1损失函数相似,绝对值损失函数表示为: L ( Y , f ( x ) ) = ∣ Y − f ( x ) ∣ L(Y, f(x)) = |Y-f(x)| L(Y,f(x))=∣Y−f(x)∣
(3)平方损失函数 L ( Y , f ( x ) ) = ∑ N ( Y − f ( x ) ) 2 L(Y, f(x)) = \sum_N{(Y-f(x))}^2 L(Y,f(x))=N∑(Y−f(x))2
这点可从最小二乘法和欧几里得距离角度理解。最小二乘法的原理是,最优拟合曲线应该使所有点到回归直线的距离和最小。
(4)对数损失函数 L ( Y , P ( Y ∣ X ) ) = − log P ( Y ∣ X ) L(Y, P(Y|X)) = -\log{P(Y|X)} L(Y,P(Y∣X))=−logP(Y∣X)
常见的逻辑回归使用的就是对数损失函数,有很多人认为逻辑回归的损失函数是平方损失,其实不然。逻辑回归它假设样本服从伯努利分布(0-1分布),进而求得满足该分布的似然函数,接着取对数求极值等。逻辑回归推导出的经验风险函数是最小化负的似然函数,从损失函数的角度看,就是对数损失函数。
(6)指数损失函数 指数损失函数的标准形式为: L ( Y , f ( x ) ) = exp ( − Y f ( x ) ) L(Y, f(x)) = \exp(-Yf(x)) L(Y,f(x))=exp(−Yf(x))
例如AdaBoost就是以指数损失函数为损失函数。
(7)Hinge损失函数 Hinge损失函数的标准形式如下: L ( y ) = max ( 0 , 1 − t y ) L(y) = \max{(0, 1-ty)} L(y)=max(0,1−ty)
统一的形式: L ( Y , f ( x ) ) = max ( 0 , Y f ( x ) ) L(Y, f(x)) = \max{(0, Yf(x))} L(Y,f(x))=max(0,Yf(x))
其中y是预测值,范围为(-1,1),t为目标值,其为-1或1。
在线性支持向量机中,最优化问题可等价于
w , b min ∑ i = 1 N ( 1 − y i ( w x i + b ) ) + λ ∥ w ∥ 2 \underset{\min}{w,b}\sum_{i=1}^N (1-y_i(wx_i+b))+\lambda\Vert w\Vert ^2 minw,bi=1∑N(1−yi(wxi+b))+λ∥w∥2
上式相似于下式
1 m ∑ i = 1 N l ( w x i + b y i ) + ∥ w ∥ 2 \frac{1}{m}\sum_{i=1}^{N}l(wx_i+by_i) + \Vert w\Vert ^2 m1i=1∑Nl(wxi+byi)+∥w∥2
其中 l ( w x i + b y i ) l(wx_i+by_i) l(wxi+byi)是Hinge损失函数, ∥ w ∥ 2 \Vert w\Vert ^2 ∥w∥2可看做为正则化项。
2.12 梯度下降
2.12.1 机器学习中为什么需要梯度下降
梯度下降是机器学习中常见优化算法之一,梯度下降法有以下几个作用:
(1)梯度下降是迭代法的一种,可以用于求解最小二乘问题。
(2)在求解机器学习算法的模型参数,即无约束优化问题时,主要有梯度下降法(Gradient Descent)和最小二乘法。
(3)在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。
(4)如果我们需要求解损失函数的最大值,可通过梯度上升法来迭代。梯度下降法和梯度上升法可相互转换。
(5)在机器学习中,梯度下降法主要有随机梯度下降法和批量梯度下降法。
2.12.2 梯度下降法缺点
梯度下降法缺点有以下几点:
(1)靠近极小值时收敛速度减慢。
(2)直线搜索时可能会产生一些问题。
(3)可能会“之字形”地下降。
梯度概念也有需注意的地方:
(1)梯度是一个向量,即有方向有大小。
(2)梯度的方向是最大方向导数的方向。
(3)梯度的值是最大方向导数的值。
核心思想归纳:
(1)初始化参数,随机选取取值范围内的任意数;
(2)迭代操作: a)计算当前梯度; b)修改新的变量; c)计算朝最陡的下坡方向走一步; d)判断是否需要终止,如否,返回a);
(3)得到全局最优解或者接近全局最优解。
2.12.5 如何对梯度下降法进行调优
实际使用梯度下降法时,各项参数指标不能一步就达到理想状态,对梯度下降法调优主要体现在以下几个方面:
(1)算法迭代步长 α \alpha α选择。 在算法参数初始化时,有时根据经验将步长初始化为1。实际取值取决于数据样本。可以从大到小,多取一些值,分别运行算法看迭代效果,如果损失函数在变小,则取值有效。如果取值无效,说明要增大步长。但步长太大,有时会导致迭代速度过快,错过最优解。步长太小,迭代速度慢,算法运行时间长。
(2)参数的初始值选择。 初始值不同,获得的最小值也有可能不同,梯度下降有可能得到的是局部最小值。如果损失函数是凸函数,则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。
(3)标准化处理。 由于样本不同,特征取值范围也不同,导致迭代速度慢。为了减少特征取值的影响,可对特征数据标准化,使新期望为0,新方差为1,可节省算法运行时间。
2.16.5 如何解决过拟合与欠拟合
如何解决欠拟合:
添加其他特征项。组合、泛化、相关性、上下文特征、平台特征等特征是特征添加的重要手段,有时候特征项不够会导致模型欠拟合。
添加多项式特征。例如将线性模型添加二次项或三次项使模型泛化能力更强。例如,FM(Factorization Machine)模型、FFM(Field-aware Factorization Machine)模型,其实就是线性模型,增加了二阶多项式,保证了模型一定的拟合程度。
可以增加模型的复杂程度。
减小正则化系数。正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。
如何解决过拟合:
重新清洗数据,数据不纯会导致过拟合,此类情况需要重新清洗数据。
增加训练样本数量。
降低模型复杂程度。
增大正则项系数。
采用dropout方法,dropout方法,通俗的讲就是在训练的时候让神经元以一定的概率不工作。
early stopping。
减少迭代次数。
增大学习率。
添加噪声数据。
树结构中,可以对树进行剪枝。
减少特征项。
欠拟合和过拟合这些方法,需要根据实际问题,实际模型,进行选择。
3、深度学习基础
3.2.2 如何计算神经网络的输出?
如上图,输入层有三个节点,我们将其依次编号为 1、2、3;隐藏层的 4 个节点,编号依次为 4、5、6、7;最后输出层的两个节点编号为 8、9。比如,隐藏层的节点 4,它和输入层的三个节点 1、2、3 之间都有连接,其连接上的权重分别为是 w 41 , w 42 , w 43 w_{41}, w_{42}, w_{43} w41,w42,w43。
为了计算节点 4 的输出值,我们必须先得到其所有上游节点(也就是节点 1、2、3)的输出值。节点 1、2、3 是输入层的节点,所以,他们的输出值就是输入向量本身。按照上图画出的对应关系,可以看到节点 1、2、3 的输出值分别是 x 1 , x 2 , x 3 x_1, x_2, x_3 x1,x2,x3。
a 4 = σ ( w T ⋅ a ) = σ ( w 41 x 4 + w 42 x 2 + w 43 a 3 + w 4 b ) a_4 = \sigma(w^T \cdot a) = \sigma(w_{41}x_4 + w_{42}x_2 + w_{43}a_3 + w_{4b}) a4=σ(wT⋅a)=σ(w41x4+w42x2+w43a3+w4b)
其中 w 4 b w_{4b} w4b 是节点 4 的偏置项。
同样,我们可以继续计算出节点 5、6、7 的输出值 a 5 , a 6 , a 7 a_5, a_6, a_7 a5,a6,a7。
计算输出层的节点 8 的输出值 y 1 y_1 y1:
y 1 = σ ( w T ⋅ a ) = σ ( w 84 a 4 + w 85 a 5 + w 86 a 6 + w 87 a 7 + w 8 b ) y_1 = \sigma(w^T \cdot a) = \sigma(w_{84}a_4 + w_{85}a_5 + w_{86}a_6 + w_{87}a_7 + w_{8b}) y1=σ(wT⋅a)=σ(w84a4+w85a5+w86a6+w87a7+w8b)
其中 w 8 b w_{8b} w8b 是节点 8 的偏置项。
同理,我们还可以计算出 y 2 y_2 y2。这样输出层所有节点的输出值计算完毕,我们就得到了在输入向量 x 1 , x 2 , x 3 , x 4 x_1, x_2, x_3, x_4 x1,x2,x3,x4 时,神经网络的输出向量 y 1 , y 2 y_1, y_2 y1,y2 。这里我们也看到,输出向量的维度和输出层神经元个数相同。
3.2.3 如何计算卷积神经网络输出值?
假设有一个 55 的图像,使用一个 33 的 filter 进行卷积,想得到一个 3*3 的 Feature Map,如下所示:
x i , j x_{i,j} xi,j 表示图像第 i i i 行第 j j j 列元素。 w m , n w_{m,n} wm,n 表示 filter 第 m m m 行第 n n n 列权重。 w b w_b wb 表示 f i l t e r filter filter 的偏置项。 表 a i , j a_i,_j ai,j示 feature map 第 $ i$ 行第 $ j $ 列元素。 f f f 表示激活函数,这里以 R e L U ReLU ReLU 函数为例。
卷积计算公式如下:
a i , j = f ( ∑ m = 0 2 ∑ n = 0 2 w m , n x i + m , j + n + w b ) a_{i,j} = f(\sum_{m=0}^2 \sum_{n=0}^2 w_{m,n} x_{i+m, j+n} + w_b ) ai,j=f(m=0∑2n=0∑2wm,nxi+m,j+n+wb)
3.4 激活函数
3.4.1 为什么需要非线性激活函数?
为什么需要激活函数?
激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用。
激活函数可以引入非线性因素。如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。
激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。
为什么激活函数需要非线性函数?
假若网络中全部是线性部件,那么线性的组合还是线性,与单独一个线性分类器无异。这样就做不到用非线性来逼近任意函数。
使用非线性激活函数 ,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。使用非线性激活函数,能够从输入输出之间生成非线性映射。
3.4.2 常见的激活函数及图像
1、sigmoid 激活函数
函数的定义为: f ( x ) = 1 1 + e − x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+e−x1,其值域为 ( 0 , 1 ) (0,1) (0,1)。
函数图像如下:
2、tanh激活函数
函数的定义为: f ( x ) = t a n h ( x ) = e x − e − x e x + e − x f(x) = tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=tanh(x)=ex+e−xex−e−x,值域为 ( − 1 , 1 ) (-1,1) (−1,1)。
函数图像如下:
3、Relu激活函数
函数的定义为: f ( x ) = m a x ( 0 , x ) f(x) = max(0, x) f(x)=max(0,x) ,值域为 [ 0 , + ∞ ) [0,+∞) [0,+∞);
函数图像如下:
4、softmax 函数
函数定义为: σ ( z ) j = e z j ∑ k = 1 K e z k \sigma(z)j = \frac{e^{z_j}}{\sum{k=1}^K e^{z_k}} σ(z)j=∑k=1Kezkezj。
Softmax 多用于多分类神经网络输出。