文章目录
在上一篇博客中,我们用 Regression 预测 PM2.5。其实,Regression 还有其他很多用处。
- Stock Market Forecast(股票市场预测)
input 可能是过去十年各种股票起伏的资料,而我们希望 output is Dow Jones Industrial Average at tomorrow。
- Self-driving Car(自动驾驶)
input 就是无人车所看到的以及它的红外线所感知的,output 就是方向盘的角度
- Recommendation(推荐系统)
input 就是某个使用者 A和商品 B,output 就是使用者 A 购买商品 B 的可能性
下面,我们来看一个更有趣的例子。Estimating the Combat Power(CP)of a pokemon after evolution(预测神奇宝贝进化后的CP值)。这也可以转化成 Regression 的问题。
那么,我们需要找一个 function,这个 function 的 input 就是某一只 pokemon 的全部信息,output 就是这只 pokemon 进化后的 CP 值(是一个 scalar 数值)。
比如,我们将一只 pokemon 记作 x,它的 CP 值用 Xcp 来表示,Xs 表示它属于哪一个物种,Xhp 表示它的生命值,Xw 表示它的重量,Xh 表示它的高度。用 y 来代替进化后的 CP 值。
那么我们怎么解这个问题呢?接下来就有 3 个步骤。
- Step 1:Model
我们需要需要找一个 function set,这个 function set 就是 Model。
而这个 function set 应该是什么样的呢?
比如,我们随便举一个例子:y = b + w * Xcp
(y 为进化后的 CP 值,Xcp 为进化之前的 CP 值,b,w 为参数,可以是任何数值)
因为 b 和 w 可以是任意值,意味着这个 function set 可以有无穷个 function。但是里面有些 function 可能一眼就看出是错误的,比如 f3,它的计算结果为负。
y = b + w * Xcp
这样的 model ,它是一种 Linear model。如果一个 model 可以写成以下式子,我们就称之为 Linear model。
xi:an attribute of input x(生命值,身高,体重等属性),我们叫做
feature
wi:weight
b:bias(斜率)
- Step 2:Goodness of Function
接下来我们就要收集 Training Data,我们收集的就是 function 的 input 和 output。
比如,以下例子中,我们输入一个杰尼龟,记作 x1(1为上标),我们规定用上标表示一个完整的 object,用下标表示一个 attribute。我们用 y1(1为上标)。虽然这里的 y1 是一个数值,但是之后的 learning 中会涉及到 components,所以这里统一用上标表示。
只有一只显然不够,我们需要收集很多。比如下面收集了 10 只,我们将这 10 只进化后的 CP 值用图像来表示如下。x轴表示神奇宝贝的进化前的 CP 值,y 轴表示进化后的 CP 值。
有了这些 Training Data 之后,我们就可以定义一个 function 的好坏。 那么怎么怎么做呢?我们要定义另一个 function:Loss function(记作 L),Loss function input is a function and output is how bad it is。可以记作L(f) = L(w, b)
如果上述的 L 不是很直观,我们可以作图来表示。图中的每一个点表示一个 function,这个 color 代表 L(w, b),颜色越接近红色表示数值越大,即表示 Loss 很大,这些 function 是比较差的。越好的 function 越接近蓝色。
- Step 3:Best Function
现在,我们要做的就是从 function set 里面挑选一个最好的 function。就是要找一个 Loss 最小的 function,记作
我们可以使用 Gradient Descent 来计算。
- Consider loss function L(w) with one parameter w:就是要找一个 w 使得 L(w) 最小
这怎么计算呢?最暴力的方法就是穷举所有的 w,然后计算出它的 L(w)。
但是,我们都知道穷举法是最没有效率的,所以我们可以采用 Gradient Descent。
下面列举的是只有一个参数的情况。
假设现在求出斜率为负,那么我们需要增加w,那么我们应该增加多少呢?
在得出了 w1 之后,重复上面的步骤,算出在 w1 处的微分。
经过很多次的迭代之后,会到达一个 Local optimal(局部最优)的地方,即微分是 0。但是这会有一个问题,比如当到达了 Local optimal 时,它就不会再移动了。但是这个局部最优有可能不是全局最优。幸运的是,这个问题在 Regression 中不是一个问题,在 Linear Regression 中是不存在 Local optimal 的。
上面说明了只有一个参数的情况,那么如果存在两个参数呢?其实与一个参数没有什么不同。第一步还是随机选取两个初始值(w0,b0)。然后再计算在 w=w0,b=b0时,分别计算w 对 Loss的偏微分,b 对 Loss 的偏微分。
需要补充说明的是 Gradient Descent 中的 gradient 指的是什么呢?
然后我们将其在坐标轴上展示出来。x 轴代表 b,y 轴代表 w。每一个 w 和 b 代表一个 function。依然还是越接近蓝色 Loss 越小。
接下来就是怎么求解的问题?
那么,按照上面的公式,最后的结果是什么呢?
假设 b = -188.4,w = 2.7,将其带入 y = b + w * Xcp
。将其在坐标轴上表示如下:
然后可以计算出 Average Error on Training Data(即每个点距离红线之间的距离)。
但是这个数值并不是我们真正关心的,我们关心的是 Generalization。What we really care about is the error on data(testing data)。所以我们另外抓了 10 只 Pokemon,作为测试数据。这10只和之前做训练的10只是不同的。
然后计算一下。可以看出,这个值比之前用 Training Data 计算出来的值还要大。
那么,有没有什么办法可以做得更好呢?那就是重新去设计一下你的 Model。有可能你的 Model 不止是一条直线那么简单,有可能是更复杂的情况,比如是一个二次式。
我们也按照上面的方法找出最好的 function,假设我们找出的最好的 function 为 w1 = 1.0,w2 = 2.7 * 0.001,然后我们将其在坐标轴上表示。
然后计算其 Average Error = 15.4,但是我们真正关心的是 Testing Data。我们同样将其在坐标轴上表示,计算其 Average Error = 18.4。
相比于之前的 Linear Model,在加入了平方之后,得到的相对更好一些,那么我们有没有可能得到更好的呢?那么我们就得考虑更加复杂的 Model。比如下列式子。
然后我们得到的 Best Function。它的各个参数如下。
然后相对应的曲线其实跟二次的没有太大区别。计算出的 Average Error = 15.3。
然后我们用 Testing Data 计算其 Average Error = 18.1
相比于之前二次得出的 18.4,只是略微好了一点。
我们继续考虑4次式。虽然用 Training Data 得到的是 14.9,但是其 Testing Data 其实是更糟糕的。
最后,我们再次测试一下5次式。得到的结果更加糟糕。
综上所述,我们一共测试了5种 Model,那么现在就涉及到一个 Model Selection 的问题。
然后我们相应做出 Testing Data。
我们可以看出,从一次式到五次式,Training Data 是在相应的下降,但是其 Testing Data 相差却很大。所以我们可以得出一个结论:A more complex model does not always lead to better performance on testing data. This is Overfitting(过拟合). 所以我们需要选择一个最适合的 model,比如在这个例子中,我们选择一个三次式,就比较合适。
由于我们在上面的例子中,只收集了 10 只 Pokemon,如果我们收集 60 只 Pokemon,表示在坐标轴上。如下图所示。
其实,我们这里有一些隐藏的因素在之前的例子中没有被考虑到。比如 Pokemon 的物种,然后我们把不同的物种用不同的颜色进行区别。
那么,我们就需要针对不同的物种设计不同的 Model,比如我们用 Xs 表示物种,那么回到第一步:Redesign the Model。
或许这样写感觉式子很多,其实我们可以将其合成一个式子。
当物种为 Pidgey 时,相应的参数可以设置如下:
之后,我们将其在坐标轴上表示
然后我们得到的 Average error 为 3.8。那么我们真正在意的是 Testing Data。它的 Average error 为 14.3
但是,除了物种这个隐藏因素,还有其他的隐藏因素?比如进化后的 CP 值与 weight、height 、HP 有关?那么就可以得到下面的式子。
这个式子得到的 Training Error = 1.9,而 Tseting Error = 102.3,很明显是 Overfitting!