机器学习笔记-day04

九、神经网络的学习(Neural Networks: Learning)

9.1 代价函数

\(L\)表示神经网络层数

\(s_l\)\(l\)层神经元数量(不包含偏置单元)

\(S_L\)代表输出层处理单元个数

二分类:1个输出单元,\(S_L = 1\quad(k = 1)\)

K分类:\(K\)个输出单元,\(S_L = K\quad(k\geq3)\)

逻辑回归问题中,代价函数为:

\(\displaystyle J(\theta) = -\frac{1}{m}\left[\sum^m_{i=1}y^{(i)}logh_\theta(x^{(i)})+(1-y^{(i)})log(1-h_\theta(x^{(i)}))\right] + \frac{\lambda}{2m}\sum^n_{j=1}\theta^2_j\)

只有一个输出变量,也只有一个因变量\(y\)。而在神将网络中,可以有很多输出变量。

\(h_\theta(x)\)是一个维度为K的向量,并且训练集中的因变量也是同样维度的一个向量,代价函数:

\(\displaystyle J(\Theta) = -\frac{1}{m}\left[\sum^m_{i=1}\sum^k_{k=1}y^{(i)}_klog(h_\Theta(x^{(i)}))_k + (1-y^{(i)}_k)log(1-(h_\Theta(x^{(i)}))_k)\right] + \frac{\lambda}{2m}\sum^{L-1}_{l=j}\sum^{s_l}_{i=1}\sum^{s_l+1}_{j=1}\left(\Theta^{(l)}_{ji} \right)^2\)

虽然复杂,但是背后思想还是一样的,都是通过代价函数来观察算法预测的结果与真是结果的误差有多大,不同的是,对于每一行特征,神经网络会有K个预测,去其中可能性最高的,与实际数据进行比较。

9.2 反向传播算法

反向传播算法,是为了计算偏导数的。

首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运算反向传播法计算出直至第二层的所有误差。求出误差\(\Delta^{(j)}_{ij}\)之后,就可以计算代价函数的偏导数了,计算方法如下:$D^{(l)}{ij} := \frac{1}{m}\Delta^{(j)} + \lambda\Theta^{(l)}{ij} \quad(if; j \ne 0)\ D^{(l)} := \frac{1}{m}\Delta^{(j)}_{ij} \quad(if; j = 0)\ $

9.3 反向传播算法的直观理解

没看懂~~~

9.4 实现注意:展开参数

矩阵和向量相互转换

矩阵转向量,\(v = A(:)\),通过\((:)\)的形式将矩阵转成向量

thetaVec = [Theta1(:), Theta2(:), Theta3(:)];
DVec = [D1(:), D2(:), D3(:)];

Theta1 = reshape(thetaVec(1:110), 10, 11);
Theta2 = reshape(thetaVec(111:220), 10, 11);
Theta3 = reshape(thetaVec(221:231), 1, 11);

9.5 梯度检验

反向传播算法比较复杂,容易bug。有bug的版本,表现正常,但是误差比没有bug的要高出一个量级。

梯度检验,求一点的斜率,它的近似值是\(\frac{J(\theta+\epsilon) - J(\theta-\epsilon)}{2\epsilon}\)

gradApprox = (J(theta + EPSILON) - J(theta - EPSILON)) / (2*EPSILON)

上面只考虑了\(\theta\)是实数的情况,若是向量,以\(\theta_1\)为例:

\(\frac{\partial}{\partial\theta_1}J(\theta) = \frac{J(\theta_1+\epsilon,\theta_2,...,\theta_n)-J(\theta_1-\epsilon,\theta_2,...,\theta_n)}{2\epsilon}\)

Ocatve代码如下:

for i = 1:n,
	thetaPlus = theta;
	thetaPlus(i) = thetaPlus(i) + EPSILON;
	thetaMinus = theta;
	thetaMinus(i) = thetaMinus(i) - EPSILON;
	gradApprox(i) = (J(thetaPlus) - J(thetaMinus)) / *(2*EPSILON);
end;

check:\(gradApprox \approx DVec\)

梯度检验的步骤:

1,通过反向传播,计算DVec

2,计算gradApprox

3,确保Dvec 和gradApprox相近

4,在实际训练的时候关掉梯度检验

​ 因为梯度检验的计算量非常大

9.6 随机初始化

若是都初始化为0,则各级的权重都是一样的。

随机初始化,解决对称问题。初始化值的范围应该是接近0的。

Theta1 = rand(10,11)*(2*INIT_EPSILON) - INIT_EPSILON;
Theta2 = rand(1,11) *(2*INIT_EPSILON) - INIT_EPSILON;

9.7 综合起来

隐藏层通常为1层。若为多层,隐藏层的元素个数应当是相同的。隐藏层数越多越好。

隐藏层与输入层的单元的数量要相近,隐藏层最多是输入层的3-4倍。

训练神经网络的步骤:

  • 随机初始化权重。
    • 通常初始化为很小的值,接近0
  • 通过前向传播,计算\(h_\Theta(x^{(i)})\)
  • 计算Cost Function\(J(\Theta)\)
  • 通过反向传播,计算\(\frac{\partial}{\partial\Theta^{(i)}_{jk}}J(\Theta)\)
  • 梯度检验,确保反向传播计算的\(\frac{\partial}{\partial\Theta^{(i)}_{jk}}J(\Theta) \approx J(\Theta)\),检验完毕,记得关闭。
  • 通过梯度下降或者优化的反向传播算法那最小化代价函数,得到\(\Theta\)

9.8 自动驾驶

十、应用机器学习的建议

10.1 决定下一步做什么

当你发现模型有很大误差时,怎么办?,以下面的代价函数为例:

\(J(\theta) = \frac{1}{2m}\left[\sum^m_{i=1}((h_\theta(x^{(i)}) - y^{(i)})^2 + \lambda\sum^m_{j=1}\theta^2_j) \right]\)

1,获取更多的数据

2,尝试选用更稍的特征,防止过拟合

3,或者使用更多的特征

4,增加多项式特征

5,尝试减小\(\lambda\)

6,尝试增大\(\lambda\)

10.2 评估一个假设

将数据分为两部分,一部分训练集,一部分为测试集,分割比例:7:3.

计算测试集的误差

1,线性回归:

\(J_{test}(\theta) = \frac{1}{2m_{test}}\sum^{m_{test}}_{i=1}\left(h_\theta(x^{(i)}_{test})-y^{(i)}_{test} \right)^2\)

2,逻辑回归:

$\displaystyle J_{test}(\theta) = -\frac{1}{m_{test}}\sum{m_{test}}_{i=1}y{test}log h\theta(x{(i)}_{test})+\left(1-y{test}\right)logh\theta(x^{(i)}_{test}) $

10.3 模型选择和交叉验证集

将数据分为三部分,一部分训练集,一部分为验证集,一部分为测试集,比例为6:2:2

通常我们会从多个等级的多项式中做选择。

先用训练集在得到\(\theta\)

然后通过验证集,进一步选择模型,取误差最小的

最后通过测试集进行验证。

这样的做法是充分利用了数据~

10.4 诊断偏差和方差

高偏差:欠拟合

高方差:过拟合

10.5 正则化和偏差/方差

正则化参数\(\lambda\)对于模型有很大的影响:

若过大,\(h_\theta(x) \approx x_0\)

若=0,则可能过拟合

\(\lambda\)最小时,训练集的误差最小,然而这时候可能是过拟合状态,所以验证集的误差很大。(绯红色曲线)

\(\lambda\)非常大的时候,偏差和方差都很大

10.6 学习曲线

欠拟合:

高偏差/欠拟合:无论训练集有多大,误差都不会有太大的改观。

高方差/过拟合:

过拟合的时候,增加训练数据,可以提高模型效果。

10.7 决定下一步做什么

  1. 获得更多的训练样本——解决高方差
  2. 尝试减少特征的数量——解决高方差
  3. 尝试获得更多的特征——解决高偏差
  4. 尝试增加多项式特征——解决高偏差
  5. 尝试减少正则化程度λ——解决高偏差
  6. 尝试增加正则化程度λ——解决高方差

神经网络的方差和偏差:

较小的神经网络,容易出现高偏差。

如果神经网络比较复杂,有多层隐藏层,则可能出现过拟合。而且计算量非常大。

通常选择较大的神经网络并采用正则化处理会比采用较小的神经网络效果要好。

对于神经网络中的隐藏层的层数的选择,通常从一层开始逐渐增加层数,为了更好地作选择,可以把数据分为训练集、交叉验证集和测试集,针对不同隐藏层层数的神经网络训练神经网络, 然后选择交叉验证集代价最小的神经网络。

posted on 2020-10-18 16:14  moket  阅读(90)  评论(0)    收藏  举报