上一次的案例中的三个步骤,我们将其统称为训练,我们获得的模型是根据已经有的参考资料获得的训练模型,但是实际上我们并不会限制于只使用前一天的数据来预测下一天,我们也可以使用前一周的数据来预测下一天,就有了以下模型:
当然,还可以更多,比如取前四周的:
但是多不一定代表好,当数量过多的时候就会出现其他的情况,可能会影响到我们的结果,这点以后再讨论。。
以上讲的名为Linear models(线性模型)
实际上多数情况我们都是属于比较复杂的函数曲线,对于此函数,我们一般将其分解为多段函数的相加,如下图红色曲线可以由多个蓝色的曲线相加合成。我们稍微严谨一点,就是说红色的曲线可以看作是一个常数加上一群Hard Sigmoid函数。
Hard Sigmoid函数的特征是:当输入的值在x轴上小于一个阈值,大于另外一个阈值的时候,中间有一个斜坡。用人话说就是两边是水平的,中间是一个斜坡链接了两边。
而对于相对复杂的曲线,我们想使用Hard Sigmoid来表示会很困难,所以实际上我们会使用Sigmoid函数来逼近这个Hard Sigmoid函数,以下为Sigmoid函数的表达式:
对于该函数,当x很大的时候,为1,x很小的时候,为0。该函数的形状就是类似于S,所以称为S型函数,即Sigmoid函数。
这里修改b,会让函数左右移动。修改w,会改变函数的斜率。修改c,这是改变其高度。
由此,我们将这些拆分的函数都写成Sigmoid函数,最后合成在一起,得到一个公式:
我们可以继续扩充,上述我们有一个式子为:
同样的道理,如果我们将其写成Sigmoid函数,最后合成在一起,可以得到以下式子:
这里相当于每次先把j的部分进行计算,然后对每个i都有相应的几个j值,重复运算,我们假设j为1,2,3.而i也为1,2,3,画图来表示:
我们还可以结合图形来表示这个道理,比如最上面一个红色的函数被拆解为了三个不同的蓝色函数,假设红色函数整体被分为三个部分x1,x2和x3,蓝色函数分别是这个x1,x2,x3,每一个i就代表其中任意一个蓝色的函数,而wij指的是第i个Sigmoid函数中对第j个特征的权重,也就是说i表示此时考虑的是第i个Sigmoid函数。这里就会出现r1,r2,r3,其实每一个r就是指一个i下的Sigmoid函数。
这里的r1,r2,r3分别是每个i下算完三次j的形式,我们观察该形式,可以写成矩阵的形式:
由此完毕,同时我们发现这些式子中有着大量的参数,为了方便说明,我们设一个向量θ融合所有的参数,将损失函数则称为L(θ)
选择一个初始值θ^0随后对每一个未知的参数计算微分:
这里的g表示的就是gradient,我们一般会将该式子写作:
倒三角指的是对后面所有的都算微分,θ0指在该处计算。
由此我们可以得到以下式子:
也就是
我们找最优的θ的时候,我们会将整体的数据集N划分为多个batch,这里每次的g分别由一个对应的batch值来计算得到,每次从一个batch得到的数据往下一个batch数据变化叫做一次update更新,当我们把所有的batch更新完之后,这一流程叫做epoch,而决定batch的参数为batch size。
ReLU:(和Sigmoid同等地位)写法为c max(b + wx),如果拿去做函数预测的话则可以写成:
这里注意求和的下方是2i,两个ReLU才可以合成一个Hard Sigmoid。这里,提到一个新的名词,Sigmoid和ReLU都被称作为Activation Function激活函数。
每次获得的结果可以反复代入,进行多次的学习套娃。这里每一个Sigmoid和ReLU都是一个节点,被称作Neuron神经元,而这一整套则被称作为Neural Network神经网络。(由于时代背景,这个名称被搞臭了,后来神经元则被改为hidden layer隐藏层,神经网络则是改名为Deep Learning深度学习
随着隐藏层数的叠加,一般来说预测结果会越准,但是有时候层数过多会导致出问题,这种情况叫做Overfitting过度拟合,具体的错误研究我们会在下章进行讨论。
对于整个机器学习的框架我们最后综合一下:
训练过程主要分为三个步骤:
1.首先写出一个函数,这个函数有输入也有一些暂时未知的参数,假设这些参数为θ,输入的部分为x,该函数可以写成:
2.然后我们需要定义损失函数,通过输入一组参数,来判断这一组参数的好坏:
3.最后我们需要解一个优化的问题,我们需要找一个θ,让损失的值越小越好,这里我们假设θ*就是最小的θ,我们解的方程是:
我们将得到的θ*代入,就可以得到用来做测试训练的函数: