一元线性模型(单个特征)
多元线性模型(多个特征)
y = w ∗ x + b y=w*x+b y=w∗x+b
L ( w , b ) = ∑ n = 1 10 ( y ^ n − ( b + w ⋅ x c p ) ) 2 L(w,b)=\sum_{n=1}^{10}\left(\hat{y}^n - (b + w·x_{cp}) \right )^2 L(w,b)=n=1∑10(y^n−(b+w⋅xcp))2
过拟合问题
解决方法:正则化
欲使损失函数L取值小,则w需要小,从而L的变化小,使得L在变化的过程中较为平滑。
正则化项中,无需加上偏置b,因为b相当于对损失函数图像进行上下平移。
要选择合适的λ,如果过大,使得损失函数L过于平滑,什么都学不到,测试时的误差自然大。
error=bias+variance
bias和variance之间的trade-off
此时应该重新设计模型。因为之前的函数集里面可能根本没有包含 f ∗ f^* f∗。可以:
将更多的函数加进去,比如考虑高度重量,或者HP值等等。
或者考虑更多次幂、更复杂的模型。
如果此时强行再收集更多的data去训练,这是没有什么帮助的,因为设计的函数集本身就不好,再找更多的训练集也不会更好。
简单粗暴的方法:
更多的数据;
数据增强(data augmentation):augment 要augment得有道理;如果你给机器看这种,奇怪的影像的话,它可能就会学到奇怪的东西,所以data augmentation,要根据你对资料的特性,对你现在要处理的问题的理解,来选择合适的,data augmentation的方式;
模型限制:用比较少的features,本来给三天的资料,改成用给两天的资料,其实结果就好了一些。
对模型增加太多限制,会使模型表示力变弱,model bias变大。所以,模型复杂,可能overfitting;增加限制,降低over fitting,但可能Model bias变大,bias和var的trade off问题。
机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?
偏差(Bias)和方差(Variance)——机器学习中的模型选择
比如,在三份训练结果中,Average错误是模型1最好,再用全部训练集训练模型1。
θ ∗ = arg min θ L ( θ ) (1) \theta^∗= \underset{ \theta }{\operatorname{arg\ min}} L(\theta) \tag1 θ∗=θarg minL(θ)(1)
学习率的设置会影响到优化的过程~
w t + 1 ← w t − η t σ t g t (5) w^{t+1} \leftarrow w^t -\frac{η^t}{\sigma^t}g^t \tag5 wt+1←wt−σtηtgt(5)
g t = ∂ L ( θ t ) ∂ w (6) g^t =\frac{\partial L(\theta^t)}{\partial w} \tag6 gt=∂w∂L(θt)(6)
最佳距离 ∣ 2 a x 0 + b 2 a ∣ \left | \frac{2ax_0+b}{2a} \right | ∣∣2a2ax0+b∣∣,还有个分母 2 a 2a 2a 。对function进行二次微分刚好可以得到:
∂ 2 y ∂ x 2 = 2 a (7) \frac{\partial ^2y}{\partial x^2} = 2a \tag7 ∂x2∂2y=2a(7)
所以最好的步伐应该是:
一 次 微 分 二 次 微 分 \frac{一次微分}{二次微分} 二次微分一次微分
即不止和一次微分成正比,还和二次微分成反比。最好的step应该考虑到二次微分:
同一个参数同一个方向,LR也可以动态调整
α就像learning rate一样,要自己调它,它是一个hyperparameter
预设参数效果一般更好
之前的梯度下降:
L = ∑ n ( y ^ n − ( b + ∑ w i x i n ) ) 2 (8) L=\sum_n(\hat y^n-(b+\sum w_ix_i^n))^2 \tag8 L=n∑(y^n−(b+∑wixin))2(8)
θ i = θ i − 1 − η ▽ L ( θ i − 1 ) (9) \theta^i =\theta^{i-1}- \eta\triangledown L(\theta^{i-1}) \tag9 θi=θi−1−η▽L(θi−1)(9)
而随机梯度下降法更快:
损失函数不需要处理训练集所有的数据,选取一个例子 x n x^n xn
L = ( y ^ n − ( b + ∑ w i x i n ) ) 2 (10) L=(\hat y^n-(b+\sum w_ix_i^n))^2 \tag{10} L=(y^n−(b+∑wixin))2(10)
θ i = θ i − 1 − η ▽ L n ( θ i − 1 ) (11) \theta^i =\theta^{i-1}- \eta\triangledown L^n(\theta^{i-1}) \tag{11} θi=θi−1−η▽Ln(θi−1)(11)
此时不需要像之前那样对所有的数据进行处理,只需要计算某一个例子的损失函数Ln,就可以赶紧update 梯度。GD更稳定,SGD可以更快到达目标。
多组特征的分布范围不一样时,建议将其缩放到同一范围。若不缩放,需要使用不同的学习率来进行参数更新;缩放后,进行参数更新会更有效率。
做完 normalize 以后啊,这个 dimension 上面的数值就会平均是 0,然后它的 variance就会是 1,所以这一排数值的分布就都会在 0 上下
对每一个 dimension都做一样的 normalization,就会发现所有 feature 不同 dimension 的数值都在 0 上下,那你可能就可以製造一个,比较好的 error surface~
只对一个 batch 裡面的 data,做 normalization。Batch Normalization,是适用於 batch size 比较大的时候,因為 batch size 如果比较大,也许这个 batch size 裡面的 data,就足以表示,整个 corpus 的分布,那这个时候你就可以,把这个本来要对整个 corpus,做 Feature Normalization 这件事情,改成只在一个 batch,做 Feature Normalization,作為 approximation。
训练集和预测集样本分布不一致的问题就叫做“covariate shift”现象。
Batch Normalization,可以改变 error surface,让 error surface 比较不崎嶇这个观点。
神经网络也可以有很多不同的连接方式,这样就会产生不同的结构(structure)在这个神经网络里面,我们有很多逻辑回归函数,其中每个逻辑回归都有自己的权重和自己的偏差,这些权重和偏差就是参数。
可以给结构的参数( w w w, b b b)设置为不同的数,就是不同的函数(function)。这些可能的函数(function)结合起来就是一个函数集(function set)。这个时候函数集(function set)是比较大的,是以前的回归模型(linear model)等没有办法包含的函数(function),所以说深度学习(Deep Learning)能表达出以前所不能表达的情况。
输入和参数之间进行矩阵计算,写成矩阵运算的好处是,可以使用GPU加速,进行并行矩阵运算。
隐藏层:特征转换
图片表明,神经网络的结构决定了函数集(function set),所以说网络结构(network structured)很关键。
对于有些机器学习相关的问题,我们一般用特征工程来提取特征,但是对于深度学习,我们只需要设计神经网络模型来进行就可以了。对于语音识别和影像识别,深度学习是个好的方法,因为特征工程提取特征并不容易。
对于模型的评估,我们一般采用损失函数来反应模型的好差,所以对于神经网络来说,我们采用交叉熵(cross entropy)函数来对 y y y和 y ^ \hat{y} y^的损失进行计算,接下来我们就是调整该模型的参数,让交叉熵越小越好。
对于损失,我们不单单要计算一笔数据的,而是要计算整体所有训练数据的损失,然后把所有的训练数据的损失都加起来,得到一个总体损失L。接下来就是在function set里面找到一组函数能最小化这个总体损失L,或者是找一组神经网络的参数 θ \theta θ,来最小化总体损失L。
寻找参数:梯度下降
局部最优和鞍点都有可能导致梯度为0,无法继续下降,判断是局部点还是鞍点~
通过Hessen矩阵,可判断是local point还是saddle point;如果是saddle point,向负特征值对应的特征向量的方向走,可使损失函数减小~
常遇到的是saddle point,比较少遇到local minima
small batch is better on testing data, large batch更容易过拟合。
training stuck≠small gradient
当Loss不再变化/下降时,梯度还在震荡
通过损失进行参数更新,不断优化~
pytorch会自动把cross-entropy和softmax集成到一起
batchnormalization可以使得error surface变得平滑,是一个意料之外的发现,还有很多其他归一化方法。
讲解从DNN切入,通过对DNN的简化,一步步得到CNN
利用卷积核抓取局部特征~
术语:Convolution Layer, Receptive Field, Filter, Feature Map
对DNN增加了两个限制后得到CNN,CNN的Bias比较大~
Convolutional Layer,它是专门為影像设计的,刚才讲的 Receptive Field 参数共享,这些观察 都是為影像设计的,所以它在影像上仍然可以做得好,虽然它的 Model Bias 很大,但这个在影像上不是问题,但是如果它用在影像之外的任务,你就要仔细想想,那些任务有没有我们刚才讲的,影像用的特性。
pooling的想法:将图片变小或者去掉某行某列像素,不影响图片的识别~
pooling层没有需要学习的参数,不是一个Layer。最大池化,平均池化~
pooling会将图片的尺寸变小,但是深度不变~
实作中,Convolution 跟 Pooling 交替使用,可能做几次 Convolution,做一次 Pooling,比如两次 Convolution 一次 Pooling。
因為近年来运算能力越来越强,Pooling 最主要的理由是為了减少运算量,做 Subsampling,把影像变少 减少运算量,那如果你今天你的运算资源,足够支撑你不做 Pooling 的话,很多 Network 的架构的设计,往往今天就不做 Pooling,全 Convolution,Convolution 从头到尾,然后看看做不做得起来,看看能不能做得更好
将经过conv和pooling的feature map拉平,输入fully connected,经过softmax,得到分类结果。
想把 CNN 用在语音上和NLP上,你要仔细看一下文献上的方法
在语音上,在文字上,那个 Receptive Field 的设计啊,这个参数共享的设计啊,跟影像上不是一样的,是考虑了语音跟文字的特性以后所设计的
所以不要以為在影像上的 CNN,直接套到语音上它也 Work,可能是不 Work 的,你要想清楚说影像,语音有什麼样的特性,那你要怎麼设计合适的 Receptive Field。
其实 CNN,它没有办法处理影像放大缩小,或者是旋转的问题。
对它来说这两张图片,虽然这个形状是一模一样的,但是如果你把它拉长成向量的话,它裡面的数值就是不一样的啊,所以对 CNN 来说,虽然你人眼一看觉得它形状很像,但对 CNN 的 Network 来说它是非常不一样。
所以事实上,CNN 并不能够处理影像放大缩小,或者是旋转的问题,当它今天在某种大小的影像上,假设你裡面的物件都是比较小的,它在上面学会做影像辨识,你把物件放大它就会整个惨掉
所以 CNN 并没有你想像的那麼强,那就是為什麼在做影像辨识的时候,往往都要做 数据增强,所谓 Data Augmentation 的意思就是说,你把你的训练资料,每张图片都裡面截一小块出来放大,让 CNN 有看过不同大小的 Pattern,然后把图片旋转,让它有看过说,某一个物件旋转以后长什麼样子,CNN 才会做到好的结果。
可以处理scaling和rotation的NN结构——Special Transformer Layer