//本系列内容为动手学深度学习PyTorch版的学习笔记,内容参考伯禹教育平台
线性回归
要素
模型:线性模型大部分是线性判别模型,判别模型也称为条件模型,是建模预测变量和观测变量之间的关系,分为确定性判别模型和概率判别模型。
线性回归假设输出与各个输入之间是线性关系:
y = f θ ( x ) = θ 0 + Σ j = 1 d θ j x j = θ T x y=f_\theta (x)=\theta_0+\Sigma_{j=1}^d {\theta_j x_j}=\theta^T x y=fθ(x)=θ0+Σj=1dθjxj=θTx
x = ( 1 , x 1 , x 2 , . . . , x d ) x=(1,x_1,x_2,...,x_d) x=(1,x1,x2,...,xd)
数据集:我们通常利用真实数据寻找模型参数使得模型的预测值和真实值的误差最小。这些真实数据集被称为训练数据集(training data set)或训练集(training set),其中一个数据称为一个样本(sample),真实值叫作标签(label),用来预测标签的变量叫作特征(feature)。特征用来表征样本的特点。
损失函数:训练目标是使预测值和真实值越接近越好。定义损失函数表示预测值和真实值之间的误差,具体损失函数的定义依赖于具体的数据和任务。最广泛使用的是平方误差:
L
(
y
i
,
f
θ
(
x
i
)
)
=
1
2
(
y
i
−
f
θ
(
x
i
)
)
2
L (y_i,f_\theta (x_i))=\frac{1}{2} (y_i - f_\theta (x_i))^2
L(yi,fθ(xi))=21(yi−fθ(xi))2
优化函数-随梯度下降
当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。
优化函数的有两个步骤:
(i)初始化模型参数,一般来说使用随机初始化;
(ii)计算数据集上损失函数对于每个参数的倒数,通过在负梯度方向移动参数来更新参数。迭代多次,逐渐减小损失函数的值。
分类模型
softmax
softmax回归同线性回归一样,也是一个单层神经网络,其输出层是一个全连接层。
分类问题需要得到离散的预测输出,一个简单的办法是将输出值当作预测类别的置信度,并将值最大的输出所对应的类作为预测输出。但是直接输出值的含义不明确,误差难以衡量。softmax 预算符可以解决这些问题。
softmax 将输出值变为值为正且和为1的概率分布,不改变预测类别输出:
y
1
^
,
y
2
^
,
y
3
^
=
s
o
f
t
m
a
x
(
o
1
,
o
2
,
o
3
)
\hat{y_1},\hat{y_2},\hat{y_3} = softmax(o_1,o_2,o_3)
y1^,y2^,y3^=softmax(o1,o2,o3)
y
1
^
=
e
x
p
(
o
1
)
Σ
i
=
1
3
e
x
p
(
o
i
)
\hat{y_1}=\frac{exp(o_1)}{\Sigma_{i=1}^3 exp(o_i) }
y1^=Σi=13exp(oi)exp(o1),
y
2
^
=
e
x
p
(
o
2
)
Σ
i
=
1
3
e
x
p
(
o
i
)
\hat{y_2}=\frac{exp(o_2)}{\Sigma_{i=1}^3 exp(o_i) }
y2^=Σi=13exp(oi)exp(o2),
y
3
^
=
e
x
p
(
o
3
)
Σ
i
=
1
3
e
x
p
(
o
i
)
\hat{y_3}=\frac{exp(o_3)}{\Sigma_{i=1}^3 exp(o_i) }
y3^=Σi=13exp(oi)exp(o3)
交叉熵损失函数
对于分类模型,相同的预测结果可能对应不同的平方损失函数值,更适合分类模型的损失函数是交叉熵损失函数:
H
(
y
(
i
)
,
y
^
(
i
)
)
=
−
Σ
j
=
1
q
y
j
(
i
)
l
o
g
y
j
^
(
i
)
H(y^{(i)} ,{\hat{y}}^{(i)}) = -\Sigma_{j=1}^q y_j^{(i)} \mathrm{log} {\hat{y_j}}^{(i)}
H(y(i),y^(i))=−Σj=1qyj(i)logyj^(i)
其中
y
j
(
i
)
y_j^{(i)}
yj(i)的取值只能是0或1。
最小化交叉熵损失函数等价于最大化训练数据集所有标签类别的联合预测概率。
多层感知机
深度学习主要关注多层模型。多层感知机是含有至少一个隐藏层的由全连接层组成的神经网络,且每个隐藏层的输出通过激活函数进行变换。多层感知机的层数和各隐藏层中隐藏单元个数都是超参数。
激活函数
若每层都是线性映射,则多层等价于单层。全是线性变换会使得神经网络只能学习线性问题,因此引入非线性变换,对于隐藏层进行非线性变换,再作为下一个全连接层的输入,这种非线性函数称为激活函数。
有三种常用的激活函数:
ReLU函数
R
e
L
U
(
x
)
=
m
a
x
(
x
,
0
)
.
\mathrm{ReLU} (x) = \mathrm{max} (x,0).
ReLU(x)=max(x,0).
ReLU函数只保留正数元素,并将负数元素清零。
Sigmoid函数
s
i
g
m
o
i
d
(
x
)
=
1
1
+
e
x
p
(
−
x
)
\mathrm{sigmoid}(x)=\frac{1}{1+\mathrm{exp}(-x)}
sigmoid(x)=1+exp(−x)1
sigmoid函数可以将元素的值变换到0和1之间,依据链式法则,可以求出sigmoid函数的导数
s
i
g
m
o
i
d
′
(
x
)
=
s
i
g
m
o
i
d
(
x
)
(
1
−
s
i
g
m
o
i
d
(
x
)
)
\mathrm{sigmoid}^{'}(x)=\mathrm{sigmoid}(x)(1-\mathrm{sigmoid}(x))
sigmoid′(x)=sigmoid(x)(1−sigmoid(x))
当输入为0时,sigmoid函数的导数达到最大值0.25;当输入越偏离0时,sigmoid函数的导数越接近0。
tanh函数
t
a
n
h
(
x
)
=
1
−
e
x
p
(
−
2
x
)
1
+
e
x
p
(
−
2
x
)
\mathrm{tanh}(x)=\frac{1-\mathrm{exp}(-2x)}{1+\mathrm{exp}(-2x)}
tanh(x)=1+exp(−2x)1−exp(−2x)
tanh(双曲正切)函数可以将元素的值变换到-1和1之间。当输入接近0时,tanh函数接近线性变换。虽然该函数的形状和sigmoid函数的形状很像,但tanh函数在坐标系的原点上对称。依据链式法则,tanh函数的导数
t
a
n
h
′
(
x
)
=
1
−
t
a
n
h
2
(
x
)
.
\mathrm{tanh}^{'}(x)=1-\mathrm{tanh}^2(x).
tanh′(x)=1−tanh2(x).
当输入为0时,tanh函数的导数达到最大值1;当输入越偏离0时,tanh函数的导数越接近0。
ReLu函数是一个通用的激活函数,目前在大多数情况下使用。但是,ReLU函数只能在隐藏层中使用。
用于分类器时,sigmoid函数及其组合通常效果更好。由于梯度消失问题,有时要避免使用sigmoid和tanh函数。
在神经网络层数较多的时候,最好使用ReLu函数,ReLu函数比较简单计算量少,而sigmoid和tanh函数计算量大很多。
在选择激活函数的时候可以先选用ReLu函数如果效果不理想可以尝试其他激活函数。