其实机器学习项目,我们可以看成是一个找函数的过程,我们向函数输入一些数据,函数返回给我们一个结果.
这里的调整,涉及到模型构建,定义loss很多,后面单独做分析。
从机器学习算法项目开发步骤来说,我们会先基于数据,找到构建一个稍微简单的模型,先从简单的模型入手,通过loss判断这个模型的好坏,去进行下一步模型的优化,改变。
这里有一个函数
过去历史的喜欢人数数据,现在我们要通过这个数据,通过这个函数来产出(预测)未来的喜欢人数数值。
我们先简单构造一个函数
y = b + w x 1 y=b+wx_1 y=b+wx1
建设我们的模型参数 w w w=0.5k, b b b=1,k表示一个未知数,函数就为:
y = 0.5 k + 1 x 1 y=0.5k+1x_1 y=0.5k+1x1
现在求训练loss:
我们训练集是2017/01/01 - 2020/12/31的数据。
用这个数据集 x x x训练出的模型( f ( ) f() f()函数),再将这些数据集 x x x加入到这个函数中 f ( ) f() f(),产生的 y ^ \hat y y^与实际的 y y y,进行差值,也叫loss。
最后将每个时间点数据的loss按照不同的计算方式结合起来:
优化的目的就是让我们的 L L L(损失函数)值最小。可以看成这个猴子在找这条曲线的最低点。
简单解释一下这个公式:
w 1 ← w 0 − η ∂ L ∂ w ∣ w = w 0 w^1\leftarrow w^0-\eta\frac{\partial L}{\partial w}|_{w=w^0} w1←w0−η∂w∂L∣w=w0
其实跟我们速度公式类似:
v 1 = v 0 − a t v_1=v_0-at v1=v0−at
η \eta η就是速度的t, a a a就是 ∂ L ∂ w \frac{\partial L}{\partial w} ∂w∂L
最后模型优化后的loss过小,或者过大,之后我们应该怎么样处理呢,这就是下文需要介绍的内容。
下次我们将讨论如何根据loss完善我们的模型,实现一个好的模型。
一般是通过模型输出的物理意义、实际所需要的精度、自己期望的精度来衡量,没有具体的标准。不同的模型选择的loss函数也不同。
model bias(模型偏差)问题
optimize issue(优化)问题
如何判断train loss问题是model bias还是optimize issue:
这里就要用从train训练集中分离出一部分数据集为Valid验证集来判断
方法:构建一个简单的model(linear model)做看下loss,再构建一个深的model(比如神经网络)
策略:通过二个模型判断是不是mode bias,构造不同模型复杂度的模型来对比training error
1.如果当前的模型error比更复杂度的模型error对比是更小的,就说明是optimization issue
2.如果当前的模型error比更复杂度的模型error对比是更大的,就说明是model bias
model bias问题,很好解决,要么是降低模型复杂度,要么如下增加模型复杂度。
如上图所示从模型复杂度浅的模型开始,训练,对比loss
在神经网络中,理论上层越深loss越低,但是在上图中5 layer loss增大了。
这种问题就是:Optimization优化失败,简单说,就是Optimization梯度下降走到了临界点(梯度为0的critical point)。这个点一共有二种情况:
我们可以看成是一个美女在山里寻找山的最低点,美女从当前的临界点(critical point)开始,往她周围的每个方向都走一点点。
计算高度的公式如下:
L ( θ ) = L ( θ 1 ) + ( θ − θ 1 ) T g + 1 2 ( θ − θ 1 ) H ( θ − θ 1 ) L(\theta)=L(\theta^1)+(\theta-\theta^1)^Tg+\frac{1}{2}(\theta-\theta^1)H(\theta-\theta^1) L(θ)=L(θ1)+(θ−θ1)Tg+21(θ−θ1)H(θ−θ1)
学过速度位移的公式的可以把这个公式看成这个:
x 1 = x 0 + v 0 t + 1 2 a t 2 x_1=x_0+v_0t+\frac{1}{2}at^2 x1=x0+v0t+21at2
当前高度 x 0 x_0 x0加上移动后的垂直距离得到 x 1 x_1 x1
其中
g = ∂ L ( θ ) ∂ θ g=\frac{\partial L(\theta)}{\partial \theta} g=∂θ∂L(θ)可以看成速度里 ∂ x ∂ t \frac{\partial x}{\partial t} ∂t∂x,也就是 v v v速度
H = ∂ 2 ∂ 2 θ 2 L ( θ ) H=\frac{\partial^2}{\partial^2 \theta^2}L(\theta) H=∂2θ2∂2L(θ),可以看成速度里加速度求导公式:
v = d x d t v=\frac{dx}{dt} v=dtdx
a = d v d t a=\frac{dv}{dt} a=dtdv
a = d ( d x d t ) d t = d d t ∗ d x d t = d d t ∗ d d t ∗ x a=\frac{d(\frac{dx}{dt})}{dt}=\frac{d}{dt}*\frac{dx}{dt}=\frac{d}{dt}*\frac{d}{dt}*x a=dtd(dtdx)=dtd∗dtdx=dtd∗dtd∗x
g就表示当前的速度v,H就表示的加速度
由于我们求的是美女爬山的t1到t2的,这个时间间隔很小,因此可以忽略:
实际就只需要判断 1 2 ( θ − θ 1 ) H ( θ − θ 1 ) \frac{1}{2}(\theta-\theta^1)H(\theta-\theta^1) 21(θ−θ1)H(θ−θ1)大小就行。
Batch
假设训练集L有N个数据,我们把数据集拆分成数量相同的几份batch,其梯度下降计算方式如下:
batch大小的选取对模型的计算速度和loss也是有很大影响的,如图所示:
这里就直接给出一个结论了:
小的Batch v.s. 大的Batch
批量大小是一个必须确定的超参数.
Small | Large | |
---|---|---|
一次更新的速度(无并行) | 快 | 慢 |
一次更新的速度(并行) | 相同 | 相同 |
一次迭代的时间 | 慢 | 快 |
梯度 | 不稳定 | 稳定 |
优化 | 更好 | 更遭 |
泛化情况 | 更好 | 更糟 |
Momentum
Momentum的作用是保证美女只会在山里往下走,而不会往上走的。
这里这二张图片分别展示了没有使用Momentum与使用Momentum的效果,相信这二张图,应该大家就能看明白了
无Momentum
有Momentum
在模型训练中,数据集的划分也很重要涉及的内容:
数据集划分
解决了训练集的问题,就可以把测试集的数据放入到模型中判断模型的效果了,同样的测试集loss过大过小,也是没有固定的标准的。
overfitting问题:
一个男的把所有精力都花在研究一个星座的女生了,最后分手了,他去认识一个其他星座的女生,就拿捏不了。
解决overfitting:
1.more training data(这种浪费时间)
2.data augmentation (自己创造数据)
但是要注意,机器跟人也是一样的,对于有反转倒置的图片,是不太很容易识别出的。
3.constrained model(比如说线性模型告诉模型是一个一元二次方程,或者像我们的神经网络一样,unet,alexnet都是限制了模型的结构)
4.更少的参数
5.dropout
6.正则化
数据分布问题。
例如说一个班级学生成绩,你训练集里只有成绩好的学生,你的测试集里只有成绩差的学生