线性神经网络
1. 线性回归 Linear Regression
回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。 在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。
线性回归是指:目标可以表示为特征的加权和,即 y = w 1 x 1 + w 2 x 2 + b y = w_1 x_1 + w_2 x_2 + b y=w1x1+w2x2+b 。其中 w 1 , w 2 w_1 , w_2 w1,w2 称为权重(weight), b b b 称为偏置(bias)。
给定一个数据集,我们的目标是寻找模型的权重 w w w和偏置项 b b b,使得模型做出的预测更加贴近于真实值(误差尽可能小)。
在机器学习领域,我们通常使用的是高维数据集。当输入包含 d d d个特征时,我们将预测结果 y ^ \widehat{y} y 表示为: y ^ = w 1 x 1 + w 2 x 2 + . . . + w d x d + b = X w + b \widehat{y} = w_1 x_1 + w_2 x_2 + ... + w_dx_d + b = \pmb{Xw} + b y =w1x1+w2x2+...+wdxd+b=XwXw+b
我们用 损失函数(loss function)来量化目标的预测值与真实值之间的差距。我们经常用平方误差函数来作为损失函数,当样本
i
i
i的预测值为
y
^
(
i
)
\widehat{y}^{(i)}
y
(i) ,相应的真实标签为
y
(
i
)
y^{(i)}
y(i) 时,平方误差可以定义为:
l
(
i
)
(
w
,
b
)
=
1
2
(
y
^
(
i
)
−
y
(
i
)
)
2
l^{(i)}(w,b)=\frac{1}{2}(\widehat{y}^{(i)} - y^{(i)})^2
l(i)(w,b)=21(y
(i)−y(i))2
为了度量模型在整个数据集上的质量,我们需要计算在训练集
n
n
n个样本上的损失均值:
L
(
w
,
b
)
=
1
n
∑
i
=
1
n
1
2
(
y
^
(
i
)
−
y
(
i
)
)
2
L(w,b) = \frac{1}{n} \sum\limits^n_{i=1} \frac{1}{2}(\widehat{y}^{(i)} - y^{(i)})^2
L(w,b)=n1i=1∑n21(y
(i)−y(i))2
在训练模型时,我们希望找到一组参数
(
w
∗
,
b
∗
)
(w^*,b^*)
(w∗,b∗) ,这组参数能够最小化所有训练样本上的总损失,即
w
∗
,
b
∗
=
a
r
g
min
w
,
b
L
(
w
,
b
)
w^*, b^* = arg \min\limits_{w,b} L(w,b)
w∗,b∗=argw,bminL(w,b) 。求解方法:梯度下降法。
2. 梯度下降法 Gradient Descent
梯度下降法的基本思想可以类比为一个下山的过程,需要从山上下来,找到山的最低点。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭(梯度)的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;同理上山也是如此,只是这时候就变成梯度上升算法了。
计算公式可以表示为:
其中,
▽
L
(
θ
)
\triangledown L(\theta)
▽L(θ) 表示梯度,
η
\eta
η 为学习率或步长,用来控制每一步走的距离。梯度前面加一个负号,意味着朝着梯度相反的方向前进,即朝着下降最快的方向走。
其他常见的梯度下降算法:
- 小批量随机梯度下降(Mini Batch Gradient Descent):在每次梯度下降的过程中,只选取一部分的样本数据进行计算梯度,比如整体样本1/100的数据。在数据量较大的项目中,可以明显地减少梯度计算的时间。
- 随机梯度下降(Stochastic Gradient Descent):随机梯度下降算法只随机抽取一个样本进行梯度计算,由于每次梯度下降迭代只计算一个样本的梯度,因此运算时间比小批量样本梯度下降算法还要少很多,但由于训练的数据量太小(只有一个),因此下降路径很容易受到训练数据自身噪音的影响,看起来就像醉汉走路一样,变得歪歪斜斜的。
3. Logistic回归
简单来说, 逻辑回归(Logistic Regression)是一种用于解决二分类(0 or 1)问题的机器学习方法,用于估计某种事物的可能性。比如某用户购买某商品的可能性,某病人患有某种疾病的可能性,以及某广告被用户点击的可能性等。 注意,这里用的是“可能性”,而非数学上的“概率”,logisitc回归的结果并非数学定义中的概率值,不可以直接当做概率值来用。该结果往往用于和其他特征值加权求和,而非直接相乘。
那么逻辑回归与线性回归是什么关系呢?
逻辑回归(Logistic Regression)与线性回归(Linear Regression)都是一种广义线性模型(generalized linear model)。逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布。 因此与线性回归有很多相同之处,去除Sigmoid映射函数的话,逻辑回归算法就是一个线性回归。可以说,逻辑回归通过Sigmoid函数引入了非线性因素,将线性回归中的预测值转换为了概率,因此可以轻松处理0/1分类问题。
假设函数 Hypothesis function
首先先介绍一下sigmoid函数,sigmoid函数的公式为:
g
(
z
)
=
1
1
+
e
−
z
g(z) = \frac{1}{1+e^{-z}}
g(z)=1+e−z1
其函数图像如下:
从上图可以看到sigmoid函数是一个s形的曲线,它的取值在[0, 1]之间,在远离0的地方函数的值会很快接近0或者1。它的这个特性对于解决二分类问题十分重要。
逻辑回归的假设函数形式如下:
h
θ
(
x
)
=
g
(
θ
T
x
)
=
1
1
+
e
−
θ
T
x
h_{\theta}(x) = g(\theta^Tx) = \frac{1}{1 + e^{-\theta ^Tx}}
hθ(x)=g(θTx)=1+e−θTx1
其中,
x
x
x 是我们的输入,
θ
\theta
θ 是我们要求的参数,
g
(
⋅
)
g(\cdot)
g(⋅) 称为激活函数。
一个机器学习的模型,实际上是把决策函数限定在某一组条件下,这组限定条件就决定了模型的假设空间。而逻辑回归模型所做的假设是:
P
(
y
=
1
∣
x
;
θ
)
=
g
(
θ
T
x
)
=
1
1
+
e
−
θ
T
x
P(y=1 | x;\theta) = g(\theta^Tx) = \frac{1}{1 + e^{-\theta ^Tx}}
P(y=1∣x;θ)=g(θTx)=1+e−θTx1
这个函数的意思是在给定
x
x
x 和
θ
\theta
θ 的条件下
y
=
1
y=1
y=1 的概率。与之对应的决策函数为
y
∗
=
1
,
i
f
P
(
y
=
1
∣
x
)
>
0.5
y^*=1 , if P(y=1|x)>0.5
y∗=1,ifP(y=1∣x)>0.5 。选择0.5作为阈值是一个一般的做法,实际应用时特定的情况可以选择不同阈值,如果对正例的判别准确性要求高,可以选择阈值大一些,对正例的召回要求高,则可以选择阈值小一些。
决策边界
决策边界,也称为决策面,是用于在N维空间,将不同类别样本分开的平面或曲面。
线性决策边界 | 非线性决策边界 |
---|---|
决策边界其实就是一个方程,在逻辑回归中,决策边界由
θ
T
x
=
0
\theta ^Tx=0
θTx=0 定义。
损失函数
训练参数的过程其实就是不断改变 θ \theta θ,从而使损失函数 L ( θ ) L(\theta) L(θ) 的值更小的过程,即 θ = a r g min θ L ( θ ) \theta = arg\min\limits_\theta L(\theta) θ=argθminL(θ) 。
- 在线性回归中,常用均方误差(Mean squared error, MSE)作为损失函数。(m为样本数量) L ( θ ) = 1 2 m ∑ i = 1 m ( y ^ ( i ) − y ( i ) ) 2 L(\theta) = \frac{1}{2m} \sum\limits^m_{i=1} (\widehat{y}^{(i)} - y^{(i)})^2 L(θ)=2m1i=1∑m(y (i)−y(i))2
- 在逻辑回归中,常采用交叉熵(Cross Entropy)作为损失函数。(n表示分类问题中的n种类别)
L ( θ ) = − ∑ i = 1 n y i l o g ( y ^ i ) L(\theta) = - \sum\limits^n_{i=1} y_ilog(\widehat{y}_i) L(θ)=−i=1∑nyilog(y i)熵:熵是服从某一特定概率分布事件的理论最小平均编码长度(即所有信息量的期望)。不同的人对熵有不同的解释:混乱程度,不确定性,惊奇程度,不可预测性,信息量等等。
对于离散变量 i 的概率分布p(i),熵的计算公式可以表示为:
H ( p ( i ) ) = − ∑ i n p ( x i ) l o g 2 p ( x i ) H(p(i)) = - \sum\limits^n_i p(x_i)log_2p(x_i) H(p(i))=−i∑np(xi)log2p(xi) 其中,n表示事件的所有可能性。
对于二分类问题,熵的计算公式可以简化为:
H ( p ( i ) ) = − p ( x ) l o g 2 p ( x ) − ( 1 − p ( x ) ) l o g 2 ( 1 − p ( x ) ) H(p(i)) = -p(x)log_2p(x) - (1-p(x))log_2(1-p(x)) H(p(i))=−p(x)log2p(x)−(1−p(x))log2(1−p(x))
对于连续变量 x 的概率分布P(x),熵的公式可以表示为:
H ( p ( x ) ) = − ∫ p ( x ) l o g 2 p ( x ) d x H(p(x)) = - \int p(x)log_2p(x)dx H(p(x))=−∫p(x)log2p(x)dx
因此,只要我们知道了任何事件的概率分布,我们就可以计算它的熵;那如果我们不知道事件的概率分布,又想计算熵,该怎么做呢?那我们来对熵做一个估计吧,熵的估计的过程自然而然的引出了交叉熵。
相对熵(KL散度):在概率和统计中,我们通常会用更简单的近似分布来代替观察到的数据或复杂的分布。KL散度帮助我们衡量在选择近似分布时损失了多少信息。我们用P来表示样本的真实分布,Q来表示模型所预测的分布,那么KL散度的计算公式为:
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) q ( x i ) ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) D_{KL}(p||q) = \sum\limits^n_{i=1} p(x_i)log(\frac{p(x_i)}{q(x_i)}) \\ = \sum\limits^n_{i=1} p(x_i)log(p(x_i)) - \sum\limits^n_{i=1} p(x_i)log(q(x_i)) DKL(p∣∣q)=i=1∑np(xi)log(q(xi)p(xi))=i=1∑np(xi)log(p(xi))−i=1∑np(xi)log(q(xi)) 其中,n表示事件的所有可能性。 D K L D_{KL} DKL 的值越小,表示q的分布和p的分布越接近。
交叉熵:我们将KL散度的计算公式进行变形:
D K L ( p ∣ ∣ q ) = ∑ i = 1 n p ( x i ) l o g ( p ( x i ) ) − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) = − H ( p ( x ) ) − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) D_{KL}(p||q) = \sum\limits^n_{i=1} p(x_i)log(p(x_i)) - \sum\limits^n_{i=1} p(x_i)log(q(x_i)) \\ = -H(p(x)) - \sum\limits^n_{i=1} p(x_i)log(q(x_i)) DKL(p∣∣q)=i=1∑np(xi)log(p(xi))−i=1∑np(xi)log(q(xi))=−H(p(x))−i=1∑np(xi)log(q(xi))
在这个式子中,后一部分 − ∑ i = 1 n p ( x i ) l o g ( q ( x i ) ) - \sum\limits^n_{i=1} p(x_i)log(q(x_i)) −i=1∑np(xi)log(q(xi)) 就是交叉熵。
在机器学习中,我们需要评估label和predicts之间的差距,使用KL散度刚刚好,即,由于KL散度中的前一部分不变,故在优化过程中,只需要关注交叉熵就可以了。所以一般在机器学习中直接用用交叉熵做loss,评估模型。
4. Softmax回归
Softmax回归(softmax regression)其实是logistic回归的一般形式,logistic回归用于二分类,而softmax回归用于多分类。
对于输入数据
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
.
.
.
,
(
x
m
,
y
m
)
}
\{(x_1,y_1), (x_2,y_2),...,(x_m,y_m) \}
{(x1,y1),(x2,y2),...,(xm,ym)} 有
k
k
k 个类别,即
y
i
∈
{
1
,
2
,
.
.
.
,
k
}
y_i \in \{1,2,...,k\}
yi∈{1,2,...,k} ,那么 softmax回归主要估算输入数据
x
i
x_i
xi 归属于哪一类。
假设函数 Hypothesis function
为了估计所有可能类别的条件概率,我们需要一个有多个输出的模型,每个输出对应属于某一类别的概率。在下面的例子中,该样本具有4个特征
(
x
1
,
x
2
,
x
3
,
x
4
)
(x_1, x_2, x_3, x_4)
(x1,x2,x3,x4) ,对应3个可能的输出类别(猫、狗、鸡),计算该样本属于每一类别的为规范化的预测
o
1
,
o
2
,
o
3
o_1, o_2, o_3
o1,o2,o3 。
o 1 = x 1 w 11 + x 2 w 12 + x 3 w 13 + x 4 w 14 + b 1 = θ 1 T x 1 o 2 = x 1 w 21 + x 2 w 22 + x 3 w 23 + x 4 w 24 + b 2 = θ 2 T x 2 o 3 = x 1 w 31 + x 2 w 32 + x 3 w 33 + x 4 w 34 + b 3 = θ 3 T x 3 o_1 = x_1w_{11} + x_2w_{12} + x_3w_{13} + x_4w_{14} + b_1 = \theta^T_1 x_1 \\ o_2 = x_1w_{21} + x_2w_{22} + x_3w_{23} + x_4w_{24} + b_2 = \theta^T_2 x_2 \\ o_3 = x_1w_{31} + x_2w_{32} + x_3w_{33} + x_4w_{34} + b_3 = \theta^T_3 x_3 o1=x1w11+x2w12+x3w13+x4w14+b1=θ1Tx1o2=x1w21+x2w22+x3w23+x4w24+b2=θ2Tx2o3=x1w31+x2w32+x3w33+x4w34+b3=θ3Tx3
而 softmax函数的作用就是:将多个神经元的输出(比如 o 1 , o 2 , o 3 o_1, o_2, o_3 o1,o2,o3)映射到 (0,1) 区间内,且和为1,可以理解为属于某一类别的概率,从而来进行多分类。
softmax回归将输入数据
x
i
x_i
xi 归属于类别
j
j
j 的概率为:
y
^
(
j
)
=
P
(
y
i
=
j
∣
x
i
;
θ
)
=
e
o
j
∑
l
=
1
k
e
o
l
=
e
θ
j
T
x
i
∑
l
=
1
k
e
θ
l
T
x
i
\widehat{y}^{(j)} = P(y_i = j | x_i;\theta) = \frac{e^{o_j}}{\sum\limits^k_{l=1}e^{o_l}} = \frac{e^{\theta^T_j x_i}}{\sum\limits^k_{l=1}e^{\theta^T_l x_i}}
y
(j)=P(yi=j∣xi;θ)=l=1∑keoleoj=l=1∑keθlTxieθjTxi
损失函数
softmax函数给出了一个向量
y
^
\widehat{y}
y
,我们可以将其视为“对给定任意输入的
x
x
x属于每个类的条件概率”。对于Softmax回归,我们仍采用交叉熵(Cross Entropy)作为损失函数。当样本
i
i
i的预测值为
y
^
(
i
)
\widehat{y}^{(i)}
y
(i) ,相应的真实标签为
y
(
i
)
y^{(i)}
y(i) 时,交叉熵损失可以定义为:
l
(
i
)
(
y
,
y
^
)
=
−
∑
j
=
1
k
y
j
l
o
g
y
^
j
l^{(i)}(y, \widehat{y}) = -\sum\limits^k_{j=1} y_j log\widehat{y}_j
l(i)(y,y
)=−j=1∑kyjlogy
j其中,
y
y
y 是一个长度为
q
q
q 的独热编码(只有1位是1,其余的位都是0),所以在这个损失函数中,除了一个项以外的其余项
j
j
j都消失了。 相当于是只取出来
y
^
\widehat{y}
y
中真实类别对应的概率值来作
l
o
g
log
log 。
独热编码(One-Hot Encoding):又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效。
可以这样理解,对于每一个特征,如果它有m个可能值,那么经过独热编码后,就变成了m个二元特征(如成绩这个特征有好,中,差变成 one-hot就是100, 010, 001)。并且,这些特征互斥,每次只有一个激活。
为了度量模型在整个数据集上的质量,我们需要计算在训练集
n
n
n个样本上的损失均值:
L
(
θ
)
=
−
1
n
[
∑
i
=
1
n
∑
j
=
1
k
1
{
y
i
=
j
}
l
o
g
e
θ
j
T
x
i
∑
l
=
1
k
e
θ
l
T
x
i
]
L(\theta) = -\frac{1}{n} \begin{bmatrix} \sum\limits^n_{i=1} \sum\limits^k_{j=1} 1\{y_i=j\}log\frac{e^{\theta^T_j x_i}}{\sum\limits^k_{l=1}e^{\theta^T_l x_i}} \end{bmatrix}
L(θ)=−n1[i=1∑nj=1∑k1{yi=j}logl=1∑keθlTxieθjTxi]其中,
1
{
⋅
}
1\{\cdot\}
1{⋅} 为示性函数,即 1{值为真的表达式}=1
,1{值为假的表达式}=0
。
利用梯度下降法来最小化代价函数,下面求解
θ
\theta
θ 的梯度:
正则化
当训练数据不够多的时候,容易出现过拟合现象(原因),拟合系数往往非常大,为此在损失函数后面加上一个正则项,即:
L
(
θ
)
=
−
1
n
[
∑
i
=
1
n
∑
j
=
1
k
1
{
y
i
=
j
}
l
o
g
e
θ
j
T
x
i
∑
l
=
1
k
e
θ
l
T
x
i
]
+
λ
∑
i
=
1
k
∑
j
=
1
n
θ
i
j
2
L(\theta) = -\frac{1}{n} \begin{bmatrix} \sum\limits^n_{i=1} \sum\limits^k_{j=1} 1\{y_i=j\}log\frac{e^{\theta^T_j x_i}}{\sum\limits^k_{l=1}e^{\theta^T_l x_i}} \end{bmatrix} + \lambda \sum\limits^k_{i=1} \sum\limits^n_{j=1} \theta^2_{ij}
L(θ)=−n1[i=1∑nj=1∑k1{yi=j}logl=1∑keθlTxieθjTxi]+λi=1∑kj=1∑nθij2
这里还不太明白,弄明白了再继续补充。
本文的代码可在 我的 github 中进行查看。
参考
[1] 李沐-动手学深度学习
[2] 李宏毅-机器学习课程
[3] 梯度下降法原理讲解——机器学习
[4] 逻辑回归(Logistic Regression)(一)
[5] 一文搞懂交叉熵在机器学习中的使用,透彻理解交叉熵背后的直觉
[6] softmax回归原理与实现
[7] 线性回归正则化 regularized linear regression