深度学习 --- 梯度下降推导--交叉熵误差函数
线性回归
线性回归的推导可以看我的另一篇博客 深度学习–2.线性回归
线性回归就是在二元分类中找到一条合适的分界线,其中二元分类中其结果只能后两种并且互斥,其线性方程为
y ^ = W T x + b \hat{y} = W^Tx + b y^=WTx+b
但这不是最好的二元分类方程,因为我们想要得到的结果是0–1的概率,但是线性方程的结果定义域一般是实数集(R),所以我们的线性回归的输出变为
y
^
=
σ
(
W
T
x
+
b
)
\hat{y} = \sigma (W^Tx + b)
y^=σ(WTx+b)
z
=
W
T
x
+
b
z = W^Tx + b
z=WTx+b
σ
(
z
)
=
1
1
+
e
−
z
\sigma (z) = \frac{1}{1 + e^{-z}}
σ(z)=1+e−z1
σ
\sigma
σ函数的图像如下图所示,是一个x
∈
\in
∈R,而输出是一个(0,1)的开区间的概率,这就符合我们的二元分类的结果了
复合函数求导
假设
- 函数 μ = φ ( x ) \mu = \varphi(x) μ=φ(x)在 x 0 x_0 x0出有导数 μ ′ = φ ′ ( x 0 ) \mu '= \varphi'(x_0) μ′=φ′(x0)
- 函数
y
=
f
(
μ
)
y=f(\mu)
y=f(μ)在对应点
μ
0
=
φ
(
x
0
)
\mu_0 = \varphi(x_0)
μ0=φ(x0)也有导数
y
μ
′
=
f
′
(
μ
)
y_{\mu}' = f'(\mu)
yμ′=f′(μ),于是符合函数
y
=
f
(
φ
(
x
)
)
y=f(\varphi(x))
y=f(φ(x))在上述的点
x
0
x_0
x0也有导数,它等于
f
(
μ
)
f(\mu)
f(μ)的导数与
φ
\varphi
φ的导数的乘积:
[ f ( φ ( x 0 ) ) ] ′ = f μ ′ ( φ ( x 0 ) ) . φ ′ ( x 0 ) [f(\varphi(x_0))]' = f_{\mu}'(\varphi(x_0)) . \varphi'(x_0) [f(φ(x0))]′=fμ′(φ(x0)).φ′(x0)
更简洁的表示为
y x ′ = y μ ′ . μ x ′ y_{x}' = y_{\mu}' . \mu_{x}' yx′=yμ′.μx′
例题
y = l n ( s i n x ) y = ln( sinx) y=ln(sinx),求导数
设 y = l n ( u ) , u = s i n x y = ln(u), u = sinx y=ln(u),u=sinx,根据求导法则
y u ′ = ( l n ( u ) ) ′ = 1 u y'_{u} = (ln(u))' = \frac{1}{u} yu′=(ln(u))′=u1
u ′ = ( s i n ( x ) ) ′ = c o s ( x ) u' = (sin(x))' = cos(x) u′=(sin(x))′=cos(x)
y x ′ = 1 s i n ( x ) . ( s i n ( x ) ) ′ = c o s x s i n x = c t g x y_x' = \frac{1}{sin(x)} . (sin(x))' = \frac{cosx}{sinx} = ctgx yx′=sin(x)1.(sin(x))′=sinxcosx=ctgx
偏导数
有的函数不止有一个未知数,还可能有多个未知数,这个时候直接求导就有点困难,假设在三维空间里,x轴和y轴的变化共同决定z轴的变化,我先研究x方向的导数,那么函数在x方向的导数叫做这个函数在x轴的偏导数
求导原则是对一个变量求导,其他变量看作常数
例题
求
u
=
x
y
u = x^y
u=xy(x>0),偏导数
ϑ
u
ϑ
x
=
y
.
x
y
−
1
,
ϑ
u
ϑ
y
=
x
y
.
l
n
x
\frac{\vartheta u}{\vartheta x} = y.x^{y-1}, \frac{\vartheta u}{\vartheta y} = x^y.lnx
ϑxϑu=y.xy−1,ϑyϑu=xy.lnx
预测函数
可以理解为我们要训练的模型
我们知道在 logistic回归模型中的参数 W(权重) 和 b(偏差) 是很重要的,那我们就需要训练 logistic 回归模型来找到合适的参数 W 和 b,那就需要要给预测函数,我们给出如下定义
y
i
^
=
σ
(
W
T
x
i
+
b
)
\hat{y^i} = \sigma (W^Tx^i + b)
yi^=σ(WTxi+b), where
σ
(
z
)
=
1
1
+
e
−
z
\sigma (z) = \frac{1}{1 + e^{-z}}
σ(z)=1+e−z1
Given
{
(
x
(
1
)
,
y
(
1
)
)
,
.
.
.
.
,
(
x
(
m
)
,
y
(
m
)
)
}
\{ (x^{(1)}, y^{(1)}), .... , (x^{(m)}, y^{(m)})\}
{(x(1),y(1)),....,(x(m),y(m))} , want
y
(
i
)
^
≈
y
(
i
)
\hat{y^{(i)}} \approx y^{(i)}
y(i)^≈y(i)
我们来具体说明一下,为了让模型来通过学习调整参数,我们给出一个具有m个样本的训练集,来训练这个训练集的样本来得到预测值接近实际值。对于上面的公式,我们约定,上标i
表示第几个训练样本
损失函数 或者 误差函数
你可以定义你的损失函数为预测值和真实值差的平方后的二分之一,我们可以理解为对方差进行求导,公式如下
L
(
y
^
,
y
)
=
1
2
(
y
^
−
y
)
2
L(\hat{y}, y) = \frac{1}{2}(\hat{y} - y)^2
L(y^,y)=21(y^−y)2
但是在 logistic 回归中一般不怎么用,因为当当你学习这些参数的时候,在调优参数是很可能得到的是局部最优解,而不是全局最优解。我们定义损失函数的目的是来衡量预测输出
y
^
\hat{y}
y^ 和 y 的实际值有多接近,那么我们定义如下的损失函数,至于为什么这么定义何以参见该目录中 神经网络 中的 交叉熵 的讲解
L ( y ( i ) ^ , y ( i ) ) = − ( y ( i ) ln y ( i ) ^ − ( 1 − y ( i ) ) ln ( 1 − y ( i ) ^ ) ) L(\hat{y^{(i)}}, y^{(i)}) = -(y^{(i)}\ln\hat{y^{(i)}} - (1-y^{(i)})\ln(1-\hat{y^{(i)}})) L(y(i)^,y(i))=−(y(i)lny(i)^−(1−y(i))ln(1−y(i)^))
需要说明的是:损失函数
是对于一个样本的估计,接下来我们会定义 成本函数 J
, 它衡量的是全体训练样本上的表现
- 当 y = 1 的时候,如果 y ^ \hat{y} y^ 接近1的时候,那么损失L就接近于0 ,如果 y ^ \hat{y} y^ 接近0的时候,那么损失L就很大
- 当 y = 0 的时候,如果 y ^ \hat{y} y^ 接近1的时候,那么损失L就很大 ,如果 y ^ \hat{y} y^ 接近0的时候,那么损失L就接近于0
梯度下降推导
概念和公式定义
首先我们有如下公式定义
预测函数: y ( i ) ^ = σ ( W T x ( i ) + b ) \hat{y^{(i)}} = \sigma (W^Tx{(i)} + b) y(i)^=σ(WTx(i)+b)
激活函数:$ \sigma (z) = \frac{1}{1 + e^{-z}}$
损失函数: L ( y ( i ) ^ , y ( i ) ) = − ( y ( i ) ln y ( i ) ^ + ( 1 − y ( i ) ) ln ( 1 − y ( i ) ^ ) ) L(\hat{y^{(i)}}, y^{(i)}) = -(y^{(i)}\ln\hat{y^{(i)}} + (1-y^{(i)})\ln(1-\hat{y^{(i)}})) L(y(i)^,y(i))=−(y(i)lny(i)^+(1−y(i))ln(1−y(i)^))
成本函数: J ( w , b ) = 1 m ∑ i = 1 m L ( y ( i ) ^ , y ( i ) ) = − 1 m ∑ i = 1 m y ( i ) ln y ( i ) ^ + ( 1 − y ( i ) ) ln ( 1 − y ( i ) ^ ) J(w, b) = \frac{1}{m}\sum_{i=1}^{m}L(\hat{y^{(i)}}, y^{(i)}) = -\frac{1}{m}\sum_{i=1}^{m}y^{(i)}\ln\hat{y^{(i)}} + (1-y^{(i)})\ln(1-\hat{y^{(i)}}) J(w,b)=m1∑i=1mL(y(i)^,y(i))=−m1∑i=1my(i)lny(i)^+(1−y(i))ln(1−y(i)^)
损失函数衡量单个样本的效果,对每一个样本训练,都会输出一个
y
(
i
)
^
\hat{y^{(i)}}
y(i)^,把他和对应的真标签
y
(
i
)
y^{(i)}
y(i)进行比较。
成本函数衡量W 和 b 在总样本上的效果,要想得到小的衡量成本,那么就要得到合适的W 和 b 。我们看一下梯度下降在三维空间的效果
我们分别将 w 和 b 作为实数对待,成本函数 J(w,b) 是在水平轴 w 和 b 上的曲面,曲面的高度代表了 J(w, b)在某一点的值,我们要做的就是找到合适的 w 和 b ,使其对应的成本函数 J 值最小,可以看出这是一个凸函数,就像一个碗一样。
首先,我们用某一个值来初始化 w 和 b ,比如图中的红点,其实,对于logistic 回归而言,几乎是任意的初始化值都有效。梯度下降要做的就是从初始点开始,朝着最陡的下坡方向走一步,在梯度下降一步后,这就完成了一次梯度的迭代。然后在那里停下,看看四周,再选择一个最陡的方向走一步,如此反复,直到走到最低谷。
更新w 和b的方法为
w : = w − α ϑ J ( w , b ) ϑ w ; b : = b − α ϑ J ( w , b ) ϑ b w := w - \alpha \frac{\vartheta J(w, b)}{\vartheta w} ; b := b- \alpha \frac{\vartheta J(w, b)}{\vartheta b} w:=w−αϑwϑJ(w,b);b:=b−αϑbϑJ(w,b)
其中的$ \alpha $表示学习率,就是步进速度。我们约定dw表示 J 对 w 的导数,db 表示 J 对 b 的导数 那么更新可以写成
w : = w − α d w ; b : = b − α d b w := w - \alpha dw ; b := b- \alpha db w:=w−αdw;b:=b−αdb
我们为了刚能形象的说明梯度下降,我们在二维平面中来说明,途中可以看作w为参数,J(w)为结果的函数,我们要想得到J的最小值,就是dw为0的地方
在上面的曲线中,我们取到线上一点,做切线,可以看到,在曲线左边的切线的斜率是负的,那么改点导数也是负的,我们在这个点更新 w , 根据上面的公式, w : = w − α d w w := w - \alpha dw w:=w−αdw 因为dw为负,效果就是w加上了一个实数,其实我们期望改点对 w 的训练结果解释 w 增加,在曲线右侧也是相同,不过我们这个时候期望 w 减小,因为在右边导数为正
对 b 的分析 和上面对w的分析一样
梯度推导
对单个样本推导
对单个样本推导
我们现在只演示单个样本的推导,首先我们有如下公式定义
z = W T + b z = W^T + b z=WT+b
$\hat{y} = a = \sigma (z) $
$ \sigma (z) = \frac{1}{1 + e^{-z}}$
$ \sigma ’ (z) = \sigma (z)(1 - \sigma(z))$
L ( y ^ , y ) = − ( y ln y ^ + ( 1 − y ) ln ( 1 − y ^ ) ) L(\hat{y}, y) = -(y\ln\hat{y} + (1-y)\ln(1-\hat{y})) L(y^,y)=−(ylny^+(1−y)ln(1−y^))
现在我们假设一个样本与两个特征值,(x_1, x_2),那么也有两个权重(w_1, w_2)
我们要计算 L(a, y)对于w的偏导数,那么我们就应该从外到里分别结算导数(复合函数求导),首先计算 L 对 a的导数
d a = ϑ L ( a , y ) ϑ a = − y a + 1 − y 1 − a . . . . . . . . . ln ′ x = 1 x da = \frac{\vartheta L(a, y)}{\vartheta a} = -\frac{y}{a} + \frac{1-y}{1-a} ......... \ln 'x = \frac{1}{x} da=ϑaϑL(a,y)=−ay+1−a1−y.........ln′x=x1
然后我们对z求导
d z = ϑ L ( a , y ) ϑ a ∗ ϑ a ϑ z = a − y . . . . . . . . . σ ′ ( z ) = σ ( z ) ∗ ( 1 − σ ( z ) ) dz = \frac{\vartheta L(a,y)}{\vartheta a}* \frac{\vartheta a}{\vartheta z} = a - y ......... \sigma '(z) = \sigma (z)*(1- \sigma (z)) dz=ϑaϑL(a,y)∗ϑzϑa=a−y.........σ′(z)=σ(z)∗(1−σ(z))
求 L 对 w 和 b 的导数 ,j
表示第几个特征值
d
w
j
=
ϑ
L
(
a
,
y
)
ϑ
a
∗
ϑ
a
ϑ
z
∗
ϑ
z
ϑ
w
1
=
(
a
−
y
)
x
j
dw_j= \frac{\vartheta L(a,y)}{\vartheta a}* \frac{\vartheta a}{\vartheta z}*\frac{\vartheta z}{\vartheta w_1} = (a - y)x_j
dwj=ϑaϑL(a,y)∗ϑzϑa∗ϑw1ϑz=(a−y)xj
d
b
=
ϑ
L
(
a
,
y
)
ϑ
a
∗
ϑ
a
ϑ
z
∗
ϑ
z
ϑ
b
=
(
a
−
y
)
db= \frac{\vartheta L(a,y)}{\vartheta a}* \frac{\vartheta a}{\vartheta z}*\frac{\vartheta z}{\vartheta b} = (a - y)
db=ϑaϑL(a,y)∗ϑzϑa∗ϑbϑz=(a−y)
对w 和 b 更新
w 1 : = w 1 − α d w 1 w_1 := w_1 - \alpha dw_1 w1:=w1−αdw1
w 2 : = w 2 − α d w 2 w_2 := w_2 - \alpha dw_2 w2:=w2−αdw2
b : = b − α d b b := b- \alpha db b:=b−αdb
对 m 个样本推导
Logistic regression on m examples
先假设有 m 个样本, 一个样本有两个特征值
成本函数:
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
L
(
y
(
i
)
^
,
y
(
i
)
)
=
−
1
m
∑
i
=
1
m
y
(
i
)
ln
y
(
i
)
^
+
(
1
−
y
(
i
)
)
ln
(
1
−
y
(
i
)
^
)
J(w, b) = \frac{1}{m}\sum_{i=1}^{m}L(\hat{y^{(i)}}, y^{(i)}) = -\frac{1}{m}\sum_{i=1}^{m}y^{(i)}\ln\hat{y^{(i)}} + (1-y^{(i)})\ln(1-\hat{y^{(i)}})
J(w,b)=m1∑i=1mL(y(i)^,y(i))=−m1∑i=1my(i)lny(i)^+(1−y(i))ln(1−y(i)^)
成本函数就是一个梯度迭代后对每个训练点的误差总和平均数,我们把上面推导单个样本的方法和公式拿来用
ϑ
ϑ
w
1
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
ϑ
ϑ
w
1
L
(
a
(
i
)
,
y
(
i
)
)
\frac{\vartheta}{\vartheta w_1} J(w, b) = \frac{1}{m} \sum_{i=1}^{m}\frac{\vartheta }{\vartheta w_1}L(a^{(i)}, y^{(i)})
ϑw1ϑJ(w,b)=m1i=1∑mϑw1ϑL(a(i),y(i))
我们假设给$ J = 0 ; dw_1 = 0; dw_2 = 0; db=0$
for i = 1 to m 一次循环表示对一个点进行训练
→
z
(
i
)
=
w
T
x
(
i
)
+
b
\to z^{(i)} = w^Tx^{(i)} +b
→z(i)=wTx(i)+b
→ a ( i ) = σ ( z ( i ) ) \to a^{(i)} = \sigma (z^{(i)}) →a(i)=σ(z(i))
→ J + = − ( y ( i ) ln y ( i ) ^ + ( 1 − y ( i ) ) ln ( 1 − y ( i ) ^ ) ) \to J += -(y^{(i)}\ln\hat{y^{(i)}} + (1-y^{(i)})\ln(1-\hat{y^{(i)}})) →J+=−(y(i)lny(i)^+(1−y(i))ln(1−y(i)^))
→ d z ( i ) = a ( i ) − y ( i ) \to dz^{(i)} = a^{(i)} - y^{(i)} →dz(i)=a(i)−y(i)
→ d w 1 + = x 1 ( i ) ∗ d z ( i ) \to dw_1 += x_1^{(i)} * dz^{(i)} →dw1+=x1(i)∗dz(i)
→ d w 2 + = x 2 ( i ) ∗ d z ( i ) \to dw_2 += x_2^{(i)} * dz^{(i)} →dw2+=x2(i)∗dz(i)
→ d b + = d z ( i ) \to db += dz^{(i)} →db+=dz(i)
在对m个样本一个迭代的训练完毕后,对累加过的$ J ; dw_1 ; dw_2 ; db$ 求平均值 $ J /= m ; dw_1 /=m ; dw_2 /=m ; db /= m$ , 我们没有对$ dw_1 ; dw_2 $ 加上标 i
是因为这里我们是把$ dw_1 ; dw_2 $ 当作对样本一个循环的累加器,将一个循环中的每一个样本的w值相加后最后在一个循环完毕后做平均,因为
d
w
1
=
ϑ
J
ϑ
w
1
dw_1 = \frac{\vartheta J}{\vartheta w_1}
dw1=ϑw1ϑJ
对w 和 b 更新
$w_1 := w_1 - \alpha dw_1 $
$w_2 := w_2 - \alpha dw_2 $
$b := b- \alpha db $
梯度下降的算法调优
在使用梯度下降时,需要进行调优。哪些地方需要调优呢?
-
算法的步长选择。在前面的算法描述中,我提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。
-
算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。
-
归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的期望
-
x ‾ \overline{x} x 和标准差std(x),然后转化为:
x − x ‾ s t d ( x ) \frac{x-\overline{x}}{std(x)} std(x)x−x
这样特征的新期望为0,新方差为1,迭代次数可以大大加快。