线性回归中代价函数为:
J = 1 2 m ∑ i = 1 m ( h ( θ ) ( x ( i ) ) − y ( i ) ) 2 J = \dfrac {1} {2m}\sum_{i=1}^m(h_{(θ)}(x^{(i)})-y^{(i)})^2 J=2m1i=1∑m(h(θ)(x(i))−y(i))2
说明:m为training set(训练集)内数据个数
疑问:为什么是除以2m,不应该除以m吗?
因为这里无论除以2m还是m,代价函数最优化的结果θ都是相同的。利用梯度下降法对JJ求导,如果是2m,求导结果为:
∂ j ∂ θ i = 1 m ∑ i = 1 m ( h ( θ ) ( x ( i ) ) − y ( i ) ) ∂ h ( θ ) ( x ( i ) ) ∂ θ \dfrac{∂j}{∂θ_i}=\dfrac{1}{m}\sum_{i=1}^m(h_{(θ)}(x^{(i)})-y^{(i)})\dfrac{∂h_{(θ)}(x^{(i)})}{∂θ} ∂θi∂j=m1i=1∑m(h(θ)(x(i))−y(i))∂θ∂h(θ)(x(i))
这里正好除以m,便于计算。
梯度下降算法:用于找到代价函数的最小值。
Batch梯度下降算法(梯度下降算法中的一种):每一步下降都需要使用训练集全集。
也有其他梯度下降算法只需要使用到训练集子集的。
特征缩放法:确保不同的特征都处于一个相近的范围内,这样梯度下降法就会更快地收敛。
举个例子
假如假设函数为 h ( θ ) = θ 1 x 1 + θ 2 x 2 h(θ)=θ_1x_1+θ_2x_2 h(θ)=θ1x1+θ2x2, x 1 x_1 x1的取值范围是[1,2000],而 x 2 x_2 x2的取值范围是[1,5],这样子的代价函数如下图:
登高线都是很扁的椭圆,使用梯度下降的过程中会反复震荡,下降时间会十分漫长。
将每一个特征值进行特征收缩,及每一个特征值都除以特征值的取值范围。 x 1 = s i z e ( 0 − 2000 ) 2000 x_1=\dfrac{size(0-2000)}{2000} x1=2000size(0−2000) x 2 = n u m b e r o f b e d r o o m ( 1 − 5 ) 5 x_2=\dfrac{number of bedroom(1-5)}{5} x2=5numberofbedroom(1−5)确保 x 1 x_1 x1、 x 2 x_2 x2都在相近的取值范围中,这样子的代价函数图像图下:
变得比较圆了,使用梯度下降算法的速度也会十分快。
在特征缩放中,也可以使用均值归一的方法
x i = x i − u i s i x_i=\dfrac{x_i-u_i}{s_i} xi=sixi−ui其中 u i u_i ui为平均值, s i s_i si可以是标准差,
也可以是训练集中x的最大值减去最小值。
使用均值归一的方法可以使得特征值的平均值为0。
确保特征值在相近的范围即可以了,不需要保持他们的范围是一样的。如下图:
α取值过大,会导致代价函数J(θ)的值上下跳动或者越来越大。α取值过小,会导致梯度下降算法过慢。一般取α的值都是3倍递增地取。(…、0.001、0.03、0.1、0.3、1、3、10、…)
正规方程:用于找到代价函数J(θ)的最小值。
θ = ( X T X ) − 1 X T y θ=(X^TX)^{-1}X^Ty θ=(XTX)−1XTyOctave:pinv ( X ′ ∗ X ) ∗ X ′ ∗ y (X'*X)*X'*y (X′∗X)∗X′∗y
此处的θ就是最优值
说明,这种情况很少发生,就算 ( X T X ) (X^TX) (XTX)不可逆,使用Octave的pinv函数依然能够正常运算
发生 ( X T X ) (X^TX) (XTX)不可逆的情况有以下原因:
优点
缺点
优点
缺点
逻辑回归是一种分类算法,用于2元分类两种情况,也可以使用‘一对余’的思想来实现多元分类
sigmoid function、logistic function都是同一种函数,如下:
y = 1 1 + e − x y=\dfrac{1}{1+e^{-x}} y=1+e−x1
函数值范围在(0,1),图像如下:
h θ ( x ) = 1 1 + e − F θ ( x ) h_θ(x)=\dfrac{1}{1+e^{-F_θ(x)}} hθ(x)=1+e−Fθ(x)1
说明
训练样本太少,无法约束过多的变量,导致过度拟合,对于训练集中的样本预测代价为0或者接近于0,这种模型泛化到新样本中(泛化:一个假设模型应用到新样本的能力)。
代价函数:
J ( θ ) = 1 2 m [ ∑ i = 1 m ( h ( θ ) ( x ( i ) ) − y ( i ) ) 2 + λ ∑ i = 1 m θ i 2 ] J(θ) = \dfrac {1} {2m}[\sum_{i=1}^m(h_{(θ)}(x^{(i)})-y^{(i)})^2+λ\sum_{i=1}^mθ_i^2] J(θ)=2m1[i=1∑m(h(θ)(x(i))−y(i))2+λi=1∑mθi2]
其中, λ ∑ i = 1 m θ i 2 λ\sum_{i=1}^mθ_i^2 λ∑i=1mθi2为正则化项,λ为拟合参数,过大的λ会导致所有θ都很小。
则这样子的代价函数就有两个作用:
总的作用就是会使得相关性效地变量对应的θ值降低
优化有两种算法:
正规方程法:
θ = ( x T x + λ [ 0 0 0 0 0 1 0 0 0 0 . . . : 0 0 . . . 1 ] ) − 1 x T y θ=(x^Tx+λ \left[ \begin{matrix} 0 & 0 & 0 &0\\ 0 & 1 & 0 &0\\ 0 & 0 & ... & :\\ 0 & 0 & ...&1 \end{matrix} \right])^{-1}x^Ty θ=(xTx+λ⎣⎢⎢⎡0000010000......00:1⎦⎥⎥⎤)−1xTy
说明:
梯度验证是一个用于验证代码是否有误的方法,一般用用于验证反向传播中的算法代码是否书写正确。
∂ J ( θ ) ∂ ( θ 1 ) ≈ J ( θ 1 + ε , θ 2 , . . . , θ n ) − J ( θ 1 − ε , θ 2 , . . . , θ n ) 2 ∗ ε \dfrac{∂J(θ)}{∂(θ_1)}≈\dfrac{J(θ_1+ε,θ_2,...,θ_n)-J(θ_1-ε,θ_2,...,θ_n)}{2*ε} ∂(θ1)∂J(θ)≈2∗εJ(θ1+ε,θ2,...,θn)−J(θ1−ε,θ2,...,θn)
∂ J ( θ ) ∂ ( θ 2 ) ≈ J ( θ 1 , θ 2 + ε , . . . , θ n ) − J ( θ 1 , θ 2 − ε , . . . , θ n ) 2 ∗ ε \dfrac{∂J(θ)}{∂(θ_2)}≈\dfrac{J(θ_1,θ_2+ε,...,θ_n)-J(θ_1,θ_2-ε,...,θ_n)}{2*ε} ∂(θ2)∂J(θ)≈2∗εJ(θ1,θ2+ε,...,θn)−J(θ1,θ2−ε,...,θn)
∂ J ( θ ) ∂ ( θ n ) ≈ J ( θ 1 , θ 2 , . . . , θ n + ε ) − J ( θ 1 , θ 2 , . . . , θ n − ε ) 2 ∗ ε \dfrac{∂J(θ)}{∂(θ_n)}≈\dfrac{J(θ_1,θ_2,...,θ_n+ε)-J(θ_1,θ_2,...,θ_n-ε)}{2*ε} ∂(θn)∂J(θ)≈2∗εJ(θ1,θ2,...,θn+ε)−J(θ1,θ2,...,θn−ε)
其中ε一般取 1 0 − 4 10^{-4} 10−4,如果上面的约等式子成立,说明代码没有错误。
注意,在真正训练神经网络模型的时候,记得要关闭梯度验证,因为梯度验证运行速度很慢。
在非神经网络算法中,如果权重的初始值都选为0,对结果没有影响,但是在圣经网络算法中,如果权重的初始值都选为0,则会造成特征的高度冗余。
所以初始化权重的时候,都调用
θ n = r a n d ( n , m ) ∗ 2 ε − ε θ^n=rand(n,m)*2ε-ε θn=rand(n,m)∗2ε−ε来确保每一个θ的初始化值在[-ε,ε)。
只有一个隐藏层的是最常用的,多个隐藏层的时候,每一层的单元个数最好都要相等。同时,每一层的单元个数越多越好,但是计算量会越来越大。
发现训练的假设模型不理想的时候,通常是有两种原因造成的:
通常,会将全部样本随机分成训练集、验证集(交叉验证集)、测试集,它们的比例分别是3:1:1。
训练误差、验证误差、测试误差的计算公式都是:
J ( θ ) = 1 2 m ∑ i = 1 m ( h θ ( x i ) − y i ) J(θ)=\dfrac{1}{2m}\sum_{i=1}^m(h_θ(x_i)-y_i) J(θ)=2m1i=1∑m(hθ(xi)−yi)
这些集合的作用:
高偏差:训练误差大、验证误差大
例子:用一个一次函数去拟合具有二次函数特性的样本
高方差:训练误差几乎为0,然而验证误差大
例子:用一个100次函数去拟合具有二次函数特性的样本
高方差:
高偏差:
什么是偏斜类?
假如在逻辑回归问题中,y=1占了99.5%,y=0占了0.5%,这种事件为偏斜类。
在偏斜类中,如果使用普通的验证误差来判断算法的好坏,容易被算法欺骗。因为在上面例子中,假设算法永恒输出都是y=1,则准确率已经到达了99.5%了,但是显然永恒输出y=1这个算法是很不合理的,这是我们就是被算法欺骗了。那在偏斜类的问题中,就不能使用验证误差来判断算法好坏。需要使用查准率、召回率来判断算法的好坏。
实际值1 | 实际值0 | |
---|---|---|
预测值1 | true positive | false positive |
预测值0 | false negative | true negative |
查准率: P = t r u e p o s t i v e t r u e p o s t i v e + f a l s e p o s t i v e P=\dfrac{truepostive}{truepostive+falsepostive} P=truepostive+falsepostivetruepostive
召回率: R = t r u e p o s t i v e t r u e p o s t i v e + f a l s e n e g a t i v e R=\dfrac{truepostive}{truepostive+falsenegative} R=truepostive+falsenegativetruepostive
查准率:预测正确中,实际为正确的比率
召回率:实际正确中,预测为正确的比率
F 1 = 2 B P B + P F_1=\dfrac{2BP}{B+P} F1=B+P2BP
那在偏斜类的问题中,就不能使用验证误差来判断算法好坏。需要使用F1判断算法的好坏,F1越高,说明该算法越好。同时,在逻辑回归问题中,使用F1来自动获取判定分界。(一般情况下,判断边界都为0.5)
(别问我为什么不继续更,因为我懒)