🚀 在初始神经网络那一节(链接如下:初始神经网络)的最后,我们通过加大考虑的天数使得我们最后得到的模型Loss最终停留在了0.32k,当我们在想让模型更加准确的时候,是做不到的,因为我们使用的是线性模型(liner model);接下去我们一起探索将如何进一步优化。
1)线性模型也许太过于简单
由于使用的函数都是线性的,所以我们不管怎么调节b和w,最后得到的都仅仅只是不同的线性模型,显然线性模型是不能满足要求的,因为通过2017-2020年数据可知,有些天数的观看人数并不是呈现一个简单的比例关系变化,所以线性模型也许太过于简单了。
模型过于简单从而导致准确率提不上来,这被称之为model bias
,所以需要一些跟加灵活的函数。就如下图所示的红色线所示,其变化趋势有的天数可能成正比,有的天数可能成反比,那我们该如何得到这种红色的函数呢?
其实,可以将红色的函数看成是constant + sum of blue curve
,该如何理解怎么加的呢,如下图所示
- 0号线也就是constant
- 1号线拟合第一段
- 2号线拟合第二段
- 3号线拟合第三段
所以可以通过一系列的蓝色线相加来得到最后结果,即最后的红色curve,那又如何得到这些不同的蓝色线呢?这个问题后面讲到。 所以说按道理来说,对于任何一条线(piecewise liner curve)。我们都可以通过一系列的蓝色线条(blue curve)组合来得到,可是也许有人会说,那对于完全曲线类型的函数我们又该如何拟合呢?
只需要在这些曲线( beyond piecewise liner curve )上取点,通过两点的连线,也可以很好的拟合出来曲线。
2)如何去得到各种各样的蓝色线条
对于上图的蓝色函数我们都可以通过下面的函数(sigomid函数)来进行拟合得到,只要改变不同的b和w的只值,我们就可以得到不同的蓝色函数线条。
具体看下不同的b和w如何影响蓝色线的形状:
- 不同的
w
,可以看出来改变的是其线条的坡度 - 不同的
b
,是将线进行的平移 - 不同的
c
,是改变了线条的范围大小
所以各种各样的蓝色线可以通过sigmoid函数拟合得到,而只需要将函数写成多个蓝色函数和的形式就可以得到一个比较灵活的函数,而不会像liner model一样看上去那么的不可靠。
在之前我们是使用前一天的直接预测下一天的线性模型进行预测,由于存在model bias
,所以现在改用跟加灵活的函数;
- 其中 x 1 x_1 x1是输入的特征,也就是前一天的观看量
- 其中 b i b_i bi c i c_i ci和 w i w_i wi都是未知参数,是改变
sigmoid
函数的参数 - 其中将
i
个sigmoid
函数变换后的函数相加,因为我们也具体不知道对于拟合一个函数,需要几个蓝色函数相加合适 - 其中 b b b也是未知参数,用于调节整体的误差。
在这里我们再次将考虑前一天的变成考虑前三天的观看量,最开始使用线性模型是: y = b + ∑ j w j x j y=b+\sum\limits_{j}w_jx_j y=b+j∑wjxj,现在为了让这个线性模型变得更加灵活,将其加到sigmoid函数中去,就可以让最后拟合的结果变得十分灵活。
也许这样看这这个式子很抽象,我们可以一步一步来看看他是如何进行的,在进行之前我们还是需要重新回忆一下这个式子中的参数都是什么
- x j x_j xj是输入的特征,表示有j个特征被输入,也就是有前j天的观看数据被输入
- w i j w_{ij} wij为什是ij呢,其中i表示第i种蓝色曲线,即 w i j w_{ij} wij表示在第i种蓝色曲线下其这j种特征分别对应的权重值。
- b i b_i bi和 w i j w_{ij} wij都是未知参数,其真实目的是调节
sigmoid
函数的形状 - b b b是整体函数的偏移量
对于三个特征的输入,首先来计算第一条被拟合的蓝色curve ,因该是先写出其线性表达式,将其放入sigmoid
函数中,其就会具有灵活性而拟合出来所需要的蓝色曲线,先来写出其线性函数,即如下: r 1 = b 1 + w 1 1 x 1 + w 1 2 x 2 + w 1 3 x 3 r_1=b_1+w_11x_1+w_12x_2+w_13x_3 r1=b1+w11x1+w12x2+w13x3再将这个这个线性函数放入sigmoid函数得到第一个蓝色curve1
,同样依次可以得到蓝色curve2
,蓝色curve3
。
也就是上图所说的 a 1 a 2 a 3 a_ 1a_2a_3 a1a2a3在分别乘上 c 1 c 2 c 3 c_ 1c_2c_3 c1c2c3在将这三条蓝色curve相加再加上 b b b就得到了最后的 y y y 。
其实上面的函数可以通过矩阵的方式如下表示出来 r = b + w x r=b+wx r=b+wx
再将r
放入sigmoid
函数,也就得到了使用矩阵表示的函数,如下所示。
同样的,我们现在仅仅是将函数的表达式给写了写了出来,函数中的未知参数同样需要求解出来。
3)求解参数
求解参数这里依然采用梯度下降的方法,为了求偏导和表示方便,统一将参数写成一个矩阵 θ \theta θ。
其梯度下降求解的过程一样,建立Loss函数,对其分别求偏导,梯度下降,就如下图所示,直到得到最优解。
4)batch和epoch
我们在计算Loss
的时候,我们是尝试将所有已知的训练数据算一个损失,然后根据这个损失函数求偏导计算偏导值,然后根据偏导值,决定未知参数的更新方向;当开始使用batch
和epoch
的时候,不再计算整个训练数据集的损失,接着往下看他是怎么进行的。
对于一个完整的数据集,将其随机分成几个等大小的数据集简称一个batch
,再计算Loss
的时候,就只将一个batch
中的损失求和,求偏导,更新参数;进行第二次参数更新的时候,就选择下一个batch
,进行更新参数。每次使用一个batch
更新一次参数称为一个updata
。当看完所有batch
的时候,称之为一个epoch。
5)神经网络和深度学习
在上面我们学习的过程中,其实我们已经创造了一个神经网络,其实1943年,心理学家Warren McCulloch和数理逻辑学家Walter Pitts在合作的《A logical calculus of the ideas immanent in nervous activity》论文中就给出了人工神经网络的概念及人工神经元的数学模型,从而开创了人工神经网络研究的时代。1949年,心理学家唐纳德·赫布在《The Organization of Behavior》论文中描述了神经元学习法则。所以神经网络并不是什么新鲜的事情,在1969年,人工智能之父 Minsky(和Seymour Papert)在《感知器》(Perceptrons)一书里给感知器判了“死刑”,这是一本非常严谨的专著,影响力很大。都得到一个简单的结论:神经网络都是骗人的。
神经网络网络这个名词在那个年代就好像一个臭明昭著的名词,谁也不感冒,所以为了发展它,取了另外一个名字,叫做深度学习(deep learing),即如下图所示,在结果输出的时候,在放一层神经元,使其深度变大。
在之后,我们的网络深度越来越深,其效果也是越来越好,如下图所示
所以我们也将我们的网络叠的深一点来看其表现,显然在网络在叠到三层的时候,表现非常好了,但是当网络叠到第四层的时候,其在训练集上的损失是0.1k,而在没有看过的数据上确表现的很差,这是由于层数太多导致了overfitting
随着网络深度的增加,会使得最后得到的结果更加准确,结果更加准确是函数拟合的更加贴切,深度增肌无非就是sigmoid的增加,那为什么非得在深度上拓展使之变得更深,而不是在宽度上拓展使其变的更宽呢?